Browse Source

autoregister services

Rafał Pitoń 9 years ago
parent
commit
c14840acee

+ 2 - 1
misago/frontend/gulpfile.js

@@ -40,12 +40,13 @@ gulp.task('misagojs', ['lint'], function() {
   return gulp.src([
   return gulp.src([
       'misago/app.js',
       'misago/app.js',
 
 
+      'misago/utils/**/*.js',
+
       'misago/services/*.js',
       'misago/services/*.js',
       'misago/models/**/*.js',
       'misago/models/**/*.js',
       'misago/routes/**/*.js',
       'misago/routes/**/*.js',
       'misago/components/**/*.js',
       'misago/components/**/*.js',
       'misago/templates/**/*.js',
       'misago/templates/**/*.js',
-      'misago/utils/**/*.js',
 
 
       'misago/urls.js',
       'misago/urls.js',
     ])
     ])

+ 17 - 29
misago/frontend/misago/app.js

@@ -4,7 +4,6 @@
   'use strict';
   'use strict';
 
 
   window.Misago = function() {
   window.Misago = function() {
-
     var ns = Object.getPrototypeOf(this);
     var ns = Object.getPrototypeOf(this);
     var self = this;
     var self = this;
 
 
@@ -14,17 +13,6 @@
       SETTINGS: {}
       SETTINGS: {}
     };
     };
 
 
-    // Services
-    this._services = [];
-    this.addService = function(name, factory, order) {
-      this._services.push({
-        name: name,
-        item: factory,
-        after: this.get(order, 'after'),
-        before: this.get(order, 'before')
-      });
-    };
-
     this._initServices = function(services) {
     this._initServices = function(services) {
       var orderedServices = new ns.OrderedList(services).order(false);
       var orderedServices = new ns.OrderedList(services).order(false);
       orderedServices.forEach(function (item) {
       orderedServices.forEach(function (item) {
@@ -37,7 +25,7 @@
 
 
         var serviceInstance = factory(self);
         var serviceInstance = factory(self);
         if (serviceInstance) {
         if (serviceInstance) {
-          self[item.name] = serviceInstance;
+          self[item.key] = serviceInstance;
         }
         }
       });
       });
     };
     };
@@ -52,20 +40,6 @@
       });
       });
     };
     };
 
 
-    this.registerCoreServices = function() {
-      this.addService('conf', ns.Conf);
-      this.addService('moment-locale', ns.setMomentLocale);
-      this.addService('component', ns.ComponentFactory);
-      this.addService('router', ns.RouterFactory);
-      this.addService('ajax', ns.AjaxFactory);
-      this.addService('api', ns.ApiFactory);
-      this.addService('runloop', ns.RunLoopFactory);
-      this.addService('tick', ns.startTick);
-      this.addService('outlet', ns.OutletFactory);
-      this.addService('title', ns.PageTitle);
-      this.addService('start-routing', ns.startRouting);
-    };
-
     // App init/destory
     // App init/destory
     this.setup = false;
     this.setup = false;
     this.init = function(setup) {
     this.init = function(setup) {
@@ -74,11 +48,25 @@
         inTest: ns.get(setup, 'inTest', false)
         inTest: ns.get(setup, 'inTest', false)
       };
       };
 
 
-      this._initServices(this._services);
+      this._initServices(ns._services);
     };
     };
 
 
     this.destroy = function() {
     this.destroy = function() {
-      this._destroyServices();
+      this._destroyServices(ns._services);
     };
     };
   };
   };
+
+
+  // Services
+  var proto = window.Misago.prototype
+  proto._services = [];
+
+  proto.addService = function(name, factory, order) {
+    Misago.prototype._services.push({
+      key: name,
+      item: factory,
+      after: proto.get(order, 'after'),
+      before: proto.get(order, 'before')
+    });
+  };
 }());
 }());

+ 1 - 2
misago/frontend/misago/components/navbar/forum-navbar.js

@@ -10,8 +10,7 @@
       }
       }
 
 
       desktopNavbar.push(m('ul.nav.navbar-nav', [
       desktopNavbar.push(m('ul.nav.navbar-nav', [
-        m('li', m("a", {config: m.route, href: _.router.url('index')}, 'Index')),
-        m('li', m("a", {config: m.route, href: _.router.url('test')}, 'Test'))
+        m('li', m("a", {config: m.route, href: _.router.url('index')}, 'Index'))
       ]));
       ]));
 
 
       return m('nav.navbar.navbar-default.navbar-static-top[role="navigation"]', [
       return m('nav.navbar.navbar-default.navbar-static-top[role="navigation"]', [

+ 2 - 2
misago/frontend/misago/services/ajax.js

@@ -71,7 +71,7 @@
     };
     };
   };
   };
 
 
-  Misago.AjaxFactory = function(_) {
+  Misago.addService('ajax', function(_) {
     return new Ajax(_);
     return new Ajax(_);
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));

+ 2 - 2
misago/frontend/misago/services/api.js

@@ -22,7 +22,7 @@
     };
     };
   };
   };
 
 
