Browse Source

wip captcha services

Rafał Pitoń 9 years ago
parent
commit
70b2d448a5

+ 2 - 1
misago/frontend/bower.json

@@ -8,7 +8,8 @@
     "bootstrap": "~3.3.5",
     "ace-builds": "~1.2.0",
     "moment": "~2.10.6",
-    "jquery-mockjax": "~2.0.1"
+    "jquery-mockjax": "~2.0.1",
+    "zxcvbn": "~3.5.0"
   },
   "resolutions": {
     "mithril.js": "next"

+ 8 - 1
misago/frontend/gulpfile.js

@@ -34,6 +34,8 @@ var testLibs = [
   'bower_components/jquery-mockjax/dist/jquery.mockjax.js'
 ];
 
+var zxcvbn = 'bower_components/zxcvbn/dist/*.js';
+
 gulp.task('lint', function() {
   return gulp.src(['misago/*.js', 'misago/**/*.js'])
     .pipe(jshint(packageJSON.jshintConfig))
@@ -70,7 +72,12 @@ gulp.task('acejs', function() {
     .pipe(gulp.dest('dist'));
 });
 
-gulp.task('collectjs', ['vendorjs', 'misagojs', 'acejs'], function() {
+gulp.task('zxcvbn', function() {
+  return gulp.src(zxcvbn)
+    .pipe(gulp.dest('dist'));
+});
+
+gulp.task('collectjs', ['vendorjs', 'misagojs', 'acejs', 'zxcvbn'], function() {
   return gulp.src('dist/*.js')
     .pipe(gulp.dest('dist/js'));
 });

+ 1 - 1
misago/frontend/misago/components/modals/register.js

@@ -7,7 +7,7 @@
 
   var register = {
     view: function() {
-      return m('.modal-dialog.modal-lg[role="document"]',
+      return m('.modal-dialog.modal-register[role="document"]',
         {config: persistent},
         m('.modal-content', [
           m('.modal-header',

+ 36 - 14
misago/frontend/misago/components/navbar/desktop/guest-menu.js

@@ -7,25 +7,47 @@
         showSignIn: function() {
           _.modal('sign-in');
         },
+
+        isBusy: false,
         showRegister: function() {
-          _.modal('register');
+          if (_.settings.account_activation === 'closed') {
+            _.alert.info(gettext("New registrations are currently disabled."));
+          } else {
+            m.startComputation();
+            this.isBusy = true;
+            m.endComputation();
+
+            var self = this;
+            m.sync([
+              _.zxcvbn.load(),
+              _.captcha.load()
+            ]).then(function() {
+              _.alert.success('loaded shizz for registration!');
+            }, function() {
+              _.alert.error(gettext('Registation is not available now due to an error.'));
+            }).then(function() {
+              m.startComputation();
+              self.isBusy = false;
+              m.endComputation();
+            });
+          }
         }
       };
     },
-    view: function(ctrl) {
+    view: function(ctrl, _) {
       return m('div.nav.nav-guest', [
-        m('button.navbar-btn.btn.btn-default',
-          {
-            onclick: ctrl.showSignIn
-          },
-          gettext("Sign in")
-        ),
-        m('button.navbar-btn.btn.btn-primary',
-          {
-            onclick: ctrl.showRegister
-          },
-          gettext("Register")
-        )
+        _.component('button', {
+          class: '.navbar-btn.btn-default',
+          onclick: ctrl.showSignIn,
+          disabled: ctrl.isBusy,
+          label: gettext('Sign in')
+        }),
+        _.component('button', {
+          class: '.navbar-btn.btn-primary',
+          onclick: ctrl.showRegister.bind(ctrl),
+          loading: ctrl.isBusy,
+          label: gettext('Register')
+        })
       ]);
     }
   };

+ 1 - 5
misago/frontend/misago/services/modals.js

@@ -1,10 +1,6 @@
 (function (Misago) {
   'use strict';
 
-  var boilerplate = function(component) {
-    return component;
-  };
-
   var modal = function(name, component) {
     if (this._modals[name]) {
       var argumentsArray = [this._modals[name]];
@@ -14,7 +10,7 @@
       argumentsArray.push(this);
       this._modal.show(m.component.apply(m, argumentsArray));
     } else if (name) {
-      this._modals[name] = boilerplate(component);
+      this._modals[name] = component;
     } else {
       this._modal.hide();
     }

+ 1 - 1
misago/frontend/misago/style/misago/buttons.less

@@ -15,7 +15,7 @@
       height: 20px;
 
       position: relative;
-      top: 1px;
+      top: 0px;
     }
   }
 

+ 4 - 4
misago/frontend/misago/style/misago/loaders.less

@@ -104,7 +104,7 @@
 
 .loader-compact {
   margin: 0px auto;
-  width: 70px;
+  width: 50px;
   text-align: center;
 
   &>div {
@@ -130,14 +130,14 @@
   }
 
   @-webkit-keyframes sk-bouncedelay {
-    0%, 80%, 100% { -webkit-transform: scale(0.33) }
+    0%, 80%, 100% { -webkit-transform: scale(0.5) }
     40% { -webkit-transform: scale(1.0) }
   }
 
   @keyframes sk-bouncedelay {
     0%, 80%, 100% {
-      -webkit-transform: scale(0.33);
-      transform: scale(0.33);
+      -webkit-transform: scale(0.5);
+      transform: scale(0.5);
     } 40% {
       -webkit-transform: scale(1.0);
       transform: scale(1.0);

+ 1 - 1
misago/frontend/misago/style/misago/variables.less

@@ -15,7 +15,7 @@
 @loader-color: @gray-light;
 
 //** Compact loader dot height
-@loader-compact-height: 12px;
+@loader-compact-height: 10px;
 
 //== Error pages
 //

+ 1 - 1
misago/static/misago/css/misago.css

@@ -1 +1 @@
-/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */hr,img{border:0}body,figure{margin:0}.img-thumbnail,.table,label{max-width:100%}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}.alerts,a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size:10px;-webkit-tap-highlight-color:transparent}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{vertical-align:middle}svg:not(:root){overflow:hidden}hr{box-sizing:content-box;height:0}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-success,.open>.dropdown-toggle.btn-warning{background-image:none}.img-thumbnail,body{background-color:#fff}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}dt,kbd kbd,label{font-weight:700}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}ol,ul{margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-bottom:20px}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}code,kbd{padding:2px 4px;font-size:90%}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-left:15px;padding-right:15px}.pre-scrollable{overflow-y:scroll}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}caption{padding-top:8px;padding-bottom:8px;color:#777}.table{width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.btn,.material-icon{vertical-align:middle}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{margin:0;min-width:0}legend{display:block;width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.form-group-sm .form-control,.input-sm{padding:5px 10px;border-radius:3px;font-size:12px}.input-sm{height:30px;line-height:1.5}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;line-height:1.5}.form-group-lg .form-control,.input-lg{border-radius:6px;padding:10px 16px;font-size:18px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;line-height:1.3333333}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;line-height:1.3333333}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}.btn,.nav{margin-bottom:0}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.btn-block,input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;font-weight:400;text-align:center;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:400;border-radius:0}.alert .alert-link,.close{font-weight:700}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-xs{font-size:12px;line-height:1.5;border-radius:3px}.btn-sm{padding:5px 10px}.btn-xs{padding:1px 5px}.btn-block{display:block}.btn-block+.btn-block{margin-top:5px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.nav>li,.nav>li>a{display:block;position:relative}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.nav{padding-left:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px;margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}}.modal,.modal-open{overflow:hidden}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block}.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:4px 4px 0 0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.close{float:right;font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}.btn.btn-loading,.btn.btn-loading:active,.btn.btn-loading:focus,.btn.btn-loading:hover,.btn.btn-loading:link,.btn.btn-loading:visited,.text-hide{color:transparent}.modal{display:none;position:fixed;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.43px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.affix,.alerts{position:fixed}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.row:after,.row:before{content:" ";display:table}.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.row:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;text-shadow:none;background-color:transparent;border:0}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.alerts p,.loader-compact>div,.material-icon,.navbar .navbar-full .navbar-brand>*{display:inline-block}.alerts{top:-100%;width:100%;z-index:1060;text-align:center;font-size:18px;transition:top 300ms ease}.alerts.in{top:0;transition:top 200ms ease}.alerts p{border-radius:0 0 4px 4px;margin:0;pointer-events:all}.loader.sk-folding-cube{margin:80px auto;width:80px;height:80px;position:relative;-webkit-transform:rotateZ(45deg);transform:rotateZ(45deg)}.loader.sk-folding-cube .sk-cube{float:left;width:50%;height:50%;position:relative;-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}.loader.sk-folding-cube .sk-cube:before{content:'';position:absolute;top:0;left:0;width:100%;height:100%;background-color:#777;-webkit-animation:sk-foldCubeAngle 2.4s infinite linear both;animation:sk-foldCubeAngle 2.4s infinite linear both;-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;transform-origin:100% 100%}.btn.btn-loading.btn-default .loader-compact>div,.loader-compact>div{background-color:#333}.loader.sk-folding-cube .sk-cube2{-webkit-transform:scale(1.1) rotateZ(90deg);transform:scale(1.1) rotateZ(90deg)}.loader.sk-folding-cube .sk-cube3{-webkit-transform:scale(1.1) rotateZ(180deg);transform:scale(1.1) rotateZ(180deg)}.loader.sk-folding-cube .sk-cube4{-webkit-transform:scale(1.1) rotateZ(270deg);transform:scale(1.1) rotateZ(270deg)}.loader.sk-folding-cube .sk-cube2:before{-webkit-animation-delay:.3s;animation-delay:.3s}.loader.sk-folding-cube .sk-cube3:before{-webkit-animation-delay:.6s;animation-delay:.6s}.loader.sk-folding-cube .sk-cube4:before{-webkit-animation-delay:.9s;animation-delay:.9s}@-webkit-keyframes sk-foldCubeAngle{0%,10%{-webkit-transform:perspective(140px) rotateX(-180deg);transform:perspective(140px) rotateX(-180deg);opacity:0}25%,75%{-webkit-transform:perspective(140px) rotateX(0);transform:perspective(140px) rotateX(0);opacity:1}100%,90%{-webkit-transform:perspective(140px) rotateY(180deg);transform:perspective(140px) rotateY(180deg);opacity:0}}@keyframes sk-foldCubeAngle{0%,10%{-webkit-transform:perspective(140px) rotateX(-180deg);transform:perspective(140px) rotateX(-180deg);opacity:0}25%,75%{-webkit-transform:perspective(140px) rotateX(0);transform:perspective(140px) rotateX(0);opacity:1}100%,90%{-webkit-transform:perspective(140px) rotateY(180deg);transform:perspective(140px) rotateY(180deg);opacity:0}}.loader-compact{margin:0 auto;width:70px;text-align:center}.loader-compact>div{width:12px;height:12px;border-radius:100%;-webkit-animation:sk-bouncedelay 1.4s infinite ease-in-out both;animation:sk-bouncedelay 1.4s infinite ease-in-out both}.loader-compact .bounce1{-webkit-animation-delay:-.32s;animation-delay:-.32s}.loader-compact .bounce2{margin:0 4px;-webkit-animation-delay:-.16s;animation-delay:-.16s}@-webkit-keyframes sk-bouncedelay{0%,100%,80%{-webkit-transform:scale(.33)}40%{-webkit-transform:scale(1)}}@keyframes sk-bouncedelay{0%,100%,80%{-webkit-transform:scale(.33);transform:scale(.33)}40%{-webkit-transform:scale(1);transform:scale(1)}}.navbar .navbar-full .navbar-brand img{height:16px}.navbar .navbar-full .nav-guest,.navbar .navbar-full .nav-user{float:right}@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(../fonts/MaterialIcons-Regular.eot);src:local('Material Icons'),local('MaterialIcons-Regular'),url(../fonts/MaterialIcons-Regular.woff2) format('woff2'),url(../fonts/MaterialIcons-Regular.woff) format('woff'),url(../fonts/MaterialIcons-Regular.ttf) format('truetype')}.material-icon{font-family:'Material Icons';font-weight:400;font-style:normal;width:1em;height:1em;line-height:1;text-align:center;text-transform:none;letter-spacing:normal;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:'liga'}.btn.btn-loading .loader-compact,.btn.btn-loading:active .loader-compact,.btn.btn-loading:focus .loader-compact,.btn.btn-loading:hover .loader-compact,.btn.btn-loading:link .loader-compact,.btn.btn-loading:visited .loader-compact{margin-top:-20px;height:20px;position:relative;top:1px}.btn.btn-loading.btn-danger .loader-compact>div,.btn.btn-loading.btn-info .loader-compact>div,.btn.btn-loading.btn-primary .loader-compact>div,.btn.btn-loading.btn-success .loader-compact>div,.btn.btn-loading.btn-warning .loader-compact>div{background-color:#fff}@media screen and (max-width:991px){.error-page{text-align:center}.error-page .error-icon{margin:30px}.error-page .error-icon .material-icon{font-size:160px}}@media screen and (min-width:992px){.error-page .error-panel{margin:60px auto;max-width:779.35px;overflow:auto}.error-page .error-icon{float:left}.error-page .error-icon .material-icon{font-size:80px}.error-page .error-message{margin-left:100px}}
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */hr,img{border:0}body,figure{margin:0}.img-thumbnail,.table,label{max-width:100%}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}.alerts,a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size:10px;-webkit-tap-highlight-color:transparent}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{vertical-align:middle}svg:not(:root){overflow:hidden}hr{box-sizing:content-box;height:0}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-success,.open>.dropdown-toggle.btn-warning{background-image:none}.img-thumbnail,body{background-color:#fff}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}dt,kbd kbd,label{font-weight:700}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}ol,ul{margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-bottom:20px}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}code,kbd{padding:2px 4px;font-size:90%}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-left:15px;padding-right:15px}.pre-scrollable{overflow-y:scroll}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}caption{padding-top:8px;padding-bottom:8px;color:#777}.table{width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.btn,.material-icon{vertical-align:middle}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{margin:0;min-width:0}legend{display:block;width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.form-group-sm .form-control,.input-sm{padding:5px 10px;border-radius:3px;font-size:12px}.input-sm{height:30px;line-height:1.5}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;line-height:1.5}.form-group-lg .form-control,.input-lg{border-radius:6px;padding:10px 16px;font-size:18px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;line-height:1.3333333}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;line-height:1.3333333}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}.btn,.nav{margin-bottom:0}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.btn-block,input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;font-weight:400;text-align:center;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:400;border-radius:0}.alert .alert-link,.close{font-weight:700}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-xs{font-size:12px;line-height:1.5;border-radius:3px}.btn-sm{padding:5px 10px}.btn-xs{padding:1px 5px}.btn-block{display:block}.btn-block+.btn-block{margin-top:5px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.nav>li,.nav>li>a{display:block;position:relative}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.nav{padding-left:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px;margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}}.modal,.modal-open{overflow:hidden}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block}.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:4px 4px 0 0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.close{float:right;font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}.btn.btn-loading,.btn.btn-loading:active,.btn.btn-loading:focus,.btn.btn-loading:hover,.btn.btn-loading:link,.btn.btn-loading:visited,.text-hide{color:transparent}.modal{display:none;position:fixed;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.43px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.affix,.alerts{position:fixed}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.row:after,.row:before{content:" ";display:table}.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.row:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;text-shadow:none;background-color:transparent;border:0}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.alerts p,.loader-compact>div,.material-icon,.navbar .navbar-full .navbar-brand>*{display:inline-block}.alerts{top:-100%;width:100%;z-index:1060;text-align:center;font-size:18px;transition:top 300ms ease}.alerts.in{top:0;transition:top 200ms ease}.alerts p{border-radius:0 0 4px 4px;margin:0;pointer-events:all}.loader.sk-folding-cube{margin:80px auto;width:80px;height:80px;position:relative;-webkit-transform:rotateZ(45deg);transform:rotateZ(45deg)}.loader.sk-folding-cube .sk-cube{float:left;width:50%;height:50%;position:relative;-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}.loader.sk-folding-cube .sk-cube:before{content:'';position:absolute;top:0;left:0;width:100%;height:100%;background-color:#777;-webkit-animation:sk-foldCubeAngle 2.4s infinite linear both;animation:sk-foldCubeAngle 2.4s infinite linear both;-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;transform-origin:100% 100%}.btn.btn-loading.btn-default .loader-compact>div,.loader-compact>div{background-color:#333}.loader.sk-folding-cube .sk-cube2{-webkit-transform:scale(1.1) rotateZ(90deg);transform:scale(1.1) rotateZ(90deg)}.loader.sk-folding-cube .sk-cube3{-webkit-transform:scale(1.1) rotateZ(180deg);transform:scale(1.1) rotateZ(180deg)}.loader.sk-folding-cube .sk-cube4{-webkit-transform:scale(1.1) rotateZ(270deg);transform:scale(1.1) rotateZ(270deg)}.loader.sk-folding-cube .sk-cube2:before{-webkit-animation-delay:.3s;animation-delay:.3s}.loader.sk-folding-cube .sk-cube3:before{-webkit-animation-delay:.6s;animation-delay:.6s}.loader.sk-folding-cube .sk-cube4:before{-webkit-animation-delay:.9s;animation-delay:.9s}@-webkit-keyframes sk-foldCubeAngle{0%,10%{-webkit-transform:perspective(140px) rotateX(-180deg);transform:perspective(140px) rotateX(-180deg);opacity:0}25%,75%{-webkit-transform:perspective(140px) rotateX(0);transform:perspective(140px) rotateX(0);opacity:1}100%,90%{-webkit-transform:perspective(140px) rotateY(180deg);transform:perspective(140px) rotateY(180deg);opacity:0}}@keyframes sk-foldCubeAngle{0%,10%{-webkit-transform:perspective(140px) rotateX(-180deg);transform:perspective(140px) rotateX(-180deg);opacity:0}25%,75%{-webkit-transform:perspective(140px) rotateX(0);transform:perspective(140px) rotateX(0);opacity:1}100%,90%{-webkit-transform:perspective(140px) rotateY(180deg);transform:perspective(140px) rotateY(180deg);opacity:0}}.loader-compact{margin:0 auto;width:50px;text-align:center}.loader-compact>div{width:10px;height:10px;border-radius:100%;-webkit-animation:sk-bouncedelay 1.4s infinite ease-in-out both;animation:sk-bouncedelay 1.4s infinite ease-in-out both}.loader-compact .bounce1{-webkit-animation-delay:-.32s;animation-delay:-.32s}.loader-compact .bounce2{margin:0 4px;-webkit-animation-delay:-.16s;animation-delay:-.16s}@-webkit-keyframes sk-bouncedelay{0%,100%,80%{-webkit-transform:scale(.5)}40%{-webkit-transform:scale(1)}}@keyframes sk-bouncedelay{0%,100%,80%{-webkit-transform:scale(.5);transform:scale(.5)}40%{-webkit-transform:scale(1);transform:scale(1)}}.navbar .navbar-full .navbar-brand img{height:16px}.navbar .navbar-full .nav-guest,.navbar .navbar-full .nav-user{float:right}@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(../fonts/MaterialIcons-Regular.eot);src:local('Material Icons'),local('MaterialIcons-Regular'),url(../fonts/MaterialIcons-Regular.woff2) format('woff2'),url(../fonts/MaterialIcons-Regular.woff) format('woff'),url(../fonts/MaterialIcons-Regular.ttf) format('truetype')}.material-icon{font-family:'Material Icons';font-weight:400;font-style:normal;width:1em;height:1em;line-height:1;text-align:center;text-transform:none;letter-spacing:normal;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:'liga'}.btn.btn-loading .loader-compact,.btn.btn-loading:active .loader-compact,.btn.btn-loading:focus .loader-compact,.btn.btn-loading:hover .loader-compact,.btn.btn-loading:link .loader-compact,.btn.btn-loading:visited .loader-compact{margin-top:-20px;height:20px;position:relative;top:0}.btn.btn-loading.btn-danger .loader-compact>div,.btn.btn-loading.btn-info .loader-compact>div,.btn.btn-loading.btn-primary .loader-compact>div,.btn.btn-loading.btn-success .loader-compact>div,.btn.btn-loading.btn-warning .loader-compact>div{background-color:#fff}@media screen and (max-width:991px){.page-error{text-align:center}.page-error .error-icon{margin:30px}.page-error .error-icon .material-icon{font-size:160px}}@media screen and (min-width:992px){.page-error .error-panel{margin:60px auto;max-width:779.35px;overflow:auto}.page-error .error-icon{float:left}.page-error .error-icon .material-icon{font-size:80px}.page-error .error-message{margin-left:100px}}

+ 1 - 1
misago/static/misago/js/misago.js

@@ -1,2 +1,2 @@
-!function(){"use strict";window.Misago=function(){var t=Object.getPrototypeOf(this),e=this;this._initServices=function(n){var o=new t.OrderedList(n).order(!1);o.forEach(function(t){var n=null;n=void 0!==t.item.factory?t.item.factory:t.item;var o=n(e);o&&(e[t.key]=o)})},this._destroyServices=function(n){var o=new t.OrderedList(n).order();o.reverse(),o.forEach(function(t){void 0!==t.destroy&&t.destroy(e)})},this.context={SETTINGS:{}},this.setup=!1,this.init=function(e,n){this.setup={fixture:t.get(e,"fixture",null),test:t.get(e,"test",!1),api:t.get(e,"api","/api/")},n&&(this.context=n),this._initServices(t._services)},this.destroy=function(){this._destroyServices(t._services)}};var t=window.Misago.prototype;t._services=[],t.addService=function(e,n,o){t._services.push({key:e,item:n,after:t.get(o,"after"),before:t.get(o,"before")})}}(),function(t){"use strict";t.has=function(t,e){return t?t.hasOwnProperty(e):!1},t.get=function(e,n,o){return t.has(e,n)?e[n]:void 0!==o?o:void 0},t.pop=function(e,n,o){var r=t.get(e,n,o);return t.has(e,n)&&(e[n]=null),r}}(Misago.prototype),function(t){"use strict";t.input=function(t){var e={disabled:t.disabled||!1,placeholder:t.placeholder||null,config:t.config||null},n="input";return t.id&&(n+="#"+t.id),n+=".form-control"+(t["class"]||""),n+='[type="'+(t.type||"text")+'"]',t.value&&(e.value=t.value(),e.oninput=m.withAttr("value",t.value)),m(n,e)}}(Misago.prototype),function(t){"use strict";var e=function(){};t.stateHooks=function(t,n,o){if(t._hasLifecycleHooks)return t;t._hasLifecycleHooks=!0,t.isActive=!0;var r=t.controller||e;if(t.controller=function(){t.isActive=!0;var n=r.apply(t,arguments)||{},o=n.onunload||e;return n.onunload=function(){o.apply(t,arguments),t.isActive=!1},n},t.vm&&t.vm.init){if(!t.loading){var i=n.bind(t);t.loading=i}var s=t.view;t.view=function(){return t.vm.isReady?s.apply(t,arguments):t.loading.apply(t,arguments)};var a=o.bind(t),u=t.vm.init;t.vm.init=function(){var e=arguments,n=u.apply(t.vm,e);n&&n.then(function(){if(t.isActive&&t.vm.ondata){for(var n=[],o=0;o<arguments.length;o++)n.push(arguments[o]);for(var r=0;r<e.length;r++)n.push(e[r]);t.vm.ondata.apply(t.vm,n)}},function(e){t.isActive&&a(e)})}}return t}}(Misago.prototype),function(t){"use strict";t.OrderedList=function(e){this.isOrdered=!1,this._items=e||[],this.add=function(e,n,o){this._items.push({key:e,item:n,after:t.get(o,"after"),before:t.get(o,"before")})},this.get=function(t,e){for(var n=0;n<this._items.length;n++)if(this._items[n].key===t)return this._items[n].item;return e},this.has=function(t){return void 0!==this.get(t)},this.values=function(){for(var t=[],e=0;e<this._items.length;e++)t.push(this._items[e].item);return t},this.order=function(t){return this.isOrdered||(this._items=this._order(this._items),this.isOrdered=!0),t||"undefined"==typeof t?this.values():this._items},this._order=function(t){function e(t){var e=-1;-1===r.indexOf(t.key)&&(t.after?(e=r.indexOf(t.after),-1!==e&&(e+=1)):t.before&&(e=r.indexOf(t.before)),-1!==e&&(o.splice(e,0,t),r.splice(e,0,t.key)))}var n=[];t.forEach(function(t){n.push(t.key)});var o=[],r=[];t.forEach(function(t){t.after||t.before||(o.push(t),r.push(t.key))}),t.forEach(function(t){"_end"===t.before&&(o.push(t),r.push(t.key))});for(var i=200;i>0&&n.length!==r.length;)i-=1,t.forEach(e);return o}}}(Misago.prototype),function(t){t.serializeDatetime=function(t){return t?t.format():null},t.deserializeDatetime=function(t){return t?moment(t):null}}(Misago.prototype),function(t){"use strict";t.startsWith=function(t,e){return 0===t.indexOf(e)},t.endsWith=function(t,e){return-1!==t.indexOf(e,t.length-e.length)}}(Misago.prototype),function(t){"use strict";t.UrlConf=function(){var e=this;this._patterns=[],this.patterns=function(){return this._patterns};var n=function(t,e){return(t+e).replace("//","/")},o=function(t,o){for(var r=0;r<o.length;r++)e.url(n(t,o[r].pattern),o[r].component,o[r].name)};this.url=function(e,n,r){""===e&&(e="/"),n instanceof t.UrlConf?o(e,n.patterns()):this._patterns.push({pattern:e,component:n.replace(/_/g,"-"),name:r||n})}}}(Misago.prototype),function(t){"use strict";t.loadingPage=function(t){return m(".page.page-loading",t.component("loader"))}}(Misago.prototype),function(t){"use strict";var e=function(e){if(-1!==document.cookie.indexOf(e)){var n=new RegExp(e+"=([^;]*)"),o=t.get(document.cookie.match(n),0);return o.split("=")[1]}return null},n=function(n){this.refreshCsrfToken=function(){this.csrfToken=e(n.context.CSRF_COOKIE_NAME)},this.refreshCsrfToken();var o={};this.ajax=function(e,n,r,i){var s=m.deferred(),a={url:n,method:e,headers:{"X-CSRFToken":this.csrfToken},data:r||{},dataType:"json",success:function(r){"GET"===e&&t.pop(o,n),s.resolve(r)},error:function(r){"GET"===e&&t.pop(o,n);var i=r.responseJSON||{};i.status=r.status,i.statusText=r.statusText,s.reject(i)}};return i?void 0:($.ajax(a),s.promise)},this.get=function(e){var r=t.pop(n.context,e);if(r){var i=m.deferred();return i.resolve(r),i.promise}return void 0!==o[e]?o[e]:(o[e]=this.ajax("GET",e),o[e])},this.post=function(t,e){return this.ajax("POST",t,e)},this.patch=function(t,e){return this.ajax("PATCH",t,e)},this.put=function(t,e){return this.ajax("PUT",t,e)},this["delete"]=function(t){return this.ajax("DELETE",t)}};t.addService("ajax",function(t){return new n(t)})}(Misago.prototype),function(t){"use strict";var e=5e3,n=70,o=9e3,r=300,i=function(t){var i=this;this.id=0,this.type="info",this.message=null,this.isVisible=!1;var s=function(r,s){m.startComputation(),i.id+=1,i.type=r,i.message=s,i.isVisible=!0,m.endComputation();var a=e;a+=s.length*n,a>o&&(a=o);var u=i.id;t.runloop.runOnce(function(){i.id===u&&(m.startComputation(),i.isVisible=!1,m.endComputation())},"flash-message-hide",a)},a=function(e,n){i.isVisible?(i.isVisible=!1,t.runloop.runOnce(function(){s(e,n)},"flash-message-show",r)):s(e,n)};this.info=function(t){a("info",t)},this.success=function(t){a("success",t)},this.warning=function(t){a("warning",t)},this.error=function(t){a("error",t)}};t.addService("alert",{factory:function(t){return new i(t)}})}(Misago.prototype),function(t){"use strict";var e=function(t){if("object"==typeof t){var e=[];for(var n in t)if(t.hasOwnProperty(n)){var o=encodeURIComponent(n),r=encodeURIComponent(t[n]);e.push(o+"="+r)}return"?"+e.join("&")}return t+"/"},n=function(t,o){this.url=o.url||t.setup.api,this.url+=o.path?o.path+"/":o.related?o.related+"/":o.model+"s/",o.filters&&(this.url+=e(o.filters)),!o.url&&o.filters&&(o.model&&(this.related=function(e,r){return new n(t,{url:this.url,relation:o.model,related:e,filters:r})}),this.endpoint=function(e,o){return new n(t,{url:this.url,path:e,filters:o})}),this.get=function(){var e=null;return o.related?e=o.relation+":"+o.related:o.model&&(e=o.model),t.ajax.get(this.url).then(function(n){return e?n.results?(n.results.map(function(n){return t.models["new"](e,n)}),n):t.models["new"](e,n):n})},this.post=function(e){return t.ajax.post(this.url,e)},this.patch=function(e){return t.ajax.patch(this.url,e)},this.put=function(e){return t.ajax.put(this.url,e)},this["delete"]=function(){return t.ajax["delete"](this.url)},this.then=function(t,e){return this.get().then(t,e)}},o=function(t){this.model=function(e,o){return new n(t,{model:e,filters:o})},this.endpoint=function(e,o){return new n(t,{path:e,filters:o})},this.alert=function(e){var n=gettext("Unknown error has occured.");0===e.status&&(n=gettext("Lost connection with application.")),403===e.status&&(n=e.detail,"Permission denied"===n&&(n=gettext("You don't have permission to perform this action."))),404===e.status&&(n=gettext("Action link is invalid.")),t.alert.error(n)}};t.addService("api",function(t){return new o(t)})}(Misago.prototype),function(t){"use strict";var e=function(t){t.user=t.models.deserialize("user",t.context.user)};t.addService("auth",function(t){return new e(t)},{after:"model:user"})}(Misago.prototype),function(t){"use strict";var e=function(t,e){if(this._components[t]){if(arguments.length>1){for(var n=[this._components[t]],o=1;o<arguments.length;o+=1)n.push(arguments[o]);return n.push(this),m.component.apply(void 0,n)}return m.component(this._components[t],this)}this._components[t]=e};t.addService("components",function(t){t._components={},t.component=e})}(Misago.prototype),function(t){"use strict";t.addService("conf",function(e){e.settings=t.get(e.context,"SETTINGS",{})})}(Misago.prototype),function(t){"use strict";t.addService("forum-layout",{factory:function(t){t.setup.fixture&&m.mount(document.getElementById(t.setup.fixture),t.component("forum-layout"))},destroy:function(t){t.setup.fixture&&m.mount(document.getElementById(t.setup.fixture),null)}},{before:"start-routing"})}(Misago.prototype),function(t){"use strict";var e=function(){var t=this,e=document.getElementById("misago-modal"),n="click.misago-modal";$(e).on(n,"a",function(){t.hide()}),this.destroy=function(){$(e).off(),$("body").removeClass("modal-open"),$(".modal-backdrop").remove()};var o=$(e).modal({show:!1});this.open=!1,o.on("hidden.bs.modal",function(){t.open&&(m.mount(e,null),this.open=!1)}),this.show=function(t){this.open=!0,m.mount(e,t),o.modal("show")},this.hide=function(){o.modal("hide")}};t.addService("_modal",{factory:function(){return new e},destroy:function(t){t._modal.destroy()}},{after:"start-routing"})}(Misago.prototype),function(t){"use strict";var e=function(t){return t},n=function(t,n){if(this._modals[t]){for(var o=[this._modals[t]],r=1;r<arguments.length;r+=1)o.push(arguments[r]);o.push(this),this._modal.show(m.component.apply(m,o))}else t?this._modals[t]=e(n):this._modal.hide()};t.addService("modals",function(t){t._modals={},t.modal=n},{after:"_modal"})}(Misago.prototype),function(t){"use strict";var e=function(){this.classes={},this.deserializers={},this.relations={},this.add=function(t,e){if(e["class"]&&(this.classes[t]=e["class"]),e.deserialize&&(this.deserializers[t]=e.deserialize),e.relations)for(var n in e.relations)e.relations.hasOwnProperty(n)&&(this.relations[t+":"+n]=e.relations[n])},this["new"]=function(t,e){return this.classes[t]?new this.classes[t](e):e},this.deserialize=function(t,e){return this.relations[t]&&(t=this.relations[t]),this.deserializers[t]?this["new"](t,this.deserializers[t](e,this)):this["new"](t,e)}};t.addService("models",function(){return new e})}(Misago.prototype),function(t){"use strict";t.addService("set-momentjs-locale",function(){moment.locale($("html").attr("lang"))})}(Misago.prototype),function(t){"use strict";var e=function(e){var n=this;this.baseUrl=$("base").attr("href");var o=t.get(e.context,"STATIC_URL","/"),r=t.get(e.context,"MEDIA_URL","/");this.urls={},this.reverses={};var i=function(t){t.patterns().forEach(function(t){var o=n.baseUrl+t.pattern;o=o.replace("//","/"),n.urls[o]=e.route(t.component),n.reverses[t.name]=o})};this.startRouting=function(t,n){i(t),this.fixture=n,m.route.mode=e.setup.test?"search":"pathname",m.route(n,"/",this.urls)},this.url=function(t){return this.reverses[t]},this.delegateElement=null,this.cleanUrl=function(t){if(t){var e="/"===t.substr(0,1)&&"//"!==t.substr(0,2);if(!e){var n=window.location;if("//"!==t.substr(0,2)){var i=t.substr(0,n.protocol.length+2);if(i!==n.protocol+"//")return;t=t.substr(n.protocol.length+2)}else t=t.substr(2);if(t.substr(0,n.host.length)!==n.host)return;t=t.substr(n.host.length)}if(t.substr(0,this.baseUrl.length)===this.baseUrl&&t.substr(0,o.length)!==o&&t.substr(0,r.length)!==r){var s="/user-avatar/";if(t.substr(0,s.length)!==s)return t}}};var s="click.misago-router";this.delegateClicks=function(t){this.delegateElement=t,$(this.delegateElement).on(s,"a",function(t){var e=n.cleanUrl(t.target.href);e&&(e!=m.route()&&m.route(e),t.preventDefault())})},this.destroy=function(){$(this.delegateElement).off(s)};var a=function(t){return function(e){return t+e}};this.staticUrl=a(o),this.mediaUrl=a(r),this.error403=function(t){var n=null;n=t.ban?e.route("error:banned",t.detail,e.models.deserialize("ban",t.ban)):e.route("error:403",t.detail),m.mount(this.fixture,n)},this.error404=function(){m.mount(this.fixture,e.route("error:404"))},this.error500=function(){m.mount(this.fixture,e.route("error:500"))},this.error0=function(){m.mount(this.fixture,e.route("error:0"))},this.errorPage=function(t){0===t.status&&this.error0(),500===t.status&&this.error500(),404===t.status&&this.error404(),403===t.status&&this.error403(t)}};t.addService("router",function(t){return new e(t)}),t.addService("start-routing",function(e){e.router.startRouting(t.urls,document.getElementById("router-fixture")),e.router.delegateClicks(document.getElementById(e.setup.fixture))},{before:"_end"})}(Misago.prototype),function(t){"use strict";var e=function(e){if(e._hasRouteBoilerplate)return e;e._hasRouteBoilerplate=!0;var n=function(){var t=this.container;return m(".page.page-loading",t.component("loader"))},o=function(t){this.isActive&&this.container.router.errorPage(t)};return t.stateHooks(e,n,o)};t.addService("routes",function(t){t._routes={},t.route=function(n,o){if(this._routes[n]){if(arguments.length>1){for(var r=[this._routes[n]],i=1;i<arguments.length;i+=1)r.push(arguments[i]);return r.push(this),m.component.apply(void 0,r)}return m.component(this._routes[n],this)}o.container=t,this._routes[n]=e(o)}})}(Misago.prototype),function(t){"use strict";var e=function(t){var e=this;this._intervals={};var n=function(t){e._intervals[t]&&(window.clearTimeout(e._intervals[t]),e._intervals[t]=null)};this.run=function(o,r,i){this._intervals[r]=window.setTimeout(function(){n(r);var s=o(t);s!==!1&&e.run(o,r,i)},i)},this.runOnce=function(e,o,r){this._intervals[o]=window.setTimeout(function(){n(o),e(t)},r)},this.stop=function(t){for(var e in this._intervals)t&&t!==e||n(e)}};t.addService("runloop",{factory:function(t){return new e(t)},destroy:function(t){t.runloop.stop()}})}(Misago.prototype),function(t){"use strict";t.addService("start-tick",function(t){var e=m.prop();t.runloop.run(function(){m.startComputation(),e(e()+1),m.endComputation()},"tick",6e4)})}(Misago.prototype),function(t){"use strict";var e=function(t){this.set=function(e){e?this._set_complex(e):document.title=t},this._set_complex=function(e){"string"==typeof e&&(e={title:e});var n=e.title;if("undefined"!=typeof e.page&&e.page>1){var o=interpolate(gettext("page %(page)s"),{page:e.page},!0);n+=" ("+o+")"}"undefined"!=typeof e.parent&&(n+=" | "+e.parent),document.title=n+" | "+t}};t.addService("page-title",function(t){t.title=new e(t.settings.forum_name)})}(Misago.prototype),function(t){"use strict";t.validators={required:function(){return function(t){return 0===$.trim(t).length?gettext("This field is required."):void 0}}};var e=function(t){var e={},n=null,o=null,r=null;for(var i in t.validation)if(t.validation.hasOwnProperty(i)){n=t[i]();for(var s in t.validation[i])o=t.validation[i][s],r=o(n),r&&(e[i]||(e[i]=[]),e[i].push(r))}return Object.getOwnPropertyNames(e).length>0?e:null};t.addService("validate",{factory:function(){return e}})}(Misago.prototype),function(t){"use strict";var e=function(t){this.message={html:t.message.html,plain:t.message.plain},this.expires_on=t.expires_on},n=function(e){return e.expires_on=t.deserializeDatetime(e.expires_on),e};t.addService("model:ban",function(t){t.models.add("ban",{"class":e,deserialize:n})},{after:"models"})}(Misago.prototype),function(t){"use strict";var e=function(t){this.title=t.title,this.body=t.body,this.link=t.link};t.addService("model:legal-page",function(t){t.models.add("legal-page",{"class":e})},{after:"models"})}(Misago.prototype),function(t){"use strict";var e=function(t){this.id=t.id,this.isAuthenticated=!!this.id,this.isAnonymous=!this.isAuthenticated,this.slug=t.slug,this.username=t.username,this.acl=t.acl,this.rank=t.rank},n=function(e){return e.joined_on&&(e.joined_on=t.deserializeDatetime(e.joined_on)),e};t.addService("model:user",function(t){t.models.add("user",{"class":e,deserialize:n})},{after:"models"})}(Misago.prototype),function(t){"use strict";var e=function(t){var e=[m("p.lead",t.message)];return t.help&&e.push(m("p.help",t.help)),m(".page.error-page.error-"+t.code+"-page",m(".container",m(".error-panel",[m(".error-icon",m("span.material-icon",t.icon)),m(".error-message",e)])))},n={controller:function(){this.container.title.set(gettext("You are banned"))},view:function(t,e,n){var o=[];o.push(n.message.html?m(".lead",m.trust(n.message.html)):e?m("p.lead",e):m("p.lead",gettext("You are banned.")));var r=null;return r=n.expires_on?n.expires_on.isAfter(moment())?interpolate(gettext("This ban expires %(expires_on)s."),{expires_on:n.expires_on.fromNow()},!0):gettext("This ban has expired."):gettext("This ban is permanent."),o.push(m("p",r)),m(".page.error-page.error-banned-page",m(".container",m(".error-panel",[m(".error-icon",m("span.material-icon","highlight_off")),m(".error-message",o)])))}},o={controller:function(){this.container.title.set(gettext("Page not available"))},view:function(t,n){return"Permission denied"===n&&(n=gettext("You don't have permission to access this page.")),e({code:403,icon:"remove_circle_outline",message:gettext("This page is not available."),help:n})}},r={controller:function(){this.container.title.set(gettext("Page not found"))},view:function(){return e({code:404,icon:"info_outline",message:gettext("Requested page could not be found."),help:gettext("The link you followed was incorrect or the page has been moved or deleted.")})}},i={controller:function(){this.container.title.set(gettext("Application error occured"))},view:function(){return e({code:500,icon:"error_outline",message:gettext("Requested page could not be displayed due to an error."),help:gettext("Please try again later or contact site staff if error persists.")})}},s={controller:function(){this.container.title.set(gettext("Lost connection with application"))},view:function(){return e({code:0,icon:"sync_problem",message:gettext("Could not connect to application."),help:gettext("This may be caused by problems with your connection or application server. Please check your internet connection and refresh page if problem persists.")})}};t.addService("route:error-pages",function(t){t.route("error:banned",n),t.route("error:403",o),t.route("error:404",r),t.route("error:500",i),t.route("error:0",s)},{after:"routes"})}(Misago.prototype),function(t){"use strict";var e={controller:function(){var t=this.container;document.title=t.settings.forum_index_title||t.settings.forum_name;var e=m.prop(0);return{count:e,increment:function(){console.log("increment()"),e(e()+1)}}},view:function(t,e){var n=["default","primary","success","info","warning","danger"];return m(".container",[m("h1","Buttons"),m("",n.map(function(t){return m("",[e.component("button",{"class":".btn-"+t,label:"Lorem ipsum"}),e.component("button",{"class":".btn-"+t,label:"Lorem ipsum",loading:!0})])}))])}};t.addService("route:index",function(t){t.route("index",e)},{after:"routes"})}(Misago.prototype),function(t){"use strict";var e=function(e,n){var o=e.replace(/_/g,"-");return{controller:function(n){t.get(n.settings,e+"_link")?window.location=t.get(n.settings,e+"_link"):this.vm.init(this,n)},vm:{page:null,isReady:!1,init:function(t,e){return this.isReady?void e.title.set(this.title):(e.title.set(),e.api.model("legal-page",o))},ondata:function(t,e,o){m.startComputation(),t.link?window.location=t.link:(t.title=t.title||n,this.page=t,this.isReady=!0,m.endComputation(),e.isActive&&o.title.set(this.page.title))}},view:function(t,e){return m(".page.legal-page."+o+"-page",[e.component("header",{title:this.vm.page.title}),m(".container",e.component("markup",this.vm.page.body))])}}};t.addService("route:legal-pages",function(t){t.route("terms-of-service",e("terms_of_service",gettext("Terms of service"))),t.route("privacy-policy",e("privacy_policy",gettext("Privacy policy")))},{after:"routes"})}(Misago.prototype),function(t){"use strict";var e=function(t){return-1!==[!!t.forum_footnote,!!t.terms_of_service,!!t.terms_of_service_link,!!t.privacy_policy,!!t.privacy_policy_link].indexOf(!0)},n={view:function(t,n){var o=null;return e(n.settings)&&(o=n.component("footer:menu")),m("footer.forum-footer",[m(".container",m(".footer-content",[o,n.component("footer:branding")]))])}};t.addService("component:footer",function(t){t.component("footer",n)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e=function(e,n,o){var r=t.get(e.settings,n+"_link");return!r&&t.get(e.settings,n)&&(r=e.router.url(n)),r?m("li",m("a",{href:r},t.get(e.settings,n+"_title",o))):null},n={isVisible:function(t){return-1!==[!!t.forum_footnote,!!t.terms_of_service,!!t.terms_of_service_link,!!t.privacy_policy,!!t.privacy_policy_link].indexOf(!0)},view:function(t,n){var o=[];return n.settings.forum_footnote&&o.push(m("li.forum-footnote",m.trust(n.settings.forum_footnote))),o.push(e(n,"terms_of_service",gettext("Terms of service"))),o.push(e(n,"privacy_policy",gettext("Privacy policy"))),m("ul.list-inline.footer-nav",o)}};t.addService("component:footer:menu",function(t){t.component("footer:menu",n)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(){return m("a.misago-branding[href=http://misago-project.org]",["powered by ",m("strong","misago")])}};t.addService("component:footer:branding",function(t){t.component("footer:branding",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(t,e){return m(".modal-header",[m('button.close[type="button"]',{"data-dismiss":"modal","aria-label":gettext("Close")},m("span",{"aria-hidden":"true"},m.trust("&times;"))),m("h4#misago-modal-label.modal-title",e)])}};t.addService("component:modal:header",function(t){t.component("modal:header",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";function e(t,e,n){n.retain=!0}var n={view:function(){return m('.modal-dialog.modal-lg[role="document"]',{config:e},m(".modal-content",[m(".modal-header",m("h4#misago-modal-label.modal-title","Register in modal!")),m(".modal-body",[m("p","Lorem ipsum dolor met sit amet elit."),m("p",["Si vis pacem ",m("a",{href:"/"},"bellum")," sequitat."])])]))}};t.addService("modal:register",function(t){t.modal("register",n)},{after:"modals"})}(Misago.prototype),function(t){"use strict";function e(t,e,n){n.retain=!0}var n={controller:function(){return{busy:m.prop(!1),showActivation:m.prop(!1),username:m.prop(""),password:m.prop(""),validation:{username:[t.validators.required()],password:[t.validators.required()]}}},submit:function(t,e){if(t.busy())return!1;if(e.validate(t))return e.alert.error(gettext("Fill out both fields.")),!1;m.startComputation(),t.busy(!0),m.endComputation();var n={username:t.username(),password:t.password()},o=this;return e.api.endpoint("auth").post(n).then(function(){o.success(n,e)},function(n){o.error(t,n,e)}),!1},success:function(t,e){var n=$("#hidden-login-form");e.ajax.refreshCsrfToken(),n.find('input[type="hidden"]').val(e.ajax.csrfToken),n.find('input[name="redirect_to"]').val(m.route()),n.find('input[name="username"]').val(t.username),n.find('input[name="password"]').val(t.password),n.submit()},error:function(t,e,n){m.startComputation(),t.busy(!1),m.endComputation(),400===e.status?"inactive_admin"===e.code?n.alert.info(e.detail):"inactive_user"===e.code?(n.alert.info(e.detail),t.showActivation(!0)):"banned"===e.code?(n.modal(),n.router.error403({message:"",ban:e.detail})):n.alert.error(e.detail):n.api.alert(e)},view:function(n,o){return m('.modal-dialog.modal-sm.modal-signin[role="document"]',{config:e},m(".modal-content",[o.component("modal:header",gettext("Sign in")),m("form",{onsubmit:this.submit.bind(this,n,o)},[m(".modal-body",[m(".form-group",m(".control-input",t.input({disabled:n.busy(),value:n.username,placeholder:gettext("Username or e-mail")}))),m(".form-group",m(".control-input",t.input({type:"password",disabled:n.busy(),value:n.password,placeholder:gettext("Password")})))]),m(".modal-footer",o.component("button",{"class":".btn-primary.btn-block",submit:!0,loading:n.busy(),label:gettext("Sign in")}))])]))}};t.addService("modal:sign-in",function(t){t.modal("sign-in",n)},{after:"modals"})}(Misago.prototype),function(t){"use strict";var e={view:function(t,e){var n=".navbar.navbar-default.navbar-static-top";return m("nav"+n+'[role="navigation"]',[e.component("navbar:desktop")])}};t.addService("component:navbar",function(t){t.component("navbar",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(t,e,n){var o=[m("img",{src:n.router.staticUrl("misago/img/site-logo.png"),alt:n.settings.forum_name})];return e&&o.push(e),m("a.navbar-brand",{href:n.router.url("index")},o)}};t.addService("component:navbar:desktop:brand",function(t){t.component("navbar:desktop:brand",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={controller:function(t){return{showSignIn:function(){t.modal("sign-in")},showRegister:function(){t.modal("register")}}},view:function(t){return m("div.nav.nav-guest",[m("button.navbar-btn.btn.btn-default",{onclick:t.showSignIn},gettext("Sign in")),m("button.navbar-btn.btn.btn-primary",{onclick:t.showRegister},gettext("Register"))])}};t.addService("component:navbar:desktop:guest-menu",function(t){t.component("navbar:desktop:guest-menu",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(t,e){var n=[];return e.settings.forum_branding_display&&n.push(e.component("navbar:desktop:brand",e.settings.forum_branding_text)),n.push(m("ul.nav.navbar-nav",[m("li",m("a",{config:m.route,href:e.router.url("index")},"Index"))])),n.push(e.user.isAuthenticated?e.component("navbar:desktop:user-menu"):e.component("navbar:desktop:guest-menu")),m(".container.navbar-full.hidden-xs.hidden-sm",n)}};t.addService("component:navbar:desktop",function(t){t.component("navbar:desktop",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={controller:function(){return{logout:function(){$("#hidden-logout-form").submit()}}},view:function(t,e){return m("div.nav.nav-user",[m("p.navbar-text",e.user.username),m("button.navbar-btn.btn.btn-default.navbar-right",{onclick:t.logout.bind(t)},gettext("Logout"))])}};t.addService("component:navbar:desktop:user-menu",function(t){t.component("navbar:desktop:user-menu",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";function e(t,e,n){n.retain=!0}var n={classes:{info:"alert-info",success:"alert-success",warning:"alert-warning",error:"alert-danger"},view:function(t,n){return m(".alerts",{config:e,"class":n.alert.isVisible?"in":"out"},m("p.alert",{"class":this.classes[n.alert.type]},n.alert.message))}};t.addService("component:alert",function(t){t.component("alert",n)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(t,e){var n={disabled:e.disabled||e.loading||!1,config:e.config||null,loading:e.loading||!1,type:e.submit?"submit":"button",onclick:e.onclick||null},o='button[type="'+n.type+'"].btn';n.loading&&(o+=".btn-loading"),e.id&&(o+="#"+e.id),o+=e["class"]||"";var r=e.label;return n.loading&&(r=[r,m(".loader-compact",[m(".bounce1"),m(".bounce2"),m(".bounce3")])]),m(o,n,r)}};t.addService("component:button",function(t){t.component("button",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e=function(t,e,n){n.retain=!0},n={view:function(t,n){return[n.component("alert"),n.component("navbar"),m("#router-fixture",{config:e}),n.component("footer"),n.component("modal")]}};t.addService("component:layout",function(t){t.component("forum-layout",n)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(){return m(".loader.sk-folding-cube",[m(".sk-cube1.sk-cube"),m(".sk-cube2.sk-cube"),m(".sk-cube4.sk-cube"),m(".sk-cube3.sk-cube")])}};t.addService("component:loader",function(t){t.component("loader",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e=function(t,e,n){n.retain=!0},n={view:function(t,n){return m("article.misago-markup",{config:e},m.trust(n))}};t.addService("component:markup",function(t){t.component("markup",n)},{after:"components"})}(Misago.prototype),function(t){"use strict";function e(t,e,n){n.retain=!0}var n={view:function(){return m('#misago-modal.modal.fade[role="dialog"]',{config:e,tabindex:"-1","aria-labelledby":"misago-modal-label"})}};t.addService("component:modal",function(t){t.component("modal",n)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(t,e){return m(".page-header",m(".container",[m("h1",e.title)]))}};t.addService("component:header",function(t){t.component("header",e)},{after:"components"})}(Misago.prototype),function(t,e){"use strict";var n=new e;n.url("/","index"),n.url("/terms-of-service/","terms_of_service"),n.url("/privacy-policy/","privacy_policy"),n.url("/:rest...","error:404","not_found"),t.urls=n}(Misago.prototype,Misago.prototype.UrlConf);
+!function(){"use strict";window.Misago=function(){var t=Object.getPrototypeOf(this),e=this;this._initServices=function(n){var o=new t.OrderedList(n).order(!1);o.forEach(function(t){var n=null;n=void 0!==t.item.factory?t.item.factory:t.item;var o=n(e);o&&(e[t.key]=o)})},this._destroyServices=function(n){var o=new t.OrderedList(n).order();o.reverse(),o.forEach(function(t){void 0!==t.destroy&&t.destroy(e)})},this.context={SETTINGS:{}},this.setup=!1,this.init=function(e,n){this.setup={fixture:t.get(e,"fixture",null),test:t.get(e,"test",!1),api:t.get(e,"api","/api/")},n&&(this.context=n),this._initServices(t._services)},this.destroy=function(){this._destroyServices(t._services)}};var t=window.Misago.prototype;t._services=[],t.addService=function(e,n,o){t._services.push({key:e,item:n,after:t.get(o,"after"),before:t.get(o,"before")})}}(),function(t){"use strict";t.has=function(t,e){return t?t.hasOwnProperty(e):!1},t.get=function(e,n,o){return t.has(e,n)?e[n]:void 0!==o?o:void 0},t.pop=function(e,n,o){var i=t.get(e,n,o);return t.has(e,n)&&(e[n]=null),i}}(Misago.prototype),function(t){"use strict";t.input=function(t){var e={disabled:t.disabled||!1,placeholder:t.placeholder||null,config:t.config||null},n="input";return t.id&&(n+="#"+t.id),n+=".form-control"+(t["class"]||""),n+='[type="'+(t.type||"text")+'"]',t.value&&(e.value=t.value(),e.oninput=m.withAttr("value",t.value)),m(n,e)}}(Misago.prototype),function(t){"use strict";var e=function(){};t.stateHooks=function(t,n,o){if(t._hasLifecycleHooks)return t;t._hasLifecycleHooks=!0,t.isActive=!0;var i=t.controller||e;if(t.controller=function(){t.isActive=!0;var n=i.apply(t,arguments)||{},o=n.onunload||e;return n.onunload=function(){o.apply(t,arguments),t.isActive=!1},n},t.vm&&t.vm.init){if(!t.loading){var r=n.bind(t);t.loading=r}var s=t.view;t.view=function(){return t.vm.isReady?s.apply(t,arguments):t.loading.apply(t,arguments)};var a=o.bind(t),u=t.vm.init;t.vm.init=function(){var e=arguments,n=u.apply(t.vm,e);n&&n.then(function(){if(t.isActive&&t.vm.ondata){for(var n=[],o=0;o<arguments.length;o++)n.push(arguments[o]);for(var i=0;i<e.length;i++)n.push(e[i]);t.vm.ondata.apply(t.vm,n)}},function(e){t.isActive&&a(e)})}}return t}}(Misago.prototype),function(t){"use strict";t.OrderedList=function(e){this.isOrdered=!1,this._items=e||[],this.add=function(e,n,o){this._items.push({key:e,item:n,after:t.get(o,"after"),before:t.get(o,"before")})},this.get=function(t,e){for(var n=0;n<this._items.length;n++)if(this._items[n].key===t)return this._items[n].item;return e},this.has=function(t){return void 0!==this.get(t)},this.values=function(){for(var t=[],e=0;e<this._items.length;e++)t.push(this._items[e].item);return t},this.order=function(t){return this.isOrdered||(this._items=this._order(this._items),this.isOrdered=!0),t||"undefined"==typeof t?this.values():this._items},this._order=function(t){function e(t){var e=-1;-1===i.indexOf(t.key)&&(t.after?(e=i.indexOf(t.after),-1!==e&&(e+=1)):t.before&&(e=i.indexOf(t.before)),-1!==e&&(o.splice(e,0,t),i.splice(e,0,t.key)))}var n=[];t.forEach(function(t){n.push(t.key)});var o=[],i=[];t.forEach(function(t){t.after||t.before||(o.push(t),i.push(t.key))}),t.forEach(function(t){"_end"===t.before&&(o.push(t),i.push(t.key))});for(var r=200;r>0&&n.length!==i.length;)r-=1,t.forEach(e);return o}}}(Misago.prototype),function(t){t.serializeDatetime=function(t){return t?t.format():null},t.deserializeDatetime=function(t){return t?moment(t):null}}(Misago.prototype),function(t){"use strict";t.startsWith=function(t,e){return 0===t.indexOf(e)},t.endsWith=function(t,e){return-1!==t.indexOf(e,t.length-e.length)}}(Misago.prototype),function(t){"use strict";t.UrlConf=function(){var e=this;this._patterns=[],this.patterns=function(){return this._patterns};var n=function(t,e){return(t+e).replace("//","/")},o=function(t,o){for(var i=0;i<o.length;i++)e.url(n(t,o[i].pattern),o[i].component,o[i].name)};this.url=function(e,n,i){""===e&&(e="/"),n instanceof t.UrlConf?o(e,n.patterns()):this._patterns.push({pattern:e,component:n.replace(/_/g,"-"),name:i||n})}}}(Misago.prototype),function(t){"use strict";t.loadingPage=function(t){return m(".page.page-loading",t.component("loader"))}}(Misago.prototype),function(t){"use strict";var e=function(e){if(-1!==document.cookie.indexOf(e)){var n=new RegExp(e+"=([^;]*)"),o=t.get(document.cookie.match(n),0);return o.split("=")[1]}return null},n=function(n){this.refreshCsrfToken=function(){this.csrfToken=e(n.context.CSRF_COOKIE_NAME)},this.refreshCsrfToken();var o={};this.ajax=function(e,n,i,r){var s=m.deferred(),a={url:n,method:e,headers:{"X-CSRFToken":this.csrfToken},data:i||{},dataType:"json",success:function(i){"GET"===e&&t.pop(o,n),s.resolve(i)},error:function(i){"GET"===e&&t.pop(o,n);var r=i.responseJSON||{};r.status=i.status,r.statusText=i.statusText,s.reject(r)}};return r?void 0:($.ajax(a),s.promise)},this.get=function(e){var i=t.pop(n.context,e);if(i){var r=m.deferred();return r.resolve(i),r.promise}return void 0!==o[e]?o[e]:(o[e]=this.ajax("GET",e),o[e])},this.post=function(t,e){return this.ajax("POST",t,e)},this.patch=function(t,e){return this.ajax("PATCH",t,e)},this.put=function(t,e){return this.ajax("PUT",t,e)},this["delete"]=function(t){return this.ajax("DELETE",t)}};t.addService("ajax",function(t){return new n(t)})}(Misago.prototype),function(t){"use strict";var e=5e3,n=70,o=9e3,i=300,r=function(t){var r=this;this.id=0,this.type="info",this.message=null,this.isVisible=!1;var s=function(i,s){m.startComputation(),r.id+=1,r.type=i,r.message=s,r.isVisible=!0,m.endComputation();var a=e;a+=s.length*n,a>o&&(a=o);var u=r.id;t.runloop.runOnce(function(){r.id===u&&(m.startComputation(),r.isVisible=!1,m.endComputation())},"flash-message-hide",a)},a=function(e,n){r.isVisible?(r.isVisible=!1,t.runloop.runOnce(function(){s(e,n)},"flash-message-show",i)):s(e,n)};this.info=function(t){a("info",t)},this.success=function(t){a("success",t)},this.warning=function(t){a("warning",t)},this.error=function(t){a("error",t)}};t.addService("alert",{factory:function(t){return new r(t)}})}(Misago.prototype),function(t){"use strict";var e=function(t){if("object"==typeof t){var e=[];for(var n in t)if(t.hasOwnProperty(n)){var o=encodeURIComponent(n),i=encodeURIComponent(t[n]);e.push(o+"="+i)}return"?"+e.join("&")}return t+"/"},n=function(t,o){this.url=o.url||t.setup.api,this.url+=o.path?o.path+"/":o.related?o.related+"/":o.model+"s/",o.filters&&(this.url+=e(o.filters)),!o.url&&o.filters&&(o.model&&(this.related=function(e,i){return new n(t,{url:this.url,relation:o.model,related:e,filters:i})}),this.endpoint=function(e,o){return new n(t,{url:this.url,path:e,filters:o})}),this.get=function(){var e=null;return o.related?e=o.relation+":"+o.related:o.model&&(e=o.model),t.ajax.get(this.url).then(function(n){return e?n.results?(n.results.map(function(n){return t.models["new"](e,n)}),n):t.models["new"](e,n):n})},this.post=function(e){return t.ajax.post(this.url,e)},this.patch=function(e){return t.ajax.patch(this.url,e)},this.put=function(e){return t.ajax.put(this.url,e)},this["delete"]=function(){return t.ajax["delete"](this.url)},this.then=function(t,e){return this.get().then(t,e)}},o=function(t){this.model=function(e,o){return new n(t,{model:e,filters:o})},this.endpoint=function(e,o){return new n(t,{path:e,filters:o})},this.alert=function(e){var n=gettext("Unknown error has occured.");0===e.status&&(n=gettext("Lost connection with application.")),403===e.status&&(n=e.detail,"Permission denied"===n&&(n=gettext("You don't have permission to perform this action."))),404===e.status&&(n=gettext("Action link is invalid.")),t.alert.error(n)}};t.addService("api",function(t){return new o(t)})}(Misago.prototype),function(t){"use strict";var e=function(t){t.user=t.models.deserialize("user",t.context.user)};t.addService("auth",function(t){return new e(t)},{after:"model:user"})}(Misago.prototype),function(t){"use strict";var e=function(){var t=m.deferred();t.resolve(),this.load=function(){return t.promise},this.component=function(){return null},this.value=function(){return"pass"}},n=function(t){this.loading=!1,this.question=null,this.value=m.prop("");var e=m.deferred();this.load=function(){if(this.value(""),!this.question&&!this.loading){this.loading=!0;var n=this;t.api.endpoint("captcha-question").get().then(function(t){n.question=t,e.resolve()},function(){t.api.alert(gettext("Failed to load CAPTCHA.")),e.reject()}).then(function(){n.loading=!0})}return e.promise},this.component=function(e){return t.component("form:row",{label:this.question.question,helpText:this.question.help_text,validation:e})}},o=function(t){this.loading=!1,this.question=null;var e=m.deferred();this.load=function(){return e.promise},this.component=function(){return"null"},this.value=function(){return"pass"}},i=function(t){var i={no:e,qa:n,re:o},r=new i[t.settings.captcha_type](t);this.load=function(){return r.load()},this.component=function(){return r.component()},this.value=function(){return r.value()}};t.addService("captcha",function(t){return new i(t)},{after:"include"})}(Misago.prototype),function(t){"use strict";var e=function(t,e){if(this._components[t]){if(arguments.length>1){for(var n=[this._components[t]],o=1;o<arguments.length;o+=1)n.push(arguments[o]);return n.push(this),m.component.apply(void 0,n)}return m.component(this._components[t],this)}this._components[t]=e};t.addService("components",function(t){t._components={},t.component=e})}(Misago.prototype),function(t){"use strict";t.addService("conf",function(e){e.settings=t.get(e.context,"SETTINGS",{})})}(Misago.prototype),function(t){"use strict";t.addService("forum-layout",{factory:function(t){t.setup.fixture&&m.mount(document.getElementById(t.setup.fixture),t.component("forum-layout"))},destroy:function(t){t.setup.fixture&&m.mount(document.getElementById(t.setup.fixture),null)}},{before:"start-routing"})}(Misago.prototype),function(t){"use strict";var e=function(t,e){e||(t=this.context.STATIC_URL+t),$.ajax({url:t,cache:!0,dataType:"script"})};t.addService("include",function(t){t.include=e},{after:"conf"})}(Misago.prototype),function(t){"use strict";var e=function(){var t=this,e=document.getElementById("misago-modal"),n="click.misago-modal";$(e).on(n,"a",function(){t.hide()}),this.destroy=function(){$(e).off(),$("body").removeClass("modal-open"),$(".modal-backdrop").remove()};var o=$(e).modal({show:!1});this.open=!1,o.on("hidden.bs.modal",function(){t.open&&(m.mount(e,null),this.open=!1)}),this.show=function(t){this.open=!0,m.mount(e,t),o.modal("show")},this.hide=function(){o.modal("hide")}};t.addService("_modal",{factory:function(){return new e},destroy:function(t){t._modal.destroy()}},{after:"start-routing"})}(Misago.prototype),function(t){"use strict";var e=function(t,e){if(this._modals[t]){for(var n=[this._modals[t]],o=1;o<arguments.length;o+=1)n.push(arguments[o]);n.push(this),this._modal.show(m.component.apply(m,n))}else t?this._modals[t]=e:this._modal.hide()};t.addService("modals",function(t){t._modals={},t.modal=e},{after:"_modal"})}(Misago.prototype),function(t){"use strict";var e=function(){this.classes={},this.deserializers={},this.relations={},this.add=function(t,e){if(e["class"]&&(this.classes[t]=e["class"]),e.deserialize&&(this.deserializers[t]=e.deserialize),e.relations)for(var n in e.relations)e.relations.hasOwnProperty(n)&&(this.relations[t+":"+n]=e.relations[n])},this["new"]=function(t,e){return this.classes[t]?new this.classes[t](e):e},this.deserialize=function(t,e){return this.relations[t]&&(t=this.relations[t]),this.deserializers[t]?this["new"](t,this.deserializers[t](e,this)):this["new"](t,e)}};t.addService("models",function(){return new e})}(Misago.prototype),function(t){"use strict";t.addService("set-momentjs-locale",function(){moment.locale($("html").attr("lang"))})}(Misago.prototype),function(t){"use strict";var e=function(e){var n=this;this.baseUrl=$("base").attr("href");var o=t.get(e.context,"STATIC_URL","/"),i=t.get(e.context,"MEDIA_URL","/");this.urls={},this.reverses={};var r=function(t){t.patterns().forEach(function(t){var o=n.baseUrl+t.pattern;o=o.replace("//","/"),n.urls[o]=e.route(t.component),n.reverses[t.name]=o})};this.startRouting=function(t,n){r(t),this.fixture=n,m.route.mode=e.setup.test?"search":"pathname",m.route(n,"/",this.urls)},this.url=function(t){return this.reverses[t]},this.delegateElement=null,this.cleanUrl=function(t){if(t){var e="/"===t.substr(0,1)&&"//"!==t.substr(0,2);if(!e){var n=window.location;if("//"!==t.substr(0,2)){var r=t.substr(0,n.protocol.length+2);if(r!==n.protocol+"//")return;t=t.substr(n.protocol.length+2)}else t=t.substr(2);if(t.substr(0,n.host.length)!==n.host)return;t=t.substr(n.host.length)}if(t.substr(0,this.baseUrl.length)===this.baseUrl&&t.substr(0,o.length)!==o&&t.substr(0,i.length)!==i){var s="/user-avatar/";if(t.substr(0,s.length)!==s)return t}}};var s="click.misago-router";this.delegateClicks=function(t){this.delegateElement=t,$(this.delegateElement).on(s,"a",function(t){var e=n.cleanUrl(t.target.href);e&&(e!=m.route()&&m.route(e),t.preventDefault())})},this.destroy=function(){$(this.delegateElement).off(s)};var a=function(t){return function(e){return t+e}};this.staticUrl=a(o),this.mediaUrl=a(i),this.error403=function(t){var n=null;n=t.ban?e.route("error:banned",t.detail,e.models.deserialize("ban",t.ban)):e.route("error:403",t.detail),m.mount(this.fixture,n)},this.error404=function(){m.mount(this.fixture,e.route("error:404"))},this.error500=function(){m.mount(this.fixture,e.route("error:500"))},this.error0=function(){m.mount(this.fixture,e.route("error:0"))},this.errorPage=function(t){0===t.status&&this.error0(),500===t.status&&this.error500(),404===t.status&&this.error404(),403===t.status&&this.error403(t)}};t.addService("router",function(t){return new e(t)}),t.addService("start-routing",function(e){e.router.startRouting(t.urls,document.getElementById("router-fixture")),e.router.delegateClicks(document.getElementById(e.setup.fixture))},{before:"_end"})}(Misago.prototype),function(t){"use strict";var e=function(e){if(e._hasRouteBoilerplate)return e;e._hasRouteBoilerplate=!0;var n=function(){var t=this.container;return m(".page.page-loading",t.component("loader"))},o=function(t){this.isActive&&this.container.router.errorPage(t)};return t.stateHooks(e,n,o)};t.addService("routes",function(t){t._routes={},t.route=function(n,o){if(this._routes[n]){if(arguments.length>1){for(var i=[this._routes[n]],r=1;r<arguments.length;r+=1)i.push(arguments[r]);return i.push(this),m.component.apply(void 0,i)}return m.component(this._routes[n],this)}o.container=t,this._routes[n]=e(o)}})}(Misago.prototype),function(t){"use strict";var e=function(t){var e=this;this._intervals={};var n=function(t){e._intervals[t]&&(window.clearTimeout(e._intervals[t]),e._intervals[t]=null)};this.run=function(o,i,r){this._intervals[i]=window.setTimeout(function(){n(i);var s=o(t);s!==!1&&e.run(o,i,r)},r)},this.runOnce=function(e,o,i){this._intervals[o]=window.setTimeout(function(){n(o),e(t)},i)},this.stop=function(t){for(var e in this._intervals)t&&t!==e||n(e)}};t.addService("runloop",{factory:function(t){return new e(t)},destroy:function(t){t.runloop.stop()}})}(Misago.prototype),function(t){"use strict";t.addService("start-tick",function(t){var e=m.prop();t.runloop.run(function(){m.startComputation(),e(e()+1),m.endComputation()},"tick",6e4)})}(Misago.prototype),function(t){"use strict";var e=function(t){this.set=function(e){e?this._set_complex(e):document.title=t},this._set_complex=function(e){"string"==typeof e&&(e={title:e});var n=e.title;if("undefined"!=typeof e.page&&e.page>1){var o=interpolate(gettext("page %(page)s"),{page:e.page},!0);n+=" ("+o+")"}"undefined"!=typeof e.parent&&(n+=" | "+e.parent),document.title=n+" | "+t}};t.addService("page-title",function(t){t.title=new e(t.settings.forum_name)})}(Misago.prototype),function(t){"use strict";t.validators={required:function(){return function(t){return 0===$.trim(t).length?gettext("This field is required."):void 0}}};var e=function(e){var n={},o=null,i=null,r=null;for(var s in e.validation)if(e.validation.hasOwnProperty(s))if(o=e[s](),r=t.validators.required()(o))n[s]=[r];else for(var a in e.validation[s])i=e.validation[s][a],r=i(o),r&&(n[s]||(n[s]=[]),n[s].push(r));return Object.getOwnPropertyNames(n).length>0?n:null};t.addService("validate",{factory:function(){return e}})}(Misago.prototype),function(t){"use strict";var e=function(t){this.included=!1,this.scorePassword=function(t,e){return zxcvbn(t,e).score},this.include=function(){t.include("misago/js/zxcvbn.js"),this.included=!0};var e=function(n){"undefined"!=typeof zxcvbn?n.resolve():t.runloop.runOnce(function(){e(n)},"loading-zxcvbn",150)},n=m.deferred();this.load=function(){return this.included||this.include(),e(n),n.promise}};t.addService("zxcvbn",function(t){return new e(t)},{after:"include"})}(Misago.prototype),function(t){"use strict";var e=function(t){this.message={html:t.message.html,plain:t.message.plain},this.expires_on=t.expires_on},n=function(e){return e.expires_on=t.deserializeDatetime(e.expires_on),e};t.addService("model:ban",function(t){t.models.add("ban",{"class":e,deserialize:n})},{after:"models"})}(Misago.prototype),function(t){"use strict";var e=function(t){this.title=t.title,this.body=t.body,this.link=t.link};t.addService("model:legal-page",function(t){t.models.add("legal-page",{"class":e})},{after:"models"})}(Misago.prototype),function(t){"use strict";var e=function(t){this.id=t.id,this.isAuthenticated=!!this.id,this.isAnonymous=!this.isAuthenticated,this.slug=t.slug,this.username=t.username,this.acl=t.acl,this.rank=t.rank},n=function(e){return e.joined_on&&(e.joined_on=t.deserializeDatetime(e.joined_on)),e};t.addService("model:user",function(t){t.models.add("user",{"class":e,deserialize:n})},{after:"models"})}(Misago.prototype),function(t){"use strict";var e=function(t){var e=[m("p.lead",t.message)];return t.help&&e.push(m("p.help",t.help)),m(".page.page-error.page-error-"+t.code,m(".container",m(".error-panel",[m(".error-icon",m("span.material-icon",t.icon)),m(".error-message",e)])))},n={controller:function(){this.container.title.set(gettext("You are banned"))},view:function(t,e,n){var o=[];o.push(n.message.html?m(".lead",m.trust(n.message.html)):e?m("p.lead",e):m("p.lead",gettext("You are banned.")));var i=null;return i=n.expires_on?n.expires_on.isAfter(moment())?interpolate(gettext("This ban expires %(expires_on)s."),{expires_on:n.expires_on.fromNow()},!0):gettext("This ban has expired."):gettext("This ban is permanent."),o.push(m("p",i)),m(".page.page-error.page-error-banned",m(".container",m(".error-panel",[m(".error-icon",m("span.material-icon","highlight_off")),m(".error-message",o)])))}},o={controller:function(){this.container.title.set(gettext("Page not available"))},view:function(t,n){return"Permission denied"===n&&(n=gettext("You don't have permission to access this page.")),e({code:403,icon:"remove_circle_outline",message:gettext("This page is not available."),help:n})}},i={controller:function(){this.container.title.set(gettext("Page not found"))},view:function(){return e({code:404,icon:"info_outline",message:gettext("Requested page could not be found."),help:gettext("The link you followed was incorrect or the page has been moved or deleted.")})}},r={controller:function(){this.container.title.set(gettext("Application error occured"))},view:function(){return e({code:500,icon:"error_outline",message:gettext("Requested page could not be displayed due to an error."),help:gettext("Please try again later or contact site staff if error persists.")})}},s={controller:function(){this.container.title.set(gettext("Lost connection with application"))},view:function(){return e({code:0,icon:"sync_problem",message:gettext("Could not connect to application."),help:gettext("This may be caused by problems with your connection or application server. Please check your internet connection and refresh page if problem persists.")})}};t.addService("route:error-pages",function(t){t.route("error:banned",n),t.route("error:403",o),t.route("error:404",i),t.route("error:500",r),t.route("error:0",s)},{after:"routes"})}(Misago.prototype),function(t){"use strict";var e={controller:function(){var t=this.container;document.title=t.settings.forum_index_title||t.settings.forum_name;var e=m.prop(0);return{count:e,increment:function(){console.log("increment()"),e(e()+1)}}},view:function(t,e){var n=["default","primary","success","info","warning","danger"];return m(".container",[m("h1","Buttons"),m("",n.map(function(t){return m("",[e.component("button",{"class":".btn-"+t,label:"Lorem ipsum"}),e.component("button",{"class":".btn-"+t,label:"Lorem ipsum",loading:!0})])}))])}};t.addService("route:index",function(t){t.route("index",e)},{after:"routes"})}(Misago.prototype),function(t){"use strict";var e=function(e,n){var o=e.replace(/_/g,"-");return{controller:function(n){t.get(n.settings,e+"_link")?window.location=t.get(n.settings,e+"_link"):this.vm.init(this,n)},vm:{page:null,isReady:!1,init:function(t,e){return this.isReady?void e.title.set(this.title):(e.title.set(),e.api.model("legal-page",o))},ondata:function(t,e,o){m.startComputation(),t.link?window.location=t.link:(t.title=t.title||n,this.page=t,this.isReady=!0,m.endComputation(),e.isActive&&o.title.set(this.page.title))}},view:function(t,e){return m(".page.page-legal.page-legal-"+o,[e.component("header",{title:this.vm.page.title}),m(".container",e.component("markup",this.vm.page.body))])}}};t.addService("route:legal-pages",function(t){t.route("terms-of-service",e("terms_of_service",gettext("Terms of service"))),t.route("privacy-policy",e("privacy_policy",gettext("Privacy policy")))},{after:"routes"})}(Misago.prototype),function(t){"use strict";var e=function(t){return-1!==[!!t.forum_footnote,!!t.terms_of_service,!!t.terms_of_service_link,!!t.privacy_policy,!!t.privacy_policy_link].indexOf(!0)},n={view:function(t,n){var o=null;return e(n.settings)&&(o=n.component("footer:menu")),m("footer.forum-footer",[m(".container",m(".footer-content",[o,n.component("footer:branding")]))])}};t.addService("component:footer",function(t){t.component("footer",n)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e=function(e,n,o){var i=t.get(e.settings,n+"_link");return!i&&t.get(e.settings,n)&&(i=e.router.url(n)),i?m("li",m("a",{href:i},t.get(e.settings,n+"_title",o))):null},n={isVisible:function(t){return-1!==[!!t.forum_footnote,!!t.terms_of_service,!!t.terms_of_service_link,!!t.privacy_policy,!!t.privacy_policy_link].indexOf(!0)},view:function(t,n){var o=[];return n.settings.forum_footnote&&o.push(m("li.forum-footnote",m.trust(n.settings.forum_footnote))),o.push(e(n,"terms_of_service",gettext("Terms of service"))),o.push(e(n,"privacy_policy",gettext("Privacy policy"))),m("ul.list-inline.footer-nav",o)}};t.addService("component:footer:menu",function(t){t.component("footer:menu",n)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(){return m("a.misago-branding[href=http://misago-project.org]",["powered by ",m("strong","misago")])}};t.addService("component:footer:branding",function(t){t.component("footer:branding",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(t,e){return m(".modal-header",[m('button.close[type="button"]',{"data-dismiss":"modal","aria-label":gettext("Close")},m("span",{"aria-hidden":"true"},m.trust("&times;"))),m("h4#misago-modal-label.modal-title",e)])}};t.addService("component:modal:header",function(t){t.component("modal:header",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";function e(t,e,n){n.retain=!0}var n={view:function(){return m('.modal-dialog.modal-register[role="document"]',{config:e},m(".modal-content",[m(".modal-header",m("h4#misago-modal-label.modal-title","Register in modal!")),m(".modal-body",[m("p","Lorem ipsum dolor met sit amet elit."),m("p",["Si vis pacem ",m("a",{href:"/"},"bellum")," sequitat."])])]))}};t.addService("modal:register",function(t){t.modal("register",n)},{after:"modals"})}(Misago.prototype),function(t){"use strict";function e(t,e,n){n.retain=!0}var n={controller:function(){return{busy:m.prop(!1),showActivation:m.prop(!1),username:m.prop(""),password:m.prop(""),validation:{username:[],password:[]}}},submit:function(t,e){if(t.busy())return!1;if(e.validate(t))return e.alert.error(gettext("Fill out both fields.")),!1;m.startComputation(),t.busy(!0),m.endComputation();var n={username:t.username(),password:t.password()},o=this;return e.api.endpoint("auth").post(n).then(function(){o.success(n,e)},function(n){o.error(t,n,e)}),!1},success:function(t,e){var n=$("#hidden-login-form");e.ajax.refreshCsrfToken(),n.find('input[type="hidden"]').val(e.ajax.csrfToken),n.find('input[name="redirect_to"]').val(m.route()),n.find('input[name="username"]').val(t.username),n.find('input[name="password"]').val(t.password),n.submit()},error:function(t,e,n){m.startComputation(),t.busy(!1),m.endComputation(),400===e.status?"inactive_admin"===e.code?n.alert.info(e.detail):"inactive_user"===e.code?(n.alert.info(e.detail),t.showActivation(!0)):"banned"===e.code?(n.modal(),n.router.error403({message:"",ban:e.detail})):n.alert.error(e.detail):n.api.alert(e)},view:function(n,o){return m('.modal-dialog.modal-sm.modal-signin[role="document"]',{config:e},m(".modal-content",[o.component("modal:header",gettext("Sign in")),m("form",{onsubmit:this.submit.bind(this,n,o)},[m(".modal-body",[m(".form-group",m(".control-input",t.input({disabled:n.busy(),value:n.username,placeholder:gettext("Username or e-mail")}))),m(".form-group",m(".control-input",t.input({type:"password",disabled:n.busy(),value:n.password,placeholder:gettext("Password")})))]),m(".modal-footer",o.component("button",{"class":".btn-primary.btn-block",submit:!0,loading:n.busy(),label:gettext("Sign in")}))])]))}};t.addService("modal:sign-in",function(t){t.modal("sign-in",n)},{after:"modals"})}(Misago.prototype),function(t){"use strict";var e={view:function(t,e){var n=".navbar.navbar-default.navbar-static-top";return m("nav"+n+'[role="navigation"]',[e.component("navbar:desktop")])}};t.addService("component:navbar",function(t){t.component("navbar",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(t,e,n){var o=[m("img",{src:n.router.staticUrl("misago/img/site-logo.png"),alt:n.settings.forum_name})];return e&&o.push(e),m("a.navbar-brand",{href:n.router.url("index")},o)}};t.addService("component:navbar:desktop:brand",function(t){t.component("navbar:desktop:brand",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={controller:function(t){return{showSignIn:function(){t.modal("sign-in")},isBusy:!1,showRegister:function(){if("closed"===t.settings.account_activation)t.alert.info(gettext("New registrations are currently disabled."));else{m.startComputation(),this.isBusy=!0,m.endComputation();var e=this;m.sync([t.zxcvbn.load(),t.captcha.load()]).then(function(){t.alert.success("loaded shizz for registration!")},function(){t.alert.error(gettext("Registation is not available now due to an error."))}).then(function(){m.startComputation(),e.isBusy=!1,m.endComputation()})}}}},view:function(t,e){return m("div.nav.nav-guest",[e.component("button",{"class":".navbar-btn.btn-default",onclick:t.showSignIn,disabled:t.isBusy,label:gettext("Sign in")}),e.component("button",{"class":".navbar-btn.btn-primary",onclick:t.showRegister.bind(t),loading:t.isBusy,label:gettext("Register")})])}};t.addService("component:navbar:desktop:guest-menu",function(t){t.component("navbar:desktop:guest-menu",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(t,e){var n=[];return e.settings.forum_branding_display&&n.push(e.component("navbar:desktop:brand",e.settings.forum_branding_text)),n.push(m("ul.nav.navbar-nav",[m("li",m("a",{config:m.route,href:e.router.url("index")},"Index"))])),n.push(e.user.isAuthenticated?e.component("navbar:desktop:user-menu"):e.component("navbar:desktop:guest-menu")),m(".container.navbar-full.hidden-xs.hidden-sm",n)}};t.addService("component:navbar:desktop",function(t){t.component("navbar:desktop",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={controller:function(){return{logout:function(){$("#hidden-logout-form").submit()}}},view:function(t,e){return m("div.nav.nav-user",[m("p.navbar-text",e.user.username),m("button.navbar-btn.btn.btn-default.navbar-right",{onclick:t.logout.bind(t)},gettext("Logout"))])}};t.addService("component:navbar:desktop:user-menu",function(t){t.component("navbar:desktop:user-menu",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";function e(t,e,n){n.retain=!0}var n={classes:{info:"alert-info",success:"alert-success",warning:"alert-warning",error:"alert-danger"},view:function(t,n){return m(".alerts",{config:e,"class":n.alert.isVisible?"in":"out"},m("p.alert",{"class":this.classes[n.alert.type]},n.alert.message))}};t.addService("component:alert",function(t){t.component("alert",n)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(t,e){var n={disabled:e.disabled||e.loading||!1,config:e.config||null,loading:e.loading||!1,type:e.submit?"submit":"button",onclick:e.onclick||null},o='button[type="'+n.type+'"].btn';n.loading&&(o+=".btn-loading"),e.id&&(o+="#"+e.id),o+=e["class"]||"";var i=e.label;return n.loading&&(i=[i,m(".loader-compact",[m(".bounce1"),m(".bounce2"),m(".bounce3")])]),m(o,n,i)}};t.addService("component:button",function(t){t.component("button",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e=function(t,e,n){n.retain=!0},n={view:function(t,n){return[n.component("alert"),n.component("navbar"),m("#router-fixture",{config:e}),n.component("footer"),n.component("modal")]}};t.addService("component:layout",function(t){t.component("forum-layout",n)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(){return m(".loader.sk-folding-cube",[m(".sk-cube1.sk-cube"),m(".sk-cube2.sk-cube"),m(".sk-cube4.sk-cube"),m(".sk-cube3.sk-cube")])}};t.addService("component:loader",function(t){t.component("loader",e)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e=function(t,e,n){n.retain=!0},n={view:function(t,n){return m("article.misago-markup",{config:e},m.trust(n))}};t.addService("component:markup",function(t){t.component("markup",n)},{after:"components"})}(Misago.prototype),function(t){"use strict";function e(t,e,n){n.retain=!0}var n={view:function(){return m('#misago-modal.modal.fade[role="dialog"]',{config:e,tabindex:"-1","aria-labelledby":"misago-modal-label"})}};t.addService("component:modal",function(t){t.component("modal",n)},{after:"components"})}(Misago.prototype),function(t){"use strict";var e={view:function(t,e){return m(".page-header",m(".container",[m("h1",e.title)]))}};t.addService("component:header",function(t){t.component("header",e)},{after:"components"})}(Misago.prototype),function(t,e){"use strict";var n=new e;n.url("/","index"),n.url("/terms-of-service/","terms_of_service"),n.url("/privacy-policy/","privacy_policy"),n.url("/:rest...","error:404","not_found"),t.urls=n}(Misago.prototype,Misago.prototype.UrlConf);
 //# sourceMappingURL=/misago.js.map

+ 1 - 1
misago/static/misago/js/misago.js.map

@@ -1 +1 @@
-{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","_initServices","services","orderedServices","OrderedList","order","forEach","item","factory","undefined","serviceInstance","key","_destroyServices","reverse","destroy","context","SETTINGS","setup","init","fixture","get","test","api","_services","proto","prototype","addService","name","push","after","before","has","obj","hasOwnProperty","value","pop","returnValue","input","kwargs","options","disabled","placeholder","config","element","id","type","oninput","m","withAttr","noop","stateHooks","component","loadingState","errorState","_hasLifecycleHooks","isActive","_controller","controller","apply","arguments","_onunload","onunload","vm","loading","loadingHandler","bind","_view","view","isReady","errorHandler","_init","initArgs","promise","then","ondata","finalArgs","i","length","f","error","items","isOrdered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","indexOf","ordered","splice","index","iterations","serializeDatetime","serialized","format","deserializeDatetime","deserialized","moment","startsWith","string","beginning","endsWith","tail","UrlConf","_patterns","patterns","prefixPattern","prefix","pattern","replace","include","url","loadingPage","_","getCsrfToken","cookie_name","document","cookie","cookieRegex","RegExp","match","split","Ajax","refreshCsrfToken","csrfToken","CSRF_COOKIE_NAME","runningGets","ajax","method","data","progress","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","resolve","jqXHR","rejection","responseJSON","status","statusText","reject","$","preloaded","post","patch","put","ALERT_BASE_DISPLAY_TIME","ALERT_LENGTH_FACTOR","ALERT_MAX_DISPLAY_TIME","ALERT_HIDE_ANIMATION_LENGTH","Alert","message","isVisible","show","startComputation","endComputation","displayTime","runloop","runOnce","set","info","warning","filtersUrl","filters","encodedKey","encodeURIComponent","encodedValue","join","Query","call","path","related","model","relation","endpoint","results","map","models","Api","alert","gettext","detail","Auth","user","deserialize","_components","argumentsArray","settings","mount","getElementById","Modal","delegateName","on","hide","off","removeClass","remove","modal","open","_modal","boilerplate","_modals","Models","classes","deserializers","relations","json","locale","attr","Router","baseUrl","staticUrl","mediaUrl","urls","reverses","populatePatterns","urlconf","finalPattern","route","startRouting","mode","delegateElement","cleanUrl","isRelative","substr","location","protocol","host","avatarsUrl","delegateClicks","e","target","href","preventDefault","prefixUrl","error403","ban","error404","error500","error0","errorPage","router","_hasRouteBoilerplate","loadingView","container","_routes","RunLoop","_intervals","stopInterval","clearTimeout","run","callable","delay","setTimeout","result","stop","loop","ticks","prop","PageTitle","forum_name","title","_set_complex","completeTitle","page","page_label","interpolate","parent","validators","required","trim","validate","ctrl","errors","validator","validation","getOwnPropertyNames","Ban","html","plain","expires_on","deserializeBan","class","LegalPage","body","link","User","isAuthenticated","isAnonymous","slug","username","acl","rank","deserializeUser","joined_on","error_message","help","code","icon","errorBanned","trust","expirationMessage","isAfter","fromNow","forum_index_title","count","increment","console","log","styles","label","legalPageFactory","typeName","defaultTitle","dashedTypeName","isMenuVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","footer","nav","legalLink","legalType","menu","branding","header","data-dismiss","aria-label","aria-hidden","persistent","el","isInit","retain","register","signin","busy","showActivation","password","submit","credentials","$form","find","val","onsubmit","navbar","style","brand","children","src","alt","showSignIn","showRegister","onclick","forum_branding_display","forum_branding_text","logout","button","forumLayout","loader","markup","content","tabindex","aria-labelledby"],"mappings":"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","file":"misago.js","sourcesContent":["/* global -Misago */\n/* exported Misago */\n(function () {\n  'use strict';\n\n  window.Misago = function() {\n    var ns = Object.getPrototypeOf(this);\n    var self = this;\n\n    // Services init/destroy\n    this._initServices = function(services) {\n      var orderedServices = new ns.OrderedList(services).order(false);\n      orderedServices.forEach(function (item) {\n        var factory = null;\n        if (item.item.factory !== undefined) {\n          factory = item.item.factory;\n        } else {\n          factory = item.item;\n        }\n\n        var serviceInstance = factory(self);\n        if (serviceInstance) {\n          self[item.key] = serviceInstance;\n        }\n      });\n    };\n\n    this._destroyServices = function(services) {\n      var orderedServices = new ns.OrderedList(services).order();\n      orderedServices.reverse();\n      orderedServices.forEach(function (item) {\n        if (item.destroy !== undefined) {\n          item.destroy(self);\n        }\n      });\n    };\n\n    // Context data\n    this.context = {\n      // Empty settings\n      SETTINGS: {}\n    };\n\n    // App init/destory\n    this.setup = false;\n    this.init = function(setup, context) {\n      this.setup = {\n        fixture: ns.get(setup, 'fixture', null),\n        test: ns.get(setup, 'test', false),\n        api: ns.get(setup, 'api', '/api/')\n      };\n\n      if (context) {\n        this.context = context;\n      }\n\n      this._initServices(ns._services);\n    };\n\n    this.destroy = function() {\n      this._destroyServices(ns._services);\n    };\n  };\n\n\n  // Services\n  var proto = window.Misago.prototype;\n\n  proto._services = [];\n  proto.addService = function(name, factory, order) {\n    proto._services.push({\n      key: name,\n      item: factory,\n      after: proto.get(order, 'after'),\n      before: proto.get(order, 'before')\n    });\n  };\n}());\n\n(function (Misago) {\n  'use strict';\n\n  Misago.has = function(obj, key) {\n    if (obj) {\n      return obj.hasOwnProperty(key);\n    } else {\n      return false;\n    }\n  };\n\n  Misago.get = function(obj, key, value) {\n    if (Misago.has(obj, key)) {\n      return obj[key];\n    } else if (value !== undefined) {\n      return value;\n    } else {\n      return undefined;\n    }\n  };\n\n  Misago.pop = function(obj, key, value) {\n    var returnValue = Misago.get(obj, key, value);\n    if (Misago.has(obj, key)) {\n      obj[key] = null;\n    }\n    return returnValue;\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.input = function(kwargs) {\n    var options = {\n      disabled: kwargs.disabled || false,\n      placeholder: kwargs.placeholder || null,\n      config: kwargs.config || null\n    };\n\n    var element = 'input';\n\n    if (kwargs.id) {\n      element += '#' + kwargs.id;\n    }\n\n    element += '.form-control' + (kwargs.class || '');\n    element += '[type=\"' + (kwargs.type || 'text') + '\"]';\n\n    if (kwargs.value) {\n      options.value = kwargs.value();\n      options.oninput = m.withAttr('value', kwargs.value);\n    }\n\n    return m(element, options);\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var noop = function() {};\n\n  Misago.stateHooks = function(component, loadingState, errorState) {\n    /*\n      Boilerplate for Misago components with lifecycles\n    */\n\n    // Component boilerplated (this may happen in tests)\n    if (component._hasLifecycleHooks) {\n      return component;\n    }\n    component._hasLifecycleHooks = true;\n\n    // Component active state\n    component.isActive = true;\n\n    // Wrap controller to store lifecycle methods\n    var _controller = component.controller || noop;\n    component.controller = function() {\n      component.isActive = true;\n\n      var controller = _controller.apply(component, arguments) || {};\n\n      // wrap onunload for lifestate\n      var _onunload = controller.onunload || noop;\n      controller.onunload = function() {\n        _onunload.apply(component, arguments);\n        component.isActive = false;\n      };\n\n      return controller;\n    };\n\n    // Add state callbacks to View-Model\n    if (component.vm && component.vm.init) {\n      // setup default loading view\n      if (!component.loading) {\n        var loadingHandler = loadingState.bind(component);\n        component.loading = loadingHandler;\n      }\n\n      var _view = component.view;\n      component.view = function() {\n        if (component.vm.isReady) {\n          return _view.apply(component, arguments);\n        } else {\n          return component.loading.apply(component, arguments);\n        }\n      };\n\n      var errorHandler = errorState.bind(component);\n\n      // wrap vm.init in promise handler\n      var _init = component.vm.init;\n      component.vm.init = function() {\n        var initArgs = arguments;\n        var promise = _init.apply(component.vm, initArgs);\n\n        if (promise) {\n          promise.then(function() {\n            if (component.isActive && component.vm.ondata) {\n              var finalArgs = [];\n              for (var i = 0; i < arguments.length; i++) {\n                finalArgs.push(arguments[i]);\n              }\n              for (var f = 0; f < initArgs.length; f++) {\n                finalArgs.push(initArgs[f]);\n              }\n\n              component.vm.ondata.apply(component.vm, finalArgs);\n            }\n          }, function(error) {\n            if (component.isActive) {\n              errorHandler(error);\n            }\n          });\n        }\n      };\n    }\n\n    return component;\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.OrderedList = function(items) {\n    this.isOrdered = false;\n    this._items = items || [];\n\n    this.add = function(key, item, order) {\n      this._items.push({\n        key: key,\n        item: item,\n        after: Misago.get(order, 'after'),\n        before: Misago.get(order, 'before')\n      });\n    };\n\n    this.get = function(key, value) {\n      for (var i = 0; i < this._items.length; i++) {\n        if (this._items[i].key === key) {\n          return this._items[i].item;\n        }\n      }\n\n      return value;\n    };\n\n    this.has = function(key) {\n      return this.get(key) !== undefined;\n    };\n\n    this.values = function() {\n      var values = [];\n      for (var i = 0; i < this._items.length; i++) {\n        values.push(this._items[i].item);\n      }\n      return values;\n    };\n\n    this.order = function(values_only) {\n      if (!this.isOrdered) {\n        this._items = this._order(this._items);\n        this.isOrdered = true;\n      }\n\n      if (values_only || typeof values_only === 'undefined') {\n        return this.values();\n      } else {\n        return this._items;\n      }\n    };\n\n    this._order = function(unordered) {\n      // Index of unordered items\n      var index = [];\n      unordered.forEach(function (item) {\n        index.push(item.key);\n      });\n\n      // Ordered items\n      var ordered = [];\n      var ordering = [];\n\n      // First pass: register items that\n      // don't specify their order\n      unordered.forEach(function (item) {\n        if (!item.after && !item.before) {\n          ordered.push(item);\n          ordering.push(item.key);\n        }\n      });\n\n      // Second pass: register items that\n      // specify their before to \"_end\"\n      unordered.forEach(function (item) {\n        if (item.before === \"_end\") {\n          ordered.push(item);\n          ordering.push(item.key);\n        }\n      });\n\n      // Third pass: keep iterating items\n      // until we hit iterations limit or finish\n      // ordering list\n      function insertItem(item) {\n        var insertAt = -1;\n        if (ordering.indexOf(item.key) === -1) {\n          if (item.after) {\n            insertAt = ordering.indexOf(item.after);\n            if (insertAt !== -1) {\n              insertAt += 1;\n            }\n          } else if (item.before) {\n            insertAt = ordering.indexOf(item.before);\n          }\n\n          if (insertAt !== -1) {\n            ordered.splice(insertAt, 0, item);\n            ordering.splice(insertAt, 0, item.key);\n          }\n        }\n      }\n\n      var iterations = 200;\n      while (iterations > 0 && index.length !== ordering.length) {\n        iterations -= 1;\n        unordered.forEach(insertItem);\n      }\n\n      return ordered;\n    };\n  };\n} (Misago.prototype));\n\n(function (Misago) {\n  Misago.serializeDatetime = function(serialized) {\n    return serialized ? serialized.format() : null;\n  };\n\n  Misago.deserializeDatetime = function(deserialized) {\n    return deserialized ? moment(deserialized) : null;\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.startsWith = function(string, beginning) {\n    return string.indexOf(beginning) === 0;\n  };\n\n  Misago.endsWith = function(string, tail) {\n    return string.indexOf(tail, string.length - tail.length) !== -1;\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.UrlConf = function() {\n    var self = this;\n    this._patterns = [];\n\n    this.patterns = function() {\n      return this._patterns;\n    };\n\n    var prefixPattern = function(prefix, pattern) {\n      return (prefix + pattern).replace('//', '/');\n    };\n\n    var include = function(prefix, patterns) {\n      for (var i = 0; i < patterns.length; i ++) {\n        self.url(prefixPattern(prefix, patterns[i].pattern),\n                 patterns[i].component,\n                 patterns[i].name);\n      }\n    };\n\n    this.url = function(pattern, component, name) {\n      if (pattern === '') {\n        pattern = '/';\n      }\n\n      if (component instanceof Misago.UrlConf) {\n        include(pattern, component.patterns());\n      } else {\n        this._patterns.push({\n          pattern: pattern,\n          component: component.replace(/_/g, '-'),\n          name: name || component\n        });\n      }\n    };\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.loadingPage = function(_) {\n    return m('.page.page-loading',\n      _.component('loader')\n    );\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var getCsrfToken = function(cookie_name) {\n    if (document.cookie.indexOf(cookie_name) !== -1) {\n      var cookieRegex = new RegExp(cookie_name + '\\=([^;]*)');\n      var cookie = Misago.get(document.cookie.match(cookieRegex), 0);\n      return cookie.split('=')[1];\n    } else {\n      return null;\n    }\n  };\n\n  var Ajax = function(_) {\n    this.refreshCsrfToken = function() {\n      this.csrfToken = getCsrfToken(_.context.CSRF_COOKIE_NAME);\n    };\n    this.refreshCsrfToken();\n\n    /*\n      List of GETs underway\n      We are limiting number of GETs to API to 1 per url\n    */\n    var runningGets = {};\n\n    this.ajax = function(method, url, data, progress) {\n      var promise = m.deferred();\n\n      var ajax_settings = {\n        url: url,\n        method: method,\n        headers: {\n          'X-CSRFToken': this.csrfToken\n        },\n\n        data: data || {},\n        dataType: 'json',\n\n        success: function(data) {\n          if (method === 'GET') {\n            Misago.pop(runningGets, url);\n          }\n          promise.resolve(data);\n        },\n        error: function(jqXHR) {\n          if (method === 'GET') {\n            Misago.pop(runningGets, url);\n          }\n\n          var rejection = jqXHR.responseJSON || {};\n\n          rejection.status = jqXHR.status;\n          rejection.statusText = jqXHR.statusText;\n\n          promise.reject(rejection);\n        }\n      };\n\n      if (progress) {\n        return; // not implemented... yet!\n      }\n\n      $.ajax(ajax_settings);\n      return promise.promise;\n    };\n\n    this.get = function(url) {\n      var preloaded = Misago.pop(_.context, url);\n      if (preloaded) {\n        var deferred = m.deferred();\n        deferred.resolve(preloaded);\n        return deferred.promise;\n      } else if (runningGets[url] !== undefined) {\n        return runningGets[url];\n      } else {\n        runningGets[url] = this.ajax('GET', url);\n        return runningGets[url];\n      }\n    };\n\n    this.post = function(url, data) {\n      return this.ajax('POST', url, data);\n    };\n\n    this.patch = function(url, data) {\n      return this.ajax('PATCH', url, data);\n    };\n\n    this.put = function(url, data) {\n      return this.ajax('PUT', url, data);\n    };\n\n    this.delete = function(url) {\n      return this.ajax('DELETE', url);\n    };\n  };\n\n  Misago.addService('ajax', function(_) {\n    return new Ajax(_);\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var ALERT_BASE_DISPLAY_TIME = 5 * 1000;\n  var ALERT_LENGTH_FACTOR = 70;\n  var ALERT_MAX_DISPLAY_TIME = 9 * 1000;\n  var ALERT_HIDE_ANIMATION_LENGTH = 300;\n\n  var Alert = function(_) {\n    var self = this;\n\n    this.id = 0;\n    this.type = 'info';\n    this.message = null;\n    this.isVisible = false;\n\n    var show = function(type, message) {\n      m.startComputation();\n\n      self.id += 1;\n      self.type = type;\n      self.message = message;\n      self.isVisible = true;\n\n      m.endComputation();\n\n      var displayTime = ALERT_BASE_DISPLAY_TIME;\n      displayTime += message.length * ALERT_LENGTH_FACTOR;\n      if (displayTime > ALERT_MAX_DISPLAY_TIME) {\n        displayTime = ALERT_MAX_DISPLAY_TIME;\n      }\n\n      var id  = self.id;\n      _.runloop.runOnce(function () {\n        if (self.id === id) {\n          m.startComputation();\n          self.isVisible = false;\n          m.endComputation();\n        }\n      }, 'flash-message-hide', displayTime);\n    };\n\n    var set = function(type, message) {\n      if (self.isVisible) {\n        self.isVisible = false;\n        _.runloop.runOnce(function () {\n          show(type, message);\n        }, 'flash-message-show', ALERT_HIDE_ANIMATION_LENGTH);\n      } else {\n        show(type, message);\n      }\n    };\n\n    this.info = function(message) {\n      set('info', message);\n    };\n\n    this.success = function(message) {\n      set('success', message);\n    };\n\n    this.warning = function(message) {\n      set('warning', message);\n    };\n\n    this.error = function(message) {\n      set('error', message);\n    };\n  };\n\n  Misago.addService('alert', {\n    factory: function(_) {\n      return new Alert(_);\n    }\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var filtersUrl = function(filters) {\n    if (typeof filters === 'object') {\n      var values = [];\n      for (var key in filters) {\n        if (filters.hasOwnProperty(key)) {\n          var encodedKey = encodeURIComponent(key);\n          var encodedValue = encodeURIComponent(filters[key]);\n          values.push(encodedKey + '=' + encodedValue);\n        }\n      }\n      return '?' + values.join('&');\n    } else {\n      return filters + '/';\n    }\n  };\n\n  var Query = function(_, call) {\n    this.url = call.url || _.setup.api;\n\n    if (call.path) {\n      this.url += call.path + '/';\n    } else if (call.related) {\n      this.url += call.related + '/';\n    } else {\n      this.url += call.model + 's' + '/';\n    }\n\n    if (call.filters) {\n      this.url += filtersUrl(call.filters);\n    }\n\n    if (!call.url && call.filters) {\n      if (call.model) {\n        this.related = function(model, filters) {\n          return new Query(_, {\n            url: this.url,\n            relation: call.model,\n            related: model,\n            filters: filters,\n          });\n        };\n      }\n\n      this.endpoint = function(path, filters) {\n        return new Query(_, {\n          url: this.url,\n          path: path,\n          filters: filters\n        });\n      };\n    }\n\n    this.get = function() {\n      var model = null;\n      if (call.related) {\n        model = call.relation + ':' + call.related;\n      } else if (call.model) {\n        model = call.model;\n      }\n\n      return _.ajax.get(this.url).then(function(data) {\n        if (model) {\n          if (data.results) {\n            data.results.map(function(item) {\n              return _.models.new(model, item);\n            });\n            return data;\n          } else {\n            return _.models.new(model, data);\n          }\n        } else {\n          return data;\n        }\n      });\n    };\n\n    this.post = function(data) {\n      return _.ajax.post(this.url, data);\n    };\n\n    this.patch = function(data) {\n      return _.ajax.patch(this.url, data);\n    };\n\n    this.put = function(data) {\n      return _.ajax.put(this.url, data);\n    };\n\n    this.delete = function() {\n      return _.ajax.delete(this.url);\n    };\n\n    // shortcut for get()\n    this.then = function(resolve, reject) {\n      return this.get().then(resolve, reject);\n    };\n  };\n\n  var Api = function(_) {\n    this.model = function(model, filters) {\n      return new Query(_, {\n        model: model,\n        filters: filters,\n      });\n    };\n\n    this.endpoint = function(path, filters) {\n      return new Query(_, {\n        path: path,\n        filters: filters\n      });\n    };\n\n    this.alert = function(rejection) {\n      // Shorthand for API errors\n      var message = gettext(\"Unknown error has occured.\");\n\n      if (rejection.status === 0) {\n        message = gettext(\"Lost connection with application.\");\n      }\n\n      if (rejection.status === 403) {\n        message = rejection.detail;\n        if (message === \"Permission denied\") {\n          message = gettext(\n            \"You don't have permission to perform this action.\");\n        }\n      }\n\n      if (rejection.status === 404) {\n        message = gettext(\"Action link is invalid.\");\n      }\n\n      _.alert.error(message);\n    };\n  };\n\n  Misago.addService('api', function(_) {\n    return new Api(_);\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var Auth = function(_) {\n    _.user = _.models.deserialize('user', _.context.user);\n  };\n\n  Misago.addService('auth', function(_) {\n    return new Auth(_);\n  },\n  {\n    after: 'model:user'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var component = function(name, component) {\n    if (this._components[name]) {\n      if (arguments.length > 1) {\n        var argumentsArray = [this._components[name]];\n        for (var i = 1; i < arguments.length; i += 1) {\n          argumentsArray.push(arguments[i]);\n        }\n        argumentsArray.push(this);\n        return m.component.apply(undefined, argumentsArray);\n      } else {\n        return m.component(this._components[name], this);\n      }\n    } else {\n      this._components[name] = component;\n    }\n  };\n\n  Misago.addService('components', function(_) {\n    _._components = {};\n    _.component = component;\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.addService('conf', function(_) {\n    _.settings = Misago.get(_.context, 'SETTINGS', {});\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.addService('forum-layout', {\n    factory: function(_) {\n      if (_.setup.fixture) {\n        m.mount(document.getElementById(_.setup.fixture),\n                _.component('forum-layout'));\n      }\n    },\n\n    destroy: function(_) {\n      if (_.setup.fixture) {\n        m.mount(document.getElementById(_.setup.fixture), null);\n      }\n    }\n  },\n  {\n    before: 'start-routing'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var Modal = function() {\n    var self = this;\n\n    var element = document.getElementById('misago-modal');\n\n    // href clicks within modal should close it\n    var delegateName = 'click.misago-modal';\n    $(element).on(delegateName, 'a', function() {\n      self.hide();\n    });\n\n    this.destroy = function() {\n      $(element).off();\n      $('body').removeClass('modal-open');\n      $('.modal-backdrop').remove();\n    };\n\n    // Open/close modal\n    var modal = $(element).modal({show: false});\n    this.open = false;\n\n    modal.on('hidden.bs.modal', function () {\n      if (self.open) {\n        m.mount(element, null);\n        this.open = false;\n      }\n    });\n\n    this.show = function(component) {\n      this.open = true;\n      m.mount(element, component);\n      modal.modal('show');\n    };\n\n    this.hide = function() {\n      modal.modal('hide');\n    };\n  };\n\n  Misago.addService('_modal', {\n    factory: function() {\n      return new Modal();\n    },\n    destroy: function(_) {\n      _._modal.destroy();\n    }\n  },\n  {\n    after: 'start-routing'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var boilerplate = function(component) {\n    return component;\n  };\n\n  var modal = function(name, component) {\n    if (this._modals[name]) {\n      var argumentsArray = [this._modals[name]];\n      for (var i = 1; i < arguments.length; i += 1) {\n        argumentsArray.push(arguments[i]);\n      }\n      argumentsArray.push(this);\n      this._modal.show(m.component.apply(m, argumentsArray));\n    } else if (name) {\n      this._modals[name] = boilerplate(component);\n    } else {\n      this._modal.hide();\n    }\n  };\n\n  Misago.addService('modals', function(_) {\n    _._modals = {};\n    _.modal = modal;\n  },\n  {\n    after: '_modal'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var Models = function() {\n    this.classes = {};\n    this.deserializers = {};\n    this.relations = {};\n\n    this.add = function(name, kwargs) {\n      if (kwargs.class) {\n        this.classes[name] = kwargs.class;\n      }\n\n      if (kwargs.deserialize) {\n        this.deserializers[name] = kwargs.deserialize;\n      }\n\n      if (kwargs.relations) {\n        for (var key in kwargs.relations) {\n          if (kwargs.relations.hasOwnProperty(key)) {\n            this.relations[name + ':' + key] = kwargs.relations[key];\n          }\n        }\n      }\n    };\n\n    this.new = function(name, data) {\n      if (this.classes[name]) {\n        return new this.classes[name](data);\n      } else {\n        return data;\n      }\n    };\n\n    this.deserialize = function(name, json) {\n      if (this.relations[name]) {\n        name = this.relations[name];\n      }\n\n      if (this.deserializers[name]) {\n        return this.new(name, this.deserializers[name](json, this));\n      } else {\n        return this.new(name, json);\n      }\n    };\n  };\n\n  Misago.addService('models', function() {\n    return new Models();\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.addService('set-momentjs-locale', function() {\n    moment.locale($('html').attr('lang'));\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var Router = function(_) {\n    var self = this;\n    this.baseUrl = $('base').attr('href');\n\n    var staticUrl = Misago.get(_.context, 'STATIC_URL', '/');\n    var mediaUrl = Misago.get(_.context, 'MEDIA_URL', '/');\n\n    // Routing\n    this.urls = {};\n    this.reverses = {};\n\n    var populatePatterns = function(urlconf) {\n      urlconf.patterns().forEach(function(url) {\n        var finalPattern = self.baseUrl + url.pattern;\n        finalPattern = finalPattern.replace('//', '/');\n\n        self.urls[finalPattern] = _.route(url.component);\n        self.reverses[url.name] = finalPattern;\n      });\n    };\n\n    this.startRouting = function(urlconf, fixture) {\n      populatePatterns(urlconf);\n      this.fixture = fixture;\n\n      if (_.setup.test) {\n        m.route.mode = 'search';\n      } else {\n        m.route.mode = 'pathname';\n      }\n      m.route(fixture, '/', this.urls);\n    };\n\n    this.url = function(name) {\n      return this.reverses[name];\n    };\n\n    // Delegate clicks\n    this.delegateElement = null;\n\n    this.cleanUrl = function(url) {\n      if (!url) { return; }\n\n      // Is link relative?\n      var isRelative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';\n\n      // If link contains host, validate to see if its outgoing\n      if (!isRelative) {\n        var location = window.location;\n\n        // If protocol matches current one, strip it from string\n        // otherwhise stop handler\n        if (url.substr(0, 2) !== '//') {\n          var protocol = url.substr(0, location.protocol.length + 2);\n          if (protocol !== location.protocol + '//') { return; }\n          url = url.substr(location.protocol.length + 2);\n        } else {\n          url = url.substr(2);\n        }\n\n        // Host checks out?\n        if (url.substr(0, location.host.length) !== location.host) { return; }\n        url = url.substr(location.host.length);\n      }\n\n      // Is link within Ember app?\n      if (url.substr(0, this.baseUrl.length) !== this.baseUrl) { return; }\n\n      // Is link to media/static/avatar server?\n      if (url.substr(0, staticUrl.length) === staticUrl) { return; }\n\n      if (url.substr(0, mediaUrl.length) === mediaUrl) { return; }\n\n      var avatarsUrl = '/user-avatar/';\n      if (url.substr(0, avatarsUrl.length) === avatarsUrl) { return; }\n\n      return url;\n    };\n\n    var delegateName = 'click.misago-router';\n    this.delegateClicks = function(element) {\n      this.delegateElement = element;\n      $(this.delegateElement).on(delegateName, 'a', function(e) {\n        var cleanUrl = self.cleanUrl(e.target.href);\n        if (cleanUrl) {\n          if (cleanUrl != m.route()) {\n            m.route(cleanUrl);\n          }\n          e.preventDefault();\n        }\n      });\n    };\n\n    this.destroy = function() {\n      $(this.delegateElement).off(delegateName);\n    };\n\n    // Media/Static url\n    var prefixUrl = function(prefix) {\n      return function(url) {\n        return prefix + url;\n      };\n    };\n\n    this.staticUrl = prefixUrl(staticUrl);\n    this.mediaUrl = prefixUrl(mediaUrl);\n\n    // Errors\n    this.error403 = function(error) {\n      var component = null;\n      if (error.ban) {\n        component = _.route('error:banned',\n          error.detail,\n          _.models.deserialize('ban', error.ban));\n      } else {\n        component = _.route('error:403', error.detail);\n      }\n      m.mount(this.fixture, component);\n    };\n\n    this.error404 = function() {\n      m.mount(this.fixture, _.route('error:404'));\n    };\n\n    this.error500 = function() {\n      m.mount(this.fixture, _.route('error:500'));\n    };\n\n    this.error0 = function() {\n      m.mount(this.fixture, _.route('error:0'));\n    };\n\n    this.errorPage = function(error) {\n      if (error.status === 0) {\n        this.error0();\n      }\n\n      if (error.status === 500) {\n        this.error500();\n      }\n\n      if (error.status === 404) {\n        this.error404();\n      }\n\n      if (error.status === 403) {\n        this.error403(error);\n      }\n    };\n  };\n\n  Misago.addService('router', function(_) {\n    return new Router(_);\n  });\n\n  Misago.addService('start-routing', function(_) {\n    _.router.startRouting(\n      Misago.urls, document.getElementById('router-fixture'));\n    _.router.delegateClicks(document.getElementById(_.setup.fixture));\n  },\n  {\n    before: '_end'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var boilerplate = function(component) {\n    /*\n      Boilerplate for Misago top-level components\n    */\n\n    // Component boilerplated (this may happen in tests)\n    if (component._hasRouteBoilerplate) {\n      return component;\n    }\n    component._hasRouteBoilerplate = true;\n\n    // Add lifecycle hooks\n    var loadingView = function () {\n      var _ = this.container;\n      return m('.page.page-loading',\n        _.component('loader')\n      );\n    };\n\n    var errorHandler = function(error) {\n      if (this.isActive) {\n        this.container.router.errorPage(error);\n      }\n    };\n\n    return Misago.stateHooks(component, loadingView, errorHandler);\n  };\n\n  Misago.addService('routes', function(_) {\n    _._routes = {};\n    _.route = function(name, component) {\n      if (this._routes[name]) {\n        if (arguments.length > 1) {\n          var argumentsArray = [this._routes[name]];\n          for (var i = 1; i < arguments.length; i += 1) {\n            argumentsArray.push(arguments[i]);\n          }\n          argumentsArray.push(this);\n          return m.component.apply(undefined, argumentsArray);\n        } else {\n          return m.component(this._routes[name], this);\n        }\n      } else {\n        component.container = _;\n        this._routes[name] = boilerplate(component);\n      }\n    };\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var RunLoop = function(_) {\n    var self = this;\n\n    this._intervals = {};\n\n    var stopInterval = function(name) {\n      if (self._intervals[name]) {\n        window.clearTimeout(self._intervals[name]);\n        self._intervals[name] = null;\n      }\n    };\n\n    this.run = function(callable, name, delay) {\n      this._intervals[name] = window.setTimeout(function() {\n        stopInterval(name);\n        var result = callable(_);\n        if (result !== false) {\n          self.run(callable, name, delay);\n        }\n      }, delay);\n    };\n\n    this.runOnce = function(callable, name, delay) {\n      this._intervals[name] = window.setTimeout(function() {\n        stopInterval(name);\n        callable(_);\n      }, delay);\n    };\n\n    this.stop = function(name) {\n      for (var loop in this._intervals) {\n        if (!name || name === loop) {\n          stopInterval(loop);\n        }\n      }\n    };\n  };\n\n  Misago.addService('runloop', {\n    factory: function(_) {\n      return new RunLoop(_);\n    },\n\n    destroy: function(_) {\n      _.runloop.stop();\n    }\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.addService('start-tick', function(_) {\n    var ticks = m.prop();\n\n    _.runloop.run(function() {\n      m.startComputation();\n      // just tick once a minute so stuff gets rerendered\n      ticks(ticks() + 1);\n      // syncing dynamic timestamps, etc ect\n      m.endComputation();\n    }, 'tick', 60000);\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var PageTitle = function(forum_name) {\n    this.set = function(title) {\n      if (title) {\n        this._set_complex(title);\n      } else {\n        document.title = forum_name;\n      }\n    };\n\n    this._set_complex = function(title) {\n      if (typeof title === 'string') {\n        title = {title: title};\n      }\n\n      var completeTitle = title.title;\n\n      if (typeof title.page !== 'undefined' && title.page > 1) {\n        var page_label = interpolate(\n          gettext('page %(page)s'), { page:title.page }, true);\n        completeTitle += ' (' + page_label + ')';\n      }\n\n      if (typeof title.parent !== 'undefined') {\n        completeTitle += ' | ' + title.parent;\n      }\n\n      document.title = completeTitle + ' | ' + forum_name;\n    };\n  };\n\n  Misago.addService('page-title', function(_) {\n    _.title = new PageTitle(_.settings.forum_name);\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  // Validators namespace\n  Misago.validators = {\n    required: function() {\n      return function(value) {\n        if ($.trim(value).length === 0) {\n          return gettext(\"This field is required.\");\n        }\n      };\n    }\n  };\n\n  var validate = function(ctrl) {\n    var errors = {};\n    var value = null;\n    var validator = null;\n    var result = null;\n\n    for (var key in ctrl.validation) {\n      if (ctrl.validation.hasOwnProperty(key)) {\n        value = ctrl[key]();\n\n        for (var i in ctrl.validation[key]) {\n          validator = ctrl.validation[key][i];\n          result = validator(value);\n\n          if (result) {\n            if (!errors[key]) {\n              errors[key] = [];\n            }\n            errors[key].push(result);\n          }\n        }\n      }\n    }\n\n    if (Object.getOwnPropertyNames(errors).length > 0) {\n      return errors;\n    } else {\n      return null;\n    }\n  };\n\n  Misago.addService('validate', {\n    factory: function() {\n      return validate;\n    }\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var Ban = function(data) {\n    this.message = {\n      html: data.message.html,\n      plain: data.message.plain,\n    };\n\n    this.expires_on = data.expires_on;\n  };\n\n  var deserializeBan = function(data) {\n    data.expires_on = Misago.deserializeDatetime(data.expires_on);\n\n    return data;\n  };\n\n  Misago.addService('model:ban', function(_) {\n    _.models.add('ban', {\n      class: Ban,\n      deserialize: deserializeBan\n    });\n  },\n  {\n    after: 'models'\n  });\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var LegalPage = function(data) {\n    this.title = data.title;\n    this.body = data.body;\n    this.link = data.link;\n  };\n\n  Misago.addService('model:legal-page', function(_) {\n    _.models.add('legal-page', {\n      class: LegalPage\n    });\n  },\n  {\n    after: 'models'\n  });\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var User = function(data) {\n    this.id = data.id;\n\n    this.isAuthenticated = !!this.id;\n    this.isAnonymous = !this.isAuthenticated;\n\n    this.slug = data.slug;\n    this.username = data.username;\n\n    this.acl = data.acl;\n    this.rank = data.rank;\n  };\n\n  var deserializeUser = function(data) {\n    if (data.joined_on) {\n      data.joined_on = Misago.deserializeDatetime(data.joined_on);\n    }\n\n    return data;\n  };\n\n  Misago.addService('model:user', function(_) {\n    _.models.add('user', {\n      class: User,\n      deserialize: deserializeUser\n    });\n  },\n  {\n    after: 'models'\n  });\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var errorPage = function(error) {\n    var error_message = [\n      m('p.lead', error.message)\n    ];\n\n    if (error.help) {\n      error_message.push(m('p.help', error.help));\n    }\n\n    return m('.page.error-page.error-' + error.code + '-page',\n      m('.container',\n        m('.error-panel', [\n          m('.error-icon',\n            m('span.material-icon', error.icon)\n          ),\n          m('.error-message', error_message)\n        ])\n      )\n    );\n  };\n\n  var errorBanned = {\n    controller: function() {\n      this.container.title.set(gettext('You are banned'));\n    },\n    view: function(ctrl, message, ban) {\n      var error_message = [];\n\n      if (ban.message.html) {\n        error_message.push(m('.lead', m.trust(ban.message.html)));\n      } else if (message) {\n        error_message.push(m('p.lead', message));\n      } else {\n        error_message.push(m('p.lead', gettext('You are banned.')));\n      }\n\n      var expirationMessage = null;\n      if (ban.expires_on) {\n        if (ban.expires_on.isAfter(moment())) {\n          expirationMessage = interpolate(\n            gettext('This ban expires %(expires_on)s.'),\n            { 'expires_on': ban.expires_on.fromNow() },\n            true);\n        } else {\n          expirationMessage = gettext('This ban has expired.');\n        }\n      } else {\n        expirationMessage = gettext('This ban is permanent.');\n      }\n      error_message.push(m('p', expirationMessage));\n\n      return m('.page.error-page.error-banned-page',\n        m('.container',\n          m('.error-panel', [\n            m('.error-icon',\n              m('span.material-icon', 'highlight_off')\n            ),\n            m('.error-message', error_message)\n          ])\n        )\n      );\n    }\n  };\n\n  var error403 = {\n    controller: function() {\n      this.container.title.set(gettext('Page not available'));\n    },\n    view: function(ctrl, message) {\n      if (message === \"Permission denied\") {\n        message = gettext(\"You don't have permission to access this page.\");\n      }\n\n      return errorPage({\n        code: 403,\n        icon: 'remove_circle_outline',\n        message: gettext(\"This page is not available.\"),\n        help: message\n      });\n    }\n  };\n\n  var error404 = {\n    controller: function() {\n      this.container.title.set(gettext('Page not found'));\n    },\n    view: function() {\n      return errorPage({\n        code: 404,\n        icon: 'info_outline',\n        message: gettext(\"Requested page could not be found.\"),\n        help: gettext(\"The link you followed was incorrect or the page has been moved or deleted.\")\n      });\n    }\n  };\n\n  var error500 = {\n    controller: function() {\n      this.container.title.set(gettext('Application error occured'));\n    },\n    view: function() {\n      return errorPage({\n        code: 500,\n        icon: 'error_outline',\n        message: gettext(\"Requested page could not be displayed due to an error.\"),\n        help: gettext(\"Please try again later or contact site staff if error persists.\")\n      });\n    }\n  };\n\n  var error0 = {\n    controller: function() {\n      this.container.title.set(gettext('Lost connection with application'));\n    },\n    view: function() {\n      return errorPage({\n        code: 0,\n        icon: 'sync_problem',\n        message: gettext(\"Could not connect to application.\"),\n        help: gettext(\"This may be caused by problems with your connection or application server. Please check your internet connection and refresh page if problem persists.\")\n      });\n    }\n  };\n\n  Misago.addService('route:error-pages', function(_) {\n    _.route('error:banned', errorBanned);\n    _.route('error:403', error403);\n    _.route('error:404', error404);\n    _.route('error:500', error500);\n    _.route('error:0', error0);\n  },\n  {\n    after: 'routes'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var index = {\n    controller: function() {\n      var _ = this.container;\n      document.title = _.settings.forum_index_title || _.settings.forum_name;\n\n      var count = m.prop(0);\n\n      return {\n        count: count,\n        increment: function() {\n          console.log('increment()');\n          count(count() + 1);\n        }\n      };\n    },\n    view: function(ctrl, _) {\n      var styles = [\n        'default', 'primary', 'success',\n        'info', 'warning', 'danger'\n      ];\n\n      return m('.container', [\n        m('h1', 'Buttons'),\n        m('', styles.map(function(item) {\n          return m('', [\n            _.component('button', {\n              class: '.btn-' + item,\n              label: 'Lorem ipsum'\n            }),\n            _.component('button', {\n              class: '.btn-' + item,\n              label: 'Lorem ipsum',\n              loading: true\n            })\n          ]);\n        }))\n      ]);\n    }\n  };\n\n  Misago.addService('route:index', function(_) {\n    _.route('index', index);\n  },\n  {\n    after: 'routes'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var legalPageFactory = function(typeName, defaultTitle) {\n    var dashedTypeName = typeName.replace(/_/g, '-');\n\n    return {\n      controller: function(_) {\n        if (Misago.get(_.settings, typeName + '_link')) {\n          window.location = Misago.get(_.settings, typeName + '_link');\n        } else {\n          this.vm.init(this, _);\n        }\n      },\n      vm: {\n        page: null,\n        isReady: false,\n        init: function(component, _) {\n          if (this.isReady) {\n            _.title.set(this.title);\n          } else {\n            _.title.set();\n            return _.api.model('legal-page', dashedTypeName);\n          }\n        },\n        ondata: function(page, component, _) {\n          m.startComputation();\n\n          if (page.link) {\n            window.location = page.link;\n          } else {\n            page.title = page.title || defaultTitle;\n            this.page = page;\n            this.isReady = true;\n\n            m.endComputation();\n\n            if (component.isActive) {\n              _.title.set(this.page.title);\n            }\n          }\n        }\n      },\n      view: function(ctrl, _) {\n        return m('.page.legal-page.' + dashedTypeName + '-page', [\n          _.component('header', {title: this.vm.page.title}),\n          m('.container',\n            _.component('markup', this.vm.page.body)\n          )\n        ]);\n      }\n    };\n  };\n\n  Misago.addService('route:legal-pages', function(_) {\n    _.route('terms-of-service', legalPageFactory(\n      'terms_of_service', gettext('Terms of service')));\n    _.route('privacy-policy', legalPageFactory(\n      'privacy_policy', gettext('Privacy policy')));\n  },\n  {\n    after: 'routes'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var isMenuVisible = function(settings) {\n    return [\n      !!settings.forum_footnote,\n      !!settings.terms_of_service,\n      !!settings.terms_of_service_link,\n      !!settings.privacy_policy,\n      !!settings.privacy_policy_link\n    ].indexOf(true) !== -1;\n  };\n\n  var footer = {\n    view: function(ctrl, _) {\n      var nav = null;\n      if (isMenuVisible(_.settings)) {\n        nav = _.component('footer:menu');\n      }\n\n      return m('footer.forum-footer', [\n        m('.container',\n          m('.footer-content', [\n            nav,\n            _.component('footer:branding')\n          ])\n        )\n      ]);\n    }\n  };\n\n  Misago.addService('component:footer', function(_) {\n    _.component('footer', footer);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var legalLink = function(_, legalType, defaultTitle) {\n    var url = Misago.get(_.settings, legalType + '_link');\n    if (!url && Misago.get(_.settings, legalType)) {\n      url = _.router.url(legalType);\n    }\n\n    if (url) {\n      return m('li',\n        m('a', {href: url},\n          Misago.get(_.settings, legalType + '_title', defaultTitle)\n        )\n      );\n    } else {\n      return null;\n    }\n  };\n\n  var menu = {\n    isVisible: function(settings) {\n      return [\n        !!settings.forum_footnote,\n        !!settings.terms_of_service,\n        !!settings.terms_of_service_link,\n        !!settings.privacy_policy,\n        !!settings.privacy_policy_link\n      ].indexOf(true) !== -1;\n    },\n    view: function(ctrl, _) {\n      var items = [];\n\n      if (_.settings.forum_footnote) {\n        items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));\n      }\n\n      items.push(\n        legalLink(_, 'terms_of_service', gettext('Terms of service')));\n      items.push(\n        legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n      return m('ul.list-inline.footer-nav', items);\n    }\n  };\n\n  Misago.addService('component:footer:menu', function(_) {\n    _.component('footer:menu', menu);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var branding = {\n    view: function() {\n      return m('a.misago-branding[href=http://misago-project.org]', [\n        \"powered by \", m('strong', \"misago\")\n      ]);\n    }\n  };\n\n  Misago.addService('component:footer:branding', function(_) {\n    _.component('footer:branding', branding);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var header = {\n    view: function(ctrl, title) {\n      return m('.modal-header', [\n        m('button.close[type=\"button\"]',\n          {'data-dismiss': 'modal', 'aria-label': gettext('Close')},\n          m('span', {'aria-hidden': 'true'}, m.trust('&times;'))\n        ),\n        m('h4#misago-modal-label.modal-title', title)\n      ]);\n    }\n  };\n\n  Misago.addService('component:modal:header', function(_) {\n    _.component('modal:header', header);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  function persistent(el, isInit, context) {\n    context.retain = true;\n  }\n\n  var register = {\n    view: function() {\n      return m('.modal-dialog.modal-lg[role=\"document\"]',\n        {config: persistent},\n        m('.modal-content', [\n          m('.modal-header',\n            m('h4#misago-modal-label.modal-title', 'Register in modal!')\n          ),\n          m('.modal-body', [\n            m('p', 'Lorem ipsum dolor met sit amet elit.'),\n            m('p', [\n              'Si vis pacem ',\n              m('a', {href: '/'}, 'bellum'),\n              ' sequitat.'\n            ])\n          ])\n        ])\n      );\n    }\n  };\n\n  Misago.addService('modal:register', function(_) {\n    _.modal('register', register);\n  },\n  {\n    after: 'modals'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  function persistent(el, isInit, context) {\n    context.retain = true;\n  }\n\n  var signin = {\n    controller: function() {\n      return {\n        busy: m.prop(false),\n        showActivation: m.prop(false),\n\n        username: m.prop(''),\n        password: m.prop(''),\n\n        validation: {\n          'username': [Misago.validators.required()],\n          'password': [Misago.validators.required()]\n        }\n      };\n    },\n    submit: function(ctrl, _) {\n      if (ctrl.busy()) {\n        return false;\n      }\n\n      if (_.validate(ctrl)) {\n        _.alert.error(gettext(\"Fill out both fields.\"));\n        return false;\n      }\n\n      m.startComputation();\n      ctrl.busy(true);\n      m.endComputation();\n\n      var credentials = {\n        username: ctrl.username(),\n        password: ctrl.password()\n      };\n\n      var self = this;\n\n      _.api.endpoint('auth').post(credentials).then(\n      function() {\n        self.success(credentials, _);\n      },\n      function(error) {\n        self.error(ctrl, error, _);\n      });\n\n      return false;\n    },\n    success: function(credentials, _) {\n      var $form = $('#hidden-login-form');\n\n      // refresh CSRF token because api call to /auth/ changed it\n      _.ajax.refreshCsrfToken();\n\n      // fill out form with user credentials and submit it, this will tell\n      // misago to redirect user back to right page, and will trigger browser's\n      // key ring feature\n      $form.find('input[type=\"hidden\"]').val(_.ajax.csrfToken);\n      $form.find('input[name=\"redirect_to\"]').val(m.route());\n      $form.find('input[name=\"username\"]').val(credentials.username);\n      $form.find('input[name=\"password\"]').val(credentials.password);\n      $form.submit();\n    },\n    error: function(ctrl, rejection, _) {\n      // activate form again\n      m.startComputation();\n      ctrl.busy(false);\n      m.endComputation();\n\n      // handle returned error\n      if (rejection.status === 400) {\n        if (rejection.code === 'inactive_admin') {\n          _.alert.info(rejection.detail);\n        } else if (rejection.code === 'inactive_user') {\n          _.alert.info(rejection.detail);\n          ctrl.showActivation(true);\n        } else if (rejection.code === 'banned') {\n          _.modal();\n          _.router.error403({\n            message: '',\n            ban: rejection.detail\n          });\n        } else {\n          _.alert.error(rejection.detail);\n        }\n      } else {\n        _.api.alert(rejection);\n      }\n    },\n    view: function(ctrl, _) {\n      return m('.modal-dialog.modal-sm.modal-signin[role=\"document\"]',\n        {config: persistent},\n        m('.modal-content', [\n          _.component('modal:header', gettext('Sign in')),\n          m('form', {onsubmit: this.submit.bind(this, ctrl, _)}, [\n            m('.modal-body', [\n              m('.form-group',\n                m('.control-input',\n                  Misago.input({\n                    disabled: ctrl.busy(),\n                    value: ctrl.username,\n                    placeholder: gettext(\"Username or e-mail\")\n                  })\n                )\n              ),\n              m('.form-group',\n                m('.control-input',\n                  Misago.input({\n                    type: 'password',\n                    disabled: ctrl.busy(),\n                    value: ctrl.password,\n                    placeholder: gettext(\"Password\")\n                  })\n                )\n              )\n            ]),\n            m('.modal-footer',\n              _.component('button', {\n                class: '.btn-primary.btn-block',\n                submit: true,\n                loading: ctrl.busy(),\n                label: gettext('Sign in')\n              })\n            )\n          ])\n        ])\n      );\n    }\n  };\n\n  Misago.addService('modal:sign-in', function(_) {\n    _.modal('sign-in', signin);\n  },\n  {\n    after: 'modals'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var navbar = {\n    view: function(ctrl, _) {\n      var style = '.navbar.navbar-default.navbar-static-top';\n      return m('nav' + style + '[role=\"navigation\"]', [\n        _.component('navbar:desktop')\n      ]);\n    }\n  };\n\n  Misago.addService('component:navbar', function(_) {\n    _.component('navbar', navbar);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var brand = {\n    view: function(ctrl, branding, _) {\n      var children = [\n        m('img', {\n          src: _.router.staticUrl('misago/img/site-logo.png'),\n          alt: _.settings.forum_name\n        })\n      ];\n\n      if (branding) {\n        children.push(branding);\n      }\n\n      return m('a.navbar-brand', {href: _.router.url('index')}, children);\n    }\n  };\n\n  Misago.addService('component:navbar:desktop:brand', function(_) {\n    _.component('navbar:desktop:brand', brand);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var menu = {\n    controller: function(_) {\n      return {\n        showSignIn: function() {\n          _.modal('sign-in');\n        },\n        showRegister: function() {\n          _.modal('register');\n        }\n      };\n    },\n    view: function(ctrl) {\n      return m('div.nav.nav-guest', [\n        m('button.navbar-btn.btn.btn-default',\n          {\n            onclick: ctrl.showSignIn\n          },\n          gettext(\"Sign in\")\n        ),\n        m('button.navbar-btn.btn.btn-primary',\n          {\n            onclick: ctrl.showRegister\n          },\n          gettext(\"Register\")\n        )\n      ]);\n    }\n  };\n\n  Misago.addService('component:navbar:desktop:guest-menu', function(_) {\n    _.component('navbar:desktop:guest-menu', menu);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var navbar = {\n    view: function(ctrl, _) {\n      var menu = [];\n\n      if (_.settings.forum_branding_display) {\n        menu.push(\n          _.component('navbar:desktop:brand', _.settings.forum_branding_text));\n      }\n\n      menu.push(m('ul.nav.navbar-nav', [\n        m('li',\n          m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')\n        )\n      ]));\n\n      if (_.user.isAuthenticated) {\n        menu.push(_.component('navbar:desktop:user-menu'));\n      } else {\n        menu.push(_.component('navbar:desktop:guest-menu'));\n      }\n\n      return m('.container.navbar-full.hidden-xs.hidden-sm', menu);\n    }\n  };\n\n  Misago.addService('component:navbar:desktop', function(_) {\n    _.component('navbar:desktop', navbar);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var menu = {\n    controller: function() {\n      return {\n        logout: function() {\n          $('#hidden-logout-form').submit();\n        }\n      };\n    },\n    view: function(ctrl, _) {\n      return m('div.nav.nav-user', [\n        m('p.navbar-text',\n          _.user.username\n        ),\n        m('button.navbar-btn.btn.btn-default.navbar-right',\n          {\n            onclick: ctrl.logout.bind(ctrl)\n          },\n          gettext(\"Logout\")\n        )\n      ]);\n    }\n  };\n\n  Misago.addService('component:navbar:desktop:user-menu', function(_) {\n    _.component('navbar:desktop:user-menu', menu);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  function persistent(el, isInit, context) {\n    context.retain = true;\n  }\n\n  var alert = {\n    classes: {\n      'info': 'alert-info',\n      'success': 'alert-success',\n      'warning': 'alert-warning',\n      'error': 'alert-danger'\n    },\n    view: function(ctrl, _) {\n      return m(\n        '.alerts',\n        {\n          config: persistent,\n          class: _.alert.isVisible ? 'in' : 'out'\n        },\n        m('p.alert',\n          {\n            class: this.classes[_.alert.type]\n          },\n          _.alert.message\n        )\n      );\n    }\n  };\n\n  Misago.addService('component:alert', function(_) {\n    _.component('alert', alert);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var button = {\n    view: function(ctrl, kwargs) {\n      var options = {\n        disabled: kwargs.disabled || kwargs.loading || false,\n        config: kwargs.config || null,\n        loading: kwargs.loading || false,\n        type: kwargs.submit ? 'submit' : 'button',\n        onclick: kwargs.onclick || null\n      };\n\n      var element = 'button[type=\"' + options.type + '\"].btn';\n      if (options.loading) {\n        element += '.btn-loading';\n      }\n\n      if (kwargs.id) {\n        element += '#' + kwargs.id;\n      }\n\n      element += (kwargs.class || '');\n\n      var label = kwargs.label;\n      if (options.loading) {\n        label = [\n          label,\n          m('.loader-compact', [\n            m('.bounce1'),\n            m('.bounce2'),\n            m('.bounce3')\n          ])\n        ];\n      }\n\n      return m(element, options, label);\n    },\n  };\n\n  Misago.addService('component:button', function(_) {\n    _.component('button', button);\n  },\n  {\n    after: 'components'\n  });\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var persistent = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  var forumLayout = {\n    view: function(ctrl, _) {\n      return [\n        _.component('alert'),\n        _.component('navbar'),\n        m('#router-fixture', {config: persistent}),\n        _.component('footer'),\n        _.component('modal')\n      ];\n    }\n  };\n\n  Misago.addService('component:layout', function(_) {\n    _.component('forum-layout', forumLayout);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var loader = {\n    view: function() {\n      return m('.loader.sk-folding-cube', [\n        m('.sk-cube1.sk-cube'),\n        m('.sk-cube2.sk-cube'),\n        m('.sk-cube4.sk-cube'),\n        m('.sk-cube3.sk-cube')\n      ]);\n    }\n  };\n\n  Misago.addService('component:loader', function(_) {\n    _.component('loader', loader);\n  },\n  {\n    after: 'components'\n  });\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var persistent = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  var markup = {\n    view: function(ctrl, content) {\n      return m('article.misago-markup', {config: persistent},\n        m.trust(content)\n      );\n    }\n  };\n\n  Misago.addService('component:markup', function(_) {\n    _.component('markup', markup);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  function persistent(el, isInit, context) {\n    context.retain = true;\n  }\n\n  var modal = {\n    view: function() {\n      return m(\n        '#misago-modal.modal.fade[role=\"dialog\"]',\n        {\n          config: persistent,\n          tabindex: \"-1\",\n          \"aria-labelledby\": \"misago-modal-label\"\n        }\n      );\n    }\n  };\n\n  Misago.addService('component:modal', function(_) {\n    _.component('modal', modal);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var header = {\n    view: function(ctrl, options) {\n      return m('.page-header',\n        m('.container', [\n          m('h1', options.title),\n        ])\n      );\n    }\n  };\n\n  Misago.addService('component:header', function(_) {\n    _.component('header', header);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago, UrlConf) {\n  'use strict';\n\n  var urls = new UrlConf();\n  urls.url('/', 'index');\n\n  // Legal pages\n  urls.url(\n    '/terms-of-service/',\n    'terms_of_service');\n\n  urls.url(\n    '/privacy-policy/',\n    'privacy_policy');\n\n  // Catch-all 404 not found route\n  urls.url('/:rest...', 'error:404', 'not_found');\n\n  Misago.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}
+{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","_initServices","services","orderedServices","OrderedList","order","forEach","item","factory","undefined","serviceInstance","key","_destroyServices","reverse","destroy","context","SETTINGS","setup","init","fixture","get","test","api","_services","proto","prototype","addService","name","push","after","before","has","obj","hasOwnProperty","value","pop","returnValue","input","kwargs","options","disabled","placeholder","config","element","id","type","oninput","m","withAttr","noop","stateHooks","component","loadingState","errorState","_hasLifecycleHooks","isActive","_controller","controller","apply","arguments","_onunload","onunload","vm","loading","loadingHandler","bind","_view","view","isReady","errorHandler","_init","initArgs","promise","then","ondata","finalArgs","i","length","f","error","items","isOrdered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","indexOf","ordered","splice","index","iterations","serializeDatetime","serialized","format","deserializeDatetime","deserialized","moment","startsWith","string","beginning","endsWith","tail","UrlConf","_patterns","patterns","prefixPattern","prefix","pattern","replace","include","url","loadingPage","_","getCsrfToken","cookie_name","document","cookie","cookieRegex","RegExp","match","split","Ajax","refreshCsrfToken","csrfToken","CSRF_COOKIE_NAME","runningGets","ajax","method","data","progress","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","resolve","jqXHR","rejection","responseJSON","status","statusText","reject","$","preloaded","post","patch","put","ALERT_BASE_DISPLAY_TIME","ALERT_LENGTH_FACTOR","ALERT_MAX_DISPLAY_TIME","ALERT_HIDE_ANIMATION_LENGTH","Alert","message","isVisible","show","startComputation","endComputation","displayTime","runloop","runOnce","set","info","warning","filtersUrl","filters","encodedKey","encodeURIComponent","encodedValue","join","Query","call","path","related","model","relation","endpoint","results","map","models","Api","alert","gettext","detail","Auth","user","deserialize","NoCaptcha","load","QACaptcha","question","prop","validation","label","helpText","help_text","ReCaptcha","Captcha","types","no","qa","re","captcha","settings","captcha_type","_components","argumentsArray","mount","getElementById","script","remote","STATIC_URL","cache","Modal","delegateName","on","hide","off","removeClass","remove","modal","open","_modal","_modals","Models","classes","deserializers","relations","json","locale","attr","Router","baseUrl","staticUrl","mediaUrl","urls","reverses","populatePatterns","urlconf","finalPattern","route","startRouting","mode","delegateElement","cleanUrl","isRelative","substr","location","protocol","host","avatarsUrl","delegateClicks","e","target","href","preventDefault","prefixUrl","error403","ban","error404","error500","error0","errorPage","router","boilerplate","_hasRouteBoilerplate","loadingView","container","_routes","RunLoop","_intervals","stopInterval","clearTimeout","run","callable","delay","setTimeout","result","stop","loop","ticks","PageTitle","forum_name","title","_set_complex","completeTitle","page","page_label","interpolate","parent","validators","required","trim","validate","ctrl","errors","validator","getOwnPropertyNames","Zxcvbn","included","scorePassword","password","inputs","zxcvbn","score","wait","Ban","html","plain","expires_on","deserializeBan","class","LegalPage","body","link","User","isAuthenticated","isAnonymous","slug","username","acl","rank","deserializeUser","joined_on","error_message","help","code","icon","errorBanned","trust","expirationMessage","isAfter","fromNow","forum_index_title","count","increment","console","log","styles","legalPageFactory","typeName","defaultTitle","dashedTypeName","isMenuVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","footer","nav","legalLink","legalType","menu","branding","header","data-dismiss","aria-label","aria-hidden","persistent","el","isInit","retain","register","signin","busy","showActivation","submit","credentials","$form","find","val","onsubmit","navbar","style","brand","children","src","alt","showSignIn","isBusy","showRegister","account_activation","sync","onclick","forum_branding_display","forum_branding_text","logout","button","forumLayout","loader","markup","content","tabindex","aria-labelledby"],"mappings":"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","file":"misago.js","sourcesContent":["/* global -Misago */\n/* exported Misago */\n(function () {\n  'use strict';\n\n  window.Misago = function() {\n    var ns = Object.getPrototypeOf(this);\n    var self = this;\n\n    // Services init/destroy\n    this._initServices = function(services) {\n      var orderedServices = new ns.OrderedList(services).order(false);\n      orderedServices.forEach(function (item) {\n        var factory = null;\n        if (item.item.factory !== undefined) {\n          factory = item.item.factory;\n        } else {\n          factory = item.item;\n        }\n\n        var serviceInstance = factory(self);\n        if (serviceInstance) {\n          self[item.key] = serviceInstance;\n        }\n      });\n    };\n\n    this._destroyServices = function(services) {\n      var orderedServices = new ns.OrderedList(services).order();\n      orderedServices.reverse();\n      orderedServices.forEach(function (item) {\n        if (item.destroy !== undefined) {\n          item.destroy(self);\n        }\n      });\n    };\n\n    // Context data\n    this.context = {\n      // Empty settings\n      SETTINGS: {}\n    };\n\n    // App init/destory\n    this.setup = false;\n    this.init = function(setup, context) {\n      this.setup = {\n        fixture: ns.get(setup, 'fixture', null),\n        test: ns.get(setup, 'test', false),\n        api: ns.get(setup, 'api', '/api/')\n      };\n\n      if (context) {\n        this.context = context;\n      }\n\n      this._initServices(ns._services);\n    };\n\n    this.destroy = function() {\n      this._destroyServices(ns._services);\n    };\n  };\n\n\n  // Services\n  var proto = window.Misago.prototype;\n\n  proto._services = [];\n  proto.addService = function(name, factory, order) {\n    proto._services.push({\n      key: name,\n      item: factory,\n      after: proto.get(order, 'after'),\n      before: proto.get(order, 'before')\n    });\n  };\n}());\n\n(function (Misago) {\n  'use strict';\n\n  Misago.has = function(obj, key) {\n    if (obj) {\n      return obj.hasOwnProperty(key);\n    } else {\n      return false;\n    }\n  };\n\n  Misago.get = function(obj, key, value) {\n    if (Misago.has(obj, key)) {\n      return obj[key];\n    } else if (value !== undefined) {\n      return value;\n    } else {\n      return undefined;\n    }\n  };\n\n  Misago.pop = function(obj, key, value) {\n    var returnValue = Misago.get(obj, key, value);\n    if (Misago.has(obj, key)) {\n      obj[key] = null;\n    }\n    return returnValue;\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.input = function(kwargs) {\n    var options = {\n      disabled: kwargs.disabled || false,\n      placeholder: kwargs.placeholder || null,\n      config: kwargs.config || null\n    };\n\n    var element = 'input';\n\n    if (kwargs.id) {\n      element += '#' + kwargs.id;\n    }\n\n    element += '.form-control' + (kwargs.class || '');\n    element += '[type=\"' + (kwargs.type || 'text') + '\"]';\n\n    if (kwargs.value) {\n      options.value = kwargs.value();\n      options.oninput = m.withAttr('value', kwargs.value);\n    }\n\n    return m(element, options);\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var noop = function() {};\n\n  Misago.stateHooks = function(component, loadingState, errorState) {\n    /*\n      Boilerplate for Misago components with lifecycles\n    */\n\n    // Component boilerplated (this may happen in tests)\n    if (component._hasLifecycleHooks) {\n      return component;\n    }\n    component._hasLifecycleHooks = true;\n\n    // Component active state\n    component.isActive = true;\n\n    // Wrap controller to store lifecycle methods\n    var _controller = component.controller || noop;\n    component.controller = function() {\n      component.isActive = true;\n\n      var controller = _controller.apply(component, arguments) || {};\n\n      // wrap onunload for lifestate\n      var _onunload = controller.onunload || noop;\n      controller.onunload = function() {\n        _onunload.apply(component, arguments);\n        component.isActive = false;\n      };\n\n      return controller;\n    };\n\n    // Add state callbacks to View-Model\n    if (component.vm && component.vm.init) {\n      // setup default loading view\n      if (!component.loading) {\n        var loadingHandler = loadingState.bind(component);\n        component.loading = loadingHandler;\n      }\n\n      var _view = component.view;\n      component.view = function() {\n        if (component.vm.isReady) {\n          return _view.apply(component, arguments);\n        } else {\n          return component.loading.apply(component, arguments);\n        }\n      };\n\n      var errorHandler = errorState.bind(component);\n\n      // wrap vm.init in promise handler\n      var _init = component.vm.init;\n      component.vm.init = function() {\n        var initArgs = arguments;\n        var promise = _init.apply(component.vm, initArgs);\n\n        if (promise) {\n          promise.then(function() {\n            if (component.isActive && component.vm.ondata) {\n              var finalArgs = [];\n              for (var i = 0; i < arguments.length; i++) {\n                finalArgs.push(arguments[i]);\n              }\n              for (var f = 0; f < initArgs.length; f++) {\n                finalArgs.push(initArgs[f]);\n              }\n\n              component.vm.ondata.apply(component.vm, finalArgs);\n            }\n          }, function(error) {\n            if (component.isActive) {\n              errorHandler(error);\n            }\n          });\n        }\n      };\n    }\n\n    return component;\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.OrderedList = function(items) {\n    this.isOrdered = false;\n    this._items = items || [];\n\n    this.add = function(key, item, order) {\n      this._items.push({\n        key: key,\n        item: item,\n        after: Misago.get(order, 'after'),\n        before: Misago.get(order, 'before')\n      });\n    };\n\n    this.get = function(key, value) {\n      for (var i = 0; i < this._items.length; i++) {\n        if (this._items[i].key === key) {\n          return this._items[i].item;\n        }\n      }\n\n      return value;\n    };\n\n    this.has = function(key) {\n      return this.get(key) !== undefined;\n    };\n\n    this.values = function() {\n      var values = [];\n      for (var i = 0; i < this._items.length; i++) {\n        values.push(this._items[i].item);\n      }\n      return values;\n    };\n\n    this.order = function(values_only) {\n      if (!this.isOrdered) {\n        this._items = this._order(this._items);\n        this.isOrdered = true;\n      }\n\n      if (values_only || typeof values_only === 'undefined') {\n        return this.values();\n      } else {\n        return this._items;\n      }\n    };\n\n    this._order = function(unordered) {\n      // Index of unordered items\n      var index = [];\n      unordered.forEach(function (item) {\n        index.push(item.key);\n      });\n\n      // Ordered items\n      var ordered = [];\n      var ordering = [];\n\n      // First pass: register items that\n      // don't specify their order\n      unordered.forEach(function (item) {\n        if (!item.after && !item.before) {\n          ordered.push(item);\n          ordering.push(item.key);\n        }\n      });\n\n      // Second pass: register items that\n      // specify their before to \"_end\"\n      unordered.forEach(function (item) {\n        if (item.before === \"_end\") {\n          ordered.push(item);\n          ordering.push(item.key);\n        }\n      });\n\n      // Third pass: keep iterating items\n      // until we hit iterations limit or finish\n      // ordering list\n      function insertItem(item) {\n        var insertAt = -1;\n        if (ordering.indexOf(item.key) === -1) {\n          if (item.after) {\n            insertAt = ordering.indexOf(item.after);\n            if (insertAt !== -1) {\n              insertAt += 1;\n            }\n          } else if (item.before) {\n            insertAt = ordering.indexOf(item.before);\n          }\n\n          if (insertAt !== -1) {\n            ordered.splice(insertAt, 0, item);\n            ordering.splice(insertAt, 0, item.key);\n          }\n        }\n      }\n\n      var iterations = 200;\n      while (iterations > 0 && index.length !== ordering.length) {\n        iterations -= 1;\n        unordered.forEach(insertItem);\n      }\n\n      return ordered;\n    };\n  };\n} (Misago.prototype));\n\n(function (Misago) {\n  Misago.serializeDatetime = function(serialized) {\n    return serialized ? serialized.format() : null;\n  };\n\n  Misago.deserializeDatetime = function(deserialized) {\n    return deserialized ? moment(deserialized) : null;\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.startsWith = function(string, beginning) {\n    return string.indexOf(beginning) === 0;\n  };\n\n  Misago.endsWith = function(string, tail) {\n    return string.indexOf(tail, string.length - tail.length) !== -1;\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.UrlConf = function() {\n    var self = this;\n    this._patterns = [];\n\n    this.patterns = function() {\n      return this._patterns;\n    };\n\n    var prefixPattern = function(prefix, pattern) {\n      return (prefix + pattern).replace('//', '/');\n    };\n\n    var include = function(prefix, patterns) {\n      for (var i = 0; i < patterns.length; i ++) {\n        self.url(prefixPattern(prefix, patterns[i].pattern),\n                 patterns[i].component,\n                 patterns[i].name);\n      }\n    };\n\n    this.url = function(pattern, component, name) {\n      if (pattern === '') {\n        pattern = '/';\n      }\n\n      if (component instanceof Misago.UrlConf) {\n        include(pattern, component.patterns());\n      } else {\n        this._patterns.push({\n          pattern: pattern,\n          component: component.replace(/_/g, '-'),\n          name: name || component\n        });\n      }\n    };\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.loadingPage = function(_) {\n    return m('.page.page-loading',\n      _.component('loader')\n    );\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var getCsrfToken = function(cookie_name) {\n    if (document.cookie.indexOf(cookie_name) !== -1) {\n      var cookieRegex = new RegExp(cookie_name + '\\=([^;]*)');\n      var cookie = Misago.get(document.cookie.match(cookieRegex), 0);\n      return cookie.split('=')[1];\n    } else {\n      return null;\n    }\n  };\n\n  var Ajax = function(_) {\n    this.refreshCsrfToken = function() {\n      this.csrfToken = getCsrfToken(_.context.CSRF_COOKIE_NAME);\n    };\n    this.refreshCsrfToken();\n\n    /*\n      List of GETs underway\n      We are limiting number of GETs to API to 1 per url\n    */\n    var runningGets = {};\n\n    this.ajax = function(method, url, data, progress) {\n      var promise = m.deferred();\n\n      var ajax_settings = {\n        url: url,\n        method: method,\n        headers: {\n          'X-CSRFToken': this.csrfToken\n        },\n\n        data: data || {},\n        dataType: 'json',\n\n        success: function(data) {\n          if (method === 'GET') {\n            Misago.pop(runningGets, url);\n          }\n          promise.resolve(data);\n        },\n        error: function(jqXHR) {\n          if (method === 'GET') {\n            Misago.pop(runningGets, url);\n          }\n\n          var rejection = jqXHR.responseJSON || {};\n\n          rejection.status = jqXHR.status;\n          rejection.statusText = jqXHR.statusText;\n\n          promise.reject(rejection);\n        }\n      };\n\n      if (progress) {\n        return; // not implemented... yet!\n      }\n\n      $.ajax(ajax_settings);\n      return promise.promise;\n    };\n\n    this.get = function(url) {\n      var preloaded = Misago.pop(_.context, url);\n      if (preloaded) {\n        var deferred = m.deferred();\n        deferred.resolve(preloaded);\n        return deferred.promise;\n      } else if (runningGets[url] !== undefined) {\n        return runningGets[url];\n      } else {\n        runningGets[url] = this.ajax('GET', url);\n        return runningGets[url];\n      }\n    };\n\n    this.post = function(url, data) {\n      return this.ajax('POST', url, data);\n    };\n\n    this.patch = function(url, data) {\n      return this.ajax('PATCH', url, data);\n    };\n\n    this.put = function(url, data) {\n      return this.ajax('PUT', url, data);\n    };\n\n    this.delete = function(url) {\n      return this.ajax('DELETE', url);\n    };\n  };\n\n  Misago.addService('ajax', function(_) {\n    return new Ajax(_);\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var ALERT_BASE_DISPLAY_TIME = 5 * 1000;\n  var ALERT_LENGTH_FACTOR = 70;\n  var ALERT_MAX_DISPLAY_TIME = 9 * 1000;\n  var ALERT_HIDE_ANIMATION_LENGTH = 300;\n\n  var Alert = function(_) {\n    var self = this;\n\n    this.id = 0;\n    this.type = 'info';\n    this.message = null;\n    this.isVisible = false;\n\n    var show = function(type, message) {\n      m.startComputation();\n\n      self.id += 1;\n      self.type = type;\n      self.message = message;\n      self.isVisible = true;\n\n      m.endComputation();\n\n      var displayTime = ALERT_BASE_DISPLAY_TIME;\n      displayTime += message.length * ALERT_LENGTH_FACTOR;\n      if (displayTime > ALERT_MAX_DISPLAY_TIME) {\n        displayTime = ALERT_MAX_DISPLAY_TIME;\n      }\n\n      var id  = self.id;\n      _.runloop.runOnce(function () {\n        if (self.id === id) {\n          m.startComputation();\n          self.isVisible = false;\n          m.endComputation();\n        }\n      }, 'flash-message-hide', displayTime);\n    };\n\n    var set = function(type, message) {\n      if (self.isVisible) {\n        self.isVisible = false;\n        _.runloop.runOnce(function () {\n          show(type, message);\n        }, 'flash-message-show', ALERT_HIDE_ANIMATION_LENGTH);\n      } else {\n        show(type, message);\n      }\n    };\n\n    this.info = function(message) {\n      set('info', message);\n    };\n\n    this.success = function(message) {\n      set('success', message);\n    };\n\n    this.warning = function(message) {\n      set('warning', message);\n    };\n\n    this.error = function(message) {\n      set('error', message);\n    };\n  };\n\n  Misago.addService('alert', {\n    factory: function(_) {\n      return new Alert(_);\n    }\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var filtersUrl = function(filters) {\n    if (typeof filters === 'object') {\n      var values = [];\n      for (var key in filters) {\n        if (filters.hasOwnProperty(key)) {\n          var encodedKey = encodeURIComponent(key);\n          var encodedValue = encodeURIComponent(filters[key]);\n          values.push(encodedKey + '=' + encodedValue);\n        }\n      }\n      return '?' + values.join('&');\n    } else {\n      return filters + '/';\n    }\n  };\n\n  var Query = function(_, call) {\n    this.url = call.url || _.setup.api;\n\n    if (call.path) {\n      this.url += call.path + '/';\n    } else if (call.related) {\n      this.url += call.related + '/';\n    } else {\n      this.url += call.model + 's' + '/';\n    }\n\n    if (call.filters) {\n      this.url += filtersUrl(call.filters);\n    }\n\n    if (!call.url && call.filters) {\n      if (call.model) {\n        this.related = function(model, filters) {\n          return new Query(_, {\n            url: this.url,\n            relation: call.model,\n            related: model,\n            filters: filters,\n          });\n        };\n      }\n\n      this.endpoint = function(path, filters) {\n        return new Query(_, {\n          url: this.url,\n          path: path,\n          filters: filters\n        });\n      };\n    }\n\n    this.get = function() {\n      var model = null;\n      if (call.related) {\n        model = call.relation + ':' + call.related;\n      } else if (call.model) {\n        model = call.model;\n      }\n\n      return _.ajax.get(this.url).then(function(data) {\n        if (model) {\n          if (data.results) {\n            data.results.map(function(item) {\n              return _.models.new(model, item);\n            });\n            return data;\n          } else {\n            return _.models.new(model, data);\n          }\n        } else {\n          return data;\n        }\n      });\n    };\n\n    this.post = function(data) {\n      return _.ajax.post(this.url, data);\n    };\n\n    this.patch = function(data) {\n      return _.ajax.patch(this.url, data);\n    };\n\n    this.put = function(data) {\n      return _.ajax.put(this.url, data);\n    };\n\n    this.delete = function() {\n      return _.ajax.delete(this.url);\n    };\n\n    // shortcut for get()\n    this.then = function(resolve, reject) {\n      return this.get().then(resolve, reject);\n    };\n  };\n\n  var Api = function(_) {\n    this.model = function(model, filters) {\n      return new Query(_, {\n        model: model,\n        filters: filters,\n      });\n    };\n\n    this.endpoint = function(path, filters) {\n      return new Query(_, {\n        path: path,\n        filters: filters\n      });\n    };\n\n    this.alert = function(rejection) {\n      // Shorthand for API errors\n      var message = gettext(\"Unknown error has occured.\");\n\n      if (rejection.status === 0) {\n        message = gettext(\"Lost connection with application.\");\n      }\n\n      if (rejection.status === 403) {\n        message = rejection.detail;\n        if (message === \"Permission denied\") {\n          message = gettext(\n            \"You don't have permission to perform this action.\");\n        }\n      }\n\n      if (rejection.status === 404) {\n        message = gettext(\"Action link is invalid.\");\n      }\n\n      _.alert.error(message);\n    };\n  };\n\n  Misago.addService('api', function(_) {\n    return new Api(_);\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var Auth = function(_) {\n    _.user = _.models.deserialize('user', _.context.user);\n  };\n\n  Misago.addService('auth', function(_) {\n    return new Auth(_);\n  },\n  {\n    after: 'model:user'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var NoCaptcha = function() {\n    var deferred = m.deferred();\n    deferred.resolve();\n\n    this.load = function() {\n      return deferred.promise;\n    };\n\n    this.component = function() {\n      return null;\n    };\n\n    this.value = function() {\n      return 'pass';\n    };\n  };\n\n  var QACaptcha = function(_) {\n    this.loading = false;\n    this.question = null;\n    this.value = m.prop('');\n\n    var deferred = m.deferred();\n    this.load = function() {\n      this.value('');\n\n      if (!this.question && !this.loading) {\n        this.loading = true;\n\n        var self = this;\n        _.api.endpoint('captcha-question').get().then(function(question) {\n          self.question = question;\n          deferred.resolve();\n        }, function() {\n          _.api.alert(gettext('Failed to load CAPTCHA.'));\n          deferred.reject();\n        }).then(function() {\n          self.loading = true;\n        });\n      }\n\n      return deferred.promise;\n    };\n\n    this.component = function(validation) {\n      return _.component('form:row', {\n        label: this.question.question,\n        helpText: this.question.help_text,\n        validation: validation\n      });\n    };\n  };\n\n  var ReCaptcha = function(_) {\n    this.loading = false;\n    this.question = null;\n\n    var deferred = m.deferred();\n    this.load = function() {\n      return deferred.promise;\n    };\n\n    this.component = function() {\n      return 'null';\n    };\n\n    this.value = function() {\n      return 'pass';\n    };\n  };\n\n  var Captcha = function(_) {\n    var types = {\n      'no': NoCaptcha,\n      'qa': QACaptcha,\n      're': ReCaptcha\n    };\n\n    var captcha = new types[_.settings.captcha_type](_);\n\n    this.load = function() {\n      return captcha.load();\n    };\n\n    this.component = function() {\n      return captcha.component();\n    };\n\n    this.value = function() {\n      return captcha.value();\n    };\n  };\n\n  Misago.addService('captcha', function(_) {\n    return new Captcha(_);\n  },\n  {\n    after: 'include'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var component = function(name, component) {\n    if (this._components[name]) {\n      if (arguments.length > 1) {\n        var argumentsArray = [this._components[name]];\n        for (var i = 1; i < arguments.length; i += 1) {\n          argumentsArray.push(arguments[i]);\n        }\n        argumentsArray.push(this);\n        return m.component.apply(undefined, argumentsArray);\n      } else {\n        return m.component(this._components[name], this);\n      }\n    } else {\n      this._components[name] = component;\n    }\n  };\n\n  Misago.addService('components', function(_) {\n    _._components = {};\n    _.component = component;\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.addService('conf', function(_) {\n    _.settings = Misago.get(_.context, 'SETTINGS', {});\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.addService('forum-layout', {\n    factory: function(_) {\n      if (_.setup.fixture) {\n        m.mount(document.getElementById(_.setup.fixture),\n                _.component('forum-layout'));\n      }\n    },\n\n    destroy: function(_) {\n      if (_.setup.fixture) {\n        m.mount(document.getElementById(_.setup.fixture), null);\n      }\n    }\n  },\n  {\n    before: 'start-routing'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var include = function(script, remote) {\n    if (!remote) {\n      script = this.context.STATIC_URL + script;\n    }\n\n    $.ajax({\n      url: script,\n      cache: true,\n      dataType: 'script'\n    });\n  };\n\n  Misago.addService('include', function(_) {\n    _.include = include;\n  },\n  {\n    after: 'conf'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var Modal = function() {\n    var self = this;\n\n    var element = document.getElementById('misago-modal');\n\n    // href clicks within modal should close it\n    var delegateName = 'click.misago-modal';\n    $(element).on(delegateName, 'a', function() {\n      self.hide();\n    });\n\n    this.destroy = function() {\n      $(element).off();\n      $('body').removeClass('modal-open');\n      $('.modal-backdrop').remove();\n    };\n\n    // Open/close modal\n    var modal = $(element).modal({show: false});\n    this.open = false;\n\n    modal.on('hidden.bs.modal', function () {\n      if (self.open) {\n        m.mount(element, null);\n        this.open = false;\n      }\n    });\n\n    this.show = function(component) {\n      this.open = true;\n      m.mount(element, component);\n      modal.modal('show');\n    };\n\n    this.hide = function() {\n      modal.modal('hide');\n    };\n  };\n\n  Misago.addService('_modal', {\n    factory: function() {\n      return new Modal();\n    },\n    destroy: function(_) {\n      _._modal.destroy();\n    }\n  },\n  {\n    after: 'start-routing'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var modal = function(name, component) {\n    if (this._modals[name]) {\n      var argumentsArray = [this._modals[name]];\n      for (var i = 1; i < arguments.length; i += 1) {\n        argumentsArray.push(arguments[i]);\n      }\n      argumentsArray.push(this);\n      this._modal.show(m.component.apply(m, argumentsArray));\n    } else if (name) {\n      this._modals[name] = component;\n    } else {\n      this._modal.hide();\n    }\n  };\n\n  Misago.addService('modals', function(_) {\n    _._modals = {};\n    _.modal = modal;\n  },\n  {\n    after: '_modal'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var Models = function() {\n    this.classes = {};\n    this.deserializers = {};\n    this.relations = {};\n\n    this.add = function(name, kwargs) {\n      if (kwargs.class) {\n        this.classes[name] = kwargs.class;\n      }\n\n      if (kwargs.deserialize) {\n        this.deserializers[name] = kwargs.deserialize;\n      }\n\n      if (kwargs.relations) {\n        for (var key in kwargs.relations) {\n          if (kwargs.relations.hasOwnProperty(key)) {\n            this.relations[name + ':' + key] = kwargs.relations[key];\n          }\n        }\n      }\n    };\n\n    this.new = function(name, data) {\n      if (this.classes[name]) {\n        return new this.classes[name](data);\n      } else {\n        return data;\n      }\n    };\n\n    this.deserialize = function(name, json) {\n      if (this.relations[name]) {\n        name = this.relations[name];\n      }\n\n      if (this.deserializers[name]) {\n        return this.new(name, this.deserializers[name](json, this));\n      } else {\n        return this.new(name, json);\n      }\n    };\n  };\n\n  Misago.addService('models', function() {\n    return new Models();\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.addService('set-momentjs-locale', function() {\n    moment.locale($('html').attr('lang'));\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var Router = function(_) {\n    var self = this;\n    this.baseUrl = $('base').attr('href');\n\n    var staticUrl = Misago.get(_.context, 'STATIC_URL', '/');\n    var mediaUrl = Misago.get(_.context, 'MEDIA_URL', '/');\n\n    // Routing\n    this.urls = {};\n    this.reverses = {};\n\n    var populatePatterns = function(urlconf) {\n      urlconf.patterns().forEach(function(url) {\n        var finalPattern = self.baseUrl + url.pattern;\n        finalPattern = finalPattern.replace('//', '/');\n\n        self.urls[finalPattern] = _.route(url.component);\n        self.reverses[url.name] = finalPattern;\n      });\n    };\n\n    this.startRouting = function(urlconf, fixture) {\n      populatePatterns(urlconf);\n      this.fixture = fixture;\n\n      if (_.setup.test) {\n        m.route.mode = 'search';\n      } else {\n        m.route.mode = 'pathname';\n      }\n      m.route(fixture, '/', this.urls);\n    };\n\n    this.url = function(name) {\n      return this.reverses[name];\n    };\n\n    // Delegate clicks\n    this.delegateElement = null;\n\n    this.cleanUrl = function(url) {\n      if (!url) { return; }\n\n      // Is link relative?\n      var isRelative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';\n\n      // If link contains host, validate to see if its outgoing\n      if (!isRelative) {\n        var location = window.location;\n\n        // If protocol matches current one, strip it from string\n        // otherwhise stop handler\n        if (url.substr(0, 2) !== '//') {\n          var protocol = url.substr(0, location.protocol.length + 2);\n          if (protocol !== location.protocol + '//') { return; }\n          url = url.substr(location.protocol.length + 2);\n        } else {\n          url = url.substr(2);\n        }\n\n        // Host checks out?\n        if (url.substr(0, location.host.length) !== location.host) { return; }\n        url = url.substr(location.host.length);\n      }\n\n      // Is link within Ember app?\n      if (url.substr(0, this.baseUrl.length) !== this.baseUrl) { return; }\n\n      // Is link to media/static/avatar server?\n      if (url.substr(0, staticUrl.length) === staticUrl) { return; }\n\n      if (url.substr(0, mediaUrl.length) === mediaUrl) { return; }\n\n      var avatarsUrl = '/user-avatar/';\n      if (url.substr(0, avatarsUrl.length) === avatarsUrl) { return; }\n\n      return url;\n    };\n\n    var delegateName = 'click.misago-router';\n    this.delegateClicks = function(element) {\n      this.delegateElement = element;\n      $(this.delegateElement).on(delegateName, 'a', function(e) {\n        var cleanUrl = self.cleanUrl(e.target.href);\n        if (cleanUrl) {\n          if (cleanUrl != m.route()) {\n            m.route(cleanUrl);\n          }\n          e.preventDefault();\n        }\n      });\n    };\n\n    this.destroy = function() {\n      $(this.delegateElement).off(delegateName);\n    };\n\n    // Media/Static url\n    var prefixUrl = function(prefix) {\n      return function(url) {\n        return prefix + url;\n      };\n    };\n\n    this.staticUrl = prefixUrl(staticUrl);\n    this.mediaUrl = prefixUrl(mediaUrl);\n\n    // Errors\n    this.error403 = function(error) {\n      var component = null;\n      if (error.ban) {\n        component = _.route('error:banned',\n          error.detail,\n          _.models.deserialize('ban', error.ban));\n      } else {\n        component = _.route('error:403', error.detail);\n      }\n      m.mount(this.fixture, component);\n    };\n\n    this.error404 = function() {\n      m.mount(this.fixture, _.route('error:404'));\n    };\n\n    this.error500 = function() {\n      m.mount(this.fixture, _.route('error:500'));\n    };\n\n    this.error0 = function() {\n      m.mount(this.fixture, _.route('error:0'));\n    };\n\n    this.errorPage = function(error) {\n      if (error.status === 0) {\n        this.error0();\n      }\n\n      if (error.status === 500) {\n        this.error500();\n      }\n\n      if (error.status === 404) {\n        this.error404();\n      }\n\n      if (error.status === 403) {\n        this.error403(error);\n      }\n    };\n  };\n\n  Misago.addService('router', function(_) {\n    return new Router(_);\n  });\n\n  Misago.addService('start-routing', function(_) {\n    _.router.startRouting(\n      Misago.urls, document.getElementById('router-fixture'));\n    _.router.delegateClicks(document.getElementById(_.setup.fixture));\n  },\n  {\n    before: '_end'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var boilerplate = function(component) {\n    /*\n      Boilerplate for Misago top-level components\n    */\n\n    // Component boilerplated (this may happen in tests)\n    if (component._hasRouteBoilerplate) {\n      return component;\n    }\n    component._hasRouteBoilerplate = true;\n\n    // Add lifecycle hooks\n    var loadingView = function () {\n      var _ = this.container;\n      return m('.page.page-loading',\n        _.component('loader')\n      );\n    };\n\n    var errorHandler = function(error) {\n      if (this.isActive) {\n        this.container.router.errorPage(error);\n      }\n    };\n\n    return Misago.stateHooks(component, loadingView, errorHandler);\n  };\n\n  Misago.addService('routes', function(_) {\n    _._routes = {};\n    _.route = function(name, component) {\n      if (this._routes[name]) {\n        if (arguments.length > 1) {\n          var argumentsArray = [this._routes[name]];\n          for (var i = 1; i < arguments.length; i += 1) {\n            argumentsArray.push(arguments[i]);\n          }\n          argumentsArray.push(this);\n          return m.component.apply(undefined, argumentsArray);\n        } else {\n          return m.component(this._routes[name], this);\n        }\n      } else {\n        component.container = _;\n        this._routes[name] = boilerplate(component);\n      }\n    };\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var RunLoop = function(_) {\n    var self = this;\n\n    this._intervals = {};\n\n    var stopInterval = function(name) {\n      if (self._intervals[name]) {\n        window.clearTimeout(self._intervals[name]);\n        self._intervals[name] = null;\n      }\n    };\n\n    this.run = function(callable, name, delay) {\n      this._intervals[name] = window.setTimeout(function() {\n        stopInterval(name);\n        var result = callable(_);\n        if (result !== false) {\n          self.run(callable, name, delay);\n        }\n      }, delay);\n    };\n\n    this.runOnce = function(callable, name, delay) {\n      this._intervals[name] = window.setTimeout(function() {\n        stopInterval(name);\n        callable(_);\n      }, delay);\n    };\n\n    this.stop = function(name) {\n      for (var loop in this._intervals) {\n        if (!name || name === loop) {\n          stopInterval(loop);\n        }\n      }\n    };\n  };\n\n  Misago.addService('runloop', {\n    factory: function(_) {\n      return new RunLoop(_);\n    },\n\n    destroy: function(_) {\n      _.runloop.stop();\n    }\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.addService('start-tick', function(_) {\n    var ticks = m.prop();\n\n    _.runloop.run(function() {\n      m.startComputation();\n      // just tick once a minute so stuff gets rerendered\n      ticks(ticks() + 1);\n      // syncing dynamic timestamps, etc ect\n      m.endComputation();\n    }, 'tick', 60000);\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var PageTitle = function(forum_name) {\n    this.set = function(title) {\n      if (title) {\n        this._set_complex(title);\n      } else {\n        document.title = forum_name;\n      }\n    };\n\n    this._set_complex = function(title) {\n      if (typeof title === 'string') {\n        title = {title: title};\n      }\n\n      var completeTitle = title.title;\n\n      if (typeof title.page !== 'undefined' && title.page > 1) {\n        var page_label = interpolate(\n          gettext('page %(page)s'), { page:title.page }, true);\n        completeTitle += ' (' + page_label + ')';\n      }\n\n      if (typeof title.parent !== 'undefined') {\n        completeTitle += ' | ' + title.parent;\n      }\n\n      document.title = completeTitle + ' | ' + forum_name;\n    };\n  };\n\n  Misago.addService('page-title', function(_) {\n    _.title = new PageTitle(_.settings.forum_name);\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  // Validators namespace\n  Misago.validators = {\n    required: function() {\n      return function(value) {\n        if ($.trim(value).length === 0) {\n          return gettext(\"This field is required.\");\n        }\n      };\n    }\n  };\n\n  var validate = function(ctrl) {\n    var errors = {};\n    var value = null;\n    var validator = null;\n    var result = null;\n\n    for (var key in ctrl.validation) {\n      if (ctrl.validation.hasOwnProperty(key)) {\n        value = ctrl[key]();\n        result = Misago.validators.required()(value);\n        if (result) {\n            errors[key] = [result];\n        } else {\n          for (var i in ctrl.validation[key]) {\n            validator = ctrl.validation[key][i];\n            result = validator(value);\n\n            if (result) {\n              if (!errors[key]) {\n                errors[key] = [];\n              }\n              errors[key].push(result);\n            }\n          }\n        }\n      }\n    }\n\n    if (Object.getOwnPropertyNames(errors).length > 0) {\n      return errors;\n    } else {\n      return null;\n    }\n  };\n\n  Misago.addService('validate', {\n    factory: function() {\n      return validate;\n    }\n  });\n}(Misago.prototype));\n\n/* global zxcvbn */\n(function (Misago) {\n  'use strict';\n\n  var Zxcvbn = function(_) {\n    this.included = false;\n\n    this.scorePassword = function(password, inputs) {\n      // 0-4 score, the more the stronger password\n      return zxcvbn(password, inputs).score;\n    };\n\n    // loading\n    this.include = function() {\n      _.include('misago/js/zxcvbn.js');\n      this.included = true;\n    };\n\n    var wait = function(promise) {\n      if (typeof zxcvbn !== \"undefined\") {\n        promise.resolve();\n      } else {\n        _.runloop.runOnce(function() {\n          wait(promise);\n        }, 'loading-zxcvbn', 150);\n      }\n    };\n\n    var deferred = m.deferred();\n    this.load = function() {\n      if (!this.included) {\n        this.include();\n      }\n      wait(deferred);\n      return deferred.promise;\n    };\n  };\n\n  Misago.addService('zxcvbn', function(_) {\n    return new Zxcvbn(_);\n  },\n  {\n    after: 'include'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var Ban = function(data) {\n    this.message = {\n      html: data.message.html,\n      plain: data.message.plain,\n    };\n\n    this.expires_on = data.expires_on;\n  };\n\n  var deserializeBan = function(data) {\n    data.expires_on = Misago.deserializeDatetime(data.expires_on);\n\n    return data;\n  };\n\n  Misago.addService('model:ban', function(_) {\n    _.models.add('ban', {\n      class: Ban,\n      deserialize: deserializeBan\n    });\n  },\n  {\n    after: 'models'\n  });\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var LegalPage = function(data) {\n    this.title = data.title;\n    this.body = data.body;\n    this.link = data.link;\n  };\n\n  Misago.addService('model:legal-page', function(_) {\n    _.models.add('legal-page', {\n      class: LegalPage\n    });\n  },\n  {\n    after: 'models'\n  });\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var User = function(data) {\n    this.id = data.id;\n\n    this.isAuthenticated = !!this.id;\n    this.isAnonymous = !this.isAuthenticated;\n\n    this.slug = data.slug;\n    this.username = data.username;\n\n    this.acl = data.acl;\n    this.rank = data.rank;\n  };\n\n  var deserializeUser = function(data) {\n    if (data.joined_on) {\n      data.joined_on = Misago.deserializeDatetime(data.joined_on);\n    }\n\n    return data;\n  };\n\n  Misago.addService('model:user', function(_) {\n    _.models.add('user', {\n      class: User,\n      deserialize: deserializeUser\n    });\n  },\n  {\n    after: 'models'\n  });\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var errorPage = function(error) {\n    var error_message = [\n      m('p.lead', error.message)\n    ];\n\n    if (error.help) {\n      error_message.push(m('p.help', error.help));\n    }\n\n    return m('.page.page-error.page-error-' + error.code,\n      m('.container',\n        m('.error-panel', [\n          m('.error-icon',\n            m('span.material-icon', error.icon)\n          ),\n          m('.error-message', error_message)\n        ])\n      )\n    );\n  };\n\n  var errorBanned = {\n    controller: function() {\n      this.container.title.set(gettext('You are banned'));\n    },\n    view: function(ctrl, message, ban) {\n      var error_message = [];\n\n      if (ban.message.html) {\n        error_message.push(m('.lead', m.trust(ban.message.html)));\n      } else if (message) {\n        error_message.push(m('p.lead', message));\n      } else {\n        error_message.push(m('p.lead', gettext('You are banned.')));\n      }\n\n      var expirationMessage = null;\n      if (ban.expires_on) {\n        if (ban.expires_on.isAfter(moment())) {\n          expirationMessage = interpolate(\n            gettext('This ban expires %(expires_on)s.'),\n            { 'expires_on': ban.expires_on.fromNow() },\n            true);\n        } else {\n          expirationMessage = gettext('This ban has expired.');\n        }\n      } else {\n        expirationMessage = gettext('This ban is permanent.');\n      }\n      error_message.push(m('p', expirationMessage));\n\n      return m('.page.page-error.page-error-banned',\n        m('.container',\n          m('.error-panel', [\n            m('.error-icon',\n              m('span.material-icon', 'highlight_off')\n            ),\n            m('.error-message', error_message)\n          ])\n        )\n      );\n    }\n  };\n\n  var error403 = {\n    controller: function() {\n      this.container.title.set(gettext('Page not available'));\n    },\n    view: function(ctrl, message) {\n      if (message === \"Permission denied\") {\n        message = gettext(\"You don't have permission to access this page.\");\n      }\n\n      return errorPage({\n        code: 403,\n        icon: 'remove_circle_outline',\n        message: gettext(\"This page is not available.\"),\n        help: message\n      });\n    }\n  };\n\n  var error404 = {\n    controller: function() {\n      this.container.title.set(gettext('Page not found'));\n    },\n    view: function() {\n      return errorPage({\n        code: 404,\n        icon: 'info_outline',\n        message: gettext(\"Requested page could not be found.\"),\n        help: gettext(\"The link you followed was incorrect or the page has been moved or deleted.\")\n      });\n    }\n  };\n\n  var error500 = {\n    controller: function() {\n      this.container.title.set(gettext('Application error occured'));\n    },\n    view: function() {\n      return errorPage({\n        code: 500,\n        icon: 'error_outline',\n        message: gettext(\"Requested page could not be displayed due to an error.\"),\n        help: gettext(\"Please try again later or contact site staff if error persists.\")\n      });\n    }\n  };\n\n  var error0 = {\n    controller: function() {\n      this.container.title.set(gettext('Lost connection with application'));\n    },\n    view: function() {\n      return errorPage({\n        code: 0,\n        icon: 'sync_problem',\n        message: gettext(\"Could not connect to application.\"),\n        help: gettext(\"This may be caused by problems with your connection or application server. Please check your internet connection and refresh page if problem persists.\")\n      });\n    }\n  };\n\n  Misago.addService('route:error-pages', function(_) {\n    _.route('error:banned', errorBanned);\n    _.route('error:403', error403);\n    _.route('error:404', error404);\n    _.route('error:500', error500);\n    _.route('error:0', error0);\n  },\n  {\n    after: 'routes'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var index = {\n    controller: function() {\n      var _ = this.container;\n      document.title = _.settings.forum_index_title || _.settings.forum_name;\n\n      var count = m.prop(0);\n\n      return {\n        count: count,\n        increment: function() {\n          console.log('increment()');\n          count(count() + 1);\n        }\n      };\n    },\n    view: function(ctrl, _) {\n      var styles = [\n        'default', 'primary', 'success',\n        'info', 'warning', 'danger'\n      ];\n\n      return m('.container', [\n        m('h1', 'Buttons'),\n        m('', styles.map(function(item) {\n          return m('', [\n            _.component('button', {\n              class: '.btn-' + item,\n              label: 'Lorem ipsum'\n            }),\n            _.component('button', {\n              class: '.btn-' + item,\n              label: 'Lorem ipsum',\n              loading: true\n            })\n          ]);\n        }))\n      ]);\n    }\n  };\n\n  Misago.addService('route:index', function(_) {\n    _.route('index', index);\n  },\n  {\n    after: 'routes'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var legalPageFactory = function(typeName, defaultTitle) {\n    var dashedTypeName = typeName.replace(/_/g, '-');\n\n    return {\n      controller: function(_) {\n        if (Misago.get(_.settings, typeName + '_link')) {\n          window.location = Misago.get(_.settings, typeName + '_link');\n        } else {\n          this.vm.init(this, _);\n        }\n      },\n      vm: {\n        page: null,\n        isReady: false,\n        init: function(component, _) {\n          if (this.isReady) {\n            _.title.set(this.title);\n          } else {\n            _.title.set();\n            return _.api.model('legal-page', dashedTypeName);\n          }\n        },\n        ondata: function(page, component, _) {\n          m.startComputation();\n\n          if (page.link) {\n            window.location = page.link;\n          } else {\n            page.title = page.title || defaultTitle;\n            this.page = page;\n            this.isReady = true;\n\n            m.endComputation();\n\n            if (component.isActive) {\n              _.title.set(this.page.title);\n            }\n          }\n        }\n      },\n      view: function(ctrl, _) {\n        return m('.page.page-legal.page-legal-' + dashedTypeName, [\n          _.component('header', {title: this.vm.page.title}),\n          m('.container',\n            _.component('markup', this.vm.page.body)\n          )\n        ]);\n      }\n    };\n  };\n\n  Misago.addService('route:legal-pages', function(_) {\n    _.route('terms-of-service', legalPageFactory(\n      'terms_of_service', gettext('Terms of service')));\n    _.route('privacy-policy', legalPageFactory(\n      'privacy_policy', gettext('Privacy policy')));\n  },\n  {\n    after: 'routes'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var isMenuVisible = function(settings) {\n    return [\n      !!settings.forum_footnote,\n      !!settings.terms_of_service,\n      !!settings.terms_of_service_link,\n      !!settings.privacy_policy,\n      !!settings.privacy_policy_link\n    ].indexOf(true) !== -1;\n  };\n\n  var footer = {\n    view: function(ctrl, _) {\n      var nav = null;\n      if (isMenuVisible(_.settings)) {\n        nav = _.component('footer:menu');\n      }\n\n      return m('footer.forum-footer', [\n        m('.container',\n          m('.footer-content', [\n            nav,\n            _.component('footer:branding')\n          ])\n        )\n      ]);\n    }\n  };\n\n  Misago.addService('component:footer', function(_) {\n    _.component('footer', footer);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var legalLink = function(_, legalType, defaultTitle) {\n    var url = Misago.get(_.settings, legalType + '_link');\n    if (!url && Misago.get(_.settings, legalType)) {\n      url = _.router.url(legalType);\n    }\n\n    if (url) {\n      return m('li',\n        m('a', {href: url},\n          Misago.get(_.settings, legalType + '_title', defaultTitle)\n        )\n      );\n    } else {\n      return null;\n    }\n  };\n\n  var menu = {\n    isVisible: function(settings) {\n      return [\n        !!settings.forum_footnote,\n        !!settings.terms_of_service,\n        !!settings.terms_of_service_link,\n        !!settings.privacy_policy,\n        !!settings.privacy_policy_link\n      ].indexOf(true) !== -1;\n    },\n    view: function(ctrl, _) {\n      var items = [];\n\n      if (_.settings.forum_footnote) {\n        items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));\n      }\n\n      items.push(\n        legalLink(_, 'terms_of_service', gettext('Terms of service')));\n      items.push(\n        legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n      return m('ul.list-inline.footer-nav', items);\n    }\n  };\n\n  Misago.addService('component:footer:menu', function(_) {\n    _.component('footer:menu', menu);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var branding = {\n    view: function() {\n      return m('a.misago-branding[href=http://misago-project.org]', [\n        \"powered by \", m('strong', \"misago\")\n      ]);\n    }\n  };\n\n  Misago.addService('component:footer:branding', function(_) {\n    _.component('footer:branding', branding);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var header = {\n    view: function(ctrl, title) {\n      return m('.modal-header', [\n        m('button.close[type=\"button\"]',\n          {'data-dismiss': 'modal', 'aria-label': gettext('Close')},\n          m('span', {'aria-hidden': 'true'}, m.trust('&times;'))\n        ),\n        m('h4#misago-modal-label.modal-title', title)\n      ]);\n    }\n  };\n\n  Misago.addService('component:modal:header', function(_) {\n    _.component('modal:header', header);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  function persistent(el, isInit, context) {\n    context.retain = true;\n  }\n\n  var register = {\n    view: function() {\n      return m('.modal-dialog.modal-register[role=\"document\"]',\n        {config: persistent},\n        m('.modal-content', [\n          m('.modal-header',\n            m('h4#misago-modal-label.modal-title', 'Register in modal!')\n          ),\n          m('.modal-body', [\n            m('p', 'Lorem ipsum dolor met sit amet elit.'),\n            m('p', [\n              'Si vis pacem ',\n              m('a', {href: '/'}, 'bellum'),\n              ' sequitat.'\n            ])\n          ])\n        ])\n      );\n    }\n  };\n\n  Misago.addService('modal:register', function(_) {\n    _.modal('register', register);\n  },\n  {\n    after: 'modals'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  function persistent(el, isInit, context) {\n    context.retain = true;\n  }\n\n  var signin = {\n    controller: function() {\n      return {\n        busy: m.prop(false),\n        showActivation: m.prop(false),\n\n        username: m.prop(''),\n        password: m.prop(''),\n\n        validation: {\n          'username': [],\n          'password': []\n        }\n      };\n    },\n    submit: function(ctrl, _) {\n      if (ctrl.busy()) {\n        return false;\n      }\n\n      if (_.validate(ctrl)) {\n        _.alert.error(gettext(\"Fill out both fields.\"));\n        return false;\n      }\n\n      m.startComputation();\n      ctrl.busy(true);\n      m.endComputation();\n\n      var credentials = {\n        username: ctrl.username(),\n        password: ctrl.password()\n      };\n\n      var self = this;\n\n      _.api.endpoint('auth').post(credentials).then(\n      function() {\n        self.success(credentials, _);\n      },\n      function(error) {\n        self.error(ctrl, error, _);\n      });\n\n      return false;\n    },\n    success: function(credentials, _) {\n      var $form = $('#hidden-login-form');\n\n      // refresh CSRF token because api call to /auth/ changed it\n      _.ajax.refreshCsrfToken();\n\n      // fill out form with user credentials and submit it, this will tell\n      // misago to redirect user back to right page, and will trigger browser's\n      // key ring feature\n      $form.find('input[type=\"hidden\"]').val(_.ajax.csrfToken);\n      $form.find('input[name=\"redirect_to\"]').val(m.route());\n      $form.find('input[name=\"username\"]').val(credentials.username);\n      $form.find('input[name=\"password\"]').val(credentials.password);\n      $form.submit();\n    },\n    error: function(ctrl, rejection, _) {\n      // activate form again\n      m.startComputation();\n      ctrl.busy(false);\n      m.endComputation();\n\n      // handle returned error\n      if (rejection.status === 400) {\n        if (rejection.code === 'inactive_admin') {\n          _.alert.info(rejection.detail);\n        } else if (rejection.code === 'inactive_user') {\n          _.alert.info(rejection.detail);\n          ctrl.showActivation(true);\n        } else if (rejection.code === 'banned') {\n          _.modal();\n          _.router.error403({\n            message: '',\n            ban: rejection.detail\n          });\n        } else {\n          _.alert.error(rejection.detail);\n        }\n      } else {\n        _.api.alert(rejection);\n      }\n    },\n    view: function(ctrl, _) {\n      return m('.modal-dialog.modal-sm.modal-signin[role=\"document\"]',\n        {config: persistent},\n        m('.modal-content', [\n          _.component('modal:header', gettext('Sign in')),\n          m('form', {onsubmit: this.submit.bind(this, ctrl, _)}, [\n            m('.modal-body', [\n              m('.form-group',\n                m('.control-input',\n                  Misago.input({\n                    disabled: ctrl.busy(),\n                    value: ctrl.username,\n                    placeholder: gettext(\"Username or e-mail\")\n                  })\n                )\n              ),\n              m('.form-group',\n                m('.control-input',\n                  Misago.input({\n                    type: 'password',\n                    disabled: ctrl.busy(),\n                    value: ctrl.password,\n                    placeholder: gettext(\"Password\")\n                  })\n                )\n              )\n            ]),\n            m('.modal-footer',\n              _.component('button', {\n                class: '.btn-primary.btn-block',\n                submit: true,\n                loading: ctrl.busy(),\n                label: gettext('Sign in')\n              })\n            )\n          ])\n        ])\n      );\n    }\n  };\n\n  Misago.addService('modal:sign-in', function(_) {\n    _.modal('sign-in', signin);\n  },\n  {\n    after: 'modals'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var navbar = {\n    view: function(ctrl, _) {\n      var style = '.navbar.navbar-default.navbar-static-top';\n      return m('nav' + style + '[role=\"navigation\"]', [\n        _.component('navbar:desktop')\n      ]);\n    }\n  };\n\n  Misago.addService('component:navbar', function(_) {\n    _.component('navbar', navbar);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var brand = {\n    view: function(ctrl, branding, _) {\n      var children = [\n        m('img', {\n          src: _.router.staticUrl('misago/img/site-logo.png'),\n          alt: _.settings.forum_name\n        })\n      ];\n\n      if (branding) {\n        children.push(branding);\n      }\n\n      return m('a.navbar-brand', {href: _.router.url('index')}, children);\n    }\n  };\n\n  Misago.addService('component:navbar:desktop:brand', function(_) {\n    _.component('navbar:desktop:brand', brand);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var menu = {\n    controller: function(_) {\n      return {\n        showSignIn: function() {\n          _.modal('sign-in');\n        },\n\n        isBusy: false,\n        showRegister: function() {\n          if (_.settings.account_activation === 'closed') {\n            _.alert.info(gettext(\"New registrations are currently disabled.\"));\n          } else {\n            m.startComputation();\n            this.isBusy = true;\n            m.endComputation();\n\n            var self = this;\n            m.sync([\n              _.zxcvbn.load(),\n              _.captcha.load()\n            ]).then(function() {\n              _.alert.success('loaded shizz for registration!');\n            }, function() {\n              _.alert.error(gettext('Registation is not available now due to an error.'));\n            }).then(function() {\n              m.startComputation();\n              self.isBusy = false;\n              m.endComputation();\n            });\n          }\n        }\n      };\n    },\n    view: function(ctrl, _) {\n      return m('div.nav.nav-guest', [\n        _.component('button', {\n          class: '.navbar-btn.btn-default',\n          onclick: ctrl.showSignIn,\n          disabled: ctrl.isBusy,\n          label: gettext('Sign in')\n        }),\n        _.component('button', {\n          class: '.navbar-btn.btn-primary',\n          onclick: ctrl.showRegister.bind(ctrl),\n          loading: ctrl.isBusy,\n          label: gettext('Register')\n        })\n      ]);\n    }\n  };\n\n  Misago.addService('component:navbar:desktop:guest-menu', function(_) {\n    _.component('navbar:desktop:guest-menu', menu);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var navbar = {\n    view: function(ctrl, _) {\n      var menu = [];\n\n      if (_.settings.forum_branding_display) {\n        menu.push(\n          _.component('navbar:desktop:brand', _.settings.forum_branding_text));\n      }\n\n      menu.push(m('ul.nav.navbar-nav', [\n        m('li',\n          m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')\n        )\n      ]));\n\n      if (_.user.isAuthenticated) {\n        menu.push(_.component('navbar:desktop:user-menu'));\n      } else {\n        menu.push(_.component('navbar:desktop:guest-menu'));\n      }\n\n      return m('.container.navbar-full.hidden-xs.hidden-sm', menu);\n    }\n  };\n\n  Misago.addService('component:navbar:desktop', function(_) {\n    _.component('navbar:desktop', navbar);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var menu = {\n    controller: function() {\n      return {\n        logout: function() {\n          $('#hidden-logout-form').submit();\n        }\n      };\n    },\n    view: function(ctrl, _) {\n      return m('div.nav.nav-user', [\n        m('p.navbar-text',\n          _.user.username\n        ),\n        m('button.navbar-btn.btn.btn-default.navbar-right',\n          {\n            onclick: ctrl.logout.bind(ctrl)\n          },\n          gettext(\"Logout\")\n        )\n      ]);\n    }\n  };\n\n  Misago.addService('component:navbar:desktop:user-menu', function(_) {\n    _.component('navbar:desktop:user-menu', menu);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  function persistent(el, isInit, context) {\n    context.retain = true;\n  }\n\n  var alert = {\n    classes: {\n      'info': 'alert-info',\n      'success': 'alert-success',\n      'warning': 'alert-warning',\n      'error': 'alert-danger'\n    },\n    view: function(ctrl, _) {\n      return m(\n        '.alerts',\n        {\n          config: persistent,\n          class: _.alert.isVisible ? 'in' : 'out'\n        },\n        m('p.alert',\n          {\n            class: this.classes[_.alert.type]\n          },\n          _.alert.message\n        )\n      );\n    }\n  };\n\n  Misago.addService('component:alert', function(_) {\n    _.component('alert', alert);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var button = {\n    view: function(ctrl, kwargs) {\n      var options = {\n        disabled: kwargs.disabled || kwargs.loading || false,\n        config: kwargs.config || null,\n        loading: kwargs.loading || false,\n        type: kwargs.submit ? 'submit' : 'button',\n        onclick: kwargs.onclick || null\n      };\n\n      var element = 'button[type=\"' + options.type + '\"].btn';\n      if (options.loading) {\n        element += '.btn-loading';\n      }\n\n      if (kwargs.id) {\n        element += '#' + kwargs.id;\n      }\n\n      element += (kwargs.class || '');\n\n      var label = kwargs.label;\n      if (options.loading) {\n        label = [\n          label,\n          m('.loader-compact', [\n            m('.bounce1'),\n            m('.bounce2'),\n            m('.bounce3')\n          ])\n        ];\n      }\n\n      return m(element, options, label);\n    },\n  };\n\n  Misago.addService('component:button', function(_) {\n    _.component('button', button);\n  },\n  {\n    after: 'components'\n  });\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var persistent = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  var forumLayout = {\n    view: function(ctrl, _) {\n      return [\n        _.component('alert'),\n        _.component('navbar'),\n        m('#router-fixture', {config: persistent}),\n        _.component('footer'),\n        _.component('modal')\n      ];\n    }\n  };\n\n  Misago.addService('component:layout', function(_) {\n    _.component('forum-layout', forumLayout);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var loader = {\n    view: function() {\n      return m('.loader.sk-folding-cube', [\n        m('.sk-cube1.sk-cube'),\n        m('.sk-cube2.sk-cube'),\n        m('.sk-cube4.sk-cube'),\n        m('.sk-cube3.sk-cube')\n      ]);\n    }\n  };\n\n  Misago.addService('component:loader', function(_) {\n    _.component('loader', loader);\n  },\n  {\n    after: 'components'\n  });\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var persistent = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  var markup = {\n    view: function(ctrl, content) {\n      return m('article.misago-markup', {config: persistent},\n        m.trust(content)\n      );\n    }\n  };\n\n  Misago.addService('component:markup', function(_) {\n    _.component('markup', markup);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  function persistent(el, isInit, context) {\n    context.retain = true;\n  }\n\n  var modal = {\n    view: function() {\n      return m(\n        '#misago-modal.modal.fade[role=\"dialog\"]',\n        {\n          config: persistent,\n          tabindex: \"-1\",\n          \"aria-labelledby\": \"misago-modal-label\"\n        }\n      );\n    }\n  };\n\n  Misago.addService('component:modal', function(_) {\n    _.component('modal', modal);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var header = {\n    view: function(ctrl, options) {\n      return m('.page-header',\n        m('.container', [\n          m('h1', options.title),\n        ])\n      );\n    }\n  };\n\n  Misago.addService('component:header', function(_) {\n    _.component('header', header);\n  },\n  {\n    after: 'components'\n  });\n}(Misago.prototype));\n\n(function (Misago, UrlConf) {\n  'use strict';\n\n  var urls = new UrlConf();\n  urls.url('/', 'index');\n\n  // Legal pages\n  urls.url(\n    '/terms-of-service/',\n    'terms_of_service');\n\n  urls.url(\n    '/privacy-policy/',\n    'privacy_policy');\n\n  // Catch-all 404 not found route\n  urls.url('/:rest...', 'error:404', 'not_found');\n\n  Misago.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}

+ 3 - 9
misago/users/api/captcha.py

@@ -6,16 +6,10 @@ from rest_framework.response import Response
 from misago.conf import settings
 
 
-@api_view(['GET', 'POST'])
-def question(request, question_id):
-    try:
-        question_id = int(question_id)
-    except TypeError:
-        raise Http404()
-
-    if settings.qa_question and question_id == 1:
+@api_view()
+def question(request):
+    if settings.qa_question:
         return Response({
-            'id': question_id,
             'question': settings.qa_question,
             'help_text': settings.qa_help_text,
         })

+ 3 - 12
misago/users/tests/test_captcha_api.py

@@ -7,8 +7,7 @@ from misago.conf import settings
 
 class AuthenticateAPITests(TestCase):
     def setUp(self):
-        self.api_link = reverse('misago:api:captcha_question',
-                                kwargs={'question_id': 1})
+        self.api_link = reverse('misago:api:captcha_question')
 
     def tearDown(self):
         settings.reset_settings()
@@ -20,15 +19,8 @@ class AuthenticateAPITests(TestCase):
         response = self.client.get(self.api_link)
         self.assertEqual(response.status_code, 404)
 
-    def test_api_invalid_qa_id(self):
-        """qa api returns QA question only for ID #1"""
-        settings.override_setting('qa_question', 'Do you like pies?')
-
-        response = self.client.get(self.api_link.replace('1', '24'))
-        self.assertEqual(response.status_code, 404)
-
-    def test_api_get_question_id(self):
-        """qa api returns valid QA question for ID #1"""
+    def test_api_get_question(self):
+        """qa api returns valid QA question"""
         settings.override_setting('qa_question', 'Do you like pies?')
         settings.override_setting('qa_help_text', 'Type in "yes".')
 
@@ -36,6 +28,5 @@ class AuthenticateAPITests(TestCase):
         self.assertEqual(response.status_code, 200)
 
         response_json = json.loads(response.content)
-        self.assertEqual(response_json['id'], 1)
         self.assertEqual(response_json['question'], 'Do you like pies?')
         self.assertEqual(response_json['help_text'], 'Type in "yes".')

+ 1 - 1
misago/users/urls/api.py

@@ -14,7 +14,7 @@ urlpatterns = patterns('misago.users.api.auth',
 )
 
 urlpatterns += patterns('misago.users.api.captcha',
-    url(r'^captcha-questions/(?P<question_id>\d+)/$', 'question', name='captcha_question'),
+    url(r'^captcha-question/$', 'question', name='captcha_question'),
 )
 
 router = MisagoApiRouter()