-  Misago.ApiFactory = function(_) {
+  Misago.addService('api', function(_) {
     return new Api(_);
     return new Api(_);
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));

+ 2 - 2
misago/frontend/misago/services/component-factory.js

@@ -1,7 +1,7 @@
 (function (Misago) {
 (function (Misago) {
   'use strict';
   'use strict';
 
 
-  Misago.ComponentFactory = function(_) {
+  Misago.addService('components-factory', function(_) {
     // Component factory
     // Component factory
     _.component = function() {
     _.component = function() {
       var argumentsArray = [];
       var argumentsArray = [];
@@ -12,5 +12,5 @@
       argumentsArray.push(_);
       argumentsArray.push(_);
       return m.component.apply(undefined, argumentsArray);
       return m.component.apply(undefined, argumentsArray);
     };
     };
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));

+ 2 - 2
misago/frontend/misago/services/conf.js

@@ -1,7 +1,7 @@
 (function (Misago) {
 (function (Misago) {
   'use strict';
   'use strict';
 
 
-  Misago.Conf = function(_) {
+  Misago.addService('conf', function(_) {
     _.settings = Misago.get(_.context, 'SETTINGS', {});
     _.settings = Misago.get(_.context, 'SETTINGS', {});
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));

+ 2 - 2
misago/frontend/misago/services/moment-locale.js

@@ -1,7 +1,7 @@
 (function (Misago) {
 (function (Misago) {
   'use strict';
   'use strict';
 
 
-  Misago.setMomentLocale = function() {
+  Misago.addService('set-momentjs-locale', function() {
     moment.locale($('html').attr('lang'));
     moment.locale($('html').attr('lang'));
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));

+ 0 - 18
misago/frontend/misago/services/outlet.js

@@ -1,18 +0,0 @@
-(function (Misago) {
-  'use strict';
-
-  Misago.OutletFactory = {
-    factory: function(_) {
-      if (_.setup.fixture) {
-        m.mount(document.getElementById(_.setup.fixture),
-                _.component(Misago.ForumLayout));
-      }
-    },
-
-    destroy: function(_) {
-      if (_.setup.fixture) {
-        m.mount(_.setup.fixture, null);
-      }
-    }
-  };
-}(Misago.prototype));

+ 4 - 4
misago/frontend/misago/services/router.js

@@ -159,12 +159,12 @@
     };
     };
   };
   };
 
 
-  Misago.RouterFactory = function(_) {
+  Misago.addService('router', function(_) {
     return new Router(_);
     return new Router(_);
-  };
+  });
 
 
-  Misago.startRouting = function(_) {
+  Misago.addService('start-routing', function(_) {
     _.router.startRouting(Misago.urls, document.getElementById('router-fixture'));
     _.router.startRouting(Misago.urls, document.getElementById('router-fixture'));
     _.router.delegateClicks(document.getElementById(_.setup.fixture));
     _.router.delegateClicks(document.getElementById(_.setup.fixture));
-  };
+  }, {before: '_end'});
 }(Misago.prototype));
 }(Misago.prototype));

+ 2 - 2
misago/frontend/misago/services/runloop.js

@@ -31,7 +31,7 @@
     };
     };
   };
   };
 
 
-  Misago.RunLoopFactory = {
+  Misago.addService('runloop', {
     factory: function(_) {
     factory: function(_) {
       return new RunLoop(_);
       return new RunLoop(_);
     },
     },
@@ -39,5 +39,5 @@
     destroy: function(_) {
     destroy: function(_) {
       _.runloop.stop();
       _.runloop.stop();
     }
     }
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));

+ 2 - 2
misago/frontend/misago/services/tick.js

@@ -1,12 +1,12 @@
 (function (Misago) {
 (function (Misago) {
   'use strict';
   'use strict';
 
 
-  Misago.startTick = function(_) {
+  Misago.addService('start-tick', function(_) {
     _.runloop.run(function() {
     _.runloop.run(function() {
       m.startComputation();
       m.startComputation();
       // just tick once a minute so stuff gets rerendered
       // just tick once a minute so stuff gets rerendered
       // syncing dynamic timestamps, etc ect
       // syncing dynamic timestamps, etc ect
       m.endComputation();
       m.endComputation();
     }, 'tick', 60000);
     }, 'tick', 60000);
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));

+ 2 - 2
misago/frontend/misago/services/title.js

@@ -1,7 +1,7 @@
 (function (Misago) {
 (function (Misago) {
   'use strict';
   'use strict';
 
 
-  Misago.PageTitle = function(_) {
+  Misago.addService('page-title', function(_) {
     _._setTitle = function(title) {
     _._setTitle = function(title) {
       if (typeof title === 'string') {
       if (typeof title === 'string') {
         title = {title: title};
         title = {title: title};
@@ -27,5 +27,5 @@
         document.title = this.settings.forum_name;
         document.title = this.settings.forum_name;
       }
       }
     };
     };
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));

+ 10 - 1
misago/frontend/misago/utils/ordered-list.js

@@ -69,7 +69,16 @@
         }
         }
       });
       });
 
 
-      // Second pass: keep iterating items
+      // Second pass: register items that
+      // specify their before to "_end"
+      unordered.forEach(function (item) {
+        if (item.before === "_end") {
+          ordered.push(item);
+          ordering.push(item.key);
+        }
+      });
+
+      // Third pass: keep iterating items
       // until we hit iterations limit or finish
       // until we hit iterations limit or finish
       // ordering list
       // ordering list
       function insertItem(item) {
       function insertItem(item) {

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

@@ -1,3844 +1 @@
-/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
-html {
-  font-family: sans-serif;
-  -ms-text-size-adjust: 100%;
-  -webkit-text-size-adjust: 100%;
-}
-body {
-  margin: 0;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-menu,
-nav,
-section,
-summary {
-  display: block;
-}
-audio,
-canvas,
-progress,
-video {
-  display: inline-block;
-  vertical-align: baseline;
-}
-audio:not([controls]) {
-  display: none;
-  height: 0;
-}
-[hidden],
-template {
-  display: none;
-}
-a {
-  background-color: transparent;
-}
-a:active,
-a:hover {
-  outline: 0;
-}
-abbr[title] {
-  border-bottom: 1px dotted;
-}
-b,
-strong {
-  font-weight: bold;
-}
-dfn {
-  font-style: italic;
-}
-h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-mark {
-  background: #ff0;
-  color: #000;
-}
-small {
-  font-size: 80%;
-}
-sub,
-sup {
-  font-size: 75%;
-  line-height: 0;
-  position: relative;
-  vertical-align: baseline;
-}
-sup {
-  top: -0.5em;
-}
-sub {
-  bottom: -0.25em;
-}
-img {
-  border: 0;
-}
-svg:not(:root) {
-  overflow: hidden;
-}
-figure {
-  margin: 1em 40px;
-}
-hr {
-  box-sizing: content-box;
-  height: 0;
-}
-pre {
-  overflow: auto;
-}
-code,
-kbd,
-pre,
-samp {
-  font-family: monospace, monospace;
-  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 {
-  line-height: normal;
-}
-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-appearance: textfield;
-  box-sizing: content-box;
-}
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none;
-}
-fieldset {
-  border: 1px solid #c0c0c0;
-  margin: 0 2px;
-  padding: 0.35em 0.625em 0.75em;
-}
-legend {
-  border: 0;
-  padding: 0;
-}
-textarea {
-  overflow: auto;
-}
-optgroup {
-  font-weight: bold;
-}
-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 {
-  *,
-  *:before,
-  *:after {
-    background: transparent !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^="#"]:after,
-  a[href^="javascript:"]:after {
-    content: "";
-  }
-  pre,
-  blockquote {
-    border: 1px solid #999;
-    page-break-inside: avoid;
-  }
-  thead {
-    display: table-header-group;
-  }
-  tr,
-  img {
-    page-break-inside: avoid;
-  }
-  img {
-    max-width: 100% !important;
-  }
-  p,
-  h2,
-  h3 {
-    orphans: 3;
-    widows: 3;
-  }
-  h2,
-  h3 {
-    page-break-after: avoid;
-  }
-  .navbar {
-    display: none;
-  }
-  .btn > .caret,
-  .dropup > .btn > .caret {
-    border-top-color: #000 !important;
-  }
-  .label {
-    border: 1px solid #000;
-  }
-  .table {
-    border-collapse: collapse !important;
-  }
-  .table td,
-  .table th {
-    background-color: #fff !important;
-  }
-  .table-bordered th,
-  .table-bordered td {
-    border: 1px solid #ddd !important;
-  }
-}
-* {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-*:before,
-*:after {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-html {
-  font-size: 10px;
-  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-body {
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 14px;
-  line-height: 1.42857143;
-  color: #333333;
-  background-color: #ffffff;
-}
-input,
-button,
-select,
-textarea {
-  font-family: inherit;
-  font-size: inherit;
-  line-height: inherit;
-}
-a {
-  color: #337ab7;
-  text-decoration: none;
-}
-a:hover,
-a:focus {
-  color: #23527c;
-  text-decoration: underline;
-}
-a:focus {
-  outline: thin dotted;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-figure {
-  margin: 0;
-}
-img {
-  vertical-align: middle;
-}
-.img-responsive {
-  display: block;
-  max-width: 100%;
-  height: auto;
-}
-.img-rounded {
-  border-radius: 6px;
-}
-.img-thumbnail {
-  padding: 4px;
-  line-height: 1.42857143;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  border-radius: 4px;
-  -webkit-transition: all 0.2s ease-in-out;
-  -o-transition: all 0.2s ease-in-out;
-  transition: all 0.2s ease-in-out;
-  display: inline-block;
-  max-width: 100%;
-  height: auto;
-}
-.img-circle {
-  border-radius: 50%;
-}
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eeeeee;
-}
-.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,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small,
-.h1 small,
-.h2 small,
-.h3 small,
-.h4 small,
-.h5 small,
-.h6 small,
-h1 .small,
-h2 .small,
-h3 .small,
-h4 .small,
-h5 .small,
-h6 .small,
-.h1 .small,
-.h2 .small,
-.h3 .small,
-.h4 .small,
-.h5 .small,
-.h6 .small {
-  font-weight: normal;
-  line-height: 1;
-  color: #777777;
-}
-h1,
-.h1,
-h2,
-.h2,
-h3,
-.h3 {
-  margin-top: 20px;
-  margin-bottom: 10px;
-}
-h1 small,
-.h1 small,
-h2 small,
-.h2 small,
-h3 small,
-.h3 small,
-h1 .small,
-.h1 .small,
-h2 .small,
-.h2 .small,
-h3 .small,
-.h3 .small {
-  font-size: 65%;
-}
-h4,
-.h4,
-h5,
-.h5,
-h6,
-.h6 {
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-h4 small,
-.h4 small,
-h5 small,
-.h5 small,
-h6 small,
-.h6 small,
-h4 .small,
-.h4 .small,
-h5 .small,
-.h5 .small,
-h6 .small,
-.h6 .small {
-  font-size: 75%;
-}
-h1,
-.h1 {
-  font-size: 36px;
-}
-h2,
-.h2 {
-  font-size: 30px;
-}
-h3,
-.h3 {
-  font-size: 24px;
-}
-h4,
-.h4 {
-  font-size: 18px;
-}
-h5,
-.h5 {
-  font-size: 14px;
-}
-h6,
-.h6 {
-  font-size: 12px;
-}
-p {
-  margin: 0 0 10px;
-}
-.lead {
-  margin-bottom: 20px;
-  font-size: 16px;
-  font-weight: 300;
-  line-height: 1.4;
-}
-@media (min-width: 768px) {
-  .lead {
-    font-size: 21px;
-  }
-}
-small,
-.small {
-  font-size: 85%;
-}
-mark,
-.mark {
-  background-color: #fcf8e3;
-  padding: .2em;
-}
-.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: #777777;
-}
-.text-primary {
-  color: #337ab7;
-}
-a.text-primary:hover,
-a.text-primary:focus {
-  color: #286090;
-}
-.text-success {
-  color: #3c763d;
-}
-a.text-success:hover,
-a.text-success:focus {
-  color: #2b542c;
-}
-.text-info {
-  color: #31708f;
-}
-a.text-info:hover,
-a.text-info:focus {
-  color: #245269;
-}
-.text-warning {
-  color: #8a6d3b;
-}
-a.text-warning:hover,
-a.text-warning:focus {
-  color: #66512c;
-}
-.text-danger {
-  color: #a94442;
-}
-a.text-danger:hover,
-a.text-danger:focus {
-  color: #843534;
-}
-.bg-primary {
-  color: #fff;
-  background-color: #337ab7;
-}
-a.bg-primary:hover,
-a.bg-primary:focus {
-  background-color: #286090;
-}
-.bg-success {
-  background-color: #dff0d8;
-}
-a.bg-success:hover,
-a.bg-success:focus {
-  background-color: #c1e2b3;
-}
-.bg-info {
-  background-color: #d9edf7;
-}
-a.bg-info:hover,
-a.bg-info:focus {
-  background-color: #afd9ee;
-}
-.bg-warning {
-  background-color: #fcf8e3;
-}
-a.bg-warning:hover,
-a.bg-warning:focus {
-  background-color: #f7ecb5;
-}
-.bg-danger {
-  background-color: #f2dede;
-}
-a.bg-danger:hover,
-a.bg-danger:focus {
-  background-color: #e4b9b9;
-}
-.page-header {
-  padding-bottom: 9px;
-  margin: 40px 0 20px;
-  border-bottom: 1px solid #eeeeee;
-}
-ul,
-ol {
-  margin-top: 0;
-  margin-bottom: 10px;
-}
-ul ul,
-ol ul,
-ul ol,
-ol ol {
-  margin-bottom: 0;
-}
-.list-unstyled {
-  padding-left: 0;
-  list-style: none;
-}
-.list-inline {
-  padding-left: 0;
-  list-style: none;
-  margin-left: -5px;
-}
-.list-inline > li {
-  display: inline-block;
-  padding-left: 5px;
-  padding-right: 5px;
-}
-dl {
-  margin-top: 0;
-  margin-bottom: 20px;
-}
-dt,
-dd {
-  line-height: 1.42857143;
-}
-dt {
-  font-weight: bold;
-}
-dd {
-  margin-left: 0;
-}
-@media (min-width: 768px) {
-  .dl-horizontal dt {
-    float: left;
-    width: 160px;
-    clear: left;
-    text-align: right;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-  }
-  .dl-horizontal dd {
-    margin-left: 180px;
-  }
-}
-abbr[title],
-abbr[data-original-title] {
-  cursor: help;
-  border-bottom: 1px dotted #777777;
-}
-.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-blockquote {
-  padding: 10px 20px;
-  margin: 0 0 20px;
-  font-size: 17.5px;
-  border-left: 5px solid #eeeeee;
-}
-blockquote p:last-child,
-blockquote ul:last-child,
-blockquote ol:last-child {
-  margin-bottom: 0;
-}
-blockquote footer,
-blockquote small,
-blockquote .small {
-  display: block;
-  font-size: 80%;
-  line-height: 1.42857143;
-  color: #777777;
-}
-blockquote footer:before,
-blockquote small:before,
-blockquote .small:before {
-  content: '\2014 \00A0';
-}
-.blockquote-reverse,
-blockquote.pull-right {
-  padding-right: 15px;
-  padding-left: 0;
-  border-right: 5px solid #eeeeee;
-  border-left: 0;
-  text-align: right;
-}
-.blockquote-reverse footer:before,
-blockquote.pull-right footer:before,
-.blockquote-reverse small:before,
-blockquote.pull-right small:before,
-.blockquote-reverse .small:before,
-blockquote.pull-right .small:before {
-  content: '';
-}
-.blockquote-reverse footer:after,
-blockquote.pull-right footer:after,
-.blockquote-reverse small:after,
-blockquote.pull-right small:after,
-.blockquote-reverse .small:after,
-blockquote.pull-right .small:after {
-  content: '\00A0 \2014';
-}
-address {
-  margin-bottom: 20px;
-  font-style: normal;
-  line-height: 1.42857143;
-}
-code,
-kbd,
-pre,
-samp {
-  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
-}
-code {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: #c7254e;
-  background-color: #f9f2f4;
-  border-radius: 4px;
-}
-kbd {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: #ffffff;
-  background-color: #333333;
-  border-radius: 3px;
-  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-kbd kbd {
-  padding: 0;
-  font-size: 100%;
-  font-weight: bold;
-  box-shadow: none;
-}
-pre {
-  display: block;
-  padding: 9.5px;
-  margin: 0 0 10px;
-  font-size: 13px;
-  line-height: 1.42857143;
-  word-break: break-all;
-  word-wrap: break-word;
-  color: #333333;
-  background-color: #f5f5f5;
-  border: 1px solid #cccccc;
-  border-radius: 4px;
-}
-pre code {
-  padding: 0;
-  font-size: inherit;
-  color: inherit;
-  white-space: pre-wrap;
-  background-color: transparent;
-  border-radius: 0;
-}
-.pre-scrollable {
-  max-height: 340px;
-  overflow-y: scroll;
-}
-.container {
-  margin-right: auto;
-  margin-left: auto;
-  padding-left: 15px;
-  padding-right: 15px;
-}
-@media (min-width: 768px) {
-  .container {
-    width: 750px;
-  }
-}
-@media (min-width: 992px) {
-  .container {
-    width: 970px;
-  }
-}
-@media (min-width: 1200px) {
-  .container {
-    width: 1170px;
-  }
-}
-.container-fluid {
-  margin-right: auto;
-  margin-left: auto;
-  padding-left: 15px;
-  padding-right: 15px;
-}
-.row {
-  margin-left: -15px;
-  margin-right: -15px;
-}
-.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
-  position: relative;
-  min-height: 1px;
-  padding-left: 15px;
-  padding-right: 15px;
-}
-.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
-  float: left;
-}
-.col-xs-12 {
-  width: 100%;
-}
-.col-xs-11 {
-  width: 91.66666667%;
-}
-.col-xs-10 {
-  width: 83.33333333%;
-}
-.col-xs-9 {
-  width: 75%;
-}
-.col-xs-8 {
-  width: 66.66666667%;
-}
-.col-xs-7 {
-  width: 58.33333333%;
-}
-.col-xs-6 {
-  width: 50%;
-}
-.col-xs-5 {
-  width: 41.66666667%;
-}
-.col-xs-4 {
-  width: 33.33333333%;
-}
-.col-xs-3 {
-  width: 25%;
-}
-.col-xs-2 {
-  width: 16.66666667%;
-}
-.col-xs-1 {
-  width: 8.33333333%;
-}
-.col-xs-pull-12 {
-  right: 100%;
-}
-.col-xs-pull-11 {
-  right: 91.66666667%;
-}
-.col-xs-pull-10 {
-  right: 83.33333333%;
-}
-.col-xs-pull-9 {
-  right: 75%;
-}
-.col-xs-pull-8 {
-  right: 66.66666667%;
-}
-.col-xs-pull-7 {
-  right: 58.33333333%;
-}
-.col-xs-pull-6 {
-  right: 50%;
-}
-.col-xs-pull-5 {
-  right: 41.66666667%;
-}
-.col-xs-pull-4 {
-  right: 33.33333333%;
-}
-.col-xs-pull-3 {
-  right: 25%;
-}
-.col-xs-pull-2 {
-  right: 16.66666667%;
-}
-.col-xs-pull-1 {
-  right: 8.33333333%;
-}
-.col-xs-pull-0 {
-  right: auto;
-}
-.col-xs-push-12 {
-  left: 100%;
-}
-.col-xs-push-11 {
-  left: 91.66666667%;
-}
-.col-xs-push-10 {
-  left: 83.33333333%;
-}
-.col-xs-push-9 {
-  left: 75%;
-}
-.col-xs-push-8 {
-  left: 66.66666667%;
-}
-.col-xs-push-7 {
-  left: 58.33333333%;
-}
-.col-xs-push-6 {
-  left: 50%;
-}
-.col-xs-push-5 {
-  left: 41.66666667%;
-}
-.col-xs-push-4 {
-  left: 33.33333333%;
-}
-.col-xs-push-3 {
-  left: 25%;
-}
-.col-xs-push-2 {
-  left: 16.66666667%;
-}
-.col-xs-push-1 {
-  left: 8.33333333%;
-}
-.col-xs-push-0 {
-  left: auto;
-}
-.col-xs-offset-12 {
-  margin-left: 100%;
-}
-.col-xs-offset-11 {
-  margin-left: 91.66666667%;
-}
-.col-xs-offset-10 {
-  margin-left: 83.33333333%;
-}
-.col-xs-offset-9 {
-  margin-left: 75%;
-}
-.col-xs-offset-8 {
-  margin-left: 66.66666667%;
-}
-.col-xs-offset-7 {
-  margin-left: 58.33333333%;
-}
-.col-xs-offset-6 {
-  margin-left: 50%;
-}
-.col-xs-offset-5 {
-  margin-left: 41.66666667%;
-}
-.col-xs-offset-4 {
-  margin-left: 33.33333333%;
-}
-.col-xs-offset-3 {
-  margin-left: 25%;
-}
-.col-xs-offset-2 {
-  margin-left: 16.66666667%;
-}
-.col-xs-offset-1 {
-  margin-left: 8.33333333%;
-}
-.col-xs-offset-0 {
-  margin-left: 0%;
-}
-@media (min-width: 768px) {
-  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
-    float: left;
-  }
-  .col-sm-12 {
-    width: 100%;
-  }
-  .col-sm-11 {
-    width: 91.66666667%;
-  }
-  .col-sm-10 {
-    width: 83.33333333%;
-  }
-  .col-sm-9 {
-    width: 75%;
-  }
-  .col-sm-8 {
-    width: 66.66666667%;
-  }
-  .col-sm-7 {
-    width: 58.33333333%;
-  }
-  .col-sm-6 {
-    width: 50%;
-  }
-  .col-sm-5 {
-    width: 41.66666667%;
-  }
-  .col-sm-4 {
-    width: 33.33333333%;
-  }
-  .col-sm-3 {
-    width: 25%;
-  }
-  .col-sm-2 {
-    width: 16.66666667%;
-  }
-  .col-sm-1 {
-    width: 8.33333333%;
-  }
-  .col-sm-pull-12 {
-    right: 100%;
-  }
-  .col-sm-pull-11 {
-    right: 91.66666667%;
-  }
-  .col-sm-pull-10 {
-    right: 83.33333333%;
-  }
-  .col-sm-pull-9 {
-    right: 75%;
-  }
-  .col-sm-pull-8 {
-    right: 66.66666667%;
-  }
-  .col-sm-pull-7 {
-    right: 58.33333333%;
-  }
-  .col-sm-pull-6 {
-    right: 50%;
-  }
-  .col-sm-pull-5 {
-    right: 41.66666667%;
-  }
-  .col-sm-pull-4 {
-    right: 33.33333333%;
-  }
-  .col-sm-pull-3 {
-    right: 25%;
-  }
-  .col-sm-pull-2 {
-    right: 16.66666667%;
-  }
-  .col-sm-pull-1 {
-    right: 8.33333333%;
-  }
-  .col-sm-pull-0 {
-    right: auto;
-  }
-  .col-sm-push-12 {
-    left: 100%;
-  }
-  .col-sm-push-11 {
-    left: 91.66666667%;
-  }
-  .col-sm-push-10 {
-    left: 83.33333333%;
-  }
-  .col-sm-push-9 {
-    left: 75%;
-  }
-  .col-sm-push-8 {
-    left: 66.66666667%;
-  }
-  .col-sm-push-7 {
-    left: 58.33333333%;
-  }
-  .col-sm-push-6 {
-    left: 50%;
-  }
-  .col-sm-push-5 {
-    left: 41.66666667%;
-  }
-  .col-sm-push-4 {
-    left: 33.33333333%;
-  }
-  .col-sm-push-3 {
-    left: 25%;
-  }
-  .col-sm-push-2 {
-    left: 16.66666667%;
-  }
-  .col-sm-push-1 {
-    left: 8.33333333%;
-  }
-  .col-sm-push-0 {
-    left: auto;
-  }
-  .col-sm-offset-12 {
-    margin-left: 100%;
-  }
-  .col-sm-offset-11 {
-    margin-left: 91.66666667%;
-  }
-  .col-sm-offset-10 {
-    margin-left: 83.33333333%;
-  }
-  .col-sm-offset-9 {
-    margin-left: 75%;
-  }
-  .col-sm-offset-8 {
-    margin-left: 66.66666667%;
-  }
-  .col-sm-offset-7 {
-    margin-left: 58.33333333%;
-  }
-  .col-sm-offset-6 {
-    margin-left: 50%;
-  }
-  .col-sm-offset-5 {
-    margin-left: 41.66666667%;
-  }
-  .col-sm-offset-4 {
-    margin-left: 33.33333333%;
-  }
-  .col-sm-offset-3 {
-    margin-left: 25%;
-  }
-  .col-sm-offset-2 {
-    margin-left: 16.66666667%;
-  }
-  .col-sm-offset-1 {
-    margin-left: 8.33333333%;
-  }
-  .col-sm-offset-0 {
-    margin-left: 0%;
-  }
-}
-@media (min-width: 992px) {
-  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
-    float: left;
-  }
-  .col-md-12 {
-    width: 100%;
-  }
-  .col-md-11 {
-    width: 91.66666667%;
-  }
-  .col-md-10 {
-    width: 83.33333333%;
-  }
-  .col-md-9 {
-    width: 75%;
-  }
-  .col-md-8 {
-    width: 66.66666667%;
-  }
-  .col-md-7 {
-    width: 58.33333333%;
-  }
-  .col-md-6 {
-    width: 50%;
-  }
-  .col-md-5 {
-    width: 41.66666667%;
-  }
-  .col-md-4 {
-    width: 33.33333333%;
-  }
-  .col-md-3 {
-    width: 25%;
-  }
-  .col-md-2 {
-    width: 16.66666667%;
-  }
-  .col-md-1 {
-    width: 8.33333333%;
-  }
-  .col-md-pull-12 {
-    right: 100%;
-  }
-  .col-md-pull-11 {
-    right: 91.66666667%;
-  }
-  .col-md-pull-10 {
-    right: 83.33333333%;
-  }
-  .col-md-pull-9 {
-    right: 75%;
-  }
-  .col-md-pull-8 {
-    right: 66.66666667%;
-  }
-  .col-md-pull-7 {
-    right: 58.33333333%;
-  }
-  .col-md-pull-6 {
-    right: 50%;
-  }
-  .col-md-pull-5 {
-    right: 41.66666667%;
-  }
-  .col-md-pull-4 {
-    right: 33.33333333%;
-  }
-  .col-md-pull-3 {
-    right: 25%;
-  }
-  .col-md-pull-2 {
-    right: 16.66666667%;
-  }
-  .col-md-pull-1 {
-    right: 8.33333333%;
-  }
-  .col-md-pull-0 {
-    right: auto;
-  }
-  .col-md-push-12 {
-    left: 100%;
-  }
-  .col-md-push-11 {
-    left: 91.66666667%;
-  }
-  .col-md-push-10 {
-    left: 83.33333333%;
-  }
-  .col-md-push-9 {
-    left: 75%;
-  }
-  .col-md-push-8 {
-    left: 66.66666667%;
-  }
-  .col-md-push-7 {
-    left: 58.33333333%;
-  }
-  .col-md-push-6 {
-    left: 50%;
-  }
-  .col-md-push-5 {
-    left: 41.66666667%;
-  }
-  .col-md-push-4 {
-    left: 33.33333333%;
-  }
-  .col-md-push-3 {
-    left: 25%;
-  }
-  .col-md-push-2 {
-    left: 16.66666667%;
-  }
-  .col-md-push-1 {
-    left: 8.33333333%;
-  }
-  .col-md-push-0 {
-    left: auto;
-  }
-  .col-md-offset-12 {
-    margin-left: 100%;
-  }
-  .col-md-offset-11 {
-    margin-left: 91.66666667%;
-  }
-  .col-md-offset-10 {
-    margin-left: 83.33333333%;
-  }
-  .col-md-offset-9 {
-    margin-left: 75%;
-  }
-  .col-md-offset-8 {
-    margin-left: 66.66666667%;
-  }
-  .col-md-offset-7 {
-    margin-left: 58.33333333%;
-  }
-  .col-md-offset-6 {
-    margin-left: 50%;
-  }
-  .col-md-offset-5 {
-    margin-left: 41.66666667%;
-  }
-  .col-md-offset-4 {
-    margin-left: 33.33333333%;
-  }
-  .col-md-offset-3 {
-    margin-left: 25%;
-  }
-  .col-md-offset-2 {
-    margin-left: 16.66666667%;
-  }
-  .col-md-offset-1 {
-    margin-left: 8.33333333%;
-  }
-  .col-md-offset-0 {
-    margin-left: 0%;
-  }
-}
-@media (min-width: 1200px) {
-  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
-    float: left;
-  }
-  .col-lg-12 {
-    width: 100%;
-  }
-  .col-lg-11 {
-    width: 91.66666667%;
-  }
-  .col-lg-10 {
-    width: 83.33333333%;
-  }
-  .col-lg-9 {
-    width: 75%;
-  }
-  .col-lg-8 {
-    width: 66.66666667%;
-  }
-  .col-lg-7 {
-    width: 58.33333333%;
-  }
-  .col-lg-6 {
-    width: 50%;
-  }
-  .col-lg-5 {
-    width: 41.66666667%;
-  }
-  .col-lg-4 {
-    width: 33.33333333%;
-  }
-  .col-lg-3 {
-    width: 25%;
-  }
-  .col-lg-2 {
-    width: 16.66666667%;
-  }
-  .col-lg-1 {
-    width: 8.33333333%;
-  }
-  .col-lg-pull-12 {
-    right: 100%;
-  }
-  .col-lg-pull-11 {
-    right: 91.66666667%;
-  }
-  .col-lg-pull-10 {
-    right: 83.33333333%;
-  }
-  .col-lg-pull-9 {
-    right: 75%;
-  }
-  .col-lg-pull-8 {
-    right: 66.66666667%;
-  }
-  .col-lg-pull-7 {
-    right: 58.33333333%;
-  }
-  .col-lg-pull-6 {
-    right: 50%;
-  }
-  .col-lg-pull-5 {
-    right: 41.66666667%;
-  }
-  .col-lg-pull-4 {
-    right: 33.33333333%;
-  }
-  .col-lg-pull-3 {
-    right: 25%;
-  }
-  .col-lg-pull-2 {
-    right: 16.66666667%;
-  }
-  .col-lg-pull-1 {
-    right: 8.33333333%;
-  }
-  .col-lg-pull-0 {
-    right: auto;
-  }
-  .col-lg-push-12 {
-    left: 100%;
-  }
-  .col-lg-push-11 {
-    left: 91.66666667%;
-  }
-  .col-lg-push-10 {
-    left: 83.33333333%;
-  }
-  .col-lg-push-9 {
-    left: 75%;
-  }
-  .col-lg-push-8 {
-    left: 66.66666667%;
-  }
-  .col-lg-push-7 {
-    left: 58.33333333%;
-  }
-  .col-lg-push-6 {
-    left: 50%;
-  }
-  .col-lg-push-5 {
-    left: 41.66666667%;
-  }
-  .col-lg-push-4 {
-    left: 33.33333333%;
-  }
-  .col-lg-push-3 {
-    left: 25%;
-  }
-  .col-lg-push-2 {
-    left: 16.66666667%;
-  }
-  .col-lg-push-1 {
-    left: 8.33333333%;
-  }
-  .col-lg-push-0 {
-    left: auto;
-  }
-  .col-lg-offset-12 {
-    margin-left: 100%;
-  }
-  .col-lg-offset-11 {
-    margin-left: 91.66666667%;
-  }
-  .col-lg-offset-10 {
-    margin-left: 83.33333333%;
-  }
-  .col-lg-offset-9 {
-    margin-left: 75%;
-  }
-  .col-lg-offset-8 {
-    margin-left: 66.66666667%;
-  }
-  .col-lg-offset-7 {
-    margin-left: 58.33333333%;
-  }
-  .col-lg-offset-6 {
-    margin-left: 50%;
-  }
-  .col-lg-offset-5 {
-    margin-left: 41.66666667%;
-  }
-  .col-lg-offset-4 {
-    margin-left: 33.33333333%;
-  }
-  .col-lg-offset-3 {
-    margin-left: 25%;
-  }
-  .col-lg-offset-2 {
-    margin-left: 16.66666667%;
-  }
-  .col-lg-offset-1 {
-    margin-left: 8.33333333%;
-  }
-  .col-lg-offset-0 {
-    margin-left: 0%;
-  }
-}
-table {
-  background-color: transparent;
-}
-caption {
-  padding-top: 8px;
-  padding-bottom: 8px;
-  color: #777777;
-  text-align: left;
-}
-th {
-  text-align: left;
-}
-.table {
-  width: 100%;
-  max-width: 100%;
-  margin-bottom: 20px;
-}
-.table > thead > tr > th,
-.table > tbody > tr > th,
-.table > tfoot > tr > th,
-.table > thead > tr > td,
-.table > tbody > tr > td,
-.table > tfoot > tr > td {
-  padding: 8px;
-  line-height: 1.42857143;
-  vertical-align: top;
-  border-top: 1px solid #dddddd;
-}
-.table > thead > tr > th {
-  vertical-align: bottom;
-  border-bottom: 2px solid #dddddd;
-}
-.table > caption + thead > tr:first-child > th,
-.table > colgroup + thead > tr:first-child > th,
-.table > thead:first-child > tr:first-child > th,
-.table > caption + thead > tr:first-child > td,
-.table > colgroup + thead > tr:first-child > td,
-.table > thead:first-child > tr:first-child > td {
-  border-top: 0;
-}
-.table > tbody + tbody {
-  border-top: 2px solid #dddddd;
-}
-.table .table {
-  background-color: #ffffff;
-}
-.table-condensed > thead > tr > th,
-.table-condensed > tbody > tr > th,
-.table-condensed > tfoot > tr > th,
-.table-condensed > thead > tr > td,
-.table-condensed > tbody > tr > td,
-.table-condensed > tfoot > tr > td {
-  padding: 5px;
-}
-.table-bordered {
-  border: 1px solid #dddddd;
-}
-.table-bordered > thead > tr > th,
-.table-bordered > tbody > tr > th,
-.table-bordered > tfoot > tr > th,
-.table-bordered > thead > tr > td,
-.table-bordered > tbody > tr > td,
-.table-bordered > tfoot > tr > td {
-  border: 1px solid #dddddd;
-}
-.table-bordered > thead > tr > th,
-.table-bordered > thead > tr > td {
-  border-bottom-width: 2px;
-}
-.table-striped > tbody > tr:nth-of-type(odd) {
-  background-color: #f9f9f9;
-}
-.table-hover > tbody > tr:hover {
-  background-color: #f5f5f5;
-}
-table col[class*="col-"] {
-  position: static;
-  float: none;
-  display: table-column;
-}
-table td[class*="col-"],
-table th[class*="col-"] {
-  position: static;
-  float: none;
-  display: table-cell;
-}
-.table > thead > tr > td.active,
-.table > tbody > tr > td.active,
-.table > tfoot > tr > td.active,
-.table > thead > tr > th.active,
-.table > tbody > tr > th.active,
-.table > tfoot > tr > th.active,
-.table > thead > tr.active > td,
-.table > tbody > tr.active > td,
-.table > tfoot > tr.active > td,
-.table > thead > tr.active > th,
-.table > tbody > tr.active > th,
-.table > tfoot > tr.active > th {
-  background-color: #f5f5f5;
-}
-.table-hover > tbody > tr > td.active:hover,
-.table-hover > tbody > tr > th.active:hover,
-.table-hover > tbody > tr.active:hover > td,
-.table-hover > tbody > tr:hover > .active,
-.table-hover > tbody > tr.active:hover > th {
-  background-color: #e8e8e8;
-}
-.table > thead > tr > td.success,
-.table > tbody > tr > td.success,
-.table > tfoot > tr > td.success,
-.table > thead > tr > th.success,
-.table > tbody > tr > th.success,
-.table > tfoot > tr > th.success,
-.table > thead > tr.success > td,
-.table > tbody > tr.success > td,
-.table > tfoot > tr.success > td,
-.table > thead > tr.success > th,
-.table > tbody > tr.success > th,
-.table > tfoot > tr.success > th {
-  background-color: #dff0d8;
-}
-.table-hover > tbody > tr > td.success:hover,
-.table-hover > tbody > tr > th.success:hover,
-.table-hover > tbody > tr.success:hover > td,
-.table-hover > tbody > tr:hover > .success,
-.table-hover > tbody > tr.success:hover > th {
-  background-color: #d0e9c6;
-}
-.table > thead > tr > td.info,
-.table > tbody > tr > td.info,
-.table > tfoot > tr > td.info,
-.table > thead > tr > th.info,
-.table > tbody > tr > th.info,
-.table > tfoot > tr > th.info,
-.table > thead > tr.info > td,
-.table > tbody > tr.info > td,
-.table > tfoot > tr.info > td,
-.table > thead > tr.info > th,
-.table > tbody > tr.info > th,
-.table > tfoot > tr.info > th {
-  background-color: #d9edf7;
-}
-.table-hover > tbody > tr > td.info:hover,
-.table-hover > tbody > tr > th.info:hover,
-.table-hover > tbody > tr.info:hover > td,
-.table-hover > tbody > tr:hover > .info,
-.table-hover > tbody > tr.info:hover > th {
-  background-color: #c4e3f3;
-}
-.table > thead > tr > td.warning,
-.table > tbody > tr > td.warning,
-.table > tfoot > tr > td.warning,
-.table > thead > tr > th.warning,
-.table > tbody > tr > th.warning,
-.table > tfoot > tr > th.warning,
-.table > thead > tr.warning > td,
-.table > tbody > tr.warning > td,
-.table > tfoot > tr.warning > td,
-.table > thead > tr.warning > th,
-.table > tbody > tr.warning > th,
-.table > tfoot > tr.warning > th {
-  background-color: #fcf8e3;
-}
-.table-hover > tbody > tr > td.warning:hover,
-.table-hover > tbody > tr > th.warning:hover,
-.table-hover > tbody > tr.warning:hover > td,
-.table-hover > tbody > tr:hover > .warning,
-.table-hover > tbody > tr.warning:hover > th {
-  background-color: #faf2cc;
-}
-.table > thead > tr > td.danger,
-.table > tbody > tr > td.danger,
-.table > tfoot > tr > td.danger,
-.table > thead > tr > th.danger,
-.table > tbody > tr > th.danger,
-.table > tfoot > tr > th.danger,
-.table > thead > tr.danger > td,
-.table > tbody > tr.danger > td,
-.table > tfoot > tr.danger > td,
-.table > thead > tr.danger > th,
-.table > tbody > tr.danger > th,
-.table > tfoot > tr.danger > th {
-  background-color: #f2dede;
-}
-.table-hover > tbody > tr > td.danger:hover,
-.table-hover > tbody > tr > th.danger:hover,
-.table-hover > tbody > tr.danger:hover > td,
-.table-hover > tbody > tr:hover > .danger,
-.table-hover > tbody > tr.danger:hover > th {
-  background-color: #ebcccc;
-}
-.table-responsive {
-  overflow-x: auto;
-  min-height: 0.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 #dddddd;
-  }
-  .table-responsive > .table {
-    margin-bottom: 0;
-  }
-  .table-responsive > .table > thead > tr > th,
-  .table-responsive > .table > tbody > tr > th,
-  .table-responsive > .table > tfoot > tr > th,
-  .table-responsive > .table > thead > tr > td,
-  .table-responsive > .table > tbody > tr > td,
-  .table-responsive > .table > tfoot > tr > td {
-    white-space: nowrap;
-  }
-  .table-responsive > .table-bordered {
-    border: 0;
-  }
-  .table-responsive > .table-bordered > thead > tr > th:first-child,
-  .table-responsive > .table-bordered > tbody > tr > th:first-child,
-  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
-  .table-responsive > .table-bordered > thead > tr > td:first-child,
-  .table-responsive > .table-bordered > tbody > tr > td:first-child,
-  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
-    border-left: 0;
-  }
-  .table-responsive > .table-bordered > thead > tr > th:last-child,
-  .table-responsive > .table-bordered > tbody > tr > th:last-child,
-  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
-  .table-responsive > .table-bordered > thead > tr > td:last-child,
-  .table-responsive > .table-bordered > tbody > tr > td:last-child,
-  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
-    border-right: 0;
-  }
-  .table-responsive > .table-bordered > tbody > tr:last-child > th,
-  .table-responsive > .table-bordered > tfoot > tr:last-child > th,
-  .table-responsive > .table-bordered > tbody > tr:last-child > td,
-  .table-responsive > .table-bordered > tfoot > tr:last-child > td {
-    border-bottom: 0;
-  }
-}
-fieldset {
-  padding: 0;
-  margin: 0;
-  border: 0;
-  min-width: 0;
-}
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: 20px;
-  font-size: 21px;
-  line-height: inherit;
-  color: #333333;
-  border: 0;
-  border-bottom: 1px solid #e5e5e5;
-}
-label {
-  display: inline-block;
-  max-width: 100%;
-  margin-bottom: 5px;
-  font-weight: bold;
-}
-input[type="search"] {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-input[type="radio"],
-input[type="checkbox"] {
-  margin: 4px 0 0;
-  margin-top: 1px \9;
-  line-height: normal;
-}
-input[type="file"] {
-  display: block;
-}
-input[type="range"] {
-  display: block;
-  width: 100%;
-}
-select[multiple],
-select[size] {
-  height: auto;
-}
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
-  outline: thin dotted;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-output {
-  display: block;
-  padding-top: 7px;
-  font-size: 14px;
-  line-height: 1.42857143;
-  color: #555555;
-}
-.form-control {
-  display: block;
-  width: 100%;
-  height: 34px;
-  padding: 6px 12px;
-  font-size: 14px;
-  line-height: 1.42857143;
-  color: #555555;
-  background-color: #ffffff;
-  background-image: none;
-  border: 1px solid #cccccc;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -webkit-transition: border-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, 0.6);
-  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
-}
-.form-control::-moz-placeholder {
-  color: #999999;
-  opacity: 1;
-}
-.form-control:-ms-input-placeholder {
-  color: #999999;
-}
-.form-control::-webkit-input-placeholder {
-  color: #999999;
-}
-.form-control[disabled],
-.form-control[readonly],
-fieldset[disabled] .form-control {
-  background-color: #eeeeee;
-  opacity: 1;
-}
-.form-control[disabled],
-fieldset[disabled] .form-control {
-  cursor: not-allowed;
-}
-textarea.form-control {
-  height: auto;
-}
-input[type="search"] {
-  -webkit-appearance: none;
-}
-@media screen and (-webkit-min-device-pixel-ratio: 0) {
-  input[type="date"].form-control,
-  input[type="time"].form-control,
-  input[type="datetime-local"].form-control,
-  input[type="month"].form-control {
-    line-height: 34px;
-  }
-  input[type="date"].input-sm,
-  input[type="time"].input-sm,
-  input[type="datetime-local"].input-sm,
-  input[type="month"].input-sm,
-  .input-group-sm input[type="date"],
-  .input-group-sm input[type="time"],
-  .input-group-sm input[type="datetime-local"],
-  .input-group-sm input[type="month"] {
-    line-height: 30px;
-  }
-  input[type="date"].input-lg,
-  input[type="time"].input-lg,
-  input[type="datetime-local"].input-lg,
-  input[type="month"].input-lg,
-  .input-group-lg input[type="date"],
-  .input-group-lg input[type="time"],
-  .input-group-lg input[type="datetime-local"],
-  .input-group-lg input[type="month"] {
-    line-height: 46px;
-  }
-}
-.form-group {
-  margin-bottom: 15px;
-}
-.radio,
-.checkbox {
-  position: relative;
-  display: block;
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-.radio label,
-.checkbox label {
-  min-height: 20px;
-  padding-left: 20px;
-  margin-bottom: 0;
-  font-weight: normal;
-  cursor: pointer;
-}
-.radio input[type="radio"],
-.radio-inline input[type="radio"],
-.checkbox input[type="checkbox"],
-.checkbox-inline input[type="checkbox"] {
-  position: absolute;
-  margin-left: -20px;
-  margin-top: 4px \9;
-}
-.radio + .radio,
-.checkbox + .checkbox {
-  margin-top: -5px;
-}
-.radio-inline,
-.checkbox-inline {
-  position: relative;
-  display: inline-block;
-  padding-left: 20px;
-  margin-bottom: 0;
-  vertical-align: middle;
-  font-weight: normal;
-  cursor: pointer;
-}
-.radio-inline + .radio-inline,
-.checkbox-inline + .checkbox-inline {
-  margin-top: 0;
-  margin-left: 10px;
-}
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"].disabled,
-input[type="checkbox"].disabled,
-fieldset[disabled] input[type="radio"],
-fieldset[disabled] input[type="checkbox"] {
-  cursor: not-allowed;
-}
-.radio-inline.disabled,
-.checkbox-inline.disabled,
-fieldset[disabled] .radio-inline,
-fieldset[disabled] .checkbox-inline {
-  cursor: not-allowed;
-}
-.radio.disabled label,
-.checkbox.disabled label,
-fieldset[disabled] .radio label,
-fieldset[disabled] .checkbox label {
-  cursor: not-allowed;
-}
-.form-control-static {
-  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;
-}
-.input-sm {
-  height: 30px;
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-select.input-sm {
-  height: 30px;
-  line-height: 30px;
-}
-textarea.input-sm,
-select[multiple].input-sm {
-  height: auto;
-}
-.form-group-sm .form-control {
-  height: 30px;
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-.form-group-sm select.form-control {
-  height: 30px;
-  line-height: 30px;
-}
-.form-group-sm textarea.form-control,
-.form-group-sm select[multiple].form-control {
-  height: auto;
-}
-.form-group-sm .form-control-static {
-  height: 30px;
-  min-height: 32px;
-  padding: 6px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-}
-.input-lg {
-  height: 46px;
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-  border-radius: 6px;
-}
-select.input-lg {
-  height: 46px;
-  line-height: 46px;
-}
-textarea.input-lg,
-select[multiple].input-lg {
-  height: auto;
-}
-.form-group-lg .form-control {
-  height: 46px;
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-  border-radius: 6px;
-}
-.form-group-lg select.form-control {
-  height: 46px;
-  line-height: 46px;
-}
-.form-group-lg textarea.form-control,
-.form-group-lg select[multiple].form-control {
-  height: auto;
-}
-.form-group-lg .form-control-static {
-  height: 46px;
-  min-height: 38px;
-  padding: 11px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-}
-.has-feedback {
-  position: relative;
-}
-.has-feedback .form-control {
-  padding-right: 42.5px;
-}
-.form-control-feedback {
-  position: absolute;
-  top: 0;
-  right: 0;
-  z-index: 2;
-  display: block;
-  width: 34px;
-  height: 34px;
-  line-height: 34px;
-  text-align: center;
-  pointer-events: none;
-}
-.input-lg + .form-control-feedback,
-.input-group-lg + .form-control-feedback,
-.form-group-lg .form-control + .form-control-feedback {
-  width: 46px;
-  height: 46px;
-  line-height: 46px;
-}
-.input-sm + .form-control-feedback,
-.input-group-sm + .form-control-feedback,
-.form-group-sm .form-control + .form-control-feedback {
-  width: 30px;
-  height: 30px;
-  line-height: 30px;
-}
-.has-success .help-block,
-.has-success .control-label,
-.has-success .radio,
-.has-success .checkbox,
-.has-success .radio-inline,
-.has-success .checkbox-inline,
-.has-success.radio label,
-.has-success.checkbox label,
-.has-success.radio-inline label,
-.has-success.checkbox-inline label {
-  color: #3c763d;
-}
-.has-success .form-control {
-  border-color: #3c763d;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.has-success .form-control:focus {
-  border-color: #2b542c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
-}
-.has-success .input-group-addon {
-  color: #3c763d;
-  border-color: #3c763d;
-  background-color: #dff0d8;
-}
-.has-success .form-control-feedback {
-  color: #3c763d;
-}
-.has-warning .help-block,
-.has-warning .control-label,
-.has-warning .radio,
-.has-warning .checkbox,
-.has-warning .radio-inline,
-.has-warning .checkbox-inline,
-.has-warning.radio label,
-.has-warning.checkbox label,
-.has-warning.radio-inline label,
-.has-warning.checkbox-inline label {
-  color: #8a6d3b;
-}
-.has-warning .form-control {
-  border-color: #8a6d3b;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.has-warning .form-control:focus {
-  border-color: #66512c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
-}
-.has-warning .input-group-addon {
-  color: #8a6d3b;
-  border-color: #8a6d3b;
-  background-color: #fcf8e3;
-}
-.has-warning .form-control-feedback {
-  color: #8a6d3b;
-}
-.has-error .help-block,
-.has-error .control-label,
-.has-error .radio,
-.has-error .checkbox,
-.has-error .radio-inline,
-.has-error .checkbox-inline,
-.has-error.radio label,
-.has-error.checkbox label,
-.has-error.radio-inline label,
-.has-error.checkbox-inline label {
-  color: #a94442;
-}
-.has-error .form-control {
-  border-color: #a94442;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.has-error .form-control:focus {
-  border-color: #843534;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
-}
-.has-error .input-group-addon {
-  color: #a94442;
-  border-color: #a94442;
-  background-color: #f2dede;
-}
-.has-error .form-control-feedback {
-  color: #a94442;
-}
-.has-feedback label ~ .form-control-feedback {
-  top: 25px;
-}
-.has-feedback label.sr-only ~ .form-control-feedback {
-  top: 0;
-}
-.help-block {
-  display: block;
-  margin-top: 5px;
-  margin-bottom: 10px;
-  color: #737373;
-}
-@media (min-width: 768px) {
-  .form-inline .form-group {
-    display: inline-block;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .form-inline .form-control {
-    display: inline-block;
-    width: auto;
-    vertical-align: middle;
-  }
-  .form-inline .form-control-static {
-    display: inline-block;
-  }
-  .form-inline .input-group {
-    display: inline-table;
-    vertical-align: middle;
-  }
-  .form-inline .input-group .input-group-addon,
-  .form-inline .input-group .input-group-btn,
-  .form-inline .input-group .form-control {
-    width: auto;
-  }
-  .form-inline .input-group > .form-control {
-    width: 100%;
-  }
-  .form-inline .control-label {
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .form-inline .radio,
-  .form-inline .checkbox {
-    display: inline-block;
-    margin-top: 0;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .form-inline .radio label,
-  .form-inline .checkbox label {
-    padding-left: 0;
-  }
-  .form-inline .radio input[type="radio"],
-  .form-inline .checkbox input[type="checkbox"] {
-    position: relative;
-    margin-left: 0;
-  }
-  .form-inline .has-feedback .form-control-feedback {
-    top: 0;
-  }
-}
-.form-horizontal .radio,
-.form-horizontal .checkbox,
-.form-horizontal .radio-inline,
-.form-horizontal .checkbox-inline {
-  margin-top: 0;
-  margin-bottom: 0;
-  padding-top: 7px;
-}
-.form-horizontal .radio,
-.form-horizontal .checkbox {
-  min-height: 27px;
-}
-.form-horizontal .form-group {
-  margin-left: -15px;
-  margin-right: -15px;
-}
-@media (min-width: 768px) {
-  .form-horizontal .control-label {
-    text-align: right;
-    margin-bottom: 0;
-    padding-top: 7px;
-  }
-}
-.form-horizontal .has-feedback .form-control-feedback {
-  right: 15px;
-}
-@media (min-width: 768px) {
-  .form-horizontal .form-group-lg .control-label {
-    padding-top: 14.333333px;
-    font-size: 18px;
-  }
-}
-@media (min-width: 768px) {
-  .form-horizontal .form-group-sm .control-label {
-    padding-top: 6px;
-    font-size: 12px;
-  }
-}
-.btn {
-  display: inline-block;
-  margin-bottom: 0;
-  font-weight: normal;
-  text-align: center;
-  vertical-align: middle;
-  touch-action: manipulation;
-  cursor: pointer;
-  background-image: none;
-  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:focus,
-.btn:active:focus,
-.btn.active:focus,
-.btn.focus,
-.btn:active.focus,
-.btn.active.focus {
-  outline: thin dotted;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-.btn:hover,
-.btn:focus,
-.btn.focus {
-  color: #333333;
-  text-decoration: none;
-}
-.btn:active,
-.btn.active {
-  outline: 0;
-  background-image: none;
-  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
-  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
-}
-.btn.disabled,
-.btn[disabled],
-fieldset[disabled] .btn {
-  cursor: not-allowed;
-  opacity: 0.65;
-  filter: alpha(opacity=65);
-  -webkit-box-shadow: none;
-  box-shadow: none;
-}
-a.btn.disabled,
-fieldset[disabled] a.btn {
-  pointer-events: none;
-}
-.btn-default {
-  color: #333333;
-  background-color: #ffffff;
-  border-color: #cccccc;
-}
-.btn-default:focus,
-.btn-default.focus {
-  color: #333333;
-  background-color: #e6e6e6;
-  border-color: #8c8c8c;
-}
-.btn-default:hover {
-  color: #333333;
-  background-color: #e6e6e6;
-  border-color: #adadad;
-}
-.btn-default:active,
-.btn-default.active,
-.open > .dropdown-toggle.btn-default {
-  color: #333333;
-  background-color: #e6e6e6;
-  border-color: #adadad;
-}
-.btn-default:active:hover,
-.btn-default.active:hover,
-.open > .dropdown-toggle.btn-default:hover,
-.btn-default:active:focus,
-.btn-default.active:focus,
-.open > .dropdown-toggle.btn-default:focus,
-.btn-default:active.focus,
-.btn-default.active.focus,
-.open > .dropdown-toggle.btn-default.focus {
-  color: #333333;
-  background-color: #d4d4d4;
-  border-color: #8c8c8c;
-}
-.btn-default:active,
-.btn-default.active,
-.open > .dropdown-toggle.btn-default {
-  background-image: none;
-}
-.btn-default.disabled,
-.btn-default[disabled],
-fieldset[disabled] .btn-default,
-.btn-default.disabled:hover,
-.btn-default[disabled]:hover,
-fieldset[disabled] .btn-default:hover,
-.btn-default.disabled:focus,
-.btn-default[disabled]:focus,
-fieldset[disabled] .btn-default:focus,
-.btn-default.disabled.focus,
-.btn-default[disabled].focus,
-fieldset[disabled] .btn-default.focus,
-.btn-default.disabled:active,
-.btn-default[disabled]:active,
-fieldset[disabled] .btn-default:active,
-.btn-default.disabled.active,
-.btn-default[disabled].active,
-fieldset[disabled] .btn-default.active {
-  background-color: #ffffff;
-  border-color: #cccccc;
-}
-.btn-default .badge {
-  color: #ffffff;
-  background-color: #333333;
-}
-.btn-primary {
-  color: #ffffff;
-  background-color: #337ab7;
-  border-color: #2e6da4;
-}
-.btn-primary:focus,
-.btn-primary.focus {
-  color: #ffffff;
-  background-color: #286090;
-  border-color: #122b40;
-}
-.btn-primary:hover {
-  color: #ffffff;
-  background-color: #286090;
-  border-color: #204d74;
-}
-.btn-primary:active,
-.btn-primary.active,
-.open > .dropdown-toggle.btn-primary {
-  color: #ffffff;
-  background-color: #286090;
-  border-color: #204d74;
-}
-.btn-primary:active:hover,
-.btn-primary.active:hover,
-.open > .dropdown-toggle.btn-primary:hover,
-.btn-primary:active:focus,
-.btn-primary.active:focus,
-.open > .dropdown-toggle.btn-primary:focus,
-.btn-primary:active.focus,
-.btn-primary.active.focus,
-.open > .dropdown-toggle.btn-primary.focus {
-  color: #ffffff;
-  background-color: #204d74;
-  border-color: #122b40;
-}
-.btn-primary:active,
-.btn-primary.active,
-.open > .dropdown-toggle.btn-primary {
-  background-image: none;
-}
-.btn-primary.disabled,
-.btn-primary[disabled],
-fieldset[disabled] .btn-primary,
-.btn-primary.disabled:hover,
-.btn-primary[disabled]:hover,
-fieldset[disabled] .btn-primary:hover,
-.btn-primary.disabled:focus,
-.btn-primary[disabled]:focus,
-fieldset[disabled] .btn-primary:focus,
-.btn-primary.disabled.focus,
-.btn-primary[disabled].focus,
-fieldset[disabled] .btn-primary.focus,
-.btn-primary.disabled:active,
-.btn-primary[disabled]:active,
-fieldset[disabled] .btn-primary:active,
-.btn-primary.disabled.active,
-.btn-primary[disabled].active,
-fieldset[disabled] .btn-primary.active {
-  background-color: #337ab7;
-  border-color: #2e6da4;
-}
-.btn-primary .badge {
-  color: #337ab7;
-  background-color: #ffffff;
-}
-.btn-success {
-  color: #ffffff;
-  background-color: #5cb85c;
-  border-color: #4cae4c;
-}
-.btn-success:focus,
-.btn-success.focus {
-  color: #ffffff;
-  background-color: #449d44;
-  border-color: #255625;
-}
-.btn-success:hover {
-  color: #ffffff;
-  background-color: #449d44;
-  border-color: #398439;
-}
-.btn-success:active,
-.btn-success.active,
-.open > .dropdown-toggle.btn-success {
-  color: #ffffff;
-  background-color: #449d44;
-  border-color: #398439;
-}
-.btn-success:active:hover,
-.btn-success.active:hover,
-.open > .dropdown-toggle.btn-success:hover,
-.btn-success:active:focus,
-.btn-success.active:focus,
-.open > .dropdown-toggle.btn-success:focus,
-.btn-success:active.focus,
-.btn-success.active.focus,
-.open > .dropdown-toggle.btn-success.focus {
-  color: #ffffff;
-  background-color: #398439;
-  border-color: #255625;
-}
-.btn-success:active,
-.btn-success.active,
-.open > .dropdown-toggle.btn-success {
-  background-image: none;
-}
-.btn-success.disabled,
-.btn-success[disabled],
-fieldset[disabled] .btn-success,
-.btn-success.disabled:hover,
-.btn-success[disabled]:hover,
-fieldset[disabled] .btn-success:hover,
-.btn-success.disabled:focus,
-.btn-success[disabled]:focus,
-fieldset[disabled] .btn-success:focus,
-.btn-success.disabled.focus,
-.btn-success[disabled].focus,
-fieldset[disabled] .btn-success.focus,
-.btn-success.disabled:active,
-.btn-success[disabled]:active,
-fieldset[disabled] .btn-success:active,
-.btn-success.disabled.active,
-.btn-success[disabled].active,
-fieldset[disabled] .btn-success.active {
-  background-color: #5cb85c;
-  border-color: #4cae4c;
-}
-.btn-success .badge {
-  color: #5cb85c;
-  background-color: #ffffff;
-}
-.btn-info {
-  color: #ffffff;
-  background-color: #5bc0de;
-  border-color: #46b8da;
-}
-.btn-info:focus,
-.btn-info.focus {
-  color: #ffffff;
-  background-color: #31b0d5;
-  border-color: #1b6d85;
-}
-.btn-info:hover {
-  color: #ffffff;
-  background-color: #31b0d5;
-  border-color: #269abc;
-}
-.btn-info:active,
-.btn-info.active,
-.open > .dropdown-toggle.btn-info {
-  color: #ffffff;
-  background-color: #31b0d5;
-  border-color: #269abc;
-}
-.btn-info:active:hover,
-.btn-info.active:hover,
-.open > .dropdown-toggle.btn-info:hover,
-.btn-info:active:focus,
-.btn-info.active:focus,
-.open > .dropdown-toggle.btn-info:focus,
-.btn-info:active.focus,
-.btn-info.active.focus,
-.open > .dropdown-toggle.btn-info.focus {
-  color: #ffffff;
-  background-color: #269abc;
-  border-color: #1b6d85;
-}
-.btn-info:active,
-.btn-info.active,
-.open > .dropdown-toggle.btn-info {
-  background-image: none;
-}
-.btn-info.disabled,
-.btn-info[disabled],
-fieldset[disabled] .btn-info,
-.btn-info.disabled:hover,
-.btn-info[disabled]:hover,
-fieldset[disabled] .btn-info:hover,
-.btn-info.disabled:focus,
-.btn-info[disabled]:focus,
-fieldset[disabled] .btn-info:focus,
-.btn-info.disabled.focus,
-.btn-info[disabled].focus,
-fieldset[disabled] .btn-info.focus,
-.btn-info.disabled:active,
-.btn-info[disabled]:active,
-fieldset[disabled] .btn-info:active,
-.btn-info.disabled.active,
-.btn-info[disabled].active,
-fieldset[disabled] .btn-info.active {
-  background-color: #5bc0de;
-  border-color: #46b8da;
-}
-.btn-info .badge {
-  color: #5bc0de;
-  background-color: #ffffff;
-}
-.btn-warning {
-  color: #ffffff;
-  background-color: #f0ad4e;
-  border-color: #eea236;
-}
-.btn-warning:focus,
-.btn-warning.focus {
-  color: #ffffff;
-  background-color: #ec971f;
-  border-color: #985f0d;
-}
-.btn-warning:hover {
-  color: #ffffff;
-  background-color: #ec971f;
-  border-color: #d58512;
-}
-.btn-warning:active,
-.btn-warning.active,
-.open > .dropdown-toggle.btn-warning {
-  color: #ffffff;
-  background-color: #ec971f;
-  border-color: #d58512;
-}
-.btn-warning:active:hover,
-.btn-warning.active:hover,
-.open > .dropdown-toggle.btn-warning:hover,
-.btn-warning:active:focus,
-.btn-warning.active:focus,
-.open > .dropdown-toggle.btn-warning:focus,
-.btn-warning:active.focus,
-.btn-warning.active.focus,
-.open > .dropdown-toggle.btn-warning.focus {
-  color: #ffffff;
-  background-color: #d58512;
-  border-color: #985f0d;
-}
-.btn-warning:active,
-.btn-warning.active,
-.open > .dropdown-toggle.btn-warning {
-  background-image: none;
-}
-.btn-warning.disabled,
-.btn-warning[disabled],
-fieldset[disabled] .btn-warning,
-.btn-warning.disabled:hover,
-.btn-warning[disabled]:hover,
-fieldset[disabled] .btn-warning:hover,
-.btn-warning.disabled:focus,
-.btn-warning[disabled]:focus,
-fieldset[disabled] .btn-warning:focus,
-.btn-warning.disabled.focus,
-.btn-warning[disabled].focus,
-fieldset[disabled] .btn-warning.focus,
-.btn-warning.disabled:active,
-.btn-warning[disabled]:active,
-fieldset[disabled] .btn-warning:active,
-.btn-warning.disabled.active,
-.btn-warning[disabled].active,
-fieldset[disabled] .btn-warning.active {
-  background-color: #f0ad4e;
-  border-color: #eea236;
-}
-.btn-warning .badge {
-  color: #f0ad4e;
-  background-color: #ffffff;
-}
-.btn-danger {
-  color: #ffffff;
-  background-color: #d9534f;
-  border-color: #d43f3a;
-}
-.btn-danger:focus,
-.btn-danger.focus {
-  color: #ffffff;
-  background-color: #c9302c;
-  border-color: #761c19;
-}
-.btn-danger:hover {
-  color: #ffffff;
-  background-color: #c9302c;
-  border-color: #ac2925;
-}
-.btn-danger:active,
-.btn-danger.active,
-.open > .dropdown-toggle.btn-danger {
-  color: #ffffff;
-  background-color: #c9302c;
-  border-color: #ac2925;
-}
-.btn-danger:active:hover,
-.btn-danger.active:hover,
-.open > .dropdown-toggle.btn-danger:hover,
-.btn-danger:active:focus,
-.btn-danger.active:focus,
-.open > .dropdown-toggle.btn-danger:focus,
-.btn-danger:active.focus,
-.btn-danger.active.focus,
-.open > .dropdown-toggle.btn-danger.focus {
-  color: #ffffff;
-  background-color: #ac2925;
-  border-color: #761c19;
-}
-.btn-danger:active,
-.btn-danger.active,
-.open > .dropdown-toggle.btn-danger {
-  background-image: none;
-}
-.btn-danger.disabled,
-.btn-danger[disabled],
-fieldset[disabled] .btn-danger,
-.btn-danger.disabled:hover,
-.btn-danger[disabled]:hover,
-fieldset[disabled] .btn-danger:hover,
-.btn-danger.disabled:focus,
-.btn-danger[disabled]:focus,
-fieldset[disabled] .btn-danger:focus,
-.btn-danger.disabled.focus,
-.btn-danger[disabled].focus,
-fieldset[disabled] .btn-danger.focus,
-.btn-danger.disabled:active,
-.btn-danger[disabled]:active,
-fieldset[disabled] .btn-danger:active,
-.btn-danger.disabled.active,
-.btn-danger[disabled].active,
-fieldset[disabled] .btn-danger.active {
-  background-color: #d9534f;
-  border-color: #d43f3a;
-}
-.btn-danger .badge {
-  color: #d9534f;
-  background-color: #ffffff;
-}
-.btn-link {
-  color: #337ab7;
-  font-weight: normal;
-  border-radius: 0;
-}
-.btn-link,
-.btn-link:active,
-.btn-link.active,
-.btn-link[disabled],
-fieldset[disabled] .btn-link {
-  background-color: transparent;
-  -webkit-box-shadow: none;
-  box-shadow: none;
-}
-.btn-link,
-.btn-link:hover,
-.btn-link:focus,
-.btn-link:active {
-  border-color: transparent;
-}
-.btn-link:hover,
-.btn-link:focus {
-  color: #23527c;
-  text-decoration: underline;
-  background-color: transparent;
-}
-.btn-link[disabled]:hover,
-fieldset[disabled] .btn-link:hover,
-.btn-link[disabled]:focus,
-fieldset[disabled] .btn-link:focus {
-  color: #777777;
-  text-decoration: none;
-}
-.btn-lg {
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-  border-radius: 6px;
-}
-.btn-sm {
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-.btn-xs {
-  padding: 1px 5px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-.btn-block {
-  display: block;
-  width: 100%;
-}
-.btn-block + .btn-block {
-  margin-top: 5px;
-}
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
-  width: 100%;
-}
-.nav {
-  margin-bottom: 0;
-  padding-left: 0;
-  list-style: none;
-}
-.nav > li {
-  position: relative;
-  display: block;
-}
-.nav > li > a {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-}
-.nav > li > a:hover,
-.nav > li > a:focus {
-  text-decoration: none;
-  background-color: #eeeeee;
-}
-.nav > li.disabled > a {
-  color: #777777;
-}
-.nav > li.disabled > a:hover,
-.nav > li.disabled > a:focus {
-  color: #777777;
-  text-decoration: none;
-  background-color: transparent;
-  cursor: not-allowed;
-}
-.nav .open > a,
-.nav .open > a:hover,
-.nav .open > a:focus {
-  background-color: #eeeeee;
-  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 #dddddd;
-}
-.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: #eeeeee #eeeeee #dddddd;
-}
-.nav-tabs > li.active > a,
-.nav-tabs > li.active > a:hover,
-.nav-tabs > li.active > a:focus {
-  color: #555555;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  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;
-}
-.nav-tabs.nav-justified > .dropdown .dropdown-menu {
-  top: auto;
-  left: auto;
-}
-@media (min-width: 768px) {
-  .nav-tabs.nav-justified > li {
-    display: table-cell;
-    width: 1%;
-  }
-  .nav-tabs.nav-justified > li > a {
-    margin-bottom: 0;
-  }
-}
-.nav-tabs.nav-justified > li > a {
-  margin-right: 0;
-  border-radius: 4px;
-}
-.nav-tabs.nav-justified > .active > a,
-.nav-tabs.nav-justified > .active > a:hover,
-.nav-tabs.nav-justified > .active > a:focus {
-  border: 1px solid #dddddd;
-}
-@media (min-width: 768px) {
-  .nav-tabs.nav-justified > li > a {
-    border-bottom: 1px solid #dddddd;
-    border-radius: 4px 4px 0 0;
-  }
-  .nav-tabs.nav-justified > .active > a,
-  .nav-tabs.nav-justified > .active > a:hover,
-  .nav-tabs.nav-justified > .active > a:focus {
-    border-bottom-color: #ffffff;
-  }
-}
-.nav-pills > li {
-  float: left;
-}
-.nav-pills > li > a {
-  border-radius: 4px;
-}
-.nav-pills > li + li {
-  margin-left: 2px;
-}
-.nav-pills > li.active > a,
-.nav-pills > li.active > a:hover,
-.nav-pills > li.active > a:focus {
-  color: #ffffff;
-  background-color: #337ab7;
-}
-.nav-stacked > li {
-  float: none;
-}
-.nav-stacked > li + li {
-  margin-top: 2px;
-  margin-left: 0;
-}
-.nav-justified {
-  width: 100%;
-}
-.nav-justified > li {
-  float: none;
-}
-.nav-justified > li > a {
-  text-align: center;
-  margin-bottom: 5px;
-}
-.nav-justified > .dropdown .dropdown-menu {
-  top: auto;
-  left: auto;
-}
-@media (min-width: 768px) {
-  .nav-justified > li {
-    display: table-cell;
-    width: 1%;
-  }
-  .nav-justified > li > a {
-    margin-bottom: 0;
-  }
-}
-.nav-tabs-justified {
-  border-bottom: 0;
-}
-.nav-tabs-justified > li > a {
-  margin-right: 0;
-  border-radius: 4px;
-}
-.nav-tabs-justified > .active > a,
-.nav-tabs-justified > .active > a:hover,
-.nav-tabs-justified > .active > a:focus {
-  border: 1px solid #dddddd;
-}
-@media (min-width: 768px) {
-  .nav-tabs-justified > li > a {
-    border-bottom: 1px solid #dddddd;
-    border-radius: 4px 4px 0 0;
-  }
-  .nav-tabs-justified > .active > a,
-  .nav-tabs-justified > .active > a:hover,
-  .nav-tabs-justified > .active > a:focus {
-    border-bottom-color: #ffffff;
-  }
-}
-.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;
-}
-@media (min-width: 768px) {
-  .navbar {
-    border-radius: 4px;
-  }
-}
-@media (min-width: 768px) {
-  .navbar-header {
-    float: left;
-  }
-}
-.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, 0.1);
-  -webkit-overflow-scrolling: touch;
-}
-.navbar-collapse.in {
-  overflow-y: auto;
-}
-@media (min-width: 768px) {
-  .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-top .navbar-collapse,
-  .navbar-static-top .navbar-collapse,
-  .navbar-fixed-bottom .navbar-collapse {
-    padding-left: 0;
-    padding-right: 0;
-  }
-}
-.navbar-fixed-top .navbar-collapse,
-.navbar-fixed-bottom .navbar-collapse {
-  max-height: 340px;
-}
-@media (max-device-width: 480px) and (orientation: landscape) {
-  .navbar-fixed-top .navbar-collapse,
-  .navbar-fixed-bottom .navbar-collapse {
-    max-height: 200px;
-  }
-}
-.container > .navbar-header,
-.container-fluid > .navbar-header,
-.container > .navbar-collapse,
-.container-fluid > .navbar-collapse {
-  margin-right: -15px;
-  margin-left: -15px;
-}
-@media (min-width: 768px) {
-  .container > .navbar-header,
-  .container-fluid > .navbar-header,
-  .container > .navbar-collapse,
-  .container-fluid > .navbar-collapse {
-    margin-right: 0;
-    margin-left: 0;
-  }
-}
-.navbar-static-top {
-  z-index: 1000;
-  border-width: 0 0 1px;
-}
-@media (min-width: 768px) {
-  .navbar-static-top {
-    border-radius: 0;
-  }
-}
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  position: fixed;
-  right: 0;
-  left: 0;
-  z-index: 1030;
-}
-@media (min-width: 768px) {
-  .navbar-fixed-top,
-  .navbar-fixed-bottom {
-    border-radius: 0;
-  }
-}
-.navbar-fixed-top {
-  top: 0;
-  border-width: 0 0 1px;
-}
-.navbar-fixed-bottom {
-  bottom: 0;
-  margin-bottom: 0;
-  border-width: 1px 0 0;
-}
-.navbar-brand {
-  float: left;
-  padding: 15px 15px;
-  font-size: 18px;
-  line-height: 20px;
-  height: 50px;
-}
-.navbar-brand:hover,
-.navbar-brand:focus {
-  text-decoration: none;
-}
-.navbar-brand > img {
-  display: block;
-}
-@media (min-width: 768px) {
-  .navbar > .container .navbar-brand,
-  .navbar > .container-fluid .navbar-brand {
-    margin-left: -15px;
-  }
-}
-.navbar-toggle {
-  position: relative;
-  float: right;
-  margin-right: 15px;
-  padding: 9px 10px;
-  margin-top: 8px;
-  margin-bottom: 8px;
-  background-color: transparent;
-  background-image: none;
-  border: 1px solid transparent;
-  border-radius: 4px;
-}
-.navbar-toggle:focus {
-  outline: 0;
-}
-.navbar-toggle .icon-bar {
-  display: block;
-  width: 22px;
-  height: 2px;
-  border-radius: 1px;
-}
-.navbar-toggle .icon-bar + .icon-bar {
-  margin-top: 4px;
-}
-@media (min-width: 768px) {
-  .navbar-toggle {
-    display: none;
-  }
-}
-.navbar-nav {
-  margin: 7.5px -15px;
-}
-.navbar-nav > li > a {
-  padding-top: 10px;
-  padding-bottom: 10px;
-  line-height: 20px;
-}
-@media (max-width: 767px) {
-  .navbar-nav .open .dropdown-menu {
-    position: static;
-    float: none;
-    width: auto;
-    margin-top: 0;
-    background-color: transparent;
-    border: 0;
-    box-shadow: none;
-  }
-  .navbar-nav .open .dropdown-menu > li > a,
-  .navbar-nav .open .dropdown-menu .dropdown-header {
-    padding: 5px 15px 5px 25px;
-  }
-  .navbar-nav .open .dropdown-menu > li > a {
-    line-height: 20px;
-  }
-  .navbar-nav .open .dropdown-menu > li > a:hover,
-  .navbar-nav .open .dropdown-menu > li > a:focus {
-    background-image: none;
-  }
-}
-@media (min-width: 768px) {
-  .navbar-nav {
-    float: left;
-    margin: 0;
-  }
-  .navbar-nav > li {
-    float: left;
-  }
-  .navbar-nav > li > a {
-    padding-top: 15px;
-    padding-bottom: 15px;
-  }
-}
-.navbar-form {
-  margin-left: -15px;
-  margin-right: -15px;
-  padding: 10px 15px;
-  border-top: 1px solid transparent;
-  border-bottom: 1px solid transparent;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
-  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
-  margin-top: 8px;
-  margin-bottom: 8px;
-}
-@media (min-width: 768px) {
-  .navbar-form .form-group {
-    display: inline-block;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .navbar-form .form-control {
-    display: inline-block;
-    width: auto;
-    vertical-align: middle;
-  }
-  .navbar-form .form-control-static {
-    display: inline-block;
-  }
-  .navbar-form .input-group {
-    display: inline-table;
-    vertical-align: middle;
-  }
-  .navbar-form .input-group .input-group-addon,
-  .navbar-form .input-group .input-group-btn,
-  .navbar-form .input-group .form-control {
-    width: auto;
-  }
-  .navbar-form .input-group > .form-control {
-    width: 100%;
-  }
-  .navbar-form .control-label {
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .navbar-form .radio,
-  .navbar-form .checkbox {
-    display: inline-block;
-    margin-top: 0;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .navbar-form .radio label,
-  .navbar-form .checkbox label {
-    padding-left: 0;
-  }
-  .navbar-form .radio input[type="radio"],
-  .navbar-form .checkbox input[type="checkbox"] {
-    position: relative;
-    margin-left: 0;
-  }
-  .navbar-form .has-feedback .form-control-feedback {
-    top: 0;
-  }
-}
-@media (max-width: 767px) {
-  .navbar-form .form-group {
-    margin-bottom: 5px;
-  }
-  .navbar-form .form-group:last-child {
-    margin-bottom: 0;
-  }
-}
-@media (min-width: 768px) {
-  .navbar-form {
-    width: auto;
-    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-top-right-radius: 4px;
-  border-top-left-radius: 4px;
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-}
-.navbar-btn {
-  margin-top: 8px;
-  margin-bottom: 8px;
-}
-.navbar-btn.btn-sm {
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-.navbar-btn.btn-xs {
-  margin-top: 14px;
-  margin-bottom: 14px;
-}
-.navbar-text {
-  margin-top: 15px;
-  margin-bottom: 15px;
-}
-@media (min-width: 768px) {
-  .navbar-text {
-    float: left;
-    margin-left: 15px;
-    margin-right: 15px;
-  }
-}
-@media (min-width: 768px) {
-  .navbar-left {
-    float: left !important;
-  }
-  .navbar-right {
-    float: right !important;
-    margin-right: -15px;
-  }
-  .navbar-right ~ .navbar-right {
-    margin-right: 0;
-  }
-}
-.navbar-default {
-  background-color: #f8f8f8;
-  border-color: #e7e7e7;
-}
-.navbar-default .navbar-brand {
-  color: #777777;
-}
-.navbar-default .navbar-brand:hover,
-.navbar-default .navbar-brand:focus {
-  color: #5e5e5e;
-  background-color: transparent;
-}
-.navbar-default .navbar-text {
-  color: #777777;
-}
-.navbar-default .navbar-nav > li > a {
-  color: #777777;
-}
-.navbar-default .navbar-nav > li > a:hover,
-.navbar-default .navbar-nav > li > a:focus {
-  color: #333333;
-  background-color: transparent;
-}
-.navbar-default .navbar-nav > .active > a,
-.navbar-default .navbar-nav > .active > a:hover,
-.navbar-default .navbar-nav > .active > a:focus {
-  color: #555555;
-  background-color: #e7e7e7;
-}
-.navbar-default .navbar-nav > .disabled > a,
-.navbar-default .navbar-nav > .disabled > a:hover,
-.navbar-default .navbar-nav > .disabled > a:focus {
-  color: #cccccc;
-  background-color: transparent;
-}
-.navbar-default .navbar-toggle {
-  border-color: #dddddd;
-}
-.navbar-default .navbar-toggle:hover,
-.navbar-default .navbar-toggle:focus {
-  background-color: #dddddd;
-}
-.navbar-default .navbar-toggle .icon-bar {
-  background-color: #888888;
-}
-.navbar-default .navbar-collapse,
-.navbar-default .navbar-form {
-  border-color: #e7e7e7;
-}
-.navbar-default .navbar-nav > .open > a,
-.navbar-default .navbar-nav > .open > a:hover,
-.navbar-default .navbar-nav > .open > a:focus {
-  background-color: #e7e7e7;
-  color: #555555;
-}
-@media (max-width: 767px) {
-  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
-    color: #777777;
-  }
-  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
-  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
-    color: #333333;
-    background-color: transparent;
-  }
-  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
-  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
-  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
-    color: #555555;
-    background-color: #e7e7e7;
-  }
-  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
-  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
-  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
-    color: #cccccc;
-    background-color: transparent;
-  }
-}
-.navbar-default .navbar-link {
-  color: #777777;
-}
-.navbar-default .navbar-link:hover {
-  color: #333333;
-}
-.navbar-default .btn-link {
-  color: #777777;
-}
-.navbar-default .btn-link:hover,
-.navbar-default .btn-link:focus {
-  color: #333333;
-}
-.navbar-default .btn-link[disabled]:hover,
-fieldset[disabled] .navbar-default .btn-link:hover,
-.navbar-default .btn-link[disabled]:focus,
-fieldset[disabled] .navbar-default .btn-link:focus {
-  color: #cccccc;
-}
-.navbar-inverse {
-  background-color: #222222;
-  border-color: #080808;
-}
-.navbar-inverse .navbar-brand {
-  color: #9d9d9d;
-}
-.navbar-inverse .navbar-brand:hover,
-.navbar-inverse .navbar-brand:focus {
-  color: #ffffff;
-  background-color: transparent;
-}
-.navbar-inverse .navbar-text {
-  color: #9d9d9d;
-}
-.navbar-inverse .navbar-nav > li > a {
-  color: #9d9d9d;
-}
-.navbar-inverse .navbar-nav > li > a:hover,
-.navbar-inverse .navbar-nav > li > a:focus {
-  color: #ffffff;
-  background-color: transparent;
-}
-.navbar-inverse .navbar-nav > .active > a,
-.navbar-inverse .navbar-nav > .active > a:hover,
-.navbar-inverse .navbar-nav > .active > a:focus {
-  color: #ffffff;
-  background-color: #080808;
-}
-.navbar-inverse .navbar-nav > .disabled > a,
-.navbar-inverse .navbar-nav > .disabled > a:hover,
-.navbar-inverse .navbar-nav > .disabled > a:focus {
-  color: #444444;
-  background-color: transparent;
-}
-.navbar-inverse .navbar-toggle {
-  border-color: #333333;
-}
-.navbar-inverse .navbar-toggle:hover,
-.navbar-inverse .navbar-toggle:focus {
-  background-color: #333333;
-}
-.navbar-inverse .navbar-toggle .icon-bar {
-  background-color: #ffffff;
-}
-.navbar-inverse .navbar-collapse,
-.navbar-inverse .navbar-form {
-  border-color: #101010;
-}
-.navbar-inverse .navbar-nav > .open > a,
-.navbar-inverse .navbar-nav > .open > a:hover,
-.navbar-inverse .navbar-nav > .open > a:focus {
-  background-color: #080808;
-  color: #ffffff;
-}
-@media (max-width: 767px) {
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
-    border-color: #080808;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
-    background-color: #080808;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
-    color: #9d9d9d;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
-    color: #ffffff;
-    background-color: transparent;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
-    color: #ffffff;
-    background-color: #080808;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
-    color: #444444;
-    background-color: transparent;
-  }
-}
-.navbar-inverse .navbar-link {
-  color: #9d9d9d;
-}
-.navbar-inverse .navbar-link:hover {
-  color: #ffffff;
-}
-.navbar-inverse .btn-link {
-  color: #9d9d9d;
-}
-.navbar-inverse .btn-link:hover,
-.navbar-inverse .btn-link:focus {
-  color: #ffffff;
-}
-.navbar-inverse .btn-link[disabled]:hover,
-fieldset[disabled] .navbar-inverse .btn-link:hover,
-.navbar-inverse .btn-link[disabled]:focus,
-fieldset[disabled] .navbar-inverse .btn-link:focus {
-  color: #444444;
-}
-.clearfix:before,
-.clearfix:after,
-.dl-horizontal dd:before,
-.dl-horizontal dd:after,
-.container:before,
-.container:after,
-.container-fluid:before,
-.container-fluid:after,
-.row:before,
-.row:after,
-.form-horizontal .form-group:before,
-.form-horizontal .form-group:after,
-.nav:before,
-.nav:after,
-.navbar:before,
-.navbar:after,
-.navbar-header:before,
-.navbar-header:after,
-.navbar-collapse:before,
-.navbar-collapse:after {
-  content: " ";
-  display: table;
-}
-.clearfix:after,
-.dl-horizontal dd:after,
-.container:after,
-.container-fluid:after,
-.row:after,
-.form-horizontal .form-group:after,
-.nav:after,
-.navbar:after,
-.navbar-header:after,
-.navbar-collapse: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;
-}
-.invisible {
-  visibility: hidden;
-}
-.text-hide {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-.hidden {
-  display: none !important;
-}
-.affix {
-  position: fixed;
-}
-@-ms-viewport {
-  width: device-width;
-}
-.visible-xs,
-.visible-sm,
-.visible-md,
-.visible-lg {
-  display: none !important;
-}
-.visible-xs-block,
-.visible-xs-inline,
-.visible-xs-inline-block,
-.visible-sm-block,
-.visible-sm-inline,
-.visible-sm-inline-block,
-.visible-md-block,
-.visible-md-inline,
-.visible-md-inline-block,
-.visible-lg-block,
-.visible-lg-inline,
-.visible-lg-inline-block {
-  display: none !important;
-}
-@media (max-width: 767px) {
-  .visible-xs {
-    display: block !important;
-  }
-  table.visible-xs {
-    display: table !important;
-  }
-  tr.visible-xs {
-    display: table-row !important;
-  }
-  th.visible-xs,
-  td.visible-xs {
-    display: table-cell !important;
-  }
-}
-@media (max-width: 767px) {
-  .visible-xs-block {
-    display: block !important;
-  }
-}
-@media (max-width: 767px) {
-  .visible-xs-inline {
-    display: inline !important;
-  }
-}
-@media (max-width: 767px) {
-  .visible-xs-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm {
-    display: block !important;
-  }
-  table.visible-sm {
-    display: table !important;
-  }
-  tr.visible-sm {
-    display: table-row !important;
-  }
-  th.visible-sm,
-  td.visible-sm {
-    display: table-cell !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm-block {
-    display: block !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm-inline {
-    display: inline !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md {
-    display: block !important;
-  }
-  table.visible-md {
-    display: table !important;
-  }
-  tr.visible-md {
-    display: table-row !important;
-  }
-  th.visible-md,
-  td.visible-md {
-    display: table-cell !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md-block {
-    display: block !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md-inline {
-    display: inline !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg {
-    display: block !important;
-  }
-  table.visible-lg {
-    display: table !important;
-  }
-  tr.visible-lg {
-    display: table-row !important;
-  }
-  th.visible-lg,
-  td.visible-lg {
-    display: table-cell !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg-block {
-    display: block !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg-inline {
-    display: inline !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (max-width: 767px) {
-  .hidden-xs {
-    display: none !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .hidden-sm {
-    display: none !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .hidden-md {
-    display: none !important;
-  }
-}
-@media (min-width: 1200px) {
-  .hidden-lg {
-    display: none !important;
-  }
-}
-.visible-print {
-  display: none !important;
-}
-@media print {
-  .visible-print {
-    display: block !important;
-  }
-  table.visible-print {
-    display: table !important;
-  }
-  tr.visible-print {
-    display: table-row !important;
-  }
-  th.visible-print,
-  td.visible-print {
-    display: table-cell !important;
-  }
-}
-.visible-print-block {
-  display: none !important;
-}
-@media print {
-  .visible-print-block {
-    display: block !important;
-  }
-}
-.visible-print-inline {
-  display: none !important;
-}
-@media print {
-  .visible-print-inline {
-    display: inline !important;
-  }
-}
-.visible-print-inline-block {
-  display: none !important;
-}
-@media print {
-  .visible-print-inline-block {
-    display: inline-block !important;
-  }
-}
-@media print {
-  .hidden-print {
-    display: none !important;
-  }
-}
-.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: #777777;
-  -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%;
-}
-.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: 0.3s;
-  animation-delay: 0.3s;
-}
-.loader.sk-folding-cube .sk-cube3:before {
-  -webkit-animation-delay: 0.6s;
-  animation-delay: 0.6s;
-}
-.loader.sk-folding-cube .sk-cube4:before {
-  -webkit-animation-delay: 0.9s;
-  animation-delay: 0.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(0deg);
-    transform: perspective(140px) rotateX(0deg);
-    opacity: 1;
-  }
-  90%,
-  100% {
-    -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(0deg);
-    transform: perspective(140px) rotateX(0deg);
-    opacity: 1;
-  }
-  90%,
-  100% {
-    -webkit-transform: perspective(140px) rotateY(180deg);
-    transform: perspective(140px) rotateY(180deg);
-    opacity: 0;
-  }
-}
-.navbar .navbar-full .navbar-brand > * {
-  display: inline-block;
-}
-.navbar .navbar-full .navbar-brand img {
-  height: 16px;
-}
-/*
-Just a note about using Material Icons
-*/
-@font-face {
-  font-family: 'Material Icons';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fonts/MaterialIcons-Regular.eot);
-  /* For IE6-8 */
-  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: normal;
-  font-style: normal;
-  display: inline-block;
-  width: 1em;
-  height: 1em;
-  line-height: 1;
-  text-align: center;
-  text-transform: none;
-  letter-spacing: normal;
-  vertical-align: middle;
-  /* Support for all WebKit browsers. */
-  -webkit-font-smoothing: antialiased;
-  /* Support for Safari and Chrome. */
-  text-rendering: optimizeLegibility;
-  /* Support for Firefox. */
-  -moz-osx-font-smoothing: grayscale;
-  /* Support for IE. */
-  font-feature-settings: 'liga';
-}
-@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}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}.nav>li,.nav>li>a,.navbar{position:relative}.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}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default.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}.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}.nav{padding-left:0;list-style:none}.nav>li{display:block}.nav>li>a{display:block;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{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 (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}@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}.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-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}.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}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;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-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}.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,.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,.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;color:transparent;text-shadow:none;background-color:transparent;border:0}.affix{position:fixed}@-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}}.material-icon,.navbar .navbar-full .navbar-brand>*{display:inline-block}.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%}.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}}.navbar .navbar-full .navbar-brand img{height:16px}@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'}@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}}

+ 272 - 276
misago/static/misago/js/misago.js

@@ -4,7 +4,6 @@
   'use strict';
   'use strict';
 
 
   window.Misago = function() {
   window.Misago = function() {
-
     var ns = Object.getPrototypeOf(this);
     var ns = Object.getPrototypeOf(this);
     var self = this;
     var self = this;
 
 
@@ -14,17 +13,6 @@
       SETTINGS: {}
       SETTINGS: {}
     };
     };
 
 
-    // Services
-    this._services = [];
-    this.addService = function(name, factory, order) {
-      this._services.push({
-        name: name,
-        item: factory,
-        after: this.get(order, 'after'),
-        before: this.get(order, 'before')
-      });
-    };
-
     this._initServices = function(services) {
     this._initServices = function(services) {
       var orderedServices = new ns.OrderedList(services).order(false);
       var orderedServices = new ns.OrderedList(services).order(false);
       orderedServices.forEach(function (item) {
       orderedServices.forEach(function (item) {
@@ -37,7 +25,7 @@
 
 
         var serviceInstance = factory(self);
         var serviceInstance = factory(self);
         if (serviceInstance) {
         if (serviceInstance) {
-          self[item.name] = serviceInstance;
+          self[item.key] = serviceInstance;
         }
         }
       });
       });
     };
     };
@@ -52,20 +40,6 @@
       });
       });
     };
     };
 
 
-    this.registerCoreServices = function() {
-      this.addService('conf', ns.Conf);
-      this.addService('moment-locale', ns.setMomentLocale);
-      this.addService('component', ns.ComponentFactory);
-      this.addService('router', ns.RouterFactory);
-      this.addService('ajax', ns.AjaxFactory);
-      this.addService('api', ns.ApiFactory);
-      this.addService('runloop', ns.RunLoopFactory);
-      this.addService('tick', ns.startTick);
-      this.addService('outlet', ns.OutletFactory);
-      this.addService('title', ns.PageTitle);
-      this.addService('start-routing', ns.startRouting);
-    };
-
     // App init/destory
     // App init/destory
     this.setup = false;
     this.setup = false;
     this.init = function(setup) {
     this.init = function(setup) {
@@ -74,18 +48,258 @@
         inTest: ns.get(setup, 'inTest', false)
         inTest: ns.get(setup, 'inTest', false)
       };
       };
 
 
-      this._initServices(this._services);
+      this._initServices(ns._services);
     };
     };
 
 
     this.destroy = function() {
     this.destroy = function() {
-      this._destroyServices();
+      this._destroyServices(ns._services);
     };
     };
   };
   };
+
+
+  // Services
+  var proto = window.Misago.prototype
+  proto._services = [];
+
+  proto.addService = function(name, factory, order) {
+    Misago.prototype._services.push({
+      key: name,
+      item: factory,
+      after: proto.get(order, 'after'),
+      before: proto.get(order, 'before')
+    });
+  };
 }());
 }());
 
 
 (function (Misago) {
 (function (Misago) {
   'use strict';
   'use strict';
 
 
+  Misago.has = function(obj, key) {
+    if (obj !== undefined) {
+      return obj.hasOwnProperty(key);
+    } else {
+      return false;
+    }
+  };
+
+  Misago.get = function(obj, key, value) {
+    if (Misago.has(obj, key)) {
+      return obj[key];
+    } else if (value !== undefined) {
+      return value;
+    } else {
+      return undefined;
+    }
+  };
+
+  Misago.pop = function(obj, key, value) {
+    var returnValue = Misago.get(obj, key, value);
+    if (Misago.has(obj, key)) {
+      delete obj[key];
+    }
+    return returnValue;
+  };
+}(Misago.prototype));
+
+(function (Misago) {
+  'use strict';
+
+  Misago.OrderedList = function(items) {
+    this.isOrdered = false;
+    this._items = items || [];
+
+    this.add = function(key, item, order) {
+      this._items.push({
+        key: key,
+        item: item,
+        after: Misago.get(order, 'after'),
+        before: Misago.get(order, 'before')
+      });
+    };
+
+    this.get = function(key, value) {
+      for (var i = 0; i < this._items.length; i++) {
+        if (this._items[i].key === key) {
+          return this._items[i].item;
+        }
+      }
+
+      return value;
+    };
+
+    this.has = function(key) {
+      return this.get(key) !== undefined;
+    };
+
+    this.values = function() {
+      var values = [];
+      for (var i = 0; i < this._items.length; i++) {
+        values.push(this._items[i].item);
+      }
+      return values;
+    };
+
+    this.order = function(values_only) {
+      if (!this.isOrdered) {
+        this._items = this._order(this._items);
+        this.isOrdered = true;
+      }
+
+      if (values_only || typeof values_only === 'undefined') {
+        return this.values();
+      } else {
+        return this._items;
+      }
+    };
+
+    this._order = function(unordered) {
+      // Index of unordered items
+      var index = [];
+      unordered.forEach(function (item) {
+        index.push(item.key);
+      });
+
+      // Ordered items
+      var ordered = [];
+      var ordering = [];
+
+      // First pass: register items that
+      // don't specify their order
+      unordered.forEach(function (item) {
+        if (!item.after && !item.before) {
+          ordered.push(item);
+          ordering.push(item.key);
+        }
+      });
+
+      // Second pass: register items that
+      // specify their before to "_end"
+      unordered.forEach(function (item) {
+        if (item.before === "_end") {
+          ordered.push(item);
+          ordering.push(item.key);
+        }
+      });
+
+      // Third pass: keep iterating items
+      // until we hit iterations limit or finish
+      // ordering list
+      function insertItem(item) {
+        var insertAt = -1;
+        if (ordering.indexOf(item.key) === -1) {
+          if (item.after) {
+            insertAt = ordering.indexOf(item.after);
+            if (insertAt !== -1) {
+              insertAt += 1;
+            }
+          } else if (item.before) {
+            insertAt = ordering.indexOf(item.before);
+          }
+
+          if (insertAt !== -1) {
+            ordered.splice(insertAt, 0, item);
+            ordering.splice(insertAt, 0, item.key);
+          }
+        }
+      }
+
+      var iterations = 200;
+      while (iterations > 0 && index.length !== ordering.length) {
+        iterations -= 1;
+        unordered.forEach(insertItem);
+      }
+
+      return ordered;
+    };
+  };
+} (Misago.prototype));
+
+(function (Misago) {
+  Misago.deserializeDatetime = function(deserialized) {
+    return deserialized ? moment(deserialized) : null;
+  };
+
+  Misago.serializeDatetime = function(serialized) {
+    return serialized ? serialized.format() : null;
+  };
+} (Misago.prototype));
+
+(function (Misago) {
+  'use strict';
+
+  Misago.startsWith = function(string, beginning) {
+    return string.indexOf(beginning) === 0;
+  };
+
+  Misago.endsWith = function(string, tail) {
+    return string.indexOf(tail, string.length - tail.length) !== -1;
+  };
+}(Misago.prototype));
+
+(function (Misago) {
+  'use strict';
+
+  Misago.UrlConfInvalidComponentError = function(name) {
+    this.message = "route's " + name + " component should be an array or object";
+
+    this.toString = function() {
+      return this.message;
+    };
+  };
+
+  Misago.UrlConf = function() {
+    var self = this;
+    this._patterns = [];
+
+    this.patterns = function() {
+      return this._patterns;
+    };
+
+    var prefixPattern = function(prefix, pattern) {
+      return (prefix + pattern).replace('//', '/');
+    };
+
+    var include = function(prefix, patterns) {
+      for (var i = 0; i < patterns.length; i ++) {
+        self.url(prefixPattern(prefix, patterns[i].pattern),
+                 patterns[i].component,
+                 patterns[i].name);
+      }
+    };
+
+    this.url = function(pattern, component, name) {
+      if (typeof component !== 'object') {
+        throw new Misago.UrlConfInvalidComponentError(name);
+      }
+
+      if (pattern === '') {
+        pattern = '/';
+      }
+
+      if (component instanceof Misago.UrlConf) {
+        include(pattern, component.patterns());
+      } else {
+        this._patterns.push({
+          pattern: pattern,
+          component: component,
+          name: name
+        });
+      }
+    };
+  };
+} (Misago.prototype));
+
+(function (Misago) {
+  'use strict';
+
+  Misago.loadingPage = function(_) {
+    return m('.page.page-loading', _.component(Misago.Loader));
+  };
+} (Misago.prototype));
+
+(function (Misago) {
+  'use strict';
+
   var Ajax = function(_) {
   var Ajax = function(_) {
     var cookieRegex = new RegExp(_.context.CSRF_COOKIE_NAME + '\=([^;]*)');
     var cookieRegex = new RegExp(_.context.CSRF_COOKIE_NAME + '\=([^;]*)');
     this.csrfToken = Misago.get(document.cookie.match(cookieRegex), 0).split('=')[1];
     this.csrfToken = Misago.get(document.cookie.match(cookieRegex), 0).split('=')[1];
@@ -156,9 +370,9 @@
     };
     };
   };
   };
 
 
-  Misago.AjaxFactory = function(_) {
+  Misago.addService('ajax', function(_) {
     return new Ajax(_);
     return new Ajax(_);
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));
 
 
 (function (Misago) {
 (function (Misago) {
@@ -185,15 +399,15 @@
     };
     };
   };
   };
 
 
-  Misago.ApiFactory = function(_) {
+  Misago.addService('api', function(_) {
     return new Api(_);
     return new Api(_);
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));
 
 
 (function (Misago) {
 (function (Misago) {
   'use strict';
   'use strict';
 
 
-  Misago.ComponentFactory = function(_) {
+  Misago.addService('components-factory', function(_) {
     // Component factory
     // Component factory
     _.component = function() {
     _.component = function() {
       var argumentsArray = [];
       var argumentsArray = [];
@@ -204,29 +418,21 @@
       argumentsArray.push(_);
       argumentsArray.push(_);
       return m.component.apply(undefined, argumentsArray);
       return m.component.apply(undefined, argumentsArray);
     };
     };
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));
 
 
 (function (Misago) {
 (function (Misago) {
   'use strict';
   'use strict';
 
 
-  Misago.Conf = function(_) {
+  Misago.addService('conf', function(_) {
     _.settings = Misago.get(_.context, 'SETTINGS', {});
     _.settings = Misago.get(_.context, 'SETTINGS', {});
-  };
-}(Misago.prototype));
-
-(function (Misago) {
-  'use strict';
-
-  Misago.setMomentLocale = function() {
-    moment.locale($('html').attr('lang'));
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));
 
 
 (function (Misago) {
 (function (Misago) {
   'use strict';
   'use strict';
 
 
-  Misago.OutletFactory = {
+  Misago.addService('forum-layout', {
     factory: function(_) {
     factory: function(_) {
       if (_.setup.fixture) {
       if (_.setup.fixture) {
         m.mount(document.getElementById(_.setup.fixture),
         m.mount(document.getElementById(_.setup.fixture),
@@ -239,7 +445,15 @@
         m.mount(_.setup.fixture, null);
         m.mount(_.setup.fixture, null);
       }
       }
     }
     }
-  };
+  }, {before: 'start-routing'});
+}(Misago.prototype));
+
+(function (Misago) {
+  'use strict';
+
+  Misago.addService('set-momentjs-locale', function() {
+    moment.locale($('html').attr('lang'));
+  });
 }(Misago.prototype));
 }(Misago.prototype));
 
 
 (function (Misago) {
 (function (Misago) {
@@ -486,14 +700,14 @@
     };
     };
   };
   };
 
 
-  Misago.RouterFactory = function(_) {
+  Misago.addService('router', function(_) {
     return new Router(_);
     return new Router(_);
-  };
+  });
 
 
-  Misago.startRouting = function(_) {
+  Misago.addService('start-routing', function(_) {
     _.router.startRouting(Misago.urls, document.getElementById('router-fixture'));
     _.router.startRouting(Misago.urls, document.getElementById('router-fixture'));
     _.router.delegateClicks(document.getElementById(_.setup.fixture));
     _.router.delegateClicks(document.getElementById(_.setup.fixture));
-  };
+  }, {before: '_end'});
 }(Misago.prototype));
 }(Misago.prototype));
 
 
 (function (Misago) {
 (function (Misago) {
@@ -529,7 +743,7 @@
     };
     };
   };
   };
 
 
-  Misago.RunLoopFactory = {
+  Misago.addService('runloop', {
     factory: function(_) {
     factory: function(_) {
       return new RunLoop(_);
       return new RunLoop(_);
     },
     },
@@ -537,26 +751,26 @@
     destroy: function(_) {
     destroy: function(_) {
       _.runloop.stop();
       _.runloop.stop();
     }
     }
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));
 
 
 (function (Misago) {
 (function (Misago) {
   'use strict';
   'use strict';
 
 
-  Misago.startTick = function(_) {
+  Misago.addService('start-tick', function(_) {
     _.runloop.run(function() {
     _.runloop.run(function() {
       m.startComputation();
       m.startComputation();
       // just tick once a minute so stuff gets rerendered
       // just tick once a minute so stuff gets rerendered
       // syncing dynamic timestamps, etc ect
       // syncing dynamic timestamps, etc ect
       m.endComputation();
       m.endComputation();
     }, 'tick', 60000);
     }, 'tick', 60000);
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));
 
 
 (function (Misago) {
 (function (Misago) {
   'use strict';
   'use strict';
 
 
-  Misago.PageTitle = function(_) {
+  Misago.addService('page-title', function(_) {
     _._setTitle = function(title) {
     _._setTitle = function(title) {
       if (typeof title === 'string') {
       if (typeof title === 'string') {
         title = {title: title};
         title = {title: title};
@@ -582,7 +796,7 @@
         document.title = this.settings.forum_name;
         document.title = this.settings.forum_name;
       }
       }
     };
     };
-  };
+  });
 }(Misago.prototype));
 }(Misago.prototype));
 
 
 (function (Misago) {
 (function (Misago) {
@@ -926,8 +1140,7 @@
       }
       }
 
 
       desktopNavbar.push(m('ul.nav.navbar-nav', [
       desktopNavbar.push(m('ul.nav.navbar-nav', [
-        m('li', m("a", {config: m.route, href: _.router.url('index')}, 'Index')),
-        m('li', m("a", {config: m.route, href: _.router.url('test')}, 'Test'))
+        m('li', m("a", {config: m.route, href: _.router.url('index')}, 'Index'))
       ]));
       ]));
 
 
       return m('nav.navbar.navbar-default.navbar-static-top[role="navigation"]', [
       return m('nav.navbar.navbar-default.navbar-static-top[role="navigation"]', [
@@ -1006,223 +1219,6 @@
   };
   };
 }(Misago.prototype));
 }(Misago.prototype));
 
 
-(function (Misago) {
-  'use strict';
-
-  Misago.has = function(obj, key) {
-    if (obj !== undefined) {
-      return obj.hasOwnProperty(key);
-    } else {
-      return false;
-    }
-  };
-
-  Misago.get = function(obj, key, value) {
-    if (Misago.has(obj, key)) {
-      return obj[key];
-    } else if (value !== undefined) {
-      return value;
-    } else {
-      return undefined;
-    }
-  };
-
-  Misago.pop = function(obj, key, value) {
-    var returnValue = Misago.get(obj, key, value);
-    if (Misago.has(obj, key)) {
-      delete obj[key];
-    }
-    return returnValue;
-  };
-}(Misago.prototype));
-
-(function (Misago) {
-  'use strict';
-
-  Misago.OrderedList = function(items) {
-    this.isOrdered = false;
-    this._items = items || [];
-
-    this.add = function(key, item, order) {
-      this._items.push({
-        key: key,
-        item: item,
-        after: Misago.get(order, 'after'),
-        before: Misago.get(order, 'before')
-      });
-    };
-
-    this.get = function(key, value) {
-      for (var i = 0; i < this._items.length; i++) {
-        if (this._items[i].key === key) {
-          return this._items[i].item;
-        }
-      }
-
-      return value;
-    };
-
-    this.has = function(key) {
-      return this.get(key) !== undefined;
-    };
-
-    this.values = function() {
-      var values = [];
-      for (var i = 0; i < this._items.length; i++) {
-        values.push(this._items[i].item);
-      }
-      return values;
-    };
-
-    this.order = function(values_only) {
-      if (!this.isOrdered) {
-        this._items = this._order(this._items);
-        this.isOrdered = true;
-      }
-
-      if (values_only || typeof values_only === 'undefined') {
-        return this.values();
-      } else {
-        return this._items;
-      }
-    };
-
-    this._order = function(unordered) {
-      // Index of unordered items
-      var index = [];
-      unordered.forEach(function (item) {
-        index.push(item.key);
-      });
-
-      // Ordered items
-      var ordered = [];
-      var ordering = [];
-
-      // First pass: register items that
-      // don't specify their order
-      unordered.forEach(function (item) {
-        if (!item.after && !item.before) {
-          ordered.push(item);
-          ordering.push(item.key);
-        }
-      });
-
-      // Second pass: keep iterating items
-      // until we hit iterations limit or finish
-      // ordering list
-      function insertItem(item) {
-        var insertAt = -1;
-        if (ordering.indexOf(item.key) === -1) {
-          if (item.after) {
-            insertAt = ordering.indexOf(item.after);
-            if (insertAt !== -1) {
-              insertAt += 1;
-            }
-          } else if (item.before) {
-            insertAt = ordering.indexOf(item.before);
-          }
-
-          if (insertAt !== -1) {
-            ordered.splice(insertAt, 0, item);
-            ordering.splice(insertAt, 0, item.key);
-          }
-        }
-      }
-
-      var iterations = 200;
-      while (iterations > 0 && index.length !== ordering.length) {
-        iterations -= 1;
-        unordered.forEach(insertItem);
-      }
-
-      return ordered;
-    };
-  };
-} (Misago.prototype));
-
-(function (Misago) {
-  Misago.deserializeDatetime = function(deserialized) {
-    return deserialized ? moment(deserialized) : null;
-  };
-
-  Misago.serializeDatetime = function(serialized) {
-    return serialized ? serialized.format() : null;
-  };
-} (Misago.prototype));
-
-(function (Misago) {
-  'use strict';
-
-  Misago.startsWith = function(string, beginning) {
-    return string.indexOf(beginning) === 0;
-  };
-
-  Misago.endsWith = function(string, tail) {
-    return string.indexOf(tail, string.length - tail.length) !== -1;
-  };
-}(Misago.prototype));
-
-(function (Misago) {
-  'use strict';
-
-  Misago.UrlConfInvalidComponentError = function(name) {
-    this.message = "route's " + name + " component should be an array or object";
-
-    this.toString = function() {
-      return this.message;
-    };
-  };
-
-  Misago.UrlConf = function() {
-    var self = this;
-    this._patterns = [];
-
-    this.patterns = function() {
-      return this._patterns;
-    };
-
-    var prefixPattern = function(prefix, pattern) {
-      return (prefix + pattern).replace('//', '/');
-    };
-
-    var include = function(prefix, patterns) {
-      for (var i = 0; i < patterns.length; i ++) {
-        self.url(prefixPattern(prefix, patterns[i].pattern),
-                 patterns[i].component,
-                 patterns[i].name);
-      }
-    };
-
-    this.url = function(pattern, component, name) {
-      if (typeof component !== 'object') {
-        throw new Misago.UrlConfInvalidComponentError(name);
-      }
-
-      if (pattern === '') {
-        pattern = '/';
-      }
-
-      if (component instanceof Misago.UrlConf) {
-        include(pattern, component.patterns());
-      } else {
-        this._patterns.push({
-          pattern: pattern,
-          component: component,
-          name: name
-        });
-      }
-    };
-  };
-} (Misago.prototype));
-
-(function (Misago) {
-  'use strict';
-
-  Misago.loadingPage = function(_) {
-    return m('.page.page-loading', _.component(Misago.Loader));
-  };
-} (Misago.prototype));
-
 (function (Misago, UrlConf) {
 (function (Misago, UrlConf) {
   'use strict';
   'use strict';
 
 

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

@@ -1 +1 @@
-{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","context","SETTINGS","_services","addService","name","factory","order","push","item","after","get","before","_initServices","services","orderedServices","OrderedList","forEach","undefined","serviceInstance","_destroyServices","reverse","destroy","registerCoreServices","Conf","ComponentFactory","RouterFactory","AjaxFactory","ApiFactory","RunLoopFactory","startTick","OutletFactory","PageTitle","startRouting","setup","init","fixture","inTest","Ajax","_","cookieRegex","RegExp","CSRF_COOKIE_NAME","csrfToken","document","cookie","match","split","runningGets","ajax","method","url","data","progress","promise","m","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","pop","resolve","error","jqXHR","rejection","responseJSON","status","statusText","reject","$","preloaded","post","prototype","Api","buildUrl","model","call","querystrings","router","baseUrl","one","id","many","filters","target","component","argumentsArray","i","arguments","length","apply","settings","mount","getElementById","ForumLayout","noop","route","isActive","__controller","controller","__onunload","onunload","vm","__init","initArgs","then","ondata","finalArgs","f","container","errorPage","loading","Loader","__view","view","isReady","Router","attr","staticUrl","mediaUrl","urls","reverses","routedComponent","populatePatterns","urlconf","patterns","finalPattern","pattern","replace","mode","delegateElement","delegateName","cleanUrl","isRelative","substr","location","protocol","host","avatarsUrl","delegateClicks","element","on","e","href","preventDefault","off","prefixUrl","prefix","error403","ban","ErrorBannedRoute","message","detail","Ban","deserialize","Error403Route","error404","Error404Route","error500","Error500Route","error0","Error0Route","RunLoop","_intervals","run","callable","delay","setTimeout","result","runOnce","stop","hasOwnProperty","clearTimeout","runloop","startComputation","console","log","endComputation","_setTitle","title","completeTitle","page","interpolate","gettext","parent","forum_name","setTitle","html","plain","expires_on","deserializeDatetime","error_message","help","code","icon","trust","expirationMessage","isAfter","moment","fromNow","IndexRoute","forum_index_title","count","prop","increment","ctrl","onclick","legalPageFactory","typeName","defaultTitle","dashedTypeName","api","body","PageHeader","TermsOfServiceRoute","PrivacyPolicyRoute","legalLink","legalType","FooterNav","isVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","indexOf","items","ForumFooter","nav","FooterMisagoBranding","BrandFull","branding","children","src","alt","ForumNavbar","desktopNavbar","forum_branding_display","forum_branding_text","config","persistent","el","isInit","retain","LoadingPage","setupMarkup","MisagoMarkup","content","options","has","obj","key","value","returnValue","isOrdered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","ordered","splice","index","iterations","deserialized","serializeDatetime","serialized","format","startsWith","string","beginning","endsWith","tail","UrlConfInvalidComponentError","toString","UrlConf","_patterns","prefixPattern","include","loadingPage"],"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\n    var ns = Object.getPrototypeOf(this);\n    var self = this;\n\n    // Context data\n    this.context = {\n      // Empty settings\n      SETTINGS: {}\n    };\n\n    // Services\n    this._services = [];\n    this.addService = function(name, factory, order) {\n      this._services.push({\n        name: name,\n        item: factory,\n        after: this.get(order, 'after'),\n        before: this.get(order, 'before')\n      });\n    };\n\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.name] = 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    this.registerCoreServices = function() {\n      this.addService('conf', ns.Conf);\n      this.addService('component', ns.ComponentFactory);\n      this.addService('router', ns.RouterFactory);\n      this.addService('ajax', ns.AjaxFactory);\n      this.addService('api', ns.ApiFactory);\n      this.addService('runloop', ns.RunLoopFactory);\n      this.addService('tick', ns.startTick);\n      this.addService('outlet', ns.OutletFactory);\n      this.addService('title', ns.PageTitle);\n      this.addService('start-routing', ns.startRouting);\n    };\n\n    // App init/destory\n    this.setup = false;\n    this.init = function(setup) {\n      this.setup = {\n        fixture: ns.get(setup, 'fixture', null),\n        inTest: ns.get(setup, 'inTest', false)\n      };\n\n      this._initServices(this._services);\n    };\n\n    this.destroy = function() {\n      this._destroyServices();\n    };\n  };\n}());\n\n(function (Misago) {\n  'use strict';\n\n  var Ajax = function(_) {\n    var cookieRegex = new RegExp(_.context.CSRF_COOKIE_NAME + '\\=([^;]*)');\n    this.csrfToken = Misago.get(document.cookie.match(cookieRegex), 0).split('=')[1];\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) {\n      return this.ajax('POST', url);\n    };\n  };\n\n  Misago.AjaxFactory = function(_) {\n    return new Ajax(_);\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var Api = function(_) {\n    this.buildUrl = function(model, call, querystrings) {\n      var url = _.router.baseUrl;\n      url += 'api/' + model + '/';\n      return url;\n    };\n\n    this.one = function(model, id) {\n      var url = this.buildUrl(model) + id + '/';\n      return _.ajax.get(url);\n    };\n\n    this.many = function(model, filters) {\n\n    };\n\n    this.call = function(model, target, call, data) {\n\n    };\n  };\n\n  Misago.ApiFactory = function(_) {\n    return new Api(_);\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.ComponentFactory = function(_) {\n    // Component factory\n    _.component = function() {\n      var argumentsArray = [];\n      for (var i = 0; i < arguments.length; i += 1) {\n        argumentsArray.push(arguments[i]);\n      }\n\n      argumentsArray.push(_);\n      return m.component.apply(undefined, argumentsArray);\n    };\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.Conf = function(_) {\n    _.settings = Misago.get(_.context, 'SETTINGS', {});\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.OutletFactory = {\n    factory: function(_) {\n      if (_.setup.fixture) {\n        m.mount(document.getElementById(_.setup.fixture),\n                _.component(Misago.ForumLayout));\n      }\n    },\n\n    destroy: function(_) {\n      if (_.setup.fixture) {\n        m.mount(_.setup.fixture, null);\n      }\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var noop = function() {};\n\n  Misago.route = function(component) {\n    /*\n      Boilerplate for Misago top-level components\n    */\n\n    // Component 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      // 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              component.container.router.errorPage(error);\n            }\n          });\n        }\n      };\n\n      // setup default loading view\n      if (!component.loading) {\n        component.loading = function () {\n          var _ = this.container;\n          return m('.page.page-loading',\n            _.component(Misago.Loader)\n          );\n        };\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\n    return component;\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 routedComponent = function(component) {\n      component.container = _;\n      return component;\n    };\n\n    var populatePatterns = function(urlconf) {\n      urlconf.patterns().forEach(function(url) {\n        // set service container on component\n\n        var finalPattern = self.baseUrl + url.pattern;\n        finalPattern = finalPattern.replace('//', '/');\n\n        self.urls[finalPattern] = routedComponent(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      m.route.mode = 'pathname';\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    this.delegateName = 'click.misago-router';\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    this.delegateClicks = function(element) {\n      this.delegateElement = element;\n      $(this.delegateElement).on(this.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(this.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 = routedComponent(Misago.ErrorBannedRoute);\n        component.error = {\n          message: error.detail,\n          ban: Misago.Ban.deserialize(error.ban)\n        };\n      } else {\n        component = routedComponent(Misago.Error403Route);\n        component.error = error.detail;\n      }\n\n      m.mount(this.fixture, component);\n    };\n\n    this.error404 = function() {\n      m.mount(this.fixture, routedComponent(Misago.Error404Route));\n    };\n\n    this.error500 = function() {\n      m.mount(this.fixture, routedComponent(Misago.Error500Route));\n    };\n\n    this.error0 = function() {\n      m.mount(this.fixture, routedComponent(Misago.Error0Route));\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.RouterFactory = function(_) {\n    return new Router(_);\n  };\n\n  Misago.startRouting = function(_) {\n    _.router.startRouting(Misago.urls, document.getElementById('router-fixture'));\n    _.router.delegateClicks(document.getElementById(_.setup.fixture));\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    this.run = function(callable, name, delay) {\n      this._intervals[name] = window.setTimeout(function() {\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        callable(_);\n      }, delay);\n    };\n\n    this.stop = function() {\n      for (var name in this._intervals) {\n        if (this._intervals.hasOwnProperty(name)) {\n          window.clearTimeout(this._intervals[name]);\n          delete this._intervals[name];\n        }\n      }\n    };\n  };\n\n  Misago.RunLoopFactory = {\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.startTick = function(_) {\n    _.runloop.run(function() {\n      m.startComputation();\n      // just tick!\n      console.log('tick!');\n      m.endComputation();\n    }, 60000);\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.PageTitle = function(_) {\n    _._setTitle = 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        completeTitle += ' (' + interpolate(gettext('page %(page)s'), { page:title.page }, true) + ')';\n      }\n\n      if (typeof title.parent !== 'undefined') {\n        completeTitle += ' | ' + title.parent;\n      }\n\n      document.title = completeTitle + ' | ' + this.settings.forum_name;\n    };\n\n    _.setTitle = function(title) {\n      if (title) {\n        this._setTitle(title);\n      } else {\n        document.title = this.settings.forum_name;\n      }\n    };\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.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  Misago.Ban.deserialize = function(data) {\n    data.expires_on = Misago.deserializeDatetime(data.expires_on);\n\n    return new Misago.Ban(data);\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  Misago.ErrorBannedRoute = Misago.route({\n    controller: function() {\n      this.container.setTitle(gettext('You are banned'));\n    },\n    error: null,\n    view: function() {\n      var error_message = [];\n      if (this.error.ban.message.html) {\n        error_message.push(m('.lead', m.trust(this.error.ban.message.html)));\n      } else {\n        error_message.push(m('p.lead', this.error.message));\n      }\n\n      var expirationMessage = null;\n      if (this.error.ban.expires_on) {\n        console.log('new render!');\n        if (this.error.ban.expires_on.isAfter(moment())) {\n          expirationMessage = interpolate(\n            gettext('This ban expires %(expires_on)s.'),\n            { 'expires_on': this.error.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  Misago.Error403Route = Misago.route({\n    controller: function() {\n      this.container.setTitle(gettext('Page not available'));\n    },\n    error: null,\n    view: function() {\n      return errorPage({\n        code: 403,\n        icon: 'remove_circle_outline',\n        message: gettext(\"This page is not available.\"),\n        help: this.error || gettext(\"You don't have permission to access this page.\")\n      });\n    }\n  });\n\n  Misago.Error404Route = Misago.route({\n    controller: function() {\n      this.container.setTitle(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  Misago.Error500Route = Misago.route({\n    controller: function() {\n      this.container.setTitle(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  Misago.Error0Route = Misago.route({\n    controller: function() {\n      this.container.setTitle(gettext('Lost connection with application'));\n    },\n    view: function() {\n      return errorPage({\n        code: 500,\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 inter connection and refresh page if problem persists.\")\n      });\n    }\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.IndexRoute = Misago.route({\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      return m('.container', [\n        m('h1', ['Count: ', m('strong', ctrl.count())]),\n        m('p', 'Clicky click button to increase count!.'),\n        m('p',\n          m('button.btn.btn-primary', {onclick: ctrl.increment}, 'Clicky clicky!')\n        )\n      ]);\n    }\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 Misago.route({\n      controller: function() {\n        var _ = this.container;\n\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        isReady: false,\n        init: function(component, _) {\n          if (this.isReady) {\n            _.setTitle(this.title);\n          } else {\n            _.setTitle();\n            return _.api.one('legal-pages', dashedTypeName);\n          }\n        },\n        ondata: function(data, component, _) {\n          m.startComputation();\n\n          this.title = data.title || defaultTitle;\n          this.body = data.body;\n          this.isReady = true;\n\n          m.endComputation();\n\n          if (component.isActive) {\n            _.setTitle(data.title);\n          }\n        }\n      },\n      view: function() {\n        var _ = this.container;\n\n        return m('.page.legal-page.' + dashedTypeName + '-page', [\n          _.component(Misago.PageHeader, {title: this.vm.title}),\n          m('.container',\n            m.trust(this.vm.body)\n          )\n        ]);\n      }\n    });\n  };\n\n  Misago.TermsOfServiceRoute = legalPageFactory(\n    'terms_of_service', gettext('Terms of service'));\n  Misago.PrivacyPolicyRoute = legalPageFactory(\n    'privacy_policy', gettext('Privacy policy'));\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}, Misago.get(_.settings, legalType + '_title', defaultTitle))\n      );\n    } else {\n      return null;\n    }\n  };\n\n  Misago.FooterNav = {\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(legalLink(_, 'terms_of_service', gettext('Terms of service')));\n      items.push(legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n      return m('ul.list-inline.footer-nav', items);\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.ForumFooter = {\n    view: function(ctrl, _) {\n      var nav = null;\n      if (Misago.FooterNav.isVisible(_.settings)) {\n        nav = _.component(Misago.FooterNav);\n      }\n\n      return m('footer.forum-footer', [\n        m('.container',\n          m('.footer-content', [\n            nav,\n            _.component(Misago.FooterMisagoBranding)\n          ])\n        )\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.FooterMisagoBranding = {\n    view: function() {\n      return m('a.misago-branding[href=http://misago-project.org]', [\n        \"powered by \", m('strong', \"misago\")\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.BrandFull = {\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}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.ForumNavbar = {\n    view: function(ctrl, _) {\n      var desktopNavbar = [];\n\n      if (_.settings.forum_branding_display) {\n        desktopNavbar.push(_.component(Misago.BrandFull, _.settings.forum_branding_text));\n      }\n\n      desktopNavbar.push(m('ul.nav.navbar-nav', [\n        m('li', m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')),\n        m('li', m(\"a\", {config: m.route, href: _.router.url('test')}, 'Test'))\n      ]));\n\n      return m('nav.navbar.navbar-default.navbar-static-top[role=\"navigation\"]', [\n        m('.container.navbar-full.hidden-xs.hidden-sm', desktopNavbar)\n      ]);\n    }\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  Misago.ForumLayout = {\n    view: function(ctrl, _) {\n      return [\n        _.component(Misago.ForumNavbar),\n        m('#router-fixture', {config: persistent}),\n        _.component(Misago.ForumFooter)\n      ];\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.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.LoadingPage = {\n    view: function(ctrl, _) {\n      return m('.page.loading-page',\n        _.component(Misago.Loader)\n      );\n    }\n  };\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var setupMarkup = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  Misago.MisagoMarkup = {\n    view: function(ctrl, content) {\n      return m('article.misago-markup', {config: setupMarkup}, m.trust(content));\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.PageHeader = {\n    view: function(ctrl, options) {\n      return m('.page-header',\n        m('.container', [\n          m('h1', options.title),\n        ])\n      );\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.has = function(obj, key) {\n    if (obj !== undefined) {\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      delete obj[key];\n    }\n    return returnValue;\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: 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.deserializeDatetime = function(deserialized) {\n    return deserialized ? moment(deserialized) : null;\n  };\n\n  Misago.serializeDatetime = function(serialized) {\n    return serialized ? serialized.format() : 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.UrlConfInvalidComponentError = function(name) {\n    this.message = \"route's \" + name + \" component should be an array or object\";\n\n    this.toString = function() {\n      return this.message;\n    };\n  };\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 (typeof component !== 'object') {\n        throw new Misago.UrlConfInvalidComponentError(name);\n      }\n\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,\n          name: name\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', _.component(Misago.Loader));\n  };\n} (Misago.prototype));\n\n(function (Misago, UrlConf) {\n  'use strict';\n\n  var urls = new UrlConf();\n  urls.url('/', Misago.IndexRoute, 'index');\n\n  // Legal pages\n  urls.url('/terms-of-service/', Misago.TermsOfServiceRoute, 'terms_of_service');\n  urls.url('/privacy-policy/', Misago.PrivacyPolicyRoute, 'privacy_policy');\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","context","SETTINGS","_initServices","services","m","startComputation","orderedServices","OrderedList","order","forEach","item","factory","undefined","serviceInstance","name","endComputation","_destroyServices","reverse","destroy","setup","init","fixture","get","inTest","n","_services","addService","push","after","before","has","obj","key","hasOwnProperty","value","pop","returnValue","prototype","items","isOrdered","_items","add","i","length","values","values_only","_order","unordered","insertItem","insertAt","ordering","indexOf","ordered","splice","index","iterations","deserializeDatetime","deserialized","moment","serializeDatetime","serialized","format","startsWith","string","beginning","endsWith","tail","UrlConfInvalidComponentError","message","toString","UrlConf","_patterns","patterns","prefixPattern","prefix","pattern","replace","include","url","component","loadingPage","_","Loader","Ajax","cookieRegex","RegExp","CSRF_COOKIE_NAME","csrfToken","document","cookie","match","split","runningGets","ajax","method","data","progress","promise","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","resolve","error","jqXHR","rejection","responseJSON","status","statusText","reject","$","preloaded","post","Api","buildUrl","model","call","querystrings","router","baseUrl","one","id","many","filters","target","argumentsArray","arguments","apply","settings","mount","getElementById","ForumLayout","locale","attr","noop","route","isActive","__controller","controller","__onunload","onunload","vm","__init","initArgs","then","ondata","finalArgs","f","container","errorPage","loading","__view","view","isReady","Router","staticUrl","mediaUrl","urls","reverses","routedComponent","populatePatterns","urlconf","finalPattern","startRouting","mode","delegateElement","delegateName","cleanUrl","isRelative","substr","location","protocol","host","avatarsUrl","delegateClicks","element","on","e","href","preventDefault","off","prefixUrl","error403","ban","ErrorBannedRoute","detail","Ban","deserialize","Error403Route","error404","Error404Route","error500","Error500Route","error0","Error0Route","RunLoop","_intervals","run","callable","delay","setTimeout","result","runOnce","stop","clearTimeout","runloop","_setTitle","title","completeTitle","page","interpolate","gettext","parent","forum_name","setTitle","html","plain","expires_on","error_message","help","code","icon","trust","expirationMessage","isAfter","fromNow","IndexRoute","forum_index_title","count","prop","increment","console","log","ctrl","onclick","legalPageFactory","typeName","defaultTitle","dashedTypeName","api","body","PageHeader","TermsOfServiceRoute","PrivacyPolicyRoute","legalLink","legalType","FooterNav","isVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","ForumFooter","nav","FooterMisagoBranding","BrandFull","branding","children","src","alt","ForumNavbar","desktopNavbar","forum_branding_display","forum_branding_text","config","persistent","el","isInit","retain","LoadingPage","setupMarkup","MisagoMarkup","content","options"],"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    // Context data\n    this.context = {\n      // Empty settings\n      SETTINGS: {}\n    };\n\n    this._initServices = function(services) {\n      m.startComputation();\n\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.name] = serviceInstance;\n        }\n      });\n\n      m.endComputation();\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    // App init/destory\n    this.setup = false;\n    this.init = function(setup) {\n      this.setup = {\n        fixture: ns.get(setup, 'fixture', null),\n        inTest: ns.get(setup, 'inTest', false)\n      };\n\n      this._initServices(n._services);\n    };\n\n    this.destroy = function() {\n      this._destroyServices(ns._services);\n    };\n  };\n\n  // Services\n  var ns = window.Misago;\n\n  ns._services = [];\n\n  ns.addService = function(name, factory, order) {\n    ns._services.push({\n      name: name,\n      item: factory,\n      after: ns.get(order, 'after'),\n      before: ns.get(order, 'before')\n    });\n  };\n}());\n\n(function (Misago) {\n  'use strict';\n\n  Misago.has = function(obj, key) {\n    if (obj !== undefined) {\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      delete obj[key];\n    }\n    return returnValue;\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      // List start\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: 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.deserializeDatetime = function(deserialized) {\n    return deserialized ? moment(deserialized) : null;\n  };\n\n  Misago.serializeDatetime = function(serialized) {\n    return serialized ? serialized.format() : 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.UrlConfInvalidComponentError = function(name) {\n    this.message = \"route's \" + name + \" component should be an array or object\";\n\n    this.toString = function() {\n      return this.message;\n    };\n  };\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 (typeof component !== 'object') {\n        throw new Misago.UrlConfInvalidComponentError(name);\n      }\n\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,\n          name: name\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', _.component(Misago.Loader));\n  };\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var Ajax = function(_) {\n    var cookieRegex = new RegExp(_.context.CSRF_COOKIE_NAME + '\\=([^;]*)');\n    this.csrfToken = Misago.get(document.cookie.match(cookieRegex), 0).split('=')[1];\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) {\n      return this.ajax('POST', 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 Api = function(_) {\n    this.buildUrl = function(model, call, querystrings) {\n      var url = _.router.baseUrl;\n      url += 'api/' + model + '/';\n      return url;\n    };\n\n    this.one = function(model, id) {\n      var url = this.buildUrl(model) + id + '/';\n      return _.ajax.get(url);\n    };\n\n    this.many = function(model, filters) {\n\n    };\n\n    this.call = function(model, target, call, data) {\n\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  Misago.addService('components-factory', function(_) {\n    // Component factory\n    _.component = function() {\n      var argumentsArray = [];\n      for (var i = 0; i < arguments.length; i += 1) {\n        argumentsArray.push(arguments[i]);\n      }\n\n      argumentsArray.push(_);\n      return m.component.apply(undefined, argumentsArray);\n    };\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(Misago.ForumLayout));\n      }\n    },\n\n    destroy: function(_) {\n      if (_.setup.fixture) {\n        m.mount(_.setup.fixture, null);\n      }\n    }\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 noop = function() {};\n\n  Misago.route = function(component) {\n    /*\n      Boilerplate for Misago top-level components\n    */\n\n    // Component 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      // 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              component.container.router.errorPage(error);\n            }\n          });\n        }\n      };\n\n      // setup default loading view\n      if (!component.loading) {\n        component.loading = function () {\n          var _ = this.container;\n          return m('.page.page-loading',\n            _.component(Misago.Loader)\n          );\n        };\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\n    return component;\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 routedComponent = function(component) {\n      component.container = _;\n      return component;\n    };\n\n    var populatePatterns = function(urlconf) {\n      urlconf.patterns().forEach(function(url) {\n        // set service container on component\n\n        var finalPattern = self.baseUrl + url.pattern;\n        finalPattern = finalPattern.replace('//', '/');\n\n        self.urls[finalPattern] = routedComponent(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      m.route.mode = 'pathname';\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    this.delegateName = 'click.misago-router';\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    this.delegateClicks = function(element) {\n      this.delegateElement = element;\n      $(this.delegateElement).on(this.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(this.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 = routedComponent(Misago.ErrorBannedRoute);\n        component.error = {\n          message: error.detail,\n          ban: Misago.Ban.deserialize(error.ban)\n        };\n      } else {\n        component = routedComponent(Misago.Error403Route);\n        component.error = error.detail;\n      }\n\n      m.mount(this.fixture, component);\n    };\n\n    this.error404 = function() {\n      m.mount(this.fixture, routedComponent(Misago.Error404Route));\n    };\n\n    this.error500 = function() {\n      m.mount(this.fixture, routedComponent(Misago.Error500Route));\n    };\n\n    this.error0 = function() {\n      m.mount(this.fixture, routedComponent(Misago.Error0Route));\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(Misago.urls, document.getElementById('router-fixture'));\n    _.router.delegateClicks(document.getElementById(_.setup.fixture));\n  }, {after: 'forum-layout'});\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    this.run = function(callable, name, delay) {\n      this._intervals[name] = window.setTimeout(function() {\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        callable(_);\n      }, delay);\n    };\n\n    this.stop = function() {\n      for (var name in this._intervals) {\n        if (this._intervals.hasOwnProperty(name)) {\n          window.clearTimeout(this._intervals[name]);\n          delete this._intervals[name];\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    _.runloop.run(function() {\n      m.startComputation();\n      // just tick once a minute so stuff gets rerendered\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  Misago.addService('page-title', function(_) {\n    _._setTitle = 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        completeTitle += ' (' + interpolate(gettext('page %(page)s'), { page:title.page }, true) + ')';\n      }\n\n      if (typeof title.parent !== 'undefined') {\n        completeTitle += ' | ' + title.parent;\n      }\n\n      document.title = completeTitle + ' | ' + this.settings.forum_name;\n    };\n\n    _.setTitle = function(title) {\n      if (title) {\n        this._setTitle(title);\n      } else {\n        document.title = this.settings.forum_name;\n      }\n    };\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.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  Misago.Ban.deserialize = function(data) {\n    data.expires_on = Misago.deserializeDatetime(data.expires_on);\n\n    return new Misago.Ban(data);\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  Misago.ErrorBannedRoute = Misago.route({\n    controller: function() {\n      this.container.setTitle(gettext('You are banned'));\n    },\n    error: null,\n    view: function() {\n      var error_message = [];\n      if (this.error.ban.message.html) {\n        error_message.push(m('.lead', m.trust(this.error.ban.message.html)));\n      } else {\n        error_message.push(m('p.lead', this.error.message));\n      }\n\n      var expirationMessage = null;\n      if (this.error.ban.expires_on) {\n        if (this.error.ban.expires_on.isAfter(moment())) {\n          expirationMessage = interpolate(\n            gettext('This ban expires %(expires_on)s.'),\n            { 'expires_on': this.error.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  Misago.Error403Route = Misago.route({\n    controller: function() {\n      this.container.setTitle(gettext('Page not available'));\n    },\n    error: null,\n    view: function() {\n      return errorPage({\n        code: 403,\n        icon: 'remove_circle_outline',\n        message: gettext(\"This page is not available.\"),\n        help: this.error || gettext(\"You don't have permission to access this page.\")\n      });\n    }\n  });\n\n  Misago.Error404Route = Misago.route({\n    controller: function() {\n      this.container.setTitle(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  Misago.Error500Route = Misago.route({\n    controller: function() {\n      this.container.setTitle(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  Misago.Error0Route = Misago.route({\n    controller: function() {\n      this.container.setTitle(gettext('Lost connection with application'));\n    },\n    view: function() {\n      return errorPage({\n        code: 500,\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}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.IndexRoute = Misago.route({\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      return m('.container', [\n        m('h1', ['Count: ', m('strong', ctrl.count())]),\n        m('p', 'Clicky click button to increase count!.'),\n        m('p',\n          m('button.btn.btn-primary', {onclick: ctrl.increment}, 'Clicky clicky!')\n        )\n      ]);\n    }\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 Misago.route({\n      controller: function() {\n        var _ = this.container;\n\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        isReady: false,\n        init: function(component, _) {\n          if (this.isReady) {\n            _.setTitle(this.title);\n          } else {\n            _.setTitle();\n            return _.api.one('legal-pages', dashedTypeName);\n          }\n        },\n        ondata: function(data, component, _) {\n          m.startComputation();\n\n          this.title = data.title || defaultTitle;\n          this.body = data.body;\n          this.isReady = true;\n\n          m.endComputation();\n\n          if (component.isActive) {\n            _.setTitle(data.title);\n          }\n        }\n      },\n      view: function() {\n        var _ = this.container;\n\n        return m('.page.legal-page.' + dashedTypeName + '-page', [\n          _.component(Misago.PageHeader, {title: this.vm.title}),\n          m('.container',\n            m.trust(this.vm.body)\n          )\n        ]);\n      }\n    });\n  };\n\n  Misago.TermsOfServiceRoute = legalPageFactory(\n    'terms_of_service', gettext('Terms of service'));\n  Misago.PrivacyPolicyRoute = legalPageFactory(\n    'privacy_policy', gettext('Privacy policy'));\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}, Misago.get(_.settings, legalType + '_title', defaultTitle))\n      );\n    } else {\n      return null;\n    }\n  };\n\n  Misago.FooterNav = {\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(legalLink(_, 'terms_of_service', gettext('Terms of service')));\n      items.push(legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n      return m('ul.list-inline.footer-nav', items);\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.ForumFooter = {\n    view: function(ctrl, _) {\n      var nav = null;\n      if (Misago.FooterNav.isVisible(_.settings)) {\n        nav = _.component(Misago.FooterNav);\n      }\n\n      return m('footer.forum-footer', [\n        m('.container',\n          m('.footer-content', [\n            nav,\n            _.component(Misago.FooterMisagoBranding)\n          ])\n        )\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.FooterMisagoBranding = {\n    view: function() {\n      return m('a.misago-branding[href=http://misago-project.org]', [\n        \"powered by \", m('strong', \"misago\")\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.BrandFull = {\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}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.ForumNavbar = {\n    view: function(ctrl, _) {\n      var desktopNavbar = [];\n\n      if (_.settings.forum_branding_display) {\n        desktopNavbar.push(_.component(Misago.BrandFull, _.settings.forum_branding_text));\n      }\n\n      desktopNavbar.push(m('ul.nav.navbar-nav', [\n        m('li', m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')),\n        m('li', m(\"a\", {config: m.route, href: _.router.url('test')}, 'Test'))\n      ]));\n\n      return m('nav.navbar.navbar-default.navbar-static-top[role=\"navigation\"]', [\n        m('.container.navbar-full.hidden-xs.hidden-sm', desktopNavbar)\n      ]);\n    }\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  Misago.ForumLayout = {\n    view: function(ctrl, _) {\n      return [\n        _.component(Misago.ForumNavbar),\n        m('#router-fixture', {config: persistent}),\n        _.component(Misago.ForumFooter)\n      ];\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.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.LoadingPage = {\n    view: function(ctrl, _) {\n      return m('.page.loading-page',\n        _.component(Misago.Loader)\n      );\n    }\n  };\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var setupMarkup = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  Misago.MisagoMarkup = {\n    view: function(ctrl, content) {\n      return m('article.misago-markup', {config: setupMarkup}, m.trust(content));\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.PageHeader = {\n    view: function(ctrl, options) {\n      return m('.page-header',\n        m('.container', [\n          m('h1', options.title),\n        ])\n      );\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago, UrlConf) {\n  'use strict';\n\n  var urls = new UrlConf();\n  urls.url('/', Misago.IndexRoute, 'index');\n\n  // Legal pages\n  urls.url('/terms-of-service/', Misago.TermsOfServiceRoute, 'terms_of_service');\n  urls.url('/privacy-policy/', Misago.PrivacyPolicyRoute, 'privacy_policy');\n\n  Misago.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}

+ 0 - 1
misago/templates/misago/base.html

@@ -46,7 +46,6 @@
     <script type="text/javascript" src="{% static 'misago/js/misago.js' %}"></script>
     <script type="text/javascript" src="{% static 'misago/js/misago.js' %}"></script>
     <script type="text/javascript">
     <script type="text/javascript">
       var misago = new Misago();
       var misago = new Misago();
-      misago.registerCoreServices();
       {% include "misago/frontend_context.js" %}
       {% include "misago/frontend_context.js" %}
       misago.init({
       misago.init({
         fixture: 'misago-fixture'
         fixture: 'misago-fixture'