From 807a12fde7112202da6584f05d00920233fa5849 Mon Sep 17 00:00:00 2001 From: rafalp Date: Mon, 29 Jul 2024 21:27:28 +0200 Subject: [PATCH 01/24] Setup empty posting app --- misago/posting/__init__.py | 0 misago/posting/apps.py | 7 +++++++ misago/posting/hooks/__init__.py | 0 misago/posting/tests/__init__.py | 0 misago/posting/urls.py | 0 misago/posting/views/__init__.py | 0 misago/settings.py | 1 + 7 files changed, 8 insertions(+) create mode 100644 misago/posting/__init__.py create mode 100644 misago/posting/apps.py create mode 100644 misago/posting/hooks/__init__.py create mode 100644 misago/posting/tests/__init__.py create mode 100644 misago/posting/urls.py create mode 100644 misago/posting/views/__init__.py diff --git a/misago/posting/__init__.py b/misago/posting/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/misago/posting/apps.py b/misago/posting/apps.py new file mode 100644 index 0000000000..dbc328fa4e --- /dev/null +++ b/misago/posting/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig + + +class MisagoPostingConfig(AppConfig): + name = "misago.posting" + label = "misago_posting" + verbose_name = "Misago Posting" diff --git a/misago/posting/hooks/__init__.py b/misago/posting/hooks/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/misago/posting/tests/__init__.py b/misago/posting/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/misago/posting/urls.py b/misago/posting/urls.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/misago/posting/views/__init__.py b/misago/posting/views/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/misago/settings.py b/misago/settings.py index 77579463fa..b254add028 100644 --- a/misago/settings.py +++ b/misago/settings.py @@ -65,6 +65,7 @@ "misago.permissions", "misago.plugins", "misago.postgres", + "misago.posting", "misago.profile", "misago.readtracker", "misago.search", From a00f0c8f6471a123ea957b06cb625565e6b8a476 Mon Sep 17 00:00:00 2001 From: rafalp Date: Mon, 29 Jul 2024 22:14:21 +0200 Subject: [PATCH 02/24] Empty views for starting thread --- misago/posting/views/start.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 misago/posting/views/start.py diff --git a/misago/posting/views/start.py b/misago/posting/views/start.py new file mode 100644 index 0000000000..22c73e32c3 --- /dev/null +++ b/misago/posting/views/start.py @@ -0,0 +1,18 @@ +from django.http import HttpRequest, HttpResponse +from django.views import View + + +class StartView(View): + pass + + +class ThreadStartView(StartView): + pass + + +class PrivateThreadStartView(StartView): + pass + + +def select_category(request: HttpRequest) -> HttpResponse: + pass From 7cf760532405ac2acece071c630f906e5538ea33 Mon Sep 17 00:00:00 2001 From: rafalp Date: Tue, 30 Jul 2024 00:24:30 +0200 Subject: [PATCH 03/24] Very raw posting threads action --- .../src/components/post-feed/post/body.js | 2 +- .../components/search-route/threads/post.js | 2 +- .../components/search/SearchResultPost.jsx | 2 +- misago/parser/enums.py | 5 + misago/parser/factory.py | 1 - misago/parser/plaintext.py | 7 +- misago/posting/forms/__init__.py | 0 misago/posting/forms/start.py | 10 ++ misago/posting/urls.py | 17 +++ misago/posting/views/start.py | 133 +++++++++++++++++- misago/static/misago/js/misago.js | 2 +- misago/static/misago/js/misago.js.map | 2 +- .../misago/account/settings/email_form.html | 2 +- misago/templates/misago/posting/start.html | 95 +++++++++++++ misago/threads/search.py | 18 ++- misago/threads/serializers/feed.py | 5 + misago/urls.py | 1 + 17 files changed, 286 insertions(+), 18 deletions(-) create mode 100644 misago/posting/forms/__init__.py create mode 100644 misago/posting/forms/start.py create mode 100644 misago/templates/misago/posting/start.html diff --git a/frontend/src/components/post-feed/post/body.js b/frontend/src/components/post-feed/post/body.js index 66ea69e645..82e0e8ca65 100644 --- a/frontend/src/components/post-feed/post/body.js +++ b/frontend/src/components/post-feed/post/body.js @@ -12,7 +12,7 @@ export default function (props) { export function Default(props) { return (
- +
) } diff --git a/frontend/src/components/search-route/threads/post.js b/frontend/src/components/search-route/threads/post.js index bd3a95283c..f8d35d593f 100644 --- a/frontend/src/components/search-route/threads/post.js +++ b/frontend/src/components/search-route/threads/post.js @@ -8,7 +8,7 @@ export default function (props) {
- + {post.thread.title}
  • diff --git a/misago/parser/enums.py b/misago/parser/enums.py index 02c5e7ee70..9f98402efa 100644 --- a/misago/parser/enums.py +++ b/misago/parser/enums.py @@ -5,3 +5,8 @@ class ContentType(StrEnum): GROUP_DESCRIPTION = "group-description" POST = "post" SIGNATURE = "signature" + + +class PlainTextFormat(StrEnum): + META_DESCRIPTION = "meta_description" + SEARCH_DOCUMENT = "search_document" diff --git a/misago/parser/factory.py b/misago/parser/factory.py index a26cc10a61..c715ac6c9e 100644 --- a/misago/parser/factory.py +++ b/misago/parser/factory.py @@ -1,7 +1,6 @@ from typing import Callable from django.contrib.auth import get_user_model -from django.http import HttpRequest from .context import ParserContext from .hooks import create_parser_hook diff --git a/misago/parser/plaintext.py b/misago/parser/plaintext.py index ac32aeccbb..c51bbe7787 100644 --- a/misago/parser/plaintext.py +++ b/misago/parser/plaintext.py @@ -1,18 +1,13 @@ import re -from enum import StrEnum from ..core.utils import slugify from .context import ParserContext +from .enums import PlainTextFormat from .exceptions import AstError from .hooks import render_ast_node_to_plaintext_hook from .urls import clean_href -class PlainTextFormat(StrEnum): - META_DESCRIPTION = "meta_description" - SEARCH_DOCUMENT = "search_document" - - def render_ast_to_plaintext( context: ParserContext, ast: list[dict], diff --git a/misago/posting/forms/__init__.py b/misago/posting/forms/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/misago/posting/forms/start.py b/misago/posting/forms/start.py new file mode 100644 index 0000000000..61a0d39dae --- /dev/null +++ b/misago/posting/forms/start.py @@ -0,0 +1,10 @@ +from django import forms + + +class StartForm(forms.Form): + title = forms.CharField(max_length=200) + post = forms.CharField(max_length=2000, widget=forms.Textarea) + + +class ThreadStartForm(StartForm): + pass diff --git a/misago/posting/urls.py b/misago/posting/urls.py index e69de29bb2..fb58e2af40 100644 --- a/misago/posting/urls.py +++ b/misago/posting/urls.py @@ -0,0 +1,17 @@ +from django.urls import path + +from .views.start import PrivateThreadStartView, ThreadStartView + + +urlpatterns = [ + path( + "c///start-thread/", + ThreadStartView.as_view(), + name="start-thread", + ), + path( + "private/start-thread/", + PrivateThreadStartView.as_view(), + name="start-private-thread", + ), +] diff --git a/misago/posting/views/start.py b/misago/posting/views/start.py index 22c73e32c3..70eb21fd31 100644 --- a/misago/posting/views/start.py +++ b/misago/posting/views/start.py @@ -1,13 +1,140 @@ -from django.http import HttpRequest, HttpResponse +from django.db import models +from django.http import Http404, HttpRequest, HttpResponse from django.views import View +from django.shortcuts import redirect, render +from django.urls import reverse +from django.utils import timezone + +from ...categories.enums import CategoryTree +from ...categories.models import Category +from ...core.utils import slugify +from ...parser.context import create_parser_context +from ...parser.enums import ContentType, PlainTextFormat +from ...parser.factory import create_parser +from ...parser.html import render_ast_to_html +from ...parser.metadata import create_ast_metadata +from ...parser.plaintext import render_ast_to_plaintext +from ...permissions.categories import check_browse_category_permission +from ...threads.checksums import update_post_checksum +from ...threads.models import Post, Thread +from ..forms.start import ThreadStartForm class StartView(View): - pass + template_name: str class ThreadStartView(StartView): - pass + template_name: str = "misago/posting/start.html" + + def get(self, request: HttpRequest, **kwargs) -> HttpResponse: + category = self.get_category(request, kwargs["id"]) + form = ThreadStartForm() + return render( + request, + self.template_name, + {"category": category, "form": form}, + ) + + def post(self, request: HttpRequest, **kwargs) -> HttpResponse: + category = self.get_category(request, kwargs["id"]) + form = ThreadStartForm(request.POST, request.FILES) + if not form.is_valid(): + return render( + request, + self.template_name, + {"category": category, "form": form}, + ) + + context = create_parser_context(request, content_type=ContentType.POST) + parser = create_parser(context) + + ast = parser(form.cleaned_data["post"]) + metadata = create_ast_metadata(context, ast) + html = render_ast_to_html(context, ast, metadata) + search_document = ( + form.cleaned_data["title"] + + " " + + render_ast_to_plaintext( + context, ast, metadata, PlainTextFormat.SEARCH_DOCUMENT + ) + ) + + if request.POST.get("preview"): + return render( + request, + self.template_name, + { + "category": category, + "form": form, + "preview": html, + "search_document": search_document, + }, + ) + + now = timezone.now() + + thread = Thread.objects.create( + category=category, + title=form.cleaned_data["title"], + slug=slugify(form.cleaned_data["title"]), + started_on=now, + last_post_on=now, + starter=request.user, + starter_name=request.user.username, + starter_slug=request.user.slug, + last_poster=request.user, + last_poster_name=request.user.username, + last_poster_slug=request.user.slug, + ) + + post = Post.objects.create( + category=category, + thread=thread, + poster=request.user, + poster_name=request.user.username, + original=form.cleaned_data["post"], + parsed=html, + search_document=search_document, + posted_on=now, + updated_on=now, + ) + + thread.first_post = post + thread.last_post = post + thread.save() + + update_post_checksum(post) + post.update_search_vector() + post.save() + + category.threads = models.F("threads") + 1 + category.posts = models.F("posts") + 1 + category.set_last_thread(thread) + category.save() + + thread_url = reverse( + "misago:thread", + kwargs={"pk": thread.id, "slug": thread.slug}, + ) + + return redirect(thread_url) + + def get_category(self, request: HttpRequest, category_id: int) -> Category: + try: + category = Category.objects.get( + id=category_id, + tree_id=CategoryTree.THREADS, + level__gt=0, + ) + except Category.DoesNotExist: + raise Http404() + + check_browse_category_permission( + request.user_permissions, category, can_delay=True + ) + + return category class PrivateThreadStartView(StartView): diff --git a/misago/static/misago/js/misago.js b/misago/static/misago/js/misago.js index e7dd4c1937..8dbf1a6a83 100644 --- a/misago/static/misago/js/misago.js +++ b/misago/static/misago/js/misago.js @@ -1,2 +1,2 @@ -(()=>{var e,t,n,a={60642:(e,t,n)=>{"use strict";n.d(t,{b:()=>m,D:()=>f});var a=n(15861),i=n(15671),o=n(43144),s=n(97326),r=n(79340),l=n(6215),c=n(61120),u=n(4942),d=n(64687),p=n.n(d),h=n(57588),v=n.n(h);var m=function(e){(0,r.Z)(h,e);var t,n,d=(t=h,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,c.Z)(t);if(n){var i=(0,c.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,l.Z)(this,e)});function h(e){var t;return(0,i.Z)(this,h),t=d.call(this,e),(0,u.Z)((0,s.Z)(t),"hasCache",(function(e){return t.props.cache&&t.props.cache[e]})),(0,u.Z)((0,s.Z)(t),"getCache",function(){var e=(0,a.Z)(p().mark((function e(n){var a;return p().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=t.props.cache[n],t.setState({loading:!1,error:null,data:a}),!t.props.onData){e.next=5;break}return e.next=5,t.props.onData(a);case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),(0,u.Z)((0,s.Z)(t),"setCache",(function(e,n){t.props.cache&&(t.props.cache[e]=n)})),(0,u.Z)((0,s.Z)(t),"request",(function(e){t.setState({loading:!0}),fetch(e,{method:"GET",credentials:"include",signal:t.signal}).then(function(){var n=(0,a.Z)(p().mark((function n(a){var i,o;return p().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(e!==t.props.url){n.next=18;break}if(200!=a.status){n.next=12;break}return n.next=4,a.json();case 4:if(i=n.sent,t.setState({loading:!1,error:null,data:i}),t.setCache(e,i),!t.props.onData){n.next=10;break}return n.next=10,t.props.onData(i);case 10:n.next=18;break;case 12:if(o={status:a.status},"application/json"!==a.headers.get("Content-Type")){n.next=17;break}return n.next=16,a.json();case 16:o.data=n.sent;case 17:t.setState({loading:!1,error:o});case 18:case"end":return n.stop()}}),n)})));return function(e){return n.apply(this,arguments)}}(),(function(n){e===t.props.url&&t.setState({loading:!1,error:{status:0,rejection:n}})}))})),(0,u.Z)((0,s.Z)(t),"refetch",(function(){t.request(t.props.url)})),(0,u.Z)((0,s.Z)(t),"update",(function(e){t.setState((function(t){return{data:e(t.data)}}))})),t.state={data:null,loading:!1,error:null},t.controller=new AbortController,t.signal=t.controller.signal,t}return(0,o.Z)(h,[{key:"componentDidMount",value:function(){this.props.url&&!this.props.disabled&&this.request(this.props.url)}},{key:"componentDidUpdate",value:function(e){var t=this.props.url,n=t&&t!==e.url,a=this.props.disabled!=e.disabled;(n||a)&&(this.props.disabled?this.controller.abort():this.hasCache(t)?this.getCache(t):(this.controller.abort(),this.controller=new AbortController,this.signal=this.controller.signal,this.request(t)))}},{key:"componentWillUnmount",value:function(){this.controller.abort()}},{key:"render",value:function(){return this.props.children(Object.assign({refetch:this.refetch,update:this.update},this.state))}}]),h}(v().Component);var f=function(e){(0,r.Z)(h,e);var t,n,d=(t=h,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,c.Z)(t);if(n){var i=(0,c.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,l.Z)(this,e)});function h(e){var t;return(0,i.Z)(this,h),t=d.call(this,e),(0,u.Z)((0,s.Z)(t),"mutate",(function(e){t.setState({loading:!0}),fetch(t.props.url,{method:t.props.method||"POST",credentials:"include",headers:Z(e),body:g(e)}).then(function(){var n=(0,a.Z)(p().mark((function n(a){var i,o;return p().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(200!=a.status){n.next=10;break}return n.next=3,a.json();case 3:if(i=n.sent,t.setState({loading:!1,data:i}),!e.onSuccess){n.next=8;break}return n.next=8,e.onSuccess(i);case 8:n.next=26;break;case 10:if(204!=a.status){n.next=17;break}if(t.setState({loading:!1}),!e.onSuccess){n.next=15;break}return n.next=15,e.onSuccess();case 15:n.next=26;break;case 17:if(o={status:a.status},"application/json"!==a.headers.get("Content-Type")){n.next=22;break}return n.next=21,a.json();case 21:o.data=n.sent;case 22:if(t.setState({loading:!1,error:o}),!e.onError){n.next=26;break}return n.next=26,e.onError(o);case 26:case"end":return n.stop()}}),n)})));return function(e){return n.apply(this,arguments)}}(),function(){var n=(0,a.Z)(p().mark((function n(a){var i;return p().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(i={status:0,rejection:a},t.setState({loading:!1,error:i}),!e.onError){n.next=5;break}return n.next=5,e.onError(i);case 5:case"end":return n.stop()}}),n)})));return function(e){return n.apply(this,arguments)}}())})),t.state={data:null,loading:!1,error:null},t}return(0,o.Z)(h,[{key:"render",value:function(){return this.props.children(this.mutate,this.state)}}]),h}(v().Component);function Z(e){return e.json?{"Content-Type":"application/json; charset=utf-8","X-CSRFToken":b()}:{"X-CSRFToken":b()}}function g(e){if(e.json)return JSON.stringify(e.json)}function b(){var e=window.misago_csrf;if(-1!==document.cookie.indexOf(e)){var t=new RegExp(e+"=([^;]*)"),n=document.cookie.match(t)[0];return n?n.split("=")[1]:null}return null}},49021:(e,t,n)=>{"use strict";n.d(t,{Lt:()=>v,YV:()=>Z,kE:()=>g,Aw:()=>b,Xi:()=>y,KE:()=>_,iC:()=>k});var a=n(15671),i=n(43144),o=n(97326),s=n(79340),r=n(6215),l=n(61120),c=n(4942),u=n(94184),d=n.n(u),p=n(57588),h=n.n(p);var v=function(e){(0,s.Z)(p,e);var t,n,u=(t=p,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,l.Z)(t);if(n){var i=(0,l.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,r.Z)(this,e)});function p(e){var t;return(0,a.Z)(this,p),t=u.call(this,e),(0,c.Z)((0,o.Z)(t),"handleClick",(function(e){t.state.isOpen&&(!t.root.contains(e.target)||t.menu.contains(e.target)&&e.target.closest("a"))&&t.setState({isOpen:!1})})),(0,c.Z)((0,o.Z)(t),"toggle",(function(){t.setState((function(e){return{isOpen:!e.isOpen}}))})),(0,c.Z)((0,o.Z)(t),"close",(function(){t.setState({isOpen:!1})})),t.state={isOpen:!1},t.root=null,t.dropdown=null,t}return(0,i.Z)(p,[{key:"componentDidMount",value:function(){window.addEventListener("click",this.handleClick)}},{key:"componentWillUnmount",value:function(){window.removeEventListener("click",this.handleClick)}},{key:"componentDidUpdate",value:function(e,t){t.isOpen!==this.state.isOpen&&(this.state.isOpen&&this.props.onOpen&&this.props.onOpen(this.root),!this.state.isOpen&&this.props.onClose&&this.props.onClose(this.root))}},{key:"render",value:function(){var e=this,t=this.state.isOpen;return h().createElement("div",{id:this.props.id,className:d()("dropdown",{open:t},this.props.className),ref:function(t){t&&!e.element&&(e.root=t)}},this.props.toggle({isOpen:t,toggle:this.toggle,aria:m(t)}),h().createElement("div",{className:d()("dropdown-menu",{"dropdown-menu-right":this.props.menuAlignRight},this.props.menuClassName),ref:function(t){t&&!e.menu&&(e.menu=t)},role:"menu"},this.props.children({isOpen:t,close:this.close})))}}]),p}(h().Component);function m(e){return{"aria-haspopup":"true","aria-expanded":e?"true":"false"}}var f=n(22928);function Z(e){var t=e.className;return(0,f.Z)("li",{className:d()("divider",t)})}function g(e){var t=e.children;return e.listItem?(0,f.Z)("li",{className:"dropdown-footer"},void 0,t):(0,f.Z)("div",{className:"dropdown-footer"},void 0,t)}function b(e){var t=e.className,n=e.children;return(0,f.Z)("div",{className:d()("dropdown-header",t)},void 0,n)}function y(e){var t=e.className,n=e.children;return(0,f.Z)("li",{className:d()("dropdown-menu-item",t)},void 0,n)}function _(e){var t=e.className,n=e.children;return(0,f.Z)("div",{className:d()("dropdown-pills",t)},void 0,n)}function k(e){var t=e.className,n=e.children;return(0,f.Z)("li",{className:d()("dropdown-subheader",t)},void 0,n)}},98936:(e,t,n)=>{"use strict";n.d(t,{gq:()=>s,Z6:()=>r,kw:()=>l});var a=n(22928),i=n(94184),o=n.n(i);n(57588);const s=function(e){var t=e.children,n=e.className;return(0,a.Z)("div",{className:o()("flex-row",n)},void 0,t)},r=function(e){var t=e.children,n=e.className,i=e.shrink;return(0,a.Z)("div",{className:o()("flex-row-col",n,{"flex-row-col-shrink":i})},void 0,t)},l=function(e){var t=e.auto,n=e.children,i=e.className;return(0,a.Z)("div",{className:o()("flex-row-section",{"flex-row-section-auto":t},i)},void 0,n)}},66398:(e,t,n)=>{"use strict";n.d(t,{NX:()=>r,PB:()=>c,Zn:()=>u,WI:()=>l,WE:()=>d,j0:()=>p});var a,i=n(22928),o=n(94184),s=n.n(o);function r(e){var t=e.className,n=e.children;return(0,i.Z)("ul",{className:s()("list-group",t)},void 0,n)}function l(e){var t=e.className,n=e.children;return(0,i.Z)("li",{className:s()("list-group-item",t)},void 0,n)}function c(e){var t=e.className,n=e.icon,a=e.message;return(0,i.Z)(l,{className:s()("list-group-empty",t)},void 0,!!n&&(0,i.Z)("div",{className:"list-group-empty-icon"},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,n)),(0,i.Z)("p",{className:"list-group-empty-message"},void 0,a))}function u(e){var t=e.className,n=e.icon,a=e.message,o=e.detail;return(0,i.Z)(l,{className:s()("list-group-error",t)},void 0,!!n&&(0,i.Z)("div",{className:"list-group-error-icon"},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,n)),(0,i.Z)("p",{className:"list-group-error-message"},void 0,a),!!o&&(0,i.Z)("p",{className:"list-group-error-detail"},void 0,o))}function d(e){var t=e.className,n=e.message;return(0,i.Z)(l,{className:s()("list-group-loading",t)},void 0,(0,i.Z)("p",{className:"list-group-loading-message"},void 0,n),a||(a=(0,i.Z)("div",{className:"list-group-loading-progress"},void 0,(0,i.Z)("div",{className:"list-group-loading-progress-bar"}))))}function p(e){var t=e.className,n=e.icon,a=e.message,o=e.detail;return(0,i.Z)(l,{className:s()("list-group-message",t)},void 0,!!n&&(0,i.Z)("div",{className:"list-group-message-icon"},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,n)),(0,i.Z)("p",{className:"list-group-message-message"},void 0,a),!!o&&(0,i.Z)("p",{className:"list-group-message-detail"},void 0,o))}n(57588)},4517:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l});var a=n(22928),i=(n(57588),n(37424)),o=n(35486),s=n(60642);function r(e,t){var n=misago.get("NOTIFICATIONS_API")+"?limit=30";return n+="&filter="+e,t&&(t.after&&(n+="&after="+t.after),t.before&&(n+="&before="+t.before)),n}const l=(0,i.$j)((function(e){var t=e.auth;return t.user?{unreadNotifications:t.user.unreadNotifications}:{unreadNotifications:null}}))((function(e){var t=e.children,n=e.filter,i=e.query,l=e.dispatch,c=e.unreadNotifications,u=e.disabled;return(0,a.Z)(s.b,{url:r(n,i),disabled:u,onData:function(e){e.unreadNotifications!=c&&l((0,o.yH)({unreadNotifications:e.unreadNotifications}))}},void 0,(function(e){var n=e.data,a=e.loading,i=e.error,o=e.refetch;return t({data:n,loading:a,error:i,refetch:o})}))}))},63026:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n(4517).Z},66462:(e,t,n)=>{"use strict";n.d(t,{uE:()=>y,lb:()=>_,Pu:()=>k});var a=n(22928),i=(n(57588),n(66398));function o(e){var t=e.filter;return(0,a.Z)(i.PB,{icon:"unread"===t?"sentiment_very_satisfied":"notifications_none",message:s(t)})}function s(e){return"read"===e?pgettext("notifications list","You don't have any read notifications."):"unread"===e?pgettext("notifications list","You don't have any unread notifications."):pgettext("notifications list","You don't have any notifications.")}var r=n(94184),l=n.n(r);function c(e){var t=e.className,n=e.children;return(0,a.Z)("div",{className:l()("notifications-list",t)},void 0,(0,a.Z)(i.NX,{},void 0,n))}var u,d,p,h=n(19605);function v(e){var t=e.notification;return t.actor?(0,a.Z)("a",{href:t.actor.url,className:"notifications-list-item-actor",title:t.actor.username},void 0,(0,a.Z)(h.ZP,{size:30,user:t.actor})):(0,a.Z)("span",{className:"threads-list-item-last-poster",title:t.actor_name||null},void 0,u||(u=(0,a.Z)(h.ZP,{size:30})))}function m(e){var t=e.notification;return(0,a.Z)("a",{href:t.url,className:l()("notification-message",{"notification-message-read":t.isRead,"notification-message-unread":!t.isRead}),dangerouslySetInnerHTML:{__html:t.message}})}function f(e){return e.notification.isRead?(0,a.Z)("div",{className:"notifications-list-item-read-status",title:pgettext("notification status","Read notification")},void 0,d||(d=(0,a.Z)("span",{className:"notification-read-icon"}))):(0,a.Z)("div",{className:"notifications-list-item-read-status",title:pgettext("notification status","Unread notification")},void 0,p||(p=(0,a.Z)("span",{className:"notification-unread-icon"})))}var Z=n(16069);function g(e){var t=e.notification;return(0,a.Z)("div",{className:"notifications-list-item-timestamp"},void 0,(0,a.Z)(Z.Z,{datetime:t.createdAt}))}function b(e){var t=e.notification;return(0,a.Z)(i.WI,{className:l()("notifications-list-item",{"notifications-list-item-read":t.isRead,"notifications-list-item-unread":!t.isRead})},t.id,(0,a.Z)("div",{className:"notifications-list-item-left-col"},void 0,(0,a.Z)("div",{className:"notifications-list-item-col-actor"},void 0,(0,a.Z)(v,{notification:t})),(0,a.Z)("div",{className:"notifications-list-item-col-read-icon"},void 0,(0,a.Z)(f,{notification:t}))),(0,a.Z)("div",{className:"notifications-list-item-right-col"},void 0,(0,a.Z)("div",{className:"notifications-list-item-col-message"},void 0,(0,a.Z)(m,{notification:t})),(0,a.Z)("div",{className:"notifications-list-item-col-timestamp"},void 0,(0,a.Z)(g,{notification:t}))))}function y(e){var t=e.filter,n=e.items;return(0,a.Z)(c,{className:n.length>0?"notifications-list-ready":"notifications-list-pending"},void 0,0===n.length&&(0,a.Z)(o,{filter:t}),n.map((function(e){return(0,a.Z)(b,{notification:e},e.id)})))}function _(e){var t,n=0===(t=e.error).status?gettext("Check your internet connection and try refreshing the site."):t.data&&t.data.detail?t.data.detail:void 0;return(0,a.Z)(c,{className:"notifications-list-pending"},void 0,(0,a.Z)(i.Zn,{icon:"notifications_off",message:pgettext("notifications list","Notifications could not be loaded."),detail:n}))}function k(){return(0,a.Z)(c,{className:"notifications-list-pending"},void 0,(0,a.Z)(i.WE,{message:pgettext("notifications list","Loading notifications...")}))}},64836:(e,t,n)=>{"use strict";n.d(t,{a:()=>b,i:()=>_});var a=n(22928),i=n(15671),o=n(43144),s=n(97326),r=n(79340),l=n(6215),c=n(61120),u=n(4942),d=n(94184),p=n.n(d),h=n(57588),v=n.n(h),m=n(37424),f=n(993);var Z="has-overlay",g=function(e){(0,r.Z)(h,e);var t,n,d=(t=h,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,c.Z)(t);if(n){var i=(0,c.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,l.Z)(this,e)});function h(e){var t;return(0,i.Z)(this,h),t=d.call(this,e),(0,u.Z)((0,s.Z)(t),"closeOnNavigation",(function(e){e.target.closest("a")&&t.props.dispatch((0,f.xv)())})),t.scrollOrigin=null,t}return(0,o.Z)(h,[{key:"componentDidUpdate",value:function(e){e.open!==this.props.open&&(this.props.open?(this.scrollOrigin=window.pageYOffset,document.body.classList.add(Z),this.props.onOpen&&this.props.onOpen()):(document.body.classList.remove(Z),window.scrollTo(0,this.scrollOrigin),this.scrollOrigin=null))}},{key:"render",value:function(){return(0,a.Z)("div",{className:p()("overlay",this.props.className,{"overlay-open":this.props.open}),onClick:this.closeOnNavigation},void 0,this.props.children)}}]),h}(v().Component);const b=(0,m.$j)()(g);var y;const _=(0,m.$j)()((function(e){var t=e.children,n=e.dispatch;return(0,a.Z)("div",{className:"overlay-header"},void 0,(0,a.Z)("div",{className:"overlay-header-caption"},void 0,t),(0,a.Z)("button",{className:"btn btn-overlay-close",title:pgettext("modal","Close"),type:"button",onClick:function(){return n((0,f.xv)())}},void 0,y||(y=(0,a.Z)("span",{className:"material-icon"},void 0,"close"))))}))},59131:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var a=n(22928);n(57588);const i=function(e){var t=e.children;return(0,a.Z)("div",{className:"container page-container"},void 0,t)}},99755:(e,t,n)=>{"use strict";n.d(t,{mr:()=>r,gC:()=>l,sP:()=>c,eA:()=>u,Iv:()=>d});var a,i=n(22928),o=n(94184),s=n.n(o);n(57588);const r=function(e){var t=e.children,n=e.className,o=e.styleName;return(0,i.Z)("div",{className:s()("page-header",n,o&&"page-header-"+o)},void 0,(0,i.Z)("div",{className:"page-header-bg-image"},void 0,(0,i.Z)("div",{className:"page-header-bg-overlay"},void 0,a||(a=(0,i.Z)("div",{className:"page-header-image"})),t)))},l=function(e){var t=e.children,n=e.className,a=e.styleName;return(0,i.Z)("div",{className:s()("page-header-banner",n,a&&"page-header-banner-"+a)},void 0,(0,i.Z)("div",{className:"page-header-banner-bg-image"},void 0,(0,i.Z)("div",{className:"page-header-banner-bg-overlay"},void 0,t)))},c=function(e){var t=e.children;return(0,i.Z)("div",{className:"container page-header-container"},void 0,t)},u=function(e){var t=e.children,n=e.className;return(0,i.Z)("div",{className:s()("page-header-details",n)},void 0,t)},d=function(e){var t=e.styleName,n=e.header,a=e.message;return(0,i.Z)(c,{},void 0,(0,i.Z)(r,{styleName:t},void 0,(0,i.Z)(l,{styleName:t},void 0,(0,i.Z)("h1",{},void 0,n)),a&&(0,i.Z)(u,{styleName:t},void 0,a)))}},40689:(e,t,n)=>{"use strict";n.d(t,{Z:()=>H});var a=n(22928),i=n(15671),o=n(43144),s=n(97326),r=n(79340),l=n(6215),c=n(61120),u=n(4942),d=n(94184),p=n.n(d),h=n(57588),v=n.n(h),m=n(78657),f=n(93825),Z=n(59801),g=n(53904),b=n(37848),y=n(87462),_=n(82211),k=n(43345),N=n(96359),x=n(59940);var w,C,R,E=["progress-bar-danger","progress-bar-warning","progress-bar-warning","progress-bar-primary","progress-bar-success"],S=[pgettext("password strength indicator","Entered password is very weak."),pgettext("password strength indicator","Entered password is weak."),pgettext("password strength indicator","Entered password is average."),pgettext("password strength indicator","Entered password is strong."),pgettext("password strength indicator","Entered password is very strong.")],O=function(e){(0,r.Z)(u,e);var t,n,s=(t=u,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,c.Z)(t);if(n){var i=(0,c.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,l.Z)(this,e)});function u(e){var t;return(0,i.Z)(this,u),(t=s.call(this,e))._score=0,t._password=null,t._inputs=[],t.state={loaded:!1},t}return(0,o.Z)(u,[{key:"componentDidMount",value:function(){var e=this;x.Z.load().then((function(){e.setState({loaded:!0})}))}},{key:"getScore",value:function(e,t){var n=this,a=!1;return e!==this._password&&(a=!0),t.length!==this._inputs.length?a=!0:t.map((function(e,t){e.trim()!==n._inputs[t]&&(a=!0)})),a&&(this._score=x.Z.scorePassword(e,t),this._password=e,this._inputs=t.map((function(e){return e.trim()}))),this._score}},{key:"render",value:function(){if(!this.state.loaded)return null;var e=this.getScore(this.props.password,this.props.inputs);return(0,a.Z)("div",{className:"help-block password-strength"},void 0,(0,a.Z)("div",{className:"progress"},void 0,(0,a.Z)("div",{className:"progress-bar "+E[e],style:{width:20+20*e+"%"},role:"progress-bar","aria-valuenow":e,"aria-valuemin":"0","aria-valuemax":"4"},void 0,(0,a.Z)("span",{className:"sr-only"},void 0,S[e]))),(0,a.Z)("p",{className:"text-small"},void 0,S[e]))}}]),u}(v().Component),L=n(26106),P=n(47235),T=n(99170),A=n(98274),B=n(93051),I=n(55210);function j(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function D(e){for(var t=1;t0?g.Z.error(e.__all__[0]):g.Z.error(gettext("Form contains errors."))):403===e.status&&e.ban?((0,B.Z)(e.ban),Z.Z.hide()):g.Z.apiError(e)}},{key:"render",value:function(){return(0,a.Z)("div",{className:"modal-dialog modal-register",role:"document"},void 0,(0,a.Z)("div",{className:"modal-content"},void 0,(0,a.Z)("div",{className:"modal-header"},void 0,(0,a.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,w||(w=(0,a.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,a.Z)("h4",{className:"modal-title"},void 0,pgettext("register modal title","Register"))),(0,a.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,a.Z)("input",{type:"type",style:{display:"none"}}),(0,a.Z)("input",{type:"password",style:{display:"none"}}),(0,a.Z)("div",{className:"modal-body"},void 0,(0,a.Z)(P.Z,{buttonClassName:"col-xs-12 col-sm-6",buttonLabel:pgettext("register modal field","Join with %(site)s"),formLabel:pgettext("register modal field","Or create forum account:")}),(0,a.Z)(N.Z,{label:pgettext("register modal field","Username"),for:"id_username",validation:this.state.errors.username},void 0,(0,a.Z)("input",{type:"text",id:"id_username",className:"form-control","aria-describedby":"id_username_status",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username})),(0,a.Z)(N.Z,{label:pgettext("register modal field","E-mail"),for:"id_email",validation:this.state.errors.email},void 0,(0,a.Z)("input",{type:"text",id:"id_email",className:"form-control","aria-describedby":"id_email_status",disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email})),(0,a.Z)(N.Z,{label:pgettext("register modal field","Password"),for:"id_password",validation:this.state.errors.password,extra:(0,a.Z)(O,{password:this.state.password,inputs:[this.state.username,this.state.email]})},void 0,(0,a.Z)("input",{type:"password",id:"id_password",className:"form-control","aria-describedby":"id_password_status",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password})),f.ZP.component({form:this}),(0,a.Z)(L.Z,{errors:this.state.errors,privacyPolicy:this.state.privacyPolicy,termsOfService:this.state.termsOfService,onPrivacyPolicyChange:this.handlePrivacyPolicyChange,onTermsOfServiceChange:this.handleTermsOfServiceChange})),(0,a.Z)("div",{className:"modal-footer"},void 0,(0,a.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,pgettext("register modal btn","Cancel")),(0,a.Z)(_.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,pgettext("register modal btn","Register account"))))))}}]),n}(k.Z),M=function(e){(0,r.Z)(n,e);var t=z(n);function n(){return(0,i.Z)(this,n),t.apply(this,arguments)}return(0,o.Z)(n,[{key:"getLead",value:function(){return"user"===this.props.activation?pgettext("account activation required","%(username)s, your account has been created but you need to activate it before you will be able to sign in."):"admin"===this.props.activation?pgettext("account activation required","%(username)s, your account has been created but the site administrator will have to activate it before you will be able to sign in."):void 0}},{key:"getSubscript",value:function(){return"user"===this.props.activation?pgettext("account activation required","We have sent an e-mail to %(email)s with link that you have to click to activate your account."):"admin"===this.props.activation?pgettext("account activation required","We will send an e-mail to %(email)s when this takes place."):void 0}},{key:"render",value:function(){return(0,a.Z)("div",{className:"modal-dialog modal-message modal-register",role:"document"},void 0,(0,a.Z)("div",{className:"modal-content"},void 0,(0,a.Z)("div",{className:"modal-header"},void 0,(0,a.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,C||(C=(0,a.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,a.Z)("h4",{className:"modal-title"},void 0,pgettext("register modal title","Registration complete"))),(0,a.Z)("div",{className:"modal-body"},void 0,R||(R=(0,a.Z)("div",{className:"message-icon"},void 0,(0,a.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,a.Z)("div",{className:"message-body"},void 0,(0,a.Z)("p",{className:"lead"},void 0,interpolate(this.getLead(),{username:this.props.username},!0)),(0,a.Z)("p",{},void 0,interpolate(this.getSubscript(),{email:this.props.email},!0)),(0,a.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,pgettext("register modal dismiss","Ok"))))))}}]),n}(v().Component),F=function(e){(0,r.Z)(n,e);var t=z(n);function n(e){var a;return(0,i.Z)(this,n),a=t.call(this,e),(0,u.Z)((0,s.Z)(a),"completeRegistration",(function(e){"active"===e.activation?(Z.Z.hide(),A.Z.signIn(e)):a.setState({complete:e})})),a.state={complete:!1},a}return(0,o.Z)(n,[{key:"render",value:function(){return this.state.complete?(0,a.Z)(M,{activation:this.state.complete.activation,email:this.state.complete.email,username:this.state.complete.username}):v().createElement(q,(0,y.Z)({callback:this.completeRegistration},this.props))}}]),n}(v().Component);const H=function(e){(0,r.Z)(h,e);var t,n,d=(t=h,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,c.Z)(t);if(n){var i=(0,c.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,l.Z)(this,e)});function h(e){var t;return(0,i.Z)(this,h),t=d.call(this,e),(0,u.Z)((0,s.Z)(t),"showRegisterForm",(function(){t.props.onClick&&t.props.onClick(),"closed"===misago.get("SETTINGS").account_activation?g.Z.info(pgettext("register form","Registration form is currently disabled by the site administrator.")):t.state.isLoaded?Z.Z.show((0,a.Z)(F,{criteria:t.state.criteria})):(t.setState({isLoading:!0}),Promise.all([f.ZP.load(),m.Z.get(misago.get("AUTH_CRITERIA_API"))]).then((function(e){t.setState({isLoading:!1,isLoaded:!0,criteria:e[1]}),Z.Z.show((0,a.Z)(F,{criteria:e[1]}))}),(function(){t.setState({isLoading:!1}),g.Z.error(pgettext("register form","Registration form is currently unavailable due to an error."))})))})),t.state={isLoading:!1,isLoaded:!1,criteria:null},t}return(0,o.Z)(h,[{key:"render",value:function(){return(0,a.Z)("button",{className:p()("btn btn-register",this.props.className,{"btn-block":this.props.block,"btn-loading":this.state.isLoading}),disabled:this.state.isLoading,onClick:this.showRegisterForm,type:"button"},void 0,pgettext("cta","Register"),this.state.isLoading?U||(U=(0,a.Z)(b.Z,{})):null)}}]),h}(v().Component)},26106:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var a=n(22928),i=(n(57588),n(99170)),o=n(89627),s=function(e){var t=e.agreement,n=e.checked,i=e.errors,s=e.url,r=e.value,l=e.onChange;if(!s)return null;var c=interpolate('%(agreement)s',{agreement:(0,o.Z)(t),url:(0,o.Z)(s)},!0),u=interpolate(pgettext("register form agreement prompt","I have read and accept %(agreement)s."),{agreement:c},!0);return(0,a.Z)("div",{className:"checkbox legal-footnote"},void 0,(0,a.Z)("label",{},void 0,(0,a.Z)("input",{checked:n,type:"checkbox",value:r,onChange:l}),(0,a.Z)("span",{dangerouslySetInnerHTML:{__html:u}})),i&&i.map((function(e,t){return(0,a.Z)("div",{className:"help-block errors"},t,e)})))};const r=function(e){var t=e.errors,n=e.privacyPolicy,o=e.termsOfService,r=e.onPrivacyPolicyChange,l=e.onTermsOfServiceChange,c=i.Z.get("TERMS_OF_SERVICE_ID"),u=i.Z.get("TERMS_OF_SERVICE_URL"),d=i.Z.get("PRIVACY_POLICY_ID"),p=i.Z.get("PRIVACY_POLICY_URL");return c||d?(0,a.Z)("div",{},void 0,(0,a.Z)(s,{agreement:pgettext("register form agreement prompt","the terms of service"),checked:null!==o,errors:t.termsOfService,url:u,value:c,onChange:l}),(0,a.Z)(s,{agreement:pgettext("register form agreement prompt","the privacy policy"),checked:null!==n,errors:t.privacyPolicy,url:p,value:d,onChange:r})):null}},62989:(e,t,n)=>{"use strict";n.d(t,{E:()=>T,F:()=>I});var a=n(22928),i=n(57588),o=n.n(i),s=n(15671),r=n(43144),l=n(79340),c=n(6215),u=n(61120),d=n(60642),p=n(66398);function h(e){var t=e.children;return(0,a.Z)(p.NX,{className:"search-results-list"},void 0,t)}function v(){return(0,a.Z)(h,{},void 0,(0,a.Z)(p.j0,{message:pgettext("search cta","Enter search query (at least 3 characters).")}))}var m=n(16069);function f(e){var t=e.post;return(0,a.Z)(p.WI,{className:"search-result"},void 0,(0,a.Z)("a",{href:t.url.index},void 0,(0,a.Z)("div",{className:"search-result-card"},void 0,(0,a.Z)("div",{className:"search-result-name"},void 0,t.thread.title),(0,a.Z)("div",{className:"search-result-summary",dangerouslySetInnerHTML:{__html:t.content}}),(0,a.Z)("ul",{className:"search-result-details"},void 0,(0,a.Z)("li",{},void 0,(0,a.Z)("b",{},void 0,t.category.name)),(0,a.Z)("li",{},void 0,t.poster?t.poster.username:t.poster_name),(0,a.Z)("li",{},void 0,(0,a.Z)(m.Z,{datetime:t.posted_on}))))))}var Z,g,b,y=n(19605);function _(e){var t=e.user,n=t.title||t.rank.title;return(0,a.Z)(p.WI,{className:"search-result"},void 0,(0,a.Z)("a",{href:t.url},void 0,(0,a.Z)(y.ZP,{user:t,size:32}),(0,a.Z)("div",{className:"search-result-card"},void 0,(0,a.Z)("div",{className:"search-result-name"},void 0,t.username),(0,a.Z)("ul",{className:"search-result-details"},void 0,!!n&&(0,a.Z)("li",{},void 0,(0,a.Z)("b",{},void 0,n)),(0,a.Z)("li",{},void 0,t.rank.name),(0,a.Z)("li",{},void 0,(0,a.Z)(m.Z,{datetime:t.joined_on}))))))}function k(e){var t=e.query,n=e.results,i=n[0],o=n[1],s=i.results.count;return(0,a.Z)(h,{},void 0,o.results.results.map((function(e){return(0,a.Z)(_,{user:e},e.id)})),i.results.results.map((function(e){return(0,a.Z)(f,{post:e},e.id)})),s>0&&(0,a.Z)(p.WI,{},void 0,(0,a.Z)("a",{href:i.url+"?q="+encodeURIComponent(t),className:"btn btn-default btn-block"},void 0,npgettext("search results list","See all %(count)s result.","See all %(count)s results.",i.results.count).replace("%(count)s",i.results.count))))}function N(){return(0,a.Z)(h,{},void 0,(0,a.Z)(p.PB,{message:pgettext("search results","The search returned no results.")}))}function x(e){var t=e.error;return(0,a.Z)(h,{},void 0,(0,a.Z)(p.Zn,{message:pgettext("search results","The search could not be completed."),detail:w(t)}))}function w(e){return 0===e.status?gettext("Check your internet connection and try refreshing the site."):e.data&&e.data.detail?e.data.detail:void 0}function C(){return(0,a.Z)(h,{},void 0,(0,a.Z)(p.WE,{message:pgettext("search results","Searching...")}))}var R={},E=function(e){(0,l.Z)(o,e);var t,n,i=(t=o,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,u.Z)(t);if(n){var i=(0,u.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,c.Z)(this,e)});function o(e){var t;return(0,s.Z)(this,o),(t=i.call(this,e)).state={query:t.props.query.trim()},t.debounce=null,t}return(0,r.Z)(o,[{key:"componentDidUpdate",value:function(){var e=this,t=this.props.query.trim();this.state.query!=t&&(this.debounce&&window.clearTimeout(this.debounce),this.debounce=window.setTimeout((function(){e.setState({query:t})}),750))}},{key:"componentWillUnmount",value:function(){this.debounce&&window.clearTimeout(this.debounce)}},{key:"render",value:function(){var e,t=this;return(0,a.Z)(d.b,{url:(e=this.state.query,misago.get("SEARCH_API")+"?q="+encodeURIComponent(e)),cache:R,disabled:this.state.query.length<3},void 0,(function(e){var n=e.data,i=e.loading,o=e.error;return t.state.query.length<3?Z||(Z=(0,a.Z)(v,{})):i?g||(g=(0,a.Z)(C,{})):o?(0,a.Z)(x,{error:o}):function(e){if(null===e)return!0;var t=0;return e.forEach((function(e){t+=e.results.count})),0===t}(n)?b||(b=(0,a.Z)(N,{})):null!==n?(0,a.Z)(k,{query:t.state.query,results:n}):null}))}}]),o}(o().Component);function S(e){var t=e.query,n=e.setQuery;return(0,a.Z)("div",{className:"search-input"},void 0,(0,a.Z)("input",{className:"form-control form-control-search",type:"text",placeholder:pgettext("cta","Search"),value:t,onChange:function(e){return n(e.target.value)}}))}var O=n(97326),L=n(4942);var P=function(e){(0,l.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,u.Z)(t);if(n){var i=(0,u.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,c.Z)(this,e)});function i(e){var t;return(0,s.Z)(this,i),t=a.call(this,e),(0,L.Z)((0,O.Z)(t),"setQuery",(function(e){t.setState({query:e})})),t.state={query:""},t}return(0,r.Z)(i,[{key:"render",value:function(){return this.props.children({query:this.state.query,setQuery:this.setQuery})}}]),i}(o().Component);function T(){return(0,a.Z)(P,{},void 0,(function(e){var t=e.query,n=e.setQuery;return(0,a.Z)("div",{className:"search-dropdown-body"},void 0,(0,a.Z)(S,{query:t,setQuery:n}),(0,a.Z)(E,{query:t}))}))}var A=n(37424),B=n(64836);const I=(0,A.$j)((function(e){return{open:e.overlay.search}}))((function(e){var t=e.open;return(0,a.Z)(B.a,{open:t,onOpen:function(){window.setTimeout((function(){document.querySelector("#search-mount .form-control-search").focus()}),0)}},void 0,(0,a.Z)(B.i,{},void 0,pgettext("cta","Search")),(0,a.Z)(P,{},void 0,(function(e){var t=e.query,n=e.setQuery;return(0,a.Z)("div",{className:"search-overlay-body"},void 0,(0,a.Z)(S,{query:t,setQuery:n}),(0,a.Z)("div",{className:"search-results-container"},void 0,(0,a.Z)(E,{query:t})))})))}))},80261:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var a,i=n(22928),o=n(94184),s=n.n(o),r=(n(57588),n(59801)),l=n(14467);const c=function(e){var t=e.block,n=e.className,o=e.onClick,c=misago.get("SETTINGS");return c.DELEGATE_AUTH?(0,i.Z)("a",{className:s()("btn btn-sign-in",n,{"btn-block":t}),href:c.LOGIN_URL,onClick:function(){o&&o()}},void 0,pgettext("cta","Sign in")):(0,i.Z)("a",{className:s()("btn btn-sign-in",n,{"btn-block":t}),href:c.LOGIN_URL,onClick:function(e){e.preventDefault(),o&&o(),r.Z.show(a||(a=(0,i.Z)(l.Z,{})))}},void 0,pgettext("cta","Sign in"))}},6333:(e,t,n)=>{"use strict";n.d(t,{bS:()=>m,Or:()=>g});var a,i,o,s=n(22928),r=n(94184),l=n.n(r),c=(n(57588),n(37424)),u=n(49021),d=n(40689),p=n(80261),h=(0,c.$j)((function(e){return{isAnonymous:!e.auth.user.id}}))((function(e){var t=e.isAnonymous,n=e.close,r=e.dropdown,c=e.overlay,h=misago.get("MISAGO_PATH"),v=misago.get("SETTINGS"),m=misago.get("main_menu"),f=misago.get("extraMenuItems"),Z=misago.get("extraFooterItems"),g=misago.get("categories_menu"),b=misago.get("usersLists"),y=v.enable_oauth2_client,_=[];m.forEach((function(e){_.push({title:e.label,url:e.url})})),_.push({title:pgettext("site nav","Search"),url:h+"search/"});var k=[],N=misago.get("TERMS_OF_SERVICE_TITLE"),x=misago.get("TERMS_OF_SERVICE_URL");N&&x&&k.push({title:N,url:x});var w=misago.get("PRIVACY_POLICY_TITLE"),C=misago.get("PRIVACY_POLICY_URL");return w&&C&&k.push({title:w,url:C}),(0,s.Z)("ul",{className:l()("site-nav-menu",{"dropdown-menu-list":r,"overlay-menu-list":c})},void 0,t&&(0,s.Z)(u.Aw,{className:"site-nav-sign-in-message"},void 0,pgettext("cta","You are not signed in")),t&&(0,s.Z)(u.KE,{className:"site-nav-sign-in-options"},void 0,(0,s.Z)(p.Z,{onClick:n}),!y&&(0,s.Z)(d.Z,{onClick:n})),(0,s.Z)(u.iC,{},void 0,v.forum_name),_.map((function(e){return(0,s.Z)(u.Xi,{},e.url,(0,s.Z)("a",{href:e.url},void 0,e.title))})),f.map((function(e,t){return(0,s.Z)(u.Xi,{className:e.className},t,(0,s.Z)("a",{href:e.url,target:e.targetBlank?"_blank":null,rel:e.rel},void 0,e.title))})),!!b.length&&(a||(a=(0,s.Z)(u.YV,{className:"site-nav-users-divider"}))),!!b.length&&(0,s.Z)(u.iC,{className:"site-nav-users"},void 0,pgettext("site nav section","Users")),b.map((function(e){return(0,s.Z)(u.Xi,{},e.url,(0,s.Z)("a",{href:e.url},void 0,e.name))})),i||(i=(0,s.Z)(u.YV,{className:"site-nav-categories-divider"})),(0,s.Z)(u.iC,{className:"site-nav-categories"},void 0,pgettext("site nav section","Categories")),g.map((function(e){return e.is_vanilla?(0,s.Z)(u.Xi,{className:"site-nav-category-header"},e.id,(0,s.Z)("a",{href:e.url},void 0,e.name)):(0,s.Z)(u.Xi,{className:l()("site-nav-category",{"site-nav-category-last":e.last})},e.id,(0,s.Z)("a",{href:e.url},void 0,(0,s.Z)("span",{},void 0,e.name),(0,s.Z)("span",{className:l()("threads-list-item-category threads-list-category-label",{"threads-list-category-label-color":!!e.color}),style:{"--label-color":e.color}},void 0,e.short_name||e.name)))})),(!!k.length||!!Z.length)&&(o||(o=(0,s.Z)(u.YV,{className:"site-nav-footer-divider"}))),(!!k.length||!!Z.length)&&(0,s.Z)(u.iC,{className:"site-nav-footer"},void 0,pgettext("site nav section","Footer")),Z.map((function(e,t){return(0,s.Z)(u.Xi,{className:e.className},t,(0,s.Z)("a",{href:e.url,target:e.targetBlank?"_blank":null,rel:e.rel},void 0,e.title))})),k.map((function(e){return(0,s.Z)(u.Xi,{},e.url,(0,s.Z)("a",{href:e.url},void 0,e.title))})))}));const v=h;function m(e){var t=e.close;return(0,s.Z)(v,{close:t,dropdown:!0})}var f=n(993),Z=n(64836);const g=(0,c.$j)((function(e){return{isOpen:e.overlay.siteNav}}))((function(e){var t=e.dispatch,n=e.isOpen;return(0,s.Z)(Z.a,{open:n},void 0,(0,s.Z)(Z.i,{},void 0,pgettext("site nav title","Menu")),(0,s.Z)(v,{close:function(){return t((0,f.xv)())},overlay:!0}))}))},47235:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var a,i=n(22928),o=(n(57588),n(99170)),s=function(e){var t=e.className,n=e.text;return n?(0,i.Z)("h5",{className:t||""},void 0,n):null};const r=function(e){var t=e.buttonClassName,n=e.buttonLabel,r=e.formLabel,l=e.header,c=e.labelClassName,u=o.Z.get("SOCIAL_AUTH");return 0===u.length?null:(0,i.Z)("div",{className:"form-group form-social-auth"},void 0,(0,i.Z)(s,{className:c,text:l}),(0,i.Z)("div",{className:"row"},void 0,u.map((function(e){var a=e.pk,o=e.name,s=e.button_text,r=e.button_color,l=e.url,c="btn btn-block btn-default btn-social-"+a,u=r?{color:r}:null,d=s||interpolate(n,{site:o},!0);return(0,i.Z)("div",{className:t||"col-xs-12"},a,(0,i.Z)("a",{className:c,style:u,href:l},void 0,d))}))),a||(a=(0,i.Z)("hr",{})),(0,i.Z)(s,{className:c,text:r}))}},16069:(e,t,n)=>{"use strict";n.d(t,{Z:()=>m});var a=n(22928),i=n(15671),o=n(43144),s=n(97326),r=n(79340),l=n(6215),c=n(61120),u=n(4942),d=n(57588),p=n.n(d),h=n(75557);function v(e){return{tick:e.tick+1}}const m=function(e){(0,r.Z)(p,e);var t,n,d=(t=p,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,c.Z)(t);if(n){var i=(0,c.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,l.Z)(this,e)});function p(e){var t;return(0,i.Z)(this,p),t=d.call(this,e),(0,u.Z)((0,s.Z)(t),"scheduleNextUpdate",(function(){var e=new Date,n=Math.ceil(Math.abs(Math.round((t.date-e)/1e3)));n<3600?t.timeout=window.setTimeout((function(){t.setState(v),t.scheduleNextUpdate()}),5e4):n<86400&&(t.timeout=window.setTimeout((function(){t.setState(v)}),24e5))})),t.state={tick:0},t.date=new Date(e.datetime),t.timeout=null,t}return(0,o.Z)(p,[{key:"componentDidMount",value:function(){this.scheduleNextUpdate()}},{key:"componentWillUnmount",value:function(){this.timeout&&window.clearTimeout(this.timeout)}},{key:"render",value:function(){var e=this.props.narrow?(0,h.xn)(this.date):(0,h.SW)(this.date);return(0,a.Z)("attr",{title:this.props.title?this.props.title.replace("%(timestamp)s",h.ry.format(this.date)):h.ry.format(this.date)},void 0,e)}}]),p}(p().Component)},92490:(e,t,n)=>{"use strict";n.d(t,{o8:()=>s,Eg:()=>r,Z2:()=>l,tw:()=>c});var a=n(22928),i=n(94184),o=n.n(i);n(57588);const s=function(e){var t=e.children,n=e.className;return(0,a.Z)("nav",{className:o()("toolbar",n)},void 0,t)},r=function(e){var t=e.children,n=e.className,i=e.shrink;return(0,a.Z)("div",{className:o()("toolbar-item",n,{"toolbar-item-shrink":i})},void 0,t)},l=function(e){var t=e.auto,n=e.children,i=e.className;return(0,a.Z)("div",{className:o()("toolbar-section",{"toolbar-section-auto":t},i)},void 0,n)},c=function(e){var t=e.className;return(0,a.Z)("div",{className:o()("toolbar-spacer",t)})}},28166:(e,t,n)=>{"use strict";n.d(t,{o4:()=>ie,Qm:()=>re});var a,i=n(42982),o=n(22928),s=n(15671),r=n(43144),l=n(97326),c=n(79340),u=n(6215),d=n(61120),p=n(4942),h=n(94184),v=n.n(h),m=n(57588),f=n.n(m),Z=n(37424),g=n(59801),b=n(19605),y=n(82211),_=n(37848),k=n(78657),N=n(53904);var x,w=function(e){(0,c.Z)(h,e);var t,n,i=(t=h,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function h(e){var t;return(0,s.Z)(this,h),t=i.call(this,e),(0,p.Z)((0,l.Z)(t),"setGravatar",(function(){t.callApi("gravatar")})),(0,p.Z)((0,l.Z)(t),"setGenerated",(function(){t.callApi("generated")})),t.state={isLoading:!1},t}return(0,r.Z)(h,[{key:"callApi",value:function(e){var t=this;if(this.state.isLoading)return!1;this.setState({isLoading:!0}),k.Z.post(this.props.user.api.avatar,{avatar:e}).then((function(e){t.setState({isLoading:!1}),N.Z.success(e.detail),t.props.onComplete(e)}),(function(e){400===e.status?(N.Z.error(e.detail),t.setState({isLoading:!1})):t.props.showError(e)}))}},{key:"getGravatarButton",value:function(){return this.props.options.gravatar?(0,o.Z)(y.Z,{onClick:this.setGravatar,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-gravatar"},void 0,pgettext("avatar modal btn","Download my Gravatar")):null}},{key:"getCropButton",value:function(){return this.props.options.crop_src?(0,o.Z)(y.Z,{className:"btn-default btn-block btn-avatar-crop",disabled:this.state.isLoading,onClick:this.props.showCrop},void 0,pgettext("avatar modal btn","Re-crop uploaded image")):null}},{key:"getUploadButton",value:function(){return this.props.options.upload?(0,o.Z)(y.Z,{className:"btn-default btn-block btn-avatar-upload",disabled:this.state.isLoading,onClick:this.props.showUpload},void 0,pgettext("avatar modal btn","Upload new image")):null}},{key:"getGalleryButton",value:function(){return this.props.options.galleries?(0,o.Z)(y.Z,{className:"btn-default btn-block btn-avatar-gallery",disabled:this.state.isLoading,onClick:this.props.showGallery},void 0,pgettext("avatar modal btn","Pick avatar from gallery")):null}},{key:"getAvatarPreview",value:function(){var e={id:this.props.user.id,avatars:this.props.options.avatars};return this.state.isLoading?(0,o.Z)("div",{className:"avatar-preview preview-loading"},void 0,(0,o.Z)(b.ZP,{size:"200",user:e}),a||(a=(0,o.Z)(_.Z,{}))):(0,o.Z)("div",{className:"avatar-preview"},void 0,(0,o.Z)(b.ZP,{size:"200",user:e}))}},{key:"render",value:function(){return(0,o.Z)("div",{className:"modal-body modal-avatar-index"},void 0,(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-md-5"},void 0,this.getAvatarPreview()),(0,o.Z)("div",{className:"col-md-7"},void 0,this.getGravatarButton(),(0,o.Z)(y.Z,{onClick:this.setGenerated,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-generate"},void 0,pgettext("avatar modal btn","Generate my individual avatar")),this.getCropButton(),this.getUploadButton(),this.getGalleryButton())))}}]),h}(f().Component),C=n(19755);var R,E=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(e){var t;return(0,s.Z)(this,i),t=a.call(this,e),(0,p.Z)((0,l.Z)(t),"cropAvatar",(function(){if(t.state.isLoading)return!1;t.setState({isLoading:!0});var e=t.props.upload?"crop_tmp":"crop_src",n=C(".crop-form"),a=n.cropit("exportZoom"),i=n.cropit("offset");k.Z.post(t.props.user.api.avatar,{avatar:e,crop:{offset:{x:i.x*a,y:i.y*a},zoom:n.cropit("zoom")*a}}).then((function(e){t.props.onComplete(e),N.Z.success(e.detail)}),(function(e){400===e.status?(N.Z.error(e.detail),t.setState({isLoading:!1})):t.props.showError(e)}))})),t.state={isLoading:!1,deviceRatio:1},t}return(0,r.Z)(i,[{key:"getAvatarSize",value:function(){return this.props.upload?this.props.options.crop_tmp.size:this.props.options.crop_src.size}},{key:"getImagePath",value:function(){return this.props.upload?this.props.dataUrl:this.props.options.crop_src.url}},{key:"componentDidMount",value:function(){for(var e=this,t=C(".crop-form"),n=this.getAvatarSize(),a=t.width();aa.height){var i=(a.width*n-e.getAvatarSize())/-2;t.cropit("offset",{x:i,y:0})}else if(a.widththis.props.options.upload.limit)return interpolate(pgettext("avatar upload modal","Selected file is too big. (%(filesize)s)"),{filesize:(0,S.Z)(e.size)},!0);var t=pgettext("avatar upload modal","Selected file type is not supported.");if(-1===this.props.options.upload.allowed_mime_types.indexOf(e.type))return t;var n=!1,a=e.name.toLowerCase();return this.props.options.upload.allowed_extensions.map((function(e){a.substr(-1*e.length)===e&&(n=!0)})),!n&&t}},{key:"getUploadRequirements",value:function(e){var t=e.allowed_extensions.map((function(e){return e.substr(1)}));return interpolate(pgettext("avatar upload modal","%(files)s files smaller than %(limit)s"),{files:t.join(", "),limit:(0,S.Z)(e.limit)},!0)}},{key:"getUploadButton",value:function(){return(0,o.Z)("div",{className:"modal-body modal-avatar-upload"},void 0,(0,o.Z)(y.Z,{className:"btn-pick-file",onClick:this.pickFile},void 0,R||(R=(0,o.Z)("div",{className:"material-icon"},void 0,"input")),pgettext("avatar upload modal field","Select file")),(0,o.Z)("p",{className:"text-muted"},void 0,this.getUploadRequirements(this.props.options.upload)))}},{key:"getUploadProgressLabel",value:function(){return interpolate(pgettext("avatar upload modal field","%(progress)s % complete"),{progress:this.state.progress},!0)}},{key:"getUploadProgress",value:function(){return(0,o.Z)("div",{className:"modal-body modal-avatar-upload"},void 0,(0,o.Z)("div",{className:"upload-progress"},void 0,(0,o.Z)("img",{src:this.state.preview}),(0,o.Z)("div",{className:"progress"},void 0,(0,o.Z)("div",{className:"progress-bar",role:"progressbar","aria-valuenow":"{this.state.progress}","aria-valuemin":"0","aria-valuemax":"100",style:{width:this.state.progress+"%"}},void 0,(0,o.Z)("span",{className:"sr-only"},void 0,this.getUploadProgressLabel())))))}},{key:"renderUpload",value:function(){return(0,o.Z)("div",{},void 0,(0,o.Z)("input",{type:"file",id:"avatar-hidden-upload",className:"hidden-file-upload",onChange:this.uploadFile}),this.state.image?this.getUploadProgress():this.getUploadButton(),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("div",{className:"col-md-6 col-md-offset-3"},void 0,(0,o.Z)(y.Z,{onClick:this.props.showIndex,disabled:!!this.state.image,className:"btn-default btn-block"},void 0,pgettext("avatar upload modal btn","Cancel")))))}},{key:"renderCrop",value:function(){return(0,o.Z)(E,{options:this.state.options,user:this.props.user,upload:this.state.uploaded,dataUrl:this.state.preview,onComplete:this.props.onComplete,showError:this.props.showError,showIndex:this.props.showIndex})}},{key:"render",value:function(){return this.state.uploaded?this.renderCrop():this.renderUpload()}}]),i}(f().Component),P=n(87462),T=(n(99170),n(69130));function A(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,a=(0,d.Z)(e);if(t){var i=(0,d.Z)(this).constructor;n=Reflect.construct(a,arguments,i)}else n=a.apply(this,arguments);return(0,u.Z)(this,n)}}var B,I,j,D=function(e){(0,c.Z)(n,e);var t=A(n);function n(){var e;(0,s.Z)(this,n);for(var a=arguments.length,i=new Array(a),o=0;o2}:t.state={options:e.options,optionsMore:!1},t}return(0,r.Z)(i,[{key:"render",value:function(){var e=this.props,t=e.user,n=e.close,a=e.dropdown,i=e.overlay;if(!t)return null;var s=misago.get("ADMIN_URL");return(0,o.Z)("ul",{className:v()("user-nav-menu",{"dropdown-menu-list":a,"overlay-menu-list":i})},void 0,(0,o.Z)("li",{className:"dropdown-menu-item"},void 0,(0,o.Z)("a",{href:t.url,className:"user-nav-profile"},void 0,(0,o.Z)("strong",{},void 0,t.username),(0,o.Z)("small",{},void 0,pgettext("user nav","Go to your profile")))),$||($=(0,o.Z)(ee.YV,{})),(0,o.Z)(ee.Xi,{},void 0,(0,o.Z)("a",{href:misago.get("NOTIFICATIONS_URL")},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,t.unreadNotifications?"notifications_active":"notifications_none"),pgettext("user nav","Notifications"),!!t.unreadNotifications&&(0,o.Z)("span",{className:"badge"},void 0,t.unreadNotifications))),!!t.showPrivateThreads&&(0,o.Z)(ee.Xi,{},void 0,(0,o.Z)("a",{href:misago.get("PRIVATE_THREADS_URL")},void 0,W||(W=(0,o.Z)("span",{className:"material-icon"},void 0,"inbox")),pgettext("user nav","Private threads"),!!t.unreadPrivateThreads&&(0,o.Z)("span",{className:"badge"},void 0,t.unreadPrivateThreads))),!!s&&(0,o.Z)(ee.Xi,{},void 0,(0,o.Z)("a",{href:s,target:"_blank"},void 0,Q||(Q=(0,o.Z)("span",{className:"material-icon"},void 0,"security")),pgettext("user nav","Admin control panel"))),K||(K=(0,o.Z)(ee.YV,{})),(0,o.Z)(ee.iC,{className:"user-nav-options"},void 0,pgettext("user nav section","Account settings")),(0,o.Z)(ee.Xi,{},void 0,(0,o.Z)("button",{className:"btn-link",onClick:this.changeAvatar,type:"button"},void 0,X||(X=(0,o.Z)("span",{className:"material-icon"},void 0,"portrait")),pgettext("user nav","Change avatar"))),this.state.options.map((function(e){return(0,o.Z)(ee.Xi,{},e.icon,(0,o.Z)("a",{href:e.url},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,e.icon),e.name))})),(0,o.Z)(ee.Xi,{},void 0,(0,o.Z)("button",{className:v()("btn-link",{"d-none":!this.state.optionsMore}),onClick:this.revealOptions,type:"button"},void 0,J||(J=(0,o.Z)("span",{className:"material-icon"},void 0,"more_vertical")),pgettext("user nav","See more"))),!!a&&(0,o.Z)(ee.kE,{listItem:!0},void 0,(0,o.Z)("button",{className:"btn btn-default btn-block",onClick:function(){te(),n()},type:"button"},void 0,pgettext("user nav","Log out"))))}}]),i}(f().Component);const ae=(0,Z.$j)((function(e){var t=e.auth.user;return t.id?{user:{username:t.username,unreadNotifications:t.unreadNotifications,unreadPrivateThreads:t.unread_private_threads,showPrivateThreads:t.acl.can_use_private_threads,url:t.url},options:(0,i.Z)(misago.get("userOptions"))}:{user:null}}))(ne);function ie(e){var t=e.close;return(0,o.Z)(ae,{close:t,dropdown:!0})}var oe=n(993),se=n(64836);const re=(0,Z.$j)((function(e){return{isOpen:e.overlay.userNav}}))((function(e){var t=e.dispatch,n=e.isOpen;return(0,o.Z)(se.a,{open:n},void 0,(0,o.Z)(se.i,{},void 0,pgettext("user nav title","Your options")),(0,o.Z)(ae,{close:function(){return t((0,oe.xv)())},overlay:!0}),(0,o.Z)(ee.kE,{},void 0,(0,o.Z)("button",{className:"btn btn-default btn-block",onClick:function(){te(),t((0,oe.xv)())},type:"button"},void 0,pgettext("user nav","Log out"))))}))},19605:(e,t,n)=>{"use strict";n.d(t,{ZP:()=>o});var a=n(22928),i=(n(57588),n(99170));function o(e){var t=e.size||100,n=e.size2x||2*t;return(0,a.Z)("img",{alt:"",className:e.className||"user-avatar",src:s(e.user,t),srcSet:s(e.user,n),width:e.height||t,height:e.height||t})}function s(e,t){return e&&e.id?function(e,t){var n=e[0];return e.forEach((function(e){e.size>=t&&(n=e)})),n}(e.avatars,t).url:i.Z.get("BLANK_AVATAR_URL")}},82211:(e,t,n)=>{"use strict";n.d(t,{Z:()=>h});var a,i=n(22928),o=n(15671),s=n(43144),r=n(79340),l=n(6215),c=n(61120),u=n(57588),d=n.n(u),p=n(37848);var h=function(e){(0,r.Z)(d,e);var t,n,u=(t=d,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,c.Z)(t);if(n){var i=(0,c.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,l.Z)(this,e)});function d(){return(0,o.Z)(this,d),u.apply(this,arguments)}return(0,s.Z)(d,[{key:"render",value:function(){var e="btn "+this.props.className,t=this.props.disabled;return this.props.loading&&(e+=" btn-loading",t=!0),(0,i.Z)("button",{className:e,disabled:t,onClick:this.props.onClick,type:this.props.onClick?"button":"submit"},void 0,this.props.children,this.props.loading?a||(a=(0,i.Z)(p.Z,{})):null)}}]),d}(d().Component);h.defaultProps={className:"btn-default",type:"submit",loading:!1,disabled:!1,onClick:null}},57026:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var a=n(22928);function i(e){return(0,a.Z)("select",{className:e.className||"form-control",disabled:e.disabled||!1,id:e.id||null,onChange:e.onChange,value:e.value},void 0,e.choices.map((function(e){return(0,a.Z)("option",{disabled:e.disabled||!1,value:e.value},e.value,"- - ".repeat(e.level)+e.label)})))}n(57588)},96359:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var a=n(22928),i=n(15671),o=n(43144),s=n(79340),r=n(6215),l=n(61120),c=n(57588);var u=function(e){(0,s.Z)(u,e);var t,n,c=(t=u,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,l.Z)(t);if(n){var i=(0,l.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,r.Z)(this,e)});function u(){return(0,i.Z)(this,u),c.apply(this,arguments)}return(0,o.Z)(u,[{key:"isValidated",value:function(){return void 0!==this.props.validation}},{key:"getClassName",value:function(){var e="form-group";return this.isValidated()&&(e+=" has-feedback",null===this.props.validation?e+=" has-success":e+=" has-error"),e}},{key:"getFeedback",value:function(){var e=this;return this.props.validation?(0,a.Z)("div",{className:"help-block errors"},void 0,this.props.validation.map((function(t,n){return(0,a.Z)("p",{},e.props.for+"FeedbackItem"+n,t)}))):null}},{key:"getFeedbackDescription",value:function(){return this.isValidated()?(0,a.Z)("span",{id:this.props.for+"_status",className:"sr-only"},void 0,this.props.validation?pgettext("field validation status","(error)"):pgettext("field validation status","(success)")):null}},{key:"getHelpText",value:function(){return this.props.helpText?(0,a.Z)("p",{className:"help-block"},void 0,this.props.helpText):null}},{key:"render",value:function(){return(0,a.Z)("div",{className:this.getClassName()},void 0,(0,a.Z)("label",{className:"control-label "+(this.props.labelClass||""),htmlFor:this.props.for||""},void 0,this.props.label+":"),(0,a.Z)("div",{className:this.props.controlClass||""},void 0,this.props.children,this.getFeedbackDescription(),this.getFeedback(),this.getHelpText(),this.props.extra||null))}}]),u}(n.n(c)().Component)},43345:(e,t,n)=>{"use strict";n.d(t,{Z:()=>m});var a=n(15671),i=n(43144),o=n(97326),s=n(79340),r=n(6215),l=n(61120),c=n(4942),u=n(57588),d=n.n(u),p=n(55210),h=n(53904);var v=(0,p.C1)(),m=function(e){(0,s.Z)(d,e);var t,n,u=(t=d,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,l.Z)(t);if(n){var i=(0,l.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,r.Z)(this,e)});function d(){var e;(0,a.Z)(this,d);for(var t=arguments.length,n=new Array(t),i=0;i{"use strict";n.d(t,{Z:()=>u});var a=n(22928),i=n(15671),o=n(43144),s=n(79340),r=n(6215),l=n(61120),c=n(57588);var u=function(e){(0,s.Z)(u,e);var t,n,c=(t=u,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,l.Z)(t);if(n){var i=(0,l.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,r.Z)(this,e)});function u(){return(0,i.Z)(this,u),c.apply(this,arguments)}return(0,o.Z)(u,[{key:"isActive",value:function(){return this.props.isControlled?this.props.isActive:!!this.props.path&&0===document.location.pathname.indexOf(this.props.path)}},{key:"getClassName",value:function(){return this.isActive()?(this.props.className||"")+" "+(this.props.activeClassName||"active"):this.props.className||""}},{key:"render",value:function(){return(0,a.Z)("li",{className:this.getClassName()},void 0,this.props.children)}}]),u}(n.n(c)().Component)},37848:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a,i=n(22928);function o(e){return(0,i.Z)("div",{className:e.className||"loader"},void 0,a||(a=(0,i.Z)("div",{className:"loader-spinning-wheel"})))}n(57588)},69092:(e,t,n)=>{"use strict";n.d(t,{Z:()=>g});var a=n(15671),i=n(43144),o=n(79340),s=n(6215),r=n(61120),l=n(94184),c=n.n(l),u=n(57588),d=n.n(u),p=n(4942),h=n(19755),v=new RegExp("^.*(?:(?:youtu.be/|v/|vi/|u/w/|embed/)|(?:(?:watch)??v(?:i)?=|&v(?:i)?=))([^#&?]*).*");const m=new(function(){function e(){var t=this;(0,a.Z)(this,e),(0,p.Z)(this,"render",(function(e){e&&(t.highlightCode(e),t.embedYoutubePlayers(e))})),this._youtube={}}return(0,i.Z)(e,[{key:"highlightCode",value:function(e){n.e(417).then(n.bind(n,15739)).then((function(t){for(var n=t.default,a=e.querySelectorAll("pre>code"),i=0;ia"),n=0;n');h(e).replaceWith(a),a.wrap('
    ')}}]),e}());function f(e){var t=function(e){var t=e;return"https://"===e.substr(0,8)?t=t.substr(8):"http://"===e.substr(0,7)&&(t=t.substr(7)),"www."===t.substr(0,4)&&(t=t.substr(4)),t}(e),n=function(e){if(-1===e.indexOf("youtu"))return null;var t=e.match(v);return t?t[1]:null}(t);if(!n)return null;var a=0;if(t.indexOf("?")>0){var i=t.substr(t.indexOf("?")+1).split("&").filter((function(e){return"t="===e.substr(0,2)}))[0];if(i){var o=i.substr(2).split("m");"s"===o[0].substr(-1)?a+=parseInt(o[0].substr(0,o[0].length-1)):(a+=60*parseInt(o[0]),o[1]&&"s"===o[1].substr(-1)&&(a+=parseInt(o[1].substr(0,o[1].length-1))))}}return{start:a,video:n}}var Z=n(19755);var g=function(e){(0,o.Z)(u,e);var t,n,l=(t=u,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,r.Z)(t);if(n){var i=(0,r.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,s.Z)(this,e)});function u(){return(0,a.Z)(this,u),l.apply(this,arguments)}return(0,i.Z)(u,[{key:"componentDidMount",value:function(){m.render(this.documentNode),Z(this.documentNode).find(".spoiler-reveal").click(b)}},{key:"componentDidUpdate",value:function(e,t){m.render(this.documentNode),Z(this.documentNode).find(".spoiler-reveal").click(b)}},{key:"shouldComponentUpdate",value:function(e,t){return e.markup!==this.props.markup}},{key:"render",value:function(){var e=this;return d().createElement("article",{className:c()("misago-markup",this.props.className),dangerouslySetInnerHTML:{__html:this.props.markup},"data-author":this.props.author||void 0,ref:function(t){e.documentNode=t}})}}]),u}(d().Component);function b(e){var t=e.target;Z(t).parent().parent().addClass("revealed")}},3784:(e,t,n)=>{"use strict";n.d(t,{Z:()=>h});var a,i=n(22928),o=n(15671),s=n(43144),r=n(79340),l=n(6215),c=n(61120),u=n(57588),d=n.n(u),p=n(37848);var h=function(e){(0,r.Z)(d,e);var t,n,u=(t=d,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,c.Z)(t);if(n){var i=(0,c.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,l.Z)(this,e)});function d(){return(0,o.Z)(this,d),u.apply(this,arguments)}return(0,s.Z)(d,[{key:"render",value:function(){return a||(a=(0,i.Z)("div",{className:"modal-body modal-loader"},void 0,(0,i.Z)(p.Z,{})))}}]),d}(d().Component)},30337:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var a=n(22928),i=n(15671),o=n(43144),s=n(79340),r=n(6215),l=n(61120);n(57588);var c=function(e){(0,s.Z)(u,e);var t,n,c=(t=u,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,l.Z)(t);if(n){var i=(0,l.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,r.Z)(this,e)});function u(){return(0,i.Z)(this,u),c.apply(this,arguments)}return(0,o.Z)(u,[{key:"getHelpText",value:function(){return this.props.helpText?(0,a.Z)("p",{className:"help-block"},void 0,this.props.helpText):null}},{key:"render",value:function(){return(0,a.Z)("div",{className:"modal-body"},void 0,(0,a.Z)("div",{className:"message-icon"},void 0,(0,a.Z)("span",{className:"material-icon"},void 0,this.props.icon||"info_outline")),(0,a.Z)("div",{className:"message-body"},void 0,(0,a.Z)("p",{className:"lead"},void 0,this.props.message),this.getHelpText(),(0,a.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,pgettext("modal message dismiss btn","Ok"))))}}]),u}(n(33556).Z)},33556:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var a=n(22928),i=n(15671),o=n(43144),s=n(79340),r=n(6215),l=n(61120),c=n(57588);var u=function(e){(0,s.Z)(u,e);var t,n,c=(t=u,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,l.Z)(t);if(n){var i=(0,l.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,r.Z)(this,e)});function u(){return(0,i.Z)(this,u),c.apply(this,arguments)}return(0,o.Z)(u,[{key:"getHelpText",value:function(){return this.props.helpText?(0,a.Z)("p",{className:"help-block"},void 0,this.props.helpText):null}},{key:"render",value:function(){return(0,a.Z)("div",{className:"panel-body panel-message-body"},void 0,(0,a.Z)("div",{className:"message-icon"},void 0,(0,a.Z)("span",{className:"material-icon"},void 0,this.props.icon||"info_outline")),(0,a.Z)("div",{className:"message-body"},void 0,(0,a.Z)("p",{className:"lead"},void 0,this.props.message),this.getHelpText()))}}]),u}(n.n(c)().Component)},11005:(e,t,n)=>{"use strict";n.d(t,{Z:()=>x});var a=n(22928),i=n(57588),o=n.n(i),s=n(69092);function r(e){return e.post.content?o().createElement(l,e):o().createElement(c,e)}function l(e){return(0,a.Z)("div",{className:"post-body"},void 0,(0,a.Z)(s.Z,{markup:e.post.content}))}function c(e){return(0,a.Z)("div",{className:"post-body post-body-invalid"},void 0,(0,a.Z)("p",{className:"lead"},void 0,pgettext("post body invalid","This post's contents cannot be displayed.")),(0,a.Z)("p",{className:"text-muted"},void 0,pgettext("post body invalid","This error is caused by invalid post content manipulation.")))}function u(e){var t=e.post,n=t.category,i=t.thread,o=interpolate(pgettext("posts feed item header","posted %(posted_on)s"),{posted_on:t.posted_on.format("LL, LT")},!0);return(0,a.Z)("div",{className:"post-heading"},void 0,(0,a.Z)("a",{className:"btn btn-link item-title",href:i.url},void 0,i.title),(0,a.Z)("a",{className:"btn btn-link post-category",href:n.url.index},void 0,n.name),(0,a.Z)("a",{href:t.url.index,className:"btn btn-link posted-on",title:o},void 0,t.posted_on.fromNow()))}var d,p,h=n(19605);function v(e){var t=e.post;return(0,a.Z)("a",{className:"btn btn-default btn-icon pull-right",href:t.url.index},void 0,(0,a.Z)("span",{className:"btn-text-left hidden-xs"},void 0,pgettext("go to post link","See post")),d||(d=(0,a.Z)("span",{className:"material-icon"},void 0,"chevron_right")))}function m(e){var t=e.post;return(0,a.Z)("div",{className:"post-side post-side-anonymous"},void 0,(0,a.Z)(v,{post:t}),(0,a.Z)("div",{className:"media"},void 0,p||(p=(0,a.Z)("div",{className:"media-left"},void 0,(0,a.Z)("span",{},void 0,(0,a.Z)(h.ZP,{className:"poster-avatar",size:50})))),(0,a.Z)("div",{className:"media-body"},void 0,(0,a.Z)("div",{className:"media-heading"},void 0,(0,a.Z)("span",{className:"item-title"},void 0,t.poster_name)),(0,a.Z)("span",{className:"user-title user-title-anonymous"},void 0,pgettext("post removed poster username","Removed user")))))}function f(e){var t=e.rank,n=e.title||t.title||t.name,i="user-title";return t.css_class&&(i+=" user-title-"+t.css_class),t.is_tab?(0,a.Z)("a",{className:i,href:t.url},void 0,n):(0,a.Z)("span",{className:i},void 0,n)}function Z(e){var t=e.post,n=e.poster;return(0,a.Z)("div",{className:"post-side post-side-registered"},void 0,(0,a.Z)(v,{post:t}),(0,a.Z)("div",{className:"media"},void 0,(0,a.Z)("div",{className:"media-left"},void 0,(0,a.Z)("a",{href:n.url},void 0,(0,a.Z)(h.ZP,{className:"poster-avatar",size:50,user:n}))),(0,a.Z)("div",{className:"media-body"},void 0,(0,a.Z)("div",{className:"media-heading"},void 0,(0,a.Z)("a",{className:"item-title",href:n.url},void 0,n.username)),(0,a.Z)(f,{title:n.title,rank:n.rank}))))}function g(e){var t=e.post,n=e.poster;return n&&n.id?(0,a.Z)(Z,{post:t,poster:n}):(0,a.Z)(m,{post:t})}function b(e){var t=e.post,n=e.poster||t.poster,i="post";return n&&n.rank.css_class&&(i+=" post-"+n.rank.css_class),(0,a.Z)("li",{className:i,id:"post-"+t.id},void 0,(0,a.Z)("div",{className:"panel panel-default panel-post"},void 0,(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)("div",{className:"panel-content"},void 0,(0,a.Z)(g,{post:t,poster:n}),(0,a.Z)(u,{post:t}),(0,a.Z)(r,{post:t})))))}var y,_,k=n(44039);function N(){return(0,a.Z)("ul",{className:"posts-list post-feed ui-preview"},void 0,(0,a.Z)("li",{className:"post"},void 0,(0,a.Z)("div",{className:"panel panel-default panel-post"},void 0,(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)("div",{className:"panel-content"},void 0,(0,a.Z)("div",{className:"post-side post-side-anonymous"},void 0,(0,a.Z)("div",{className:"media"},void 0,y||(y=(0,a.Z)("div",{className:"media-left"},void 0,(0,a.Z)("span",{},void 0,(0,a.Z)(h.ZP,{className:"poster-avatar",size:50})))),(0,a.Z)("div",{className:"media-body"},void 0,(0,a.Z)("div",{className:"media-heading"},void 0,(0,a.Z)("span",{className:"item-title"},void 0,(0,a.Z)("span",{className:"ui-preview-text",style:{width:k.e(30,200)+"px"}},void 0," "))),(0,a.Z)("span",{className:"user-title user-title-anonymous"},void 0,(0,a.Z)("span",{className:"ui-preview-text",style:{width:k.e(30,200)+"px"}},void 0," "))))),(0,a.Z)("div",{className:"post-heading"},void 0,(0,a.Z)("span",{className:"ui-preview-text",style:{width:k.e(30,200)+"px"}},void 0," ")),(0,a.Z)("div",{className:"post-body"},void 0,(0,a.Z)("article",{className:"misago-markup"},void 0,(0,a.Z)("p",{},void 0,(0,a.Z)("span",{className:"ui-preview-text",style:{width:k.e(30,200)+"px"}},void 0," ")," ",(0,a.Z)("span",{className:"ui-preview-text",style:{width:k.e(30,200)+"px"}},void 0," ")," ",(0,a.Z)("span",{className:"ui-preview-text",style:{width:k.e(30,200)+"px"}},void 0," ")))))))))}function x(e){var t=e.isReady,n=e.posts,i=e.poster;return t?(0,a.Z)("ul",{className:"posts-list post-feed ui-ready"},void 0,n.map((function(e){return(0,a.Z)(b,{post:e,poster:i},e.id)}))):_||(_=(0,a.Z)(N,{}))}},9771:(e,t,n)=>{"use strict";n.d(t,{mv:()=>m,ZP:()=>cn,MO:()=>A,Fi:()=>N});var a,i=n(57588),o=n.n(i),s=n(22928),r=n(43144),l=n(15671),c=n(97326),u=n(79340),d=n(6215),p=n(61120),h=n(4942),v=n(64646);var m=function(e){(0,u.Z)(m,e);var t,n,i=(t=m,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function m(e){var t;return(0,l.Z)(this,m),t=i.call(this,e),(0,h.Z)((0,c.Z)(t),"selected",(function(){if(t.element){var e=Z(t.element)||null,n=e?e.getBoundingClientRect():null;t.setState({range:e,rect:n})}})),(0,h.Z)((0,c.Z)(t),"reply",(function(){if(v.Z.isOpen()){var e=A();e&&!e.disabled&&(e.quote(N(t.state.range)),t.setState({range:null,rect:null}),f())}else{var n=N(t.state.range);v.Z.open(Object.assign({},t.props.posting,{default:n})),t.setState({range:null,rect:null}),window.setTimeout(f,1e3)}})),(0,h.Z)((0,c.Z)(t),"render",(function(){return(0,s.Z)("div",{},void 0,o().createElement("div",{ref:function(e){e&&(t.element=e)},onMouseUp:t.selected,onTouchEnd:t.selected},t.props.children),!!t.state.rect&&(0,s.Z)("div",{className:"quote-control",style:{position:"absolute",left:t.state.rect.left+window.scrollX,top:t.state.rect.bottom+window.scrollY}},void 0,a||(a=(0,s.Z)("div",{className:"quote-control-arrow"})),(0,s.Z)("div",{className:"quote-control-inner"},void 0,(0,s.Z)("button",{className:"btn quote-control-btn",type:"button",onClick:t.reply},void 0,pgettext("post reply","Quote")))))})),t.state={range:null,rect:null},t.element=null,t}return(0,r.Z)(m)}(o().Component);function f(){var e=document.querySelector("#posting-mount textarea");e.focus(),e.selectionStart=e.selectionEnd=e.value.length}var Z=function(e){if(void 0!==window.getSelection){var t=window.getSelection();if(t&&"Range"===t.type&&1===t.rangeCount){var n=t.getRangeAt(0);if(g(n,e)&&b(n)&&y(n.cloneContents()))return n}}},g=function(e,t){var n=e.commonAncestorContainer;if(n===t)return!0;for(var a=n.parentNode;a;){if(a===t)return!0;a=a.parentNode}return!1},b=function(e){var t=e.commonAncestorContainer;if("ARTICLE"===t.nodeName)return!0;if(t.dataset&&"1"===t.dataset.noquote)return!1;for(var n=t.parentNode;n;){if(n.dataset&&"1"===n.dataset.noquote)return!1;if("ARTICLE"===n.nodeName)return!0;n=n.parentNode}return!1},y=function e(t){for(var n=0;n0)return!0;if("IMG"===a.nodeName)return!0;if(e(a))return!0}return!1},_=n(42982),k=n(70885);const N=function(e){var t=x(e),n=L(e.cloneContents().childNodes,[]),a=t?'[quote="'.concat(t,'"]\n'):"[quote]\n",i="\n[/quote]\n\n",o=R(e);return o?(a+=o.syntax?"[code=".concat(o.syntax,"]\n"):"[code]\n",i="\n[/code]"+i):S(e)?(n=n.trim(),a+="`",i="`"+i):n=n.trim(),a+n+i};var x=function(e){var t=e.commonAncestorContainer;if(w(t))return C(t);for(var n=t.parentNode;n;){if(w(n))return C(n);n=n.parentNode}return""},w=function(e){return e.nodeType===Node.ELEMENT_NODE&&("ARTICLE"===e.nodeName||"BLOCKQUOTE"===e.nodeName&&e.dataset&&"quote"===e.dataset.block)},C=function(e){return e.dataset&&e.dataset.author||null},R=function(e){var t=e.commonAncestorContainer;if(E(t))return O(t);for(var n=t.parentNode;n;){if(E(n))return O(n);n=n.parentNode}return null},E=function(e){return"PRE"===e.nodeName},S=function(e){var t=e.commonAncestorContainer;if("CODE"===t.nodeName)return!0;for(var n=t.parentNode;n;){if(w(n))return!1;if("CODE"===n.nodeName)return!0;n=n.parentNode}return!1},O=function(e){return e.dataset?{syntax:e.dataset.syntax||null}:{syntax:null}},L=function(e,t){for(var n="",a=0;a0&&(0,s.Z)("li",{},void 0,(0,K.Z)(n.size))))),!!n.id&&(0,s.Z)("div",{className:"markup-editor-attachment-buttons"},void 0,(0,s.Z)("button",{className:"btn btn-markup-editor-attachment btn-icon",title:pgettext("markup editor","Insert into message"),type:"button",disabled:a,onClick:function(){var e=function(e){var t="[";return e.is_image?(t+="!["+e.filename+"]",t+="("+(e.url.thumb||e.url.index)+"?shva=1)"):t+=e.filename,t+"]("+e.url.index+"?shva=1)"}(n),t=oe(i);ie(t,r,e)}},void 0,J||(J=(0,s.Z)("span",{className:"material-icon"},void 0,"flip_to_front"))),(0,s.Z)("button",{className:"btn btn-markup-editor-attachment btn-icon",title:pgettext("markup editor","Remove attachment"),type:"button",disabled:a,onClick:function(){o((function(e){var t=e.attachments;if(window.confirm(pgettext("markup editor","Remove this attachment?")))return{attachments:t.filter((function(e){return e.id!==n.id}))}}))}},void 0,ee||(ee=(0,s.Z)("span",{className:"material-icon"},void 0,"close")))),!n.id&&!!n.key&&(0,s.Z)("div",{className:"markup-editor-attachment-buttons"},void 0,n.error&&(0,s.Z)("button",{className:"btn btn-markup-editor-attachment btn-icon",title:pgettext("markup editor","See error"),type:"button",onClick:function(){V.Z.error(interpolate(pgettext("markup editor","%(filename)s: %(error)s"),{filename:n.filename,error:n.error},!0))}},void 0,te||(te=(0,s.Z)("span",{className:"material-icon"},void 0,"warning"))),(0,s.Z)("button",{className:"btn btn-markup-editor-attachment btn-icon",title:pgettext("markup editor","Remove attachment"),type:"button",disabled:a,onClick:function(){o((function(e){return{attachments:e.attachments.filter((function(e){return e.key!==n.key}))}}))}},void 0,ne||(ne=(0,s.Z)("span",{className:"material-icon"},void 0,"close"))))))},ce=function(e){var t=e.attachments,n=e.disabled,a=e.element,i=e.setState,o=e.update;return(0,s.Z)("div",{className:"markup-editor-attachments"},void 0,(0,s.Z)("div",{className:"markup-editor-attachments-container"},void 0,t.map((function(e){return(0,s.Z)(le,{attachment:e,disabled:n,element:a,setState:i,update:o},e.key||e.id)}))))};var ue,de=n(82211);const pe=function(e){var t=e.canProtect,n=e.disabled,a=e.empty,i=e.preview,o=e.isProtected,r=e.submitText,l=e.showPreview,c=e.closePreview,u=e.enableProtection,d=e.disableProtection;return(0,s.Z)("div",{className:"markup-editor-footer"},void 0,!!t&&(0,s.Z)(de.Z,{className:"btn-default btn-icon hidden-sm hidden-md hidden-lg",title:o?pgettext("markup editor","Protected"):pgettext("markup editor","Protect"),type:"button",disabled:n,onClick:function(){o?d():u()}},void 0,(0,s.Z)("span",{className:"material-icon"},void 0,o?"lock":"lock_open")),!!t&&(0,s.Z)("div",{},void 0,(0,s.Z)(de.Z,{className:"btn-default hidden-xs",type:"button",disabled:n,onClick:function(){o?d():u()}},void 0,(0,s.Z)("span",{className:"material-icon"},void 0,o?"lock":"lock_open"),o?pgettext("markup editor","Protected"):pgettext("markup editor","Protect"))),ue||(ue=(0,s.Z)("div",{className:"markup-editor-spacer"})),i?(0,s.Z)(de.Z,{className:"btn-default btn-auto",type:"button",onClick:c},void 0,pgettext("markup editor","Edit")):(0,s.Z)(de.Z,{className:"btn-default btn-auto",disabled:n||a,type:"button",onClick:l},void 0,pgettext("markup editor","Preview")),(0,s.Z)(de.Z,{className:"btn-primary btn-auto",disabled:n||a},void 0,r||pgettext("markup editor","Post")))};var he,ve=n(96359);var me=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(e){var t;return(0,l.Z)(this,i),t=a.call(this,e),(0,h.Z)((0,c.Z)(t),"handleSubmit",(function(e){e.preventDefault();var n=t.props,a=n.selection,i=n.update,o=t.state.syntax.trim(),s=t.state.text.trim();if(0===s.length)return t.setState({error:gettext("This field is required.")}),!1;var r=a.prefix.trim().length?"\n\n":"";return ie(Object.assign({},a,{text:s}),i,r+"```"+o+"\n"+s+"\n```\n\n"),Q.Z.hide(),!1})),t.state={error:null,syntax:"",text:e.selection.text},t}return(0,r.Z)(i,[{key:"render",value:function(){var e=this;return(0,s.Z)("div",{className:"modal-dialog modal-lg",role:"document"},void 0,(0,s.Z)("div",{className:"modal-content"},void 0,(0,s.Z)("div",{className:"modal-header"},void 0,(0,s.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,he||(he=(0,s.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,s.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Code"))),(0,s.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,s.Z)("div",{className:"modal-body"},void 0,(0,s.Z)(ve.Z,{for:"markup_code_syntax",label:pgettext("markup editor","Syntax highlighting")},void 0,(0,s.Z)("select",{id:"markup_code_syntax",className:"form-control",value:this.state.syntax,onChange:function(t){return e.setState({syntax:t.target.value})}},void 0,(0,s.Z)("option",{value:""},void 0,pgettext("markup editor","No syntax highlighting")),fe.map((function(e){var t=e.value,n=e.name;return(0,s.Z)("option",{value:t},t,n)})))),(0,s.Z)(ve.Z,{for:"markup_code_text",label:pgettext("markup editor","Code to insert"),validation:this.state.error?[this.state.error]:void 0},void 0,(0,s.Z)("textarea",{id:"markup_code_text",className:"form-control",rows:"8",value:this.state.text,onChange:function(t){return e.setState({text:t.target.value})}}))),(0,s.Z)("div",{className:"modal-footer"},void 0,(0,s.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,pgettext("markup editor","Cancel")),(0,s.Z)("button",{className:"btn btn-primary"},void 0,pgettext("markup editor","Insert code"))))))}}]),i}(o().Component),fe=[{value:"bash",name:"Bash"},{value:"c",name:"C"},{value:"c#",name:"C#"},{value:"c++",name:"C++"},{value:"css",name:"CSS"},{value:"diff",name:"Diff"},{value:"go",name:"Go"},{value:"graphql",name:"GraphQL"},{value:"html,",name:"HTML"},{value:"xml",name:"XML"},{value:"json",name:"JSON"},{value:"java",name:"Java"},{value:"javascript",name:"JavaScript"},{value:"kotlin",name:"Kotlin"},{value:"less",name:"Less"},{value:"lua",name:"Lua"},{value:"makefile",name:"Makefile"},{value:"markdown",name:"Markdown"},{value:"objective-C",name:"Objective-C"},{value:"php",name:"PHP"},{value:"perl",name:"Perl"},{value:"plain",name:"Plain"},{value:"text",name:"text"},{value:"python",name:"Python"},{value:"repl",name:"REPL"},{value:"r",name:"R"},{value:"ruby",name:"Ruby"},{value:"rust",name:"Rust"},{value:"scss",name:"SCSS"},{value:"sql",name:"SQL"},{value:"shell",name:"Shell Session"},{value:"swift",name:"Swift"},{value:"toml",name:"TOML"},{value:"ini",name:"INI"},{value:"typescript",name:"TypeScript"},{value:"visualbasic",name:"Visual Basic .NET"},{value:"webassembly",name:"WebAssembly"},{value:"yaml",name:"YAML"}];const Ze=me;var ge,be,ye,_e,ke,Ne,xe,we,Ce,Re,Ee,Se,Oe,Le,Pe,Te,Ae,Be,Ie,je,De,ze,Ue,qe,Me,Fe,He,Ve,Ye,Ge,$e,We,Qe,Ke,Xe,Je,et,tt,nt,at,it,ot,st,rt,lt;function ct(){return(0,s.Z)("div",{className:"modal-dialog modal-lg",role:"document"},void 0,(0,s.Z)("div",{className:"modal-content"},void 0,(0,s.Z)("div",{className:"modal-header"},void 0,(0,s.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,ge||(ge=(0,s.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,s.Z)("h4",{className:"modal-title"},void 0,pgettext("markup help","Formatting help"))),(0,s.Z)("div",{className:"modal-body formatting-help"},void 0,(0,s.Z)("h4",{},void 0,pgettext("markup help","Emphasis text")),(0,s.Z)(ut,{markup:pgettext("markup help","_This text will have emphasis_"),result:(0,s.Z)("p",{},void 0,(0,s.Z)("em",{},void 0,pgettext("markup help","This text will have emphasis")))}),be||(be=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Bold text")),(0,s.Z)(ut,{markup:pgettext("markup help","**This text will be bold**"),result:(0,s.Z)("p",{},void 0,(0,s.Z)("strong",{},void 0,pgettext("markup help","This text will be bold")))}),ye||(ye=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Removed text")),(0,s.Z)(ut,{markup:pgettext("markup help","~~This text will be removed~~"),result:(0,s.Z)("p",{},void 0,(0,s.Z)("del",{},void 0,pgettext("markup help","This text will be removed")))}),_e||(_e=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Bold text (BBCode)")),(0,s.Z)(ut,{markup:pgettext("markup help","[b]This text will be bold[/b]"),result:(0,s.Z)("p",{},void 0,(0,s.Z)("b",{},void 0,pgettext("markup help","This text will be bold")))}),ke||(ke=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Underlined text (BBCode)")),(0,s.Z)(ut,{markup:pgettext("markup help","[u]This text will be underlined[/u]"),result:(0,s.Z)("p",{},void 0,(0,s.Z)("u",{},void 0,pgettext("markup help","This text will be underlined")))}),Ne||(Ne=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Italics text (BBCode)")),(0,s.Z)(ut,{markup:pgettext("markup help","[i]This text will be in italics[/i]"),result:(0,s.Z)("p",{},void 0,(0,s.Z)("i",{},void 0,pgettext("markup help","This text will be in italics")))}),xe||(xe=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Link")),we||(we=(0,s.Z)(ut,{markup:"",result:(0,s.Z)("p",{},void 0,(0,s.Z)("a",{href:"#"},void 0,"example.com"))})),Ce||(Ce=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Link with text")),(0,s.Z)(ut,{markup:"["+pgettext("markup help","Link text")+"](http://example.com)",result:(0,s.Z)("p",{},void 0,(0,s.Z)("a",{href:"#"},void 0,pgettext("markup help","Link text")))}),Re||(Re=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Link (BBCode)")),Ee||(Ee=(0,s.Z)(ut,{markup:"[url]http://example.com[/url]",result:(0,s.Z)("p",{},void 0,(0,s.Z)("a",{href:"#"},void 0,"example.com"))})),Se||(Se=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Link with text (BBCode)")),(0,s.Z)(ut,{markup:"[url=http://example.com]"+pgettext("markup help","Link text")+"[/url]",result:(0,s.Z)("p",{},void 0,(0,s.Z)("a",{href:"#"},void 0,pgettext("markup help","Link text")))}),Oe||(Oe=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Image")),Le||(Le=(0,s.Z)(ut,{markup:"!(http://dummyimage.com/38/38)",result:(0,s.Z)("p",{},void 0,(0,s.Z)("img",{alt:"",src:"http://dummyimage.com/38/38"}))})),Pe||(Pe=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Image with alternate text")),(0,s.Z)(ut,{markup:"!["+pgettext("markup help","Image text")+"](http://dummyimage.com/38/38)",result:(0,s.Z)("p",{},void 0,(0,s.Z)("img",{alt:pgettext("markup help","Image text"),src:"http://dummyimage.com/38/38"}))}),Te||(Te=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Image (BBCode)")),Ae||(Ae=(0,s.Z)(ut,{markup:"[img]http://dummyimage.com/38/38[/img]",result:(0,s.Z)("p",{},void 0,(0,s.Z)("img",{alt:"",src:"http://dummyimage.com/38/38"}))})),Be||(Be=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Mention user by their name")),Ie||(Ie=(0,s.Z)(ut,{markup:"@username",result:(0,s.Z)("p",{},void 0,(0,s.Z)("a",{href:"#"},void 0,"@username"))})),je||(je=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Heading 1")),(0,s.Z)(ut,{markup:pgettext("markup help","# First level heading"),result:(0,s.Z)("h1",{},void 0,pgettext("markup help","First level heading"))}),De||(De=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Heading 2")),(0,s.Z)(ut,{markup:pgettext("markup help","## Second level heading"),result:(0,s.Z)("h2",{},void 0,pgettext("markup help","Second level heading"))}),ze||(ze=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Heading 3")),(0,s.Z)(ut,{markup:pgettext("markup help","### Third level heading"),result:(0,s.Z)("h3",{},void 0,pgettext("markup help","Third level heading"))}),Ue||(Ue=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Heading 4")),(0,s.Z)(ut,{markup:pgettext("markup help","#### Fourth level heading"),result:(0,s.Z)("h4",{},void 0,pgettext("markup help","Fourth level heading"))}),qe||(qe=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Heading 5")),(0,s.Z)(ut,{markup:pgettext("markup help","##### Fifth level heading"),result:(0,s.Z)("h5",{},void 0,pgettext("markup help","Fifth level heading"))}),Me||(Me=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Unordered list")),Fe||(Fe=(0,s.Z)(ut,{markup:"- Lorem ipsum\n- Dolor met\n- Vulputate lectus",result:(0,s.Z)("ul",{},void 0,(0,s.Z)("li",{},void 0,"Lorem ipsum"),(0,s.Z)("li",{},void 0,"Dolor met"),(0,s.Z)("li",{},void 0,"Vulputate lectus"))})),He||(He=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Ordered list")),Ve||(Ve=(0,s.Z)(ut,{markup:"1. Lorem ipsum\n2. Dolor met\n3. Vulputate lectus",result:(0,s.Z)("ol",{},void 0,(0,s.Z)("li",{},void 0,"Lorem ipsum"),(0,s.Z)("li",{},void 0,"Dolor met"),(0,s.Z)("li",{},void 0,"Vulputate lectus"))})),Ye||(Ye=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Quote text")),(0,s.Z)(ut,{markup:"> "+pgettext("markup help","Quoted text"),result:(0,s.Z)("blockquote",{},void 0,(0,s.Z)("p",{},void 0,pgettext("markup help","Quoted text")))}),Ge||(Ge=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Quote text (BBCode)")),(0,s.Z)(ut,{markup:"[quote]\n"+pgettext("markup help","Quoted text")+"\n[/quote]",result:(0,s.Z)("aside",{className:"quote-block"},void 0,(0,s.Z)("div",{className:"quote-heading"},void 0,gettext("Quoted message:")),(0,s.Z)("blockquote",{className:"quote-body"},void 0,(0,s.Z)("p",{},void 0,pgettext("markup help","Quoted text"))))}),$e||($e=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Quote text with author (BBCode)")),(0,s.Z)(ut,{markup:'[quote="'+pgettext("markup help","Quote author")+'"]\n'+pgettext("markup help","Quoted text")+"\n[/quote]",result:(0,s.Z)("aside",{className:"quote-block"},void 0,(0,s.Z)("div",{className:"quote-heading"},void 0,pgettext("markup help","Quote author has written:")),(0,s.Z)("blockquote",{className:"quote-body"},void 0,(0,s.Z)("p",{},void 0,pgettext("markup help","Quoted text"))))}),We||(We=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Spoiler")),(0,s.Z)(ut,{markup:"[spoiler]\n"+pgettext("markup help","Secret text")+"\n[/spoiler]",result:(0,s.Z)(pt,{},void 0,pgettext("markup help","Secret text"))}),Qe||(Qe=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Inline code")),(0,s.Z)(ut,{markup:pgettext("markup help","`Inline code`"),result:(0,s.Z)("p",{},void 0,(0,s.Z)("code",{},void 0,pgettext("markup help","Inline code")))}),Ke||(Ke=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Code block")),Xe||(Xe=(0,s.Z)(ut,{markup:'```\nalert("Hello world!");\n```',result:(0,s.Z)("pre",{},void 0,(0,s.Z)("code",{className:"hljs"},void 0,'alert("Hello world!");'))})),Je||(Je=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Code block with syntax highlighting")),et||(et=(0,s.Z)(ut,{markup:'```python\nprint("Hello world!");\n```',result:(0,s.Z)("pre",{},void 0,(0,s.Z)("code",{className:"hljs language-python"},void 0,(0,s.Z)("span",{className:"hljs-built_in"},void 0,"print"),'("Hello world!");'))})),tt||(tt=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Code block (BBCode)")),nt||(nt=(0,s.Z)(ut,{markup:'[code]\nalert("Hello world!");\n[/code]',result:(0,s.Z)("pre",{},void 0,(0,s.Z)("code",{className:"hljs"},void 0,'alert("Hello world!");'))})),at||(at=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Code block with syntax highlighting (BBCode)")),it||(it=(0,s.Z)(ut,{markup:'[code="python"]\nprint("Hello world!");\n[/code]',result:(0,s.Z)("pre",{},void 0,(0,s.Z)("code",{className:"hljs language-python"},void 0,(0,s.Z)("span",{className:"hljs-built_in"},void 0,"print"),'("Hello world!");'))})),ot||(ot=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Horizontal rule")),st||(st=(0,s.Z)(ut,{markup:"Lorem ipsum\n- - -\nDolor met",result:(0,s.Z)("div",{},void 0,(0,s.Z)("p",{},void 0,"Lorem ipsum"),(0,s.Z)("hr",{}),(0,s.Z)("p",{},void 0,"Dolor met"))})),rt||(rt=(0,s.Z)("hr",{})),(0,s.Z)("h4",{},void 0,pgettext("markup help","Horizontal rule (BBCode)")),lt||(lt=(0,s.Z)(ut,{markup:"Lorem ipsum\n[hr]\nDolor met",result:(0,s.Z)("div",{},void 0,(0,s.Z)("p",{},void 0,"Lorem ipsum"),(0,s.Z)("hr",{}),(0,s.Z)("p",{},void 0,"Dolor met"))}))),(0,s.Z)("div",{className:"modal-footer"},void 0,(0,s.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,pgettext("modal","Close")))))}function ut(e){var t=e.markup,n=e.result;return(0,s.Z)("div",{className:"formatting-help-item"},void 0,(0,s.Z)("div",{className:"formatting-help-item-markup"},void 0,(0,s.Z)("pre",{},void 0,(0,s.Z)("code",{},void 0,t))),(0,s.Z)("div",{className:"formatting-help-item-preview"},void 0,(0,s.Z)("article",{className:"misago-markup"},void 0,n)))}var dt,pt=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(e){var t;return(0,l.Z)(this,i),(t=a.call(this,e)).state={reveal:!1},t}return(0,r.Z)(i,[{key:"render",value:function(){var e=this;return(0,s.Z)("aside",{className:this.state.reveal?"spoiler-block revealed":"spoiler-block"},void 0,(0,s.Z)("blockquote",{className:"spoiler-body"},void 0,(0,s.Z)("p",{},void 0,this.props.children)),!this.state.reveal&&(0,s.Z)("div",{className:"spoiler-overlay"},void 0,(0,s.Z)("button",{className:"spoiler-reveal",type:"button",onClick:function(){e.setState({reveal:!0})}},void 0,gettext("Reveal spoiler"))))}}]),i}(o().Component),ht=new RegExp("^(((ftps?)|(https?))://)","i");function vt(e){return ht.test(e.trim())}const mt=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(e){var t;(0,l.Z)(this,i),t=a.call(this,e),(0,h.Z)((0,c.Z)(t),"handleSubmit",(function(e){e.preventDefault();var n=t.props,a=n.selection,i=n.update,o=t.state.text.trim(),s=t.state.url.trim();return 0===s.length?(t.setState({error:gettext("This field is required.")}),!1):(o.length>0?ie(a,i,"!["+o+"]("+s+")"):ie(a,i,"!("+s+")"),Q.Z.hide(),!1)}));var n=e.selection.text.trim(),o=vt(n);return t.state={error:null,text:o?"":n,url:o?n:""},t}return(0,r.Z)(i,[{key:"render",value:function(){var e=this;return(0,s.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,s.Z)("div",{className:"modal-content"},void 0,(0,s.Z)("div",{className:"modal-header"},void 0,(0,s.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,dt||(dt=(0,s.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,s.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Image"))),(0,s.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,s.Z)("div",{className:"modal-body"},void 0,(0,s.Z)(ve.Z,{for:"markup_image_text",label:pgettext("markup editor","Image description"),helpText:pgettext("markup editor","Optional but recommended . Will be displayed instead of image when it fails to load.")},void 0,(0,s.Z)("input",{id:"markup_image_text",className:"form-control",type:"text",value:this.state.text,onChange:function(t){return e.setState({text:t.target.value})}})),(0,s.Z)(ve.Z,{for:"markup_image_url",label:pgettext("markup editor","Image URL"),validation:this.state.error?[this.state.error]:void 0},void 0,(0,s.Z)("input",{id:"markup_image_url",className:"form-control",type:"text",value:this.state.url,placeholder:"http://domain.com/image.png",onChange:function(t){return e.setState({url:t.target.value})}}))),(0,s.Z)("div",{className:"modal-footer"},void 0,(0,s.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,pgettext("markup editor","Cancel")),(0,s.Z)("button",{className:"btn btn-primary"},void 0,pgettext("markup editor","Insert image"))))))}}]),i}(o().Component);var ft;const Zt=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(e){var t;(0,l.Z)(this,i),t=a.call(this,e),(0,h.Z)((0,c.Z)(t),"handleSubmit",(function(e){e.preventDefault();var n=t.props,a=n.selection,i=n.update,o=t.state.text.trim(),s=t.state.url.trim();return 0===s.length?(t.setState({error:gettext("This field is required.")}),!1):(o.length>0?ie(a,i,"["+o+"]("+s+")"):ie(a,i,"<"+s+">"),Q.Z.hide(),!1)}));var n=e.selection.text.trim(),o=vt(n);return t.state={error:null,text:o?"":n,url:o?n:""},t}return(0,r.Z)(i,[{key:"render",value:function(){var e=this;return(0,s.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,s.Z)("div",{className:"modal-content"},void 0,(0,s.Z)("div",{className:"modal-header"},void 0,(0,s.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,ft||(ft=(0,s.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,s.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Link"))),(0,s.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,s.Z)("div",{className:"modal-body"},void 0,(0,s.Z)(ve.Z,{for:"markup_link_url",label:pgettext("markup editor","Link text"),helpText:pgettext("markup editor","Optional. Will be displayed instead of link's address.")},void 0,(0,s.Z)("input",{id:"markup_link_text",className:"form-control",type:"text",value:this.state.text,onChange:function(t){return e.setState({text:t.target.value})}})),(0,s.Z)(ve.Z,{for:"markup_link_url",label:pgettext("markup editor","Link address"),validation:this.state.error?[this.state.error]:void 0},void 0,(0,s.Z)("input",{id:"markup_link_url",className:"form-control",type:"text",value:this.state.url,onChange:function(t){return e.setState({url:t.target.value})}}))),(0,s.Z)("div",{className:"modal-footer"},void 0,(0,s.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,pgettext("markup editor","Cancel")),(0,s.Z)("button",{className:"btn btn-primary"},void 0,pgettext("markup editor","Insert link"))))))}}]),i}(o().Component);var gt;const bt=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(e){var t;return(0,l.Z)(this,i),t=a.call(this,e),(0,h.Z)((0,c.Z)(t),"handleSubmit",(function(e){e.preventDefault();var n=t.props,a=n.selection,i=n.update,o=t.state.author.trim(),s=t.state.text.trim();if(0===s.length)return t.setState({error:gettext("This field is required.")}),!1;var r=a.prefix.trim().length?"\n\n":"";return ie(a,i,o?r+'[quote="'+o+'"]\n'+s+"\n[/quote]\n\n":r+"[quote]\n"+s+"\n[/quote]\n\n"),Q.Z.hide(),!1})),t.state={error:null,author:"",text:e.selection.text},t}return(0,r.Z)(i,[{key:"render",value:function(){var e=this;return(0,s.Z)("div",{className:"modal-dialog modal-lg",role:"document"},void 0,(0,s.Z)("div",{className:"modal-content"},void 0,(0,s.Z)("div",{className:"modal-header"},void 0,(0,s.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,gt||(gt=(0,s.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,s.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Quote"))),(0,s.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,s.Z)("div",{className:"modal-body"},void 0,(0,s.Z)(ve.Z,{for:"markup_quote_author",label:pgettext("markup editor","Quote's author or source"),helpText:pgettext("markup editor",'Optional. If it\'s username, put "@" before it ("@JohnDoe").')},void 0,(0,s.Z)("input",{id:"markup_quote_author",className:"form-control",type:"text",value:this.state.author,onChange:function(t){return e.setState({author:t.target.value})}})),(0,s.Z)(ve.Z,{for:"markup_quote_text",label:pgettext("markup editor","Quoted text"),validation:this.state.error?[this.state.error]:void 0},void 0,(0,s.Z)("textarea",{id:"markup_quote_text",className:"form-control",rows:"8",value:this.state.text,onChange:function(t){return e.setState({text:t.target.value})}}))),(0,s.Z)("div",{className:"modal-footer"},void 0,(0,s.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,pgettext("markup editor","Cancel")),(0,s.Z)("button",{className:"btn btn-primary"},void 0,pgettext("markup editor","Insert quote"))))))}}]),i}(o().Component),yt=function(e){var t=e.disabled,n=e.icon,a=e.title,i=e.onClick;return(0,s.Z)("button",{className:"btn btn-markup-editor",title:a,type:"button",disabled:t,onClick:i},void 0,(0,s.Z)("span",{className:"material-icon"},void 0,n))};var _t=n(54031);const kt=function(e,t){var n=1024*$.Z.get("user").acl.max_attachment_size;if(e.size>n)V.Z.error(interpolate(pgettext("markup editor","File %(filename)s is bigger than %(limit)s."),{filename:e.name,limit:(0,K.Z)(n)},!0));else{var a={id:null,key:(0,_t.ZP)(32),error:null,uploaded_on:null,progress:0,filename:e.name,filetype:null,is_image:!1,size:e.size,url:null,uploader_name:null};t((function(e){var t=e.attachments;return{attachments:[a].concat(t)}}));var i=function(){t((function(e){return{attachments:e.attachments.concat()}}))},o=new FormData;o.append("upload",e),H.Z.upload($.Z.get("ATTACHMENTS_API"),o,(function(e){a.progress=e,i()})).then((function(e){Object.assign(a,e,{uploaded_on:U()(e.uploaded_on)}),i()}),(function(e){400===e.status||413===e.status?(a.error=e.detail,V.Z.error(e.detail),i()):V.Z.apiError(e)}))}};var Nt,xt;const wt=function(e){var t=e.disabled,n=e.element,a=e.update,i=e.updateAttachments,o=[{name:pgettext("markup editor","Strong"),icon:"format_bold",onClick:function(){ae(oe(n),a,"**","**",pgettext("example markup","Strong text"))}},{name:pgettext("markup editor","Emphasis"),icon:"format_italic",onClick:function(){ae(oe(n),a,"*","*",pgettext("example markup","Text with emphasis"))}},{name:pgettext("markup editor","Strikethrough"),icon:"format_strikethrough",onClick:function(){ae(oe(n),a,"~~","~~",pgettext("example markup","Text with strikethrough"))}},{name:pgettext("markup editor","Horizontal ruler"),icon:"remove",onClick:function(){ie(oe(n),a,"\n\n- - -\n\n")}},{name:pgettext("markup editor","Link"),icon:"insert_link",onClick:function(){var e=oe(n);Q.Z.show((0,s.Z)(Zt,{selection:e,element:n,update:a}))}},{name:pgettext("markup editor","Image"),icon:"insert_photo",onClick:function(){var e=oe(n);Q.Z.show((0,s.Z)(mt,{selection:e,element:n,update:a}))}},{name:pgettext("markup editor","Quote"),icon:"format_quote",onClick:function(){var e=oe(n);Q.Z.show((0,s.Z)(bt,{selection:e,element:n,update:a}))}},{name:pgettext("markup editor","Spoiler"),icon:"visibility_off",onClick:function(){!function(e,t){var n=oe(e),a=n.prefix.trim().length?"\n\n":"";ae(n,t,a+"[spoiler]\n","\n[/spoiler]\n\n",pgettext("markup editor","Spoiler text"))}(n,a)}},{name:pgettext("markup editor","Code"),icon:"code",onClick:function(){var e=oe(n);Q.Z.show((0,s.Z)(Ze,{selection:e,element:n,update:a}))}}];return $.Z.get("user").acl.max_attachment_size&&o.push({name:pgettext("markup editor","Upload file"),icon:"file_upload",onClick:function(){return e=i,(t=document.createElement("input")).type="file",t.multiple="multiple",t.addEventListener("change",(function(){for(var n=0;n${username}
  • ',insertTpl:"@${username}",searchKey:"username",callbacks:{remoteFilter:function(e,t){Ct.getJSON($.Z.get("MENTION_API"),{q:e},t)}}}),Ct(t).on("inserted.atwho",(function(t,n,a,i){var o=i.query,s=a.target.innerText.trim(),r=t.target.value.substr(0,o.headPos),l=t.target.value.substr(o.endPos);t.target.value=r+s+l,e.onChange(t);var c=o.headPos+s.length;t.target.setSelectionRange(c,c),t.target.focus()}))}(t.props,e))},onChange:t.props.onChange,onDrop:t.onDrop,onFocus:function(){return t.setState({focused:!0})},onPaste:t.onPaste,onBlur:function(){return t.setState({focused:!1})}}),t.props.attachments.length>0&&(0,s.Z)(ce,{attachments:t.props.attachments,disabled:t.props.disabled||t.state.preview,element:t.state.element,setState:t.props.onAttachmentsChange,update:function(e){return t.props.onChange({target:{value:e}})}}),(0,s.Z)(pe,{preview:t.state.preview,canProtect:t.props.canProtect,isProtected:t.props.isProtected,disabled:t.props.disabled,empty:t.props.value.trim().length<$.Z.get("SETTINGS").post_length_min||t.state.loading,enableProtection:t.props.enableProtection,disableProtection:t.props.disableProtection,showPreview:t.showPreview,closePreview:t.closePreview,submitText:t.props.submitText}))})),t.state={element:null,focused:!1,loading:!1,preview:!1,parsed:null},t}return(0,r.Z)(i)}(o().Component);var Et=n(92490);var St="posting-active",Ot="posting-default",Lt="posting-minimized",Pt="posting-fullscreen";const Tt=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(){return(0,l.Z)(this,i),a.apply(this,arguments)}return(0,r.Z)(i,[{key:"componentDidMount",value:function(){document.body.classList.add(St,Ot)}},{key:"componentWillUnmount",value:function(){document.body.classList.remove(St,Ot,Lt,Pt)}},{key:"componentWillReceiveProps",value:function(e){var t=e.fullscreen;e.minimized?(document.body.classList.remove(Ot,Pt),document.body.classList.add(Lt)):t?(document.body.classList.remove(Ot,Lt),document.body.classList.add(Pt)):(document.body.classList.remove(Pt,Lt),document.body.classList.add(Ot))}},{key:"render",value:function(){var e=this.props,t=e.children,n=e.fullscreen,a=e.minimized;return(0,s.Z)("div",{className:G()("posting-dialog",{"posting-dialog-minimized":a,"posting-dialog-fullscreen":n&&!a})},void 0,(0,s.Z)("div",{className:"posting-dialog-container"},void 0,t))}}]),i}(o().Component),At=function(e){var t=e.children;return(0,s.Z)("div",{className:"posting-dialog-body"},void 0,t)};var Bt;const It=function(e){var t=e.close,n=e.message;return(0,s.Z)("div",{className:"posting-dialog-error"},void 0,Bt||(Bt=(0,s.Z)("div",{className:"posting-dialog-error-icon"},void 0,(0,s.Z)("span",{className:"material-icon"},void 0,"error_outlined"))),(0,s.Z)("div",{className:"posting-dialog-error-detail"},void 0,(0,s.Z)("p",{},void 0,n),(0,s.Z)("button",{type:"button",className:"btn btn-default",onClick:t},void 0,pgettext("modal","Close"))))};var jt,Dt,zt,Ut,qt;const Mt=function(e){var t=e.children,n=e.close,a=e.fullscreen,i=e.minimize,o=e.minimized,r=e.fullscreenEnter,l=e.fullscreenExit,c=e.open;return(0,s.Z)("div",{className:"posting-dialog-header"},void 0,(0,s.Z)("div",{className:"posting-dialog-caption"},void 0,t),o?(0,s.Z)("button",{className:"btn btn-posting-dialog",title:pgettext("dialog","Open"),type:"button",onClick:c},void 0,jt||(jt=(0,s.Z)("span",{className:"material-icon"},void 0,"expand_less"))):(0,s.Z)("button",{className:"btn btn-posting-dialog",title:pgettext("dialog","Minimize"),type:"button",onClick:i},void 0,Dt||(Dt=(0,s.Z)("span",{className:"material-icon"},void 0,"expand_more"))),a?(0,s.Z)("button",{className:"btn btn-posting-dialog hidden-xs",title:pgettext("dialog","Exit the fullscreen mode"),type:"button",onClick:l},void 0,zt||(zt=(0,s.Z)("span",{className:"material-icon"},void 0,"fullscreen_exit"))):(0,s.Z)("button",{className:"btn btn-posting-dialog hidden-xs",title:pgettext("dialog","Enter the fullscreen mode"),type:"button",onClick:r},void 0,Ut||(Ut=(0,s.Z)("span",{className:"material-icon"},void 0,"fullscreen"))),(0,s.Z)("button",{className:"btn btn-posting-dialog",title:pgettext("dialog","Cancel"),type:"button",onClick:n},void 0,qt||(qt=(0,s.Z)("span",{className:"material-icon"},void 0,"close"))))};var Ft,Ht,Vt,Yt,Gt,$t,Wt,Qt,Kt;function Xt(e){var t=e.isClosed,n=e.isHidden,a=e.isPinned,i=e.disabled,o=e.options,r=e.close,l=e.open,c=e.hide,u=e.unhide,d=e.pinGlobally,p=e.pinLocally,h=e.unpin,v=function(e,t,n){var a=[];return 2===n&&a.push("bookmark"),1===n&&a.push("bookmark_outline"),e&&a.push("lock"),t&&a.push("visibility_off"),a}(t,n,a);return(0,s.Z)("div",{className:"dropdown"},void 0,(0,s.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:pgettext("post thread","Options"),"aria-expanded":"true","aria-haspopup":"true","data-toggle":"dropdown",type:"button",disabled:i},void 0,v.length>0?(0,s.Z)("span",{className:"btn-icons-family"},void 0,v.map((function(e){return(0,s.Z)("span",{className:"material-icon"},e,e)}))):Ft||(Ft=(0,s.Z)("span",{className:"material-icon"},void 0,"more_horiz"))),(0,s.Z)("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},void 0,2===o.pin&&2!==a&&(0,s.Z)("li",{},void 0,(0,s.Z)("button",{className:"btn btn-link",onClick:d,type:"button",disabled:i},void 0,Ht||(Ht=(0,s.Z)("span",{className:"material-icon"},void 0,"bookmark")),pgettext("post thread","Pinned globally"))),o.pin>=a&&1!==a&&(0,s.Z)("li",{},void 0,(0,s.Z)("button",{className:"btn btn-link",onClick:p,type:"button",disabled:i},void 0,Vt||(Vt=(0,s.Z)("span",{className:"material-icon"},void 0,"bookmark_outline")),pgettext("post thread","Pinned in category"))),o.pin>=a&&0!==a&&(0,s.Z)("li",{},void 0,(0,s.Z)("button",{className:"btn btn-link",onClick:h,type:"button",disabled:i},void 0,Yt||(Yt=(0,s.Z)("span",{className:"material-icon"},void 0,"radio_button_unchecked")),pgettext("post thread","Not pinned"))),o.close&&!!t&&(0,s.Z)("li",{},void 0,(0,s.Z)("button",{className:"btn btn-link",onClick:l,type:"button",disabled:i},void 0,Gt||(Gt=(0,s.Z)("span",{className:"material-icon"},void 0,"lock_outline")),pgettext("post thread","Open"))),o.close&&!t&&(0,s.Z)("li",{},void 0,(0,s.Z)("button",{className:"btn btn-link",onClick:r,type:"button",disabled:i},void 0,$t||($t=(0,s.Z)("span",{className:"material-icon"},void 0,"lock")),pgettext("post thread","Closed"))),o.hide&&!!n&&(0,s.Z)("li",{},void 0,(0,s.Z)("button",{className:"btn btn-link",onClick:u,type:"button",disabled:i},void 0,Wt||(Wt=(0,s.Z)("span",{className:"material-icon"},void 0,"visibility")),pgettext("post thread","Visible"))),o.hide&&!n&&(0,s.Z)("li",{},void 0,(0,s.Z)("button",{className:"btn btn-link",onClick:c,type:"button",disabled:i},void 0,Qt||(Qt=(0,s.Z)("span",{className:"material-icon"},void 0,"visibility_off")),pgettext("post thread","Hidden")))))}var Jt=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(e){var t;return(0,l.Z)(this,i),t=a.call(this,e),(0,h.Z)((0,c.Z)(t),"loadSuccess",(function(e){var n=null,a=null,i=e.map((function(e){return!1===e.post||n&&e.id!=t.state.category||(n=e.id,a=e.post),Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id})}));t.setState({isReady:!0,options:a,categories:i,category:n})})),(0,h.Z)((0,c.Z)(t),"loadError",(function(e){t.setState({error:e.detail})})),(0,h.Z)((0,c.Z)(t),"onCancel",(function(){if(0===t.state.post.length&&0===t.state.title.length&&0===t.state.attachments.length)return t.minimize(),v.Z.close();window.confirm(pgettext("post thread","Are you sure you want to discard thread?"))&&(t.minimize(),v.Z.close())})),(0,h.Z)((0,c.Z)(t),"onTitleChange",(function(e){t.changeValue("title",e.target.value)})),(0,h.Z)((0,c.Z)(t),"onCategoryChange",(function(e){var n=t.state.categories.find((function(t){return e.target.value==t.value})),a=t.state.pin;n.post.pin&&n.post.pin0}));return t.filter((function(e,n){return t.indexOf(e)==n}))}var nn=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(e){var t;(0,l.Z)(this,i),t=a.call(this,e),(0,h.Z)((0,c.Z)(t),"onCancel",(function(){if(0===t.state.post.length&&0===t.state.title.length&&0===t.state.to.length&&0===t.state.attachments.length)return t.close();window.confirm(pgettext("post thread","Are you sure you want to discard private thread?"))&&t.close()})),(0,h.Z)((0,c.Z)(t),"onToChange",(function(e){t.changeValue("to",e.target.value)})),(0,h.Z)((0,c.Z)(t),"onTitleChange",(function(e){t.changeValue("title",e.target.value)})),(0,h.Z)((0,c.Z)(t),"onPostChange",(function(e){t.changeValue("post",e.target.value)})),(0,h.Z)((0,c.Z)(t),"onAttachmentsChange",(function(e){t.setState(e)})),(0,h.Z)((0,c.Z)(t),"close",(function(){t.minimize(),v.Z.close()})),(0,h.Z)((0,c.Z)(t),"minimize",(function(){t.setState({fullscreen:!1,minimized:!0})})),(0,h.Z)((0,c.Z)(t),"open",(function(){t.setState({minimized:!1}),t.state.fullscreen})),(0,h.Z)((0,c.Z)(t),"fullscreenEnter",(function(){t.setState({fullscreen:!0,minimized:!1})})),(0,h.Z)((0,c.Z)(t),"fullscreenExit",(function(){t.setState({fullscreen:!1,minimized:!1})}));var n=(e.to||[]).map((function(e){return e.username})).join(", ");return t.state={isLoading:!1,error:null,minimized:!1,fullscreen:!1,to:n,title:"",post:"",attachments:[],validators:{title:(0,F.jn)(),post:(0,F.Jh)()},errors:{}},t}return(0,r.Z)(i,[{key:"clean",value:function(){if(!tn(this.state.to).length)return V.Z.error(pgettext("posting form","You have to enter at least one recipient.")),!1;if(!this.state.title.trim().length)return V.Z.error(pgettext("posting form","You have to enter thread title.")),!1;if(!this.state.post.trim().length)return V.Z.error(pgettext("posting form","You have to enter a message.")),!1;var e=this.validate();return e.title?(V.Z.error(e.title[0]),!1):!e.post||(V.Z.error(e.post[0]),!1)}},{key:"send",value:function(){return H.Z.post(this.props.submit,{to:tn(this.state.to),title:this.state.title,post:this.state.post,attachments:q(this.state.attachments)})}},{key:"handleSuccess",value:function(e){this.setState({isLoading:!0}),this.close(),V.Z.success(pgettext("post thread","Your thread has been posted.")),window.location=e.url}},{key:"handleError",value:function(e){if(400===e.status){var t=[].concat(e.non_field_errors||[],e.to||[],e.title||[],e.post||[],e.attachments||[]);V.Z.error(t[0])}else V.Z.apiError(e)}},{key:"render",value:function(){var e={minimized:this.state.minimized,minimize:this.minimize,open:this.open,fullscreen:this.state.fullscreen,fullscreenEnter:this.fullscreenEnter,fullscreenExit:this.fullscreenExit,close:this.onCancel};return o().createElement(an,e,(0,s.Z)("form",{className:"posting-dialog-form",onSubmit:this.handleSubmit},void 0,(0,s.Z)(Et.o8,{className:"posting-dialog-toolbar"},void 0,(0,s.Z)(Et.Z2,{className:"posting-dialog-thread-recipients",auto:!0},void 0,(0,s.Z)(Et.Eg,{auto:!0},void 0,(0,s.Z)("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onToChange,placeholder:pgettext("post thread","Recipients, eg.: Danny, Lisa, Alice"),type:"text",value:this.state.to}))),(0,s.Z)(Et.Z2,{className:"posting-dialog-thread-title",auto:!0},void 0,(0,s.Z)(Et.Eg,{auto:!0},void 0,(0,s.Z)("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onTitleChange,placeholder:pgettext("post thread","Thread title"),type:"text",value:this.state.title})))),(0,s.Z)(Rt,{attachments:this.state.attachments,value:this.state.post,submitText:pgettext("post thread submit","Start thread"),disabled:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onChange:this.onPostChange})))}}]),i}(D.Z),an=function(e){var t=e.children,n=e.close,a=e.minimized,i=e.minimize,o=e.open,r=e.fullscreen,l=e.fullscreenEnter,c=e.fullscreenExit;return(0,s.Z)(Tt,{fullscreen:r,minimized:a},void 0,(0,s.Z)(Mt,{fullscreen:r,fullscreenEnter:l,fullscreenExit:c,minimized:a,minimize:i,open:o,close:n},void 0,pgettext("post thread","Start private thread")),(0,s.Z)(At,{},void 0,t))};var on=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(e){var t;return(0,l.Z)(this,i),t=a.call(this,e),(0,h.Z)((0,c.Z)(t),"loadSuccess",(function(e){t.setState({isReady:!0,post:e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]":t.state.post}),t.quoteText=e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]":t.state.post})),(0,h.Z)((0,c.Z)(t),"loadError",(function(e){t.setState({error:e.detail})})),(0,h.Z)((0,c.Z)(t),"appendData",(function(e){var n=e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]\n\n":"";t.setState((function(e,t){return e.post.length>0?{post:e.post.trim()+"\n\n"+n}:{post:n}})),t.open()})),(0,h.Z)((0,c.Z)(t),"onCancel",(function(){if(t.state.post===t.quoteText&&0===t.state.attachments.length)return t.close();window.confirm(pgettext("post reply","Are you sure you want to discard your reply?"))&&t.close()})),(0,h.Z)((0,c.Z)(t),"onPostChange",(function(e){t.changeValue("post",e.target.value)})),(0,h.Z)((0,c.Z)(t),"onAttachmentsChange",(function(e){t.setState(e)})),(0,h.Z)((0,c.Z)(t),"onQuote",(function(e){t.setState((function(t){var n=t.post;return n.length>0?{post:n.trim()+"\n\n"+e}:{post:e}})),t.open()})),(0,h.Z)((0,c.Z)(t),"close",(function(){t.minimize(),v.Z.close()})),(0,h.Z)((0,c.Z)(t),"minimize",(function(){t.setState({fullscreen:!1,minimized:!0})})),(0,h.Z)((0,c.Z)(t),"open",(function(){t.setState({minimized:!1}),t.state.fullscreen})),(0,h.Z)((0,c.Z)(t),"fullscreenEnter",(function(){t.setState({fullscreen:!0,minimized:!1})})),(0,h.Z)((0,c.Z)(t),"fullscreenExit",(function(){t.setState({fullscreen:!1,minimized:!1})})),t.state={isReady:!1,isLoading:!1,error:null,minimized:!1,fullscreen:!1,post:t.props.default||"",attachments:[],validators:{post:(0,F.Jh)()},errors:{}},t.quoteText="",t}return(0,r.Z)(i,[{key:"componentDidMount",value:function(){H.Z.get(this.props.config,this.props.context||null).then(this.loadSuccess,this.loadError),B(!1,this.onQuote)}},{key:"componentWillUnmount",value:function(){I()}},{key:"componentWillReceiveProps",value:function(e){var t=this.props.context,n=e.context;t&&n&&!n.reply||H.Z.get(e.config,e.context||null).then(this.appendData,V.Z.apiError)}},{key:"clean",value:function(){if(!this.state.post.trim().length)return V.Z.error(pgettext("posting form","You have to enter a message.")),!1;var e=this.validate();return!e.post||(V.Z.error(e.post[0]),!1)}},{key:"send",value:function(){return B(!0,this.onQuote),H.Z.post(this.props.submit,{post:this.state.post,attachments:q(this.state.attachments)})}},{key:"handleSuccess",value:function(e){this.setState({isLoading:!0}),this.close(),B(!1,this.onQuote),V.Z.success(pgettext("post reply","Your reply has been posted.")),window.location=e.url.index}},{key:"handleError",value:function(e){if(400===e.status){var t=[].concat(e.non_field_errors||[],e.post||[],e.attachments||[]);V.Z.error(t[0])}else V.Z.apiError(e);B(!1,this.onQuote)}},{key:"render",value:function(){var e={thread:this.props.thread,minimized:this.state.minimized,minimize:this.minimize,open:this.open,fullscreen:this.state.fullscreen,fullscreenEnter:this.fullscreenEnter,fullscreenExit:this.fullscreenExit,close:this.onCancel};return this.state.error?o().createElement(sn,e,(0,s.Z)(It,{message:this.state.error,close:this.close})):this.state.isReady?o().createElement(sn,e,(0,s.Z)("form",{className:"posting-dialog-form",method:"POST",onSubmit:this.handleSubmit},void 0,(0,s.Z)(Rt,{attachments:this.state.attachments,value:this.state.post,submitText:pgettext("post reply submit","Post reply"),disabled:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onChange:this.onPostChange}))):o().createElement(sn,e,(0,s.Z)("div",{className:"posting-loading ui-preview"},void 0,(0,s.Z)(Rt,{attachments:[],value:"",submitText:pgettext("post reply submit","Post reply"),disabled:!0,onAttachmentsChange:function(){},onChange:function(){}})))}}]),i}(D.Z),sn=function(e){var t=e.children,n=e.close,a=e.minimized,i=e.minimize,o=e.open,r=e.fullscreen,l=e.fullscreenEnter,c=e.fullscreenExit,u=e.thread;return(0,s.Z)(Tt,{fullscreen:r,minimized:a},void 0,(0,s.Z)(Mt,{fullscreen:r,fullscreenEnter:l,fullscreenExit:c,minimized:a,minimize:i,open:o,close:n},void 0,interpolate(pgettext("post reply","Reply to: %(thread)s"),{thread:u.title},!0)),(0,s.Z)(At,{},void 0,t))};var rn=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(e){var t;return(0,l.Z)(this,i),t=a.call(this,e),(0,h.Z)((0,c.Z)(t),"loadSuccess",(function(e){var n;t.originalPost=e.post,t.setState({isReady:!0,post:e.post,attachments:(n=e.attachments,n.map((function(e){return Object.assign({},e,{uploaded_on:U()(e.uploaded_on)})}))),protect:e.is_protected,canProtect:e.can_protect})})),(0,h.Z)((0,c.Z)(t),"loadError",(function(e){t.setState({error:e.detail})})),(0,h.Z)((0,c.Z)(t),"appendData",(function(e){var n=e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]\n\n":"";t.setState((function(e,t){return e.post.length>0?{post:e.post.trim()+"\n\n"+n}:{post:n}})),t.open()})),(0,h.Z)((0,c.Z)(t),"onCancel",(function(){var e=t.state.originalPost===t.state.post,n=0===t.state.attachments.length;if(e&&n)return t.close();window.confirm(pgettext("edit reply","Are you sure you want to discard changes?"))&&t.close()})),(0,h.Z)((0,c.Z)(t),"onProtect",(function(){t.setState({protect:!0})})),(0,h.Z)((0,c.Z)(t),"onUnprotect",(function(){t.setState({protect:!1})})),(0,h.Z)((0,c.Z)(t),"onPostChange",(function(e){t.changeValue("post",e.target.value)})),(0,h.Z)((0,c.Z)(t),"onAttachmentsChange",(function(e){t.setState(e)})),(0,h.Z)((0,c.Z)(t),"onQuote",(function(e){t.setState((function(t){var n=t.post;return n.length>0?{post:n.trim()+"\n\n"+e}:{post:e}})),t.open()})),(0,h.Z)((0,c.Z)(t),"close",(function(){t.minimize(),v.Z.close()})),(0,h.Z)((0,c.Z)(t),"minimize",(function(){t.setState({fullscreen:!1,minimized:!0})})),(0,h.Z)((0,c.Z)(t),"open",(function(){t.setState({minimized:!1}),t.state.fullscreen})),(0,h.Z)((0,c.Z)(t),"fullscreenEnter",(function(){t.setState({fullscreen:!0,minimized:!1})})),(0,h.Z)((0,c.Z)(t),"fullscreenExit",(function(){t.setState({fullscreen:!1,minimized:!1})})),t.state={isReady:!1,isLoading:!1,error:!1,minimized:!1,fullscreen:!1,post:"",attachments:[],protect:!1,canProtect:!1,validators:{post:(0,F.Jh)()},errors:{}},t.originalPost="",t}return(0,r.Z)(i,[{key:"componentDidMount",value:function(){H.Z.get(this.props.config).then(this.loadSuccess,this.loadError),B(!1,this.onQuote)}},{key:"componentWillUnmount",value:function(){I()}},{key:"componentWillReceiveProps",value:function(e){var t=this.props.context,n=e.context;t&&n&&t.reply===n.reply||H.Z.get(e.config,e.context||null).then(this.appendData,V.Z.apiError)}},{key:"clean",value:function(){if(!this.state.post.trim().length)return V.Z.error(pgettext("posting form","You have to enter a message.")),!1;var e=this.validate();return!e.post||(V.Z.error(e.post[0]),!1)}},{key:"send",value:function(){return B(!0,this.onQuote),H.Z.put(this.props.submit,{post:this.state.post,attachments:q(this.state.attachments),protect:this.state.protect})}},{key:"handleSuccess",value:function(e){this.setState({isLoading:!0}),this.close(),B(!1,this.onQuote),V.Z.success(pgettext("edit reply","Reply has been edited.")),window.location=e.url.index}},{key:"handleError",value:function(e){if(400===e.status){var t=[].concat(e.non_field_errors||[],e.category||[],e.title||[],e.post||[],e.attachments||[]);V.Z.error(t[0])}else V.Z.apiError(e);B(!1,this.onQuote)}},{key:"render",value:function(){var e=this,t={post:this.props.post,minimized:this.state.minimized,minimize:this.minimize,open:this.open,fullscreen:this.state.fullscreen,fullscreenEnter:this.fullscreenEnter,fullscreenExit:this.fullscreenExit,close:this.onCancel};return this.state.error?o().createElement(ln,t,(0,s.Z)(It,{message:this.state.error,close:this.close})):this.state.isReady?o().createElement(ln,t,(0,s.Z)("form",{className:"posting-dialog-form",method:"POST",onSubmit:this.handleSubmit},void 0,(0,s.Z)(Rt,{attachments:this.state.attachments,canProtect:this.state.canProtect,isProtected:this.state.protect,enableProtection:function(){return e.setState({protect:!0})},disableProtection:function(){return e.setState({protect:!1})},value:this.state.post,submitText:pgettext("edit reply submit","Edit reply"),disabled:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onChange:this.onPostChange}))):o().createElement(ln,t,(0,s.Z)("div",{className:"posting-loading ui-preview"},void 0,(0,s.Z)(Rt,{attachments:[],value:"",submitText:pgettext("edit reply submit","Edit reply"),disabled:!0,onAttachmentsChange:function(){},onChange:function(){}})))}}]),i}(D.Z),ln=function(e){var t=e.children,n=e.close,a=e.minimized,i=e.minimize,o=e.open,r=e.fullscreen,l=e.fullscreenEnter,c=e.fullscreenExit,u=e.post;return(0,s.Z)(Tt,{fullscreen:r,minimized:a},void 0,(0,s.Z)(Mt,{fullscreen:r,fullscreenEnter:l,fullscreenExit:c,minimized:a,minimize:i,open:o,close:n},void 0,interpolate(pgettext("edit reply","Edit reply by %(poster)s from %(date)s"),{poster:u.poster?u.poster.username:u.poster_name,date:u.posted_on.fromNow()},!0)),(0,s.Z)(At,{},void 0,t))};function cn(e){switch(e.mode){case"START":return o().createElement(Jt,e);case"START_PRIVATE":return o().createElement(nn,e);case"REPLY":return o().createElement(on,e);case"EDIT":return o().createElement(rn,e);default:return null}}},12891:(e,t,n)=>{"use strict";n.d(t,{Jh:()=>s,jn:()=>o});var a=n(55210),i=n(99170);function o(){return[(0,a.Ei)(i.Z.get("SETTINGS").thread_title_length_min,(function(e,t){var n=npgettext("thread title length validator","Thread title should be at least %(limit_value)s character long (it has %(show_value)s).","Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).",e);return interpolate(n,{limit_value:e,show_value:t},!0)})),(0,a.BS)(i.Z.get("SETTINGS").thread_title_length_max,(function(e,t){var n=npgettext("thread title length validator","Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).","Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).",e);return interpolate(n,{limit_value:e,show_value:t},!0)}))]}function s(){return i.Z.get("SETTINGS").post_length_max?[r(),(0,a.BS)(i.Z.get("SETTINGS").post_length_max||1e6,(function(e,t){var n=npgettext("post length validator","Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).","Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).",e);return interpolate(n,{limit_value:e,show_value:t},!0)}))]:[r()]}function r(){return(0,a.Ei)(i.Z.get("SETTINGS").post_length_min,(function(e,t){var n=npgettext("post length validator","Posted message should be at least %(limit_value)s character long (it has %(show_value)s).","Posted message should be at least %(limit_value)s characters long (it has %(show_value)s).",e);return interpolate(n,{limit_value:e,show_value:t},!0)}))}},60471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var a=n(22928),i=n(15671),o=n(43144),s=n(97326),r=n(79340),l=n(6215),c=n(61120),u=n(4942),d=n(57588);var p=function(e){(0,r.Z)(p,e);var t,n,d=(t=p,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,c.Z)(t);if(n){var i=(0,c.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,l.Z)(this,e)});function p(){var e;(0,i.Z)(this,p);for(var t=arguments.length,n=new Array(t),a=0;a{"use strict";n.d(t,{Z:()=>b});var a,i=n(22928),o=n(15671),s=n(43144),r=n(79340),l=n(6215),c=n(61120),u=(n(57588),n(99170)),d=n(82211),p=n(43345),h=n(47235),v=n(78657),m=n(59801),f=n(53904),Z=n(93051),g=n(19755);var b=function(e){(0,r.Z)(b,e);var t,n,p=(t=b,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,c.Z)(t);if(n){var i=(0,c.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,l.Z)(this,e)});function b(e){var t;return(0,o.Z)(this,b),(t=p.call(this,e)).state={isLoading:!1,showActivation:!1,username:"",password:"",validators:{username:[],password:[]}},t}return(0,s.Z)(b,[{key:"clean",value:function(){return!!this.isValid()||(f.Z.error(pgettext("sign in modal","Fill out both fields.")),!1)}},{key:"send",value:function(){return v.Z.post(u.Z.get("AUTH_API"),{username:this.state.username,password:this.state.password})}},{key:"handleSuccess",value:function(){var e=g("#hidden-login-form");e.append(''),e.append(''),e.find('input[type="hidden"]').val(v.Z.getCsrfToken()),e.find('input[name="next"]').val(window.location.pathname),e.find('input[name="username"]').val(this.state.username),e.find('input[name="password"]').val(this.state.password),e.submit(),this.setState({isLoading:!0})}},{key:"handleError",value:function(e){400===e.status?"inactive_admin"===e.code?f.Z.info(e.detail):"inactive_user"===e.code?(f.Z.info(e.detail),this.setState({showActivation:!0})):"banned"===e.code?((0,Z.Z)(e.detail),m.Z.hide()):f.Z.error(e.detail):403===e.status&&e.ban?((0,Z.Z)(e.ban),m.Z.hide()):f.Z.apiError(e)}},{key:"getActivationButton",value:function(){return this.state.showActivation?(0,i.Z)("a",{className:"btn btn-success btn-block",href:u.Z.get("REQUEST_ACTIVATION_URL")},void 0,pgettext("sign in modal btn","Activate account")):null}},{key:"render",value:function(){return(0,i.Z)("div",{className:"modal-dialog modal-sm modal-sign-in",role:"document"},void 0,(0,i.Z)("div",{className:"modal-content"},void 0,(0,i.Z)("div",{className:"modal-header"},void 0,(0,i.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,a||(a=(0,i.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,i.Z)("h4",{className:"modal-title"},void 0,pgettext("sign in modal title","Sign in"))),(0,i.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,i.Z)("div",{className:"modal-body"},void 0,(0,i.Z)(h.Z,{buttonLabel:pgettext("sign in modal","Sign in with %(site)s"),formLabel:pgettext("sign in modal","Or use your forum account:"),labelClassName:"text-center"}),(0,i.Z)("div",{className:"form-group"},void 0,(0,i.Z)("div",{className:"control-input"},void 0,(0,i.Z)("input",{className:"form-control input-lg",disabled:this.state.isLoading,id:"id_username",onChange:this.bindInput("username"),placeholder:pgettext("sign in modal field","Username or e-mail"),type:"text",value:this.state.username}))),(0,i.Z)("div",{className:"form-group"},void 0,(0,i.Z)("div",{className:"control-input"},void 0,(0,i.Z)("input",{className:"form-control input-lg",disabled:this.state.isLoading,id:"id_password",onChange:this.bindInput("password"),placeholder:pgettext("sign in modal field","Password"),type:"password",value:this.state.password})))),(0,i.Z)("div",{className:"modal-footer"},void 0,this.getActivationButton(),(0,i.Z)(d.Z,{className:"btn-primary btn-block",loading:this.state.isLoading},void 0,pgettext("sign in modal btn","Sign in")),(0,i.Z)("a",{className:"btn btn-default btn-block",href:u.Z.get("FORGOTTEN_PASSWORD_URL")},void 0,pgettext("sign in modal btn","Forgot password?"))))))}}]),b}(p.Z)},24678:(e,t,n)=>{"use strict";n.d(t,{Jj:()=>h,ZP:()=>p,pg:()=>v});var a=n(22928),i=n(15671),o=n(43144),s=n(79340),r=n(6215),l=n(61120),c=n(57588),u=n.n(c);function d(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,a=(0,l.Z)(e);if(t){var i=(0,l.Z)(this).constructor;n=Reflect.construct(a,arguments,i)}else n=a.apply(this,arguments);return(0,r.Z)(this,n)}}var p=function(e){(0,s.Z)(n,e);var t=d(n);function n(){return(0,i.Z)(this,n),t.apply(this,arguments)}return(0,o.Z)(n,[{key:"getClass",value:function(){return e=this.props.status,t="",e.is_banned?t="banned":e.is_hidden?t="offline":e.is_online_hidden?t="online":e.is_offline_hidden?t="offline":e.is_online?t="online":e.is_offline&&(t="offline"),"user-status user-"+t;var e,t}},{key:"render",value:function(){return(0,a.Z)("span",{className:this.getClass()},void 0,this.props.children)}}]),n}(u().Component),h=function(e){(0,s.Z)(n,e);var t=d(n);function n(){return(0,i.Z)(this,n),t.apply(this,arguments)}return(0,o.Z)(n,[{key:"getIcon",value:function(){return this.props.status.is_banned?"remove_circle_outline":this.props.status.is_hidden?"help_outline":this.props.status.is_online_hidden?"label":this.props.status.is_offline_hidden?"label_outline":this.props.status.is_online?"lens":this.props.status.is_offline?"panorama_fish_eye":void 0}},{key:"render",value:function(){return(0,a.Z)("span",{className:"material-icon status-icon"},void 0,this.getIcon())}}]),n}(u().Component),v=function(e){(0,s.Z)(n,e);var t=d(n);function n(){return(0,i.Z)(this,n),t.apply(this,arguments)}return(0,o.Z)(n,[{key:"getHelp",value:function(){return e=this.props.user,(t=this.props.status).is_banned?t.banned_until?interpolate(pgettext("user status","%(username)s is banned until %(ban_expires)s"),{username:e.username,ban_expires:t.banned_until.format("LL, LT")},!0):interpolate(pgettext("user status","%(username)s is banned"),{username:e.username},!0):t.is_hidden?interpolate(pgettext("user status","%(username)s is hiding presence"),{username:e.username},!0):t.is_online_hidden?interpolate(pgettext("user status","%(username)s is online (hidden)"),{username:e.username},!0):t.is_offline_hidden?interpolate(pgettext("user status","%(username)s was last seen %(last_click)s (hidden)"),{username:e.username,last_click:t.last_click.fromNow()},!0):t.is_online?interpolate(pgettext("user status","%(username)s is online"),{username:e.username},!0):t.is_offline?interpolate(pgettext("user status","%(username)s was last seen %(last_click)s"),{username:e.username,last_click:t.last_click.fromNow()},!0):void 0;var e,t}},{key:"getLabel",value:function(){return this.props.status.is_banned?pgettext("user status","Banned"):this.props.status.is_hidden?pgettext("user status","Hidden"):this.props.status.is_online_hidden?pgettext("user status","Online (hidden)"):this.props.status.is_offline_hidden?pgettext("user status","Offline (hidden)"):this.props.status.is_online?pgettext("user status","Online"):this.props.status.is_offline?pgettext("user status","Offline"):void 0}},{key:"render",value:function(){return(0,a.Z)("span",{className:this.props.className||"status-label",title:this.getHelp()},void 0,this.getLabel())}}]),n}(u().Component)},40429:(e,t,n)=>{"use strict";n.d(t,{Z:()=>O});var a,i=n(22928),o=n(57588),s=n.n(o),r=n(19605),l=n(24678);function c(e){var t=e.showStatus,n=e.user;return(0,i.Z)("ul",{className:"list-unstyled"},void 0,(0,i.Z)(u,{showStatus:t,user:n}),(0,i.Z)(d,{user:n}),a||(a=(0,i.Z)("li",{className:"user-stat-divider"})),(0,i.Z)(p,{user:n}),(0,i.Z)(h,{user:n}),(0,i.Z)(v,{user:n}))}function u(e){var t=e.showStatus,n=e.user;return t?(0,i.Z)("li",{className:"user-stat-status"},void 0,(0,i.Z)(l.ZP,{status:n.status},void 0,(0,i.Z)(l.pg,{status:n.status,user:n}))):null}function d(e){var t=e.user.joined_on,n=interpolate(pgettext("users list item","Joined on %(joined_on)s"),{joined_on:t.format("LL, LT")},!0),a=interpolate(pgettext("users list item","Joined %(joined_on)s"),{joined_on:t.fromNow()},!0);return(0,i.Z)("li",{className:"user-stat-join-date"},void 0,(0,i.Z)("abbr",{title:n},void 0,a))}function p(e){var t=e.user,n=m("user-stat-posts",t.posts),a=npgettext("users list item","%(posts)s post","%(posts)s posts",t.posts);return(0,i.Z)("li",{className:n},void 0,interpolate(a,{posts:t.posts},!0))}function h(e){var t=e.user,n=m("user-stat-threads",t.threads),a=npgettext("users list item","%(threads)s thread","%(threads)s threads",t.threads);return(0,i.Z)("li",{className:n},void 0,interpolate(a,{threads:t.threads},!0))}function v(e){var t=e.user,n=m("user-stat-followers",t.followers),a=npgettext("users list item","%(followers)s follower","%(followers)s followers",t.followers);return(0,i.Z)("li",{className:n},void 0,interpolate(a,{followers:t.followers},!0))}function m(e,t){return 0===t?e+" user-stat-empty":e}function f(e){var t=e.rank,n=e.title||t.title||t.name,a="user-title";return t.css_class&&(a+=" user-title-"+t.css_class),t.is_tab?(0,i.Z)("a",{className:a,href:t.url},void 0,n):(0,i.Z)("span",{className:a},void 0,n)}function Z(e){var t=e.showStatus,n=e.user,a=n.rank,o="panel user-card";return a.css_class&&(o+=" user-card-"+a.css_class),(0,i.Z)("div",{className:o},void 0,(0,i.Z)("div",{className:"panel-body"},void 0,(0,i.Z)("div",{className:"row"},void 0,(0,i.Z)("div",{className:"col-xs-3 user-card-left"},void 0,(0,i.Z)("div",{className:"user-card-small-avatar"},void 0,(0,i.Z)("a",{href:n.url},void 0,(0,i.Z)(r.ZP,{size:"50",size2x:"80",user:n})))),(0,i.Z)("div",{className:"col-xs-9 col-sm-12 user-card-body"},void 0,(0,i.Z)("div",{className:"user-card-avatar"},void 0,(0,i.Z)("a",{href:n.url},void 0,(0,i.Z)(r.ZP,{size:"150",size2x:"200",user:n}))),(0,i.Z)("div",{className:"user-card-username"},void 0,(0,i.Z)("a",{href:n.url},void 0,n.username)),(0,i.Z)("div",{className:"user-card-title"},void 0,(0,i.Z)(f,{rank:a,title:n.title})),(0,i.Z)("div",{className:"user-card-stats"},void 0,(0,i.Z)(c,{showStatus:t,user:n}))))))}var g,b,y,_=n(15671),k=n(43144),N=n(79340),x=n(6215),w=n(61120),C=n(44039);var R,E=function(e){(0,N.Z)(o,e);var t,n,a=(t=o,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,w.Z)(t);if(n){var i=(0,w.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,x.Z)(this,e)});function o(){return(0,_.Z)(this,o),a.apply(this,arguments)}return(0,k.Z)(o,[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return(0,i.Z)("div",{className:"panel user-card user-card-preview"},void 0,(0,i.Z)("div",{className:"panel-body"},void 0,(0,i.Z)("div",{className:"row"},void 0,g||(g=(0,i.Z)("div",{className:"col-xs-3 user-card-left"},void 0,(0,i.Z)("div",{className:"user-card-small-avatar"},void 0,(0,i.Z)("span",{},void 0,(0,i.Z)(r.ZP,{size:"50",size2x:"80"}))))),(0,i.Z)("div",{className:"col-xs-9 col-sm-12 user-card-body"},void 0,b||(b=(0,i.Z)("div",{className:"user-card-avatar"},void 0,(0,i.Z)("span",{},void 0,(0,i.Z)(r.ZP,{size:"150",size2x:"200"})))),(0,i.Z)("div",{className:"user-card-username"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:C.e(60,150)+"px"}},void 0," ")),(0,i.Z)("div",{className:"user-card-title"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:C.e(60,150)+"px"}},void 0," ")),(0,i.Z)("div",{className:"user-card-stats"},void 0,(0,i.Z)("ul",{className:"list-unstyled"},void 0,(0,i.Z)("li",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:C.e(30,70)+"px"}},void 0," ")),(0,i.Z)("li",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:C.e(30,70)+"px"}},void 0," ")),y||(y=(0,i.Z)("li",{className:"user-stat-divider"})),(0,i.Z)("li",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:C.e(30,70)+"px"}},void 0," ")),(0,i.Z)("li",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:C.e(30,70)+"px"}},void 0," "))))))))}}]),o}(s().Component);function S(e){var t=e.colClassName,n=e.cols,a=Array.apply(null,{length:n}).map(Number.call,Number);return(0,i.Z)("div",{className:"users-cards-list ui-preview"},void 0,(0,i.Z)("div",{className:"row"},void 0,a.map((function(e){var n=t;return 0!==e&&(n+=" hidden-xs"),3===e&&(n+=" hidden-sm"),(0,i.Z)("div",{className:n},e,R||(R=(0,i.Z)(E,{})))}))))}function O(e){var t=e.cols,n=e.isReady,a=e.showStatus,o=e.users,s="col-xs-12 col-sm-4";return 4===t&&(s+=" col-md-3"),n?(0,i.Z)("div",{className:"users-cards-list ui-ready"},void 0,(0,i.Z)("div",{className:"row"},void 0,o.map((function(e){return(0,i.Z)("div",{className:s},e.id,(0,i.Z)(Z,{showStatus:a,user:e}))})))):(0,i.Z)(S,{colClassName:s,cols:t})}},82125:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var a=n(15671),i=n(43144),o=n(97326),s=n(79340),r=n(6215),l=n(61120),c=n(4942),u=n(57588);var d=function(e){(0,s.Z)(d,e);var t,n,u=(t=d,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,l.Z)(t);if(n){var i=(0,l.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,r.Z)(this,e)});function d(e){var t;return(0,a.Z)(this,d),t=u.call(this,e),(0,c.Z)((0,o.Z)(t),"toggleNav",(function(){t.setState({dropdown:!t.state.dropdown})})),(0,c.Z)((0,o.Z)(t),"hideNav",(function(){t.setState({dropdown:!1})})),t.state={dropdown:!1},t}return(0,i.Z)(d,[{key:"getCompactNavClassName",value:function(){return this.state.dropdown?"compact-nav open":"compact-nav"}}]),d}(n.n(u)().Component)},7227:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var a=n(22928),i=n(15671),o=n(43144),s=n(97326),r=n(79340),l=n(6215),c=n(61120),u=n(4942),d=n(57588);var p=function(e){(0,r.Z)(p,e);var t,n,d=(t=p,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,c.Z)(t);if(n){var i=(0,c.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,l.Z)(this,e)});function p(){var e;(0,i.Z)(this,p);for(var t=arguments.length,n=new Array(t),a=0;a{"use strict";n.d(t,{SW:()=>k,ry:()=>f,xn:()=>x});var a=window.misago_locale||"en-us",i=pgettext("time ago","moment ago"),o=pgettext("time ago","now"),s=pgettext("day at time","%(day)s at %(time)s"),r=pgettext("day at time","Today at %(time)s"),l=pgettext("day at time","Tomorrow at %(time)s"),c=pgettext("day at time","Yesterday at %(time)s"),u=pgettext("short minutes","%(time)sm"),d=pgettext("short hours","%(time)sh"),p=pgettext("short days","%(time)sd"),h=pgettext("short month","%(day)s %(month)s"),v=pgettext("short month","%(month)s %(year)s"),m=new Intl.RelativeTimeFormat(a,{numeric:"always",style:"long"}),f=new Intl.DateTimeFormat(a,{dateStyle:"full",timeStyle:"medium"}),Z=new Intl.DateTimeFormat(a,{month:"long",day:"numeric"}),g=new Intl.DateTimeFormat(a,{year:"numeric",month:"long",day:"numeric"}),b=new Intl.DateTimeFormat(a,{year:"2-digit",month:"short",day:"numeric"}),y=new Intl.DateTimeFormat(a,{weekday:"long"}),_=new Intl.DateTimeFormat(a,{timeStyle:"short"});function k(e){var t=new Date,n=Math.round((e-t)/1e3),a=Math.abs(n),o=n<1?-1:1;if(a<90)return i;if(a<2820){var u=Math.round(a/60)*o;return m.format(u,"minute")}if(a<10800){var d=Math.round(a/3600)*o;return m.format(d,"hour")}return N(t,e)?n>0?r.replace("%(time)s",_.format(e)):_.format(e):function(e){var t=new Date;return t.setDate(t.getDate()-1),N(t,e)}(e)?c.replace("%(time)s",_.format(e)):function(e){var t=new Date;return t.setDate(t.getDate()+1),N(t,e)}(e)?l.replace("%(time)s",_.format(e)):n<0&&a<518400?function(e,t){return s.replace("%(day)s",e).replace("%(time)s",_.format(t))}(y.format(e),e):t.getFullYear()==e.getFullYear()?Z.format(e):g.format(e)}function N(e,t){return e.getFullYear()==t.getFullYear()&&e.getMonth()==t.getMonth()&&e.getDate()==t.getDate()}function x(e){var t=new Date,n=Math.abs(Math.round((e-t)/1e3));if(n<60)return o;if(n<3300){var a=Math.round(n/60);return u.replace("%(time)s",a)}if(n<86400){var i=Math.round(n/3600);return d.replace("%(time)s",i)}if(n<604800){var s=Math.round(n/86400);return p.replace("%(time)s",s)}var r={};return b.formatToParts(e).forEach((function(e){var t=e.type,n=e.value;r[t]=n})),e.getFullYear()===t.getFullYear()?h.replace("%(day)s",r.day).replace("%(month)s",r.month):v.replace("%(year)s",r.year).replace("%(month)s",r.month)}},99170:(e,t,n)=>{"use strict";n.d(t,{Z:()=>I});var a=n(15671),i=n(43144),o=(n(58294),n(95377),n(68852),n(39737),n(14316),n(43204),n(7023),n(94028)),s=n.n(o);const r=function(){function e(t){(0,a.Z)(this,e),this.isOrdered=!1,this._items=t||[]}return(0,i.Z)(e,[{key:"add",value:function(e,t,n){this._items.push({key:e,item:t,after:n&&n.after||null,before:n&&n.before||null})}},{key:"get",value:function(e,t){for(var n=0;n0&&t.length!==a.length;)o-=1,e.forEach(i);return n}}]),e}();var l=n(4942);function c(e){var t=e.closest("[hx-silent]");return!t||"true"!==t.getAttribute("hx-silent")}const u=(0,i.Z)((function e(){var t=this;(0,a.Z)(this,e),(0,l.Z)(this,"show",(function(){t.requests+=1,t.update()})),(0,l.Z)(this,"hide",(function(){t.requests&&(t.requests-=1,t.update())})),(0,l.Z)(this,"update",(function(){t.timeout&&window.clearTimeout(t.timeout),t.requests?(t.element.classList.add("busy"),t.element.classList.remove("complete")):(t.element.classList.remove("busy"),t.element.classList.add("complete"),t.timeout=setTimeout((function(){t.element.classList.remove("complete")}),1500))})),this.element=document.getElementById("misago-ajax-loader"),this.requests=0,this.timeout=null}));var d=n(19755);const p=(0,i.Z)((function e(t){var n=this;(0,a.Z)(this,e),(0,l.Z)(this,"registerActions",(function(){n.actions.forEach((function(e){"remove-selection"===e.getAttribute("moderation-action")?e.addEventListener("click",n.onRemoveSelection):e.addEventListener("click",n.onAction)}))})),(0,l.Z)(this,"onAction",(function(e){var t=document.querySelector(n.form),a={};new FormData(t).forEach((function(e,t){void 0===a[t]&&(a[t]=[]),a[t].push(e)}));var i=e.target;a.moderation=i.getAttribute("moderation-action"),"true"===i.getAttribute("moderation-multistage")?s().ajax("POST",document.location.href,{target:n.modal,swap:"innerHTML",values:a}).then((function(){d(n.modal).modal("show")})):s().ajax("POST",document.location.href,{target:"#misago-htmx-root",swap:"outerHTML",values:a})})),(0,l.Z)(this,"onRemoveSelection",(function(e){document.querySelectorAll(n.selection).forEach((function(e){e.checked=!1})),n.update()})),(0,l.Z)(this,"registerEvents",(function(){document.body.addEventListener("click",(function(e){var t=e.target;"INPUT"===t.tagName&&"checkbox"===t.type&&n.update()})),s().onLoad((function(){return n.update()}))})),(0,l.Z)(this,"update",(function(){var e=document.querySelectorAll(n.selection).length;n.control.innerText=n.text.replace("%(number)s",e),n.control.disabled=!e,n.menu&&(e?n.menu.classList.add("visible"):n.menu.classList.remove("visible"))})),this.menu=t.menu?document.querySelector(t.menu):null,this.form=t.form,this.modal=t.modal,this.actions=document.querySelectorAll(t.actions),this.selection=t.selection,this.control=document.querySelector(t.button.selector),this.text=t.button.text,this.update(),this.registerEvents(),this.registerActions()}));var h=n(15861),v=n(64687),m=n.n(v),f={};function Z(e){if(!e.getAttribute("misago-validate-active")){var t=e.getAttribute("misago-validate"),n=e.getAttribute("misago-validate-user"),a="false"!=e.getAttribute("misago-validate-strip"),i=e.querySelector("input"),o=i.closest("form").querySelector("input[type=hidden]");if(t&&i){f[t]||(f[t]={}),e.setAttribute("misago-validate-active","true");var s=null;i.addEventListener("keyup",(function(r){var l=r.target.value;a&&(l=l.trim()),0!==l.trim().length?f[t][l]?g(e,i,f[t][l]):(s&&window.clearTimeout(s),s=window.setTimeout((0,h.Z)(m().mark((function a(){var s,r;return m().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,y(t,o,l,n);case 2:s=a.sent,r=s.errors,f[t][l]=r,g(e,i,r);case 6:case"end":return a.stop()}}),a)}))),1e3)):function(e){e.classList.remove("has-error"),e.classList.remove("has-success"),b(e)}(e)}))}}}function g(e,t,n){n.length?function(e,t,n){e.classList.remove("has-success"),e.classList.add("has-error"),b(e),n.forEach((function(e){var n=document.createElement("p");n.className="help-block",n.setAttribute("misago-dynamic-message","true"),n.innerText=e,t.after(n)}))}(e,t,n):function(e){e.classList.remove("has-error"),e.classList.add("has-success"),b(e)}(e)}function b(e){e.querySelectorAll("[misago-dynamic-message]").forEach((function(e){return e.remove()}))}function y(e,t,n,a){return _.apply(this,arguments)}function _(){return(_=(0,h.Z)(m().mark((function e(t,n,a,i){var o,s;return m().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(o=new FormData).set(n.name,n.value),o.set("value",a),i&&o.set("user",i),e.next=6,fetch(t,{method:"POST",mode:"cors",credentials:"same-origin",body:o});case 6:return s=e.sent,e.next=9,s.json();case 9:return e.abrupt("return",e.sent);case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}s().onLoad((function(e){(e||document).querySelectorAll("[misago-validate]").forEach(Z)}));var k=document.getElementById("misago-snackbars"),N=null;function x(){k.replaceChildren()}function w(){N&&window.clearTimeout(N),k.querySelectorAll(".snackbar").forEach((function(e){e.classList.add("in")})),N=window.setTimeout((function(){k.querySelectorAll(".snackbar").forEach((function(e){e.classList.add("out"),N=window.setTimeout(x,1e3)}))}),6e3)}function C(e,t){x(),N&&window.clearTimeout(N);var n=document.createElement("div");n.classList.add("snackbar"),n.classList.add("snackbar-"+e),n.innerText=t,n.role="alert",k.appendChild(n),N=window.setTimeout(w,100)}function R(e){C("danger",e)}function E(e){var t,n,a=e.detail;return!("true"===(t=a.target,n=t.closest("[hx-silent]"),n?n.getAttribute("hx-silent"):null)&&"get"===a.requestConfig.verb)}s().onLoad(w),document.addEventListener("htmx:responseError",(function(e){E(e)&&R(function(e){if("application/json"===e.getResponseHeader("content-type")){var t=JSON.parse(e.response);if(t.error)return t.error}return 404===e.status?pgettext("htmx response error","Page not found"):403===e.status?pgettext("htmx response error","Permission denied"):pgettext("htmx response error","Unexpected error")}(e.detail.xhr))})),document.addEventListener("htmx:sendError",(function(e){E(e)&&R(pgettext("htmx response error","Site could not be reached."))})),document.addEventListener("htmx:timeout",(function(e){E(e)&&R(pgettext("htmx response error","Site took too long to reply"))}));var S=n(75557),O={};function L(e){var t=e.getAttribute("misago-timestamp");O[t]||(O[t]=new Date(t)),e.hasAttribute("misago-timestamp-title")||(e.setAttribute("misago-timestamp-title","true"),e.setAttribute("title",S.ry.format(O[t])));var n=e.getAttribute("misago-timestamp-format");e.textContent="short"==n?(0,S.xn)(O[t]):(0,S.SW)(O[t])}function P(e){(e||document).querySelectorAll("[misago-timestamp]").forEach(L)}document.querySelectorAll("[misago-timestamp]").forEach(L),P(),window.setInterval(P,55e3),s().onLoad(P);var T=n(19755),A=new u,B=new(function(){function e(){(0,a.Z)(this,e),this._initializers=[],this._context={},this.loader=A}return(0,i.Z)(e,[{key:"addInitializer",value:function(e){this._initializers.push({key:e.name,item:e.initializer,after:e.after,before:e.before})}},{key:"init",value:function(e){var t=this;this._context=e,new r(this._initializers).orderedValues().forEach((function(e){e(t)}))}},{key:"has",value:function(e){return!!this._context[e]}},{key:"get",value:function(e,t){return this.has(e)?this._context[e]:t||void 0}},{key:"pop",value:function(e){if(this.has(e)){var t=this._context[e];return this._context[e]=null,t}}},{key:"snackbar",value:function(e,t){C(e,t)}},{key:"snackbarInfo",value:function(e){!function(e){C("info",e)}(e)}},{key:"snackbarSuccess",value:function(e){!function(e){C("success",e)}(e)}},{key:"snackbarWarning",value:function(e){!function(e){C("warning",e)}(e)}},{key:"snackbarError",value:function(e){R(e)}},{key:"bulkModeration",value:function(e){return new p(e)}}]),e}());window.misago=B;const I=B;document.addEventListener("htmx:beforeRequest",(function(e){c(e.target)&&A.show()})),document.addEventListener("htmx:afterRequest",(function(e){c(e.target)&&A.hide()})),document.addEventListener("misago:afterModeration",(function(){T("#threads-moderation-modal").modal("hide")}))},58339:(e,t,n)=>{"use strict";var a=n(99170),i=n(78657);a.Z.addInitializer({name:"ajax",initializer:function(){i.Z.init(a.Z.get("CSRF_COOKIE_NAME"))}})},64109:(e,t,n)=>{"use strict";var a=n(99170),i=n(35486),o=n(78657),s=n(53904),r=n(90287);a.Z.addInitializer({name:"auth-sync",initializer:function(e){e.get("isAuthenticated")&&window.setInterval((function(){o.Z.get(e.get("AUTH_API")).then((function(e){r.Z.dispatch((0,i.r$)(e))}),(function(e){s.Z.apiError(e)}))}),45e3)},after:"auth"})},46226:(e,t,n)=>{"use strict";var a=n(99170),i=n(98274),o=n(59801),s=n(90287),r=n(62833);a.Z.addInitializer({name:"auth",initializer:function(){i.Z.init(s.Z,r.Z,o.Z)},after:"store"})},93240:(e,t,n)=>{"use strict";var a=n(99170),i=n(78657),o=n(93825),s=n(96142),r=n(53904);a.Z.addInitializer({name:"captcha",initializer:function(e){o.ZP.init(e,i.Z,s.Z,r.Z)}})},75147:(e,t,n)=>{"use strict";var a=n(22928),i=n(57588),o=n.n(i),s=n(99170),r=n(15671),l=n(43144),c=n(97326),u=n(79340),d=n(6215),p=n(61120),h=n(4942),v=n(78657);var m=function(e){(0,u.Z)(o,e);var t,n,i=(t=o,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function o(e){var t;return(0,r.Z)(this,o),t=i.call(this,e),(0,h.Z)((0,c.Z)(t),"handleDecline",(function(){t.state.submiting||window.confirm(pgettext("accept agreement prompt","Declining will result in immediate deactivation and deletion of your account. This action is not reversible."))&&(t.setState({submiting:!0}),v.Z.post(t.props.api,{accept:!1}).then((function(){window.location.reload(!0)})))})),(0,h.Z)((0,c.Z)(t),"handleAccept",(function(){t.state.submiting||(t.setState({submiting:!0}),v.Z.post(t.props.api,{accept:!0}).then((function(){window.location.reload(!0)})))})),t.state={submiting:!1},t}return(0,l.Z)(o,[{key:"render",value:function(){return(0,a.Z)("div",{},void 0,(0,a.Z)("button",{className:"btn btn-default",disabled:this.state.submiting,type:"buton",onClick:this.handleDecline},void 0,pgettext("accept agreement choice","Decline")),(0,a.Z)("button",{className:"btn btn-primary",disabled:this.state.submiting,type:"buton",onClick:this.handleAccept},void 0,pgettext("accept agreement choice","Accept and continue")))}}]),o}(o().Component),f=n(4869);s.Z.addInitializer({name:"component:accept-agreement",initializer:function(e){document.getElementById("required-agreement-mount")&&(0,f.Z)((0,a.Z)(m,{api:e.get("REQUIRED_AGREEMENT_API")}),"required-agreement-mount",!1)},after:"store"})},4894:(e,t,n)=>{"use strict";var a=n(37424),i=n(99170),o=n(22928),s=n(15671),r=n(43144),l=n(79340),c=n(6215),u=n(61120),d=n(57588);var p=function(e){(0,l.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,u.Z)(t);if(n){var i=(0,u.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,c.Z)(this,e)});function i(){return(0,s.Z)(this,i),a.apply(this,arguments)}return(0,r.Z)(i,[{key:"refresh",value:function(){window.location.reload()}},{key:"getMessage",value:function(){return this.props.signedIn?interpolate(pgettext("auth message","You have signed in as %(username)s. Please refresh the page before continuing."),{username:this.props.signedIn.username},!0):this.props.signedOut?interpolate(pgettext("auth message","%(username)s, you have been signed out. Please refresh the page before continuing."),{username:this.props.user.username},!0):void 0}},{key:"render",value:function(){var e="auth-message";return(this.props.signedIn||this.props.signedOut)&&(e+=" show"),(0,o.Z)("div",{className:e},void 0,(0,o.Z)("div",{className:"container"},void 0,(0,o.Z)("p",{className:"lead"},void 0,this.getMessage()),(0,o.Z)("p",{},void 0,(0,o.Z)("button",{className:"btn btn-default",type:"button",onClick:this.refresh},void 0,pgettext("auth message","Reload page")),(0,o.Z)("span",{className:"hidden-xs hidden-sm"},void 0," "+pgettext("auth message","or press F5 key.")))))}}]),i}(n.n(d)().Component);function h(e){return{user:e.auth.user,signedIn:e.auth.signedIn,signedOut:e.auth.signedOut}}var v=n(4869);i.Z.addInitializer({name:"component:auth-message",initializer:function(){(0,v.Z)((0,a.$j)(h)(p),"auth-message-mount")},after:"store"})},29223:(e,t,n)=>{"use strict";var a=n(99170),i=n(93051);a.Z.addInitializer({name:"component:banmed-page",initializer:function(e){e.has("BAN_MESSAGE")&&(0,i.Z)(e.get("BAN_MESSAGE"),!1)},after:"store"})},73806:(e,t,n)=>{"use strict";var a,i=n(22928),o=n(57588),s=n.n(o),r=n(73935),l=n.n(r),c=n(37424),u=n(993),d=n(40689),p=n(80261),h=n(15671),v=n(43144),m=n(79340),f=n(6215),Z=n(61120),g=n(59801),b=n(14467);const y=function(e){(0,m.Z)(s,e);var t,n,o=(t=s,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,Z.Z)(t);if(n){var i=(0,Z.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,f.Z)(this,e)});function s(){return(0,h.Z)(this,s),o.apply(this,arguments)}return(0,v.Z)(s,[{key:"componentDidMount",value:function(){"?modal=login"===window.document.location.search&&window.setTimeout((function(){return g.Z.show(a||(a=(0,i.Z)(b.Z,{})))}),300)}},{key:"render",value:function(){return null}}]),s}(s().Component);function _(e){var t=e.logo,n=e.logoXs,a=e.text,o=e.url;return t?(0,i.Z)("div",{className:"navbar-branding"},void 0,(0,i.Z)("a",{href:o,className:"navbar-branding-logo"},void 0,(0,i.Z)("img",{src:t,alt:a}))):(0,i.Z)("div",{className:"navbar-branding"},void 0,!!n&&(0,i.Z)("a",{href:o,className:"navbar-branding-logo-xs"},void 0,(0,i.Z)("img",{src:n,alt:a})),!!a&&(0,i.Z)("a",{href:o,className:"navbar-branding-text"},void 0,a))}function k(e){var t=e.items;return(0,i.Z)("ul",{className:"navbar-extra-menu",role:"nav"},void 0,t.map((function(e,t){return(0,i.Z)("li",{className:e.className},t,(0,i.Z)("a",{href:e.url,target:e.targetBlank?"_blank":null,rel:e.rel},void 0,e.title))})))}var N,x=n(49021),w=n(97326),C=n(4942),R=n(63026),E=n(66462),S=n(94184),O=n.n(S);function L(e){var t=e.children,n=e.showAll,a=e.showUnread,o=e.unread;return(0,i.Z)("div",{className:"notifications-dropdown-body"},void 0,(0,i.Z)(x.Aw,{},void 0,pgettext("notifications title","Notifications")),(0,i.Z)(x.KE,{},void 0,(0,i.Z)(P,{active:!o,onClick:n},void 0,pgettext("notifications dropdown","All")),(0,i.Z)(P,{active:o,onClick:a},void 0,pgettext("notifications dropdown","Unread"))),t,(0,i.Z)(x.kE,{},void 0,(0,i.Z)("a",{className:"btn btn-default btn-block",href:misago.get("NOTIFICATIONS_URL")},void 0,pgettext("notifications","See all notifications"))))}function P(e){var t=e.active,n=e.children,a=e.onClick;return(0,i.Z)("button",{className:O()("btn",{"btn-primary":t,"btn-default":!t}),type:"button",onClick:a},void 0,n)}const T=function(e){(0,m.Z)(o,e);var t,n,a=(t=o,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,Z.Z)(t);if(n){var i=(0,Z.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,f.Z)(this,e)});function o(e){var t;return(0,h.Z)(this,o),t=a.call(this,e),(0,C.Z)((0,w.Z)(t),"render",(function(){return(0,i.Z)(L,{unread:t.state.unread,showAll:function(){return t.setState({unread:!1})},showUnread:function(){return t.setState({unread:!0})}},void 0,(0,i.Z)(R.Z,{filter:t.state.unread?"unread":"all",disabled:!t.props.active},void 0,(function(e){var n=e.data,a=e.loading,o=e.error;return a?N||(N=(0,i.Z)(E.Pu,{})):o?(0,i.Z)(E.lb,{error:o}):(0,i.Z)(E.uE,{filter:t.state.unread?"unread":"all",items:n?n.results:[]})})))})),t.state={unread:!1,url:""},t}return(0,v.Z)(o,[{key:"getApiUrl",value:function(){return misago.get("NOTIFICATIONS_API")+"?limit=20"+(this.state.unread?"&filter=unread":"")}}]),o}(s().Component);function A(e){var t=e.id,n=e.className,a=e.badge,o=e.url,s=e.active,r=e.onClick,l=a?pgettext("navbar","You have unread notifications!"):pgettext("navbar","Open notifications");return(0,i.Z)("a",{id:t,className:O()("btn btn-navbar-icon",n,{active:s}),href:o,title:l,onClick:r},void 0,!!a&&(0,i.Z)("span",{className:"navbar-item-badge"},void 0,a),(0,i.Z)("span",{className:"material-icon"},void 0,a?"notifications_active":"notifications_none"))}function B(e){var t=e.id,n=e.className,a=e.badge,o=e.url;return(0,i.Z)(x.Lt,{id:t,toggle:function(e){var t=e.isOpen,s=e.toggle;return(0,i.Z)(A,{className:n,active:t,badge:a,url:o,onClick:function(e){e.preventDefault(),s()}})},menuClassName:"notifications-dropdown",menuAlignRight:!0},void 0,(function(e){var t=e.isOpen;return(0,i.Z)(T,{active:t})}))}var I;function j(e){var t=e.id,n=e.className,a=e.badge,o=e.url,s=e.active,r=e.onClick,l=a?pgettext("navbar","You have unread private threads!"):pgettext("navbar","Open private threads");return(0,i.Z)("a",{id:t,className:O()("btn btn-navbar-icon",n,{active:s}),href:o,title:l,onClick:r},void 0,!!a&&(0,i.Z)("span",{className:"navbar-item-badge"},void 0,a),I||(I=(0,i.Z)("span",{className:"material-icon"},void 0,"inbox")))}var D,z,U,q=n(62989);function M(e){var t=e.id,n=e.className,a=e.url,o=e.active,s=e.onClick;return(0,i.Z)("a",{id:t,className:O()("btn btn-navbar-icon",n,{active:o}),href:a,title:pgettext("navbar","Open search"),onClick:s},void 0,D||(D=(0,i.Z)("span",{className:"material-icon"},void 0,"search")))}function F(e){var t=e.id,n=e.className,a=e.url;return(0,i.Z)(x.Lt,{id:t,toggle:function(e){var t=e.isOpen,o=e.toggle;return(0,i.Z)(M,{className:n,active:t,url:a,onClick:function(e){e.preventDefault(),o(),window.setTimeout((function(){document.querySelector(".search-dropdown .form-control-search").focus()}),0)}})},menuClassName:"search-dropdown",menuAlignRight:!0},void 0,(function(){return z||(z=(0,i.Z)(q.E,{}))}))}function H(e){var t=e.id,n=e.className,a=e.active,o=e.onClick;return(0,i.Z)("button",{id:t,className:O()("btn btn-navbar-icon",n,{active:a}),title:pgettext("navbar","Open menu"),type:"button",onClick:o},void 0,U||(U=(0,i.Z)("span",{className:"material-icon"},void 0,"menu")))}var V=n(6333);function Y(e){var t=e.id,n=e.className;return(0,i.Z)(x.Lt,{id:t,toggle:function(e){var t=e.isOpen,a=e.toggle;return(0,i.Z)(H,{className:n,active:t,onClick:a})},menuClassName:"site-nav-dropdown",menuAlignRight:!0},void 0,(function(e){e.isOpen;var t=e.close;return(0,i.Z)(V.bS,{close:t})}))}var G=n(19605);function $(e){var t=e.id,n=e.className,a=e.user,o=e.active,s=e.onClick;return(0,i.Z)("a",{id:t,className:O()("btn-navbar-image",n,{active:o}),href:a.url,title:pgettext("navbar","Open your options"),onClick:s},void 0,(0,i.Z)(G.ZP,{user:a,size:34}))}var W,Q,K,X,J=n(28166);function ee(e){var t=e.id,n=e.className,a=e.user;return(0,i.Z)(x.Lt,{id:t,toggle:function(e){var t=e.isOpen,o=e.toggle;return(0,i.Z)($,{className:n,active:t,user:a,onClick:function(e){e.preventDefault(),o()}})},menuClassName:"user-nav-dropdown",menuAlignRight:!0},void 0,(function(e){e.isOpen;var t=e.close;return(0,i.Z)(J.o4,{close:t})}))}const te=(0,c.$j)((function(e){var t=misago.get("SETTINGS"),n=e.auth.user;return{branding:{logo:t.logo,logoXs:t.logo_small,text:t.logo_text,url:misago.get("MISAGO_PATH")},extraMenuItems:misago.get("extraMenuItems"),user:n.id?{id:n.id,username:n.username,email:n.email,avatars:n.avatars,unreadNotifications:n.unreadNotifications,unreadPrivateThreads:n.unread_private_threads,url:n.url}:null,searchUrl:misago.get("SEARCH_URL"),notificationsUrl:misago.get("NOTIFICATIONS_URL"),privateThreadsUrl:misago.get("PRIVATE_THREADS_URL"),authDelegated:t.enable_oauth2_client,showSearch:!!n.acl.can_search,showPrivateThreads:!!n&&!!n.acl.can_use_private_threads}}))((function(e){var t=e.dispatch,n=e.branding,a=e.extraMenuItems,o=e.authDelegated,r=e.user,l=e.searchUrl,c=e.notificationsUrl,h=e.privateThreadsUrl,v=e.showSearch,m=e.showPrivateThreads;return(0,i.Z)("div",{className:"container navbar-container"},void 0,s().createElement(_,n),(0,i.Z)("div",{className:"navbar-right"},void 0,a.length>0&&(0,i.Z)(k,{items:a}),!!v&&(0,i.Z)(F,{id:"navbar-search-dropdown",url:l}),!!v&&(0,i.Z)(M,{id:"navbar-search-overlay",url:l,onClick:function(e){t(u.UL()),e.preventDefault()}}),W||(W=(0,i.Z)(Y,{id:"navbar-site-nav-dropdown"})),(0,i.Z)(H,{id:"navbar-site-nav-overlay",onClick:function(){t(u.AU())}}),!!m&&(0,i.Z)(j,{id:"navbar-private-threads",badge:r.unreadPrivateThreads,url:h}),!!r&&(0,i.Z)(B,{id:"navbar-notifications-dropdown",badge:r.unreadNotifications,url:c}),!!r&&(0,i.Z)(A,{id:"navbar-notifications-overlay",badge:r.unreadNotifications,url:c,onClick:function(e){t(u.hN()),e.preventDefault()}}),!!r&&(0,i.Z)(ee,{id:"navbar-user-nav-dropdown",user:r}),!!r&&(0,i.Z)($,{id:"navbar-user-nav-overlay",user:r,onClick:function(e){t(u.T5()),e.preventDefault()}}),!r&&(Q||(Q=(0,i.Z)(p.Z,{className:"btn-navbar-sign-in"}))),!r&&!o&&(K||(K=(0,i.Z)(d.Z,{className:"btn-navbar-register"}))),!r&&!o&&(X||(X=(0,i.Z)(y,{})))))}));var ne,ae=n(90287);misago.addInitializer({name:"component:navbar",initializer:function(e){var t=document.getElementById("misago-navbar");l().render((0,i.Z)(c.zt,{store:ae.Z.getStore()},void 0,ne||(ne=(0,i.Z)(te,{}))),t)},after:"store"})},27015:(e,t,n)=>{"use strict";var a,i=n(22928),o=n(57588),s=n.n(o),r=n(73935),l=n.n(r),c=n(37424),u=n(15671),d=n(43144),p=n(97326),h=n(79340),v=n(6215),m=n(61120),f=n(4942),Z=n(63026),g=n(66462),b=n(94184),y=n.n(b),_=n(49021),k=n(64836);function N(e){var t=e.children,n=e.open,a=e.showAll,o=e.showUnread,s=e.unread;return(0,i.Z)(k.a,{open:n},void 0,(0,i.Z)(k.i,{},void 0,pgettext("notifications title","Notifications")),(0,i.Z)(_.KE,{},void 0,(0,i.Z)(x,{active:!s,onClick:a},void 0,pgettext("notifications dropdown","All")),(0,i.Z)(x,{active:s,onClick:o},void 0,pgettext("notifications dropdown","Unread"))),t,(0,i.Z)(_.kE,{},void 0,(0,i.Z)("a",{className:"btn btn-default btn-block",href:misago.get("NOTIFICATIONS_URL")},void 0,pgettext("notifications","See all notifications"))))}function x(e){var t=e.active,n=e.children,a=e.onClick;return(0,i.Z)("button",{className:y()("btn",{"btn-primary":t,"btn-default":!t}),type:"button",onClick:a},void 0,n)}var w=function(e){(0,h.Z)(s,e);var t,n,o=(t=s,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,m.Z)(t);if(n){var i=(0,m.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,v.Z)(this,e)});function s(e){var t;return(0,u.Z)(this,s),t=o.call(this,e),(0,f.Z)((0,p.Z)(t),"render",(function(){return(0,i.Z)(N,{open:t.props.open,unread:t.state.unread,showAll:function(){return t.setState({unread:!1})},showUnread:function(){return t.setState({unread:!0})}},void 0,(0,i.Z)(Z.Z,{filter:t.state.unread?"unread":"all",disabled:!t.props.open},void 0,(function(e){var n=e.data,o=e.loading,s=e.error;return o?a||(a=(0,i.Z)(g.Pu,{})):s?(0,i.Z)(g.lb,{error:s}):(0,i.Z)(g.uE,{filter:t.state.unread?"unread":"all",items:n?n.results:[]})})))})),t.body=document.body,t.state={unread:!1,url:""},t}return(0,d.Z)(s,[{key:"getApiUrl",value:function(){return misago.get("NOTIFICATIONS_API")+"?limit=20"+(this.state.unread?"&filter=unread":"")}},{key:"componentDidUpdate",value:function(e,t){e.open!==this.props.open&&(this.props.open?this.body.classList.add("notifications-fullscreen"):this.body.classList.remove("notifications-fullscreen"))}}]),s}(s().Component);const C=(0,c.$j)((function(e){return{open:e.overlay.notifications}}))(w);var R,E=n(90287);misago.addInitializer({name:"component:notifications-overlay",initializer:function(e){if(e.get("isAuthenticated")){var t=document.getElementById("notifications-mount");l().render((0,i.Z)(c.zt,{store:E.Z.getStore()},void 0,R||(R=(0,i.Z)(C,{}))),t)}},after:"store"})},88097:(e,t,n)=>{"use strict";var a=n(22928),i=n(57588),o=n.n(i),s=n(73935),r=n.n(s),l=n(37424),c=n(69987),u=n(99755);function d(){return(0,a.Z)(u.Iv,{header:pgettext("notifications title","Notifications"),styleName:"notifications"})}var p=n(87462),h=n(15861),v=n(64687),m=n.n(v),f=n(35486),Z=n(53904),g=n(60642),b=n(63026);const y=function(e){var t=e.title,n=e.subtitle,a=[];return n&&a.push(n),t&&a.push(t),a.push(misago.get("SETTINGS").forum_name),document.title=a.join(" | "),null};var _=n(59131),k=n(66462);function N(e){var t=e.children;return(0,a.Z)("ul",{className:"nav nav-pills"},void 0,t)}var x=n(94184),w=n.n(x);function C(e){var t=e.active,n=e.link,i=e.icon,o=e.children;return(0,a.Z)("li",{className:w()({active:t})},void 0,(0,a.Z)(c.rU,{to:n,activeClassName:""},void 0,!!i&&(0,a.Z)("span",{className:"material-icon"},void 0,i),o))}var R=n(92490);function E(e){var t=e.filter,n=misago.get("NOTIFICATIONS_URL");return(0,a.Z)(R.o8,{},void 0,(0,a.Z)(R.Z2,{auto:!0},void 0,(0,a.Z)(R.Eg,{},void 0,(0,a.Z)(N,{},void 0,(0,a.Z)(C,{active:"all"===t,link:n},void 0,pgettext("notifications nav","All")),(0,a.Z)(C,{active:"unread"===t,link:n+"unread/"},void 0,pgettext("notifications nav","Unread")),(0,a.Z)(C,{active:"read"===t,link:n+"read/"},void 0,pgettext("notifications nav","Read"))))))}var S,O,L,P=n(82211);function T(e){var t=e.baseUrl,n=e.data,i=e.disabled;return(0,a.Z)("div",{className:"misago-pagination"},void 0,(0,a.Z)(A,{url:t,disabled:i||!n||!n.hasPrevious},void 0,pgettext("notifications pagination","Latest")),(0,a.Z)(A,{url:t+"?before="+(n?n.firstCursor:""),disabled:i||!n||!n.hasPrevious},void 0,pgettext("notifications pagination","Newer")),(0,a.Z)(A,{url:t+"?after="+(n?n.lastCursor:""),disabled:i||!n||!n.hasNext},void 0,pgettext("notifications pagination","Older")))}function A(e){var t=e.disabled,n=e.children,i=e.url;return t?(0,a.Z)("button",{className:"btn btn-default",type:"disabled",disabled:!0},void 0,n):(0,a.Z)(c.rU,{to:i,className:"btn btn-default",activeClassName:""},void 0,n)}function B(e){var t=e.baseUrl,n=e.data,i=e.disabled,o=e.bottom,s=e.markAllAsRead;return(0,a.Z)(R.o8,{},void 0,(0,a.Z)(R.Z2,{},void 0,(0,a.Z)(R.Eg,{},void 0,(0,a.Z)(T,{baseUrl:t,data:n,disabled:i}))),S||(S=(0,a.Z)(R.tw,{})),(0,a.Z)(R.Z2,{className:w()({"hidden-xs":!o})},void 0,(0,a.Z)(R.Eg,{},void 0,(0,a.Z)(P.Z,{className:"btn-default btn-block",type:"button",disabled:i||!n||!n.unreadNotifications,onClick:s},void 0,O||(O=(0,a.Z)("span",{className:"material-icon"},void 0,"done_all")),pgettext("notifications","Mark all as read")))))}function I(e){return"unread"===e?pgettext("notifications title","Unread notifications"):"read"===e?pgettext("notifications title","Read notifications"):null}const j=(0,l.$j)()((function(e){var t=e.dispatch,n=e.location,i=e.route,s=n.query,r=i.props.filter,l=function(e){var t=misago.get("NOTIFICATIONS_URL");return"all"!==e&&(t+=e+"/"),t}(r);return(0,a.Z)(_.Z,{},void 0,(0,a.Z)(y,{title:pgettext("notifications title","Notifications"),subtitle:I(r)}),(0,a.Z)(E,{filter:r}),(0,a.Z)(b.Z,{filter:r,query:s},void 0,(function(e){var n,i=e.data,c=e.loading,u=e.error,d=e.refetch;return(0,a.Z)(g.D,{url:misago.get("NOTIFICATIONS_API")+"read-all/"},void 0,(function(e,v){var g,b=v.loading,y={baseUrl:l,data:i,disabled:c||b||!i||0===i.results.length,markAllAsRead:(g=(0,h.Z)(m().mark((function n(){return m().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:window.confirm(pgettext("notifications","Mark all notifications as read?"))&&e({onSuccess:function(){var e=(0,h.Z)(m().mark((function e(){return m().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:d(),t((0,f.yH)({unreadNotifications:null})),Z.Z.success(pgettext("notifications","All notifications have been marked as read."));case 3:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),onError:Z.Z.apiError});case 2:case"end":return n.stop()}}),n)}))),function(){return g.apply(this,arguments)})};return c||b?(0,a.Z)("div",{},void 0,o().createElement(B,y),L||(L=(0,a.Z)(k.Pu,{})),o().createElement(B,(0,p.Z)({},y,{bottom:!0}))):u?(0,a.Z)("div",{},void 0,o().createElement(B,y),n||(n=(0,a.Z)(k.lb,{error:u})),o().createElement(B,(0,p.Z)({},y,{bottom:!0}))):i?(!i.hasPrevious&&s&&window.history.replaceState({},"",l),(0,a.Z)("div",{},void 0,o().createElement(B,y),(0,a.Z)(k.uE,{filter:r,items:i.results,hasNext:i.hasNext,hasPrevious:i.hasPrevious}),o().createElement(B,(0,p.Z)({},y,{bottom:!0})))):null}))})))}));var D;n(4517);const z=function(){var e=misago.get("NOTIFICATIONS_URL");return(0,a.Z)("div",{className:"page page-notifications"},void 0,D||(D=(0,a.Z)(d,{})),(0,a.Z)(c.F0,{history:c.mW,routes:[{path:e,component:j,props:{filter:"all"}},{path:e+"unread/",component:j,props:{filter:"unread"}},{path:e+"read/",component:j,props:{filter:"read"}}]}))};var U,q=n(90287);misago.addInitializer({name:"component:notifications",initializer:function(e){var t=misago.get("NOTIFICATIONS_URL");if(document.location.pathname.startsWith(t)&&!document.location.pathname.startsWith(t+"disable-email/")&&e.get("isAuthenticated")){var n=document.getElementById("page-mount");r().render((0,a.Z)(l.zt,{store:q.Z.getStore()},void 0,U||(U=(0,a.Z)(z,{}))),n)}},after:"store"})},46016:(e,t,n)=>{"use strict";var a,i=n(37424),o=n(22928),s=n(15671),r=n(43144),l=n(97326),c=n(79340),u=n(6215),d=n(61120),p=n(4942),h=n(57588),v=n.n(h),m=n(30381),f=n.n(m),Z=n(37848);var g,b=function(e){(0,c.Z)(l,e);var t,n,i=(t=l,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function l(){return(0,s.Z)(this,l),i.apply(this,arguments)}return(0,r.Z)(l,[{key:"render",value:function(){return a||(a=(0,o.Z)("div",{className:"panel-body panel-body-loading"},void 0,(0,o.Z)(Z.Z,{className:"loader loader-spaced"})))}}]),l}(v().Component),y=n(33556),_=n(99170),k=n(55547),N=n(53328);var x,w=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(e){var t;return(0,s.Z)(this,i),t=a.call(this,e),(0,p.Z)((0,l.Z)(t),"update",(function(e){e.expires_on&&(e.expires_on=f()(e.expires_on)),t.setState({isLoaded:!0,error:null,ban:e})})),(0,p.Z)((0,l.Z)(t),"error",(function(e){t.setState({isLoaded:!0,error:e.detail,ban:null})})),_.Z.has("PROFILE_BAN")?t.initWithPreloadedData(_.Z.pop("PROFILE_BAN")):t.initWithoutPreloadedData(),t.startPolling(e.profile.api.ban),t}return(0,r.Z)(i,[{key:"initWithPreloadedData",value:function(e){e.expires_on&&(e.expires_on=f()(e.expires_on)),this.state={isLoaded:!0,ban:e}}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1}}},{key:"startPolling",value:function(e){k.Z.start({poll:"ban-details",url:e,frequency:9e4,update:this.update,error:this.error})}},{key:"componentDidMount",value:function(){N.Z.set({title:pgettext("profile ban details title","Ban details"),parent:this.props.profile.username})}},{key:"componentWillUnmount",value:function(){k.Z.stop("ban-details")}},{key:"getUserMessage",value:function(){return this.state.ban.user_message?(0,o.Z)("div",{className:"panel-body ban-message ban-user-message"},void 0,(0,o.Z)("h4",{},void 0,pgettext("profile ban details","User-shown ban message")),(0,o.Z)("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.state.ban.user_message.html}})):null}},{key:"getStaffMessage",value:function(){return this.state.ban.staff_message?(0,o.Z)("div",{className:"panel-body ban-message ban-staff-message"},void 0,(0,o.Z)("h4",{},void 0,pgettext("profile ban details","Team-shown ban message")),(0,o.Z)("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.state.ban.staff_message.html}})):null}},{key:"getExpirationMessage",value:function(){if(this.state.ban.expires_on){if(this.state.ban.expires_on.isAfter(f()())){var e=interpolate(pgettext("profile ban details","This ban expires on %(expires_on)s."),{expires_on:this.state.ban.expires_on.format("LL, LT")},!0),t=interpolate(pgettext("profile ban details","This ban expires %(expires_on)s."),{expires_on:this.state.ban.expires_on.fromNow()},!0);return(0,o.Z)("abbr",{title:e},void 0,t)}return pgettext("profile ban details","This ban has expired.")}return interpolate(pgettext("profile ban details","%(username)s's ban is permanent."),{username:this.props.profile.username},!0)}},{key:"getPanelBody",value:function(){return this.state.ban?Object.keys(this.state.ban).length?(0,o.Z)("div",{},void 0,this.getUserMessage(),this.getStaffMessage(),(0,o.Z)("div",{className:"panel-body ban-expires"},void 0,(0,o.Z)("h4",{},void 0,pgettext("profile ban details","Ban expiration")),(0,o.Z)("p",{className:"lead"},void 0,this.getExpirationMessage()))):(0,o.Z)("div",{},void 0,(0,o.Z)(y.Z,{message:pgettext("profile ban details","No ban is active at the moment.")})):this.state.error?(0,o.Z)("div",{},void 0,(0,o.Z)(y.Z,{icon:"error_outline",message:this.state.error})):g||(g=(0,o.Z)("div",{},void 0,(0,o.Z)(b,{})))}},{key:"render",value:function(){return(0,o.Z)("div",{className:"profile-ban-details"},void 0,(0,o.Z)("div",{className:"panel panel-default"},void 0,(0,o.Z)("div",{className:"panel-heading"},void 0,(0,o.Z)("h3",{className:"panel-title"},void 0,pgettext("profile ban details title","Ban details"))),this.getPanelBody()))}}]),i}(v().Component);function C(e){return e.display?(0,o.Z)(y.Z,{helpText:pgettext("user profile details","No profile details are editable at this time."),message:pgettext("user profile details","This option is currently unavailable.")}):null}function R(e){return e.display?x||(x=(0,o.Z)("div",{className:"panel-body"},void 0,(0,o.Z)(Z.Z,{}))):null}var E=n(60471);var S=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(){var e;(0,s.Z)(this,i);for(var t=arguments.length,n=new Array(t),o=0;o0&&void 0!==arguments[0]?arguments[0]:0;A.Z.get(this.props.api,{start:t||0}).then((function(n){0===t?ne.Z.dispatch(te.zD(n)):ne.Z.dispatch(te.R3(n)),e.setState({isLoading:!1})}),(function(t){e.setState({isLoading:!1}),B.Z.apiError(t)}))}},{key:"componentDidMount",value:function(){N.Z.set({title:this.props.title,parent:this.props.profile.username}),this.loadItems()}},{key:"render",value:function(){return(0,o.Z)("div",{className:"profile-feed"},void 0,(0,o.Z)($.o8,{},void 0,(0,o.Z)($.Z2,{auto:!0},void 0,(0,o.Z)($.Eg,{auto:!0},void 0,(0,o.Z)("h3",{},void 0,this.props.header)))),v().createElement(oe,(0,J.Z)({isLoading:this.state.isLoading,loadMore:this.loadMore},this.props)))}}]),i}(v().Component);function oe(e){return e.posts.isLoaded&&!e.posts.results.length?(0,o.Z)("p",{className:"lead"},void 0,e.emptyMessage):(0,o.Z)("div",{},void 0,(0,o.Z)(ee.Z,{isReady:e.posts.isLoaded,posts:e.posts.results,poster:e.profile}),(0,o.Z)(se,{isLoading:e.isLoading,loadMore:e.loadMore,next:e.posts.next}))}function se(e){return e.next?(0,o.Z)("div",{className:"pager-more"},void 0,(0,o.Z)(P.Z,{className:"btn btn-default btn-outline",loading:e.isLoading,onClick:e.loadMore},void 0,pgettext("profile load more btn","Show older activity"))):null}var re=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(){return(0,s.Z)(this,i),a.apply(this,arguments)}return(0,r.Z)(i,[{key:"getClassName",value:function(){return this.props.className?"form-search "+this.props.className:"form-search"}},{key:"render",value:function(){return(0,o.Z)("div",{className:this.getClassName()},void 0,(0,o.Z)("input",{type:"text",className:"form-control",value:this.props.value,onChange:this.props.onChange,placeholder:this.props.placeholder||pgettext("quick search placeholder","Search...")}),ae||(ae=(0,o.Z)("span",{className:"material-icon"},void 0,"search")))}}]),i}(v().Component),le=n(40429),ce=n(6935);var ue=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(e){var t;return(0,s.Z)(this,i),t=a.call(this,e),(0,p.Z)((0,l.Z)(t),"loadMore",(function(){t.setState({isBusy:!0}),t.loadUsers(t.state.page+1,t.state.search)})),(0,p.Z)((0,l.Z)(t),"search",(function(e){t.setState({isLoaded:!1,isBusy:!0,search:e.target.value,count:0,more:0,page:1,pages:1}),t.loadUsers(1,e.target.value)})),t.setSpecialProps(),_.Z.has(t.PRELOADED_DATA_KEY)?t.initWithPreloadedData(_.Z.pop(t.PRELOADED_DATA_KEY)):t.initWithoutPreloadedData(),t}return(0,r.Z)(i,[{key:"setSpecialProps",value:function(){this.PRELOADED_DATA_KEY="PROFILE_FOLLOWERS",this.TITLE=pgettext("profile followers title","Followers"),this.API_FILTER="followers"}},{key:"initWithPreloadedData",value:function(e){this.state={isLoaded:!0,isBusy:!1,search:"",count:e.count,more:e.more,page:e.page,pages:e.pages},ne.Z.dispatch((0,ce.ZB)(e.results))}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1,isBusy:!1,search:"",count:0,more:0,page:1,pages:1},this.loadUsers()}},{key:"loadUsers",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,a=this.props.profile.api[this.API_FILTER];A.Z.get(a,{search:n,page:t||1},"user-"+this.API_FILTER).then((function(n){1===t?ne.Z.dispatch((0,ce.ZB)(n.results)):ne.Z.dispatch((0,ce.R3)(n.results)),e.setState({isLoaded:!0,isBusy:!1,count:n.count,more:n.more,page:n.page,pages:n.pages})}),(function(e){B.Z.apiError(e)}))}},{key:"componentDidMount",value:function(){N.Z.set({title:this.TITLE,parent:this.props.profile.username})}},{key:"getLabel",value:function(){if(this.state.isLoaded){if(this.state.search){var e=npgettext("profile followers","Found %(users)s user.","Found %(users)s users.",this.state.count);return interpolate(e,{users:this.state.count},!0)}if(this.props.profile.id===this.props.user.id){var t=npgettext("profile followers","You have %(users)s follower.","You have %(users)s followers.",this.state.count);return interpolate(t,{users:this.state.count},!0)}var n=npgettext("profile followers","%(username)s has %(users)s follower.","%(username)s has %(users)s followers.",this.state.count);return interpolate(n,{username:this.props.profile.username,users:this.state.count},!0)}return pgettext("Loading...")}},{key:"getEmptyMessage",value:function(){return this.state.search?pgettext("profile followers","Search returned no users matching specified criteria."):this.props.user.id===this.props.profile.id?pgettext("profile followers","You have no followers."):interpolate(pgettext("profile followers","%(username)s has no followers."),{username:this.props.profile.username},!0)}},{key:"getMoreButton",value:function(){return this.state.more?(0,o.Z)("div",{className:"pager-more"},void 0,(0,o.Z)(P.Z,{className:"btn btn-default btn-outline",loading:this.state.isBusy,onClick:this.loadMore},void 0,interpolate(pgettext("profile followers","Show more (%(more)s)"),{more:this.state.more},!0))):null}},{key:"getListBody",value:function(){return this.state.isLoaded&&0===this.state.count?(0,o.Z)("p",{className:"lead"},void 0,this.getEmptyMessage()):(0,o.Z)("div",{},void 0,(0,o.Z)(le.Z,{cols:3,isReady:this.state.isLoaded,users:this.props.users}),this.getMoreButton())}},{key:"getClassName",value:function(){return"profile-"+this.API_FILTER}},{key:"render",value:function(){return(0,o.Z)("div",{className:this.getClassName()},void 0,(0,o.Z)($.o8,{},void 0,(0,o.Z)($.Z2,{auto:!0},void 0,(0,o.Z)($.Eg,{auto:!0},void 0,(0,o.Z)("h3",{},void 0,this.getLabel()))),(0,o.Z)($.Z2,{},void 0,(0,o.Z)($.Eg,{},void 0,(0,o.Z)(re,{value:this.state.search,onChange:this.search,placeholder:pgettext("profile followers search","Search users...")})))),this.getListBody())}}]),i}(v().Component);var de=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(){return(0,s.Z)(this,i),a.apply(this,arguments)}return(0,r.Z)(i,[{key:"setSpecialProps",value:function(){this.PRELOADED_DATA_KEY="PROFILE_FOLLOWS",this.TITLE=pgettext("profile follows title","Follows"),this.API_FILTER="follows"}},{key:"getLabel",value:function(){if(this.state.isLoaded){if(this.state.search){var e=npgettext("profile follows","Found %(users)s user.","Found %(users)s users.",this.state.count);return interpolate(e,{users:this.state.count},!0)}if(this.props.profile.id===this.props.user.id){var t=npgettext("profile follows","You are following %(users)s user.","You are following %(users)s users.",this.state.count);return interpolate(t,{users:this.state.count},!0)}var n=npgettext("profile follows","%(username)s is following %(users)s user.","%(username)s is following %(users)s users.",this.state.count);return interpolate(n,{username:this.props.profile.username,users:this.state.count},!0)}return pgettext("profile follows","Loading...")}},{key:"getEmptyMessage",value:function(){return this.state.search?pgettext("profile follows","Search returned no users matching specified criteria."):this.props.user.id===this.props.profile.id?pgettext("profile follows","You are not following any users."):interpolate(pgettext("profile follows","%(username)s is not following any users."),{username:this.props.profile.username},!0)}}]),i}(ue);var pe,he,ve=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(){return(0,s.Z)(this,i),a.apply(this,arguments)}return(0,r.Z)(i,[{key:"getEmptyMessage",value:function(){return this.props.emptyMessage?this.props.emptyMessage:pgettext("username history empty","Your account has no history of name changes.")}},{key:"render",value:function(){return(0,o.Z)("div",{className:"username-history ui-ready"},void 0,(0,o.Z)("ul",{className:"list-group"},void 0,(0,o.Z)("li",{className:"list-group-item empty-message"},void 0,this.getEmptyMessage())))}}]),i}(v().Component),me=n(19605);var fe=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(){return(0,s.Z)(this,i),a.apply(this,arguments)}return(0,r.Z)(i,[{key:"renderUserAvatar",value:function(){return this.props.change.changed_by?(0,o.Z)("a",{href:this.props.change.changed_by.url,className:"user-avatar-wrapper"},void 0,(0,o.Z)(me.ZP,{user:this.props.change.changed_by,size:"100"})):pe||(pe=(0,o.Z)("span",{className:"user-avatar-wrapper"},void 0,(0,o.Z)(me.ZP,{size:"100"})))}},{key:"renderUsername",value:function(){return this.props.change.changed_by?(0,o.Z)("a",{href:this.props.change.changed_by.url,className:"item-title"},void 0,this.props.change.changed_by.username):(0,o.Z)("span",{className:"item-title"},void 0,this.props.change.changed_by_username)}},{key:"render",value:function(){return(0,o.Z)("li",{className:"list-group-item"},this.props.change.id,(0,o.Z)("div",{className:"change-avatar"},void 0,this.renderUserAvatar()),(0,o.Z)("div",{className:"change-author"},void 0,this.renderUsername()),(0,o.Z)("div",{className:"change"},void 0,(0,o.Z)("span",{className:"old-username"},void 0,this.props.change.old_username),he||(he=(0,o.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),(0,o.Z)("span",{className:"new-username"},void 0,this.props.change.new_username)),(0,o.Z)("div",{className:"change-date"},void 0,(0,o.Z)("abbr",{title:this.props.change.changed_on.format("LLL")},void 0,this.props.change.changed_on.fromNow())))}}]),i}(v().Component);var Ze,ge,be=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(){return(0,s.Z)(this,i),a.apply(this,arguments)}return(0,r.Z)(i,[{key:"render",value:function(){return(0,o.Z)("div",{className:"username-history ui-ready"},void 0,(0,o.Z)("ul",{className:"list-group"},void 0,this.props.changes.map((function(e){return(0,o.Z)(fe,{change:e},e.id)}))))}}]),i}(v().Component),ye=n(44039);var _e=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(){return(0,s.Z)(this,i),a.apply(this,arguments)}return(0,r.Z)(i,[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"getClassName",value:function(){return this.props.hiddenOnMobile?"list-group-item hidden-xs hidden-sm":"list-group-item"}},{key:"render",value:function(){return(0,o.Z)("li",{className:this.getClassName()},void 0,Ze||(Ze=(0,o.Z)("div",{className:"change-avatar"},void 0,(0,o.Z)("span",{className:"user-avatar"},void 0,(0,o.Z)(me.ZP,{size:"100"})))),(0,o.Z)("div",{className:"change-author"},void 0,(0,o.Z)("span",{className:"ui-preview-text",style:{width:ye.e(30,100)+"px"}},void 0," ")),(0,o.Z)("div",{className:"change"},void 0,(0,o.Z)("span",{className:"ui-preview-text",style:{width:ye.e(30,70)+"px"}},void 0," "),ge||(ge=(0,o.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),(0,o.Z)("span",{className:"ui-preview-text",style:{width:ye.e(30,70)+"px"}},void 0," ")),(0,o.Z)("div",{className:"change-date"},void 0,(0,o.Z)("span",{className:"ui-preview-text",style:{width:ye.e(80,140)+"px"}},void 0," ")))}}]),i}(v().Component);var ke,Ne=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(){return(0,s.Z)(this,i),a.apply(this,arguments)}return(0,r.Z)(i,[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return(0,o.Z)("div",{className:"username-history ui-preview"},void 0,(0,o.Z)("ul",{className:"list-group"},void 0,[0,1,2].map((function(e){return(0,o.Z)(_e,{hiddenOnMobile:e>0},e)}))))}}]),i}(v().Component);var xe=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(){return(0,s.Z)(this,i),a.apply(this,arguments)}return(0,r.Z)(i,[{key:"render",value:function(){return this.props.isLoaded?this.props.changes.length?(0,o.Z)(be,{changes:this.props.changes}):(0,o.Z)(ve,{emptyMessage:this.props.emptyMessage}):ke||(ke=(0,o.Z)(Ne,{}))}}]),i}(v().Component),we=n(48927);var Ce=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(e){var t;return(0,s.Z)(this,i),t=a.call(this,e),(0,p.Z)((0,l.Z)(t),"loadMore",(function(){t.setState({isBusy:!0}),t.loadChanges(t.state.page+1,t.state.search)})),(0,p.Z)((0,l.Z)(t),"search",(function(e){t.setState({isLoaded:!1,isBusy:!0,search:e.target.value,count:0,more:0,page:1,pages:1}),t.loadChanges(1,e.target.value)})),_.Z.has("PROFILE_NAME_HISTORY")?t.initWithPreloadedData(_.Z.pop("PROFILE_NAME_HISTORY")):t.initWithoutPreloadedData(),t}return(0,r.Z)(i,[{key:"initWithPreloadedData",value:function(e){this.state={isLoaded:!0,isBusy:!1,search:"",count:e.count,more:e.more,page:e.page,pages:e.pages},ne.Z.dispatch((0,we.ZB)(e.results))}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1,isBusy:!1,search:"",count:0,more:0,page:1,pages:1},this.loadChanges()}},{key:"loadChanges",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;A.Z.get(_.Z.get("USERNAME_CHANGES_API"),{user:this.props.profile.id,search:n,page:t||1},"search-username-history").then((function(n){1===t?ne.Z.dispatch((0,we.ZB)(n.results)):ne.Z.dispatch((0,we.R3)(n.results)),e.setState({isLoaded:!0,isBusy:!1,count:n.count,more:n.more,page:n.page,pages:n.pages})}),(function(e){B.Z.apiError(e)}))}},{key:"componentDidMount",value:function(){N.Z.set({title:pgettext("profile username history title","Username history"),parent:this.props.profile.username})}},{key:"getLabel",value:function(){if(this.state.isLoaded){if(this.state.search){var e=npgettext("profile username history","Found %(changes)s username change.","Found %(changes)s username changes.",this.state.count);return interpolate(e,{changes:this.state.count},!0)}if(this.props.profile.id===this.props.user.id){var t=npgettext("profile username history","Your username was changed %(changes)s time.","Your username was changed %(changes)s times.",this.state.count);return interpolate(t,{changes:this.state.count},!0)}var n=npgettext("profile username history","%(username)s's username was changed %(changes)s time.","%(username)s's username was changed %(changes)s times.",this.state.count);return interpolate(n,{username:this.props.profile.username,changes:this.state.count},!0)}return pgettext("profile username history","Loading...")}},{key:"getEmptyMessage",value:function(){return this.state.search?pgettext("profile username history","Search returned no username changes matching specified criteria."):this.props.user.id===this.props.profile.id?pgettext("username history empty","Your account has no history of name changes."):interpolate(pgettext("profile username history","%(username)s's username was never changed."),{username:this.props.profile.username},!0)}},{key:"getMoreButton",value:function(){return this.state.more?(0,o.Z)("div",{className:"pager-more"},void 0,(0,o.Z)(P.Z,{className:"btn btn-default btn-outline",loading:this.state.isBusy,onClick:this.loadMore},void 0,interpolate(pgettext("profile username history","Show older (%(more)s)"),{more:this.state.more},!0))):null}},{key:"render",value:function(){return(0,o.Z)("div",{className:"profile-username-history"},void 0,(0,o.Z)($.o8,{},void 0,(0,o.Z)($.Z2,{auto:!0},void 0,(0,o.Z)($.Eg,{auto:!0},void 0,(0,o.Z)("h3",{},void 0,this.getLabel()))),(0,o.Z)($.Z2,{},void 0,(0,o.Z)($.Eg,{},void 0,(0,o.Z)(re,{value:this.state.search,onChange:this.search,placeholder:pgettext("profile username history search input","Search history...")})))),(0,o.Z)(xe,{isLoaded:this.state.isLoaded,emptyMessage:this.getEmptyMessage(),changes:this.props["username-history"]}),this.getMoreButton())}}]),i}(v().Component),Re=n(82125),Ee=n(27519),Se=n(59131),Oe=n(98936),Le=n(99755);var Pe,Te=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(e){var t;return(0,s.Z)(this,i),t=a.call(this,e),(0,p.Z)((0,l.Z)(t),"action",(function(){t.setState({isLoading:!0}),t.props.profile.is_followed?ne.Z.dispatch((0,Ee.r$)({is_followed:!1,followers:t.props.profile.followers-1})):ne.Z.dispatch((0,Ee.r$)({is_followed:!0,followers:t.props.profile.followers+1})),A.Z.post(t.props.profile.api.follow).then((function(e){t.setState({isLoading:!1}),ne.Z.dispatch((0,Ee.r$)(e))}),(function(e){t.setState({isLoading:!1}),B.Z.apiError(e)}))})),t.state={isLoading:!1},t}return(0,r.Z)(i,[{key:"getClassName",value:function(){return this.props.profile.is_followed?this.props.className+" btn-default btn-following":this.props.className+" btn-default btn-follow"}},{key:"getIcon",value:function(){return this.props.profile.is_followed?"favorite":"favorite_border"}},{key:"getLabel",value:function(){return this.props.profile.is_followed?pgettext("user profile follow btn","Following"):pgettext("user profile follow btn","Follow")}},{key:"render",value:function(){return(0,o.Z)(P.Z,{className:this.getClassName(),disabled:this.state.isLoading,onClick:this.action},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,this.getIcon()),this.getLabel())}}]),i}(v().Component),Ae=n(64646);var Be,Ie,je=function(e){(0,c.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function i(){var e;(0,s.Z)(this,i);for(var t=arguments.length,n=new Array(t),o=0;o1?(t.setState({countdown:t.state.countdown-1}),t.countdown()):t.state.confirm||t.setState({confirm:!0})}),1e3)})),t.state={isLoaded:!1,isLoading:!1,isDeleted:!1,error:null,countdown:5,confirm:!1,with_content:!1},t}return(0,r.Z)(i,[{key:"componentDidMount",value:function(){var e=this;A.Z.get(this.props.profile.api.delete).then((function(){e.setState({isLoaded:!0}),e.countdown()}),(function(t){e.setState({isLoaded:!0,error:t.detail})}))}},{key:"send",value:function(){return A.Z.post(this.props.profile.api.delete,{with_content:this.state.with_content})}},{key:"handleSuccess",value:function(){k.Z.stop("user-profile"),this.state.with_content?this.setState({isDeleted:interpolate(pgettext("profile delete","%(username)s's account, threads, posts and other content has been deleted."),{username:this.props.profile.username},!0)}):this.setState({isDeleted:interpolate(pgettext("profile delete","%(username)s's account has been deleted and other content has been hidden."),{username:this.props.profile.username},!0)})}},{key:"getButtonLabel",value:function(){return this.state.confirm?interpolate(pgettext("profile delete btn","Delete %(username)s"),{username:this.props.profile.username},!0):interpolate(pgettext("profile delete btn","Please wait... (%(countdown)ss)"),{countdown:this.state.countdown},!0)}},{key:"getForm",value:function(){return(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)("div",{className:"modal-body"},void 0,(0,o.Z)(O.Z,{label:pgettext("profile delete","User content"),for:"id_with_content"},void 0,(0,o.Z)(ze.Z,{id:"id_with_content",disabled:this.state.isLoading,labelOn:pgettext("profile delete content","Delete together with user's account"),labelOff:pgettext("profile delete content","Hide after deleting user's account"),onChange:this.bindInput("with_content"),value:this.state.with_content}))),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("button",{type:"button",className:"btn btn-default","data-dismiss":"modal"},void 0,pgettext("profile delete btn","Cancel")),(0,o.Z)(P.Z,{className:"btn-danger",loading:this.state.isLoading,disabled:!this.state.confirm},void 0,this.getButtonLabel())))}},{key:"getDeletedBody",value:function(){return(0,o.Z)("div",{className:"modal-body"},void 0,Ve||(Ve=(0,o.Z)("div",{className:"message-icon"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,o.Z)("div",{className:"message-body"},void 0,(0,o.Z)("p",{className:"lead"},void 0,this.state.isDeleted),(0,o.Z)("p",{},void 0,(0,o.Z)("a",{href:_.Z.get("USERS_LIST_URL")},void 0,pgettext("profile delete link","Return to users list")))))}},{key:"getModalBody",value:function(){return this.state.error?(0,o.Z)(Ue.Z,{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.state.isDeleted?this.getDeletedBody():this.getForm():Ye||(Ye=(0,o.Z)(De.Z,{}))}},{key:"getClassName",value:function(){return this.state.error||this.state.isDeleted?"modal-dialog modal-message modal-delete-account":"modal-dialog modal-delete-account"}},{key:"render",value:function(){return(0,o.Z)("div",{className:this.getClassName(),role:"document"},void 0,(0,o.Z)("div",{className:"modal-content"},void 0,(0,o.Z)("div",{className:"modal-header"},void 0,(0,o.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,Ge||(Ge=(0,o.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,o.Z)("h4",{className:"modal-title"},void 0,pgettext("profile delete title","Delete user account"))),this.getModalBody()))}}]),i}(T.Z),Je=n(59801);var et=function(e){return{tick:e.tick,user:e.auth,profile:e.profile}},tt=function(e){(0,c.Z)(h,e);var t,n,a=(t=h,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,d.Z)(t);if(n){var i=(0,d.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,u.Z)(this,e)});function h(){var e;(0,s.Z)(this,h);for(var t=arguments.length,n=new Array(t),o=0;o{"use strict";var a,i=n(99170),o=n(97326),s=n(4942),r=n(22928),l=n(15671),c=n(43144),u=n(79340),d=n(6215),p=n(61120),h=n(57588),v=n.n(h),m=n(82211),f=n(43345),Z=n(78657),g=n(53904),b=n(55210),y=n(93051);function _(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,a=(0,p.Z)(e);if(t){var i=(0,p.Z)(this).constructor;n=Reflect.construct(a,arguments,i)}else n=a.apply(this,arguments);return(0,d.Z)(this,n)}}var k=function(e){(0,u.Z)(n,e);var t=_(n);function n(e){var a;return(0,l.Z)(this,n),(a=t.call(this,e)).state={isLoading:!1,email:"",validators:{email:[b.Do()]}},a}return(0,c.Z)(n,[{key:"clean",value:function(){return!!this.isValid()||(g.Z.error(pgettext("request activation link form","Enter a valid e-mail address.")),!1)}},{key:"send",value:function(){return Z.Z.post(i.Z.get("SEND_ACTIVATION_API"),{email:this.state.email})}},{key:"handleSuccess",value:function(e){this.props.callback(e)}},{key:"handleError",value:function(e){["already_active","inactive_admin"].indexOf(e.code)>-1?g.Z.info(e.detail):403===e.status&&e.ban?(0,y.Z)(e.ban):g.Z.apiError(e)}},{key:"render",value:function(){return(0,r.Z)("div",{className:"well well-form well-form-request-activation-link"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"form-group"},void 0,(0,r.Z)("div",{className:"control-input"},void 0,(0,r.Z)("input",{type:"text",className:"form-control",placeholder:pgettext("request activation link form field","Your e-mail address"),disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email}))),(0,r.Z)(m.Z,{className:"btn-primary btn-block",loading:this.state.isLoading},void 0,pgettext("request activation link form btn","Send link"))))}}]),n}(f.Z),N=function(e){(0,u.Z)(n,e);var t=_(n);function n(){return(0,l.Z)(this,n),t.apply(this,arguments)}return(0,c.Z)(n,[{key:"getMessage",value:function(){return interpolate(pgettext("request activation link form","Activation link was sent to %(email)s"),{email:this.props.user.email},!0)}},{key:"render",value:function(){return(0,r.Z)("div",{className:"well well-form well-form-request-activation-link well-done"},void 0,(0,r.Z)("div",{className:"done-message"},void 0,a||(a=(0,r.Z)("div",{className:"message-icon"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"check"))),(0,r.Z)("div",{className:"message-body"},void 0,(0,r.Z)("p",{},void 0,this.getMessage())),(0,r.Z)("button",{className:"btn btn-primary btn-block",type:"button",onClick:this.props.callback},void 0,pgettext("request activation link form btn","Request another link"))))}}]),n}(v().Component),x=function(e){(0,u.Z)(n,e);var t=_(n);function n(e){var a;return(0,l.Z)(this,n),a=t.call(this,e),(0,s.Z)((0,o.Z)(a),"complete",(function(e){a.setState({complete:e})})),(0,s.Z)((0,o.Z)(a),"reset",(function(){a.setState({complete:!1})})),a.state={complete:!1},a}return(0,c.Z)(n,[{key:"render",value:function(){return this.state.complete?(0,r.Z)(N,{user:this.state.complete,callback:this.reset}):(0,r.Z)(k,{callback:this.complete})}}]),n}(v().Component),w=n(4869);i.Z.addInitializer({name:"component:request-activation-link",initializer:function(){document.getElementById("request-activation-link-mount")&&(0,w.Z)(x,"request-activation-link-mount",!1)},after:"store"})},11768:(e,t,n)=>{"use strict";var a,i,o=n(99170),s=n(97326),r=n(4942),l=n(22928),c=n(15671),u=n(43144),d=n(79340),p=n(6215),h=n(61120),v=n(57588),m=n.n(v),f=n(73935),Z=n.n(f),g=n(82211),b=n(43345),y=n(78657),_=n(53904),k=n(55210),N=n(93051);function x(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,a=(0,h.Z)(e);if(t){var i=(0,h.Z)(this).constructor;n=Reflect.construct(a,arguments,i)}else n=a.apply(this,arguments);return(0,p.Z)(this,n)}}var w=function(e){(0,d.Z)(n,e);var t=x(n);function n(e){var a;return(0,c.Z)(this,n),(a=t.call(this,e)).state={isLoading:!1,email:"",validators:{email:[k.Do()]}},a}return(0,u.Z)(n,[{key:"clean",value:function(){return!!this.isValid()||(_.Z.error(pgettext("request password reset form","Enter a valid e-mail address.")),!1)}},{key:"send",value:function(){return y.Z.post(o.Z.get("SEND_PASSWORD_RESET_API"),{email:this.state.email})}},{key:"handleSuccess",value:function(e){this.props.callback(e)}},{key:"handleError",value:function(e){["inactive_user","inactive_admin"].indexOf(e.code)>-1?this.props.showInactivePage(e):403===e.status&&e.ban?(0,N.Z)(e.ban):_.Z.apiError(e)}},{key:"render",value:function(){return(0,l.Z)("div",{className:"well well-form well-form-request-password-reset"},void 0,(0,l.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,l.Z)("div",{className:"form-group"},void 0,(0,l.Z)("div",{className:"control-input"},void 0,(0,l.Z)("input",{type:"text",className:"form-control",placeholder:pgettext("request password reset form field","Your e-mail address"),disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email}))),(0,l.Z)(g.Z,{className:"btn-primary btn-block",loading:this.state.isLoading},void 0,pgettext("request password reset form btn","Send link"))))}}]),n}(b.Z),C=function(e){(0,d.Z)(n,e);var t=x(n);function n(){return(0,c.Z)(this,n),t.apply(this,arguments)}return(0,u.Z)(n,[{key:"getMessage",value:function(){return interpolate(pgettext("request password reset form","Reset password link was sent to %(email)s"),{email:this.props.user.email},!0)}},{key:"render",value:function(){return(0,l.Z)("div",{className:"well well-form well-form-request-password-reset well-done"},void 0,(0,l.Z)("div",{className:"done-message"},void 0,a||(a=(0,l.Z)("div",{className:"message-icon"},void 0,(0,l.Z)("span",{className:"material-icon"},void 0,"check"))),(0,l.Z)("div",{className:"message-body"},void 0,(0,l.Z)("p",{},void 0,this.getMessage())),(0,l.Z)("button",{type:"button",className:"btn btn-primary btn-block",onClick:this.props.callback},void 0,pgettext("request password reset form btn","Request another link"))))}}]),n}(m().Component),R=function(e){(0,d.Z)(n,e);var t=x(n);function n(){return(0,c.Z)(this,n),t.apply(this,arguments)}return(0,u.Z)(n,[{key:"getActivateButton",value:function(){return"inactive_user"===this.props.activation?(0,l.Z)("p",{},void 0,(0,l.Z)("a",{href:o.Z.get("REQUEST_ACTIVATION_URL")},void 0,pgettext("request password reset form error","Activate your account."))):null}},{key:"render",value:function(){return(0,l.Z)("div",{className:"page page-message page-message-info page-forgotten-password-inactive"},void 0,(0,l.Z)("div",{className:"container"},void 0,(0,l.Z)("div",{className:"message-panel"},void 0,i||(i=(0,l.Z)("div",{className:"message-icon"},void 0,(0,l.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,l.Z)("div",{className:"message-body"},void 0,(0,l.Z)("p",{className:"lead"},void 0,pgettext("request password reset form error","Your account is inactive.")),(0,l.Z)("p",{},void 0,this.props.message),this.getActivateButton()))))}}]),n}(m().Component),E=function(e){(0,d.Z)(n,e);var t=x(n);function n(e){var a;return(0,c.Z)(this,n),a=t.call(this,e),(0,r.Z)((0,s.Z)(a),"complete",(function(e){a.setState({complete:e})})),(0,r.Z)((0,s.Z)(a),"reset",(function(){a.setState({complete:!1})})),a.state={complete:!1},a}return(0,u.Z)(n,[{key:"showInactivePage",value:function(e){Z().render((0,l.Z)(R,{activation:e.code,message:e.detail}),document.getElementById("page-mount"))}},{key:"render",value:function(){return this.state.complete?(0,l.Z)(C,{callback:this.reset,user:this.state.complete}):(0,l.Z)(w,{callback:this.complete,showInactivePage:this.showInactivePage})}}]),n}(m().Component),S=n(4869);o.Z.addInitializer({name:"component:request-password-reset",initializer:function(){document.getElementById("request-password-reset-mount")&&(0,S.Z)(E,"request-password-reset-mount",!1)},after:"store"})},61323:(e,t,n)=>{"use strict";var a,i=n(99170),o=n(97326),s=n(4942),r=n(22928),l=n(15671),c=n(43144),u=n(79340),d=n(6215),p=n(61120),h=n(57588),v=n.n(h),m=n(73935),f=n.n(m),Z=n(82211),g=n(43345),b=n(14467),y=n(78657),_=n(98274),k=n(59801),N=n(53904),x=n(93051),w=n(19755);function C(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,a=(0,p.Z)(e);if(t){var i=(0,p.Z)(this).constructor;n=Reflect.construct(a,arguments,i)}else n=a.apply(this,arguments);return(0,d.Z)(this,n)}}var R=function(e){(0,u.Z)(n,e);var t=C(n);function n(e){var a;return(0,l.Z)(this,n),(a=t.call(this,e)).state={isLoading:!1,password:""},a}return(0,c.Z)(n,[{key:"clean",value:function(){return!!this.state.password.trim().length||(N.Z.error(pgettext("password reset form","Enter new password.")),!1)}},{key:"send",value:function(){return y.Z.post(i.Z.get("CHANGE_PASSWORD_API"),{password:this.state.password})}},{key:"handleSuccess",value:function(e){this.props.callback(e)}},{key:"handleError",value:function(e){403===e.status&&e.ban?(0,x.Z)(e.ban):N.Z.apiError(e)}},{key:"render",value:function(){return(0,r.Z)("div",{className:"well well-form well-form-reset-password"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"form-group"},void 0,(0,r.Z)("div",{className:"control-input"},void 0,(0,r.Z)("input",{type:"password",className:"form-control",placeholder:pgettext("password reset form field","Enter new password"),disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),(0,r.Z)(Z.Z,{className:"btn-primary btn-block",loading:this.state.isLoading},void 0,pgettext("password reset form btn","Change password"))))}}]),n}(g.Z),E=function(e){(0,u.Z)(n,e);var t=C(n);function n(){return(0,l.Z)(this,n),t.apply(this,arguments)}return(0,c.Z)(n,[{key:"getMessage",value:function(){return interpolate(pgettext("password reset form","%(username)s, your password has been changed."),{username:this.props.user.username},!0)}},{key:"showSignIn",value:function(){k.Z.show(b.Z)}},{key:"render",value:function(){return(0,r.Z)("div",{className:"page page-message page-message-success page-forgotten-password-changed"},void 0,(0,r.Z)("div",{className:"container"},void 0,(0,r.Z)("div",{className:"message-panel"},void 0,a||(a=(0,r.Z)("div",{className:"message-icon"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"check"))),(0,r.Z)("div",{className:"message-body"},void 0,(0,r.Z)("p",{className:"lead"},void 0,this.getMessage()),(0,r.Z)("p",{},void 0,pgettext("password reset form","Sign in using new password to continue.")),(0,r.Z)("p",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-primary",onClick:this.showSignIn},void 0,pgettext("password reset form btn","Sign in")))))))}}]),n}(v().Component),S=function(e){(0,u.Z)(n,e);var t=C(n);function n(){var e;(0,l.Z)(this,n);for(var a=arguments.length,i=new Array(a),c=0;c{"use strict";var a,i=n(22928),o=(n(57588),n(73935)),s=n.n(o),r=n(37424),l=n(62989),c=n(90287);misago.addInitializer({name:"component:search-overlay",initializer:function(e){var t=document.getElementById("search-mount");s().render((0,i.Z)(r.zt,{store:c.Z.getStore()},void 0,a||(a=(0,i.Z)(l.F,{}))),t)},after:"store"})},40949:(e,t,n)=>{"use strict";var a,i=n(37424),o=n(22928),s=n(87462),r=n(57588),l=n.n(r),c=n(59131),u=n(15671),d=n(43144),p=n(97326),h=n(79340),v=n(6215),m=n(61120),f=n(4942),Z=n(99170),g=n(43345),b=n(21981),y=n(16427),_=n(6935),k=n(78657),N=n(53904),x=n(90287),w=n(98936),C=n(99755);var R=function(e){(0,h.Z)(s,e);var t,n,i=(t=s,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,m.Z)(t);if(n){var i=(0,m.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,v.Z)(this,e)});function s(e){var t;return(0,u.Z)(this,s),t=i.call(this,e),(0,f.Z)((0,p.Z)(t),"onQueryChange",(function(e){t.changeValue("query",e.target.value)})),t.state={isLoading:!1,query:e.search.query},t}return(0,d.Z)(s,[{key:"componentDidMount",value:function(){this.state.query.length&&this.handleSubmit()}},{key:"clean",value:function(){return!!this.state.query.trim().length||(N.Z.error(pgettext("search form","You have to enter search query.")),!1)}},{key:"send",value:function(){x.Z.dispatch((0,y.Vx)({isLoading:!0}));var e=this.state.query.trim(),t=window.location.href,n=t.indexOf("?q=");return n>0&&(t=t.substring(0,n+3)),window.history.pushState({},"",t+encodeURIComponent(e)),k.Z.get(Z.Z.get("SEARCH_API"),{q:e})}},{key:"handleSuccess",value:function(e){x.Z.dispatch((0,y.Vx)({query:this.state.query.trim(),isLoading:!1,providers:e})),e.forEach((function(e){"users"===e.id?x.Z.dispatch((0,_.ZB)(e.results.results)):"threads"===e.id&&x.Z.dispatch((0,b.zD)(e.results))}))}},{key:"handleError",value:function(e){N.Z.apiError(e),x.Z.dispatch((0,y.Vx)({isLoading:!1}))}},{key:"render",value:function(){return(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)(C.sP,{},void 0,(0,o.Z)(C.mr,{styleName:"site-search"},void 0,(0,o.Z)(C.gC,{styleName:"site-search"},void 0,(0,o.Z)("h1",{},void 0,pgettext("search form title","Search"))),(0,o.Z)(C.eA,{className:"page-header-search-form"},void 0,(0,o.Z)(w.gq,{},void 0,(0,o.Z)(w.kw,{auto:!0},void 0,(0,o.Z)(w.Z6,{},void 0,(0,o.Z)("input",{className:"form-control",disabled:this.state.isLoading,type:"text",value:this.state.query,placeholder:pgettext("search form input","Search"),onChange:this.onQueryChange})),(0,o.Z)(w.Z6,{shrink:!0},void 0,(0,o.Z)("button",{className:"btn btn-secondary btn-icon btn-outline",title:pgettext("search form btn","Search"),disabled:this.state.isLoading},void 0,a||(a=(0,o.Z)("span",{className:"material-icon"},void 0,"search"))))))))))}}]),s}(g.Z),E=n(69987);function S(e){return(0,o.Z)("div",{className:"list-group nav-side"},void 0,e.providers.map((function(e){return(0,o.Z)(E.rU,{activeClassName:"active",className:"list-group-item",to:e.url},e.id,(0,o.Z)("span",{className:"material-icon"},void 0,e.icon),e.name,(0,o.Z)(O,{results:e.results}))})))}function O(e){if(!e.results)return null;var t=e.results.count;return t>1e6?t=Math.ceil(t/1e6)+"KK":t>1e3&&(t=Math.ceil(t/1e3)+"K"),(0,o.Z)("span",{className:"badge"},void 0,t)}function L(e){return(0,o.Z)("div",{className:"page page-search"},void 0,(0,o.Z)(R,{provider:e.provider,search:e.search}),(0,o.Z)(c.Z,{},void 0,(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-md-3"},void 0,(0,o.Z)(S,{providers:e.search.providers})),(0,o.Z)("div",{className:"col-md-9"},void 0,e.children,(0,o.Z)(P,{provider:e.provider,search:e.search})))))}function P(e){var t=null;if(e.search.providers.forEach((function(n){n.id===e.provider.id&&(t=n.time)})),null===t)return null;var n=pgettext("search time","Search took %(time)s s");return(0,o.Z)("footer",{className:"search-footer"},void 0,(0,o.Z)("p",{},void 0,interpolate(n,{time:t},!0)))}var T=n(11005),A=n(82211);function B(e){return(0,o.Z)("div",{},void 0,(0,o.Z)(T.Z,{isReady:!0,posts:e.results}),l().createElement(I,e))}n(69092);var I=function(e){(0,h.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,m.Z)(t);if(n){var i=(0,m.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,v.Z)(this,e)});function i(){var e;(0,u.Z)(this,i);for(var t=arguments.length,n=new Array(t),o=0;o{"use strict";var a,i=n(22928),o=(n(57588),n(73935)),s=n.n(o),r=n(37424),l=n(6333),c=n(90287);misago.addInitializer({name:"component:site-nav-overlay",initializer:function(e){var t=document.getElementById("site-nav-mount");s().render((0,i.Z)(r.zt,{store:c.Z.getStore()},void 0,a||(a=(0,i.Z)(l.Or,{}))),t)},after:"store"})},61814:(e,t,n)=>{"use strict";var a=n(37424),i=n(99170),o=n(22928),s=n(15671),r=n(43144),l=n(79340),c=n(6215),u=n(61120),d=n(57588);var p={info:"alert-info",success:"alert-success",warning:"alert-warning",error:"alert-danger"},h=function(e){(0,l.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,u.Z)(t);if(n){var i=(0,u.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,c.Z)(this,e)});function i(){return(0,s.Z)(this,i),a.apply(this,arguments)}return(0,r.Z)(i,[{key:"getSnackbarClass",value:function(){var e="alerts-snackbar";return this.props.isVisible?e+=" in":e+=" out",e}},{key:"render",value:function(){return(0,o.Z)("div",{className:this.getSnackbarClass()},void 0,(0,o.Z)("p",{className:"alert "+p[this.props.type]},void 0,this.props.message))}}]),i}(n.n(d)().Component);function v(e){return e.snackbar}var m=n(4869);i.Z.addInitializer({name:"component:snackbar",initializer:function(){(0,m.Z)((0,a.$j)(v)(h),"snackbar-mount")},after:"snackbar"})},95920:(e,t,n)=>{"use strict";var a=n(57588),i=n.n(a),o=n(22928),s=n(15671),r=n(43144),l=n(97326),c=n(79340),u=n(6215),d=n(61120),p=n(4942),h=n(99170),v=n(26106),m=n(82211),f=n(43345),Z=n(96359),g=n(78657),b=n(53904),y=n(55210),_=n(59131),k=n(99755);const N=function(e){var t=e.backendName,n=pgettext("social auth title","Sign in with %(backend)s"),a=interpolate(n,{backend:t},!0);return(0,o.Z)(k.sP,{},void 0,(0,o.Z)(k.mr,{styleName:"social-auth"},void 0,(0,o.Z)(k.gC,{styleName:"social-auth"},void 0,(0,o.Z)("h1",{},void 0,a))))};function x(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function w(e){for(var t=1;t{"use strict";var a,i,o=n(37424),s=n(22928),r=n(15671),l=n(43144),c=n(97326),u=n(79340),d=n(6215),p=n(61120),h=n(4942),v=n(57588),m=n.n(v),f=n(87462),Z=n(43345),g=n(96359),b=n(8154),y=n(7738),_=n(78657),k=n(59801),N=n(53904),x=n(90287);var w,C=function(e){(0,u.Z)(o,e);var t,n,i=(t=o,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function o(e){var t;return(0,r.Z)(this,o),t=i.call(this,e),(0,h.Z)((0,c.Z)(t),"onUsernameChange",(function(e){t.changeValue("username",e.target.value)})),t.state={isLoading:!1,username:""},t}return(0,l.Z)(o,[{key:"clean",value:function(){return!!this.state.username.trim().length||(N.Z.error(pgettext("add private thread participant","You have to enter user name.")),!1)}},{key:"send",value:function(){return _.Z.patch(this.props.thread.api.index,[{op:"add",path:"participants",value:this.state.username},{op:"add",path:"acl",value:1}])}},{key:"handleSuccess",value:function(e){x.Z.dispatch((0,y.y8)(e)),x.Z.dispatch(b.gx(e.participants)),N.Z.success(pgettext("add private thread participant","New participant has been added to thread.")),k.Z.hide()}},{key:"render",value:function(){return(0,s.Z)("div",{className:"modal-dialog modal-sm",role:"document"},void 0,(0,s.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,s.Z)("div",{className:"modal-content"},void 0,a||(a=(0,s.Z)(R,{})),(0,s.Z)("div",{className:"modal-body"},void 0,(0,s.Z)(g.Z,{for:"id_username",label:pgettext("add private thread participant field","User to add")},void 0,(0,s.Z)("input",{id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.onUsernameChange,type:"text",value:this.state.username}))),(0,s.Z)("div",{className:"modal-footer"},void 0,(0,s.Z)("button",{className:"btn btn-block btn-primary",disabled:this.state.isLoading},void 0,pgettext("add private thread participant btn","Add participant")),(0,s.Z)("button",{className:"btn btn-block btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,pgettext("add private thread participant btn","Cancel"))))))}}]),o}(Z.Z);function R(e){return(0,s.Z)("div",{className:"modal-header"},void 0,(0,s.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,i||(i=(0,s.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,s.Z)("h4",{className:"modal-title"},void 0,pgettext("add private thread participant modal title","Add participant")))}var E=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(){var e;(0,r.Z)(this,i);for(var t=arguments.length,n=new Array(t),o=0;o%(relative)s';function be(e){return(0,s.Z)("ul",{className:"list-unstyled list-inline poll-details"},void 0,(0,s.Z)(we,{votes:e.poll.votes}),(0,s.Z)(Ne,{poll:e.poll}),(0,s.Z)(Ce,{poll:e.poll}),(0,s.Z)(ye,{poll:e.poll}))}function ye(e){var t=interpolate((0,Ze.Z)(pgettext("thread poll","Started by %(poster)s %(posted_on)s.")),{poster:_e(e.poll),posted_on:ke(e.poll)},!0);return(0,s.Z)("li",{className:"poll-info-creation",dangerouslySetInnerHTML:{__html:t}})}function _e(e){return e.url.poster?interpolate('%(user)s',{url:(0,Ze.Z)(e.url.poster),user:(0,Ze.Z)(e.poster_name)},!0):interpolate('%(user)s',{user:(0,Ze.Z)(e.poster_name)},!0)}function ke(e){return interpolate(ge,{absolute:(0,Ze.Z)(e.posted_on.format("LLL")),relative:(0,Ze.Z)(e.posted_on.fromNow())},!0)}function Ne(e){if(!e.poll.length)return null;var t=interpolate((0,Ze.Z)(pgettext("thread poll","Voting ends %(ends_on)s.")),{ends_on:xe(e.poll)},!0);return(0,s.Z)("li",{className:"poll-info-ends-on",dangerouslySetInnerHTML:{__html:t}})}function xe(e){return interpolate(ge,{absolute:(0,Ze.Z)(e.endsOn.format("LLL")),relative:(0,Ze.Z)(e.endsOn.fromNow())},!0)}function we(e){var t=npgettext("thread poll","%(votes)s vote.","%(votes)s votes.",e.votes),n=interpolate(t,{votes:e.votes},!0);return(0,s.Z)("li",{className:"poll-info-votes"},void 0,n)}function Ce(e){return e.poll.is_public?(0,s.Z)("li",{className:"poll-info-public"},void 0,pgettext("thread poll","Voting is public.")):null}function Re(e){return(0,s.Z)("div",{className:"panel panel-default panel-poll"},void 0,(0,s.Z)("div",{className:"panel-body"},void 0,(0,s.Z)("h2",{},void 0,e.poll.question),(0,s.Z)(be,{poll:e.poll}),(0,s.Z)(H,{poll:e.poll}),(0,s.Z)(de,{isPollOver:e.isPollOver,poll:e.poll,edit:e.edit,showVoting:e.showVoting,thread:e.thread})))}function Ee(e){return(0,s.Z)("ul",{className:"list-unstyled list-inline poll-help"},void 0,(0,s.Z)(Se,{choicesLeft:e.choicesLeft}),(0,s.Z)(Oe,{poll:e.poll}))}function Se(e){var t=e.choicesLeft;if(0===t)return(0,s.Z)("li",{className:"poll-help-choices-left"},void 0,pgettext("thread poll","You can't select any more choices."));var n=npgettext("thread poll","You can select %(choices)s more choice.","You can select %(choices)s more choices.",t),a=interpolate(n,{choices:t},!0);return(0,s.Z)("li",{className:"poll-help-choices-left"},void 0,a)}function Oe(e){return e.poll.allow_revotes?(0,s.Z)("li",{className:"poll-help-allow-revotes"},void 0,pgettext("thread poll","You can change your vote later.")):(0,s.Z)("li",{className:"poll-help-no-revotes"},void 0,pgettext("thread poll","Votes are final."))}function Le(e){return(0,s.Z)("ul",{className:"list-unstyled poll-select-choices"},void 0,e.choices.map((function(t){return(0,s.Z)(Pe,{choice:t,toggleChoice:e.toggleChoice},t.hash)})))}var Pe=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(){var e;(0,r.Z)(this,i);for(var t=arguments.length,n=new Array(t),o=0;o2,choice:t,disabled:e.props.disabled,onChange:e.onChange,onDelete:e.onDelete},t.hash)}))),(0,s.Z)("button",{className:"btn btn-default btn-sm",disabled:this.props.disabled,onClick:this.onAdd,type:"button"},void 0,pgettext("thread poll","Add choice")))}}]),n}(m().Component),qe=function(e){(0,u.Z)(n,e);var t=ze(n);function n(){var e;(0,r.Z)(this,n);for(var a=arguments.length,i=new Array(a),o=0;o%(relative)s',{absolute:(0,Ze.Z)(e.post.hidden_on.format("LLL")),relative:(0,Ze.Z)(e.post.hidden_on.fromNow())},!0),a=interpolate((0,Ze.Z)(pgettext("event info","Hidden by %(event_by)s %(event_on)s.")),{event_by:t,event_on:n},!0);return(0,s.Z)("li",{className:"event-hidden-message",dangerouslySetInnerHTML:{__html:a}})}return null}function at(e){var t;t=e.post.poster?interpolate(et,{url:(0,Ze.Z)(e.post.poster.url),user:(0,Ze.Z)(e.post.poster_name)},!0):interpolate(Je,{user:(0,Ze.Z)(e.post.poster_name)},!0);var n=interpolate('%(relative)s',{url:(0,Ze.Z)(e.post.url.index),absolute:(0,Ze.Z)(e.post.posted_on.format("LLL")),relative:(0,Ze.Z)(e.post.posted_on.fromNow())},!0),a=interpolate((0,Ze.Z)(pgettext("event info","By %(event_by)s %(event_on)s.")),{event_by:t,event_on:n},!0);return(0,s.Z)("li",{className:"event-posters",dangerouslySetInnerHTML:{__html:a}})}var it={pinned_globally:pgettext("event message","Thread has been pinned globally."),pinned_locally:pgettext("event message","Thread has been pinned in category."),unpinned:pgettext("event message","Thread has been unpinned."),approved:pgettext("event message","Thread has been approved."),opened:pgettext("event message","Thread has been opened."),closed:pgettext("event message","Thread has been closed."),unhid:pgettext("event message","Thread has been revealed."),hid:pgettext("event message","Thread has been made hidden."),tookover:pgettext("event message","Took thread over."),owner_left:pgettext("event message","Owner has left thread. This thread is now closed."),participant_left:pgettext("event message","Participant has left thread.")},ot='%(name)s',st='%(name)s';function rt(e){return it[e.post.event_type]?(0,s.Z)("p",{className:"event-message"},void 0,it[e.post.event_type]):"changed_title"===e.post.event_type?m().createElement(lt,e):"moved"===e.post.event_type?m().createElement(ct,e):"merged"===e.post.event_type?m().createElement(ut,e):"changed_owner"===e.post.event_type?m().createElement(dt,e):"added_participant"===e.post.event_type?m().createElement(pt,e):"removed_participant"===e.post.event_type?m().createElement(ht,e):null}function lt(e){var t=(0,Ze.Z)(pgettext("event message","Thread title has been changed from %(old_title)s.")),n=interpolate(st,{name:(0,Ze.Z)(e.post.event_context.old_title)},!0),a=interpolate(t,{old_title:n},!0);return(0,s.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function ct(e){var t=(0,Ze.Z)(pgettext("event message","Thread has been moved from %(from_category)s.")),n=interpolate(ot,{url:(0,Ze.Z)(e.post.event_context.from_category.url),name:(0,Ze.Z)(e.post.event_context.from_category.name)},!0),a=interpolate(t,{from_category:n},!0);return(0,s.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function ut(e){var t=(0,Ze.Z)(pgettext("event message","The %(merged_thread)s thread has been merged into this thread.")),n=interpolate(st,{name:(0,Ze.Z)(e.post.event_context.merged_thread)},!0),a=interpolate(t,{merged_thread:n},!0);return(0,s.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function dt(e){var t=(0,Ze.Z)(pgettext("event message","Changed thread owner to %(user)s.")),n=interpolate(ot,{url:(0,Ze.Z)(e.post.event_context.user.url),name:(0,Ze.Z)(e.post.event_context.user.username)},!0),a=interpolate(t,{user:n},!0);return(0,s.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function pt(e){var t=(0,Ze.Z)(pgettext("event message","Added %(user)s to thread.")),n=interpolate(ot,{url:(0,Ze.Z)(e.post.event_context.user.url),name:(0,Ze.Z)(e.post.event_context.user.username)},!0),a=interpolate(t,{user:n},!0);return(0,s.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function ht(e){var t=(0,Ze.Z)(pgettext("event message","Removed %(user)s from thread.")),n=interpolate(ot,{url:(0,Ze.Z)(e.post.event_context.user.url),name:(0,Ze.Z)(e.post.event_context.user.username)},!0),a=interpolate(t,{user:n},!0);return(0,s.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function vt(e){return e.post.is_read?null:(0,s.Z)("div",{className:"event-label"},void 0,(0,s.Z)("span",{className:"label label-unread"},void 0,pgettext("event unread label","New event")))}var mt=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(e){var t;return(0,r.Z)(this,i),t=a.call(this,e),(0,h.Z)((0,c.Z)(t),"initialize",(function(e){t.initialized=!0,t.observer=new IntersectionObserver((function(e){return e.forEach(t.callback)})),t.observer.observe(e)})),(0,h.Z)((0,c.Z)(t),"callback",(function(e){!e.isIntersecting||t.props.post.is_read||t.primed||(window.setTimeout((function(){_.Z.post(t.props.post.api.read)}),0),t.primed=!0,t.destroy())})),t.initialized=!1,t.primed=!1,t.observer=null,t}return(0,l.Z)(i,[{key:"destroy",value:function(){this.observer&&(this.observer.disconnect(),this.observer=null)}},{key:"componentWillUnmount",value:function(){this.destroy()}},{key:"render",value:function(){var e=this,t=!this.initialized&&!this.primed&&!this.props.post.is_read;return m().createElement("div",{className:this.props.className,ref:function(n){n&&t&&e.initialize(n)}},this.props.children)}}]),i}(m().Component);function ft(e){var t="event";return e.post.isDeleted?t="hide":e.post.is_hidden&&(t="event post-hidden"),(0,s.Z)("li",{id:"post-"+e.post.id,className:t},void 0,(0,s.Z)(vt,{post:e.post}),(0,s.Z)("div",{className:"event-body"},void 0,(0,s.Z)("div",{className:"event-icon"},void 0,m().createElement(Ye,e)),(0,s.Z)(mt,{className:"event-content",post:e.post},void 0,m().createElement(rt,e),m().createElement(tt,e))))}var Zt=n(69130),gt=n(48772);function bt(e){return(0,s.Z)("div",{className:"col-xs-12 col-md-6"},void 0,m().createElement(yt,e),(0,s.Z)("div",{className:"post-attachment"},void 0,(0,s.Z)("a",{href:e.attachment.url.index,className:"attachment-name item-title",target:"_blank"},void 0,e.attachment.filename),m().createElement(Nt,e)))}function yt(e){return e.attachment.is_image?(0,s.Z)("div",{className:"post-attachment-preview"},void 0,m().createElement(kt,e)):(0,s.Z)("div",{className:"post-attachment-preview"},void 0,m().createElement(_t,e))}function _t(e){return(0,s.Z)("a",{href:e.attachment.url.index,className:"material-icon"},void 0,"insert_drive_file")}function kt(e){var t=e.attachment.url.thumb||e.attachment.url.index;return(0,s.Z)("a",{className:"post-thumbnail",href:e.attachment.url.index,target:"_blank",style:{backgroundImage:'url("'+(0,Ze.Z)(t)+'")'}})}function Nt(e){var t;t=e.attachment.url.uploader?interpolate('%(user)s',{url:(0,Ze.Z)(e.attachment.url.uploader),user:(0,Ze.Z)(e.attachment.uploader_name)},!0):interpolate('%(user)s',{user:(0,Ze.Z)(e.attachment.uploader_name)},!0);var n=interpolate('%(relative)s',{absolute:(0,Ze.Z)(e.attachment.uploaded_on.format("LLL")),relative:(0,Ze.Z)(e.attachment.uploaded_on.fromNow())},!0),a=interpolate((0,Ze.Z)(pgettext("post attachment","%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.")),{filetype:e.attachment.filetype,size:(0,gt.Z)(e.attachment.size),uploader:t,uploaded_on:n},!0);return(0,s.Z)("p",{className:"post-attachment-description",dangerouslySetInnerHTML:{__html:a}})}function xt(e){return function(e){return(!e.is_hidden||e.acl.can_see_hidden)&&e.attachments}(e.post)?(0,s.Z)("div",{className:"post-attachments"},void 0,(0,Zt.Z)(e.post.attachments,2).map((function(e){var t=e.map((function(e){return e?e.id:0})).join("_");return(0,s.Z)(wt,{row:e},t)}))):null}function wt(e){return(0,s.Z)("div",{className:"row"},void 0,e.row.map((function(e){return(0,s.Z)(bt,{attachment:e},e?e.id:0)})))}var Ct,Rt,Et,St,Ot,Lt,Pt,Tt=n(69092);function At(e){return e.post.is_hidden&&!e.post.acl.can_see_hidden?m().createElement(It,e):e.post.content?m().createElement(Bt,e):m().createElement(jt,e)}function Bt(e){var t=e.post,n="@"+(t.poster?t.poster.username:t.poster_name);return(0,s.Z)(mt,{className:"post-body",post:t},void 0,(0,s.Z)(Tt.Z,{author:n,markup:t.content}))}function It(e){var t;t=e.post.hidden_by?interpolate('%(user)s',{url:(0,Ze.Z)(e.post.url.hidden_by),user:(0,Ze.Z)(e.post.hidden_by_name)},!0):interpolate('%(user)s',{user:(0,Ze.Z)(e.post.hidden_by_name)},!0);var n=interpolate('%(relative)s',{absolute:(0,Ze.Z)(e.post.hidden_on.format("LLL")),relative:(0,Ze.Z)(e.post.hidden_on.fromNow())},!0),a=interpolate((0,Ze.Z)(pgettext("post body hidden","Hidden by %(hidden_by)s %(hidden_on)s.")),{hidden_by:t,hidden_on:n},!0);return(0,s.Z)(mt,{className:"post-body post-body-hidden",post:e.post},void 0,(0,s.Z)("p",{className:"lead"},void 0,pgettext("post body hidden","This post is hidden. You cannot see its contents.")),(0,s.Z)("p",{className:"text-muted",dangerouslySetInnerHTML:{__html:a}}))}function jt(e){return(0,s.Z)(mt,{className:"post-body post-body-invalid",post:e.post},void 0,(0,s.Z)("p",{className:"lead"},void 0,pgettext("post body invalid","This post's contents cannot be displayed.")),(0,s.Z)("p",{className:"text-muted"},void 0,pgettext("post body invalid","This error is caused by invalid post content manipulation.")))}function Dt(e){var t=e.post,n=e.thread,a=e.user;if(!Mt(t)||t.id!==n.best_answer)return null;var i;return i=a.id&&n.best_answer_marked_by===a.id?interpolate(pgettext("post best answer flag","Marked as best answer by you %(marked_on)s."),{marked_on:n.best_answer_marked_on.fromNow()},!0):interpolate(pgettext("post best answer flag","Marked as best answer by %(marked_by)s %(marked_on)s."),{marked_by:n.best_answer_marked_by_name,marked_on:n.best_answer_marked_on.fromNow()},!0),(0,s.Z)("div",{className:"post-status-message post-status-best-answer"},void 0,Ct||(Ct=(0,s.Z)("span",{className:"material-icon"},void 0,"check_box")),(0,s.Z)("p",{},void 0,i))}function zt(e){return Mt(e.post)&&e.post.is_hidden?(0,s.Z)("div",{className:"post-status-message post-status-hidden"},void 0,Rt||(Rt=(0,s.Z)("span",{className:"material-icon"},void 0,"visibility_off")),(0,s.Z)("p",{},void 0,pgettext("post hidden flag","This post is hidden. Only users with permission may see its contents."))):null}function Ut(e){return Mt(e.post)&&e.post.is_unapproved?(0,s.Z)("div",{className:"post-status-message post-status-unapproved"},void 0,Et||(Et=(0,s.Z)("span",{className:"material-icon"},void 0,"remove_circle_outline")),(0,s.Z)("p",{},void 0,pgettext("post unapproved flag","This post is unapproved. Only users with permission to approve posts and its author may see its contents."))):null}function qt(e){return Mt(e.post)&&e.post.is_protected?(0,s.Z)("div",{className:"post-status-message post-status-protected visible-xs-block"},void 0,St||(St=(0,s.Z)("span",{className:"material-icon"},void 0,"lock_outline")),(0,s.Z)("p",{},void 0,pgettext("post protected flag","This post is protected. Only moderators may change it."))):null}function Mt(e){return!e.is_hidden||e.acl.can_see_hidden}function Ft(e){x.Z.dispatch(Ge.r$(e.post,{is_unapproved:!1})),Qt(e,[{op:"replace",path:"is-unapproved",value:!1}],{is_unapproved:e.post.is_unapproved})}function Ht(e){x.Z.dispatch(Ge.r$(e.post,{is_protected:!0})),Qt(e,[{op:"replace",path:"is-protected",value:!0}],{is_protected:e.post.is_protected})}function Vt(e){x.Z.dispatch(Ge.r$(e.post,{is_protected:!1})),Qt(e,[{op:"replace",path:"is-protected",value:!1}],{is_protected:e.post.is_protected})}function Yt(e){x.Z.dispatch(Ge.r$(e.post,{is_hidden:!0,hidden_on:F()(),hidden_by_name:e.user.username,url:Object.assign(e.post.url,{hidden_by:e.user.url})})),Qt(e,[{op:"replace",path:"is-hidden",value:!0}],{is_hidden:e.post.is_hidden,hidden_on:e.post.hidden_on,hidden_by_name:e.post.hidden_by_name,url:e.post.url})}function Gt(e){x.Z.dispatch(Ge.r$(e.post,{is_hidden:!1})),Qt(e,[{op:"replace",path:"is-hidden",value:!1}],{is_hidden:e.post.is_hidden})}function $t(e){var t=e.post.last_likes||[],n=[e.user].concat(t),a=n.length>3?n.slice(0,-1):n;x.Z.dispatch(Ge.r$(e.post,{is_liked:!0,likes:e.post.likes+1,last_likes:a})),Qt(e,[{op:"replace",path:"is-liked",value:!0}],{is_liked:e.post.is_liked,likes:e.post.likes,last_likes:e.post.last_likes})}function Wt(e){x.Z.dispatch(Ge.r$(e.post,{is_liked:!1,likes:e.post.likes-1,last_likes:e.post.last_likes.filter((function(t){return!t.id||t.id!==e.user.id}))}));var t={is_liked:e.post.is_liked,likes:e.post.likes,last_likes:e.post.last_likes};Qt(e,[{op:"replace",path:"is-liked",value:!1}],t)}function Qt(e,t,n){_.Z.patch(e.post.api.index,t).then((function(t){x.Z.dispatch(Ge.r$(e.post,t))}),(function(t){400===t.status?N.Z.error(t.detail[0]):N.Z.apiError(t),x.Z.dispatch(Ge.r$(e.post,n))}))}function Kt(e){window.confirm(pgettext("post delete","Are you sure you want to delete this post? This action is not reversible!"))&&(x.Z.dispatch(Ge.r$(e.post,{isDeleted:!0})),_.Z.delete(e.post.api.index).then((function(){N.Z.success(pgettext("post delete","Post has been deleted."))}),(function(t){400===t.status?N.Z.error(t.detail):N.Z.apiError(t),x.Z.dispatch(Ge.r$(e.post,{isDeleted:!1}))})))}function Xt(e){var t=e.post,n=e.user;x.Z.dispatch(y.Vx({best_answer:t.id,best_answer_is_protected:t.is_protected,best_answer_marked_on:F()(),best_answer_marked_by:n.id,best_answer_marked_by_name:n.username,best_answer_marked_by_slug:n.slug})),en(e,[{op:"replace",path:"best-answer",value:t.id},{op:"add",path:"acl",value:!0}],{best_answer:e.thread.best_answer,best_answer_is_protected:e.thread.best_answer_is_protected,best_answer_marked_on:e.thread.best_answer_marked_on,best_answer_marked_by:e.thread.best_answer_marked_by,best_answer_marked_by_name:e.thread.best_answer_marked_by_name,best_answer_marked_by_slug:e.thread.best_answer_marked_by_slug})}function Jt(e){var t=e.post;x.Z.dispatch(y.Vx({best_answer:null,best_answer_is_protected:!1,best_answer_marked_on:null,best_answer_marked_by:null,best_answer_marked_by_name:null,best_answer_marked_by_slug:null})),en(e,[{op:"remove",path:"best-answer",value:t.id},{op:"add",path:"acl",value:!0}],{best_answer:e.thread.best_answer,best_answer_is_protected:e.thread.best_answer_is_protected,best_answer_marked_on:e.thread.best_answer_marked_on,best_answer_marked_by:e.thread.best_answer_marked_by,best_answer_marked_by_name:e.thread.best_answer_marked_by_name,best_answer_marked_by_slug:e.thread.best_answer_marked_by_slug})}function en(e,t,n){_.Z.patch(e.thread.api.index,t).then((function(e){e.best_answer_marked_on&&(e.best_answer_marked_on=F()(e.best_answer_marked_on)),x.Z.dispatch(y.Vx(e))}),(function(e){400===e.status?N.Z.error(e.detail[0]):N.Z.apiError(e),x.Z.dispatch(y.Vx(n))}))}var tn,nn,an,on,sn=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(e){var t;return(0,r.Z)(this,i),(t=a.call(this,e)).state={isReady:!1,error:null,likes:[]},t}return(0,l.Z)(i,[{key:"componentDidMount",value:function(){var e=this;_.Z.get(this.props.post.api.likes).then((function(t){e.setState({isReady:!0,likes:t.map(rn)})}),(function(t){e.setState({isReady:!0,error:t.detail})}))}},{key:"render",value:function(){return this.state.error?(0,s.Z)(ln,{className:"modal-message"},void 0,(0,s.Z)(X.Z,{message:this.state.error})):this.state.isReady?this.state.likes.length?(0,s.Z)(ln,{className:"modal-sm",likes:this.state.likes},void 0,(0,s.Z)(cn,{likes:this.state.likes})):(0,s.Z)(ln,{className:"modal-message"},void 0,(0,s.Z)(X.Z,{message:pgettext("post likes modal","No users have liked this post.")})):Ot||(Ot=(0,s.Z)(ln,{className:"modal-sm"},void 0,(0,s.Z)(J.Z,{})))}}]),i}(m().Component);function rn(e){return Object.assign({},e,{liked_on:F()(e.liked_on)})}function ln(e){var t=e.className,n=e.children,a=e.likes,i=pgettext("post likes modal title","Post Likes");if(a){var o=a.length,r=npgettext("post likes modal","%(likes)s like","%(likes)s likes",o);i=interpolate(r,{likes:o},!0)}return(0,s.Z)("div",{className:"modal-dialog "+(t||""),role:"document"},void 0,(0,s.Z)("div",{className:"modal-content"},void 0,(0,s.Z)("div",{className:"modal-header"},void 0,(0,s.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,Lt||(Lt=(0,s.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,s.Z)("h4",{className:"modal-title"},void 0,i)),n))}function cn(e){return(0,s.Z)("div",{className:"modal-body modal-post-likers"},void 0,(0,s.Z)("ul",{className:"media-list"},void 0,e.likes.map((function(e){return m().createElement(un,(0,f.Z)({key:e.id},e))}))))}function un(e){if(e.url){var t={id:e.liker_id,avatars:e.avatars};return(0,s.Z)("li",{className:"media"},void 0,(0,s.Z)("div",{className:"media-left"},void 0,(0,s.Z)("a",{className:"user-avatar",href:e.url},void 0,(0,s.Z)(B.ZP,{size:"50",user:t}))),(0,s.Z)("div",{className:"media-body"},void 0,(0,s.Z)("a",{className:"item-title",href:e.url},void 0,e.username)," ",(0,s.Z)(dn,{likedOn:e.liked_on})))}return(0,s.Z)("li",{className:"media"},void 0,Pt||(Pt=(0,s.Z)("div",{className:"media-left"},void 0,(0,s.Z)("span",{className:"user-avatar"},void 0,(0,s.Z)(B.ZP,{size:"50"})))),(0,s.Z)("div",{className:"media-body"},void 0,(0,s.Z)("strong",{},void 0,e.username)," ",(0,s.Z)(dn,{likedOn:e.liked_on})))}function dn(e){return(0,s.Z)("span",{className:"text-muted",title:e.likedOn.format("LLL")},void 0,e.likedOn.fromNow())}function pn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,a=(0,p.Z)(e);if(t){var i=(0,p.Z)(this).constructor;n=Reflect.construct(a,arguments,i)}else n=a.apply(this,arguments);return(0,d.Z)(this,n)}}function hn(e){return function(e){return(!e.is_hidden||e.acl.can_see_hidden)&&(e.acl.can_reply||e.acl.can_edit||e.acl.can_see_likes&&(e.last_likes||[]).length||e.acl.can_like)}(e.post)?(0,s.Z)("div",{className:"post-footer"},void 0,m().createElement(vn,e),m().createElement(mn,e),m().createElement(fn,e),m().createElement(Zn,(0,f.Z)({lastLikes:e.post.last_likes,likes:e.post.likes},e)),m().createElement(gn,(0,f.Z)({likes:e.post.likes},e)),m().createElement(kn,e),m().createElement(Nn,e),m().createElement(xn,e)):null}var vn=function(e){(0,u.Z)(n,e);var t=pn(n);function n(){var e;(0,r.Z)(this,n);for(var a=arguments.length,i=new Array(a),o=0;o0;return this.props.post.acl.can_see_likes&&e?2===this.props.post.acl.can_see_likes?(0,s.Z)("button",{className:"btn btn-link btn-sm pull-left hidden-xs",onClick:this.onClick,type:"button"},void 0,bn(this.props.likes,this.props.lastLikes)):(0,s.Z)("p",{className:"pull-left hidden-xs"},void 0,bn(this.props.likes,this.props.lastLikes)):null}}]),n}(m().Component),gn=function(e){(0,u.Z)(n,e);var t=pn(n);function n(){return(0,r.Z)(this,n),t.apply(this,arguments)}return(0,l.Z)(n,[{key:"render",value:function(){var e=(this.props.post.last_likes||[]).length>0;return this.props.post.acl.can_see_likes&&e?2===this.props.post.acl.can_see_likes?(0,s.Z)("button",{className:"btn btn-link btn-sm likes-compact pull-left visible-xs-block",onClick:this.onClick,type:"button"},void 0,an||(an=(0,s.Z)("span",{className:"material-icon"},void 0,"favorite")),this.props.likes):(0,s.Z)("p",{className:"likes-compact pull-left visible-xs-block"},void 0,on||(on=(0,s.Z)("span",{className:"material-icon"},void 0,"favorite")),this.props.likes):null}}]),n}(Zn);function bn(e,t){var n=t.slice(0,3).map((function(e){return e.username}));if(1==n.length)return interpolate(pgettext("post likes","%(user)s likes this."),{user:n[0]},!0);var a=e-n.length,i=n.slice(0,-1).join(", "),o=n.slice(-1)[0],s=interpolate(pgettext("post likes","%(users)s and %(last_user)s"),{users:i,last_user:o},!0);if(0===a)return interpolate(pgettext("post likes","%(users)s like this."),{users:s},!0);var r=npgettext("post likes","%(users)s and %(likes)s other user like this.","%(users)s and %(likes)s other users like this.",a);return interpolate(r,{users:n.join(", "),likes:a},!0)}var yn,_n,kn=function(e){(0,u.Z)(n,e);var t=pn(n);function n(){var e;(0,r.Z)(this,n);for(var a=arguments.length,i=new Array(a),o=0;o%(user)s',{url:(0,Ze.Z)(e.edit.url.editor),user:(0,Ze.Z)(e.edit.editor_name)},!0):interpolate('%(user)s',{user:(0,Ze.Z)(e.edit.editor_name)},!0);var n=interpolate('%(relative)s',{absolute:(0,Ze.Z)(e.edit.edited_on.format("LLL")),relative:(0,Ze.Z)(e.edit.edited_on.fromNow())},!0),a=interpolate((0,Ze.Z)(pgettext("post history modal","By %(edited_by)s %(edited_on)s.")),{edited_by:t,edited_on:n},!0);return(0,s.Z)("p",{dangerouslySetInnerHTML:{__html:a}})}function qn(e){return Object.assign({},e,{edited_on:F()(e.edited_on)})}var Mn=function(e){(0,u.Z)(i,e);var t,n,a=(t=i,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,a=(0,p.Z)(t);if(n){var i=(0,p.Z)(this).constructor;e=Reflect.construct(a,arguments,i)}else e=a.apply(this,arguments);return(0,d.Z)(this,e)});function i(e){var t;return(0,r.Z)(this,i),t=a.call(this,e),(0,h.Z)((0,c.Z)(t),"goToEdit",(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;t.setState({isBusy:!0});var n=t.props.post.api.edits;null!==e&&(n+="?edit="+e),_.Z.get(n).then((function(e){t.setState({isReady:!0,isBusy:!1,edit:qn(e)})}),(function(e){t.setState({isReady:!0,isBusy:!1,error:e.detail})}))})),(0,h.Z)((0,c.Z)(t),"revertEdit",(function(e){if(!t.state.isBusy&&window.confirm(pgettext("post revert","Are you sure you with to revert this post to the state from before this edit?"))){t.setState({isBusy:!0});var n=t.props.post.api.edits+"?edit="+e;_.Z.post(n).then((function(e){var t=Ge.ZB(e);x.Z.dispatch(Ge.r$(e,t)),N.Z.success(pgettext("post revert","Post has been reverted to previous state.")),k.Z.hide()}),(function(e){N.Z.apiError(e),t.setState({isBusy:!1})}))}})),t.state={isReady:!1,isBusy:!0,canRevert:e.post.acl.can_edit,error:null,edit:null},t}return(0,l.Z)(i,[{key:"componentDidMount",value:function(){this.goToEdit()}},{key:"render",value:function(){return this.state.error?(0,s.Z)(Fn,{className:"modal-dialog modal-message"},void 0,(0,s.Z)(X.Z,{message:this.state.error})):this.state.isReady?(0,s.Z)(Fn,{},void 0,(0,s.Z)(Bn,{canRevert:this.state.canRevert,disabled:this.state.isBusy,edit:this.state.edit,goToEdit:this.goToEdit,revertEdit:this.revertEdit}),(0,s.Z)(Rn,{diff:this.state.edit.diff}),(0,s.Z)(Pn,{canRevert:this.state.canRevert,disabled:this.state.isBusy,edit:this.state.edit,revertEdit:this.revertEdit})):Tn||(Tn=(0,s.Z)(Fn,{},void 0,(0,s.Z)(J.Z,{})))}}]),i}(m().Component);function Fn(e){return(0,s.Z)("div",{className:e.className||"modal-dialog",role:"document"},void 0,(0,s.Z)("div",{className:"modal-content"},void 0,(0,s.Z)("div",{className:"modal-header"},void 0,(0,s.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,An||(An=(0,s.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,s.Z)("h4",{className:"modal-title"},void 0,pgettext("post history modal title","Post edits history"))),e.children))}var Hn,Vn,Yn,Gn,$n,Wn,Qn=n(57026),Kn=n(60471),Xn=n(55210);function Jn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,a=(0,p.Z)(e);if(t){var i=(0,p.Z)(this).constructor;n=Reflect.construct(a,arguments,i)}else n=a.apply(this,arguments);return(0,d.Z)(this,n)}}function ea(e){return m().createElement(va,(0,f.Z)({},e,{Form:ma}))}var ta,na,aa,ia,oa,sa,ra,la,ca,ua,da,pa,ha,va=function(e){(0,u.Z)(n,e);var t=Jn(n);function n(e){var a;return(0,r.Z)(this,n),(a=t.call(this,e)).state={isLoaded:!1,isError:!1,categories:[]},a}return(0,l.Z)(n,[{key:"componentDidMount",value:function(){var e=this;_.Z.get(misago.get("THREAD_EDITOR_API")).then((function(t){var n=t.map((function(e){return Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id,post:e.post})}));e.setState({isLoaded:!0,categories:n})}),(function(t){e.setState({isError:t.detail})}))}},{key:"render",value:function(){return this.state.isError?(0,s.Z)(Za,{message:this.state.isError}):this.state.isLoaded?m().createElement(ma,(0,f.Z)({},this.props,{categories:this.state.categories})):Hn||(Hn=(0,s.Z)(fa,{}))}}]),n}(m().Component),ma=function(e){(0,u.Z)(n,e);var t=Jn(n);function n(e){var a;return(0,r.Z)(this,n),a=t.call(this,e),(0,h.Z)((0,c.Z)(a),"onCategoryChange",(function(e){var t=e.target.value,n={category:t};a.acl[t].can_pin_threads
\n
\n )\n }\n}\n\nfunction ariaProps(isOpen) {\n return {\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isOpen ? \"true\" : \"false\",\n }\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownDivider({ className }) {\n return
  • \n}\n","import React from \"react\"\n\nexport default function DropdownFooter({ children, listItem }) {\n if (listItem) {\n return
  • {children}
  • \n }\n\n return
    {children}
    \n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownHeader({ className, children }) {\n return (\n
    {children}
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownMenuItem({ className, children }) {\n return (\n
  • {children}
  • \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownPills({ className, children }) {\n return (\n
    {children}
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownSubheader({ className, children }) {\n return (\n
  • {children}
  • \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRow = ({ children, className }) => (\n
    {children}
    \n)\n\nexport default FlexRow\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRowCol = ({ children, className, shrink }) => (\n \n {children}\n
    \n)\n\nexport default FlexRowCol\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRowSection = ({ auto, children, className }) => (\n \n {children}\n \n)\n\nexport default FlexRowSection\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function ListGroup({ className, children }) {\n return
      {children}
    \n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function ListGroupItem({ className, children }) {\n return (\n
  • {children}
  • \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupEmpty({ className, icon, message }) {\n return (\n \n {!!icon && (\n
    \n {icon}\n
    \n )}\n

    {message}

    \n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupError({ className, icon, message, detail }) {\n return (\n \n {!!icon && (\n
    \n {icon}\n
    \n )}\n

    {message}

    \n {!!detail &&

    {detail}

    }\n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupLoading({ className, message }) {\n return (\n \n

    {message}

    \n
    \n
    \n
    \n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupMessage({ className, icon, message, detail }) {\n return (\n \n {!!icon && (\n
    \n {icon}\n
    \n )}\n

    {message}

    \n {!!detail &&

    {detail}

    }\n
    \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { updateAuthenticatedUser } from \"../../reducers/auth\"\nimport { ApiFetch } from \"../Api\"\n\nfunction NotificationsFetch({\n children,\n filter,\n query,\n dispatch,\n unreadNotifications,\n disabled,\n}) {\n return (\n {\n if (data.unreadNotifications != unreadNotifications) {\n dispatch(\n updateAuthenticatedUser({\n unreadNotifications: data.unreadNotifications,\n })\n )\n }\n }}\n >\n {({ data, loading, error, refetch }) => {\n return children({ data, loading, error, refetch })\n }}\n \n )\n}\n\nfunction getApiUrl(filter, query) {\n let api = misago.get(\"NOTIFICATIONS_API\") + \"?limit=30\"\n api += \"&filter=\" + filter\n\n if (query) {\n if (query.after) {\n api += \"&after=\" + query.after\n }\n if (query.before) {\n api += \"&before=\" + query.before\n }\n }\n\n return api\n}\n\nfunction selectState({ auth }) {\n if (!auth.user) {\n return { unreadNotifications: null }\n }\n\n return {\n unreadNotifications: auth.user.unreadNotifications,\n }\n}\n\nconst NotificationsFetchConnected = connect(selectState)(NotificationsFetch)\n\nexport default NotificationsFetchConnected\n","import NotificationsFetch from \"./NotificationsFetch\"\n\nexport default NotificationsFetch\n","import React from \"react\"\nimport { ListGroupEmpty } from \"../ListGroup\"\n\nexport default function NotificationsListEmpty({ filter }) {\n return (\n \n )\n}\n\nfunction emptyMessage(filter) {\n if (filter === \"read\") {\n return pgettext(\n \"notifications list\",\n \"You don't have any read notifications.\"\n )\n } else if (filter === \"unread\") {\n return pgettext(\n \"notifications list\",\n \"You don't have any unread notifications.\"\n )\n }\n\n return pgettext(\"notifications list\", \"You don't have any notifications.\")\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { ListGroup } from \"../ListGroup\"\n\nexport default function NotificationsListGroup({ className, children }) {\n return (\n
    \n {children}\n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"../avatar\"\n\nexport default function NotificationsListItemActor({ notification }) {\n if (!!notification.actor) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NotificationsListItemMessage({ notification }) {\n return (\n \n )\n}\n","import React from \"react\"\n\nexport default function NotificationsListItemReadStatus({ notification }) {\n if (notification.isRead) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport Timestamp from \"../Timestamp\"\n\nexport default function NotificationsListItemTimestamp({ notification }) {\n return (\n
    \n \n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport NotificationsListItemActor from \"./NotificationsListItemActor\"\nimport NotificationsListItemMessage from \"./NotificationsListItemMessage\"\nimport NotificationsListItemReadStatus from \"./NotificationsListItemReadStatus\"\nimport NotificationsListItemTimestamp from \"./NotificationsListItemTimestamp\"\n\nexport default function NotificationsListItem({ notification }) {\n return (\n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n )\n}\n","import React from \"react\"\nimport NotificationsListEmpty from \"./NotificationsListEmpty\"\nimport NotificationsListGroup from \"./NotificationsListGroup\"\nimport NotificationsListItem from \"./NotificationsListItem\"\n\nexport default function NotificationsList({ filter, items }) {\n return (\n 0\n ? \"notifications-list-ready\"\n : \"notifications-list-pending\"\n }\n >\n {items.length === 0 && }\n {items.map((notification) => (\n \n ))}\n \n )\n}\n","import React from \"react\"\nimport { ListGroupError } from \"../ListGroup\"\nimport NotificationsListGroup from \"./NotificationsListGroup\"\n\nexport default function NotificationsListError({ error }) {\n const detail = errorDetail(error)\n\n return (\n \n \n \n )\n}\n\nfunction errorDetail(error) {\n if (error.status === 0) {\n return gettext(\n \"Check your internet connection and try refreshing the site.\"\n )\n }\n\n if (error.data && error.data.detail) {\n return error.data.detail\n }\n}\n","import React from \"react\"\nimport { ListGroupLoading } from \"../ListGroup\"\nimport NotificationsListGroup from \"./NotificationsListGroup\"\n\nexport default function NotificationsListLoading() {\n return (\n \n \n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\n\nconst BODY_CLASS = \"has-overlay\"\n\nclass Overlay extends React.Component {\n constructor(props) {\n super(props)\n\n this.scrollOrigin = null\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.open !== this.props.open) {\n if (this.props.open) {\n this.scrollOrigin = window.pageYOffset\n document.body.classList.add(BODY_CLASS)\n if (this.props.onOpen) {\n this.props.onOpen()\n }\n } else {\n document.body.classList.remove(BODY_CLASS)\n window.scrollTo(0, this.scrollOrigin)\n this.scrollOrigin = null\n }\n }\n }\n\n closeOnNavigation = (event) => {\n if (event.target.closest(\"a\")) {\n this.props.dispatch(close())\n }\n }\n\n render() {\n return (\n \n {this.props.children}\n \n )\n }\n}\n\nconst OverlayConnected = connect()(Overlay)\n\nexport default OverlayConnected\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\n\nexport function OverlayHeader({ children, dispatch }) {\n return (\n
    \n
    {children}
    \n dispatch(close())}\n >\n close\n \n
    \n )\n}\n\nconst OverlayHeaderConnected = connect()(OverlayHeader)\n\nexport default OverlayHeaderConnected\n","import React from \"react\"\n\nconst PageContainer = ({ children }) => (\n
    {children}
    \n)\n\nexport default PageContainer\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeader = ({ children, className, styleName }) => (\n \n
    \n
    \n
    \n {children}\n
    \n
    \n
    \n)\n\nexport default PageHeader\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderBanner = ({ children, className, styleName }) => (\n \n
    \n
    {children}
    \n
    \n \n)\n\nexport default PageHeaderBanner\n","import React from \"react\"\n\nconst PageHeaderContainer = ({ children }) => (\n
    {children}
    \n)\n\nexport default PageHeaderContainer\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderDetails = ({ children, className }) => (\n
    {children}
    \n)\n\nexport default PageHeaderDetails\n","import React from \"react\"\nimport PageHeader from \"./PageHeader\"\nimport PageHeaderBanner from \"./PageHeaderBanner\"\nimport PageHeaderContainer from \"./PageHeaderContainer\"\nimport PageHeaderDetails from \"./PageHeaderDetails\"\n\nconst PageHeaderPlain = ({ styleName, header, message }) => (\n \n \n \n

    {header}

    \n
    \n {message && (\n {message}\n )}\n
    \n
    \n)\n\nexport default PageHeaderPlain\n","import React from \"react\"\nimport zxcvbn from \"misago/services/zxcvbn\"\n\nexport const STYLES = [\n \"progress-bar-danger\",\n \"progress-bar-warning\",\n \"progress-bar-warning\",\n \"progress-bar-primary\",\n \"progress-bar-success\",\n]\n\nexport const LABELS = [\n pgettext(\"password strength indicator\", \"Entered password is very weak.\"),\n pgettext(\"password strength indicator\", \"Entered password is weak.\"),\n pgettext(\"password strength indicator\", \"Entered password is average.\"),\n pgettext(\"password strength indicator\", \"Entered password is strong.\"),\n pgettext(\"password strength indicator\", \"Entered password is very strong.\"),\n]\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this._score = 0\n this._password = null\n this._inputs = []\n\n this.state = {\n loaded: false,\n }\n }\n\n componentDidMount() {\n zxcvbn.load().then(() => {\n this.setState({ loaded: true })\n })\n }\n\n getScore(password, inputs) {\n let cacheStale = false\n\n if (password !== this._password) {\n cacheStale = true\n }\n\n if (inputs.length !== this._inputs.length) {\n cacheStale = true\n } else {\n inputs.map((value, i) => {\n if (value.trim() !== this._inputs[i]) {\n cacheStale = true\n }\n })\n }\n\n if (cacheStale) {\n this._score = zxcvbn.scorePassword(password, inputs)\n this._password = password\n this._inputs = inputs.map(function (value) {\n return value.trim()\n })\n }\n\n return this._score\n }\n\n render() {\n if (!this.state.loaded) return null\n\n let score = this.getScore(this.props.password, this.props.inputs)\n\n return (\n
    \n
    \n \n {LABELS[score]}\n
    \n
    \n

    {LABELS[score]}

    \n \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport PasswordStrength from \"misago/components/password-strength\"\nimport RegisterLegalFootnote from \"misago/components/RegisterLegalFootnote\"\nimport StartSocialAuth from \"misago/components/StartSocialAuth\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport auth from \"misago/services/auth\"\nimport captcha from \"misago/services/captcha\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\nimport * as validators from \"misago/utils/validators\"\n\nexport class RegisterForm extends Form {\n constructor(props) {\n super(props)\n\n const { username, password } = this.props.criteria\n\n let passwordMinLength = 0\n password.forEach((item) => {\n if (item.name === \"MinimumLengthValidator\") {\n passwordMinLength = item.min_length\n }\n })\n\n const formValidators = {\n username: [\n validators.usernameContent(),\n validators.usernameMinLength(username.min_length),\n validators.usernameMaxLength(username.max_length),\n ],\n email: [validators.email()],\n password: [validators.passwordMinLength(passwordMinLength)],\n captcha: captcha.validator(),\n }\n\n if (!!misago.get(\"TERMS_OF_SERVICE_ID\")) {\n formValidators.termsOfService = [validators.requiredTermsOfService()]\n }\n\n if (!!misago.get(\"PRIVACY_POLICY_ID\")) {\n formValidators.privacyPolicy = [validators.requiredPrivacyPolicy()]\n }\n\n this.state = {\n isLoading: false,\n\n username: \"\",\n email: \"\",\n password: \"\",\n captcha: \"\",\n\n termsOfService: null,\n privacyPolicy: null,\n\n validators: formValidators,\n errors: {},\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"USERS_API\"), {\n username: this.state.username,\n email: this.state.email,\n password: this.state.password,\n captcha: this.state.captcha,\n terms_of_service: this.state.termsOfService,\n privacy_policy: this.state.privacyPolicy,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n\n if (rejection.__all__ && rejection.__all__.length > 0) {\n snackbar.error(rejection.__all__[0])\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n }\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n modal.hide()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n handlePrivacyPolicyChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"privacyPolicy\", value)\n }\n\n handleTermsOfServiceChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"termsOfService\", value)\n }\n\n handleToggleAgreement = (agreement, value) => {\n this.setState((prevState, props) => {\n if (prevState[agreement] === null) {\n const errors = { ...prevState.errors, [agreement]: null }\n return { errors, [agreement]: value }\n }\n\n const validator = this.state.validators[agreement][0]\n const errors = { ...prevState.errors, [agreement]: [validator(null)] }\n return { errors, [agreement]: null }\n })\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"register modal title\", \"Register\")}\n

    \n
    \n
    \n \n \n
    \n \n\n \n \n \n\n \n \n \n\n \n }\n >\n \n \n\n {captcha.component({\n form: this,\n })}\n\n \n
    \n
    \n \n {pgettext(\"register modal btn\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport class RegisterComplete extends React.Component {\n getLead() {\n if (this.props.activation === \"user\") {\n return pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\"\n )\n } else if (this.props.activation === \"admin\") {\n return pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but the site administrator will have to activate it before you will be able to sign in.\"\n )\n }\n }\n\n getSubscript() {\n if (this.props.activation === \"user\") {\n return pgettext(\n \"account activation required\",\n \"We have sent an e-mail to %(email)s with link that you have to click to activate your account.\"\n )\n } else if (this.props.activation === \"admin\") {\n return pgettext(\n \"account activation required\",\n \"We will send an e-mail to %(email)s when this takes place.\"\n )\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"register modal title\", \"Registration complete\")}\n

    \n
    \n
    \n
    \n info_outline\n
    \n
    \n

    \n {interpolate(\n this.getLead(),\n { username: this.props.username },\n true\n )}\n

    \n

    \n {interpolate(\n this.getSubscript(),\n { email: this.props.email },\n true\n )}\n

    \n \n {pgettext(\"register modal dismiss\", \"Ok\")}\n \n
    \n
    \n
    \n \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n completeRegistration = (apiResponse) => {\n if (apiResponse.activation === \"active\") {\n modal.hide()\n auth.signIn(apiResponse)\n } else {\n this.setState({\n complete: apiResponse,\n })\n }\n }\n\n render() {\n if (this.state.complete) {\n return (\n \n )\n }\n\n return \n }\n}\n","import RegisterButton from \"./RegisterButton\"\n\nexport default RegisterButton\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ajax from \"../../services/ajax\"\nimport captcha from \"../../services/captcha\"\nimport modal from \"../../services/modal\"\nimport snackbar from \"../../services/snackbar\"\nimport Loader from \"../loader\"\nimport RegisterForm from \"../register.js\"\n\nexport default class RegisterButton extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n isLoaded: false,\n\n criteria: null,\n }\n }\n\n showRegisterForm = () => {\n if (this.props.onClick) {\n this.props.onClick()\n }\n\n if (misago.get(\"SETTINGS\").account_activation === \"closed\") {\n snackbar.info(\n pgettext(\n \"register form\",\n \"Registration form is currently disabled by the site administrator.\"\n )\n )\n } else if (this.state.isLoaded) {\n modal.show()\n } else {\n this.setState({ isLoading: true })\n\n Promise.all([\n captcha.load(),\n ajax.get(misago.get(\"AUTH_CRITERIA_API\")),\n ]).then(\n (result) => {\n this.setState({\n isLoading: false,\n isLoaded: true,\n criteria: result[1],\n })\n\n modal.show()\n },\n () => {\n this.setState({ isLoading: false })\n\n snackbar.error(\n pgettext(\n \"register form\",\n \"Registration form is currently unavailable due to an error.\"\n )\n )\n }\n )\n }\n }\n\n render() {\n return (\n \n {pgettext(\"cta\", \"Register\")}\n {this.state.isLoading ? : null}\n \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst AGREEMENT_URL = '%(agreement)s'\n\nconst RegisterLegalFootnote = (props) => {\n const {\n errors,\n privacyPolicy,\n termsOfService,\n onPrivacyPolicyChange,\n onTermsOfServiceChange,\n } = props\n\n const termsOfServiceId = misago.get(\"TERMS_OF_SERVICE_ID\")\n const termsOfServiceUrl = misago.get(\"TERMS_OF_SERVICE_URL\")\n\n const privacyPolicyId = misago.get(\"PRIVACY_POLICY_ID\")\n const privacyPolicyUrl = misago.get(\"PRIVACY_POLICY_URL\")\n\n if (!termsOfServiceId && !privacyPolicyId) return null\n\n return (\n
    \n \n \n
    \n )\n}\n\nconst LegalAgreement = (props) => {\n const { agreement, checked, errors, url, value, onChange } = props\n\n if (!url) return null\n\n const agreementHtml = interpolate(\n AGREEMENT_URL,\n { agreement: escapeHtml(agreement), url: escapeHtml(url) },\n true\n )\n const label = interpolate(\n pgettext(\n \"register form agreement prompt\",\n \"I have read and accept %(agreement)s.\"\n ),\n { agreement: agreementHtml },\n true\n )\n\n return (\n
    \n \n {errors &&\n errors.map((error, i) => (\n
    \n {error}\n
    \n ))}\n
    \n )\n}\n\nexport default RegisterLegalFootnote\n","import React from \"react\"\nimport { ListGroup } from \"../ListGroup\"\n\nexport default function SearchResultsList({ children }) {\n return {children}\n}\n","import React from \"react\"\nimport { ListGroupMessage } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchMessage() {\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport Timestamp from \"../Timestamp\"\n\nexport default function SearchResultPost({ post }) {\n return (\n \n \n
    \n
    {post.thread.title}
    \n \n
      \n
    • \n {post.category.name}\n
    • \n
    • {post.poster ? post.poster.username : post.poster_name}
    • \n
    • \n \n
    • \n
    \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"../avatar\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport Timestamp from \"../Timestamp\"\n\nexport default function SearchResultUser({ user }) {\n const title = user.title || user.rank.title\n\n return (\n \n \n \n
    \n
    {user.username}
    \n
      \n {!!title && (\n
    • \n {title}\n
    • \n )}\n
    • {user.rank.name}
    • \n
    • \n \n
    • \n
    \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\nimport SearchResultPost from \"./SearchResultPost\"\nimport SearchResultUser from \"./SearchResultUser\"\n\nexport default function SearchResults({ query, results }) {\n const threads = results[0]\n const users = results[1]\n\n const { count } = threads.results\n\n return (\n \n {users.results.results.map((user) => (\n \n ))}\n {threads.results.results.map((post) => (\n \n ))}\n {count > 0 && (\n \n \n {npgettext(\n \"search results list\",\n \"See all %(count)s result.\",\n \"See all %(count)s results.\",\n threads.results.count\n ).replace(\"%(count)s\", threads.results.count)}\n \n \n )}\n \n )\n}\n","import React from \"react\"\nimport { ListGroupEmpty } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchResultsEmpty() {\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport { ListGroupError } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchResultsError({ error }) {\n return (\n \n \n \n )\n}\n\nfunction errorDetail(error) {\n if (error.status === 0) {\n return gettext(\n \"Check your internet connection and try refreshing the site.\"\n )\n }\n\n if (error.data && error.data.detail) {\n return error.data.detail\n }\n}\n","import React from \"react\"\nimport { ListGroupLoading } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchResultsLoading() {\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport { ApiFetch } from \"../Api\"\nimport SearchMessage from \"./SearchMessage\"\nimport SearchResults from \"./SearchResults\"\nimport SearchResultsEmpty from \"./SearchResultsEmpty\"\nimport SearchResultsError from \"./SearchResultsError\"\nimport SearchResultsLoading from \"./SearchResultsLoading\"\n\nconst DEBOUNCE = 750\nconst CACHE = {}\n\nexport default class SearchFetch extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n query: this.props.query.trim(),\n }\n\n this.debounce = null\n }\n\n componentDidUpdate() {\n const query = this.props.query.trim()\n\n if (this.state.query != query) {\n if (this.debounce) {\n window.clearTimeout(this.debounce)\n }\n\n this.debounce = window.setTimeout(() => {\n this.setState({ query })\n }, DEBOUNCE)\n }\n }\n\n componentWillUnmount() {\n if (this.debounce) {\n window.clearTimeout(this.debounce)\n }\n }\n\n render() {\n return (\n \n {({ data, loading, error }) => {\n if (this.state.query.length < 3) {\n return \n }\n\n if (loading) {\n return \n }\n\n if (error) {\n return \n }\n\n if (isResultEmpty(data)) {\n return \n }\n\n if (data !== null) {\n return \n }\n\n return null\n }}\n \n )\n }\n}\n\nfunction getSearchUrl(query) {\n return misago.get(\"SEARCH_API\") + \"?q=\" + encodeURIComponent(query)\n}\n\nfunction isResultEmpty(results) {\n if (results === null) {\n return true\n }\n\n let resultsCount = 0\n results.forEach((result) => {\n resultsCount += result.results.count\n })\n return resultsCount === 0\n}\n","import React from \"react\"\n\nexport default function SearchInput({ query, setQuery }) {\n return (\n
    \n setQuery(event.target.value)}\n />\n
    \n )\n}\n","import React from \"react\"\n\nexport default class SearchQuery extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n query: \"\",\n }\n }\n\n setQuery = (query) => {\n this.setState({ query })\n }\n\n render() {\n return this.props.children({\n query: this.state.query,\n setQuery: this.setQuery,\n })\n }\n}\n","import React from \"react\"\nimport SearchFetch from \"./SearchFetch\"\nimport SearchInput from \"./SearchInput\"\nimport SearchQuery from \"./SearchQuery\"\n\nexport default function SearchDropdown() {\n return (\n \n {({ query, setQuery }) => {\n return (\n
    \n \n \n
    \n )\n }}\n
    \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\nimport SearchFetch from \"./SearchFetch\"\nimport SearchInput from \"./SearchInput\"\nimport SearchQuery from \"./SearchQuery\"\n\nfunction SearchOverlay({ open }) {\n return (\n {\n window.setTimeout(() => {\n document.querySelector(\"#search-mount .form-control-search\").focus()\n }, 0)\n }}\n >\n {pgettext(\"cta\", \"Search\")}\n \n {({ query, setQuery }) => {\n return (\n
    \n \n
    \n \n
    \n
    \n )\n }}\n
    \n \n )\n}\n\nfunction select(state) {\n return { open: state.overlay.search }\n}\n\nconst SearchOverlayConnected = connect(select)(SearchOverlay)\n\nexport default SearchOverlayConnected\n","import SignInButton from \"./SignInButton\"\n\nexport default SignInButton\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport modal from \"../../services/modal\"\nimport SignInModal from \"../sign-in\"\n\nexport default function SignInButton({ block, className, onClick }) {\n const settings = misago.get(\"SETTINGS\")\n\n if (settings.DELEGATE_AUTH) {\n return (\n {\n if (onClick) {\n onClick()\n }\n }}\n >\n {pgettext(\"cta\", \"Sign in\")}\n \n )\n }\n\n return (\n {\n event.preventDefault()\n\n if (onClick) {\n onClick()\n }\n\n modal.show()\n }}\n >\n {pgettext(\"cta\", \"Sign in\")}\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport {\n DropdownDivider,\n DropdownHeader,\n DropdownMenuItem,\n DropdownPills,\n DropdownSubheader,\n} from \"../Dropdown\"\nimport RegisterButton from \"../RegisterButton\"\nimport SignInButton from \"../SignInButton\"\n\nfunction SiteNavMenu({ isAnonymous, close, dropdown, overlay }) {\n const baseUrl = misago.get(\"MISAGO_PATH\")\n const settings = misago.get(\"SETTINGS\")\n const mainItems = misago.get(\"main_menu\")\n const extraItems = misago.get(\"extraMenuItems\")\n const extraFooterItems = misago.get(\"extraFooterItems\")\n const categories = misago.get(\"categories_menu\")\n const users = misago.get(\"usersLists\")\n const authDelegated = settings.enable_oauth2_client\n\n const topNav = []\n mainItems.forEach((item) => {\n topNav.push({ title: item.label, url: item.url })\n })\n\n topNav.push({\n title: pgettext(\"site nav\", \"Search\"),\n url: baseUrl + \"search/\",\n })\n\n const footerNav = []\n\n const tosTitle = misago.get(\"TERMS_OF_SERVICE_TITLE\")\n const tosUrl = misago.get(\"TERMS_OF_SERVICE_URL\")\n if (tosTitle && tosUrl) {\n footerNav.push({\n title: tosTitle,\n url: tosUrl,\n })\n }\n\n const privacyTitle = misago.get(\"PRIVACY_POLICY_TITLE\")\n const privacyUrl = misago.get(\"PRIVACY_POLICY_URL\")\n if (privacyTitle && privacyUrl) {\n footerNav.push({\n title: privacyTitle,\n url: privacyUrl,\n })\n }\n\n return (\n \n {isAnonymous && (\n \n {pgettext(\"cta\", \"You are not signed in\")}\n \n )}\n {isAnonymous && (\n \n \n {!authDelegated && }\n \n )}\n {settings.forum_name}\n {topNav.map((item) => (\n \n {item.title}\n \n ))}\n {extraItems.map((item, index) => (\n \n \n {item.title}\n \n \n ))}\n {!!users.length && }\n {!!users.length && (\n \n {pgettext(\"site nav section\", \"Users\")}\n \n )}\n {users.map((item) => (\n \n {item.name}\n \n ))}\n \n \n {pgettext(\"site nav section\", \"Categories\")}\n \n {categories.map((category) =>\n category.is_vanilla ? (\n \n {category.name}\n \n ) : (\n \n \n {category.name}\n \n {category.short_name || category.name}\n \n \n \n )\n )}\n {(!!footerNav.length || !!extraFooterItems.length) && (\n \n )}\n {(!!footerNav.length || !!extraFooterItems.length) && (\n \n {pgettext(\"site nav section\", \"Footer\")}\n \n )}\n {extraFooterItems.map((item, index) => (\n \n \n {item.title}\n \n \n ))}\n {footerNav.map((item) => (\n \n {item.title}\n \n ))}\n \n )\n}\n\nfunction select(state) {\n return {\n isAnonymous: !state.auth.user.id,\n }\n}\n\nconst SiteNavMenuConnected = connect(select)(SiteNavMenu)\n\nexport default SiteNavMenuConnected\n","import React from \"react\"\nimport SiteNavMenu from \"./SiteNavMenu\"\n\nexport default function SiteNavDropdown({ close }) {\n return \n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\nimport SiteNavMenu from \"./SiteNavMenu\"\n\nexport function SiteNavOverlay({ dispatch, isOpen }) {\n return (\n \n {pgettext(\"site nav title\", \"Menu\")}\n dispatch(close())} overlay />\n \n )\n}\n\nfunction select(state) {\n return {\n isOpen: state.overlay.siteNav,\n }\n}\n\nconst SiteNavOverlayConnected = connect(select)(SiteNavOverlay)\n\nexport default SiteNavOverlayConnected\n","import React from \"react\"\nimport misago from \"misago\"\n\nconst StartSocialAuth = (props) => {\n const { buttonClassName, buttonLabel, formLabel, header, labelClassName } =\n props\n const socialAuth = misago.get(\"SOCIAL_AUTH\")\n\n if (socialAuth.length === 0) return null\n\n return (\n
    \n \n
    \n {socialAuth.map(({ pk, name, button_text, button_color, url }) => {\n const className = \"btn btn-block btn-default btn-social-\" + pk\n const style = button_color ? { color: button_color } : null\n const finalButtonLabel =\n button_text || interpolate(buttonLabel, { site: name }, true)\n\n return (\n \n )\n })}\n
    \n
    \n \n
    \n )\n}\n\nconst FormHeader = ({ className, text }) => {\n if (!text) return null\n return
    {text}
    \n}\n\nexport default StartSocialAuth\n","import React from \"react\"\nimport {\n dateRelative,\n dateRelativeShort,\n fullDateTime,\n} from \"../../formats\"\n\nclass Timestamp extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = { tick: 0 }\n this.date = new Date(props.datetime)\n this.timeout = null\n }\n\n componentDidMount() {\n this.scheduleNextUpdate()\n }\n\n componentWillUnmount() {\n if (this.timeout) {\n window.clearTimeout(this.timeout)\n }\n }\n\n scheduleNextUpdate = () => {\n const now = new Date()\n const diff = Math.ceil(Math.abs(Math.round((this.date - now) / 1000)))\n\n if (diff < 3600) {\n this.timeout = window.setTimeout(\n () => {\n this.setState(tick)\n this.scheduleNextUpdate()\n },\n 50 * 1000 // Update every 50 seconds\n )\n } else if (diff < 3600 * 24) {\n this.timeout = window.setTimeout(\n () => {\n this.setState(tick)\n },\n 40 * 60 * 1000 // Update every 40 minutes\n )\n }\n }\n\n render() {\n const displayed = this.props.narrow\n ? dateRelativeShort(this.date)\n : dateRelative(this.date)\n\n return (\n \n {displayed}\n \n )\n }\n}\n\nfunction tick(state) {\n return { tick: state.tick + 1 }\n}\n\nexport default Timestamp\n","import Timestamp from \"./Timestamp\"\n\nexport default Timestamp\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst Toolbar = ({ children, className }) => (\n \n)\n\nexport default Toolbar\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarItem = ({ children, className, shrink }) => (\n \n {children}\n \n)\n\nexport default ToolbarItem\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarSection = ({ auto, children, className }) => (\n \n {children}\n \n)\n\nexport default ToolbarSection\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarSpacer = ({ className }) => (\n
    \n)\n\nexport default ToolbarSpacer\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport Loader from \"misago/components/loader\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n callApi(avatarType) {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: avatarType,\n })\n .then(\n (response) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.success(response.detail)\n this.props.onComplete(response)\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n setGravatar = () => {\n this.callApi(\"gravatar\")\n }\n\n setGenerated = () => {\n this.callApi(\"generated\")\n }\n\n getGravatarButton() {\n if (this.props.options.gravatar) {\n return (\n \n {pgettext(\"avatar modal btn\", \"Download my Gravatar\")}\n \n )\n } else {\n return null\n }\n }\n\n getCropButton() {\n if (!this.props.options.crop_src) return null\n\n return (\n \n {pgettext(\"avatar modal btn\", \"Re-crop uploaded image\")}\n \n )\n }\n\n getUploadButton() {\n if (!this.props.options.upload) return null\n\n return (\n \n {pgettext(\"avatar modal btn\", \"Upload new image\")}\n \n )\n }\n\n getGalleryButton() {\n if (!this.props.options.galleries) return null\n\n return (\n \n {pgettext(\"avatar modal btn\", \"Pick avatar from gallery\")}\n \n )\n }\n\n getAvatarPreview() {\n let userPeview = {\n id: this.props.user.id,\n avatars: this.props.options.avatars,\n }\n\n if (this.state.isLoading) {\n return (\n
    \n \n \n
    \n )\n }\n\n return (\n
    \n \n
    \n )\n }\n\n render() {\n return (\n
    \n
    \n
    {this.getAvatarPreview()}
    \n
    \n {this.getGravatarButton()}\n\n \n {pgettext(\"avatar modal btn\", \"Generate my individual avatar\")}\n \n\n {this.getCropButton()}\n {this.getUploadButton()}\n {this.getGalleryButton()}\n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n deviceRatio: 1,\n }\n }\n\n getAvatarSize() {\n if (this.props.upload) {\n return this.props.options.crop_tmp.size\n } else {\n return this.props.options.crop_src.size\n }\n }\n\n getImagePath() {\n if (this.props.upload) {\n return this.props.dataUrl\n } else {\n return this.props.options.crop_src.url\n }\n }\n\n componentDidMount() {\n let cropit = $(\".crop-form\")\n let cropperWidth = this.getAvatarSize()\n\n const initialWidth = cropit.width()\n while (initialWidth < cropperWidth) {\n cropperWidth = cropperWidth / 2\n }\n\n const deviceRatio = this.getAvatarSize() / cropperWidth\n\n cropit.width(cropperWidth)\n\n cropit.cropit({\n width: cropperWidth,\n height: cropperWidth,\n exportZoom: deviceRatio,\n imageState: {\n src: this.getImagePath(),\n },\n onImageLoaded: () => {\n if (this.props.upload) {\n // center uploaded image\n let zoomLevel = cropit.cropit(\"zoom\")\n let imageSize = cropit.cropit(\"imageSize\")\n\n // is it wider than taller?\n if (imageSize.width > imageSize.height) {\n let displayedWidth = imageSize.width * zoomLevel\n let offsetX = (displayedWidth - this.getAvatarSize()) / -2\n\n cropit.cropit(\"offset\", {\n x: offsetX,\n y: 0,\n })\n } else if (imageSize.width < imageSize.height) {\n let displayedHeight = imageSize.height * zoomLevel\n let offsetY = (displayedHeight - this.getAvatarSize()) / -2\n\n cropit.cropit(\"offset\", {\n x: 0,\n y: offsetY,\n })\n } else {\n cropit.cropit(\"offset\", {\n x: 0,\n y: 0,\n })\n }\n } else {\n // use preserved crop\n let crop = this.props.options.crop_src.crop\n\n if (crop) {\n cropit.cropit(\"zoom\", crop.zoom)\n cropit.cropit(\"offset\", {\n x: crop.x,\n y: crop.y,\n })\n }\n }\n },\n })\n }\n\n componentWillUnmount() {\n $(\".crop-form\").cropit(\"disable\")\n }\n\n cropAvatar = () => {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n let avatarType = this.props.upload ? \"crop_tmp\" : \"crop_src\"\n let cropit = $(\".crop-form\")\n\n const deviceRatio = cropit.cropit(\"exportZoom\")\n const cropitOffset = cropit.cropit(\"offset\")\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: avatarType,\n crop: {\n offset: {\n x: cropitOffset.x * deviceRatio,\n y: cropitOffset.y * deviceRatio,\n },\n zoom: cropit.cropit(\"zoom\") * deviceRatio,\n },\n })\n .then(\n (data) => {\n this.props.onComplete(data)\n snackbar.success(data.detail)\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n {this.props.upload\n ? pgettext(\"avatar crop modal btn\", \"Set avatar\")\n : pgettext(\"avatar crop modal btn\", \"Crop image\")}\n \n\n \n {pgettext(\"avatar crop modal btn\", \"Cancel\")}\n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport AvatarCrop from \"misago/components/change-avatar/crop\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport fileSize from \"misago/utils/file-size\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n image: null,\n preview: null,\n progress: 0,\n uploaded: null,\n dataUrl: null,\n }\n }\n\n validateFile(image) {\n if (image.size > this.props.options.upload.limit) {\n return interpolate(\n pgettext(\n \"avatar upload modal\",\n \"Selected file is too big. (%(filesize)s)\"\n ),\n {\n filesize: fileSize(image.size),\n },\n true\n )\n }\n\n let invalidTypeMsg = pgettext(\n \"avatar upload modal\",\n \"Selected file type is not supported.\"\n )\n if (\n this.props.options.upload.allowed_mime_types.indexOf(image.type) === -1\n ) {\n return invalidTypeMsg\n }\n\n let extensionFound = false\n let loweredFilename = image.name.toLowerCase()\n this.props.options.upload.allowed_extensions.map(function (extension) {\n if (loweredFilename.substr(extension.length * -1) === extension) {\n extensionFound = true\n }\n })\n\n if (!extensionFound) {\n return invalidTypeMsg\n }\n\n return false\n }\n\n pickFile = () => {\n document.getElementById(\"avatar-hidden-upload\").click()\n }\n\n uploadFile = () => {\n let image = document.getElementById(\"avatar-hidden-upload\").files[0]\n if (!image) return\n\n let validationError = this.validateFile(image)\n if (validationError) {\n snackbar.error(validationError)\n return\n }\n\n this.setState({\n image,\n preview: URL.createObjectURL(image),\n progress: 0,\n })\n\n let data = new FormData()\n data.append(\"avatar\", \"upload\")\n data.append(\"image\", image)\n\n ajax\n .upload(this.props.user.api.avatar, data, (progress) => {\n this.setState({\n progress,\n })\n })\n .then(\n (data) => {\n this.setState({\n options: data,\n uploaded: data.detail,\n })\n\n snackbar.info(\n pgettext(\n \"avatar upload modal\",\n \"Your image has been uploaded and you may now crop it.\"\n )\n )\n },\n (rejection) => {\n if (rejection.status === 400 || rejection.status === 413) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n image: null,\n progress: 0,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n getUploadRequirements(options) {\n let extensions = options.allowed_extensions.map(function (extension) {\n return extension.substr(1)\n })\n\n return interpolate(\n pgettext(\"avatar upload modal\", \"%(files)s files smaller than %(limit)s\"),\n {\n files: extensions.join(\", \"),\n limit: fileSize(options.limit),\n },\n true\n )\n }\n\n getUploadButton() {\n return (\n
    \n \n

    \n {this.getUploadRequirements(this.props.options.upload)}\n

    \n
    \n )\n }\n\n getUploadProgressLabel() {\n return interpolate(\n pgettext(\"avatar upload modal field\", \"%(progress)s % complete\"),\n {\n progress: this.state.progress,\n },\n true\n )\n }\n\n getUploadProgress() {\n return (\n
    \n
    \n \n\n
    \n \n {this.getUploadProgressLabel()}\n
    \n
    \n
    \n
    \n )\n }\n\n renderUpload() {\n return (\n
    \n \n {this.state.image ? this.getUploadProgress() : this.getUploadButton()}\n
    \n
    \n \n {pgettext(\"avatar upload modal btn\", \"Cancel\")}\n \n
    \n
    \n
    \n )\n }\n\n renderCrop() {\n return (\n \n )\n }\n\n render() {\n if (this.state.uploaded) return this.renderCrop()\n\n return this.renderUpload()\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport batch from \"misago/utils/batch\"\n\nexport class GalleryItem extends React.Component {\n select = () => {\n this.props.select(this.props.id)\n }\n\n getClassName() {\n if (this.props.selection === this.props.id) {\n if (this.props.disabled) {\n return \"btn btn-avatar btn-disabled avatar-selected\"\n } else {\n return \"btn btn-avatar avatar-selected\"\n }\n } else if (this.props.disabled) {\n return \"btn btn-avatar btn-disabled\"\n } else {\n return \"btn btn-avatar\"\n }\n }\n\n render() {\n return (\n \n \n \n )\n }\n}\n\nexport class Gallery extends React.Component {\n render() {\n return (\n
    \n

    {this.props.name}

    \n\n
    \n {batch(this.props.images, 4, null).map((row, i) => {\n return (\n
    \n {row.map((item, i) => {\n return (\n
    \n {item ? (\n \n ) : (\n
    \n )}\n
    \n )\n })}\n
    \n )\n })}\n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n selection: null,\n isLoading: false,\n }\n }\n\n select = (image) => {\n this.setState({\n selection: image,\n })\n }\n\n save = () => {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: \"galleries\",\n image: this.state.selection,\n })\n .then(\n (response) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.success(response.detail)\n this.props.onComplete(response)\n this.props.showIndex()\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n {this.props.options.galleries.map((item, i) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n \n {this.state.selection\n ? pgettext(\"avatar gallery modal btn\", \"Save choice\")\n : pgettext(\"avatar gallery modal btn\", \"Select avatar\")}\n \n\n \n {pgettext(\"avatar gallery modal btn\", \"Cancel\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport AvatarIndex from \"misago/components/change-avatar/index\"\nimport AvatarCrop from \"misago/components/change-avatar/crop\"\nimport AvatarUpload from \"misago/components/change-avatar/upload\"\nimport AvatarGallery from \"misago/components/change-avatar/gallery\"\nimport Loader from \"misago/components/modal-loader\"\nimport { updateAvatar } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport store from \"misago/services/store\"\n\nexport class ChangeAvatarError extends React.Component {\n getErrorReason() {\n if (this.props.reason) {\n return

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n

    \n
    \n remove_circle_outline\n
    \n
    \n

    {this.props.message}

    \n {this.getErrorReason()}\n \n {pgettext(\"avatar modal dismiss\", \"Ok\")}\n \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n componentDidMount() {\n ajax.get(this.props.user.api.avatar).then(\n (options) => {\n this.setState({\n component: AvatarIndex,\n options: options,\n error: null,\n })\n },\n (rejection) => {\n this.showError(rejection)\n }\n )\n }\n\n showError = (error) => {\n this.setState({\n error,\n })\n }\n\n showIndex = () => {\n this.setState({\n component: AvatarIndex,\n })\n }\n\n showUpload = () => {\n this.setState({\n component: AvatarUpload,\n })\n }\n\n showCrop = () => {\n this.setState({\n component: AvatarCrop,\n })\n }\n\n showGallery = () => {\n this.setState({\n component: AvatarGallery,\n })\n }\n\n completeFlow = (options) => {\n store.dispatch(updateAvatar(this.props.user, options.avatars))\n\n this.setState({\n component: AvatarIndex,\n options,\n })\n }\n\n getBody() {\n if (this.state) {\n if (this.state.error) {\n return (\n \n )\n } else {\n return (\n \n )\n }\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state && this.state.error) {\n return \"modal-dialog modal-message modal-change-avatar\"\n } else {\n return \"modal-dialog modal-change-avatar\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"avatar modal title\", \"Change your avatar\")}\n

    \n
    \n\n {this.getBody()}\n
    \n
    \n )\n }\n}\n\nexport function select(state) {\n return {\n user: state.auth.user,\n }\n}\n","export default function logout() {\n document.getElementById(\"hidden-logout-form\").submit()\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport modal from \"../../services/modal\"\nimport ChangeAvatarModal, {\n select as selectAvatar,\n} from \"../change-avatar/root\"\nimport {\n DropdownDivider,\n DropdownFooter,\n DropdownMenuItem,\n DropdownSubheader,\n} from \"../Dropdown\"\nimport logout from \"./logout\"\n\nclass UserNavMenu extends React.Component {\n constructor(props) {\n super(props)\n\n if (props.dropdown) {\n // Collapse options on dropdown\n this.state = {\n options: props.options.slice(0, 2),\n optionsMore: props.options.length > 2,\n }\n } else {\n // Reveal all options on mobile overlay\n this.state = {\n options: props.options,\n optionsMore: false,\n }\n }\n }\n\n changeAvatar = () => {\n this.props.close()\n modal.show(connect(selectAvatar)(ChangeAvatarModal))\n }\n\n revealOptions = () => {\n this.setState({\n options: this.props.options,\n optionsMore: false,\n })\n }\n\n render() {\n const { user, close, dropdown, overlay } = this.props\n\n if (!user) {\n return null\n }\n\n const adminUrl = misago.get(\"ADMIN_URL\")\n\n return (\n \n
  • \n \n {user.username}\n {pgettext(\"user nav\", \"Go to your profile\")}\n \n
  • \n \n \n \n \n {user.unreadNotifications\n ? \"notifications_active\"\n : \"notifications_none\"}\n \n {pgettext(\"user nav\", \"Notifications\")}\n {!!user.unreadNotifications && (\n {user.unreadNotifications}\n )}\n \n \n {!!user.showPrivateThreads && (\n \n \n inbox\n {pgettext(\"user nav\", \"Private threads\")}\n {!!user.unreadPrivateThreads && (\n {user.unreadPrivateThreads}\n )}\n \n \n )}\n {!!adminUrl && (\n \n \n security\n {pgettext(\"user nav\", \"Admin control panel\")}\n \n \n )}\n \n \n {pgettext(\"user nav section\", \"Account settings\")}\n \n \n \n portrait\n {pgettext(\"user nav\", \"Change avatar\")}\n \n \n {this.state.options.map((item) => (\n \n \n {item.icon}\n {item.name}\n \n \n ))}\n \n \n more_vertical\n {pgettext(\"user nav\", \"See more\")}\n \n \n {!!dropdown && (\n \n {\n logout()\n close()\n }}\n type=\"button\"\n >\n {pgettext(\"user nav\", \"Log out\")}\n \n \n )}\n \n )\n }\n}\n\nfunction select(state) {\n const user = state.auth.user\n if (!user.id) {\n return { user: null }\n }\n\n return {\n user: {\n username: user.username,\n unreadNotifications: user.unreadNotifications,\n unreadPrivateThreads: user.unread_private_threads,\n showPrivateThreads: user.acl.can_use_private_threads,\n url: user.url,\n },\n options: [...misago.get(\"userOptions\")],\n }\n}\n\nconst UserNavMenuConnected = connect(select)(UserNavMenu)\n\nexport default UserNavMenuConnected\n","import React from \"react\"\nimport UserNavMenu from \"./UserNavMenu\"\n\nexport default function UserNavDropdown({ close }) {\n return \n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\nimport { DropdownFooter } from \"../Dropdown\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\nimport UserNavMenu from \"./UserNavMenu\"\nimport logout from \"./logout\"\n\nexport function UserNavOverlay({ dispatch, isOpen }) {\n return (\n \n \n {pgettext(\"user nav title\", \"Your options\")}\n \n dispatch(close())} overlay />\n \n {\n logout()\n dispatch(close())\n }}\n type=\"button\"\n >\n {pgettext(\"user nav\", \"Log out\")}\n \n \n \n )\n}\n\nfunction select(state) {\n return {\n isOpen: state.overlay.userNav,\n }\n}\n\nconst UserNavOverlayConnected = connect(select)(UserNavOverlay)\n\nexport default UserNavOverlayConnected\n","import React from \"react\"\nimport misago from \"misago\"\n\nexport default function (props) {\n const size = props.size || 100\n const size2x = props.size2x || size * 2\n\n return (\n \n )\n}\n\nexport function getSrc(user, size) {\n if (user && user.id) {\n // just avatar hash, size and user id\n return resolveAvatarForSize(user.avatars, size).url\n } else {\n // just append avatar size to file to produce no-avatar placeholder\n return misago.get(\"BLANK_AVATAR_URL\")\n }\n}\n\nexport function resolveAvatarForSize(avatars, size) {\n let avatar = avatars[0]\n avatars.forEach((av) => {\n if (av.size >= size) {\n avatar = av\n }\n })\n return avatar\n}\n","import React from \"react\"\nimport Loader from \"./loader\"\n\nexport default class Button extends React.Component {\n render() {\n let className = \"btn \" + this.props.className\n let disabled = this.props.disabled\n\n if (this.props.loading) {\n className += \" btn-loading\"\n disabled = true\n }\n\n return (\n \n {this.props.children}\n {this.props.loading ? : null}\n \n )\n }\n}\n\nButton.defaultProps = {\n className: \"btn-default\",\n\n type: \"submit\",\n\n loading: false,\n disabled: false,\n\n onClick: null,\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n \n {props.choices.map((item) => {\n return (\n \n {\"- - \".repeat(item.level) + item.label}\n \n )\n })}\n \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n isValidated() {\n return typeof this.props.validation !== \"undefined\"\n }\n\n getClassName() {\n let className = \"form-group\"\n if (this.isValidated()) {\n className += \" has-feedback\"\n if (this.props.validation === null) {\n className += \" has-success\"\n } else {\n className += \" has-error\"\n }\n }\n return className\n }\n\n getFeedback() {\n if (this.props.validation) {\n return (\n
    \n {this.props.validation.map((error, i) => {\n return

    {error}

    \n })}\n
    \n )\n } else {\n return null\n }\n }\n\n getFeedbackDescription() {\n if (this.isValidated()) {\n return (\n \n {this.props.validation\n ? pgettext(\"field validation status\", \"(error)\")\n : pgettext(\"field validation status\", \"(success)\")}\n \n )\n } else {\n return null\n }\n }\n\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n \n {this.props.label + \":\"}\n \n
    \n {this.props.children}\n {this.getFeedbackDescription()}\n {this.getFeedback()}\n {this.getHelpText()}\n {this.props.extra || null}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { required } from \"../utils/validators\"\nimport snackbar from \"../services/snackbar\"\n\nlet validateRequired = required()\n\nexport default class extends React.Component {\n validate() {\n let errors = {}\n if (!this.state.validators) {\n return errors\n }\n\n let validators = {\n required: this.state.validators.required || this.state.validators,\n optional: this.state.validators.optional || {},\n }\n\n let validatedFields = []\n\n // add required fields to validation\n for (let name in validators.required) {\n if (\n validators.required.hasOwnProperty(name) &&\n validators.required[name]\n ) {\n validatedFields.push(name)\n }\n }\n\n // add optional fields to validation\n for (let name in validators.optional) {\n if (\n validators.optional.hasOwnProperty(name) &&\n validators.optional[name]\n ) {\n validatedFields.push(name)\n }\n }\n\n // validate fields values\n for (let i in validatedFields) {\n let name = validatedFields[i]\n let fieldErrors = this.validateField(name, this.state[name])\n\n if (fieldErrors === null) {\n errors[name] = null\n } else if (fieldErrors) {\n errors[name] = fieldErrors\n }\n }\n\n return errors\n }\n\n isValid() {\n let errors = this.validate()\n for (let field in errors) {\n if (errors.hasOwnProperty(field)) {\n if (errors[field] !== null) {\n return false\n }\n }\n }\n\n return true\n }\n\n validateField(name, value) {\n let errors = []\n if (!this.state.validators) {\n return errors\n }\n\n let validators = {\n required: (this.state.validators.required || this.state.validators)[name],\n optional: (this.state.validators.optional || {})[name],\n }\n\n let requiredError = validateRequired(value) || false\n\n if (validators.required) {\n if (requiredError) {\n errors = [requiredError]\n } else {\n for (let i in validators.required) {\n let validationError = validators.required[i](value)\n if (validationError) {\n errors.push(validationError)\n }\n }\n }\n\n return errors.length ? errors : null\n } else if (requiredError === false && validators.optional) {\n for (let i in validators.optional) {\n let validationError = validators.optional[i](value)\n if (validationError) {\n errors.push(validationError)\n }\n }\n\n return errors.length ? errors : null\n }\n\n return false // false === field wasn't validated\n }\n\n bindInput = (name) => {\n return (event) => {\n this.changeValue(name, event.target.value)\n }\n }\n\n changeValue = (name, value) => {\n let newState = {\n [name]: value,\n }\n\n const formErrors = this.state.errors || {}\n formErrors[name] = this.validateField(name, newState[name])\n newState.errors = formErrors\n\n this.setState(newState)\n }\n\n clean() {\n return true\n }\n\n send() {\n return null\n }\n\n handleSuccess(success) {\n return\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n }\n\n handleSubmit = (event) => {\n // we don't reload page on submissions\n if (event) {\n event.preventDefault()\n }\n\n if (this.state.isLoading) {\n return\n }\n\n if (this.clean()) {\n this.setState({ isLoading: true })\n let promise = this.send()\n\n if (promise) {\n promise.then(\n (success) => {\n this.setState({ isLoading: false })\n this.handleSuccess(success)\n },\n (rejection) => {\n this.setState({ isLoading: false })\n this.handleError(rejection)\n }\n )\n } else {\n this.setState({ isLoading: false })\n }\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n isActive() {\n if (this.props.isControlled) {\n return this.props.isActive\n } else {\n if (this.props.path) {\n return document.location.pathname.indexOf(this.props.path) === 0\n } else {\n return false\n }\n }\n }\n\n getClassName() {\n if (this.isActive()) {\n return (\n (this.props.className || \"\") +\n \" \" +\n (this.props.activeClassName || \"active\")\n )\n } else {\n return this.props.className || \"\"\n }\n }\n\n render() {\n return
  • {this.props.children}
  • \n }\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n
    \n
    \n )\n}\n","const ytRegExp = new RegExp(\n \"^.*(?:(?:youtu.be/|v/|vi/|u/w/|embed/)|(?:(?:watch)??v(?:i)?=|&v(?:i)?=))([^#&?]*).*\"\n)\n\nexport class OneBox {\n constructor() {\n this._youtube = {}\n }\n\n render = (element) => {\n if (!element) return\n this.highlightCode(element)\n this.embedYoutubePlayers(element)\n }\n\n highlightCode(element) {\n import(\"highlight\").then(({ default: hljs }) => {\n const codeblocks = element.querySelectorAll(\"pre>code\")\n for (let i = 0; i < codeblocks.length; i++) {\n hljs.highlightElement(codeblocks[i])\n }\n })\n }\n\n embedYoutubePlayers(element) {\n const anchors = element.querySelectorAll(\"p>a\")\n for (let i = 0; i < anchors.length; i++) {\n const a = anchors[i]\n const p = a.parentNode\n const onlyChild = p.childNodes.length === 1\n\n if (!this._youtube[a.href]) {\n this._youtube[a.href] = parseYoutubeUrl(a.href)\n }\n\n const youtubeMovie = this._youtube[a.href]\n if (onlyChild && !!youtubeMovie && youtubeMovie.data !== false) {\n this.swapYoutubePlayer(a, youtubeMovie)\n }\n }\n }\n\n swapYoutubePlayer(element, youtube) {\n let url = \"https://www.youtube.com/embed/\"\n url += youtube.video\n url += \"?feature=oembed\"\n if (youtube.start) {\n url += \"&start=\" + youtube.start\n }\n\n const player = $(\n '\"\n )\n $(element).replaceWith(player)\n player.wrap('
    ')\n }\n}\n\nexport default new OneBox()\n\nexport function parseYoutubeUrl(url) {\n const cleanedUrl = cleanUrl(url)\n const video = getVideoIdFromUrl(cleanedUrl)\n\n if (!video) return null\n\n let start = 0\n if (cleanedUrl.indexOf(\"?\") > 0) {\n const query = cleanedUrl.substr(cleanedUrl.indexOf(\"?\") + 1)\n const timebit = query.split(\"&\").filter((i) => {\n return i.substr(0, 2) === \"t=\"\n })[0]\n\n if (timebit) {\n const bits = timebit.substr(2).split(\"m\")\n if (bits[0].substr(-1) === \"s\") {\n start += parseInt(bits[0].substr(0, bits[0].length - 1))\n } else {\n start += parseInt(bits[0]) * 60\n if (!!bits[1] && bits[1].substr(-1) === \"s\") {\n start += parseInt(bits[1].substr(0, bits[1].length - 1))\n }\n }\n }\n }\n\n return {\n start,\n video,\n }\n}\n\nexport function cleanUrl(url) {\n let clean = url\n\n if (url.substr(0, 8) === \"https://\") {\n clean = clean.substr(8)\n } else if (url.substr(0, 7) === \"http://\") {\n clean = clean.substr(7)\n }\n\n if (clean.substr(0, 4) === \"www.\") {\n clean = clean.substr(4)\n }\n\n return clean\n}\n\nexport function getVideoIdFromUrl(url) {\n if (url.indexOf(\"youtu\") === -1) return null\n\n const video = url.match(ytRegExp)\n if (video) {\n return video[1]\n }\n return null\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport onebox from \"misago/services/one-box\"\n\nexport default class extends React.Component {\n componentDidMount() {\n onebox.render(this.documentNode)\n $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n }\n\n componentDidUpdate(prevProps, prevState) {\n onebox.render(this.documentNode)\n $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n return nextProps.markup !== this.props.markup\n }\n\n render() {\n return (\n {\n this.documentNode = node\n }}\n />\n )\n }\n}\n\nfunction revealSpoiler(event) {\n var btn = event.target\n $(btn).parent().parent().addClass(\"revealed\")\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default class extends PanelMessage {\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n \n {this.props.icon || \"info_outline\"}\n \n
    \n
    \n

    {this.props.message}

    \n {this.getHelpText()}\n \n {pgettext(\"modal message dismiss btn\", \"Ok\")}\n \n
    \n
    \n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n \n {this.props.icon || \"info_outline\"}\n \n
    \n
    \n

    {this.props.message}

    \n {this.getHelpText()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\n\nexport default function (props) {\n if (props.post.content) {\n return \n } else {\n return \n }\n}\n\nexport function Default(props) {\n return (\n
    \n \n
    \n )\n}\n\nexport function Invalid(props) {\n return (\n
    \n

    \n {pgettext(\n \"post body invalid\",\n \"This post's contents cannot be displayed.\"\n )}\n

    \n

    \n {pgettext(\n \"post body invalid\",\n \"This error is caused by invalid post content manipulation.\"\n )}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n const { category, thread } = post\n\n const tooltip = interpolate(\n pgettext(\"posts feed item header\", \"posted %(posted_on)s\"),\n {\n posted_on: post.posted_on.format(\"LL, LT\"),\n },\n true\n )\n\n return (\n
    \n \n {thread.title}\n \n \n {category.name}\n \n \n {post.posted_on.fromNow()}\n \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n return (\n \n \n {pgettext(\"go to post link\", \"See post\")}\n \n chevron_right\n \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\n\nexport default function ({ post }) {\n return (\n
    \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n {post.poster_name}\n
    \n \n {pgettext(\"post removed poster username\", \"Removed user\")}\n \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title || rank.name\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n {userTitle}\n \n )\n }\n\n return {userTitle}\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ post, poster }) {\n return (\n
    \n \n
    \n
    \n \n \n \n
    \n \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Anonymous from \"./anonymous\"\nimport Registered from \"./registered\"\n\nexport default function ({ post, poster }) {\n if (poster && poster.id) {\n return \n }\n\n return \n}\n","import React from \"react\"\nimport Body from \"./body\"\nimport Header from \"./header\"\nimport PostSide from \"./post-side\"\n\nexport default function ({ post, poster }) {\n const user = poster || post.poster\n\n let className = \"post\"\n if (user && user.rank.css_class) {\n className += \" post-\" + user.rank.css_class\n }\n\n return (\n
  • \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
  • \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default function () {\n return (\n
      \n
    • \n
      \n
      \n
      \n
      \n
      \n
      \n \n \n \n
      \n
      \n
      \n \n \n  \n \n \n
      \n \n \n  \n \n \n
      \n
      \n
      \n
      \n \n  \n \n
      \n
      \n
      \n

      \n \n  \n \n  \n \n  \n \n  \n \n  \n \n

      \n
      \n
      \n
      \n
      \n
      \n
    • \n
    \n )\n}\n","import React from \"react\"\nimport Post from \"./post\"\nimport Preview from \"./preview\"\n\nexport default function ({ isReady, posts, poster }) {\n if (!isReady) {\n return \n }\n\n return (\n
      \n {posts.map((post) => {\n return \n })}\n
    \n )\n}\n","import React from \"react\"\nimport posting from \"../../services/posting\"\nimport { getGlobalState, getQuoteMarkup } from \"../posting\"\n\nexport default class PostingQuoteSelection extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n range: null,\n rect: null,\n }\n\n this.element = null\n }\n\n selected = () => {\n if (this.element) {\n const range = getQuoteSelection(this.element) || null\n const rect = range ? range.getBoundingClientRect() : null\n\n this.setState({ range, rect })\n }\n }\n\n reply = () => {\n if (!posting.isOpen()) {\n const content = getQuoteMarkup(this.state.range)\n posting.open(Object.assign({}, this.props.posting, { default: content }))\n\n this.setState({ range: null, rect: null })\n\n window.setTimeout(focusEditor, 1000)\n } else {\n const globalState = getGlobalState()\n if (globalState && !globalState.disabled) {\n globalState.quote(getQuoteMarkup(this.state.range))\n this.setState({ range: null, rect: null })\n focusEditor()\n }\n }\n }\n\n render = () => (\n
    \n {\n if (element) {\n this.element = element\n }\n }}\n onMouseUp={this.selected}\n onTouchEnd={this.selected}\n >\n {this.props.children}\n
    \n {!!this.state.rect && (\n \n
    \n
    \n \n {pgettext(\"post reply\", \"Quote\")}\n \n
    \n
    \n )}\n
    \n )\n}\n\nfunction focusEditor() {\n const textarea = document.querySelector(\"#posting-mount textarea\")\n textarea.focus()\n textarea.selectionStart = textarea.selectionEnd = textarea.value.length\n}\n\nconst getQuoteSelection = (container) => {\n if (typeof window.getSelection === \"undefined\") return\n\n // Validate that selection is of valid type and has one range\n const selection = window.getSelection()\n if (!selection) return\n if (selection.type !== \"Range\") return\n if (selection.rangeCount !== 1) return\n\n // Validate that selection is within the container and post's article\n const range = selection.getRangeAt(0)\n if (!isRangeContained(range, container)) return\n if (!isPostContained(range)) return\n if (!isAnyTextSelected(range.cloneContents())) return\n\n return range\n}\n\nconst isRangeContained = (range, container) => {\n const node = range.commonAncestorContainer\n if (node === container) return true\n\n let p = node.parentNode\n while (p) {\n if (p === container) return true\n p = p.parentNode\n }\n\n return false\n}\n\nconst isPostContained = (range) => {\n const element = range.commonAncestorContainer\n if (element.nodeName === \"ARTICLE\") return true\n if (element.dataset && element.dataset.noquote === \"1\") return false\n let p = element.parentNode\n while (p) {\n if (p.dataset && p.dataset.noquote === \"1\") return false\n if (p.nodeName === \"ARTICLE\") return true\n p = p.parentNode\n }\n return false\n}\n\nconst isAnyTextSelected = (node) => {\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i]\n if (child.nodeType === Node.TEXT_NODE) {\n if (child.textContent && child.textContent.trim().length > 0) return true\n }\n if (child.nodeName === \"IMG\") return true\n if (isAnyTextSelected(child)) return true\n }\n\n return false\n}\n","const getQuoteMarkup = (range) => {\n const metadata = getQuoteMetadata(range)\n let markup = convertNodesToMarkup(range.cloneContents().childNodes, [])\n let prefix = metadata ? `[quote=\"${metadata}\"]\\n` : \"[quote]\\n\"\n let suffix = \"\\n[/quote]\\n\\n\"\n\n const codeBlock = getQuoteCodeBlock(range)\n if (codeBlock) {\n prefix += codeBlock.syntax ? `[code=${codeBlock.syntax}]\\n` : \"[code]\\n\"\n suffix = \"\\n[/code]\" + suffix\n } else if (isNodeInlineCodeBlock(range)) {\n markup = markup.trim()\n prefix += \"`\"\n suffix = \"`\" + suffix\n } else {\n markup = markup.trim()\n }\n\n return prefix + markup + suffix\n}\n\nexport default getQuoteMarkup\n\nconst getQuoteMetadata = (range) => {\n const node = range.commonAncestorContainer\n if (isNodeElementWithQuoteMetadata(node)) {\n return getQuoteMetadataFromNode(node)\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeElementWithQuoteMetadata(p)) {\n return getQuoteMetadataFromNode(p)\n }\n p = p.parentNode\n }\n\n return \"\"\n}\n\nconst isNodeElementWithQuoteMetadata = (node) => {\n if (node.nodeType !== Node.ELEMENT_NODE) return false\n if (node.nodeName === \"ARTICLE\") return true\n if (node.nodeName === \"BLOCKQUOTE\") {\n return node.dataset && node.dataset.block === \"quote\"\n }\n\n return false\n}\n\nconst getQuoteMetadataFromNode = (element) => {\n if (element.dataset) {\n return element.dataset.author || null\n }\n return null\n}\n\nconst getQuoteCodeBlock = (range) => {\n const node = range.commonAncestorContainer\n if (isNodeCodeBlock(node)) {\n return getNodeCodeBlockMeta(node)\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeCodeBlock(p)) {\n return getNodeCodeBlockMeta(p)\n }\n p = p.parentNode\n }\n\n return null\n}\n\nconst isNodeCodeBlock = (node) => {\n return node.nodeName === \"PRE\"\n}\n\nconst isNodeInlineCodeBlock = (range) => {\n const node = range.commonAncestorContainer\n if (node.nodeName === \"CODE\") {\n return true\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeElementWithQuoteMetadata(p)) {\n return false\n }\n\n if (p.nodeName === \"CODE\") {\n return true\n }\n\n p = p.parentNode\n }\n\n return false\n}\n\nconst getNodeCodeBlockMeta = (node) => {\n if (!node.dataset) {\n return { syntax: null }\n }\n\n return { syntax: node.dataset.syntax || null }\n}\n\nconst convertNodesToMarkup = (nodes, stack) => {\n let markup = \"\"\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n markup += convertNodeToMarkup(node, stack)\n }\n return markup\n}\n\nconst SIMPLE_NODE_MAPPINGS = {\n H1: [\"\\n\\n# \", \"\"],\n H2: [\"\\n\\n## \", \"\"],\n H3: [\"\\n\\n### \", \"\"],\n H4: [\"\\n\\n#### \", \"\"],\n H5: [\"\\n\\n##### \", \"\"],\n H6: [\"\\n\\n###### \", \"\"],\n STRONG: [\"**\", \"**\"],\n EM: [\"*\", \"*\"],\n DEL: [\"~~\", \"~~\"],\n B: [\"[b]\", \"[/b]\"],\n U: [\"[u]\", \"[/u]\"],\n I: [\"[i]\", \"[/i]\"],\n SUB: [\"[sub]\", \"[/sub]\"],\n SUP: [\"[sup]\", \"[/sup]\"],\n}\n\nconst convertNodeToMarkup = (node, stack) => {\n const dataset = node.dataset || {}\n\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent || \"\"\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n if (dataset.quote) {\n return dataset.quote || \"\"\n }\n if (dataset.noquote === \"1\") return \"\"\n }\n\n if (\n node.nodeType === Node.ELEMENT_NODE &&\n dataset.quote &&\n dataset.quote.trim()\n ) {\n return \"\"\n }\n\n if (node.nodeName === \"HR\") {\n return \"\\n\\n- - -\"\n }\n\n if (SIMPLE_NODE_MAPPINGS[node.nodeName]) {\n const [prefix, suffix] = SIMPLE_NODE_MAPPINGS[node.nodeName]\n return (\n prefix +\n convertNodesToMarkup(node.childNodes, [...stack, node.nodeName]) +\n suffix\n )\n }\n\n if (node.nodeName === \"A\") {\n const href = node.href\n const text = convertNodesToMarkup(node.childNodes, [\n ...stack,\n node.nodeName,\n ])\n if (text) {\n return `[${text}](${href})`\n } else {\n return `!(${href})`\n }\n }\n\n if (node.nodeName === \"IMG\") {\n const src = node.src\n const alt = node.alt\n if (alt) {\n return `![${alt}](${src})`\n } else {\n return `!(${src})`\n }\n }\n\n if (node.nodeName === \"DIV\" || node.nodeName === \"ASIDE\") {\n const block = dataset.block && dataset.block.toUpperCase()\n if (block && SIMPLE_NODE_MAPPINGS[block]) {\n const [prefix, suffix] = SIMPLE_NODE_MAPPINGS[block]\n return (\n prefix +\n convertNodesToMarkup(node.childNodes, [...stack, block]) +\n suffix\n )\n } else {\n return convertNodesToMarkup(node.childNodes, stack)\n }\n }\n\n if (node.nodeName === \"BLOCKQUOTE\") {\n if (dataset.block === \"spoiler\") {\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n \"SPOILER\",\n ]).trim()\n\n if (!content) return \"\"\n\n let markup = \"\\n[spoiler]\\n\"\n markup += content\n markup += \"\\n[/spoiler]\"\n return markup\n }\n\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n \"QUOTE\",\n ]).trim()\n\n if (!content) return \"\"\n\n const metadata = getQuoteMetadataFromNode(node)\n let markup = metadata ? `\\n[quote=${metadata}]\\n` : \"\\n\\n[quote]\\n\"\n markup += content\n markup += \"\\n[/quote]\"\n return markup\n }\n\n if (node.nodeName === \"PRE\") {\n const syntax = dataset.syntax || null\n const code = node.querySelector(\"code\")\n const content = code ? code.innerText || \"\" : \"\"\n\n if (!content.trim()) return \"\"\n\n return \"\\n[code\" + (syntax ? \"=\" + syntax : \"\") + \"]\" + content + \"[/code]\"\n }\n\n if (node.nodeName === \"CODE\") {\n return \"`\" + node.innerText + \"`\"\n }\n\n if (node.nodeName === \"P\") {\n return (\n \"\\n\" + convertNodesToMarkup(node.childNodes, [...stack, node.nodeName])\n )\n }\n\n if (node.nodeName === \"UL\" || node.nodeName === \"OL\") {\n const level = stack.filter((item) => item === \"OL\" || item === \"UL\").length\n const prefix = level === 0 ? \"\\n\" : \"\"\n return (\n prefix + convertNodesToMarkup(node.childNodes, [...stack, node.nodeName])\n )\n }\n\n if (node.nodeName === \"LI\") {\n let prefix = \"\"\n const level = stack.filter((item) => item === \"OL\" || item === \"UL\").length\n for (let i = 1; i < level; i++) {\n prefix += \" \"\n }\n\n const ordered = stack[stack.length - 1] === \"OL\"\n if (ordered) {\n prefix += dataset.index ? dataset.index + \". \" : \"1. \"\n } else {\n prefix += \"- \"\n }\n\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n node.nodeName,\n ])\n if (!content.trim()) return \"\"\n\n return \"\\n\" + prefix + content\n }\n\n if (node.nodeName === \"SPAN\") {\n return convertNodesToMarkup(node.childNodes, stack)\n }\n\n return \"\"\n}\n","export function getGlobalState() {\n return window.misagoReply\n}\n\nexport function setGlobalState(disabled, quote) {\n window.misagoReply = { disabled, quote }\n}\n\nexport function clearGlobalState() {\n window.misagoReply = null\n}\n","import moment from \"moment\"\n\nexport function clean(attachments) {\n return attachments\n .filter((attachment) => {\n return attachment.id && !attachment.isRemoved\n })\n .map((a) => {\n return a.id\n })\n}\n\nexport function hydrate(attachments) {\n return attachments.map((attachment) => {\n return Object.assign({}, attachment, {\n uploaded_on: moment(attachment.uploaded_on),\n })\n })\n}\n","import React from \"react\"\nimport formatFilesize from \"../../utils/file-size\"\n\nexport default function MarkupAttachmentModal({ attachment }) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Attachment details\")}\n

    \n
    \n
    \n {!!attachment.is_image && (\n
    \n \n \"\"\n \n
    \n )}\n
    \n {attachment.filename}\n
    \n
    \n
    \n \n {attachment.filetype + \", \" + formatFilesize(attachment.size)}\n \n
    \n {pgettext(\"markup editor\", \"Type and size\")}\n
    \n
    \n
    \n \n \n {attachment.uploaded_on.fromNow()}\n \n \n
    \n {pgettext(\"markup editor\", \"Uploaded at\")}\n
    \n
    \n
    \n {attachment.url.uploader ? (\n \n {attachment.uploader_name}\n \n ) : (\n {attachment.uploader_name}\n )}\n
    \n {pgettext(\"markup editor\", \"Uploader\")}\n
    \n
    \n
    \n
    \n
    \n \n {pgettext(\"modal\", \"Close\")}\n \n
    \n
    \n
    \n )\n}\n","const wrapSelection = (selection, update, prefix, suffix, def) => {\n const text = selection.text || def || \"\"\n let newValue = selection.prefix\n newValue += prefix + text + suffix\n newValue += selection.suffix\n update(newValue)\n\n window.setTimeout(() => {\n focus(selection.textarea)\n\n const caret = selection.start + prefix.length\n selection.textarea.setSelectionRange(caret, caret + text.length)\n }, 250)\n}\n\nconst replaceSelection = (selection, update, text) => {\n let newValue = selection.prefix\n newValue += text\n newValue += selection.suffix\n update(newValue)\n\n window.setTimeout(() => {\n focus(selection.textarea)\n\n const caret = selection.end + text.length\n selection.textarea.setSelectionRange(caret, caret)\n }, 250)\n}\n\nconst getSelection = (textarea) => {\n if (document.selection) {\n textarea.focus()\n const range = document.selection.createRange()\n const length = range.text.length\n range.moveStart(\"character\", -textarea.value.length)\n return createRange(textarea, range.text.length - length, range.text.length)\n }\n\n if (textarea.selectionStart || textarea.selectionStart == \"0\") {\n return createRange(textarea, textarea.selectionStart, textarea.selectionEnd)\n }\n}\n\nconst createRange = (textarea, start, end) => {\n return {\n textarea: textarea,\n start: start,\n end: end,\n text: textarea.value.substring(start, end),\n prefix: textarea.value.substring(0, start),\n suffix: textarea.value.substring(end),\n }\n}\n\nexport function focus(textarea) {\n const scroll = textarea.scrollTop\n textarea.focus()\n textarea.scrollTop = scroll\n}\n\nexport { getSelection, replaceSelection, wrapSelection }\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport snackbar from \"../../services/snackbar\"\nimport formatFilesize from \"../../utils/file-size\"\nimport MarkupAttachmentModal from \"./MarkupAttachmentModal\"\nimport { getSelection, replaceSelection } from \"./operations\"\n\nconst MarkupEditorAttachment = ({\n attachment,\n disabled,\n element,\n setState,\n update,\n}) => (\n
    \n
    \n
    \n {attachment.id ? (\n {\n event.preventDefault()\n modal.show()\n }}\n >\n {attachment.filename}\n \n ) : (\n {attachment.filename}\n )}\n
    \n
      \n {!attachment.id &&
    • {attachment.progress + \"%\"}
    • }\n {!!attachment.filetype &&
    • {attachment.filetype}
    • }\n {attachment.size > 0 &&
    • {formatFilesize(attachment.size)}
    • }\n
    \n
    \n
    \n {!!attachment.id && (\n
    \n {\n const markup = getAttachmentMarkup(attachment)\n const selection = getSelection(element)\n replaceSelection(selection, update, markup)\n }}\n >\n flip_to_front\n \n {\n setState(({ attachments }) => {\n const confirm = window.confirm(\n pgettext(\"markup editor\", \"Remove this attachment?\")\n )\n\n if (confirm) {\n return {\n attachments: attachments.filter(\n ({ id }) => id !== attachment.id\n ),\n }\n }\n })\n }}\n >\n close\n \n
    \n )}\n {!attachment.id && !!attachment.key && (\n
    \n {attachment.error && (\n {\n snackbar.error(\n interpolate(\n pgettext(\"markup editor\", \"%(filename)s: %(error)s\"),\n { filename: attachment.filename, error: attachment.error },\n true\n )\n )\n }}\n >\n warning\n \n )}\n {\n setState(({ attachments }) => {\n return {\n attachments: attachments.filter(\n ({ key }) => key !== attachment.key\n ),\n }\n })\n }}\n >\n close\n \n
    \n )}\n
    \n
    \n)\n\nexport default MarkupEditorAttachment\n\nfunction getAttachmentMarkup(attachment) {\n let markup = \"[\"\n\n if (attachment.is_image) {\n markup += \"![\" + attachment.filename + \"]\"\n markup += \"(\" + (attachment.url.thumb || attachment.url.index) + \"?shva=1)\"\n } else {\n markup += attachment.filename\n }\n\n markup += \"](\" + attachment.url.index + \"?shva=1)\"\n return markup\n}\n","import React from \"react\"\nimport MarkupEditorAttachment from \"./MarkupEditorAttachment\"\n\nconst MarkupEditorAttachments = ({\n attachments,\n disabled,\n element,\n setState,\n update,\n}) => (\n
    \n
    \n {attachments.map((attachment) => (\n \n ))}\n
    \n
    \n)\n\nexport default MarkupEditorAttachments\n","import React from \"react\"\nimport Button from \"../button\"\n\nconst MarkupEditorFooter = ({\n canProtect,\n disabled,\n empty,\n preview,\n isProtected,\n submitText,\n showPreview,\n closePreview,\n enableProtection,\n disableProtection,\n}) => (\n
    \n {!!canProtect && (\n {\n if (isProtected) {\n disableProtection()\n } else {\n enableProtection()\n }\n }}\n >\n \n {isProtected ? \"lock\" : \"lock_open\"}\n \n \n )}\n {!!canProtect && (\n
    \n {\n if (isProtected) {\n disableProtection()\n } else {\n enableProtection()\n }\n }}\n >\n \n {isProtected ? \"lock\" : \"lock_open\"}\n \n {isProtected\n ? pgettext(\"markup editor\", \"Protected\")\n : pgettext(\"markup editor\", \"Protect\")}\n \n
    \n )}\n
    \n {preview ? (\n \n {pgettext(\"markup editor\", \"Edit\")}\n \n ) : (\n \n {pgettext(\"markup editor\", \"Preview\")}\n \n )}\n \n
    \n)\n\nexport default MarkupEditorFooter\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupCodeModal extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: null,\n syntax: \"\",\n text: props.selection.text,\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const syntax = this.state.syntax.trim()\n const text = this.state.text.trim()\n\n if (text.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n replaceSelection(\n Object.assign({}, selection, { text }),\n update,\n prefix + \"```\" + syntax + \"\\n\" + text + \"\\n```\\n\\n\"\n )\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {pgettext(\"markup editor\", \"Code\")}

    \n
    \n
    \n
    \n \n \n this.setState({ syntax: event.target.value })\n }\n >\n \n {LANGUAGES.map(({ value, name }) => (\n \n ))}\n \n \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nconst LANGUAGES = [\n { value: \"bash\", name: \"Bash\" },\n { value: \"c\", name: \"C\" },\n { value: \"c#\", name: \"C#\" },\n { value: \"c++\", name: \"C++\" },\n { value: \"css\", name: \"CSS\" },\n { value: \"diff\", name: \"Diff\" },\n { value: \"go\", name: \"Go\" },\n { value: \"graphql\", name: \"GraphQL\" },\n { value: \"html,\", name: \"HTML\" },\n { value: \"xml\", name: \"XML\" },\n { value: \"json\", name: \"JSON\" },\n { value: \"java\", name: \"Java\" },\n { value: \"javascript\", name: \"JavaScript\" },\n { value: \"kotlin\", name: \"Kotlin\" },\n { value: \"less\", name: \"Less\" },\n { value: \"lua\", name: \"Lua\" },\n { value: \"makefile\", name: \"Makefile\" },\n { value: \"markdown\", name: \"Markdown\" },\n { value: \"objective-C\", name: \"Objective-C\" },\n { value: \"php\", name: \"PHP\" },\n { value: \"perl\", name: \"Perl\" },\n { value: \"plain\", name: \"Plain\" },\n { value: \"text\", name: \"text\" },\n { value: \"python\", name: \"Python\" },\n { value: \"repl\", name: \"REPL\" },\n { value: \"r\", name: \"R\" },\n { value: \"ruby\", name: \"Ruby\" },\n { value: \"rust\", name: \"Rust\" },\n { value: \"scss\", name: \"SCSS\" },\n { value: \"sql\", name: \"SQL\" },\n { value: \"shell\", name: \"Shell Session\" },\n { value: \"swift\", name: \"Swift\" },\n { value: \"toml\", name: \"TOML\" },\n { value: \"ini\", name: \"INI\" },\n { value: \"typescript\", name: \"TypeScript\" },\n { value: \"visualbasic\", name: \"Visual Basic .NET\" },\n { value: \"webassembly\", name: \"WebAssembly\" },\n { value: \"yaml\", name: \"YAML\" },\n]\n\nexport default MarkupCodeModal\n","import React from \"react\"\nimport formatFilesize from \"../../utils/file-size\"\n\nexport default function MarkupFormattingHelpModal() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup help\", \"Formatting help\")}\n

    \n
    \n
    \n

    {pgettext(\"markup help\", \"Emphasis text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will have emphasis\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Bold text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will be bold\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Removed text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will be removed\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Bold text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be bold\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Underlined text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be underlined\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Italics text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be in italics\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link\")}

    \n \"\n result={\n

    \n example.com\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link with text\")}

    \n \n {pgettext(\"markup help\", \"Link text\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link (BBCode)\")}

    \n \n example.com\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link with text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"Link text\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image\")}

    \n \n \"\"\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image with alternate text\")}

    \n \n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image (BBCode)\")}

    \n \n \"\"\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Mention user by their name\")}

    \n \n @username\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 1\")}

    \n {pgettext(\"markup help\", \"First level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 2\")}

    \n {pgettext(\"markup help\", \"Second level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 3\")}

    \n {pgettext(\"markup help\", \"Third level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 4\")}

    \n {pgettext(\"markup help\", \"Fourth level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 5\")}

    \n {pgettext(\"markup help\", \"Fifth level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Unordered list\")}

    \n \n
  • Lorem ipsum
  • \n
  • Dolor met
  • \n
  • Vulputate lectus
  • \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Ordered list\")}

    \n \n
  • Lorem ipsum
  • \n
  • Dolor met
  • \n
  • Vulputate lectus
  • \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text\")}

    \n \" + pgettext(\"markup help\", \"Quoted text\")}\n result={\n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text (BBCode)\")}

    \n \n
    \n {gettext(\"Quoted message:\")}\n
    \n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text with author (BBCode)\")}

    \n \n
    \n {pgettext(\"markup help\", \"Quote author has written:\")}\n
    \n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Spoiler\")}

    \n \n {pgettext(\"markup help\", \"Secret text\")}\n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Inline code\")}

    \n \n {pgettext(\"markup help\", \"Inline code\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Code block\")}

    \n \n alert(\"Hello world!\");\n \n }\n />\n\n
    \n\n

    \n {pgettext(\"markup help\", \"Code block with syntax highlighting\")}\n

    \n \n \n print(\"Hello world!\");\n \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Code block (BBCode)\")}

    \n \n alert(\"Hello world!\");\n \n }\n />\n\n
    \n\n

    \n {pgettext(\n \"markup help\",\n \"Code block with syntax highlighting (BBCode)\"\n )}\n

    \n \n \n print(\"Hello world!\");\n \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Horizontal rule\")}

    \n \n

    Lorem ipsum

    \n
    \n

    Dolor met

    \n
    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Horizontal rule (BBCode)\")}

    \n \n

    Lorem ipsum

    \n
    \n

    Dolor met

    \n
    \n }\n />\n
    \n
    \n \n {pgettext(\"modal\", \"Close\")}\n \n
    \n
    \n
    \n )\n}\n\nfunction ExampleFormatting({ markup, result }) {\n return (\n
    \n
    \n
    \n          {markup}\n        
    \n
    \n
    \n
    {result}
    \n
    \n
    \n )\n}\n\nclass ExampleFormattingSpoiler extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n reveal: false,\n }\n }\n\n render() {\n return (\n \n
    \n

    {this.props.children}

    \n
    \n {!this.state.reveal && (\n
    \n {\n this.setState({ reveal: true })\n }}\n >\n {gettext(\"Reveal spoiler\")}\n \n
    \n )}\n \n )\n }\n}\n","const URL_PATTERN = new RegExp(\"^(((ftps?)|(https?))://)\", \"i\")\n\nexport default function isUrl(str) {\n return URL_PATTERN.test(str.trim())\n}\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport isUrl from \"./isUrl\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupImageModal extends React.Component {\n constructor(props) {\n super(props)\n\n const text = props.selection.text.trim()\n const textUrl = isUrl(text)\n\n this.state = {\n error: null,\n text: textUrl ? \"\" : text,\n url: textUrl ? text : \"\",\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const text = this.state.text.trim()\n const url = this.state.url.trim()\n\n if (url.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n if (text.length > 0) {\n replaceSelection(selection, update, \"![\" + text + \"](\" + url + \")\")\n } else {\n replaceSelection(selection, update, \"!(\" + url + \")\")\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Image\")}\n

    \n
    \n
    \n
    \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n \n \n this.setState({ url: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupImageModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport isUrl from \"./isUrl\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupLinkModal extends React.Component {\n constructor(props) {\n super(props)\n\n const text = props.selection.text.trim()\n const textUrl = isUrl(text)\n\n this.state = {\n error: null,\n text: textUrl ? \"\" : text,\n url: textUrl ? text : \"\",\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const text = this.state.text.trim()\n const url = this.state.url.trim()\n\n if (url.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n if (text.length > 0) {\n replaceSelection(selection, update, \"[\" + text + \"](\" + url + \")\")\n } else {\n replaceSelection(selection, update, \"<\" + url + \">\")\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {pgettext(\"markup editor\", \"Link\")}

    \n
    \n
    \n
    \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n \n \n this.setState({ url: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupLinkModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupQuoteModal extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: null,\n author: \"\",\n text: props.selection.text,\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const author = this.state.author.trim()\n const text = this.state.text.trim()\n\n if (text.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n if (author) {\n replaceSelection(\n selection,\n update,\n prefix + '[quote=\"' + author + '\"]\\n' + text + \"\\n[/quote]\\n\\n\"\n )\n } else {\n replaceSelection(\n selection,\n update,\n prefix + \"[quote]\\n\" + text + \"\\n[/quote]\\n\\n\"\n )\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Quote\")}\n

    \n
    \n
    \n
    \n \n \n this.setState({ author: event.target.value })\n }\n />\n \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupQuoteModal\n","import React from \"react\"\n\nconst MarkupEditorButton = ({ disabled, icon, title, onClick }) => (\n \n {icon}\n \n)\n\nexport default MarkupEditorButton\n","import moment from \"moment\"\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport formatFilesize from \"../../utils/file-size\"\nimport getRandomString from \"../../utils/getRandomString\"\n\nconst ID_LEN = 32\n\nconst uploadFile = (file, setState) => {\n const maxSize = misago.get(\"user\").acl.max_attachment_size * 1024\n\n if (file.size > maxSize) {\n snackbar.error(\n interpolate(\n pgettext(\n \"markup editor\",\n \"File %(filename)s is bigger than %(limit)s.\"\n ),\n { filename: file.name, limit: formatFilesize(maxSize) },\n true\n )\n )\n\n return\n }\n\n let upload = {\n id: null,\n key: getRandomString(ID_LEN),\n error: null,\n uploaded_on: null,\n progress: 0,\n filename: file.name,\n filetype: null,\n is_image: false,\n size: file.size,\n url: null,\n uploader_name: null,\n }\n\n setState(({ attachments }) => {\n return { attachments: [upload].concat(attachments) }\n })\n\n const refreshState = () => {\n setState(({ attachments }) => {\n return { attachments: attachments.concat() }\n })\n }\n\n const data = new FormData()\n data.append(\"upload\", file)\n\n ajax\n .upload(misago.get(\"ATTACHMENTS_API\"), data, (progress) => {\n upload.progress = progress\n refreshState()\n })\n .then(\n (data) => {\n Object.assign(upload, data, { uploaded_on: moment(data.uploaded_on) })\n refreshState()\n },\n (rejection) => {\n if (rejection.status === 400 || rejection.status === 413) {\n upload.error = rejection.detail\n snackbar.error(rejection.detail)\n refreshState()\n } else {\n snackbar.apiError(rejection)\n }\n }\n )\n}\n\nexport default uploadFile\n","import React from \"react\"\nimport misago from \"../../\"\nimport modal from \"../../services/modal\"\nimport MarkupCodeModal from \"./MarkupCodeModal\"\nimport MarkupFormattingHelpModal from \"./MarkupFormattingHelpModal\"\nimport MarkupImageModal from \"./MarkupImageModal\"\nimport MarkupLinkModal from \"./MarkupLinkModal\"\nimport MarkupQuoteModal from \"./MarkupQuoteModal\"\nimport MarkupEditorButton from \"./MarkupEditorButton\"\nimport { getSelection, replaceSelection, wrapSelection } from \"./operations\"\nimport uploadFile from \"./uploadFile\"\n\nconst MarkupEditorToolbar = ({\n disabled,\n element,\n update,\n updateAttachments,\n}) => {\n const actions = [\n {\n name: pgettext(\"markup editor\", \"Strong\"),\n icon: \"format_bold\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"**\",\n \"**\",\n pgettext(\"example markup\", \"Strong text\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Emphasis\"),\n icon: \"format_italic\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"*\",\n \"*\",\n pgettext(\"example markup\", \"Text with emphasis\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Strikethrough\"),\n icon: \"format_strikethrough\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"~~\",\n \"~~\",\n pgettext(\"example markup\", \"Text with strikethrough\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Horizontal ruler\"),\n icon: \"remove\",\n onClick: () => {\n replaceSelection(getSelection(element), update, \"\\n\\n- - -\\n\\n\")\n },\n },\n {\n name: pgettext(\"markup editor\", \"Link\"),\n icon: \"insert_link\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Image\"),\n icon: \"insert_photo\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Quote\"),\n icon: \"format_quote\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Spoiler\"),\n icon: \"visibility_off\",\n onClick: () => {\n insertSpoiler(element, update)\n },\n },\n {\n name: pgettext(\"markup editor\", \"Code\"),\n icon: \"code\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n ]\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n actions.push({\n name: pgettext(\"markup editor\", \"Upload file\"),\n icon: \"file_upload\",\n onClick: () => uploadFiles(updateAttachments),\n })\n }\n\n return (\n
    \n
    \n {actions.map(({ name, icon, onClick }) => (\n \n ))}\n
    \n
    \n
    \n \n more_vert\n \n
      \n {actions.map(({ name, icon, onClick }) => (\n
    • \n \n {icon}\n {name}\n \n
    • \n ))}\n
    \n
    \n {\n modal.show()\n }}\n />\n
    \n
    \n )\n}\n\nconst insertSpoiler = (element, update) => {\n const selection = getSelection(element)\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n wrapSelection(\n selection,\n update,\n prefix + \"[spoiler]\\n\",\n \"\\n[/spoiler]\\n\\n\",\n pgettext(\"markup editor\", \"Spoiler text\")\n )\n}\n\nconst uploadFiles = (setState) => {\n const input = document.createElement(\"input\")\n input.type = \"file\"\n input.multiple = \"multiple\"\n\n input.addEventListener(\"change\", function () {\n for (let i = 0; i < input.files.length; i++) {\n uploadFile(input.files[i], setState)\n }\n })\n\n input.click()\n}\n\nexport default MarkupEditorToolbar\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport MisagoMarkup from \"../misago-markup\"\nimport MarkupEditorAttachments from \"./MarkupEditorAttachments\"\nimport MarkupEditorFooter from \"./MarkupEditorFooter\"\nimport MarkupEditorToolbar from \"./MarkupEditorToolbar\"\nimport uploadFile from \"./uploadFile\"\n\nclass MarkupEditor extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n element: null,\n focused: false,\n loading: false,\n preview: false,\n parsed: null,\n }\n }\n\n showPreview = () => {\n if (this.state.loading) return\n\n this.setState({ loading: true, preview: true, element: null })\n\n ajax.post(misago.get(\"PARSE_MARKUP_API\"), { post: this.props.value }).then(\n (data) => {\n this.setState({ loading: false, parsed: data.parsed })\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n this.setState({ loading: false, preview: false })\n }\n )\n }\n\n closePreview = () => {\n this.setState({ loading: false, preview: false })\n }\n\n onDrop = (event) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!event.dataTransfer.files) return\n\n const { onAttachmentsChange: setState } = this.props\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n for (let i = 0; i < event.dataTransfer.files.length; i++) {\n const file = event.dataTransfer.files[i]\n uploadFile(file, setState)\n }\n }\n }\n\n onPaste = (event) => {\n const { onAttachmentsChange: setState } = this.props\n\n const files = []\n for (let i = 0; i < event.clipboardData.items.length; i++) {\n const item = event.clipboardData.items[i]\n if (item.kind === \"file\") {\n files.push(item.getAsFile())\n }\n }\n\n if (files.length) {\n event.preventDefault()\n event.stopPropagation()\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n for (let i = 0; i < files.length; i++) {\n uploadFile(files[i], setState)\n }\n }\n }\n }\n\n render = () => (\n \n this.props.onChange({ target: { value } })}\n updateAttachments={this.props.onAttachmentsChange}\n />\n {this.state.preview ? (\n
    \n {this.state.loading ? (\n
    \n
    \n \n
    \n
    \n ) : (\n \n )}\n
    \n ) : (\n {\n if (element && this.state.element !== element) {\n this.setState({ element })\n setMentions(this.props, element)\n }\n }}\n onChange={this.props.onChange}\n onDrop={this.onDrop}\n onFocus={() => this.setState({ focused: true })}\n onPaste={this.onPaste}\n onBlur={() => this.setState({ focused: false })}\n />\n )}\n {this.props.attachments.length > 0 && (\n this.props.onChange({ target: { value } })}\n />\n )}\n \n
    \n )\n}\n\nfunction setMentions(props, element) {\n $(element).atwho({\n at: \"@\",\n displayTpl: '
  • \"\"${username}
  • ',\n insertTpl: \"@${username}\",\n searchKey: \"username\",\n callbacks: {\n remoteFilter: function (query, callback) {\n $.getJSON(misago.get(\"MENTION_API\"), { q: query }, callback)\n },\n },\n })\n\n $(element).on(\"inserted.atwho\", (event, _storage, source, controller) => {\n const { query } = controller\n const username = source.target.innerText.trim()\n const prefix = event.target.value.substr(0, query.headPos)\n const suffix = event.target.value.substr(query.endPos)\n\n event.target.value = prefix + username + suffix\n props.onChange(event)\n\n const caret = query.headPos + username.length\n event.target.setSelectionRange(caret, caret)\n event.target.focus()\n })\n}\n\nexport default MarkupEditor\n","import MarkupEditor from \"./MarkupEditor\"\n\nexport default MarkupEditor\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nconst CLASS_ACTIVE = \"posting-active\"\nconst CLASS_DEFAULT = \"posting-default\"\nconst CLASS_MINIMIZED = \"posting-minimized\"\nconst CLASS_FULLSCREEN = \"posting-fullscreen\"\n\nclass PostingDialog extends React.Component {\n componentDidMount() {\n document.body.classList.add(CLASS_ACTIVE, CLASS_DEFAULT)\n }\n\n componentWillUnmount() {\n document.body.classList.remove(\n CLASS_ACTIVE,\n CLASS_DEFAULT,\n CLASS_MINIMIZED,\n CLASS_FULLSCREEN\n )\n }\n\n componentWillReceiveProps({ fullscreen, minimized }) {\n if (minimized) {\n document.body.classList.remove(CLASS_DEFAULT, CLASS_FULLSCREEN)\n document.body.classList.add(CLASS_MINIMIZED)\n } else {\n if (fullscreen) {\n document.body.classList.remove(CLASS_DEFAULT, CLASS_MINIMIZED)\n document.body.classList.add(CLASS_FULLSCREEN)\n } else {\n document.body.classList.remove(CLASS_FULLSCREEN, CLASS_MINIMIZED)\n document.body.classList.add(CLASS_DEFAULT)\n }\n }\n }\n\n render() {\n const { children, fullscreen, minimized } = this.props\n\n return (\n \n
    {children}
    \n \n )\n }\n}\n\nexport default PostingDialog\n","import React from \"react\"\n\nconst PostingDialogBody = ({ children }) => (\n
    {children}
    \n)\n\nexport default PostingDialogBody\n","import React from \"react\"\n\nconst PostingDialogError = ({ close, message }) => (\n
    \n
    \n error_outlined\n
    \n
    \n

    {message}

    \n \n
    \n
    \n)\n\nexport default PostingDialogError\n","import React from \"react\"\n\nconst PostingDialogHeader = ({\n children,\n close,\n fullscreen,\n minimize,\n minimized,\n fullscreenEnter,\n fullscreenExit,\n open,\n}) => (\n
    \n
    {children}
    \n {minimized ? (\n \n expand_less\n \n ) : (\n \n expand_more\n \n )}\n {fullscreen ? (\n \n fullscreen_exit\n \n ) : (\n \n fullscreen\n \n )}\n \n close\n \n
    \n)\n\nexport default PostingDialogHeader\n","import React from \"react\"\n\nexport default function PostingThreadOptions({\n isClosed,\n isHidden,\n isPinned,\n disabled,\n options,\n close,\n open,\n hide,\n unhide,\n pinGlobally,\n pinLocally,\n unpin,\n}) {\n const icons = getIcons(isClosed, isHidden, isPinned)\n\n return (\n
    \n \n {icons.length > 0 ? (\n \n {icons.map((icon) => (\n \n {icon}\n \n ))}\n \n ) : (\n more_horiz\n )}\n \n
      \n {options.pin === 2 && isPinned !== 2 && (\n
    • \n \n bookmark\n {pgettext(\"post thread\", \"Pinned globally\")}\n \n
    • \n )}\n {options.pin >= isPinned && isPinned !== 1 && (\n
    • \n \n bookmark_outline\n {pgettext(\"post thread\", \"Pinned in category\")}\n \n
    • \n )}\n {options.pin >= isPinned && isPinned !== 0 && (\n
    • \n \n radio_button_unchecked\n {pgettext(\"post thread\", \"Not pinned\")}\n \n
    • \n )}\n {options.close && !!isClosed && (\n
    • \n \n lock_outline\n {pgettext(\"post thread\", \"Open\")}\n \n
    • \n )}\n {options.close && !isClosed && (\n
    • \n \n lock\n {pgettext(\"post thread\", \"Closed\")}\n \n
    • \n )}\n {options.hide && !!isHidden && (\n
    • \n \n visibility\n {pgettext(\"post thread\", \"Visible\")}\n \n
    • \n )}\n {options.hide && !isHidden && (\n
    • \n \n visibility_off\n {pgettext(\"post thread\", \"Hidden\")}\n \n
    • \n )}\n
    \n
    \n )\n}\n\nfunction getIcons(closed, hidden, pinned) {\n const icons = []\n if (pinned === 2) icons.push(\"bookmark\")\n if (pinned === 1) icons.push(\"bookmark_outline\")\n if (closed) icons.push(\"lock\")\n if (hidden) icons.push(\"visibility_off\")\n return icons\n}\n","import React from \"react\"\nimport CategorySelect from \"misago/components/category-select\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport PostingThreadOptions from \"./PostingThreadOptions\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n options: null,\n\n title: \"\",\n category: props.category || null,\n categories: [],\n post: \"\",\n attachments: [],\n close: false,\n hide: false,\n pin: 0,\n\n validators: {\n title: getTitleValidators(),\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n }\n\n loadSuccess = (data) => {\n let category = null\n let options = null\n\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n // pick first category that allows posting and if it may, override it with initial one\n if (\n item.post !== false &&\n (!category || item.id == this.state.category)\n ) {\n category = item.id\n options = item.post\n }\n\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n })\n })\n\n this.setState({\n isReady: true,\n options,\n\n categories,\n category,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n onCancel = () => {\n const formEmpty = !!(\n this.state.post.length === 0 &&\n this.state.title.length === 0 &&\n this.state.attachments.length === 0\n )\n\n if (formEmpty) {\n this.minimize()\n return posting.close()\n }\n\n const cancel = window.confirm(\n pgettext(\"post thread\", \"Are you sure you want to discard thread?\")\n )\n if (cancel) {\n this.minimize()\n posting.close()\n }\n }\n\n onTitleChange = (event) => {\n this.changeValue(\"title\", event.target.value)\n }\n\n onCategoryChange = (event) => {\n const category = this.state.categories.find((item) => {\n return event.target.value == item.value\n })\n\n // if selected pin is greater than allowed, reduce it\n let pin = this.state.pin\n if (category.post.pin && category.post.pin < pin) {\n pin = category.post.pin\n }\n\n this.setState({\n category: category.id,\n categoryOptions: category.post,\n\n pin,\n })\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onClose = () => {\n this.changeValue(\"close\", true)\n }\n\n onOpen = () => {\n this.changeValue(\"close\", false)\n }\n\n onPinGlobally = () => {\n this.changeValue(\"pin\", 2)\n }\n\n onPinLocally = () => {\n this.changeValue(\"pin\", 1)\n }\n\n onUnpin = () => {\n this.changeValue(\"pin\", 0)\n }\n\n onHide = () => {\n this.changeValue(\"hide\", true)\n }\n\n onUnhide = () => {\n this.changeValue(\"hide\", false)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n clean() {\n if (!this.state.title.trim().length) {\n snackbar.error(\n pgettext(\"posting form\", \"You have to enter thread title.\")\n )\n return false\n }\n\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.title) {\n snackbar.error(errors.title[0])\n return false\n }\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.submit, {\n title: this.state.title,\n category: this.state.category,\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n close: this.state.close,\n hide: this.state.hide,\n pin: this.state.pin,\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n window.location = success.url\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.category || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n const dialogProps = {\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n const showOptions = !!(\n this.state.options.close ||\n this.state.options.hide ||\n this.state.options.pin\n )\n\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n {showOptions && (\n \n \n \n )}\n \n \n \n \n
    \n )\n }\n}\n\nconst PostingDialogStart = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n}) => (\n \n \n {pgettext(\"post thread\", \"Start new thread\")}\n \n {children}\n \n)\n","export default function (usernames) {\n const normalisedNames = usernames\n .split(\",\")\n .map((i) => i.trim().toLowerCase())\n const removedBlanks = normalisedNames.filter((i) => i.length > 0)\n const removedDuplicates = removedBlanks.filter((name, pos) => {\n return removedBlanks.indexOf(name) == pos\n })\n\n return removedDuplicates\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport cleanUsernames from \"./utils/usernames\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n const to = (props.to || []).map((user) => user.username).join(\", \")\n\n this.state = {\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n to: to,\n title: \"\",\n post: \"\",\n attachments: [],\n\n validators: {\n title: getTitleValidators(),\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n onCancel = () => {\n const formEmpty = !!(\n this.state.post.length === 0 &&\n this.state.title.length === 0 &&\n this.state.to.length === 0 &&\n this.state.attachments.length === 0\n )\n\n if (formEmpty) {\n return this.close()\n }\n\n const cancel = window.confirm(\n pgettext(\n \"post thread\",\n \"Are you sure you want to discard private thread?\"\n )\n )\n if (cancel) {\n this.close()\n }\n }\n\n onToChange = (event) => {\n this.changeValue(\"to\", event.target.value)\n }\n\n onTitleChange = (event) => {\n this.changeValue(\"title\", event.target.value)\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n clean() {\n if (!cleanUsernames(this.state.to).length) {\n snackbar.error(\n pgettext(\"posting form\", \"You have to enter at least one recipient.\")\n )\n return false\n }\n\n if (!this.state.title.trim().length) {\n snackbar.error(\n pgettext(\"posting form\", \"You have to enter thread title.\")\n )\n return false\n }\n\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.title) {\n snackbar.error(errors.title[0])\n return false\n }\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.submit, {\n to: cleanUsernames(this.state.to),\n title: this.state.title,\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n window.location = success.url\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.to || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n )\n }\n}\n\nconst PostingDialogStartPrivate = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n}) => (\n \n \n {pgettext(\"post thread\", \"Start private thread\")}\n \n {children}\n \n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n post: this.props.default || \"\",\n attachments: [],\n\n validators: {\n post: getPostValidators(),\n },\n errors: {},\n }\n\n this.quoteText = \"\"\n }\n\n componentDidMount() {\n ajax\n .get(this.props.config, this.props.context || null)\n .then(this.loadSuccess, this.loadError)\n\n setGlobalState(false, this.onQuote)\n }\n\n componentWillUnmount() {\n clearGlobalState()\n }\n\n componentWillReceiveProps(nextProps) {\n const context = this.props.context\n const newContext = nextProps.context\n\n // User clicked \"reply\" instead of \"quote\"\n if (context && newContext && !newContext.reply) return\n\n ajax\n .get(nextProps.config, nextProps.context || null)\n .then(this.appendData, snackbar.apiError)\n }\n\n loadSuccess = (data) => {\n this.setState({\n isReady: true,\n\n post: data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\"\n : this.state.post,\n })\n\n this.quoteText = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\"\n : this.state.post\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n appendData = (data) => {\n const newPost = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n : \"\"\n\n this.setState((prevState, props) => {\n if (prevState.post.length > 0) {\n return {\n post: prevState.post.trim() + \"\\n\\n\" + newPost,\n }\n }\n\n return {\n post: newPost,\n }\n })\n\n this.open()\n }\n\n onCancel = () => {\n // If only the quote text is on editor user didn't add anything\n // so no changes to discard\n const onlyQuoteTextInEditor = this.state.post === this.quoteText\n\n if (onlyQuoteTextInEditor && this.state.attachments.length === 0) {\n return this.close()\n }\n\n const cancel = window.confirm(\n pgettext(\"post reply\", \"Are you sure you want to discard your reply?\")\n )\n if (cancel) {\n this.close()\n }\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onQuote = (quote) => {\n this.setState(({ post }) => {\n if (post.length > 0) {\n return { post: post.trim() + \"\\n\\n\" + quote }\n }\n\n return { post: quote }\n })\n\n this.open()\n }\n\n clean() {\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n setGlobalState(true, this.onQuote)\n\n return ajax.post(this.props.submit, {\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n setGlobalState(false, this.onQuote)\n\n snackbar.success(pgettext(\"post reply\", \"Your reply has been posted.\"))\n window.location = success.url.index\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n setGlobalState(false, this.onQuote)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n thread: this.props.thread,\n\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n return (\n \n \n \n \n \n )\n }\n}\n\nconst PostingDialogReply = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n thread,\n}) => (\n \n \n {interpolate(\n pgettext(\"post reply\", \"Reply to: %(thread)s\"),\n { thread: thread.title },\n true\n )}\n \n {children}\n \n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: false,\n\n minimized: false,\n fullscreen: false,\n\n post: \"\",\n attachments: [],\n protect: false,\n\n canProtect: false,\n\n validators: {\n post: getPostValidators(),\n },\n errors: {},\n }\n\n this.originalPost = \"\"\n }\n\n componentDidMount() {\n ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n\n setGlobalState(false, this.onQuote)\n }\n\n componentWillUnmount() {\n clearGlobalState()\n }\n\n componentWillReceiveProps(nextProps) {\n const context = this.props.context\n const newContext = nextProps.context\n\n if (context && newContext && context.reply === newContext.reply) return\n\n ajax\n .get(nextProps.config, nextProps.context || null)\n .then(this.appendData, snackbar.apiError)\n }\n\n loadSuccess = (data) => {\n this.originalPost = data.post\n\n this.setState({\n isReady: true,\n\n post: data.post,\n attachments: attachments.hydrate(data.attachments),\n protect: data.is_protected,\n\n canProtect: data.can_protect,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n appendData = (data) => {\n const newPost = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n : \"\"\n\n this.setState((prevState, props) => {\n if (prevState.post.length > 0) {\n return {\n post: prevState.post.trim() + \"\\n\\n\" + newPost,\n }\n }\n\n return {\n post: newPost,\n }\n })\n\n this.open()\n }\n\n onCancel = () => {\n const originalPostSameAsCurrentPost =\n this.state.originalPost === this.state.post\n const noAttachementsAdded = this.state.attachments.length === 0\n\n if (originalPostSameAsCurrentPost && noAttachementsAdded) {\n return this.close()\n }\n\n const cancel = window.confirm(\n pgettext(\"edit reply\", \"Are you sure you want to discard changes?\")\n )\n if (cancel) {\n this.close()\n }\n }\n\n onProtect = () => {\n this.setState({\n protect: true,\n })\n }\n\n onUnprotect = () => {\n this.setState({\n protect: false,\n })\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onQuote = (quote) => {\n this.setState(({ post }) => {\n if (post.length > 0) {\n return { post: post.trim() + \"\\n\\n\" + quote }\n }\n\n return { post: quote }\n })\n\n this.open()\n }\n\n clean() {\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n setGlobalState(true, this.onQuote)\n\n return ajax.put(this.props.submit, {\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n protect: this.state.protect,\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n setGlobalState(false, this.onQuote)\n\n snackbar.success(pgettext(\"edit reply\", \"Reply has been edited.\"))\n window.location = success.url.index\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.category || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n setGlobalState(false, this.onQuote)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n post: this.props.post,\n\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n return (\n \n \n this.setState({ protect: true })}\n disableProtection={() => this.setState({ protect: false })}\n value={this.state.post}\n submitText={pgettext(\"edit reply submit\", \"Edit reply\")}\n disabled={this.state.isLoading}\n onAttachmentsChange={this.onAttachmentsChange}\n onChange={this.onPostChange}\n />\n \n \n )\n }\n}\n\nconst PostingDialogEditReply = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n post,\n}) => (\n \n \n {interpolate(\n pgettext(\"edit reply\", \"Edit reply by %(poster)s from %(date)s\"),\n {\n poster: post.poster ? post.poster.username : post.poster_name,\n date: post.posted_on.fromNow(),\n },\n true\n )}\n \n {children}\n \n)\n","import React from \"react\"\nimport PostingQuoteSelection from \"./PostingQuoteSelection\"\nimport getQuoteMarkup from \"./getQuoteMarkup\"\nimport { clearGlobalState, getGlobalState, setGlobalState } from \"./globalState\"\nimport Start from \"./start\"\nimport StartPrivate from \"./start-private\"\nimport Reply from \"./reply\"\nimport Edit from \"./edit\"\n\nexport default function (props) {\n switch (props.mode) {\n case \"START\":\n return \n\n case \"START_PRIVATE\":\n return \n\n case \"REPLY\":\n return \n\n case \"EDIT\":\n return \n\n default:\n return null\n }\n}\n\nexport {\n PostingQuoteSelection,\n clearGlobalState,\n getGlobalState,\n getQuoteMarkup,\n setGlobalState,\n}\n","import { maxLength, minLength } from \"misago/utils/validators\"\nimport misago from \"misago\"\n\nexport function getTitleValidators() {\n return [getTitleLengthMin(), getTitleLengthMax()]\n}\n\nexport function getPostValidators() {\n if (misago.get(\"SETTINGS\").post_length_max) {\n return [validatePostLengthMin(), validatePostLengthMax()]\n } else {\n return [validatePostLengthMin()]\n }\n}\n\nexport function getTitleLengthMin() {\n return minLength(\n misago.get(\"SETTINGS\").thread_title_length_min,\n (limitValue, length) => {\n const message = npgettext(\n \"thread title length validator\",\n \"Thread title should be at least %(limit_value)s character long (it has %(show_value)s).\",\n \"Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function getTitleLengthMax() {\n return maxLength(\n misago.get(\"SETTINGS\").thread_title_length_max,\n (limitValue, length) => {\n const message = npgettext(\n \"thread title length validator\",\n \"Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n \"Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function validatePostLengthMin() {\n return minLength(\n misago.get(\"SETTINGS\").post_length_min,\n (limitValue, length) => {\n const message = npgettext(\n \"post length validator\",\n \"Posted message should be at least %(limit_value)s character long (it has %(show_value)s).\",\n \"Posted message should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function validatePostLengthMax() {\n return maxLength(\n misago.get(\"SETTINGS\").post_length_max || 1000000,\n (limitValue, length) => {\n const message = npgettext(\n \"post length validator\",\n \"Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n \"Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getChoice() {\n let choice = null\n this.props.choices.map((item) => {\n if (item.value === this.props.value) {\n choice = item\n }\n })\n return choice\n }\n\n getIcon() {\n return this.getChoice().icon\n }\n\n getLabel() {\n return this.getChoice().label\n }\n\n change = (value) => {\n return () => {\n this.props.onChange({\n target: {\n value: value,\n },\n })\n }\n }\n\n render() {\n return (\n
    \n \n \n {this.getLabel()}\n \n
      \n {this.props.choices.map((item, i) => {\n return (\n
    • \n \n \n {item.label}\n \n
    • \n )\n })}\n
    \n
    \n )\n }\n}\n\nexport function Icon({ icon }) {\n if (!icon) return null\n\n return {icon}\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport StartSocialAuth from \"misago/components/StartSocialAuth\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n showActivation: false,\n\n username: \"\",\n password: \"\",\n\n validators: {\n username: [],\n password: [],\n },\n }\n }\n\n clean() {\n if (!this.isValid()) {\n snackbar.error(pgettext(\"sign in modal\", \"Fill out both fields.\"))\n return false\n } else {\n return true\n }\n }\n\n send() {\n return ajax.post(misago.get(\"AUTH_API\"), {\n username: this.state.username,\n password: this.state.password,\n })\n }\n\n handleSuccess() {\n let form = $(\"#hidden-login-form\")\n\n form.append('')\n form.append('')\n\n // fill out form with user credentials and submit it, this will tell\n // Misago to redirect user back to right page, and will trigger browser's\n // key ring feature\n form.find('input[type=\"hidden\"]').val(ajax.getCsrfToken())\n form.find('input[name=\"next\"]').val(window.location.pathname)\n form.find('input[name=\"username\"]').val(this.state.username)\n form.find('input[name=\"password\"]').val(this.state.password)\n form.submit()\n\n // keep form loading\n this.setState({\n isLoading: true,\n })\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.code === \"inactive_admin\") {\n snackbar.info(rejection.detail)\n } else if (rejection.code === \"inactive_user\") {\n snackbar.info(rejection.detail)\n this.setState({\n showActivation: true,\n })\n } else if (rejection.code === \"banned\") {\n showBannedPage(rejection.detail)\n modal.hide()\n } else {\n snackbar.error(rejection.detail)\n }\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n modal.hide()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n getActivationButton() {\n if (!this.state.showActivation) return null\n\n return (\n \n {pgettext(\"sign in modal btn\", \"Activate account\")}\n \n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"sign in modal title\", \"Sign in\")}\n

    \n
    \n
    \n
    \n \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    \n {this.getActivationButton()}\n \n {pgettext(\"sign in modal btn\", \"Sign in\")}\n \n \n {pgettext(\"sign in modal btn\", \"Forgot password?\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClass() {\n return getStatusClassName(this.props.status)\n }\n\n render() {\n return {this.props.children}\n }\n}\n\nexport class StatusIcon extends React.Component {\n getIcon() {\n if (this.props.status.is_banned) {\n return \"remove_circle_outline\"\n } else if (this.props.status.is_hidden) {\n return \"help_outline\"\n } else if (this.props.status.is_online_hidden) {\n return \"label\"\n } else if (this.props.status.is_offline_hidden) {\n return \"label_outline\"\n } else if (this.props.status.is_online) {\n return \"lens\"\n } else if (this.props.status.is_offline) {\n return \"panorama_fish_eye\"\n }\n }\n\n render() {\n return {this.getIcon()}\n }\n}\n\nexport class StatusLabel extends React.Component {\n getHelp() {\n return getStatusDescription(this.props.user, this.props.status)\n }\n\n getLabel() {\n if (this.props.status.is_banned) {\n return pgettext(\"user status\", \"Banned\")\n } else if (this.props.status.is_hidden) {\n return pgettext(\"user status\", \"Hidden\")\n } else if (this.props.status.is_online_hidden) {\n return pgettext(\"user status\", \"Online (hidden)\")\n } else if (this.props.status.is_offline_hidden) {\n return pgettext(\"user status\", \"Offline (hidden)\")\n } else if (this.props.status.is_online) {\n return pgettext(\"user status\", \"Online\")\n } else if (this.props.status.is_offline) {\n return pgettext(\"user status\", \"Offline\")\n }\n }\n\n render() {\n return (\n \n {this.getLabel()}\n \n )\n }\n}\n\nexport function getStatusClassName(status) {\n let className = \"\"\n if (status.is_banned) {\n className = \"banned\"\n } else if (status.is_hidden) {\n className = \"offline\"\n } else if (status.is_online_hidden) {\n className = \"online\"\n } else if (status.is_offline_hidden) {\n className = \"offline\"\n } else if (status.is_online) {\n className = \"online\"\n } else if (status.is_offline) {\n className = \"offline\"\n }\n\n return \"user-status user-\" + className\n}\n\nexport function getStatusDescription(user, status) {\n if (status.is_banned) {\n if (status.banned_until) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is banned until %(ban_expires)s\"),\n {\n username: user.username,\n ban_expires: status.banned_until.format(\"LL, LT\"),\n },\n true\n )\n } else {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is banned\"),\n {\n username: user.username,\n },\n true\n )\n }\n } else if (status.is_hidden) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is hiding presence\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_online_hidden) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is online (hidden)\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_offline_hidden) {\n return interpolate(\n pgettext(\n \"user status\",\n \"%(username)s was last seen %(last_click)s (hidden)\"\n ),\n {\n username: user.username,\n last_click: status.last_click.fromNow(),\n },\n true\n )\n } else if (status.is_online) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is online\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_offline) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s was last seen %(last_click)s\"),\n {\n username: user.username,\n last_click: status.last_click.fromNow(),\n },\n true\n )\n }\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\n\nexport default function ({ showStatus, user }) {\n return (\n
      \n \n \n
    • \n \n \n \n
    \n )\n}\n\nexport function Status({ showStatus, user }) {\n if (!showStatus) return null\n\n return (\n
  • \n \n \n \n
  • \n )\n}\n\nexport function JoinDate({ user }) {\n const { joined_on } = user\n\n let title = interpolate(\n pgettext(\"users list item\", \"Joined on %(joined_on)s\"),\n {\n joined_on: joined_on.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n pgettext(\"users list item\", \"Joined %(joined_on)s\"),\n {\n joined_on: joined_on.fromNow(),\n },\n true\n )\n\n return (\n
  • \n {message}\n
  • \n )\n}\n\nexport function Posts({ user }) {\n const className = getStatClassName(\"user-stat-posts\", user.posts)\n const message = npgettext(\n \"users list item\",\n \"%(posts)s post\",\n \"%(posts)s posts\",\n user.posts\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n posts: user.posts,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Threads({ user }) {\n const className = getStatClassName(\"user-stat-threads\", user.threads)\n const message = npgettext(\n \"users list item\",\n \"%(threads)s thread\",\n \"%(threads)s threads\",\n user.threads\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n threads: user.threads,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Followers({ user }) {\n const className = getStatClassName(\"user-stat-followers\", user.followers)\n const message = npgettext(\n \"users list item\",\n \"%(followers)s follower\",\n \"%(followers)s followers\",\n user.followers\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n followers: user.followers,\n },\n true\n )}\n
  • \n )\n}\n\nexport function getStatClassName(className, stat) {\n if (stat === 0) {\n return className + \" user-stat-empty\"\n }\n return className\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title || rank.name\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n {userTitle}\n \n )\n }\n\n return {userTitle}\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Stats from \"./stats\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ showStatus, user }) {\n const { rank } = user\n\n let className = \"panel user-card\"\n if (rank.css_class) {\n className += \" user-card-\" + rank.css_class\n }\n\n return (\n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n\n \n
    \n \n
    \n\n
    \n \n
    \n
    \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n\n
    \n \n  \n \n
    \n
    \n \n  \n \n
    \n\n
    \n
      \n
    • \n \n  \n \n
    • \n
    • \n \n  \n \n
    • \n
    • \n
    • \n \n  \n \n
    • \n
    • \n \n  \n \n
    • \n
    \n
    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ colClassName, cols }) {\n const list = Array.apply(null, { length: cols }).map(Number.call, Number)\n\n return (\n
    \n
    \n {list.map((i) => {\n let className = colClassName\n if (i !== 0) className += \" hidden-xs\"\n if (i === 3) className += \" hidden-sm\"\n\n return (\n
    \n \n
    \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport Card from \"./card\"\nimport Preview from \"./preview\"\n\nexport default function ({ cols, isReady, showStatus, users }) {\n let colClassName = \"col-xs-12 col-sm-4\"\n if (cols === 4) {\n colClassName += \" col-md-3\"\n }\n\n if (!isReady) {\n return \n }\n\n return (\n
    \n
    \n {users.map((user) => {\n return (\n
    \n \n
    \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n dropdown: false,\n }\n }\n\n toggleNav = () => {\n this.setState({\n dropdown: !this.state.dropdown,\n })\n }\n\n hideNav = () => {\n this.setState({\n dropdown: false,\n })\n }\n\n getCompactNavClassName() {\n if (this.state.dropdown) {\n return \"compact-nav open\"\n } else {\n return \"compact-nav\"\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.value) {\n return \"btn btn-yes-no btn-yes-no-on\"\n } else {\n return \"btn btn-yes-no btn-yes-no-off\"\n }\n }\n\n getIcon() {\n if (!!this.props.value) {\n return this.props.iconOn || \"check_box\"\n } else {\n return this.props.iconOff || \"check_box_outline_blank\"\n }\n }\n\n getLabel() {\n if (!!this.props.value) {\n return this.props.labelOn || pgettext(\"yesno switch choice\", \"yes\")\n } else {\n return this.props.labelOff || pgettext(\"yesno switch choice\", \"no\")\n }\n }\n\n toggle = () => {\n this.props.onChange({\n target: {\n value: !this.props.value,\n },\n })\n }\n\n render() {\n return (\n \n {this.getIcon()}\n {this.getLabel()}\n \n )\n }\n}\n","export const locale = window.misago_locale || \"en-us\"\n\nexport const momentAgo = pgettext(\"time ago\", \"moment ago\")\nexport const momentAgoShort = pgettext(\"time ago\", \"now\")\nexport const dayAt = pgettext(\"day at time\", \"%(day)s at %(time)s\")\nexport const soonAt = pgettext(\"day at time\", \"Today at %(time)s\")\nexport const tomorrowAt = pgettext(\"day at time\", \"Tomorrow at %(time)s\")\nexport const yesterdayAt = pgettext(\"day at time\", \"Yesterday at %(time)s\")\n\nexport const minutesShort = pgettext(\"short minutes\", \"%(time)sm\")\nexport const hoursShort = pgettext(\"short hours\", \"%(time)sh\")\nexport const daysShort = pgettext(\"short days\", \"%(time)sd\")\nexport const thisYearShort = pgettext(\"short month\", \"%(day)s %(month)s\")\nexport const otherYearShort = pgettext(\"short month\", \"%(month)s %(year)s\")\n\nexport const relativeNumeric = new Intl.RelativeTimeFormat(locale, {\n numeric: \"always\",\n style: \"long\",\n})\n\nexport const fullDateTime = new Intl.DateTimeFormat(locale, {\n dateStyle: \"full\",\n timeStyle: \"medium\",\n})\n\nexport const thisYearDate = new Intl.DateTimeFormat(locale, {\n month: \"long\",\n day: \"numeric\",\n})\n\nexport const otherYearDate = new Intl.DateTimeFormat(locale, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n})\n\nexport const short = new Intl.DateTimeFormat(locale, {\n year: \"2-digit\",\n month: \"short\",\n day: \"numeric\",\n})\n\nexport const weekday = new Intl.DateTimeFormat(locale, {\n weekday: \"long\",\n})\n\nexport const shortTime = new Intl.DateTimeFormat(locale, { timeStyle: \"short\" })\n\nexport function dateRelative(date) {\n const now = new Date()\n const diff = Math.round((date - now) / 1000)\n const absDiff = Math.abs(diff)\n const sign = diff < 1 ? -1 : 1\n\n if (absDiff < 90) {\n return momentAgo\n }\n\n if (absDiff < 60 * 47) {\n const minutes = Math.round(absDiff / 60) * sign\n return relativeNumeric.format(minutes, \"minute\")\n }\n\n if (absDiff < 3600 * 3) {\n const hours = Math.round(absDiff / 3600) * sign\n return relativeNumeric.format(hours, \"hour\")\n }\n\n if (isSameDay(now, date)) {\n if (diff > 0) {\n return soonAt.replace(\"%(time)s\", shortTime.format(date))\n }\n\n return shortTime.format(date)\n }\n\n if (isYesterday(date)) {\n return yesterdayAt.replace(\"%(time)s\", shortTime.format(date))\n }\n\n if (isTomorrow(date)) {\n return tomorrowAt.replace(\"%(time)s\", shortTime.format(date))\n }\n\n if (diff < 0 && absDiff < 3600 * 24 * 6) {\n const day = weekday.format(date)\n return formatDayAtTime(day, date)\n }\n\n if (now.getFullYear() == date.getFullYear()) {\n return thisYearDate.format(date)\n }\n\n return otherYearDate.format(date)\n}\n\nexport function isSameDay(now, date) {\n return (\n now.getFullYear() == date.getFullYear() &&\n now.getMonth() == date.getMonth() &&\n now.getDate() == date.getDate()\n )\n}\n\nexport function isYesterday(date) {\n const yesterday = new Date()\n yesterday.setDate(yesterday.getDate() - 1)\n return isSameDay(yesterday, date)\n}\n\nexport function isTomorrow(date) {\n const yesterday = new Date()\n yesterday.setDate(yesterday.getDate() + 1)\n return isSameDay(yesterday, date)\n}\n\nexport function formatDayAtTime(day, date) {\n return dayAt\n .replace(\"%(day)s\", day)\n .replace(\"%(time)s\", shortTime.format(date))\n}\n\nexport function dateRelativeShort(date) {\n const now = new Date()\n const absDiff = Math.abs(Math.round((date - now) / 1000))\n\n if (absDiff < 60) {\n return momentAgoShort\n }\n\n if (absDiff < 60 * 55) {\n const minutes = Math.round(absDiff / 60)\n return minutesShort.replace(\"%(time)s\", minutes)\n }\n\n if (absDiff < 3600 * 24) {\n const hours = Math.round(absDiff / 3600)\n return hoursShort.replace(\"%(time)s\", hours)\n }\n\n if (absDiff < 86400 * 7) {\n const days = Math.round(absDiff / 86400)\n return daysShort.replace(\"%(time)s\", days)\n }\n\n const parts = {}\n short.formatToParts(date).forEach(function ({ type, value }) {\n parts[type] = value\n })\n\n if (date.getFullYear() === now.getFullYear()) {\n return thisYearShort\n .replace(\"%(day)s\", parts.day)\n .replace(\"%(month)s\", parts.month)\n }\n\n return otherYearShort\n .replace(\"%(year)s\", parts.year)\n .replace(\"%(month)s\", parts.month)\n}\n","class OrderedList {\n constructor(items) {\n this.isOrdered = false\n this._items = items || []\n }\n\n add(key, item, order) {\n this._items.push({\n key: key,\n item: item,\n\n after: order ? order.after || null : null,\n before: order ? order.before || null : null,\n })\n }\n\n get(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 has(key) {\n return this.get(key) !== undefined\n }\n\n values() {\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 order(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 orderedValues() {\n return this.order(true)\n }\n\n _order(unordered) {\n // Index of unordered items\n var index = []\n unordered.forEach(function (item) {\n index.push(item.key)\n })\n\n // Ordered items\n var ordered = []\n var ordering = []\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item)\n ordering.push(item.key)\n }\n })\n\n // Second pass: register items that\n // specify their before to \"_end\"\n unordered.forEach(function (item) {\n if (item.before === \"_end\") {\n ordered.push(item)\n ordering.push(item.key)\n }\n })\n\n // Third pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after)\n if (insertAt !== -1) {\n insertAt += 1\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before)\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item)\n ordering.splice(insertAt, 0, item.key)\n }\n }\n }\n\n var iterations = 200\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1\n unordered.forEach(insertItem)\n }\n\n return ordered\n }\n}\n\nexport default OrderedList\n","class AjaxLoader {\n constructor() {\n this.element = document.getElementById(\"misago-ajax-loader\")\n this.requests = 0\n this.timeout = null\n }\n\n show = () => {\n this.requests += 1\n this.update()\n }\n\n hide = () => {\n if (this.requests) {\n this.requests -= 1\n this.update()\n }\n }\n\n update = () => {\n if (this.timeout) {\n window.clearTimeout(this.timeout)\n }\n\n if (this.requests) {\n this.element.classList.add(\"busy\")\n this.element.classList.remove(\"complete\")\n } else {\n this.element.classList.remove(\"busy\")\n this.element.classList.add(\"complete\")\n\n this.timeout = setTimeout(() => {\n this.element.classList.remove(\"complete\")\n }, 1500)\n }\n }\n}\n\nexport function useLoader(target) {\n const silent = target.closest(\"[hx-silent]\")\n if (silent) {\n return silent.getAttribute(\"hx-silent\") !== \"true\"\n }\n\n return true\n}\n\nexport default AjaxLoader\n","import htmx from \"htmx.org\"\n\nclass BulkModeration {\n constructor(options) {\n this.menu = options.menu ? document.querySelector(options.menu) : null\n this.form = options.form\n this.modal = options.modal\n this.actions = document.querySelectorAll(options.actions)\n this.selection = options.selection\n this.control = document.querySelector(options.button.selector)\n this.text = options.button.text\n\n this.update()\n this.registerEvents()\n this.registerActions()\n }\n\n registerActions = () => {\n this.actions.forEach((element) => {\n if (element.getAttribute(\"moderation-action\") === \"remove-selection\") {\n element.addEventListener(\"click\", this.onRemoveSelection)\n } else {\n element.addEventListener(\"click\", this.onAction)\n }\n })\n }\n\n onAction = (event) => {\n const form = document.querySelector(this.form)\n const data = {}\n\n new FormData(form).forEach((value, key) => {\n if (typeof data[key] === \"undefined\") {\n data[key] = []\n }\n data[key].push(value)\n })\n\n const target = event.target\n data.moderation = target.getAttribute(\"moderation-action\")\n\n if (target.getAttribute(\"moderation-multistage\") === \"true\") {\n htmx\n .ajax(\"POST\", document.location.href, {\n target: this.modal,\n swap: \"innerHTML\",\n values: data,\n })\n .then(() => {\n $(this.modal).modal(\"show\")\n })\n } else {\n htmx.ajax(\"POST\", document.location.href, {\n target: \"#misago-htmx-root\",\n swap: \"outerHTML\",\n values: data,\n })\n }\n }\n\n onRemoveSelection = (event) => {\n document.querySelectorAll(this.selection).forEach((element) => {\n element.checked = false\n })\n this.update()\n }\n\n registerEvents = () => {\n document.body.addEventListener(\"click\", ({ target }) => {\n if (target.tagName === \"INPUT\" && target.type === \"checkbox\") {\n this.update()\n }\n })\n\n htmx.onLoad(() => this.update())\n }\n\n update = () => {\n const selection = document.querySelectorAll(this.selection).length\n\n this.control.innerText = this.text.replace(\"%(number)s\", selection)\n this.control.disabled = !selection\n\n if (this.menu) {\n if (selection) {\n this.menu.classList.add(\"visible\")\n } else {\n this.menu.classList.remove(\"visible\")\n }\n }\n }\n}\n\nexport default BulkModeration\n","import htmx from \"htmx.org\"\n\nconst DEBOUNCE = 1000\n\nconst cache = {}\n\nexport function registerElementValidator(element) {\n const active = element.getAttribute(\"misago-validate-active\")\n if (active) {\n return\n }\n\n const url = element.getAttribute(\"misago-validate\")\n const user = element.getAttribute(\"misago-validate-user\")\n const strip =\n element.getAttribute(\"misago-validate-strip\") == \"false\" ? false : true\n const input = element.querySelector(\"input\")\n const csrf = input.closest(\"form\").querySelector(\"input[type=hidden]\")\n\n if (!url || !input) {\n return\n }\n\n if (!cache[url]) {\n cache[url] = {}\n }\n\n element.setAttribute(\"misago-validate-active\", \"true\")\n\n let timeout = null\n\n input.addEventListener(\"keyup\", (event) => {\n let value = event.target.value\n if (strip) {\n value = value.trim()\n }\n\n if (value.trim().length === 0) {\n clearFormControlValidationState(element)\n return\n }\n\n if (cache[url][value]) {\n setFormControlValidationState(element, input, cache[url][value])\n } else {\n if (timeout) {\n window.clearTimeout(timeout)\n }\n\n timeout = window.setTimeout(async () => {\n const { errors } = await callValidationUrl(url, csrf, value, user)\n cache[url][value] = errors\n setFormControlValidationState(element, input, errors)\n }, DEBOUNCE)\n }\n })\n}\n\nfunction setFormControlValidationState(element, input, errors) {\n if (errors.length) {\n setFormControlErrorValidationState(element, input, errors)\n } else {\n setFormControlSuccessValidationState(element)\n }\n}\n\nfunction setFormControlErrorValidationState(element, input, errors) {\n element.classList.remove(\"has-success\")\n element.classList.add(\"has-error\")\n\n clearFormControlValidationMessages(element)\n\n errors.forEach((error) => {\n const message = document.createElement(\"p\")\n message.className = \"help-block\"\n message.setAttribute(\"misago-dynamic-message\", \"true\")\n message.innerText = error\n input.after(message)\n })\n}\n\nfunction setFormControlSuccessValidationState(element) {\n element.classList.remove(\"has-error\")\n element.classList.add(\"has-success\")\n\n clearFormControlValidationMessages(element)\n}\n\nfunction clearFormControlValidationState(element) {\n element.classList.remove(\"has-error\")\n element.classList.remove(\"has-success\")\n\n clearFormControlValidationMessages(element)\n}\n\nfunction clearFormControlValidationMessages(element) {\n element\n .querySelectorAll(\"[misago-dynamic-message]\")\n .forEach((i) => i.remove())\n}\n\nasync function callValidationUrl(url, csrf, value, user) {\n const data = new FormData()\n data.set(csrf.name, csrf.value)\n data.set(\"value\", value)\n if (user) {\n data.set(\"user\", user)\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n mode: \"cors\",\n credentials: \"same-origin\",\n body: data,\n })\n return await response.json()\n}\n\nexport function registerValidators(element) {\n const target = element || document\n target.querySelectorAll(\"[misago-validate]\").forEach(registerElementValidator)\n}\n\nhtmx.onLoad(registerValidators)\n","import htmx from \"htmx.org\"\n\nconst SNACKBAR_TTL = 6\n\nconst container = document.getElementById(\"misago-snackbars\")\nlet timeout = null\n\nexport function removeSnackbars() {\n container.replaceChildren()\n}\n\nfunction renderSnackbars() {\n if (timeout) {\n window.clearTimeout(timeout)\n }\n\n container.querySelectorAll(\".snackbar\").forEach((element) => {\n element.classList.add(\"in\")\n })\n\n timeout = window.setTimeout(() => {\n container.querySelectorAll(\".snackbar\").forEach((element) => {\n element.classList.add(\"out\")\n timeout = window.setTimeout(removeSnackbars, 1000)\n })\n }, SNACKBAR_TTL * 1000)\n}\n\nexport function snackbar(type, message) {\n removeSnackbars()\n\n if (timeout) {\n window.clearTimeout(timeout)\n }\n\n const element = document.createElement(\"div\")\n element.classList.add(\"snackbar\")\n element.classList.add(\"snackbar-\" + type)\n element.innerText = message\n element.role = \"alert\"\n container.appendChild(element)\n\n timeout = window.setTimeout(renderSnackbars, 100)\n}\n\nexport function info(message) {\n snackbar(\"info\", message)\n}\n\nexport function success(message) {\n snackbar(\"success\", message)\n}\n\nexport function warning(message) {\n snackbar(\"warning\", message)\n}\n\nexport function error(message) {\n snackbar(\"danger\", message)\n}\n\nhtmx.onLoad(renderSnackbars)\n","import { error } from \"./snackbars\"\n\nfunction handleResponseError(event) {\n if (isEventVisible(event)) {\n const message = getResponseErrorMessage(event.detail.xhr)\n error(message)\n }\n}\n\nfunction getResponseErrorMessage(xhr) {\n if (xhr.getResponseHeader(\"content-type\") === \"application/json\") {\n const data = JSON.parse(xhr.response)\n if (data.error) {\n return data.error\n }\n }\n\n if (xhr.status === 404) {\n return pgettext(\"htmx response error\", \"Page not found\")\n }\n\n if (xhr.status === 403) {\n return pgettext(\"htmx response error\", \"Permission denied\")\n }\n\n return pgettext(\"htmx response error\", \"Unexpected error\")\n}\n\nfunction handleSendError(event) {\n if (isEventVisible(event)) {\n const message = pgettext(\"htmx response error\", \"Site could not be reached.\")\n error(message)\n }\n}\n\nfunction handleTimeoutError(event) {\n if (isEventVisible(event)) {\n const message = pgettext(\n \"htmx response error\",\n \"Site took too long to reply\"\n )\n error(message)\n }\n}\n\nfunction isEventVisible({ detail }) {\n const silent = getEventTargetSilentAttr(detail.target)\n return !(silent === \"true\" && detail.requestConfig.verb === \"get\")\n}\n\nfunction getEventTargetSilentAttr(target) {\n const element = target.closest(\"[hx-silent]\")\n if (element) {\n return element.getAttribute(\"hx-silent\")\n }\n return null\n}\n\nexport function setupHtmxErrors() {\n document.addEventListener(\"htmx:responseError\", handleResponseError)\n document.addEventListener(\"htmx:sendError\", handleSendError)\n document.addEventListener(\"htmx:timeout\", handleTimeoutError)\n}\n\nsetupHtmxErrors()\n","import htmx from \"htmx.org\"\n\nimport { dateRelative, dateRelativeShort, fullDateTime } from \"./formats\"\n\nconst cache = {}\n\nexport function updateTimestamp(element) {\n const timestamp = element.getAttribute(\"misago-timestamp\")\n if (!cache[timestamp]) {\n cache[timestamp] = new Date(timestamp)\n }\n\n if (!element.hasAttribute(\"misago-timestamp-title\")) {\n element.setAttribute(\"misago-timestamp-title\", \"true\")\n element.setAttribute(\"title\", fullDateTime.format(cache[timestamp]))\n }\n\n const format = element.getAttribute(\"misago-timestamp-format\")\n\n if (format == \"short\") {\n element.textContent = dateRelativeShort(cache[timestamp])\n } else {\n element.textContent = dateRelative(cache[timestamp])\n }\n}\n\nexport function startLiveTimestamps() {\n document.querySelectorAll(\"[misago-timestamp]\").forEach(updateTimestamp)\n\n updateLiveTimestamps()\n window.setInterval(updateLiveTimestamps, 1000 * 55)\n}\n\nexport function updateLiveTimestamps(element) {\n const target = element || document\n target.querySelectorAll(\"[misago-timestamp]\").forEach(updateTimestamp)\n}\n\nstartLiveTimestamps()\nhtmx.onLoad(updateLiveTimestamps)\n","import \"bootstrap/js/transition\"\nimport \"bootstrap/js/affix\"\nimport \"bootstrap/js/modal\"\nimport \"bootstrap/js/dropdown\"\nimport \"at-js\"\nimport \"cropit\"\nimport \"jquery-caret\"\nimport htmx from \"htmx.org\"\nimport OrderedList from \"misago/utils/ordered-list\"\nimport \"misago/style/index.less\"\nimport AjaxLoader, { useLoader } from \"./AjaxLoader\"\nimport BulkModeration from \"./BulkModeration\"\nimport \"./formValidators\"\nimport \"./htmxErrors\"\nimport \"./liveTimestamps\"\nimport * as snackbars from \"./snackbars\"\n\nconst loader = new AjaxLoader()\n\nexport class Misago {\n constructor() {\n this._initializers = []\n this._context = {}\n\n this.loader = loader\n }\n\n addInitializer(initializer) {\n this._initializers.push({\n key: initializer.name,\n\n item: initializer.initializer,\n\n after: initializer.after,\n before: initializer.before,\n })\n }\n\n init(context) {\n this._context = context\n\n var initOrder = new OrderedList(this._initializers).orderedValues()\n initOrder.forEach((initializer) => {\n initializer(this)\n })\n }\n\n // context accessors\n has(key) {\n return !!this._context[key]\n }\n\n get(key, fallback) {\n if (this.has(key)) {\n return this._context[key]\n } else {\n return fallback || undefined\n }\n }\n\n pop(key) {\n if (this.has(key)) {\n let value = this._context[key]\n this._context[key] = null\n return value\n } else {\n return undefined\n }\n }\n\n snackbar(type, message) {\n snackbars.snackbar(type, message)\n }\n\n snackbarInfo(message) {\n snackbars.info(message)\n }\n\n snackbarSuccess(message) {\n snackbars.success(message)\n }\n\n snackbarWarning(message) {\n snackbars.warning(message)\n }\n\n snackbarError(message) {\n snackbars.error(message)\n }\n\n bulkModeration(options) {\n return new BulkModeration(options)\n }\n}\n\n// create the singleton\nconst misago = new Misago()\n\n// expose it globally\nwindow.misago = misago\n\n// and export it for tests and stuff\nexport default misago\n\n// Register ajax loader events\ndocument.addEventListener(\"htmx:beforeRequest\", ({ target }) => {\n if (useLoader(target)) {\n loader.show()\n }\n})\n\ndocument.addEventListener(\"htmx:afterRequest\", ({ target }) => {\n if (useLoader(target)) {\n loader.hide()\n }\n})\n\n// Hide moderation modal after moderation action completes\ndocument.addEventListener(\"misago:afterModeration\", () => {\n $(\"#threads-moderation-modal\").modal(\"hide\")\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\n\nexport default function initializer() {\n ajax.init(misago.get(\"CSRF_COOKIE_NAME\"))\n}\n\nmisago.addInitializer({\n name: \"ajax\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport { patch } from \"misago/reducers/auth\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nconst AUTH_SYNC_RATE = 45 // sync user with backend every 45 seconds\n\nexport default function initializer(context) {\n if (context.get(\"isAuthenticated\")) {\n window.setInterval(function () {\n ajax.get(context.get(\"AUTH_API\")).then(\n function (data) {\n store.dispatch(patch(data))\n },\n function (rejection) {\n snackbar.apiError(rejection)\n }\n )\n }, AUTH_SYNC_RATE * 1000)\n }\n}\n\nmisago.addInitializer({\n name: \"auth-sync\",\n initializer: initializer,\n after: \"auth\",\n})\n","import misago from \"misago/index\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport store from \"misago/services/store\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n auth.init(store, storage, modal)\n}\n\nmisago.addInitializer({\n name: \"auth\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport captcha from \"misago/services/captcha\"\nimport include from \"misago/services/include\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer(context) {\n captcha.init(context, ajax, include, snackbar)\n}\n\nmisago.addInitializer({\n name: \"captcha\",\n initializer: initializer,\n})\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class AcceptAgreement extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = { submiting: false }\n }\n\n handleDecline = () => {\n if (this.state.submiting) return\n\n const confirmation = window.confirm(\n pgettext(\n \"accept agreement prompt\",\n \"Declining will result in immediate deactivation and deletion of your account. This action is not reversible.\"\n )\n )\n if (!confirmation) return\n\n this.setState({ submiting: true })\n\n ajax.post(this.props.api, { accept: false }).then(() => {\n window.location.reload(true)\n })\n }\n\n handleAccept = () => {\n if (this.state.submiting) return\n\n this.setState({ submiting: true })\n\n ajax.post(this.props.api, { accept: true }).then(() => {\n window.location.reload(true)\n })\n }\n\n render() {\n return (\n
    \n \n {pgettext(\"accept agreement choice\", \"Decline\")}\n \n \n {pgettext(\"accept agreement choice\", \"Accept and continue\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport AcceptAgreement from \"misago/components/accept-agreement\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n if (document.getElementById(\"required-agreement-mount\")) {\n mount(\n ,\n \"required-agreement-mount\",\n false\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:accept-agreement\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nexport default class extends React.Component {\n refresh() {\n window.location.reload()\n }\n\n getMessage() {\n if (this.props.signedIn) {\n return interpolate(\n pgettext(\n \"auth message\",\n \"You have signed in as %(username)s. Please refresh the page before continuing.\"\n ),\n { username: this.props.signedIn.username },\n true\n )\n } else if (this.props.signedOut) {\n return interpolate(\n pgettext(\n \"auth message\",\n \"%(username)s, you have been signed out. Please refresh the page before continuing.\"\n ),\n { username: this.props.user.username },\n true\n )\n }\n }\n\n render() {\n let className = \"auth-message\"\n if (this.props.signedIn || this.props.signedOut) {\n className += \" show\"\n }\n\n return (\n
    \n
    \n

    {this.getMessage()}

    \n

    \n \n {pgettext(\"auth message\", \"Reload page\")}\n \n \n {\" \" + pgettext(\"auth message\", \"or press F5 key.\")}\n \n

    \n
    \n
    \n )\n }\n}\n\nexport function select(state) {\n return {\n user: state.auth.user,\n signedIn: state.auth.signedIn,\n signedOut: state.auth.signedOut,\n }\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport AuthMessage, { select } from \"misago/components/auth-message\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(AuthMessage), \"auth-message-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:auth-message\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default function initializer(context) {\n if (context.has(\"BAN_MESSAGE\")) {\n showBannedPage(context.get(\"BAN_MESSAGE\"), false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:banmed-page\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport modal from \"../services/modal\"\nimport SignInModal from \"./sign-in\"\n\nclass SignInModalAutoOpen extends React.Component {\n componentDidMount() {\n const query = window.document.location.search\n if (query === \"?modal=login\") {\n window.setTimeout(() => modal.show(), 300)\n }\n }\n\n render() {\n return null\n }\n}\n\nexport default SignInModalAutoOpen\n","import React from \"react\"\n\nexport default function NavbarBranding({ logo, logoXs, text, url }) {\n if (logo) {\n return (\n
    \n \n {text}\n \n
    \n )\n }\n\n return (\n
    \n {!!logoXs && (\n \n {text}\n \n )}\n {!!text && (\n \n {text}\n \n )}\n
    \n )\n}\n","import React from \"react\"\n\nexport default function NavbarExtraMenu({ items }) {\n return (\n
      \n {items.map((item, index) => (\n
    • \n \n {item.title}\n \n
    • \n ))}\n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { DropdownFooter, DropdownHeader, DropdownPills } from \"../Dropdown\"\n\nexport default function NotificationsDropdownBody({\n children,\n showAll,\n showUnread,\n unread,\n}) {\n return (\n
    \n \n {pgettext(\"notifications title\", \"Notifications\")}\n \n \n \n {pgettext(\"notifications dropdown\", \"All\")}\n \n \n {pgettext(\"notifications dropdown\", \"Unread\")}\n \n \n {children}\n \n \n {pgettext(\"notifications\", \"See all notifications\")}\n \n \n
    \n )\n}\n\nfunction NotificationsDropdownBodyPill({ active, children, onClick }) {\n return (\n \n {children}\n \n )\n}\n","import NotificationsDropdown from \"./NotificationsDropdown\"\n\nexport default NotificationsDropdown\n","import React from \"react\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport {\n NotificationsList,\n NotificationsListError,\n NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsDropdownBody from \"./NotificationsDropdownBody\"\n\nexport default class NotificationsDropdown extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n unread: false,\n url: \"\",\n }\n }\n\n getApiUrl() {\n let url = misago.get(\"NOTIFICATIONS_API\") + \"?limit=20\"\n url += this.state.unread ? \"&filter=unread\" : \"\"\n return url\n }\n\n render = () => (\n this.setState({ unread: false })}\n showUnread={() => this.setState({ unread: true })}\n >\n \n {({ data, loading, error }) => {\n if (loading) {\n return \n }\n\n if (error) {\n return \n }\n\n return (\n \n )\n }}\n \n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarNotificationsToggle({\n id,\n className,\n badge,\n url,\n active,\n onClick,\n}) {\n const title = !!badge\n ? pgettext(\"navbar\", \"You have unread notifications!\")\n : pgettext(\"navbar\", \"Open notifications\")\n\n return (\n \n {!!badge && {badge}}\n \n {!!badge ? \"notifications_active\" : \"notifications_none\"}\n \n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NotificationsDropdown from \"../NotificationsDropdown\"\nimport NavbarNotificationsToggle from \"./NavbarNotificationsToggle\"\n\nexport default function NavbarNotificationsDropdown({\n id,\n className,\n badge,\n url,\n}) {\n return (\n (\n {\n event.preventDefault()\n toggle()\n }}\n />\n )}\n menuClassName=\"notifications-dropdown\"\n menuAlignRight\n >\n {({ isOpen }) => }\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarPrivateThreads({\n id,\n className,\n badge,\n url,\n active,\n onClick,\n}) {\n const title = !!badge\n ? pgettext(\"navbar\", \"You have unread private threads!\")\n : pgettext(\"navbar\", \"Open private threads\")\n\n return (\n \n {!!badge && {badge}}\n inbox\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarSearchToggle({\n id,\n className,\n url,\n active,\n onClick,\n}) {\n return (\n \n search\n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport { SearchDropdown } from \"../Search\"\nimport NavbarSearchToggle from \"./NavbarSearchToggle\"\n\nexport default function NavbarSearchDropdown({ id, className, url }) {\n return (\n (\n {\n event.preventDefault()\n toggle()\n\n window.setTimeout(() => {\n document\n .querySelector(\".search-dropdown .form-control-search\")\n .focus()\n }, 0)\n }}\n />\n )}\n menuClassName=\"search-dropdown\"\n menuAlignRight\n >\n {() => }\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarSiteNavToggle({\n id,\n className,\n active,\n onClick,\n}) {\n return (\n \n menu\n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NavbarSiteNavToggle from \"./NavbarSiteNavToggle\"\nimport { SiteNavDropdown } from \"../SiteNav\"\n\nexport default function NavbarSiteNavDropdown({ id, className }) {\n return (\n (\n \n )}\n menuClassName=\"site-nav-dropdown\"\n menuAlignRight\n >\n {({ isOpen, close }) => }\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport Avatar from \"../avatar\"\n\nexport default function NavbarUserNavToggle({\n id,\n className,\n user,\n active,\n onClick,\n}) {\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NavbarUserNavToggle from \"./NavbarUserNavToggle\"\nimport { UserNavDropdown } from \"../UserNav\"\n\nexport default function NavbarUserNavDropdown({ id, className, user }) {\n return (\n (\n {\n event.preventDefault()\n toggle()\n }}\n />\n )}\n menuClassName=\"user-nav-dropdown\"\n menuAlignRight\n >\n {({ isOpen, close }) => }\n \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport * as overlay from \"../../reducers/overlay\"\nimport RegisterButton from \"../RegisterButton\"\nimport SignInButton from \"../SignInButton\"\nimport SignInModalAutoOpen from \"../SignInModalAutoOpen\"\nimport NavbarBranding from \"./NavbarBranding\"\nimport NavbarExtraMenu from \"./NavbarExtraMenu\"\nimport NavbarNotificationsDropdown from \"./NavbarNotificationsDropdown\"\nimport NavbarNotificationsToggle from \"./NavbarNotificationsToggle\"\nimport NavbarPrivateThreads from \"./NavbarPrivateThreads\"\nimport NavbarSearchDropdown from \"./NavbarSearchDropdown\"\nimport NavbarSearchToggle from \"./NavbarSearchToggle\"\nimport NavbarSiteNavDropdown from \"./NavbarSiteNavDropdown\"\nimport NavbarSiteNavToggle from \"./NavbarSiteNavToggle\"\nimport NavbarUserNavDropdown from \"./NavbarUserNavDropdown\"\nimport NavbarUserNavToggle from \"./NavbarUserNavToggle\"\n\nexport function Navbar({\n dispatch,\n branding,\n extraMenuItems,\n authDelegated,\n user,\n searchUrl,\n notificationsUrl,\n privateThreadsUrl,\n showSearch,\n showPrivateThreads,\n}) {\n return (\n
    \n \n
    \n {extraMenuItems.length > 0 && (\n \n )}\n {!!showSearch && (\n \n )}\n {!!showSearch && (\n {\n dispatch(overlay.openSearch())\n event.preventDefault()\n }}\n />\n )}\n \n {\n dispatch(overlay.openSiteNav())\n }}\n />\n {!!showPrivateThreads && (\n \n )}\n {!!user && (\n \n )}\n {!!user && (\n {\n dispatch(overlay.openNotifications())\n event.preventDefault()\n }}\n />\n )}\n {!!user && (\n \n )}\n {!!user && (\n {\n dispatch(overlay.openUserNav())\n event.preventDefault()\n }}\n />\n )}\n {!user && }\n {!user && !authDelegated && (\n \n )}\n {!user && !authDelegated && }\n
    \n
    \n )\n}\n\nfunction select(state) {\n const settings = misago.get(\"SETTINGS\")\n const user = state.auth.user\n\n return {\n branding: {\n logo: settings.logo,\n logoXs: settings.logo_small,\n text: settings.logo_text,\n url: misago.get(\"MISAGO_PATH\"),\n },\n extraMenuItems: misago.get(\"extraMenuItems\"),\n\n user: !user.id\n ? null\n : {\n id: user.id,\n username: user.username,\n email: user.email,\n avatars: user.avatars,\n unreadNotifications: user.unreadNotifications,\n unreadPrivateThreads: user.unread_private_threads,\n url: user.url,\n },\n\n searchUrl: misago.get(\"SEARCH_URL\"),\n notificationsUrl: misago.get(\"NOTIFICATIONS_URL\"),\n privateThreadsUrl: misago.get(\"PRIVATE_THREADS_URL\"),\n\n authDelegated: settings.enable_oauth2_client,\n showSearch: !!user.acl.can_search,\n showPrivateThreads: !!user && !!user.acl.can_use_private_threads,\n }\n}\n\nconst NavbarConnected = connect(select)(Navbar)\n\nexport default NavbarConnected\n","import Navbar from \"./Navbar\"\n\nexport default Navbar\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport Navbar from \"../../components/Navbar\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"misago-navbar\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:navbar\",\n initializer: initializer,\n after: \"store\",\n})\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { DropdownFooter, DropdownPills } from \"../Dropdown\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\n\nexport default function NotificationsOverlayBody({\n children,\n open,\n showAll,\n showUnread,\n unread,\n}) {\n return (\n \n \n {pgettext(\"notifications title\", \"Notifications\")}\n \n \n \n {pgettext(\"notifications dropdown\", \"All\")}\n \n \n {pgettext(\"notifications dropdown\", \"Unread\")}\n \n \n {children}\n \n \n {pgettext(\"notifications\", \"See all notifications\")}\n \n \n \n )\n}\n\nfunction NotificationsOverlayBodyPill({ active, children, onClick }) {\n return (\n \n {children}\n \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport {\n NotificationsList,\n NotificationsListError,\n NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsOverlayBody from \"./NotificationsOverlayBody\"\n\nclass NotificationsOverlay extends React.Component {\n constructor(props) {\n super(props)\n\n this.body = document.body\n\n this.state = {\n unread: false,\n url: \"\",\n }\n }\n\n getApiUrl() {\n let url = misago.get(\"NOTIFICATIONS_API\") + \"?limit=20\"\n url += this.state.unread ? \"&filter=unread\" : \"\"\n return url\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.open !== this.props.open) {\n if (this.props.open) {\n this.body.classList.add(\"notifications-fullscreen\")\n } else {\n this.body.classList.remove(\"notifications-fullscreen\")\n }\n }\n }\n\n render = () => (\n this.setState({ unread: false })}\n showUnread={() => this.setState({ unread: true })}\n >\n \n {({ data, loading, error }) => {\n if (loading) {\n return \n }\n\n if (error) {\n return \n }\n\n return (\n \n )\n }}\n \n \n )\n}\n\nfunction select(state) {\n return { open: state.overlay.notifications }\n}\n\nconst NotificationsOverlayConnected = connect(select)(NotificationsOverlay)\n\nexport default NotificationsOverlayConnected\n","import NotificationsOverlay from \"./NotificationsOverlay\"\n\nexport default NotificationsOverlay\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport NotificationsOverlay from \"../../components/NotificationsOverlay\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n if (context.get(\"isAuthenticated\")) {\n const root = document.getElementById(\"notifications-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:notifications-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport { PageHeaderPlain } from \"../PageHeader\"\n\nexport default function NotificationsHeader() {\n return (\n \n )\n}\n","import PageTitle from \"./PageTitle\"\n\nexport default PageTitle\n","export default function PageTitle({ title, subtitle }) {\n const parts = []\n if (subtitle) {\n parts.push(subtitle)\n }\n if (title) {\n parts.push(title)\n }\n parts.push(misago.get(\"SETTINGS\").forum_name)\n\n document.title = parts.join(\" | \")\n return null\n}\n","import React from \"react\"\n\nexport default function PillsNav({ children }) {\n return
      {children}
    \n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function PillsNavLink({ active, link, icon, children }) {\n return (\n
  • \n \n {!!icon && {icon}}\n {children}\n \n
  • \n )\n}\n","import React from \"react\"\nimport { PillsNav, PillsNavLink } from \"../PillsNav\"\nimport { Toolbar, ToolbarSection, ToolbarItem } from \"../Toolbar\"\n\nexport default function NotificationsPills({ filter }) {\n const basename = misago.get(\"NOTIFICATIONS_URL\")\n\n return (\n \n \n \n \n \n {pgettext(\"notifications nav\", \"All\")}\n \n \n {pgettext(\"notifications nav\", \"Unread\")}\n \n \n {pgettext(\"notifications nav\", \"Read\")}\n \n \n \n \n \n )\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function NotificationsPagination({ baseUrl, data, disabled }) {\n return (\n
    \n \n {pgettext(\"notifications pagination\", \"Latest\")}\n \n \n {pgettext(\"notifications pagination\", \"Newer\")}\n \n \n {pgettext(\"notifications pagination\", \"Older\")}\n \n
    \n )\n}\n\nfunction NotificationsPaginationLink({ disabled, children, url }) {\n if (disabled) {\n return (\n \n )\n }\n\n return (\n \n {children}\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport Button from \"../button\"\nimport { Toolbar, ToolbarSection, ToolbarItem, ToolbarSpacer } from \"../Toolbar\"\nimport NotificationsPagination from \"./NotificationsPagination\"\n\nexport default function NotificationsToolbar({\n baseUrl,\n data,\n disabled,\n bottom,\n markAllAsRead,\n}) {\n return (\n \n \n \n \n \n \n \n \n \n \n done_all\n {pgettext(\"notifications\", \"Mark all as read\")}\n \n \n \n \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { updateAuthenticatedUser } from \"../../reducers/auth\"\nimport snackbar from \"../../services/snackbar\"\nimport { ApiMutation } from \"../Api\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport PageTitle from \"../PageTitle\"\nimport PageContainer from \"../PageContainer\"\nimport {\n NotificationsList,\n NotificationsListError,\n NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsPills from \"./NotificationsPills\"\nimport NotificationsToolbar from \"./NotificationsToolbar\"\n\nfunction NotificationsRoute({ dispatch, location, route }) {\n const { query } = location\n const { filter } = route.props\n\n const baseUrl = getBaseUrl(filter)\n\n return (\n \n \n\n \n\n \n {({ data, loading, error, refetch }) => (\n \n {(readAll, { loading: mutating }) => {\n const toolbarProps = {\n baseUrl,\n data,\n disabled:\n loading || mutating || !data || data.results.length === 0,\n markAllAsRead: async () => {\n const confirmed = window.confirm(\n pgettext(\"notifications\", \"Mark all notifications as read?\")\n )\n\n if (confirmed) {\n readAll({\n onSuccess: async () => {\n refetch()\n dispatch(\n updateAuthenticatedUser({ unreadNotifications: null })\n )\n snackbar.success(\n pgettext(\n \"notifications\",\n \"All notifications have been marked as read.\"\n )\n )\n },\n onError: snackbar.apiError,\n })\n }\n },\n }\n\n if (loading || mutating) {\n return (\n
    \n \n \n \n
    \n )\n }\n\n if (error) {\n return (\n
    \n \n \n \n
    \n )\n }\n\n if (data) {\n if (!data.hasPrevious && query) {\n window.history.replaceState({}, \"\", baseUrl)\n }\n\n return (\n
    \n \n \n \n
    \n )\n }\n\n return null\n }}\n
    \n )}\n
    \n
    \n )\n}\n\nfunction getSubtitle(filter) {\n if (filter === \"unread\") {\n return pgettext(\"notifications title\", \"Unread notifications\")\n } else if (filter === \"read\") {\n return pgettext(\"notifications title\", \"Read notifications\")\n } else {\n return null\n }\n}\n\nfunction getBaseUrl(filter) {\n let url = misago.get(\"NOTIFICATIONS_URL\")\n if (filter !== \"all\") {\n url += filter + \"/\"\n }\n return url\n}\n\nconst NotificationsRouteConnected = connect()(NotificationsRoute)\n\nexport default NotificationsRouteConnected\n","import Notifications from \"./Notifications\"\nimport NotificationsFetch from \"../NotificationsFetch/NotificationsFetch\"\n\nexport default Notifications\n\nexport { NotificationsFetch }\n","import React from \"react\"\nimport { Router, browserHistory } from \"react-router\"\nimport NotificationsHeader from \"./NotificationsHeader\"\nimport NotificationsRoute from \"./NotificationsRoute\"\n\nexport default function Notifications() {\n const basename = misago.get(\"NOTIFICATIONS_URL\")\n\n return (\n
    \n \n \n
    \n )\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport Notifications from \"../../components/Notifications\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const basename = misago.get(\"NOTIFICATIONS_URL\")\n if (\n document.location.pathname.startsWith(basename) &&\n !document.location.pathname.startsWith(basename + \"disable-email/\") &&\n context.get(\"isAuthenticated\")\n ) {\n const root = document.getElementById(\"page-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:notifications\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n \n
    \n )\n }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport PanelLoader from \"misago/components/panel-loader\"\nimport PanelMessage from \"misago/components/panel-message\"\nimport misago from \"misago/index\"\nimport polls from \"misago/services/polls\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"PROFILE_BAN\")) {\n this.initWithPreloadedData(misago.pop(\"PROFILE_BAN\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling(props.profile.api.ban)\n }\n\n initWithPreloadedData(ban) {\n if (ban.expires_on) {\n ban.expires_on = moment(ban.expires_on)\n }\n\n this.state = {\n isLoaded: true,\n ban,\n }\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling(api) {\n polls.start({\n poll: \"ban-details\",\n url: api,\n frequency: 90 * 1000,\n update: this.update,\n error: this.error,\n })\n }\n\n update = (ban) => {\n if (ban.expires_on) {\n ban.expires_on = moment(ban.expires_on)\n }\n\n this.setState({\n isLoaded: true,\n error: null,\n\n ban,\n })\n }\n\n error = (error) => {\n this.setState({\n isLoaded: true,\n error: error.detail,\n ban: null,\n })\n }\n\n componentDidMount() {\n title.set({\n title: pgettext(\"profile ban details title\", \"Ban details\"),\n parent: this.props.profile.username,\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"ban-details\")\n }\n\n getUserMessage() {\n if (this.state.ban.user_message) {\n return (\n
    \n

    {pgettext(\"profile ban details\", \"User-shown ban message\")}

    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getStaffMessage() {\n if (this.state.ban.staff_message) {\n return (\n
    \n

    {pgettext(\"profile ban details\", \"Team-shown ban message\")}

    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getExpirationMessage() {\n if (this.state.ban.expires_on) {\n if (this.state.ban.expires_on.isAfter(moment())) {\n let title = interpolate(\n pgettext(\n \"profile ban details\",\n \"This ban expires on %(expires_on)s.\"\n ),\n {\n expires_on: this.state.ban.expires_on.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n pgettext(\"profile ban details\", \"This ban expires %(expires_on)s.\"),\n {\n expires_on: this.state.ban.expires_on.fromNow(),\n },\n true\n )\n\n return {message}\n } else {\n return pgettext(\"profile ban details\", \"This ban has expired.\")\n }\n } else {\n return interpolate(\n pgettext(\"profile ban details\", \"%(username)s's ban is permanent.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getPanelBody() {\n if (this.state.ban) {\n if (Object.keys(this.state.ban).length) {\n return (\n
    \n {this.getUserMessage()}\n {this.getStaffMessage()}\n\n
    \n

    {pgettext(\"profile ban details\", \"Ban expiration\")}

    \n

    {this.getExpirationMessage()}

    \n
    \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n } else if (this.state.error) {\n return (\n
    \n \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n

    \n {pgettext(\"profile ban details title\", \"Ban details\")}\n

    \n
    \n\n {this.getPanelBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default function ({ display }) {\n if (!display) return null\n\n return (\n \n )\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({ display }) {\n if (!display) return null\n\n return (\n
    \n \n
    \n )\n}\n","import React from \"react\"\nimport Select from \"misago/components/select\"\n\nexport default class extends React.Component {\n onChange = (ev) => {\n const { field, onChange } = this.props\n onChange(field.fieldname, ev.target.value)\n }\n\n render() {\n const { disabled, field, value } = this.props\n const { input } = field\n\n if (input.type === \"select\") {\n return (\n \n )\n }\n\n if (input.type === \"textarea\") {\n return (\n \n )\n }\n\n if (input.type === \"text\") {\n return (\n \n )\n }\n\n return null\n }\n}\n","import React from \"react\"\nimport FieldInput from \"./field-input\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport default function ({ disabled, errors, fields, name, onChange, value }) {\n return (\n
    \n {name}\n {fields.map((field) => {\n return (\n \n \n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Fieldset from \"./fieldset\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n errors: {},\n }\n\n const groups = props.groups.length\n for (let i = 0; i < groups; i++) {\n const group = props.groups[i]\n const fields = group.fields.length\n for (let f = 0; f < fields; f++) {\n const fieldname = group.fields[f].fieldname\n const initial = group.fields[f].initial\n this.state[fieldname] = initial\n }\n }\n }\n\n send() {\n const data = Object.assign({}, this.state, {\n errors: null,\n isLoading: null,\n })\n\n return ajax.post(this.props.api, data)\n }\n\n handleSuccess(data) {\n this.props.onSuccess(data)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({ errors: rejection })\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onChange = (name, value) => {\n this.setState({\n [name]: value,\n })\n }\n\n render() {\n return (\n
    \n
    \n {this.props.groups.map((group, i) => {\n return (\n \n )\n })}\n
    \n
    \n {\" \"}\n \n
    \n
    \n )\n }\n}\n\nexport function CancelButton({ onCancel, disabled }) {\n if (!onCancel) return null\n\n return (\n \n {pgettext(\"user profile details form btn\", \"Cancel\")}\n \n )\n}\n","import React from \"react\"\nimport Blankslate from \"./blankslate\"\nimport Loader from \"./loader\"\nimport Form from \"./form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n loading: true,\n groups: null,\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.api).then(\n (groups) => {\n this.setState({\n loading: false,\n\n groups,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n if (this.props.cancel) {\n this.props.cancel()\n }\n }\n )\n }\n\n render() {\n const { groups, loading } = this.state\n\n return (\n
    \n
    \n

    \n {pgettext(\"user profile details form title\", \"Edit details\")}\n

    \n
    \n \n \n \n
    \n )\n }\n}\n\nexport function FormDisplay({ api, display, groups, onCancel, onSuccess }) {\n if (!display) return null\n\n return (\n
    \n )\n}\n","import React from \"react\"\nimport Form from \"misago/components/edit-details\"\n\nexport default function ({ api, display, onCancel, onSuccess }) {\n if (!display) return null\n\n return \n}\n","import React from \"react\"\n\nexport default function ({ isAuthenticated, profile }) {\n let message = null\n if (isAuthenticated) {\n message = pgettext(\n \"profile details empty\",\n \"You are not sharing any details with others.\"\n )\n } else {\n message = interpolate(\n pgettext(\n \"profile details empty\",\n \"%(username)s is not sharing any details with others.\"\n ),\n {\n username: profile.username,\n },\n true\n )\n }\n\n return (\n
    \n
    {message}
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ html, text, url }) {\n if (html) {\n return (\n \n )\n }\n\n return (\n
    \n \n
    \n )\n}\n\nexport function SafeValue({ text, url }) {\n if (url) {\n return (\n

    \n \n {text || url}\n \n

    \n )\n }\n\n if (text) {\n return

    {text}

    \n }\n\n return null\n}\n","import React from \"react\"\nimport FieldValue from \"./field-value\"\n\nexport default function (props) {\n return (\n
    \n {props.name}:\n \n
    \n )\n}\n","import React from \"react\"\nimport Field from \"./field\"\n\nexport default function ({ fields, name }) {\n return (\n
    \n
    \n

    {name}

    \n
    \n
    \n
    \n {fields.map(({ fieldname, html, name, text, url }) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport EmptyMessage from \"./empty-message\"\nimport Group from \"./group\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({\n display,\n groups,\n isAuthenticated,\n loading,\n profile,\n}) {\n if (!display) return null\n\n if (loading) {\n return \n }\n\n if (!groups.length) {\n return \n }\n\n return (\n
    \n {groups.map((group, i) => {\n return \n })}\n
    \n )\n}\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nconst ProfileDetailsHeader = ({ onEdit, showEditButton }) => (\n \n \n \n

    {pgettext(\"profile details title\", \"Details\")}

    \n
    \n
    \n {showEditButton && (\n \n \n \n {pgettext(\"profile details edit btn\", \"Edit\")}\n \n \n \n )}\n
    \n)\n\nexport default ProfileDetailsHeader\n","import React from \"react\"\nimport { load } from \"misago/reducers/profile-details\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n componentDidMount() {\n const { data, dispatch, user } = this.props\n if (data && data.id === user.id) return\n\n ajax.get(this.props.user.api.details).then(\n (data) => {\n dispatch(load(data))\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n return this.props.children\n }\n}\n","import React from \"react\"\nimport Form from \"./form\"\nimport GroupsList from \"./groups-list\"\nimport Header from \"./header\"\nimport ProfileDetailsData from \"misago/data/profile-details\"\nimport { load as loadDetails } from \"misago/reducers/profile-details\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n editing: false,\n }\n }\n\n componentDidMount() {\n title.set({\n title: pgettext(\"profile details title\", \"Details\"),\n parent: this.props.profile.username,\n })\n }\n\n onCancel = () => {\n this.setState({ editing: false })\n }\n\n onEdit = () => {\n this.setState({ editing: true })\n }\n\n onSuccess = (newDetails) => {\n const { dispatch, isAuthenticated, profile } = this.props\n\n let message = null\n if (isAuthenticated) {\n message = pgettext(\n \"profile details form\",\n \"Your details have been changed.\"\n )\n } else {\n message = interpolate(\n pgettext(\n \"profile details form\",\n \"%(username)s's details have been changed.\"\n ),\n {\n username: profile.username,\n },\n true\n )\n }\n\n snackbar.info(message)\n dispatch(loadDetails(newDetails))\n this.setState({ editing: false })\n }\n\n render() {\n const { dispatch, isAuthenticated, profile, profileDetails } = this.props\n const loading = profileDetails.id !== profile.id\n\n return (\n \n
    \n \n \n \n
    \n \n )\n }\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport * as posts from \"misago/reducers/posts\"\nimport title from \"misago/services/page-title\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n loadItems(start = 0) {\n ajax\n .get(this.props.api, {\n start: start || 0,\n })\n .then(\n (data) => {\n if (start === 0) {\n store.dispatch(posts.load(data))\n } else {\n store.dispatch(posts.append(data))\n }\n\n this.setState({\n isLoading: false,\n })\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.apiError(rejection)\n }\n )\n }\n\n loadMore = () => {\n this.setState({\n isLoading: true,\n })\n\n this.loadItems(this.props.posts.next)\n }\n\n componentDidMount() {\n title.set({\n title: this.props.title,\n parent: this.props.profile.username,\n })\n\n this.loadItems()\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.props.header}

    \n
    \n
    \n
    \n \n
    \n )\n }\n}\n\nexport function Feed(props) {\n if (props.posts.isLoaded && !props.posts.results.length) {\n return

    {props.emptyMessage}

    \n }\n\n return (\n
    \n \n \n
    \n )\n}\n\nexport function LoadMoreButton(props) {\n if (!props.next) return null\n\n return (\n
    \n \n {pgettext(\"profile load more btn\", \"Show older activity\")}\n \n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.className) {\n return \"form-search \" + this.props.className\n } else {\n return \"form-search\"\n }\n }\n\n render() {\n return (\n
    \n \n search\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsersList from \"misago/components/users-list\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.setSpecialProps()\n\n if (misago.has(this.PRELOADED_DATA_KEY)) {\n this.initWithPreloadedData(misago.pop(this.PRELOADED_DATA_KEY))\n } else {\n this.initWithoutPreloadedData()\n }\n }\n\n setSpecialProps() {\n this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWERS\"\n this.TITLE = pgettext(\"profile followers title\", \"Followers\")\n this.API_FILTER = \"followers\"\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n isBusy: false,\n\n search: \"\",\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n isBusy: false,\n\n search: \"\",\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n }\n\n this.loadUsers()\n }\n\n loadUsers(page = 1, search = null) {\n const apiUrl = this.props.profile.api[this.API_FILTER]\n\n ajax\n .get(\n apiUrl,\n {\n search: search,\n page: page || 1,\n },\n \"user-\" + this.API_FILTER\n )\n .then(\n (data) => {\n if (page === 1) {\n store.dispatch(hydrate(data.results))\n } else {\n store.dispatch(append(data.results))\n }\n\n this.setState({\n isLoaded: true,\n isBusy: false,\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n componentDidMount() {\n title.set({\n title: this.TITLE,\n parent: this.props.profile.username,\n })\n }\n\n loadMore = () => {\n this.setState({\n isBusy: true,\n })\n\n this.loadUsers(this.state.page + 1, this.state.search)\n }\n\n search = (ev) => {\n this.setState({\n isLoaded: false,\n isBusy: true,\n\n search: ev.target.value,\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n })\n\n this.loadUsers(1, ev.target.value)\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return pgettext(\"Loading...\")\n } else if (this.state.search) {\n let message = npgettext(\n \"profile followers\",\n \"Found %(users)s user.\",\n \"Found %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = npgettext(\n \"profile followers\",\n \"You have %(users)s follower.\",\n \"You have %(users)s followers.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else {\n let message = npgettext(\n \"profile followers\",\n \"%(username)s has %(users)s follower.\",\n \"%(username)s has %(users)s followers.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n users: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return pgettext(\n \"profile followers\",\n \"Search returned no users matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return pgettext(\"profile followers\", \"You have no followers.\")\n } else {\n return interpolate(\n pgettext(\"profile followers\", \"%(username)s has no followers.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getMoreButton() {\n if (!this.state.more) return null\n\n return (\n
    \n \n {interpolate(\n pgettext(\"profile followers\", \"Show more (%(more)s)\"),\n {\n more: this.state.more,\n },\n true\n )}\n \n
    \n )\n }\n\n getListBody() {\n if (this.state.isLoaded && this.state.count === 0) {\n return

    {this.getEmptyMessage()}

    \n }\n\n return (\n
    \n \n\n {this.getMoreButton()}\n
    \n )\n }\n\n getClassName() {\n return \"profile-\" + this.API_FILTER\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.getLabel()}

    \n
    \n
    \n \n \n \n \n \n
    \n\n {this.getListBody()}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Followers from \"misago/components/profile/followers\"\n\nexport default class extends Followers {\n setSpecialProps() {\n this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWS\"\n this.TITLE = pgettext(\"profile follows title\", \"Follows\")\n this.API_FILTER = \"follows\"\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return pgettext(\"profile follows\", \"Loading...\")\n } else if (this.state.search) {\n let message = npgettext(\n \"profile follows\",\n \"Found %(users)s user.\",\n \"Found %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = npgettext(\n \"profile follows\",\n \"You are following %(users)s user.\",\n \"You are following %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else {\n let message = npgettext(\n \"profile follows\",\n \"%(username)s is following %(users)s user.\",\n \"%(username)s is following %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n users: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return pgettext(\n \"profile follows\",\n \"Search returned no users matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return pgettext(\"profile follows\", \"You are not following any users.\")\n } else {\n return interpolate(\n pgettext(\"profile follows\", \"%(username)s is not following any users.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getEmptyMessage() {\n if (this.props.emptyMessage) {\n return this.props.emptyMessage\n } else {\n return pgettext(\n \"username history empty\",\n \"Your account has no history of name changes.\"\n )\n }\n }\n\n render() {\n return (\n
    \n
      \n
    • \n {this.getEmptyMessage()}\n
    • \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default class extends React.Component {\n renderUserAvatar() {\n if (this.props.change.changed_by) {\n return (\n \n \n \n )\n } else {\n return (\n \n \n \n )\n }\n }\n\n renderUsername() {\n if (this.props.change.changed_by) {\n return (\n \n {this.props.change.changed_by.username}\n \n )\n } else {\n return (\n \n {this.props.change.changed_by_username}\n \n )\n }\n }\n\n render() {\n return (\n
  • \n
    {this.renderUserAvatar()}
    \n
    {this.renderUsername()}
    \n
    \n {this.props.change.old_username}\n arrow_forward\n {this.props.change.new_username}\n
    \n
    \n \n {this.props.change.changed_on.fromNow()}\n \n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport Change from \"misago/components/username-history/change\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n
      \n {this.props.changes.map((change) => {\n return \n })}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n getClassName() {\n if (this.props.hiddenOnMobile) {\n return \"list-group-item hidden-xs hidden-sm\"\n } else {\n return \"list-group-item\"\n }\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n
    \n \n  \n \n
    \n
    \n \n  \n \n arrow_forward\n \n  \n \n
    \n
    \n \n  \n \n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ChangePreview from \"misago/components/username-history/change-preview\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n
      \n {[0, 1, 2].map((i) => {\n return 0} key={i} />\n })}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/username-history/list-empty\"\nimport ListReady from \"misago/components/username-history/list-ready\"\nimport ListPreview from \"misago/components/username-history/list-preview\"\n\nexport default class extends React.Component {\n render() {\n if (this.props.isLoaded) {\n if (this.props.changes.length) {\n return \n } else {\n return \n }\n } else {\n return \n }\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsernameHistory from \"misago/components/username-history/root\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/username-history\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"PROFILE_NAME_HISTORY\")) {\n this.initWithPreloadedData(misago.pop(\"PROFILE_NAME_HISTORY\"))\n } else {\n this.initWithoutPreloadedData()\n }\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n isBusy: false,\n\n search: \"\",\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n isBusy: false,\n\n search: \"\",\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n }\n\n this.loadChanges()\n }\n\n loadChanges(page = 1, search = null) {\n ajax\n .get(\n misago.get(\"USERNAME_CHANGES_API\"),\n {\n user: this.props.profile.id,\n search: search,\n page: page || 1,\n },\n \"search-username-history\"\n )\n .then(\n (data) => {\n if (page === 1) {\n store.dispatch(hydrate(data.results))\n } else {\n store.dispatch(append(data.results))\n }\n\n this.setState({\n isLoaded: true,\n isBusy: false,\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n componentDidMount() {\n title.set({\n title: pgettext(\"profile username history title\", \"Username history\"),\n parent: this.props.profile.username,\n })\n }\n\n loadMore = () => {\n this.setState({\n isBusy: true,\n })\n\n this.loadChanges(this.state.page + 1, this.state.search)\n }\n\n search = (ev) => {\n this.setState({\n isLoaded: false,\n isBusy: true,\n\n search: ev.target.value,\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n })\n\n this.loadChanges(1, ev.target.value)\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return pgettext(\"profile username history\", \"Loading...\")\n } else if (this.state.search) {\n let message = npgettext(\n \"profile username history\",\n \"Found %(changes)s username change.\",\n \"Found %(changes)s username changes.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n changes: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = npgettext(\n \"profile username history\",\n \"Your username was changed %(changes)s time.\",\n \"Your username was changed %(changes)s times.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n changes: this.state.count,\n },\n true\n )\n } else {\n let message = npgettext(\n \"profile username history\",\n \"%(username)s's username was changed %(changes)s time.\",\n \"%(username)s's username was changed %(changes)s times.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n changes: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return pgettext(\n \"profile username history\",\n \"Search returned no username changes matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return pgettext(\n \"username history empty\",\n \"Your account has no history of name changes.\"\n )\n } else {\n return interpolate(\n pgettext(\n \"profile username history\",\n \"%(username)s's username was never changed.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getMoreButton() {\n if (!this.state.more) return null\n\n return (\n
    \n \n {interpolate(\n pgettext(\"profile username history\", \"Show older (%(more)s)\"),\n {\n more: this.state.more,\n },\n true\n )}\n \n
    \n )\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.getLabel()}

    \n
    \n
    \n \n \n \n \n \n
    \n\n \n\n {this.getMoreButton()}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport { patch } from \"misago/reducers/profile\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n getClassName() {\n if (this.props.profile.is_followed) {\n return this.props.className + \" btn-default btn-following\"\n } else {\n return this.props.className + \" btn-default btn-follow\"\n }\n }\n\n getIcon() {\n if (this.props.profile.is_followed) {\n return \"favorite\"\n } else {\n return \"favorite_border\"\n }\n }\n\n getLabel() {\n if (this.props.profile.is_followed) {\n return pgettext(\"user profile follow btn\", \"Following\")\n } else {\n return pgettext(\"user profile follow btn\", \"Follow\")\n }\n }\n\n action = () => {\n this.setState({\n isLoading: true,\n })\n\n if (this.props.profile.is_followed) {\n store.dispatch(\n patch({\n is_followed: false,\n followers: this.props.profile.followers - 1,\n })\n )\n } else {\n store.dispatch(\n patch({\n is_followed: true,\n followers: this.props.profile.followers + 1,\n })\n )\n }\n\n ajax.post(this.props.profile.api.follow).then(\n (data) => {\n this.setState({\n isLoading: false,\n })\n\n store.dispatch(patch(data))\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n })\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n return (\n \n {this.getIcon()}\n {this.getLabel()}\n \n )\n }\n}\n","import React from \"react\"\nimport posting from \"misago/services/posting\"\nimport misago from \"misago\"\n\nexport default class extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"START_PRIVATE\",\n submit: misago.get(\"PRIVATE_THREADS_API\"),\n\n to: [this.props.profile],\n })\n }\n\n render() {\n const canMessage = this.props.user.acl.can_start_private_threads\n const isProfileOwner = this.props.user.id === this.props.profile.id\n\n if (!canMessage || isProfileOwner) return null\n\n return (\n \n comment\n {pgettext(\"profile message btn\", \"Message\")}\n \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { updateAvatar } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n error: null,\n\n is_avatar_locked: \"\",\n avatar_lock_user_message: \"\",\n avatar_lock_staff_message: \"\",\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.moderate_avatar).then(\n (options) => {\n this.setState({\n isLoaded: true,\n\n is_avatar_locked: options.is_avatar_locked,\n avatar_lock_user_message: options.avatar_lock_user_message || \"\",\n avatar_lock_staff_message: options.avatar_lock_staff_message || \"\",\n })\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(this.validate().username[0])\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.profile.api.moderate_avatar, {\n is_avatar_locked: this.state.is_avatar_locked,\n avatar_lock_user_message: this.state.avatar_lock_user_message,\n avatar_lock_staff_message: this.state.avatar_lock_staff_message,\n })\n }\n\n handleSuccess(apiResponse) {\n store.dispatch(updateAvatar(this.props.profile, apiResponse.avatar_hash))\n snackbar.success(\n pgettext(\n \"profile avatar moderation\",\n \"Avatar controls have been changed.\"\n )\n )\n }\n\n getFormBody() {\n return (\n \n
    \n \n \n \n\n \n \n \n\n \n \n \n
    \n
    \n \n {pgettext(\"profile avatar moderation btn\", \"Close\")}\n \n \n
    \n \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n return this.getFormBody()\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error) {\n return \"modal-dialog modal-message modal-avatar-controls\"\n } else {\n return \"modal-dialog modal-avatar-controls\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"profile avatar moderation title\", \"Avatar controls\")}\n

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { addNameChange } from \"misago/reducers/username-history\"\nimport { updateUsername } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n error: null,\n\n username: \"\",\n validators: {\n username: [validators.usernameContent()],\n },\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.moderate_username).then(\n () => {\n this.setState({\n isLoaded: true,\n })\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(this.validate().username[0])\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.profile.api.moderate_username, {\n username: this.state.username,\n })\n }\n\n handleSuccess(apiResponse) {\n this.setState({\n username: \"\",\n })\n\n store.dispatch(\n addNameChange(apiResponse, this.props.profile, this.props.user)\n )\n store.dispatch(\n updateUsername(this.props.profile, apiResponse.username, apiResponse.slug)\n )\n\n snackbar.success(\n pgettext(\"profile username moderation\", \"Username has been changed.\")\n )\n }\n\n getFormBody() {\n return (\n
    \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"profile username moderation btn\", \"Cancel\")}\n \n \n
    \n
    \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n return this.getFormBody()\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error) {\n return \"modal-dialog modal-message modal-rename-user\"\n } else {\n return \"modal-dialog modal-rename-user\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"profile username moderation title\", \"Change username\")}\n

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport polls from \"misago/services/polls\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n isDeleted: false,\n error: null,\n\n countdown: 5,\n confirm: false,\n\n with_content: false,\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.delete).then(\n () => {\n this.setState({\n isLoaded: true,\n })\n\n this.countdown()\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n countdown = () => {\n window.setTimeout(() => {\n if (this.state.countdown > 1) {\n this.setState({\n countdown: this.state.countdown - 1,\n })\n this.countdown()\n } else if (!this.state.confirm) {\n this.setState({\n confirm: true,\n })\n }\n }, 1000)\n }\n\n send() {\n return ajax.post(this.props.profile.api.delete, {\n with_content: this.state.with_content,\n })\n }\n\n handleSuccess() {\n polls.stop(\"user-profile\")\n\n if (this.state.with_content) {\n this.setState({\n isDeleted: interpolate(\n pgettext(\n \"profile delete\",\n \"%(username)s's account, threads, posts and other content has been deleted.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n ),\n })\n } else {\n this.setState({\n isDeleted: interpolate(\n pgettext(\n \"profile delete\",\n \"%(username)s's account has been deleted and other content has been hidden.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n ),\n })\n }\n }\n\n getButtonLabel() {\n if (this.state.confirm) {\n return interpolate(\n pgettext(\"profile delete btn\", \"Delete %(username)s\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n } else {\n return interpolate(\n pgettext(\"profile delete btn\", \"Please wait... (%(countdown)ss)\"),\n {\n countdown: this.state.countdown,\n },\n true\n )\n }\n }\n\n getForm() {\n return (\n
    \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"profile delete btn\", \"Cancel\")}\n \n\n \n {this.getButtonLabel()}\n \n
    \n
    \n )\n }\n\n getDeletedBody() {\n return (\n
    \n
    \n info_outline\n
    \n \n
    \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n if (this.state.isDeleted) {\n return this.getDeletedBody()\n } else {\n return this.getForm()\n }\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error || this.state.isDeleted) {\n return \"modal-dialog modal-message modal-delete-account\"\n } else {\n return \"modal-dialog modal-delete-account\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"profile delete title\", \"Delete user account\")}\n

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport AvatarControls from \"misago/components/profile/moderation/avatar-controls\"\nimport ChangeUsername from \"misago/components/profile/moderation/change-username\"\nimport DeleteAccount from \"misago/components/profile/moderation/delete-account\"\nimport modal from \"misago/services/modal\"\n\nlet select = function (store) {\n return {\n tick: store.tick,\n user: store.auth,\n profile: store.profile,\n }\n}\n\nexport default class extends React.Component {\n showAvatarDialog = () => {\n modal.show(connect(select)(AvatarControls))\n }\n\n showRenameDialog = () => {\n modal.show(connect(select)(ChangeUsername))\n }\n\n showDeleteDialog = () => {\n modal.show(connect(select)(DeleteAccount))\n }\n\n render() {\n const { moderation } = this.props\n\n return (\n
      \n {!!moderation.avatar && (\n
    • \n \n portrait\n {pgettext(\"profile moderation menu\", \"Avatar controls\")}\n \n
    • \n )}\n {!!moderation.rename && (\n
    • \n \n credit_card\n {pgettext(\"profile moderation menu\", \"Change username\")}\n \n
    • \n )}\n {!!moderation.delete && (\n
    • \n \n clear\n {pgettext(\"profile moderation menu\", \"Delete account\")}\n \n
    • \n )}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Status, { StatusIcon, StatusLabel } from \"../user-status\"\n\nconst ProfileDataList = ({ profile }) => (\n
      \n {profile.is_active === false && (\n
    • \n \n {pgettext(\"profile data list\", \"Account disabled\")}\n \n
    • \n )}\n
    • \n \n \n \n \n
    • \n {profile.rank.is_tab ? (\n
    • \n \n {profile.rank.name}\n \n
    • \n ) : (\n
    • \n {profile.rank.name}\n
    • \n )}\n {(profile.title || profile.rank.title) && (\n
    • {profile.title || profile.rank.title}
    • \n )}\n
    • \n \n {interpolate(\n pgettext(\"profile data list\", \"Joined %(joined_on)s\"),\n {\n joined_on: profile.joined_on.fromNow(),\n },\n true\n )}\n \n
    • \n {profile.email && (\n
    • \n \n {profile.email}\n \n
    • \n )}\n
    \n)\n\nexport default ProfileDataList\n","import React from \"react\"\nimport Avatar from \"../avatar\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n PageHeaderDetails,\n} from \"../PageHeader\"\nimport FollowButton from \"./follow-button\"\nimport MessageButton from \"./message-button\"\nimport ModerationOptions from \"./moderation/nav\"\nimport ProfileDataList from \"./ProfileDataList\"\n\nconst ProfileHeader = ({ profile, user, moderation, message, follow }) => (\n \n \n \n
    \n
    \n \n \n \n
    \n

    {profile.username}

    \n
    \n \n \n \n \n \n \n \n \n {message && (\n \n \n \n \n {moderation.available && !follow && (\n \n
    \n \n \n
    \n
    \n )}\n
    \n )}\n {follow && (\n \n \n \n \n {moderation.available && (\n \n
    \n \n \n
    \n
    \n )}\n
    \n )}\n {moderation.available && !follow && !message && (\n \n \n
    \n \n \n
    \n
    \n \n
    \n \n settings\n {pgettext(\"profile options btn\", \"Options\")}\n \n \n
    \n
    \n
    \n )}\n
    \n
    \n \n
    \n)\n\nconst ProfileModerationButton = () => (\n \n settings\n \n)\n\nexport default ProfileHeader\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst ProfileNav = ({ baseUrl, page, pages }) => (\n
    \n
    \n \n {page.icon}\n {page.name}\n \n
      \n {pages.map((page) => (\n
    • \n \n {page.icon}\n {page.name}\n \n
    • \n ))}\n
    \n
    \n
      \n {pages.map((page) => (\n
    • \n \n {page.icon}\n {page.name}\n \n
    • \n ))}\n
    \n
    \n)\n\nexport default ProfileNav\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport BanDetails from \"./ban-details\"\nimport Details from \"./details\"\nimport { Posts, Threads } from \"./feed\"\nimport Followers from \"./followers\"\nimport Follows from \"./follows\"\nimport UsernameHistory from \"./username-history\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport PageContainer from \"../PageContainer\"\nimport ProfileHeader from \"./ProfileHeader\"\nimport ProfileNav from \"./ProfileNav\"\n\nexport default class extends WithDropdown {\n constructor(props) {\n super(props)\n\n this.startPolling(props.profile.api.index)\n }\n\n startPolling(api) {\n polls.start({\n poll: \"user-profile\",\n url: api,\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data))\n }\n\n render() {\n const baseUrl = misago.get(\"PROFILE\").url\n const pages = misago.get(\"PROFILE_PAGES\")\n const page = pages.filter((page) => {\n const url = baseUrl + page.component + \"/\"\n return this.props.location.pathname === url\n })[0]\n const { profile, user } = this.props\n const moderation = getModeration(profile, user)\n const message =\n !!user.acl.can_start_private_threads && profile.id !== user.id\n const follow = !!profile.acl.can_follow && profile.id !== user.id\n\n return (\n
    \n \n \n \n\n {this.props.children}\n \n
    \n )\n }\n}\n\nconst getModeration = (profile, user) => {\n const moderation = {\n available: false,\n rename: false,\n avatar: false,\n delete: false,\n }\n\n if (user.is_anonymous) return moderation\n\n moderation.rename = profile.acl.can_rename\n moderation.avatar = profile.acl.can_moderate_avatar\n moderation.delete = profile.acl.can_delete\n moderation.available = !!(\n moderation.rename ||\n moderation.avatar ||\n moderation.delete\n )\n\n return moderation\n}\n\nexport function select(store) {\n return {\n isAuthenticated: store.auth.user.id === store.profile.id,\n\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n posts: store.posts,\n profile: store.profile,\n profileDetails: store[\"profile-details\"],\n \"username-history\": store[\"username-history\"],\n }\n}\n\nconst COMPONENTS = {\n posts: Posts,\n threads: Threads,\n followers: Followers,\n follows: Follows,\n details: Details,\n \"username-history\": UsernameHistory,\n \"ban-details\": BanDetails,\n}\n\nexport function paths() {\n let paths = []\n misago.get(\"PROFILE_PAGES\").forEach(function (item) {\n paths.push(\n Object.assign({}, item, {\n path: misago.get(\"PROFILE\").url + item.component + \"/\",\n component: connect(select)(COMPONENTS[item.component]),\n })\n )\n })\n\n return paths\n}\n","import React from \"react\"\nimport Route from \"./route\"\n\nexport function Threads(props) {\n let emptyMessage = null\n if (props.user.id === props.profile.id) {\n emptyMessage = pgettext(\n \"profile threads\",\n \"You haven't started any threads.\"\n )\n } else {\n emptyMessage = interpolate(\n pgettext(\"profile threads\", \"%(username)s hasn't started any threads\"),\n {\n username: props.profile.username,\n },\n true\n )\n }\n\n let header = null\n if (!props.posts.isLoaded) {\n header = pgettext(\"profile threads\", \"Loading...\")\n } else if (props.profile.id === props.user.id) {\n const message = npgettext(\n \"profile threads\",\n \"You have started %(threads)s thread.\",\n \"You have started %(threads)s threads.\",\n props.profile.threads\n )\n\n header = interpolate(\n message,\n {\n threads: props.profile.threads,\n },\n true\n )\n } else {\n const message = npgettext(\n \"profile threads\",\n \"%(username)s has started %(threads)s thread.\",\n \"%(username)s has started %(threads)s threads.\",\n props.profile.threads\n )\n\n header = interpolate(\n message,\n {\n username: props.profile.username,\n threads: props.profile.threads,\n },\n true\n )\n }\n\n return (\n \n )\n}\n\nexport function Posts(props) {\n let emptyMessage = null\n if (props.user.id === props.profile.id) {\n emptyMessage = pgettext(\"profile posts\", \"You have posted no messages.\")\n } else {\n emptyMessage = interpolate(\n pgettext(\"profile posts\", \"%(username)s posted no messages.\"),\n {\n username: props.profile.username,\n },\n true\n )\n }\n\n let header = null\n if (!props.posts.isLoaded) {\n header = pgettext(\"profile posts\", \"Loading...\")\n } else if (props.profile.id === props.user.id) {\n const message = npgettext(\n \"profile posts\",\n \"You have posted %(posts)s message.\",\n \"You have posted %(posts)s messages.\",\n props.profile.posts\n )\n\n header = interpolate(\n message,\n {\n posts: props.profile.posts,\n },\n true\n )\n } else {\n const message = npgettext(\n \"profile posts\",\n \"%(username)s has posted %(posts)s message.\",\n \"%(username)s has posted %(posts)s messages.\",\n props.profile.posts\n )\n\n header = interpolate(\n message,\n {\n username: props.profile.username,\n posts: props.profile.posts,\n },\n true\n )\n }\n\n return (\n \n )\n}\n","import { connect } from \"react-redux\"\nimport Profile, { paths, select } from \"misago/components/profile/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"PROFILE\") && context.has(\"PROFILE_PAGES\")) {\n mount({\n root: misago.get(\"PROFILE\").url,\n component: connect(select)(Profile),\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:profile\",\n initializer: initializer,\n after: \"reducer:profile-hydrate\",\n})\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestLinkForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n email: \"\",\n\n validators: {\n email: [validators.email()],\n },\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(\n pgettext(\n \"request activation link form\",\n \"Enter a valid e-mail address.\"\n )\n )\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"SEND_ACTIVATION_API\"), {\n email: this.state.email,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if ([\"already_active\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n snackbar.info(rejection.detail)\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {pgettext(\"request activation link form btn\", \"Send link\")}\n \n \n
    \n )\n }\n}\n\nexport class LinkSent extends React.Component {\n getMessage() {\n return interpolate(\n pgettext(\n \"request activation link form\",\n \"Activation link was sent to %(email)s\"\n ),\n {\n email: this.props.user.email,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n check\n
    \n
    \n

    {this.getMessage()}

    \n
    \n \n {pgettext(\n \"request activation link form btn\",\n \"Request another link\"\n )}\n \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n complete = (apiResponse) => {\n this.setState({\n complete: apiResponse,\n })\n }\n\n reset = () => {\n this.setState({\n complete: false,\n })\n }\n\n render() {\n if (this.state.complete) {\n return \n } else {\n return \n }\n }\n}\n","import misago from \"misago/index\"\nimport RequestActivationLink from \"misago/components/request-activation-link\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"request-activation-link-mount\")) {\n mount(RequestActivationLink, \"request-activation-link-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:request-activation-link\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestResetForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n email: \"\",\n\n validators: {\n email: [validators.email()],\n },\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(\n pgettext(\"request password reset form\", \"Enter a valid e-mail address.\")\n )\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"SEND_PASSWORD_RESET_API\"), {\n email: this.state.email,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if ([\"inactive_user\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n this.props.showInactivePage(rejection)\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {pgettext(\"request password reset form btn\", \"Send link\")}\n \n \n
    \n )\n }\n}\n\nexport class LinkSent extends React.Component {\n getMessage() {\n return interpolate(\n pgettext(\n \"request password reset form\",\n \"Reset password link was sent to %(email)s\"\n ),\n {\n email: this.props.user.email,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n check\n
    \n
    \n

    {this.getMessage()}

    \n
    \n \n {pgettext(\n \"request password reset form btn\",\n \"Request another link\"\n )}\n \n
    \n
    \n )\n }\n}\n\nexport class AccountInactivePage extends React.Component {\n getActivateButton() {\n if (this.props.activation === \"inactive_user\") {\n return (\n

    \n \n {pgettext(\n \"request password reset form error\",\n \"Activate your account.\"\n )}\n \n

    \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n info_outline\n
    \n\n
    \n

    \n {pgettext(\n \"request password reset form error\",\n \"Your account is inactive.\"\n )}\n

    \n

    {this.props.message}

    \n {this.getActivateButton()}\n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n complete = (apiResponse) => {\n this.setState({\n complete: apiResponse,\n })\n }\n\n reset = () => {\n this.setState({\n complete: false,\n })\n }\n\n showInactivePage(apiResponse) {\n ReactDOM.render(\n ,\n document.getElementById(\"page-mount\")\n )\n }\n\n render() {\n if (this.state.complete) {\n return \n }\n\n return (\n \n )\n }\n}\n","import misago from \"misago/index\"\nimport RequestPasswordReset from \"misago/components/request-password-reset\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"request-password-reset-mount\")) {\n mount(RequestPasswordReset, \"request-password-reset-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:request-password-reset\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport SignInModal from \"misago/components/sign-in.js\"\nimport ajax from \"misago/services/ajax\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class ResetPasswordForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n password: \"\",\n }\n }\n\n clean() {\n if (this.state.password.trim().length) {\n return true\n } else {\n snackbar.error(pgettext(\"password reset form\", \"Enter new password.\"))\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"CHANGE_PASSWORD_API\"), {\n password: this.state.password,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {pgettext(\"password reset form btn\", \"Change password\")}\n \n \n
    \n )\n }\n}\n\nexport class PasswordChangedPage extends React.Component {\n getMessage() {\n return interpolate(\n pgettext(\n \"password reset form\",\n \"%(username)s, your password has been changed.\"\n ),\n {\n username: this.props.user.username,\n },\n true\n )\n }\n\n showSignIn() {\n modal.show(SignInModal)\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n check\n
    \n\n
    \n

    {this.getMessage()}

    \n

    \n {pgettext(\n \"password reset form\",\n \"Sign in using new password to continue.\"\n )}\n

    \n

    \n \n {pgettext(\"password reset form btn\", \"Sign in\")}\n \n

    \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n complete = (apiResponse) => {\n auth.softSignOut()\n\n // nuke \"next\" field so we don't end\n // coming back to error page after sign in\n $('#hidden-login-form input[name=\"next\"]').remove()\n\n ReactDOM.render(\n ,\n document.getElementById(\"page-mount\")\n )\n }\n\n render() {\n return \n }\n}\n","import misago from \"misago\"\nimport ResetPasswordForm from \"misago/components/reset-password-form\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"reset-password-form-mount\")) {\n mount(ResetPasswordForm, \"reset-password-form-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:reset-password-form\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { SearchOverlay } from \"../../components/Search\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"search-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:search-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport misago from \"misago\"\nimport Form from \"misago/components/form\"\nimport { load as updatePosts } from \"misago/reducers/posts\"\nimport { update as updateSearch } from \"misago/reducers/search\"\nimport { hydrate as updateUsers } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n PageHeader,\n PageHeaderContainer,\n PageHeaderBanner,\n PageHeaderDetails,\n} from \"../PageHeader\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n query: props.search.query,\n }\n }\n\n componentDidMount() {\n if (this.state.query.length) {\n this.handleSubmit()\n }\n }\n\n onQueryChange = (event) => {\n this.changeValue(\"query\", event.target.value)\n }\n\n clean() {\n if (!this.state.query.trim().length) {\n snackbar.error(pgettext(\"search form\", \"You have to enter search query.\"))\n return false\n }\n\n return true\n }\n\n send() {\n store.dispatch(\n updateSearch({\n isLoading: true,\n })\n )\n\n const query = this.state.query.trim()\n\n let url = window.location.href\n const urlQuery = url.indexOf(\"?q=\")\n if (urlQuery > 0) {\n url = url.substring(0, urlQuery + 3)\n }\n window.history.pushState({}, \"\", url + encodeURIComponent(query))\n\n return ajax.get(misago.get(\"SEARCH_API\"), { q: query })\n }\n\n handleSuccess(providers) {\n store.dispatch(\n updateSearch({\n query: this.state.query.trim(),\n isLoading: false,\n providers,\n })\n )\n\n providers.forEach((provider) => {\n if (provider.id === \"users\") {\n store.dispatch(updateUsers(provider.results.results))\n } else if (provider.id === \"threads\") {\n store.dispatch(updatePosts(provider.results))\n }\n })\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n\n store.dispatch(\n updateSearch({\n isLoading: false,\n })\n )\n }\n\n render() {\n return (\n
    \n \n \n \n

    {pgettext(\"search form title\", \"Search\")}

    \n
    \n \n \n \n \n \n \n \n \n search\n \n \n \n \n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function (props) {\n return (\n
    \n {props.providers.map((provider) => {\n return (\n \n {provider.icon}\n {provider.name}\n \n \n )\n })}\n
    \n )\n}\n\nexport function Badge(props) {\n if (!props.results) return null\n\n let count = props.results.count\n if (count > 1000000) {\n count = Math.ceil(count / 1000000) + \"KK\"\n } else if (count > 1000) {\n count = Math.ceil(count / 1000) + \"K\"\n }\n\n return {count}\n}\n","import React from \"react\"\nimport PageContainer from \"../PageContainer\"\nimport SearchForm from \"./form\"\nimport SideNav from \"./sidenav\"\n\nexport default function (props) {\n return (\n
    \n \n \n
    \n
    \n \n
    \n
    \n {props.children}\n \n
    \n
    \n
    \n
    \n )\n}\n\nexport function SearchTime(props) {\n let time = null\n props.search.providers.forEach((p) => {\n if (p.id === props.provider.id) {\n time = p.time\n }\n })\n\n if (time === null) return null\n\n const copy = pgettext(\"search time\", \"Search took %(time)s s\")\n\n return (\n
    \n

    {interpolate(copy, { time }, true)}

    \n
    \n )\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport {\n update as updatePosts,\n append as appendPosts,\n} from \"misago/reducers/posts\"\nimport { updateProvider } from \"misago/reducers/search\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n return (\n
    \n \n \n
    \n )\n}\n\nexport class LoadMore extends React.Component {\n onClick = () => {\n store.dispatch(\n updatePosts({\n isBusy: true,\n })\n )\n\n ajax\n .get(this.props.provider.api, {\n q: this.props.query,\n page: this.props.next,\n })\n .then(\n (providers) => {\n providers.forEach((provider) => {\n if (provider.id !== \"threads\") return\n store.dispatch(appendPosts(provider.results))\n store.dispatch(updateProvider(provider))\n })\n\n store.dispatch(\n updatePosts({\n isBusy: false,\n })\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n store.dispatch(\n updatePosts({\n isBusy: false,\n })\n )\n }\n )\n }\n\n render() {\n if (!this.props.more) return null\n\n return (\n
    \n \n {pgettext(\"search threads btn\", \"Show more\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport Results from \"./results\"\n\nexport default function (props) {\n return (\n \n \n \n \n \n )\n}\n\nexport function Blankslate({ children, loading, posts, query }) {\n if (posts && posts.count) return children\n\n if (query.length) {\n return (\n

    \n {loading\n ? pgettext(\"search threads\", \"Loading results...\")\n : pgettext(\n \"search threads\",\n \"No threads matching search query have been found.\"\n )}\n

    \n )\n }\n\n return (\n

    \n {pgettext(\n \"search threads\",\n \"Enter at least two characters to search threads.\"\n )}\n

    \n )\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport UsersList from \"misago/components/users-list\"\n\nexport default function (props) {\n return (\n \n \n \n \n \n )\n}\n\nexport function Blankslate({ children, loading, query, users }) {\n if (users.length) return children\n\n if (query.length) {\n return (\n

    \n {loading\n ? pgettext(\"search users\", \"Loading results...\")\n : pgettext(\n \"search users\",\n \"No users matching search query have been found.\"\n )}\n

    \n )\n }\n\n return (\n

    \n {pgettext(\n \"search users\",\n \"Enter at least two characters to search users.\"\n )}\n

    \n )\n}\n","import { connect } from \"react-redux\"\nimport SearchThreads from \"./threads\"\nimport SearchUsers from \"./users\"\n\nconst components = {\n threads: SearchThreads,\n users: SearchUsers,\n}\n\nexport function select(store) {\n return {\n posts: store.posts,\n search: store.search,\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n }\n}\n\nexport default function (providers) {\n return providers.map((provider) => {\n return {\n path: provider.url,\n component: connect(select)(components[provider.id]),\n provider: provider,\n }\n })\n}\n","import paths from \"misago/components/search-route\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.get(\"CURRENT_LINK\") === \"misago:search\") {\n mount({\n paths: paths(misago.get(\"SEARCH_PROVIDERS\")),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:search\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { SiteNavOverlay } from \"../../components/SiteNav\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"site-nav-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:site-nav-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nconst TYPES_CLASSES = {\n info: \"alert-info\",\n success: \"alert-success\",\n warning: \"alert-warning\",\n error: \"alert-danger\",\n}\n\nexport class Snackbar extends React.Component {\n getSnackbarClass() {\n let snackbarClass = \"alerts-snackbar\"\n if (this.props.isVisible) {\n snackbarClass += \" in\"\n } else {\n snackbarClass += \" out\"\n }\n return snackbarClass\n }\n\n render() {\n return (\n
    \n

    \n {this.props.message}\n

    \n
    \n )\n }\n}\n\nexport function select(state) {\n return state.snackbar\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport { Snackbar, select } from \"misago/components/snackbar\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(Snackbar), \"snackbar-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:snackbar\",\n initializer: initializer,\n after: \"snackbar\",\n})\n","import React from \"react\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nconst Header = ({ backendName }) => {\n const pageTitleTpl = pgettext(\"social auth title\", \"Sign in with %(backend)s\")\n const pageTitle = interpolate(pageTitleTpl, { backend: backendName }, true)\n\n return (\n \n \n \n

    {pageTitle}

    \n
    \n
    \n
    \n )\n}\n\nexport default Header\n","import React from \"react\"\nimport misago from \"misago\"\nimport RegisterLegalFootnote from \"misago/components/RegisterLegalFootnote\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nexport default class Register extends Form {\n constructor(props) {\n super(props)\n\n const formValidators = {\n email: [validators.email()],\n username: [validators.usernameContent()],\n }\n\n if (!!misago.get(\"TERMS_OF_SERVICE_ID\")) {\n formValidators.termsOfService = [validators.requiredTermsOfService()]\n }\n\n if (!!misago.get(\"PRIVACY_POLICY_ID\")) {\n formValidators.privacyPolicy = [validators.requiredPrivacyPolicy()]\n }\n\n this.state = {\n email: props.email || \"\",\n emailProtected: !!props.email,\n username: props.username || \"\",\n\n termsOfService: null,\n privacyPolicy: null,\n\n validators: formValidators,\n errors: {},\n\n isLoading: false,\n }\n }\n\n clean() {\n let errors = this.validate()\n let lengths = [\n this.state.email.trim().length,\n this.state.username.trim().length,\n ]\n\n if (lengths.indexOf(0) !== -1) {\n snackbar.error(pgettext(\"social auth form\", \"Fill out all fields.\"))\n return false\n }\n\n const { validators } = this.state\n\n const checkTermsOfService = !!misago.get(\"TERMS_OF_SERVICE_ID\")\n if (checkTermsOfService && this.state.termsOfService === null) {\n snackbar.error(validators.termsOfService[0](null))\n return false\n }\n\n const checkPrivacyPolicy = !!misago.get(\"PRIVACY_POLICY_ID\")\n if (checkPrivacyPolicy && this.state.privacyPolicy === null) {\n snackbar.error(validators.privacyPolicy[0](null))\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.url, {\n email: this.state.email,\n username: this.state.username,\n terms_of_service: this.state.termsOfService,\n privacy_policy: this.state.privacyPolicy,\n })\n }\n\n handleSuccess(response) {\n const { onRegistrationComplete } = this.props\n onRegistrationComplete(response)\n }\n\n handleError(rejection) {\n if (rejection.status === 200) {\n // We've entered \"errored\" state because response is HTML instead of exptected JSON\n const { onRegistrationComplete } = this.props\n const { username } = this.state\n onRegistrationComplete({ activation: \"active\", step: \"done\", username })\n } else if (rejection.status === 400) {\n const stateUpdate = { errors: rejection }\n if (rejection.email) {\n stateUpdate.emailProtected = false\n }\n this.setState(stateUpdate)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n handlePrivacyPolicyChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"privacyPolicy\", value)\n }\n\n handleTermsOfServiceChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"termsOfService\", value)\n }\n\n handleToggleAgreement = (agreement, value) => {\n this.setState((prevState, props) => {\n if (prevState[agreement] === null) {\n const errors = { ...prevState.errors, [agreement]: null }\n return { errors, [agreement]: value }\n }\n\n const validator = this.state.validators[agreement][0]\n const errors = { ...prevState.errors, [agreement]: [validator(null)] }\n return { errors, [agreement]: null }\n })\n }\n\n render() {\n const { backend_name } = this.props\n const { email, emailProtected, username, isLoading } = this.state\n\n let emailHelpText = null\n if (emailProtected) {\n const emailHelpTextTpl = pgettext(\n \"social auth form\",\n \"Your e-mail address has been verified by %(backend)s.\"\n )\n emailHelpText = interpolate(\n emailHelpTextTpl,\n { backend: backend_name },\n true\n )\n }\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n {pgettext(\n \"social auth form title\",\n \"Complete your account\"\n )}\n

    \n
    \n
    \n \n \n \n \n \n \n \n
    \n
    \n \n {pgettext(\"social auth form btn\", \"Sign in\")}\n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nconst Complete = ({ activation, backend_name, username }) => {\n let icon = \"\"\n let message = \"\"\n if (activation === \"user\") {\n message = pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\"\n )\n } else if (activation === \"admin\") {\n message = pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but the site administrator will have to activate it before you will be able to sign in.\"\n )\n } else {\n message = pgettext(\n \"social auth complete\",\n \"%(username)s, your account has been created and you have been signed in to it.\"\n )\n }\n\n if (activation === \"active\") {\n icon = \"check\"\n } else {\n icon = \"info_outline\"\n }\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n
    \n

    \n {pgettext(\n \"social auth complete title\",\n \"Registration completed!\"\n )}\n

    \n
    \n
    \n
    \n {icon}\n
    \n
    \n

    \n {interpolate(message, { username }, true)}\n

    \n

    \n \n {pgettext(\n \"social auth complete link\",\n \"Return to forum index\"\n )}\n \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n )\n}\n\nexport default Complete\n","import React from \"react\"\nimport Register from \"./register\"\nimport Complete from \"./complete\"\n\nexport default class SocialAuth extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n step: props.step,\n\n activation: props.activation || \"\",\n email: props.email || \"\",\n username: props.username || \"\",\n }\n }\n\n handleRegistrationComplete = ({ activation, email, step, username }) => {\n this.setState({ activation, email, step, username })\n }\n\n render() {\n const { backend_name, url } = this.props\n const { activation, email, step, username } = this.state\n\n if (step === \"register\") {\n return (\n \n )\n }\n\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport SocialAuth from \"misago/components/social-auth\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n if (context.get(\"CURRENT_LINK\") === \"misago:social-complete\") {\n const props = context.get(\"SOCIAL_AUTH_FORM\")\n mount(, \"page-mount\")\n }\n}\n\nmisago.addInitializer({\n name: \"component:social-auth\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport Form from \"./form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n username: \"\",\n }\n }\n\n onUsernameChange = (event) => {\n this.changeValue(\"username\", event.target.value)\n }\n\n clean() {\n if (!this.state.username.trim().length) {\n snackbar.error(\n pgettext(\n \"add private thread participant\",\n \"You have to enter user name.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.patch(this.props.thread.api.index, [\n { op: \"add\", path: \"participants\", value: this.state.username },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n }\n\n handleSuccess(data) {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n snackbar.success(\n pgettext(\n \"add private thread participant\",\n \"New participant has been added to thread.\"\n )\n )\n\n modal.hide()\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\n \"add private thread participant btn\",\n \"Add participant\"\n )}\n \n \n {pgettext(\"add private thread participant btn\", \"Cancel\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\n \"add private thread participant modal title\",\n \"Add participant\"\n )}\n

    \n
    \n )\n}\n","import React from \"react\"\nimport AddParticipantModal from \"misago/components/add-participant\"\nimport modal from \"misago/services/modal\"\n\nexport default class extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.thread.acl.can_add_participants) return null\n\n return (\n
    \n \n person_add\n {pgettext(\"add participant btn\", \"Add participant\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport { changeOwner } from \"./actions\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.isUser = props.participant.id === props.user.id\n }\n\n onClick = () => {\n let confirmed = false\n if (this.isUser) {\n confirmed = window.confirm(\n pgettext(\n \"private thread owner change\",\n \"Are you sure you want to take over this thread?\"\n )\n )\n } else {\n const message = pgettext(\n \"private thread owner change\",\n \"Are you sure you want to change thread owner to %(user)s?\"\n )\n confirmed = window.confirm(\n interpolate(\n message,\n {\n user: this.props.participant.username,\n },\n true\n )\n )\n }\n\n if (!confirmed) return\n\n changeOwner(this.props.thread, this.props.participant)\n }\n\n render() {\n if (this.props.participant.is_owner) return null\n if (!this.props.thread.acl.can_change_owner) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function leave(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"remove\", path: \"participants\", value: participant.id },\n ])\n .then(\n () => {\n snackbar.success(\n pgettext(\"thread participants actions\", \"You have left this thread.\")\n )\n window.setTimeout(() => {\n window.location = misago.get(\"PRIVATE_THREADS_URL\")\n }, 3 * 1000)\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n\nexport function remove(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"remove\", path: \"participants\", value: participant.id },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n .then(\n (data) => {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n const message = pgettext(\n \"thread participants actions\",\n \"%(user)s has been removed from this thread.\"\n )\n snackbar.success(\n interpolate(\n message,\n {\n user: participant.username,\n },\n true\n )\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n\nexport function changeOwner(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"replace\", path: \"owner\", value: participant.id },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n .then(\n (data) => {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n const message = pgettext(\n \"thread participants actions\",\n \"%(user)s has been made new thread owner.\"\n )\n snackbar.success(\n interpolate(\n message,\n {\n user: participant.username,\n },\n true\n )\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n","import React from \"react\"\nimport { remove, leave } from \"./actions\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.isUser = props.participant.id === props.user.id\n }\n\n onClick = () => {\n let confirmed = false\n if (this.isUser) {\n confirmed = window.confirm(\n pgettext(\n \"private thread leave\",\n \"Are you sure you want to leave this thread?\"\n )\n )\n } else {\n const message = pgettext(\n \"private thread leave\",\n \"Are you sure you want to remove %(user)s from this thread?\"\n )\n confirmed = window.confirm(\n interpolate(\n message,\n {\n user: this.props.participant.username,\n },\n true\n )\n )\n }\n\n if (!confirmed) return\n\n if (this.isUser) {\n leave(this.props.thread, this.props.participant)\n } else {\n remove(this.props.thread, this.props.participant)\n }\n }\n\n render() {\n const isModerator = this.props.user.acl.can_moderate_private_threads\n\n if (!(this.props.userIsOwner || this.isUser || isModerator)) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport MakeOwner from \"./make-owner\"\nimport Remove from \"./remove\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default function (props) {\n const participant = props.participant\n\n let className = \"btn btn-default\"\n if (participant.is_owner) {\n className = \"btn btn-primary\"\n }\n className += \" btn-user btn-block\"\n\n return (\n
    \n
    \n \n \n {participant.username}\n \n \n
    \n
    \n )\n}\n\nexport function UserStatus({ isOwner }) {\n if (!isOwner) return null\n\n return (\n
  • \n start\n \n {pgettext(\"thread participants owner status\", \"Thread owner\")}\n \n
  • \n )\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ participants, thread, user, userIsOwner }) {\n return (\n
    \n
    \n {participants.map((participant) => {\n return (\n \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport AddParticipant from \"./add-participant\"\nimport CardsList from \"./cards-list\"\nimport * as utils from \"./utils\"\n\nexport default function (props) {\n if (!props.participants.length) return null\n\n return (\n
    \n
    \n \n
    \n \n
    \n

    {utils.getParticipantsCopy(props.participants)}

    \n
    \n
    \n
    \n
    \n )\n}\n\nexport function getUserIsOwner(user, participants) {\n return participants[0].id === user.id\n}\n","export function getParticipantsCopy(participants) {\n const count = participants.length\n const message = npgettext(\n \"thread participants stat\",\n \"This thread has %(users)s participant.\",\n \"This thread has %(users)s participants.\",\n count\n )\n\n return interpolate(\n message,\n {\n users: count,\n },\n true\n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n {props.poll.choices.map((choice) => {\n return (\n \n )\n })}\n
    \n )\n}\n\nexport function PollChoice(props) {\n let proc = 0\n if (props.choice.votes && props.poll.votes) {\n proc = Math.ceil((props.choice.votes * 100) / props.poll.votes)\n }\n\n return (\n
    \n
    {props.choice.label}
    \n
    \n
    \n \n \n {getVotesLabel(props.votes, props.proc)}\n \n
    \n \n
      \n \n \n
    \n
    \n
    \n )\n}\n\nexport function ChoiceVotes(props) {\n return (\n
  • \n {getVotesLabel(props.votes, props.proc)}\n
  • \n )\n}\n\nexport function getVotesLabel(votes, proc) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s vote, %(proc)s% of total.\",\n \"%(votes)s votes, %(proc)s% of total.\",\n votes\n )\n\n return interpolate(\n message,\n {\n votes: votes,\n proc: proc,\n },\n true\n )\n}\n\nexport function UserChoice(props) {\n if (!props.selected) return null\n\n return (\n
  • \n check_box\n {pgettext(\"thread poll\", \"You've voted on this choice.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: true,\n error: null,\n data: [],\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.poll.api.votes).then(\n (data) => {\n const hydratedData = data.map((choice) => {\n return Object.assign({}, choice, {\n voters: choice.voters.map((voter) => {\n return Object.assign({}, voter, {\n voted_on: moment(voter.voted_on),\n })\n }),\n })\n })\n\n this.setState({\n isLoading: false,\n data: hydratedData,\n })\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n error: rejection.detail,\n })\n }\n )\n }\n\n render() {\n return (\n \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"thread poll\", \"Poll votes\")}\n

    \n
    \n\n \n
    \n \n )\n }\n}\n\nexport function ModalBody(props) {\n if (props.isLoading) {\n return \n } else if (props.error) {\n return \n }\n\n return \n}\n\nexport function ChoicesList(props) {\n return (\n
    \n
      \n {props.data.map((choice) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function ChoiceDetails(props) {\n return (\n
  • \n

    {props.label}

    \n \n \n
    \n
  • \n )\n}\n\nexport function VotesCount(props) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s user has voted for this choice.\",\n \"%(votes)s users have voted for this choice.\",\n props.votes\n )\n\n const label = interpolate(\n message,\n {\n votes: props.votes,\n },\n true\n )\n\n return

    {label}

    \n}\n\nexport function VotesList(props) {\n if (!props.voters.length) return null\n\n return (\n
      \n {props.voters.map((user) => {\n return \n })}\n
    \n )\n}\n\nexport function Voter(props) {\n if (props.url) {\n return (\n
  • \n \n {props.username}\n {\" \"}\n \n
  • \n )\n }\n\n return (\n
  • \n {props.username} \n
  • \n )\n}\n\nexport function VoteDate(props) {\n return (\n \n {props.voted_on.fromNow()}\n \n )\n}\n","import React from \"react\"\nimport Modal from \"./modal\"\nimport * as poll from \"misago/reducers/poll\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n const { isPollOver, poll, showVoting, thread } = props\n\n if (!isVisible(isPollOver, poll.acl, poll)) return null\n\n const controls = []\n\n const canVote = poll.acl.can_vote\n const canChangeVote = !poll.hasSelectedChoices || poll.allow_revotes\n\n if (canVote && canChangeVote) controls.push(0)\n if (poll.is_public || poll.acl.can_see_votes) controls.push(1)\n if (poll.acl.can_edit) controls.push(2)\n if (poll.acl.can_delete) controls.push(3)\n\n return (\n
    \n \n \n \n \n
    \n )\n}\n\nexport function isVisible(isPollOver, acl, poll) {\n return (\n poll.is_public ||\n acl.can_delete ||\n acl.can_edit ||\n acl.can_see_votes ||\n (acl.can_vote &&\n !isPollOver &&\n (!poll.hasSelectedChoices || poll.allow_revotes))\n )\n}\n\nexport function getClassName(controls, control) {\n let className = \"col-xs-6\"\n\n if (controls.length === 1) {\n className = \"col-xs-12\"\n }\n\n if (controls.length === 3 && controls[0] === control) {\n className = \"col-xs-12\"\n }\n\n return className + \" col-sm-3 col-md-2\"\n}\n\nexport function ChangeVote(props) {\n const canVote = props.poll.acl.can_vote\n const canChangeVote =\n !props.poll.hasSelectedChoices || props.poll.allow_revotes\n\n if (!(canVote && canChangeVote)) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Vote\")}\n \n
    \n )\n}\n\nexport class SeeVotes extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const seeVotes =\n this.props.poll.is_public || this.props.poll.acl.can_see_votes\n if (!seeVotes) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"See votes\")}\n \n
    \n )\n }\n}\n\nexport function Edit(props) {\n if (!props.poll.acl.can_edit) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Edit\")}\n \n
    \n )\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n const deletePoll = window.confirm(\n pgettext(\n \"thread poll\",\n \"Are you sure you want to delete this poll? This action is not reversible.\"\n )\n )\n if (!deletePoll) return false\n\n store.dispatch(poll.busy())\n\n ajax\n .delete(this.props.poll.api.index)\n .then(this.handleSuccess, this.handleError)\n }\n\n handleSuccess = (newThreadAcl) => {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been deleted\"))\n store.dispatch(poll.remove())\n store.dispatch(thread.updateAcl(newThreadAcl))\n }\n\n handleError = (rejection) => {\n snackbar.apiError(rejection)\n store.dispatch(poll.release())\n }\n\n render() {\n if (!this.props.poll.acl.can_delete) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Delete\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n
    \n )\n}\n\nexport function PollCreation(props) {\n const message = interpolate(\n escapeHtml(pgettext(\"thread poll\", \"Started by %(poster)s %(posted_on)s.\")),\n {\n poster: getPoster(props.poll),\n posted_on: getPostedOn(props.poll),\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getPoster(poll) {\n if (poll.url.poster) {\n return interpolate(\n USER_URL,\n {\n url: escapeHtml(poll.url.poster),\n user: escapeHtml(poll.poster_name),\n },\n true\n )\n }\n\n return interpolate(\n USER_SPAN,\n {\n user: escapeHtml(poll.poster_name),\n },\n true\n )\n}\n\nexport function getPostedOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.posted_on.format(\"LLL\")),\n relative: escapeHtml(poll.posted_on.fromNow()),\n },\n true\n )\n}\n\nexport function PollLength(props) {\n if (!props.poll.length) {\n return null\n }\n\n const message = interpolate(\n escapeHtml(pgettext(\"thread poll\", \"Voting ends %(ends_on)s.\")),\n {\n ends_on: getEndsOn(props.poll),\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getEndsOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.endsOn.format(\"LLL\")),\n relative: escapeHtml(poll.endsOn.fromNow()),\n },\n true\n )\n}\n\nexport function PollVotes(props) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s vote.\",\n \"%(votes)s votes.\",\n props.votes\n )\n const label = interpolate(\n message,\n {\n votes: props.votes,\n },\n true\n )\n\n return
  • {label}
  • \n}\n\nexport function PollIsPublic(props) {\n if (!props.poll.is_public) {\n return null\n }\n\n return (\n
  • \n {pgettext(\"thread poll\", \"Voting is public.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport Chart from \"./chart\"\nimport Options from \"./options\"\nimport PollInfo from \"../info\"\n\nexport default function (props) {\n return (\n
    \n
    \n

    {props.poll.question}

    \n \n \n \n
    \n
    \n )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n
    \n )\n}\n\nexport function PollChoicesLeft({ choicesLeft }) {\n if (choicesLeft === 0) {\n return (\n
  • \n {pgettext(\"thread poll\", \"You can't select any more choices.\")}\n
  • \n )\n }\n\n const message = npgettext(\n \"thread poll\",\n \"You can select %(choices)s more choice.\",\n \"You can select %(choices)s more choices.\",\n choicesLeft\n )\n\n const label = interpolate(\n message,\n {\n choices: choicesLeft,\n },\n true\n )\n\n return
  • {label}
  • \n}\n\nexport function PollAllowRevote(props) {\n if (props.poll.allow_revotes) {\n return (\n
  • \n {pgettext(\"thread poll\", \"You can change your vote later.\")}\n
  • \n )\n }\n\n return (\n
  • \n {pgettext(\"thread poll\", \"Votes are final.\")}\n
  • \n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
      \n {props.choices.map((choice) => {\n return (\n \n )\n })}\n
    \n )\n}\n\nexport class ChoiceSelect extends React.Component {\n onClick = () => {\n this.props.toggleChoice(this.props.choice.hash)\n }\n\n render() {\n return (\n
  • \n \n \n {this.props.choice.selected\n ? \"check_box\"\n : \"check_box_outline_blank\"}\n \n {this.props.choice.label}\n \n
  • \n )\n }\n}\n","export function getChoiceFromHash(choices, hash) {\n for (const i in choices) {\n const choice = choices[i]\n if (choice.hash === hash) {\n return choice\n }\n }\n\n return null\n}\n\nexport function getChoicesLeft(poll, choices) {\n let selection = []\n for (const i in choices) {\n const choice = choices[i]\n if (choice.selected) {\n selection.push(choice)\n }\n }\n\n return poll.allowed_choices - selection.length\n}\n","import React from \"react\"\nimport ChoicesHelp from \"./help\"\nimport ChoicesSelect from \"./select\"\nimport { getChoicesLeft, getChoiceFromHash } from \"./utils\"\nimport PollInfo from \"../info\"\nimport { Delete, Edit, getClassName } from \"../results/options\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n choices: props.poll.choices,\n choicesLeft: getChoicesLeft(props.poll, props.poll.choices),\n }\n }\n\n toggleChoice = (hash) => {\n const choice = getChoiceFromHash(this.state.choices, hash)\n\n let choices = null\n if (!choice.selected) {\n choices = this.selectChoice(choice, hash)\n } else {\n choices = this.deselectChoice(choice, hash)\n }\n\n this.setState({\n choices,\n choicesLeft: getChoicesLeft(this.props.poll, choices),\n })\n }\n\n selectChoice = (choice, hash) => {\n const choicesLeft = getChoicesLeft(this.props.poll, this.state.choices)\n\n if (!choicesLeft) {\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected && item.hash != hash) {\n item.selected = false\n break\n }\n }\n }\n\n return this.state.choices.map((choice) => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? true : choice.selected,\n })\n })\n }\n\n deselectChoice = (choice, hash) => {\n return this.state.choices.map((choice) => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? false : choice.selected,\n })\n })\n }\n\n clean() {\n if (this.state.choicesLeft === this.props.poll.allowed_choices) {\n snackbar.error(\n pgettext(\"thread poll vote\", \"You need to select at least one choice.\")\n )\n return false\n }\n\n return true\n }\n\n send() {\n let data = []\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected) {\n data.push(item.hash)\n }\n }\n\n return ajax.post(this.props.poll.api.votes, data)\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n snackbar.success(pgettext(\"thread poll vote\", \"Your vote has been saved.\"))\n\n this.props.showResults()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n const controls = []\n\n if (this.props.poll.acl.can_vote) controls.push(0)\n if (this.props.poll.is_public || this.props.poll.acl.can_see_votes)\n controls.push(1)\n if (this.props.poll.acl.can_edit) controls.push(2)\n if (this.props.poll.acl.can_delete) controls.push(3)\n\n return (\n
    \n
    \n
    \n

    {this.props.poll.question}

    \n \n \n \n
    \n
    \n
    \n
    \n \n {pgettext(\"thread poll vote btn\", \"Save your vote\")}\n \n
    \n
    \n \n {pgettext(\"thread poll vote btn\", \"See results\")}\n \n
    \n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Results from \"./results\"\nimport Voting from \"./voting\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n let showResults = true\n if (props.user.id && !props.poll.hasSelectedChoices) {\n showResults = false\n }\n\n this.state = {\n showResults,\n }\n }\n\n showResults = () => {\n this.setState({\n showResults: true,\n })\n }\n\n showVoting = () => {\n this.setState({\n showResults: false,\n })\n }\n\n render() {\n if (!this.props.thread.poll) return null\n\n const isPollOver = getIsPollOver(this.props.poll)\n\n if (\n !isPollOver &&\n this.props.poll.acl.can_vote &&\n !this.state.showResults\n ) {\n return \n } else {\n return (\n \n )\n }\n }\n}\n\nexport function getIsPollOver(poll) {\n if (poll.length) {\n return moment().isAfter(poll.endsOn)\n }\n return false\n}\n","import React from \"react\"\nimport getRandomString from \"../../../utils/getRandomString\"\n\nconst HASH_LENGTH = 12\n\nexport default class extends React.Component {\n onAdd = () => {\n let choices = this.props.choices.slice()\n choices.push({\n hash: getRandomString(HASH_LENGTH),\n label: \"\",\n })\n\n this.props.setChoices(choices)\n }\n\n onChange = (hash, label) => {\n const choices = this.props.choices.map((choice) => {\n if (choice.hash === hash) {\n choice.label = label\n }\n\n return choice\n })\n this.props.setChoices(choices)\n }\n\n onDelete = (hash) => {\n const choices = this.props.choices.filter((choice) => {\n return choice.hash !== hash\n })\n this.props.setChoices(choices)\n }\n\n render() {\n return (\n
    \n
      \n {this.props.choices.map((choice) => {\n return (\n 2}\n choice={choice}\n disabled={this.props.disabled}\n key={choice.hash}\n onChange={this.onChange}\n onDelete={this.onDelete}\n />\n )\n })}\n
    \n \n {pgettext(\"thread poll\", \"Add choice\")}\n \n
    \n )\n }\n}\n\nexport class PollChoice extends React.Component {\n onChange = (event) => {\n this.props.onChange(this.props.choice.hash, event.target.value)\n }\n\n onDelete = () => {\n const deleteItem =\n this.props.choice.label.length === 0\n ? true\n : window.confirm(\n pgettext(\n \"thread poll\",\n \"Are you sure you want to remove this choice?\"\n )\n )\n if (deleteItem) {\n this.props.onDelete(this.props.choice.hash)\n }\n }\n\n render() {\n return (\n
  • \n \n close\n \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ChoicesControl from \"./choices-control\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n const poll = props.poll.id\n ? props.poll\n : {\n question: \"\",\n choices: [\n {\n hash: \"choice-10000\",\n label: \"\",\n },\n {\n hash: \"choice-20000\",\n label: \"\",\n },\n ],\n length: 0,\n allowed_choices: 1,\n allow_revotes: 0,\n is_public: 0,\n }\n\n this.state = {\n isLoading: false,\n isEdit: !!poll.id,\n\n question: poll.question,\n choices: poll.choices,\n length: poll.length,\n allowed_choices: poll.allowed_choices,\n allow_revotes: poll.allow_revotes,\n is_public: poll.is_public,\n\n validators: {\n question: [],\n choices: [],\n length: [],\n allowed_choices: [],\n },\n\n errors: {},\n }\n }\n\n setChoices = (choices) => {\n this.setState((state) => {\n return {\n choices,\n errors: Object.assign({}, state.errors, { choices: null }),\n }\n })\n }\n\n onCancel = () => {\n let cancel = false\n\n // Nothing added to the poll so no changes to discard\n const formEmpty = !!(\n this.state.question === \"\" &&\n this.state.choices &&\n this.state.choices.every((choice) => choice.label === \"\") &&\n this.state.length === 0 &&\n this.state.allowed_choices === 1\n )\n\n if (formEmpty) {\n return this.props.close()\n }\n\n if (!!this.props.poll) {\n cancel = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to discard changes?\")\n )\n } else {\n cancel = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to discard new poll?\")\n )\n }\n\n if (cancel) {\n this.props.close()\n }\n }\n\n send() {\n const data = {\n question: this.state.question,\n choices: this.state.choices,\n length: this.state.length,\n allowed_choices: this.state.allowed_choices,\n allow_revotes: this.state.allow_revotes,\n is_public: this.state.is_public,\n }\n\n if (this.state.isEdit) {\n return ajax.put(this.props.poll.api.index, data)\n }\n\n return ajax.post(this.props.thread.api.poll, data)\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n\n if (this.state.isEdit) {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been edited.\"))\n } else {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been posted.\"))\n }\n\n this.props.close()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.non_field_errors) {\n rejection.allowed_choices = rejection.non_field_errors\n }\n\n this.setState({\n errors: Object.assign({}, rejection),\n })\n\n snackbar.error(gettext(\"Form contains errors.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n

    \n {this.state.isEdit\n ? pgettext(\"thread poll\", \"Edit poll\")\n : pgettext(\"thread poll\", \"Add poll\")}\n

    \n
    \n
    \n
    \n \n {pgettext(\"thread poll\", \"Question and choices\")}\n \n\n \n \n \n\n \n \n \n
    \n\n
    \n {pgettext(\"thread poll\", \"Voting\")}\n\n
    \n
    \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n \n {pgettext(\"thread poll\", \"Cancel\")}\n {\" \"}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function PollPublicSwitch(props) {\n if (props.isEdit) return null\n\n return (\n
    \n \n \n \n
    \n )\n}\n","import React from \"react\"\n\nconst ICON = {\n changed_title: \"edit\",\n\n pinned_globally: \"bookmark\",\n pinned_locally: \"bookmark_border\",\n unpinned: \"panorama_fish_eye\",\n\n moved: \"arrow_forward\",\n merged: \"call_merge\",\n\n approved: \"done\",\n\n opened: \"lock_open\",\n closed: \"lock_outline\",\n\n unhid: \"visibility\",\n hid: \"visibility_off\",\n\n changed_owner: \"grade\",\n tookover: \"grade\",\n\n added_participant: \"person_add\",\n\n owner_left: \"person_outline\",\n participant_left: \"person_outline\",\n removed_participant: \"remove_circle_outline\",\n}\n\nconst EventIcon = (props) => (\n \n {ICON[props.post.event_type]}\n \n)\n\nexport default EventIcon\n","import React from \"react\"\nimport moment from \"moment\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n if (isVisible(props.post.acl)) {\n return (\n
  • \n \n \n \n
  • \n )\n } else {\n return null\n }\n}\n\nexport function isVisible(acl) {\n return acl.can_hide\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: this.props.user.username,\n url: Object.assign(this.props.post.url, {\n hidden_by: this.props.user.url,\n }),\n })\n )\n\n const op = { op: \"replace\", path: \"is-hidden\", value: true }\n\n ajax.patch(this.props.post.api.index, [op]).then(\n (patch) => {\n store.dispatch(post.patch(this.props.post, patch))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: false,\n })\n )\n }\n )\n }\n\n render() {\n if (!this.props.post.is_hidden) {\n return (\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: false,\n })\n )\n\n const op = { op: \"replace\", path: \"is-hidden\", value: false }\n\n ajax.patch(this.props.post.api.index, [op]).then(\n (patch) => {\n store.dispatch(post.patch(this.props.post, patch))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: true,\n })\n )\n }\n )\n }\n\n render() {\n if (this.props.post.is_hidden) {\n return (\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n const decision = window.confirm(\n pgettext(\n \"event delete\",\n \"Are you sure you wish to delete this event? This action is not reversible!\"\n )\n )\n if (decision) {\n this.delete()\n }\n }\n\n delete = () => {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n ajax.delete(this.props.post.api.index).then(\n () => {\n snackbar.success(pgettext(\"event delete\", \"Event has been deleted.\"))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: false,\n })\n )\n }\n )\n }\n\n render() {\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport Controls from \"./controls\"\n\nconst DATE_ABBR = '%(relative)s'\nconst DATE_URL = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n \n
    \n )\n}\n\nexport function Hidden(props) {\n if (props.post.is_hidden) {\n let user = null\n if (props.post.url.hidden_by) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.post.url.hidden_by),\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n relative: escapeHtml(props.post.hidden_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\"event info\", \"Hidden by %(event_by)s %(event_on)s.\")\n ),\n {\n event_by: user,\n event_on: date,\n },\n true\n )\n\n return (\n \n )\n } else {\n return null\n }\n}\n\nexport function Poster(props) {\n let user = null\n if (props.post.poster) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.post.poster.url),\n user: escapeHtml(props.post.poster_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.post.poster_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_URL,\n {\n url: escapeHtml(props.post.url.index),\n absolute: escapeHtml(props.post.posted_on.format(\"LLL\")),\n relative: escapeHtml(props.post.posted_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(pgettext(\"event info\", \"By %(event_by)s %(event_on)s.\")),\n {\n event_by: user,\n event_on: date,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst MESSAGE = {\n pinned_globally: pgettext(\n \"event message\",\n \"Thread has been pinned globally.\"\n ),\n pinned_locally: pgettext(\n \"event message\",\n \"Thread has been pinned in category.\"\n ),\n unpinned: pgettext(\"event message\", \"Thread has been unpinned.\"),\n\n approved: pgettext(\"event message\", \"Thread has been approved.\"),\n\n opened: pgettext(\"event message\", \"Thread has been opened.\"),\n closed: pgettext(\"event message\", \"Thread has been closed.\"),\n\n unhid: pgettext(\"event message\", \"Thread has been revealed.\"),\n hid: pgettext(\"event message\", \"Thread has been made hidden.\"),\n\n tookover: pgettext(\"event message\", \"Took thread over.\"),\n\n owner_left: pgettext(\n \"event message\",\n \"Owner has left thread. This thread is now closed.\"\n ),\n participant_left: pgettext(\"event message\", \"Participant has left thread.\"),\n}\n\nconst ITEM_LINK = '%(name)s'\nconst ITEM_SPAN = '%(name)s'\n\nexport default function (props) {\n if (MESSAGE[props.post.event_type]) {\n return

    {MESSAGE[props.post.event_type]}

    \n } else if (props.post.event_type === \"changed_title\") {\n return \n } else if (props.post.event_type === \"moved\") {\n return \n } else if (props.post.event_type === \"merged\") {\n return \n } else if (props.post.event_type === \"changed_owner\") {\n return \n } else if (props.post.event_type === \"added_participant\") {\n return \n } else if (props.post.event_type === \"removed_participant\") {\n return \n } else {\n return null\n }\n}\n\nexport function ChangedTitle(props) {\n const msgstring = escapeHtml(\n pgettext(\n \"event message\",\n \"Thread title has been changed from %(old_title)s.\"\n )\n )\n const oldTitle = interpolate(\n ITEM_SPAN,\n {\n name: escapeHtml(props.post.event_context.old_title),\n },\n true\n )\n const message = interpolate(\n msgstring,\n {\n old_title: oldTitle,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function Moved(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Thread has been moved from %(from_category)s.\")\n )\n const fromCategory = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.from_category.url),\n name: escapeHtml(props.post.event_context.from_category.name),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n from_category: fromCategory,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function Merged(props) {\n const msgstring = escapeHtml(\n pgettext(\n \"event message\",\n \"The %(merged_thread)s thread has been merged into this thread.\"\n )\n )\n const mergedThread = interpolate(\n ITEM_SPAN,\n {\n name: escapeHtml(props.post.event_context.merged_thread),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n merged_thread: mergedThread,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function ChangedOwner(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Changed thread owner to %(user)s.\")\n )\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function AddedParticipant(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Added %(user)s to thread.\")\n )\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function RemovedParticipant(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Removed %(user)s from thread.\")\n )\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n if (post.is_read) return null\n\n return (\n
    \n \n {pgettext(\"event unread label\", \"New event\")}\n \n
    \n )\n}\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.initialized = false\n this.primed = false\n this.observer = null\n }\n\n initialize = (element) => {\n this.initialized = true\n\n this.observer = new IntersectionObserver((entries) =>\n entries.forEach(this.callback)\n )\n this.observer.observe(element)\n }\n\n callback = (entry) => {\n if (!entry.isIntersecting || this.props.post.is_read || this.primed) {\n return\n }\n\n window.setTimeout(() => {\n ajax.post(this.props.post.api.read)\n }, 0)\n\n this.primed = true\n this.destroy()\n }\n\n destroy() {\n if (this.observer) {\n this.observer.disconnect()\n this.observer = null\n }\n }\n\n componentWillUnmount() {\n this.destroy()\n }\n\n render() {\n const ready = !this.initialized && !this.primed && !this.props.post.is_read\n\n return (\n {\n if (node && ready) {\n this.initialize(node)\n }\n }}\n >\n {this.props.children}\n \n )\n }\n}\n","import React from \"react\"\nimport Icon from \"./icon\"\nimport Info from \"./info\"\nimport Message from \"./message\"\nimport UnreadLabel from \"./unread-label\"\nimport Waypoint from \"../waypoint\"\n\nexport default function (props) {\n let className = \"event\"\n if (props.post.isDeleted) {\n className = \"hide\"\n } else if (props.post.is_hidden) {\n className = \"event post-hidden\"\n }\n\n return (\n
  • \n \n
    \n
    \n \n
    \n \n \n \n \n
    \n
  • \n )\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport formatFilesize from \"misago/utils/file-size\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
    \n \n
    \n \n {props.attachment.filename}\n \n \n
    \n
    \n )\n}\n\nexport function AttachmentPreview(props) {\n if (props.attachment.is_image) {\n return (\n
    \n \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n}\n\nexport function AttachmentIcon(props) {\n return (\n \n insert_drive_file\n \n )\n}\n\nexport function AttachmentThumbnail(props) {\n const url = props.attachment.url.thumb || props.attachment.url.index\n return (\n \n )\n}\n\nexport function AttachmentDetails(props) {\n let user = null\n if (props.attachment.url.uploader) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.attachment.url.uploader),\n user: escapeHtml(props.attachment.uploader_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.attachment.uploader_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.attachment.uploaded_on.format(\"LLL\")),\n relative: escapeHtml(props.attachment.uploaded_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\n \"post attachment\",\n \"%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.\"\n )\n ),\n {\n filetype: props.attachment.filetype,\n size: formatFilesize(props.attachment.size),\n uploader: user,\n uploaded_on: date,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\nimport batch from \"misago/utils/batch\"\nimport Attachment from \"./attachment\"\n\nexport default function (props) {\n if (!isVisible(props.post)) {\n return null\n }\n\n return (\n
    \n {batch(props.post.attachments, 2).map((row) => {\n const key = row\n .map((a) => {\n return a ? a.id : 0\n })\n .join(\"_\")\n return \n })}\n
    \n )\n}\n\nexport function isVisible(post) {\n return (!post.is_hidden || post.acl.can_see_hidden) && post.attachments\n}\n\nexport function Row(props) {\n return (\n
    \n {props.row.map((attachment) => {\n return (\n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Waypoint from \"../waypoint\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst HIDDEN_BY_URL = '%(user)s'\nconst HIDDEN_BY_SPAN = '%(user)s'\nconst HIDDEN_ON =\n '%(relative)s'\n\nexport default function (props) {\n if (props.post.is_hidden && !props.post.acl.can_see_hidden) {\n return \n } else if (props.post.content) {\n return \n } else {\n return \n }\n}\n\nexport function Default({ post }) {\n const poster = \"@\" + (post.poster ? post.poster.username : post.poster_name)\n\n return (\n \n \n \n )\n}\n\nexport function Hidden(props) {\n let user = null\n if (props.post.hidden_by) {\n user = interpolate(\n HIDDEN_BY_URL,\n {\n url: escapeHtml(props.post.url.hidden_by),\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n } else {\n user = interpolate(\n HIDDEN_BY_SPAN,\n {\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n }\n\n const date = interpolate(\n HIDDEN_ON,\n {\n absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n relative: escapeHtml(props.post.hidden_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\"post body hidden\", \"Hidden by %(hidden_by)s %(hidden_on)s.\")\n ),\n {\n hidden_by: user,\n hidden_on: date,\n },\n true\n )\n\n return (\n \n

    \n {pgettext(\n \"post body hidden\",\n \"This post is hidden. You cannot see its contents.\"\n )}\n

    \n

    \n \n )\n}\n\nexport function Invalid(props) {\n return (\n \n

    \n {pgettext(\n \"post body invalid\",\n \"This post's contents cannot be displayed.\"\n )}\n

    \n

    \n {pgettext(\n \"post body invalid\",\n \"This error is caused by invalid post content manipulation.\"\n )}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport function FlagBestAnswer({ post, thread, user }) {\n if (!(isVisible(post) && post.id === thread.best_answer)) {\n return null\n }\n\n let message = null\n if (user.id && thread.best_answer_marked_by === user.id) {\n message = interpolate(\n pgettext(\n \"post best answer flag\",\n \"Marked as best answer by you %(marked_on)s.\"\n ),\n {\n marked_on: thread.best_answer_marked_on.fromNow(),\n },\n true\n )\n } else {\n message = interpolate(\n pgettext(\n \"post best answer flag\",\n \"Marked as best answer by %(marked_by)s %(marked_on)s.\"\n ),\n {\n marked_by: thread.best_answer_marked_by_name,\n marked_on: thread.best_answer_marked_on.fromNow(),\n },\n true\n )\n }\n\n return (\n
    \n check_box\n

    {message}

    \n
    \n )\n}\n\nexport function FlagHidden(props) {\n if (!(isVisible(props.post) && props.post.is_hidden)) {\n return null\n }\n\n return (\n
    \n visibility_off\n

    \n {pgettext(\n \"post hidden flag\",\n \"This post is hidden. Only users with permission may see its contents.\"\n )}\n

    \n
    \n )\n}\n\nexport function FlagUnapproved(props) {\n if (!(isVisible(props.post) && props.post.is_unapproved)) {\n return null\n }\n\n return (\n
    \n remove_circle_outline\n

    \n {pgettext(\n \"post unapproved flag\",\n \"This post is unapproved. Only users with permission to approve posts and its author may see its contents.\"\n )}\n

    \n
    \n )\n}\n\nexport function FlagProtected(props) {\n if (!(isVisible(props.post) && props.post.is_protected)) {\n return null\n }\n\n return (\n
    \n lock_outline\n

    \n {pgettext(\n \"post protected flag\",\n \"This post is protected. Only moderators may change it.\"\n )}\n

    \n
    \n )\n}\n\nexport function isVisible(post) {\n return !post.is_hidden || post.acl.can_see_hidden\n}\n","import moment from \"moment\"\nimport * as thread from \"misago/reducers/thread\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function approve(props) {\n store.dispatch(\n post.patch(props.post, {\n is_unapproved: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-unapproved\", value: false }]\n\n const previousState = {\n is_unapproved: props.post.is_unapproved,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function protect(props) {\n store.dispatch(\n post.patch(props.post, {\n is_protected: true,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: true }]\n\n const previousState = {\n is_protected: props.post.is_protected,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unprotect(props) {\n store.dispatch(\n post.patch(props.post, {\n is_protected: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: false }]\n\n const previousState = {\n is_protected: props.post.is_protected,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function hide(props) {\n store.dispatch(\n post.patch(props.post, {\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(props.post.url, {\n hidden_by: props.user.url,\n }),\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: true }]\n\n const previousState = {\n is_hidden: props.post.is_hidden,\n hidden_on: props.post.hidden_on,\n hidden_by_name: props.post.hidden_by_name,\n url: props.post.url,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unhide(props) {\n store.dispatch(\n post.patch(props.post, {\n is_hidden: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: false }]\n\n const previousState = {\n is_hidden: props.post.is_hidden,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function like(props) {\n const lastLikes = props.post.last_likes || []\n const concatedLikes = [props.user].concat(lastLikes)\n const finalLikes =\n concatedLikes.length > 3 ? concatedLikes.slice(0, -1) : concatedLikes\n\n store.dispatch(\n post.patch(props.post, {\n is_liked: true,\n likes: props.post.likes + 1,\n last_likes: finalLikes,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-liked\", value: true }]\n\n const previousState = {\n is_liked: props.post.is_liked,\n likes: props.post.likes,\n last_likes: props.post.last_likes,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unlike(props) {\n store.dispatch(\n post.patch(props.post, {\n is_liked: false,\n likes: props.post.likes - 1,\n last_likes: props.post.last_likes.filter((user) => {\n return !user.id || user.id !== props.user.id\n }),\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-liked\", value: false }]\n\n const previousState = {\n is_liked: props.post.is_liked,\n likes: props.post.likes,\n last_likes: props.post.last_likes,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function patch(props, ops, previousState) {\n ajax.patch(props.post.api.index, ops).then(\n (newState) => {\n store.dispatch(post.patch(props.post, newState))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(post.patch(props.post, previousState))\n }\n )\n}\n\nexport function remove(props) {\n let confirmed = window.confirm(\n pgettext(\n \"post delete\",\n \"Are you sure you want to delete this post? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n store.dispatch(\n post.patch(props.post, {\n isDeleted: true,\n })\n )\n\n ajax.delete(props.post.api.index).then(\n () => {\n snackbar.success(pgettext(\"post delete\", \"Post has been deleted.\"))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(props.post, {\n isDeleted: false,\n })\n )\n }\n )\n}\n\nexport function markAsBestAnswer(props) {\n const { post, user } = props\n\n store.dispatch(\n thread.update({\n best_answer: post.id,\n best_answer_is_protected: post.is_protected,\n best_answer_marked_on: moment(),\n best_answer_marked_by: user.id,\n best_answer_marked_by_name: user.username,\n best_answer_marked_by_slug: user.slug,\n })\n )\n\n const ops = [\n { op: \"replace\", path: \"best-answer\", value: post.id },\n { op: \"add\", path: \"acl\", value: true },\n ]\n\n const previousState = {\n best_answer: props.thread.best_answer,\n best_answer_is_protected: props.thread.best_answer_is_protected,\n best_answer_marked_on: props.thread.best_answer_marked_on,\n best_answer_marked_by: props.thread.best_answer_marked_by,\n best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n }\n\n patchThread(props, ops, previousState)\n}\n\nexport function unmarkBestAnswer(props) {\n const { post } = props\n\n store.dispatch(\n thread.update({\n best_answer: null,\n best_answer_is_protected: false,\n best_answer_marked_on: null,\n best_answer_marked_by: null,\n best_answer_marked_by_name: null,\n best_answer_marked_by_slug: null,\n })\n )\n\n const ops = [\n { op: \"remove\", path: \"best-answer\", value: post.id },\n { op: \"add\", path: \"acl\", value: true },\n ]\n\n const previousState = {\n best_answer: props.thread.best_answer,\n best_answer_is_protected: props.thread.best_answer_is_protected,\n best_answer_marked_on: props.thread.best_answer_marked_on,\n best_answer_marked_by: props.thread.best_answer_marked_by,\n best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n }\n\n patchThread(props, ops, previousState)\n}\n\nexport function patchThread(props, ops, previousState) {\n ajax.patch(props.thread.api.index, ops).then(\n (newState) => {\n if (newState.best_answer_marked_on) {\n newState.best_answer_marked_on = moment(newState.best_answer_marked_on)\n }\n store.dispatch(thread.update(newState))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(thread.update(previousState))\n }\n )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Avatar from \"misago/components/avatar\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n\n error: null,\n likes: [],\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.post.api.likes).then(\n (data) => {\n this.setState({\n isReady: true,\n likes: data.map(hydrateLike),\n })\n },\n (rejection) => {\n this.setState({\n isReady: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.error) {\n return (\n \n \n \n )\n } else if (this.state.isReady) {\n if (this.state.likes.length) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n}\n\nexport function hydrateLike(data) {\n return Object.assign({}, data, {\n liked_on: moment(data.liked_on),\n })\n}\n\nexport function ModalDialog({ className, children, likes }) {\n let title = pgettext(\"post likes modal title\", \"Post Likes\")\n if (likes) {\n const likesCount = likes.length\n const message = npgettext(\n \"post likes modal\",\n \"%(likes)s like\",\n \"%(likes)s likes\",\n likesCount\n )\n\n title = interpolate(message, { likes: likesCount }, true)\n }\n\n return (\n
    \n
    \n
    \n \n ×\n \n

    {title}

    \n
    \n {children}\n
    \n
    \n )\n}\n\nexport function LikesList(props) {\n return (\n
    \n
      \n {props.likes.map((like) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function LikeDetails(props) {\n if (props.url) {\n const user = {\n id: props.liker_id,\n avatars: props.avatars,\n }\n\n return (\n
  • \n
    \n \n \n \n
    \n
    \n \n {props.username}\n {\" \"}\n \n
    \n
  • \n )\n }\n\n return (\n
  • \n
    \n \n \n \n
    \n
    \n {props.username} \n
    \n
  • \n )\n}\n\nexport function LikeDate(props) {\n return (\n \n {props.likedOn.fromNow()}\n \n )\n}\n","import React from \"react\"\nimport * as actions from \"./controls/actions\"\nimport LikesModal from \"misago/components/post-likes\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\n\nexport default function (props) {\n if (!isVisible(props.post)) return null\n\n return (\n
    \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport function isVisible(post) {\n return (\n (!post.is_hidden || post.acl.can_see_hidden) &&\n (post.acl.can_reply ||\n post.acl.can_edit ||\n (post.acl.can_see_likes && (post.last_likes || []).length) ||\n post.acl.can_like)\n )\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n onClick = () => {\n actions.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n \n check_box\n {pgettext(\"post footer btn\", \"Best answer\")}\n \n )\n }\n}\n\nexport class MarkAsBestAnswerCompact extends React.Component {\n onClick = () => {\n actions.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n \n check_box\n \n )\n }\n}\n\nexport class Like extends React.Component {\n onClick = () => {\n if (this.props.post.is_liked) {\n actions.unlike(this.props)\n } else {\n actions.like(this.props)\n }\n }\n\n render() {\n if (!this.props.post.acl.can_like) return null\n\n let className = \"btn btn-default btn-sm pull-left\"\n if (this.props.post.is_liked) {\n className = \"btn btn-success btn-sm pull-left\"\n }\n\n return (\n \n {this.props.post.is_liked\n ? pgettext(\"post footer btn\", \"Liked\")\n : pgettext(\"post footer btn\", \"Like\")}\n \n )\n }\n}\n\nexport class Likes extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const hasLikes = (this.props.post.last_likes || []).length > 0\n if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n if (this.props.post.acl.can_see_likes === 2) {\n return (\n \n {getLikesMessage(this.props.likes, this.props.lastLikes)}\n \n )\n }\n\n return (\n

    \n {getLikesMessage(this.props.likes, this.props.lastLikes)}\n

    \n )\n }\n}\n\nexport class LikesCompact extends Likes {\n render() {\n const hasLikes = (this.props.post.last_likes || []).length > 0\n if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n if (this.props.post.acl.can_see_likes === 2) {\n return (\n \n favorite\n {this.props.likes}\n \n )\n }\n\n return (\n

    \n favorite\n {this.props.likes}\n

    \n )\n }\n}\n\nexport function getLikesMessage(likes, users) {\n const usernames = users.slice(0, 3).map((u) => u.username)\n\n if (usernames.length == 1) {\n return interpolate(\n pgettext(\"post likes\", \"%(user)s likes this.\"),\n {\n user: usernames[0],\n },\n true\n )\n }\n\n const hiddenLikes = likes - usernames.length\n\n const otherUsers = usernames.slice(0, -1).join(\", \")\n const lastUser = usernames.slice(-1)[0]\n\n const usernamesList = interpolate(\n pgettext(\"post likes\", \"%(users)s and %(last_user)s\"),\n {\n users: otherUsers,\n last_user: lastUser,\n },\n true\n )\n\n if (hiddenLikes === 0) {\n return interpolate(\n pgettext(\"post likes\", \"%(users)s like this.\"),\n {\n users: usernamesList,\n },\n true\n )\n }\n\n const message = npgettext(\n \"post likes\",\n \"%(users)s and %(likes)s other user like this.\",\n \"%(users)s and %(likes)s other users like this.\",\n hiddenLikes\n )\n\n return interpolate(\n message,\n {\n users: usernames.join(\", \"),\n likes: hiddenLikes,\n },\n true\n )\n}\n\nexport class Reply extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"REPLY\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n })\n }\n\n render() {\n if (this.props.post.acl.can_reply) {\n return (\n \n {pgettext(\"post footer btn\", \"Reply\")}\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Quote extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"QUOTE\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n\n context: {\n reply: this.props.post.id,\n },\n })\n }\n\n render() {\n if (this.props.post.acl.can_reply) {\n return (\n \n {pgettext(\"post footer btn\", \"Quote\")}\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Edit extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"EDIT\",\n\n thread: this.props.thread,\n post: this.props.post,\n config: this.props.post.api.editor,\n submit: this.props.post.api.index,\n })\n }\n\n render() {\n if (this.props.post.acl.can_edit) {\n return (\n \n {pgettext(\"post footer btn\", \"Edit\")}\n \n )\n } else {\n return null\n }\n }\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(\n pgettext(\n \"post move modal\",\n \"You have to enter link to the other thread.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.move, {\n new_thread: this.state.url,\n posts: [this.props.post.id],\n })\n }\n\n handleSuccess(success) {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n modal.hide()\n\n snackbar.success(\n pgettext(\n \"post move modal\",\n \"Selected post was moved to the other thread.\"\n )\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"post move modal btn\", \"Move post\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"post move modal title\", \"Move post\")}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n
      \n {props.diff.map((item, i) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function DiffItem(props) {\n if (props.item[0] === \"?\") return null\n\n return (\n
  • {cleanItem(props.item)}
  • \n )\n}\n\nexport function getItemClassName(item) {\n let className = \"diff-item\"\n if (item[0] === \"-\") {\n className += \" diff-item-sub\"\n } else if (item[0] === \"+\") {\n className += \" diff-item-add\"\n }\n return className\n}\n\nexport function cleanItem(item) {\n return item.substr(2)\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\n\nexport default class extends React.Component {\n onClick = () => {\n this.props.revertEdit(this.props.edit.id)\n }\n\n render() {\n if (!this.props.canRevert) return null\n\n return (\n
    \n \n {pgettext(\"post revert btn\", \"Revert\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default class extends React.Component {\n goLast = () => {\n this.props.goToEdit()\n }\n\n goForward = () => {\n this.props.goToEdit(this.props.edit.next)\n }\n\n goBack = () => {\n this.props.goToEdit(this.props.edit.previous)\n }\n\n revertEdit = () => {\n this.props.revertEdit(this.props.edit.id)\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n )\n }\n}\n\nexport function GoBackBtn(props) {\n return (\n \n chevron_left\n \n )\n}\n\nexport function GoForwardBtn(props) {\n return (\n \n chevron_right\n \n )\n}\n\nexport function GoLastBtn(props) {\n return (\n \n last_page\n \n )\n}\n\nexport function RevertBtn(props) {\n if (!props.canRevert) return null\n\n return (\n
    \n \n {pgettext(\"post revert btn\", \"Revert\")}\n \n
    \n )\n}\n\nexport function Label(props) {\n let user = null\n if (props.edit.url.editor) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.edit.url.editor),\n user: escapeHtml(props.edit.editor_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.edit.editor_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.edit.edited_on.format(\"LLL\")),\n relative: escapeHtml(props.edit.edited_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\"post history modal\", \"By %(edited_by)s %(edited_on)s.\")\n ),\n {\n edited_by: user,\n edited_on: date,\n },\n true\n )\n\n return

    \n}\n","import moment from \"moment\"\n\nexport function hydrateEdit(json) {\n return Object.assign({}, json, {\n edited_on: moment(json.edited_on),\n })\n}\n","import React from \"react\"\nimport Diff from \"./diff\"\nimport Footer from \"./footer\"\nimport Toolbar from \"./toolbar\"\nimport { hydrateEdit } from \"./utils\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isBusy: true,\n\n canRevert: props.post.acl.can_edit,\n\n error: null,\n edit: null,\n }\n }\n\n componentDidMount() {\n this.goToEdit()\n }\n\n goToEdit = (edit = null) => {\n this.setState({\n isBusy: true,\n })\n\n let url = this.props.post.api.edits\n if (edit !== null) {\n url += \"?edit=\" + edit\n }\n\n ajax.get(url).then(\n (data) => {\n this.setState({\n isReady: true,\n isBusy: false,\n edit: hydrateEdit(data),\n })\n },\n (rejection) => {\n this.setState({\n isReady: true,\n isBusy: false,\n error: rejection.detail,\n })\n }\n )\n }\n\n revertEdit = (edit) => {\n if (this.state.isBusy) return\n\n const confirmation = window.confirm(\n pgettext(\n \"post revert\",\n \"Are you sure you with to revert this post to the state from before this edit?\"\n )\n )\n if (!confirmation) return\n\n this.setState({\n isBusy: true,\n })\n\n const url = this.props.post.api.edits + \"?edit=\" + edit\n ajax.post(url).then(\n (data) => {\n const hydratedPost = post.hydrate(data)\n store.dispatch(post.patch(data, hydratedPost))\n\n snackbar.success(\n pgettext(\"post revert\", \"Post has been reverted to previous state.\")\n )\n modal.hide()\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n this.setState({\n isBusy: false,\n })\n }\n )\n }\n\n render() {\n if (this.state.error) {\n return (\n \n \n \n )\n } else if (this.state.isReady) {\n return (\n \n \n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n}\n\nexport function ModalDialog(props) {\n return (\n

    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"post history modal title\", \"Post edits history\")}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport Select from \"misago/components/select\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default function (props) {\n return \n}\n\nexport class PostingConfig extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isError: false,\n\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n post: item.post,\n })\n })\n\n this.setState({\n isLoaded: true,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.isError) {\n return \n } else if (this.state.isLoaded) {\n return (\n \n )\n } else {\n return \n }\n }\n}\n\nexport class ModerationForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n title: \"\",\n category: null,\n categories: props.categories,\n weight: 0,\n is_hidden: 0,\n is_closed: false,\n\n validators: {\n title: [validators.required()],\n },\n\n errors: {},\n }\n\n this.isHiddenChoices = [\n {\n value: 0,\n icon: \"visibility\",\n label: pgettext(\"thread hidden switch choice\", \"No\"),\n },\n {\n value: 1,\n icon: \"visibility_off\",\n label: pgettext(\"thread hidden switch choice\", \"Yes\"),\n },\n ]\n\n this.isClosedChoices = [\n {\n value: false,\n icon: \"lock_outline\",\n label: pgettext(\"thread closed switch choice\", \"No\"),\n },\n {\n value: true,\n icon: \"lock\",\n label: pgettext(\"thread closed switch choice\", \"Yes\"),\n },\n ]\n\n this.acl = {}\n this.props.categories.forEach((category) => {\n if (category.post) {\n if (!this.state.category) {\n this.state.category = category.id\n }\n\n this.acl[category.id] = {\n can_pin_threads: category.post.pin,\n can_close_threads: category.post.close,\n can_hide_threads: category.post.hide,\n }\n }\n })\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.split, {\n title: this.state.title,\n category: this.state.category,\n weight: this.state.weight,\n is_hidden: this.state.is_hidden,\n is_closed: this.state.is_closed,\n posts: [this.props.post.id],\n })\n }\n\n handleSuccess(apiResponse) {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n modal.hide()\n\n snackbar.success(\n pgettext(\"post split modal\", \"Selected post was split into new thread.\")\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n snackbar.error(gettext(\"Form contains errors.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (ev) => {\n const categoryId = ev.target.value\n const newState = {\n category: categoryId,\n }\n\n if (this.acl[categoryId].can_pin_threads < newState.weight) {\n newState.weight = 0\n }\n\n if (!this.acl[categoryId].can_hide_threads) {\n newState.is_hidden = 0\n }\n\n if (!this.acl[categoryId].can_close_threads) {\n newState.is_closed = false\n }\n\n this.setState(newState)\n }\n\n getWeightChoices() {\n const choices = [\n {\n value: 0,\n icon: \"remove\",\n label: pgettext(\"thread weight choice\", \"Not pinned\"),\n },\n {\n value: 1,\n icon: \"bookmark_border\",\n label: pgettext(\"thread weight choice\", \"Pinned in category\"),\n },\n ]\n\n if (this.acl[this.state.category].can_pin_threads == 2) {\n choices.push({\n value: 2,\n icon: \"bookmark\",\n label: pgettext(\"thread weight choice\", \"Pinned globally\"),\n })\n }\n\n return choices\n }\n\n renderWeightField() {\n if (this.acl[this.state.category].can_pin_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderHiddenField() {\n if (this.acl[this.state.category].can_hide_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderClosedField() {\n if (this.acl[this.state.category].can_close_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n \n \n
    \n\n \n \n \n
    \n\n {this.renderWeightField()}\n {this.renderHiddenField()}\n {this.renderClosedField()}\n
    \n
    \n \n
    \n \n \n )\n }\n}\n\nexport function Loader() {\n return (\n \n \n \n )\n}\n\nexport function Error(props) {\n return (\n \n
    \n info_outline\n
    \n
    \n

    \n {pgettext(\n \"post split modal\",\n \"You can't move this post at the moment.\"\n )}\n

    \n

    {props.message}

    \n
    \n
    \n )\n}\n\nexport function Modal(props) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"posts split modal title\", \"Split post into new thread\")}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport * as moderation from \"./actions\"\nimport MoveModal from \"./move\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport SplitModal from \"./split\"\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport class Permalink extends React.Component {\n onClick = () => {\n let permaUrl = window.location.protocol + \"//\"\n permaUrl += window.location.host\n permaUrl += this.props.post.url.index\n\n prompt(pgettext(\"post permalink\", \"Permament link to this post:\"), permaUrl)\n }\n\n render() {\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Edit extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"EDIT\",\n\n thread: this.props.thread,\n post: this.props.post,\n config: this.props.post.api.editor,\n submit: this.props.post.api.index,\n })\n }\n\n render() {\n if (!this.props.post.acl.can_edit) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n onClick = () => {\n moderation.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (post.id === thread.best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class UnmarkMarkBestAnswer extends React.Component {\n onClick = () => {\n moderation.unmarkBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id !== thread.best_answer) return null\n if (!thread.acl.can_unmark_best_answer) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class PostEdits extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isHidden =\n this.props.post.is_hidden && !this.props.post.acl.can_see_hidden\n const isUnedited = this.props.post.edits === 0\n if (isHidden || isUnedited) return null\n\n const message = npgettext(\n \"post edits\",\n \"This post was edited %(edits)s time.\",\n \"This post was edited %(edits)s times.\",\n this.props.post.edits\n )\n\n const title = interpolate(\n message,\n {\n edits: this.props.post.edits,\n },\n true\n )\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Approve extends React.Component {\n onClick = () => {\n moderation.approve(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_approve) return null\n if (!this.props.post.is_unapproved) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Move extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.post.acl.can_move) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Split extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.post.acl.can_move) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Protect extends React.Component {\n onClick = () => {\n moderation.protect(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_protect) return null\n if (this.props.post.is_protected) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unprotect extends React.Component {\n onClick = () => {\n moderation.unprotect(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_protect) return null\n if (!this.props.post.is_protected) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n moderation.hide(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id === thread.best_answer) return null\n if (!post.acl.can_hide) return null\n if (post.is_hidden) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n moderation.unhide(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_unhide) return null\n if (!this.props.post.is_hidden) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n moderation.remove(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id === thread.best_answer) return null\n if (!post.acl.can_delete) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport Dropdown from \"./dropdown\"\n\nexport default function (props) {\n return (\n
    \n \n expand_more\n \n \n
    \n )\n}\n","import React from \"react\"\nimport * as posts from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n onClick = () => {\n if (this.props.post.isSelected) {\n store.dispatch(posts.deselect(this.props.post))\n } else {\n store.dispatch(posts.select(this.props.post))\n }\n }\n\n render() {\n if (\n !(this.props.thread.acl.can_merge_posts || isVisible(this.props.post.acl))\n ) {\n return null\n }\n\n return (\n
    \n \n \n {this.props.post.isSelected\n ? \"check_box\"\n : \"check_box_outline_blank\"}\n \n \n
    \n )\n }\n}\n\nexport function isVisible(acl) {\n return (\n acl.can_approve ||\n acl.can_hide ||\n acl.can_protect ||\n acl.can_unhide ||\n acl.can_delete ||\n acl.can_move\n )\n}\n","import React from \"react\"\nimport Controls from \"./controls\"\nimport Select from \"./select\"\nimport {\n StatusIcon,\n getStatusClassName,\n getStatusDescription,\n} from \"misago/components/user-status\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport modal from \"misago/services/modal\"\n\nexport default function (props) {\n return (\n
    \n \n \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n {post.poster_name}\n\n \n {pgettext(\"post removed poster username\", \"Removed user\")}\n \n
    \n
    \n
    \n )\n}\n","export default function ({ title, rank }) {\n return rank.is_tab || !!title || !!rank.title\n}\n","import React from \"react\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n const message = npgettext(\n \"poster stats\",\n \"%(posts)s post\",\n \"%(posts)s posts\",\n poster.posts\n )\n\n let className = \"user-postcount\"\n if (hasVisibleTitle(poster)) {\n className += \" hidden-xs hidden-sm\"\n }\n\n return (\n \n {interpolate(\n message,\n {\n posts: poster.posts,\n },\n true\n )}\n \n )\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n let className = \"hidden-xs\"\n if (hasVisibleTitle(poster)) {\n className += \" hidden-sm\"\n }\n\n return (\n \n \n \n \n \n )\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title\n if (!userTitle && rank.is_tab) {\n userTitle = rank.name\n }\n\n if (!userTitle) return null\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n )\n }\n\n return
    {userTitle}
    \n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Controls from \"misago/components/posts-list/post/controls\"\nimport Select from \"misago/components/posts-list/post/select\"\nimport UserStatus, { StatusIcon } from \"misago/components/user-status\"\nimport UserPostcount from \"./user-postcount\"\nimport UserStatusLabel from \"./user-status\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ post, thread }) {\n const { poster } = post\n\n return (\n
    \n \n \n )\n}\n\nexport function PollSelect({ choices, onChange, value }) {\n if (!choices) return null\n\n return (\n \n \n {choices.map((choice) => {\n return (\n \n )\n })}\n \n \n )\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport MergeConflict from \"misago/components/merge-conflict\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(\n pgettext(\n \"thread merge form\",\n \"You have to enter link to the other thread.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n // freeze thread\n store.dispatch(thread.busy())\n\n return ajax.post(this.props.thread.api.merge, {\n other_thread: this.state.url,\n })\n }\n\n handleSuccess = (success) => {\n this.handleSuccessUnmounted(success)\n\n // keep form loading\n this.setState({\n isLoading: true,\n })\n }\n\n handleSuccessUnmounted = (success) => {\n snackbar.success(\n pgettext(\"thread merge form\", \"Thread has been merged with other one.\")\n )\n window.location = success.url\n }\n\n handleError = (rejection) => {\n store.dispatch(thread.release())\n\n if (rejection.status === 400) {\n if (rejection.best_answers || rejection.polls) {\n modal.show(\n \n )\n } else if (rejection.best_answer) {\n snackbar.error(rejection.best_answer[0])\n } else if (rejection.poll) {\n snackbar.error(rejection.poll[0])\n } else {\n snackbar.error(rejection.detail)\n }\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"thread merge form btn\", \"Cancel\")}\n \n \n {pgettext(\"thread merge form btn\", \"Merge thread\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"thread merge form title\", \"Merge thread\")}\n

    \n
    \n )\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport * as posts from \"misago/reducers/posts\"\nimport * as thread from \"misago/reducers/thread\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n isError: false,\n\n category: null,\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n let category = null\n\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n // pick first category that allows posting and if it may, override it with initial one\n if (item.post !== false && !category) {\n category = item.id\n }\n\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n })\n })\n\n this.setState({\n isReady: true,\n\n category,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n send() {\n // freeze thread\n store.dispatch(thread.busy())\n\n return ajax.patch(this.props.thread.api.index, [\n { op: \"replace\", path: \"category\", value: this.state.category },\n ])\n }\n\n handleSuccess() {\n // refresh thread and displayed posts\n ajax\n .get(this.props.thread.api.posts.index, { page: this.props.posts.page })\n .then(\n (data) => {\n store.dispatch(thread.replace(data))\n store.dispatch(posts.load(data.post_set))\n store.dispatch(thread.release())\n\n snackbar.success(\n pgettext(\"thread move form\", \"Thread has been moved.\")\n )\n modal.hide()\n },\n (rejection) => {\n store.dispatch(thread.release())\n snackbar.apiError(rejection)\n }\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (event) => {\n this.changeValue(\"category\", event.target.value)\n }\n\n render() {\n if (this.state.isReady) {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"thread move form btn\", \"Cancel\")}\n \n \n {pgettext(\"thread move form btn\", \"Move thread\")}\n \n
    \n
    \n
    \n
    \n )\n } else if (this.state.isError) {\n return \n } else {\n return \n }\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"thread move form title\", \"Move thread\")}\n

    \n
    \n )\n}\n\nexport function ModalLoading(props) {\n return (\n
    \n
    \n \n \n
    \n
    \n )\n}\n\nexport function ModalMessage(props) {\n return (\n
    \n
    \n \n
    \n info_outline\n
    \n
    \n

    \n {pgettext(\n \"thread move form\",\n \"You can't move this thread at the moment.\"\n )}\n

    \n

    {props.message}

    \n \n {pgettext(\"thread move form dismiss btn\", \"Ok\")}\n \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport ThreadChangeTitleModal from \"./ThreadChangeTitleModal\"\nimport MergeModal from \"./merge\"\nimport MoveModal from \"./move\"\n\nexport default class extends React.Component {\n callApi = (ops, successMessage) => {\n store.dispatch(thread.busy())\n\n // by the chance update thread acl too\n ops.push({ op: \"add\", path: \"acl\", value: true })\n\n ajax.patch(this.props.thread.api.index, ops).then(\n (data) => {\n store.dispatch(thread.update(data))\n store.dispatch(thread.release())\n snackbar.success(successMessage)\n },\n (rejection) => {\n store.dispatch(thread.release())\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n )\n }\n\n changeTitle = () => {\n modal.show()\n }\n\n pinGlobally = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"weight\",\n value: 2,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been pinned globally.\")\n )\n }\n\n pinLocally = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"weight\",\n value: 1,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been pinned in category.\")\n )\n }\n\n unpin = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"weight\",\n value: 0,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been unpinned.\")\n )\n }\n\n approve = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-unapproved\",\n value: false,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been approved.\")\n )\n }\n\n open = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-closed\",\n value: false,\n },\n ],\n gettext(\"Thread has been opened.\")\n )\n }\n\n close = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-closed\",\n value: true,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been closed.\")\n )\n }\n\n unhide = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-hidden\",\n value: false,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been made visible.\")\n )\n }\n\n hide = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-hidden\",\n value: true,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been made hidden.\")\n )\n }\n\n move = () => {\n modal.show(\n \n )\n }\n\n merge = () => {\n modal.show()\n }\n\n delete = () => {\n if (\n !window.confirm(\n pgettext(\n \"thread moderation\",\n \"Are you sure you want to delete this thread?\"\n )\n )\n ) {\n return\n }\n\n store.dispatch(thread.busy())\n\n ajax.delete(this.props.thread.api.index).then(\n (data) => {\n snackbar.success(\n pgettext(\"thread moderation\", \"Thread has been deleted.\")\n )\n window.location = this.props.thread.category.url.index\n },\n (rejection) => {\n store.dispatch(thread.release())\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n const { moderation } = this.props\n\n return (\n
      \n {!!moderation.edit && (\n
    • \n \n edit\n {pgettext(\"thread moderation btn\", \"Change title\")}\n \n
    • \n )}\n {!!moderation.pinGlobally && (\n
    • \n \n bookmark\n {pgettext(\"thread moderation btn\", \"Pin globally\")}\n \n
    • \n )}\n {!!moderation.pinLocally && (\n
    • \n \n bookmark_border\n {pgettext(\"thread moderation btn\", \"Pin in category\")}\n \n
    • \n )}\n {!!moderation.unpin && (\n
    • \n \n
    • \n )}\n {!!moderation.move && (\n
    • \n \n
    • \n )}\n {!!moderation.merge && (\n
    • \n \n
    • \n )}\n {!!moderation.approve && (\n
    • \n \n done\n {pgettext(\"thread moderation btn\", \"Approve\")}\n \n
    • \n )}\n {!!moderation.open && (\n
    • \n \n
    • \n )}\n {!!moderation.close && (\n
    • \n \n
    • \n )}\n {!!moderation.unhide && (\n
    • \n \n visibility\n {pgettext(\"thread moderation btn\", \"Unhide\")}\n \n
    • \n )}\n {!!moderation.hide && (\n
    • \n \n
    • \n )}\n {!!moderation.delete && (\n
    • \n \n clear\n {pgettext(\"thread moderation btn\", \"Delete\")}\n \n
    • \n )}\n
    \n )\n }\n}\n","import ThreadModerationOptions from \"./controls\"\n\nexport default ThreadModerationOptions\n","import React from \"react\"\nimport ThreadModerationOptions from \"./moderation/thread\"\n\nconst ThreadModeration = ({ thread, posts, moderation }) => (\n
    \n \n settings\n \n \n
    \n)\n\nexport default ThreadModeration\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport { update } from \"../../reducers/thread\"\nimport snackbar from \"../../services/snackbar\"\nimport { ApiMutation } from \"../Api\"\nimport { DropdownSubheader } from \"../Dropdown\"\n\nconst ThreadWatchButton = ({ dispatch, dropup, stickToBottom, thread }) => (\n \n {(mutate, { loading }) => {\n function setNotifications(notifications) {\n if (thread.notifications !== notifications) {\n dispatch(update({ notifications }))\n mutate({\n json: { notifications },\n onError: (error) => {\n snackbar.apiError(error)\n dispatch(update({ notifications: thread.notifications }))\n },\n })\n }\n }\n\n return (\n
    \n \n \n {getIcon(thread.notifications)}\n \n {getLabel(thread.notifications)}\n \n \n \n {pgettext(\"watch thread\", \"Notify about new replies\")}\n \n
  • \n setNotifications(2)}\n >\n mail\n {pgettext(\"watch thread\", \"On site and with e-mail\")}\n \n
  • \n
  • \n setNotifications(1)}\n >\n notifications_active\n {pgettext(\"watch thread\", \"On site only\")}\n \n
  • \n
  • \n setNotifications(0)}\n >\n notifications_none\n {pgettext(\"watch thread\", \"Don't notify\")}\n \n
  • \n \n
    \n )\n }}\n
    \n)\n\nfunction getIcon(notifications) {\n if (notifications === 2) return \"mail\"\n if (notifications === 1) return \"notifications_active\"\n\n return \"notifications_none\"\n}\n\nfunction getLabel(notifications) {\n if (notifications) {\n return pgettext(\"watch thread\", \"Watching\")\n }\n\n return pgettext(\"watch thread\", \"Watch\")\n}\n\nconst ThreadWatchButtonConnected = connect()(ThreadWatchButton)\n\nexport default ThreadWatchButtonConnected\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst Breadcrumbs = ({ children, className }) => (\n
      {children}
    \n)\n\nexport default Breadcrumbs\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst BreadcrumbsCategory = ({ category, className }) => (\n
  • \n \n \n label\n \n {!!category.short_name && (\n \n {category.short_name}\n \n )}\n {!!category.short_name && (\n {category.name}\n )}\n {!category.short_name && (\n {category.name}\n )}\n \n
  • \n)\n\nexport default BreadcrumbsCategory\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst BreadcrumbsRootCategory = ({ category, className }) => (\n
  • \n \n chevron_right\n \n {category.special_role === \"root_category\"\n ? pgettext(\"breadcrumb\", \"Threads\")\n : pgettext(\"breadcrumb\", \"Private threads\")}\n \n \n
  • \n)\n\nexport default BreadcrumbsRootCategory\n","import React from \"react\"\nimport {\n Breadcrumbs,\n BreadcrumbsCategory,\n BreadcrumbsRootCategory,\n} from \"../../Breadcrumbs\"\n\nconst ThreadHeaderBreadcrumbs = ({ breadcrumbs }) => (\n \n {breadcrumbs.map((category) =>\n category.special_role ? (\n \n ) : (\n \n )\n )}\n \n)\n\nexport default ThreadHeaderBreadcrumbs\n","import React from \"react\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../../FlexRow\"\nimport ThreadFlags from \"../../ThreadFlags\"\nimport ThreadReplies from \"../../ThreadReplies\"\nimport ThreadStarterCard from \"../../ThreadStarterCard\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n PageHeaderDetails,\n} from \"../../PageHeader\"\nimport ThreadModeration from \"../ThreadModeration\"\nimport ThreadWatchButton from \"../ThreadWatchButton\"\nimport ThreadHeaderBreadcrumbs from \"./ThreadHeaderBreadcrumbs\"\n\nconst ThreadHeader = ({ styleName, thread, posts, user, moderation }) => (\n \n \n \n \n

    {thread.title}

    \n
    \n \n \n \n \n \n \n \n {thread.replies > 0 && (\n \n \n \n )}\n {hasFlags(thread) && (\n \n \n \n )}\n \n {user.is_authenticated && (\n \n \n \n \n {moderation.enabled && (\n \n \n \n )}\n \n )}\n \n \n
    \n
    \n)\n\nconst hasFlags = (thread) => {\n return (\n thread.is_closed ||\n thread.is_hidden ||\n thread.is_unapproved ||\n thread.weight > 0 ||\n thread.best_answer ||\n thread.has_poll ||\n thread.has_unapproved_posts\n )\n}\n\nexport default ThreadHeader\n","import ThreadHeader from \"./ThreadHeader\"\n\nexport default ThreadHeader\n","import React from \"react\"\nimport { Link, withRouter } from \"react-router\"\nimport { Dropdown } from \"../Dropdown\"\n\nconst ThreadPaginator = ({ router, baseUrl, posts, scrollToTop }) => (\n
    \n {posts.isLoaded && posts.first ? (\n \n first_page\n \n ) : (\n \n first_page\n \n )}\n {posts.isLoaded && posts.previous ? (\n 1 ? posts.previous + \"/\" : \"\")}\n title={pgettext(\"paginator\", \"Go to previous page\")}\n onClick={scrollToTop ? resetScroll : null}\n >\n chevron_left\n \n ) : (\n \n chevron_left\n \n )}\n (\n \n {getLabel(posts.page, posts.pages)}\n \n )}\n onOpen={(dropdown) => {\n dropdown.querySelector(\"input\").focus()\n }}\n >\n {({ close }) => (\n {\n if (posts.isLoaded) {\n const formData = new FormData(event.target)\n const page = parseInt(formData.get(\"page\"))\n\n if (\n page &&\n page != posts.page &&\n page >= 1 &&\n page <= posts.pages\n ) {\n const url = page > 1 ? baseUrl + page + \"/\" : baseUrl\n router.push({ pathname: url })\n }\n }\n\n event.preventDefault()\n close()\n\n if (scrollToTop) {\n resetScroll()\n }\n }}\n >\n \n \n {pgettext(\"paginator\", \"Go\")}\n \n \n )}\n \n {posts.isLoaded && posts.next ? (\n \n chevron_right\n \n ) : (\n \n chevron_right\n \n )}\n {posts.isLoaded && posts.last ? (\n \n last_page\n \n ) : (\n \n last_page\n \n )}\n
    \n)\n\nfunction getLabel(page, pages) {\n return pgettext(\"paginator\", \"Page %(page)s of %(pages)s\")\n .replace(\"%(page)s\", page)\n .replace(\"%(pages)s\", pages)\n}\n\nfunction resetScroll() {\n window.scrollTo(0, 0)\n}\n\nconst ThreadPaginatorConnected = withRouter(ThreadPaginator)\n\nexport default ThreadPaginatorConnected\n","import React from \"react\"\n\nexport default function ({ errors, posts }) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"thread posts moderation modal title\", \"Moderation\")}\n

    \n
    \n
    \n

    \n {pgettext(\n \"thread posts moderation modal\",\n \"One or more posts could not be changed:\"\n )}\n

    \n\n
      \n {errors.map((post) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n )\n}\n\nexport function PostErrors({ errors, post }) {\n const heading = interpolate(\n pgettext(\"thread posts moderation modal\", \"%(username)s on %(posted_on)s\"),\n {\n posted_on: post.posted_on.format(\"LL, LT\"),\n username: post.poster_name,\n },\n true\n )\n\n return (\n
  • \n
    {heading}:
    \n {errors.map((error, i) => {\n return

    {error}

    \n })}\n
  • \n )\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport * as post from \"misago/reducers/post\"\nimport * as posts from \"misago/reducers/posts\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport ErrorsList from \"./errors-list\"\n\nexport function approve(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-unapproved\", value: false }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_unapproved: false,\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_unapproved: post.is_unapproved,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function protect(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: true }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: true,\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: post.is_protected,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function unprotect(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: false }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: false,\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: post.is_protected,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function hide(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: true }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(post.url, {\n hidden_by: props.user.url,\n }),\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: post.is_hidden,\n hidden_on: post.hidden_on,\n hidden_by_name: post.hidden_by_name,\n url: post.url,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function unhide(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: false }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: false,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(post.url, {\n hidden_by: props.user.url,\n }),\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: post.is_hidden,\n hidden_on: post.hidden_on,\n hidden_by_name: post.hidden_by_name,\n url: post.url,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function patch(props, ops, newState, previousState) {\n const { selection, thread } = props\n\n // patch selected items\n newState.forEach((item) => {\n post.patch(item, item)\n })\n\n // deselect all the things\n store.dispatch(posts.deselectAll())\n\n // call ajax\n const data = {\n ops,\n\n ids: selection.map((post) => {\n return post.id\n }),\n }\n\n ajax.patch(thread.api.posts.index, data).then(\n (data) => {\n data.forEach((item) => {\n store.dispatch(post.patch(item, item))\n })\n },\n (rejection) => {\n if (rejection.status !== 400) {\n // rollback all\n previousState.forEach((item) => {\n store.dispatch(post.patch(item, item))\n })\n return snackbar.apiError(rejection)\n }\n\n let errors = []\n let rollback = []\n\n rejection.forEach((item) => {\n if (item.detail) {\n errors.push(item)\n rollback.push(item.id)\n } else {\n store.dispatch(post.patch(item, item))\n }\n\n previousState.forEach((item) => {\n if (rollback.indexOf(item) !== -1) {\n store.dispatch(post.patch(item, item))\n }\n })\n })\n\n let posts = {}\n selection.forEach((item) => {\n posts[item.id] = item\n })\n\n modal.show()\n }\n )\n}\n\nexport function merge(props) {\n let confirmed = window.confirm(\n pgettext(\n \"merge posts\",\n \"Are you sure you want to merge selected posts? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n props.selection.slice(1).map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n ajax\n .post(props.thread.api.posts.merge, {\n posts: props.selection.map((post) => post.id),\n })\n .then(\n (data) => {\n store.dispatch(post.patch(data, post.hydrate(data)))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n props.selection.slice(1).map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: false,\n })\n )\n })\n }\n )\n\n store.dispatch(posts.deselectAll())\n}\n\nexport function remove(props) {\n let confirmed = window.confirm(\n pgettext(\n \"delete posts\",\n \"Are you sure you want to delete selected posts? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n props.selection.map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n const ids = props.selection.map((post) => {\n return post.id\n })\n\n ajax.delete(props.thread.api.posts.index, ids).then(\n () => {\n return\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n props.selection.map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: false,\n })\n )\n })\n }\n )\n\n store.dispatch(posts.deselectAll())\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(\n pgettext(\n \"thread posts moderation move\",\n \"You have to enter link to the other thread.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.move, {\n new_thread: this.state.url,\n posts: this.props.selection.map((post) => post.id),\n })\n }\n\n handleSuccess(success) {\n this.props.selection.forEach((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n modal.hide()\n\n snackbar.success(\n pgettext(\n \"thread posts moderation move\",\n \"Selected posts were moved to the other thread.\"\n )\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"thread posts moderation move btn\", \"Cancel\")}\n \n \n {pgettext(\"thread posts moderation move btn\", \"Move posts\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"thread posts moderation move title\", \"Move posts\")}\n

    \n
    \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport Select from \"misago/components/select\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\nimport ErrorsModal from \"./errors-list\"\n\nexport default function (props) {\n return \n}\n\nexport class PostingConfig extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isError: false,\n\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n post: item.post,\n })\n })\n\n this.setState({\n isLoaded: true,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.isError) {\n return \n } else if (this.state.isLoaded) {\n return (\n \n )\n } else {\n return \n }\n }\n}\n\nexport class ModerationForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n title: \"\",\n category: null,\n categories: props.categories,\n weight: 0,\n is_hidden: 0,\n is_closed: false,\n\n validators: {\n title: [validators.required()],\n },\n\n errors: {},\n }\n\n this.isHiddenChoices = [\n {\n value: 0,\n icon: \"visibility\",\n label: pgettext(\"thread hidden switch choice\", \"No\"),\n },\n {\n value: 1,\n icon: \"visibility_off\",\n label: pgettext(\"thread hidden switch choice\", \"Yes\"),\n },\n ]\n\n this.isClosedChoices = [\n {\n value: false,\n icon: \"lock_outline\",\n label: pgettext(\"thread closed switch choice\", \"No\"),\n },\n {\n value: true,\n icon: \"lock\",\n label: pgettext(\"thread closed switch choice\", \"Yes\"),\n },\n ]\n\n this.acl = {}\n this.props.categories.forEach((category) => {\n if (category.post) {\n if (!this.state.category) {\n this.state.category = category.id\n }\n\n this.acl[category.id] = {\n can_pin_threads: category.post.pin,\n can_close_threads: category.post.close,\n can_hide_threads: category.post.hide,\n }\n }\n })\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.split, {\n title: this.state.title,\n category: this.state.category,\n weight: this.state.weight,\n is_hidden: this.state.is_hidden,\n is_closed: this.state.is_closed,\n posts: this.props.selection.map((post) => post.id),\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.selection.forEach((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n modal.hide()\n\n snackbar.success(\n pgettext(\n \"posts moderation split\",\n \"Selected posts were split into new thread.\"\n )\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n snackbar.error(gettext(\"Form contains errors.\"))\n } else if (rejection.status === 403 && Array.isArray(rejection)) {\n modal.show()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (ev) => {\n const categoryId = ev.target.value\n const newState = {\n category: categoryId,\n }\n\n if (this.acl[categoryId].can_pin_threads < newState.weight) {\n newState.weight = 0\n }\n\n if (!this.acl[categoryId].can_hide_threads) {\n newState.is_hidden = 0\n }\n\n if (!this.acl[categoryId].can_close_threads) {\n newState.is_closed = false\n }\n\n this.setState(newState)\n }\n\n getWeightChoices() {\n const choices = [\n {\n value: 0,\n icon: \"remove\",\n label: pgettext(\"thread weight choice\", \"Not pinned\"),\n },\n {\n value: 1,\n icon: \"bookmark_border\",\n label: pgettext(\"thread weight choice\", \"Pinned in category\"),\n },\n ]\n\n if (this.acl[this.state.category].can_pin_threads == 2) {\n choices.push({\n value: 2,\n icon: \"bookmark\",\n label: pgettext(\"thread weight choice\", \"Pinned globally\"),\n })\n }\n\n return choices\n }\n\n renderWeightField() {\n if (this.acl[this.state.category].can_pin_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderHiddenField() {\n if (this.acl[this.state.category].can_hide_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderClosedField() {\n if (this.acl[this.state.category].can_close_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n \n \n
    \n\n \n \n \n
    \n\n {this.renderWeightField()}\n {this.renderHiddenField()}\n {this.renderClosedField()}\n
    \n
    \n \n {pgettext(\"posts moderation split btn\", \"Cancel\")}\n \n \n
    \n \n \n )\n }\n}\n\nexport function Loader() {\n return (\n \n \n \n )\n}\n\nexport function Error(props) {\n return (\n \n
    \n info_outline\n
    \n
    \n

    \n {pgettext(\n \"posts moderation split\",\n \"You can't move selected posts at the moment.\"\n )}\n

    \n

    {props.message}

    \n \n
    \n
    \n )\n}\n\nexport function Modal(props) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\n \"posts moderation split title\",\n \"Split posts into new thread\"\n )}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport modal from \"misago/services/modal\"\nimport * as moderation from \"./actions\"\nimport MoveModal from \"./move\"\nimport SplitModal from \"./split\"\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport class Approve extends React.Component {\n onClick = () => {\n moderation.approve(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_approve && post.is_unapproved\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Merge extends React.Component {\n onClick = () => {\n moderation.merge(this.props)\n }\n\n render() {\n const isVisible =\n this.props.selection.length > 1 &&\n this.props.selection.find((post) => {\n return post.acl.can_merge\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Move extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_move\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Split extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_move\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Protect extends React.Component {\n onClick = () => {\n moderation.protect(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return !post.is_protected && post.acl.can_protect\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unprotect extends React.Component {\n onClick = () => {\n moderation.unprotect(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.is_protected && post.acl.can_protect\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n moderation.hide(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_hide && !post.is_hidden\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n moderation.unhide(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_unhide && post.is_hidden\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n moderation.remove(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_delete\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport { ThreadPostsModerationOptions } from \"./moderation/posts\"\n\nconst ThreadPostsModeration = ({ thread, user, selection, dropup }) => (\n
    \n \n settings\n \n \n
    \n)\n\nexport default ThreadPostsModeration\n","import React from \"react\"\n\nconst ThreadReplyButton = ({ onClick }) => (\n \n chat\n {pgettext(\"thread reply btn\", \"Reply\")}\n \n)\n\nexport default ThreadReplyButton\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\nimport ThreadPaginator from \"./ThreadPaginator\"\nimport ThreadPostsModeration from \"./ThreadPostsModeration\"\nimport ThreadReplyButton from \"./ThreadReplyButton\"\nimport ThreadWatchButton from \"./ThreadWatchButton\"\n\nconst ThreadToolbarBottom = ({\n thread,\n posts,\n user,\n selection,\n moderation,\n onReply,\n}) => (\n \n {posts.pages > 1 && (\n \n \n \n \n \n )}\n \n {user.is_authenticated && (\n \n \n \n \n {thread.acl.can_reply && (\n \n \n \n )}\n {moderation.enabled && (\n \n \n \n )}\n \n )}\n {user.is_authenticated && (\n \n \n \n \n \n )}\n \n)\n\nexport default ThreadToolbarBottom\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\n\nconst ThreadToolbarThird = () => (\n \n \n \n \n window.scrollTo(0, 0)}\n >\n arrow_upward\n {pgettext(\"go up\", \"Go to top\")}\n \n \n \n \n)\n\nexport default ThreadToolbarThird\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ThreadPollButton = ({ compact, disabled, onClick }) => (\n \n poll\n {!compact && pgettext(\"thread poll btn\", \"Add poll\")}\n \n)\n\nexport default ThreadPollButton\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst ThreadShortcutsButton = ({ user, thread, posts }) => (\n
    \n \n bookmark\n \n \n
    \n)\n\nexport default ThreadShortcutsButton\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\nimport ThreadPaginator from \"./ThreadPaginator\"\nimport ThreadPollButton from \"./ThreadPollButton\"\nimport ThreadPostsModeration from \"./ThreadPostsModeration\"\nimport ThreadReplyButton from \"./ThreadReplyButton\"\nimport ThreadShortcutsButton from \"./ThreadShortcutsButton\"\n\nconst ThreadToolbarTop = ({\n thread,\n posts,\n user,\n pollDisabled,\n selection,\n moderation,\n onPoll,\n onReply,\n}) => (\n \n \n \n \n \n {posts.pages > 1 && (\n \n \n \n )}\n \n \n {thread.acl.can_start_poll && !thread.poll && (\n \n \n \n \n \n )}\n {thread.acl.can_reply ? (\n \n \n \n \n \n \n \n {thread.acl.can_start_poll && !thread.poll && (\n \n \n \n )}\n {moderation.enabled && (\n \n \n \n )}\n \n ) : (\n \n \n \n \n {thread.acl.can_start_poll && !thread.poll && (\n \n \n \n )}\n {moderation.enabled && (\n \n \n \n )}\n \n )}\n {posts.pages > 1 && (\n \n \n \n \n \n )}\n \n)\n\nexport default ThreadToolbarTop\n","import React from \"react\"\nimport Participants from \"misago/components/participants\"\nimport { Poll, PollForm } from \"misago/components/poll\"\nimport PostsList from \"misago/components/posts-list\"\nimport * as participants from \"misago/reducers/participants\"\nimport * as poll from \"misago/reducers/poll\"\nimport * as posts from \"misago/reducers/posts\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport polls from \"misago/services/polls\"\nimport snackbar from \"misago/services/snackbar\"\nimport posting from \"misago/services/posting\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { PostingQuoteSelection } from \"../posting\"\nimport PageContainer from \"../PageContainer\"\nimport ThreadHeader from \"./ThreadHeader\"\nimport ThreadToolbarBottom from \"./ThreadToolbarBottom\"\nimport ThreadToolbarThird from \"./ThreadToolbarThird\"\nimport ThreadToolbarTop from \"./ThreadToolbarTop\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n editPoll: false,\n }\n }\n\n componentDidMount() {\n if (this.shouldFetchData()) {\n this.fetchData()\n this.setPageTitle()\n }\n\n this.startPollingApi()\n }\n\n componentDidUpdate() {\n if (this.shouldFetchData()) {\n this.fetchData()\n this.startPollingApi()\n this.setPageTitle()\n }\n }\n\n componentWillUnmount() {\n this.stopPollingApi()\n }\n\n shouldFetchData() {\n if (this.props.posts.isLoaded) {\n const page = (this.props.params.page || 1) * 1\n return page != this.props.posts.page\n } else {\n return false\n }\n }\n\n fetchData() {\n store.dispatch(posts.unload())\n\n ajax\n .get(\n this.props.thread.api.posts.index,\n {\n page: this.props.params.page || 1,\n },\n \"posts\"\n )\n .then(\n (data) => {\n this.update(data)\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n startPollingApi() {\n polls.start({\n poll: \"thread-posts\",\n\n url: this.props.thread.api.posts.index,\n data: {\n page: this.props.params.page || 1,\n },\n update: this.update,\n\n frequency: 120 * 1000,\n delayed: true,\n })\n }\n\n stopPollingApi() {\n polls.stop(\"thread-posts\")\n }\n\n setPageTitle() {\n title.set({\n title: this.props.thread.title,\n parent: this.props.thread.category.name,\n page: (this.props.params.page || 1) * 1,\n })\n }\n\n update = (data) => {\n store.dispatch(thread.replace(data))\n store.dispatch(posts.load(data.post_set))\n\n if (data.participants) {\n store.dispatch(participants.replace(data.participants))\n }\n\n if (data.poll) {\n store.dispatch(poll.replace(data.poll))\n }\n\n this.setPageTitle()\n }\n\n openPollForm = () => {\n this.setState({ editPoll: true })\n }\n\n closePollForm = () => {\n this.setState({ editPoll: false })\n }\n\n openReplyForm = () => {\n posting.open({\n mode: \"REPLY\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n })\n }\n\n render() {\n const category = this.props.thread.category\n\n let className = \"page page-thread\"\n if (category.css_class) {\n className += \" page-thread-\" + category.css_class\n }\n\n const styleName =\n category.special_role === \"private_threads\"\n ? \"private-threads\"\n : category.css_class || \"category-threads\"\n\n const threadModeration = getThreadModeration(\n this.props.thread,\n this.props.user\n )\n\n const postsModeration = getPostsModeration(\n this.props.posts.results,\n this.props.user\n )\n const selection = this.props.posts.results.filter((post) => post.isSelected)\n\n return (\n
    \n \n \n \n \n {this.state.editPoll ? (\n \n ) : (\n \n )}\n {this.props.thread.acl.can_reply ? (\n \n \n \n ) : (\n \n )}\n \n \n \n
    \n )\n }\n}\n\nconst getThreadModeration = (thread, user) => {\n const moderation = {\n enabled: false,\n edit: false,\n approve: false,\n close: false,\n open: false,\n hide: false,\n unhide: false,\n move: false,\n merge: false,\n pinGlobally: false,\n pinLocally: false,\n unpin: false,\n delete: false,\n }\n\n if (!user.is_authenticated) return moderation\n\n moderation.edit = thread.acl.can_edit\n moderation.approve = thread.acl.can_approve && thread.is_unapproved\n moderation.close = thread.acl.can_close && !thread.is_closed\n moderation.open = thread.acl.can_close && thread.is_closed\n moderation.hide = thread.acl.can_hide && !thread.is_hidden\n moderation.unhide = thread.acl.can_unhide && thread.is_hidden\n moderation.move = thread.acl.can_move\n moderation.merge = thread.acl.can_merge\n moderation.pinGlobally = thread.acl.can_pin_globally && thread.weight < 2\n moderation.pinLocally = thread.acl.can_pin && thread.weight !== 1\n moderation.unpin =\n (thread.acl.can_pin && thread.weight === 1) ||\n (thread.acl.can_pin_globally && thread.weight === 2)\n moderation.delete = thread.acl.can_delete\n\n moderation.enabled =\n moderation.edit ||\n moderation.approve ||\n moderation.close ||\n moderation.open ||\n moderation.hide ||\n moderation.unhide ||\n moderation.move ||\n moderation.merge ||\n moderation.pinGlobally ||\n moderation.pinLocally ||\n moderation.unpin ||\n moderation.delete\n\n return moderation\n}\n\nconst getPostsModeration = (posts, user) => {\n const moderation = {\n enabled: false,\n approve: false,\n move: false,\n merge: false,\n protect: false,\n hide: false,\n delete: false,\n }\n\n if (!user.is_authenticated) return moderation\n\n posts.forEach((post) => {\n if (!post.is_event) {\n if (post.acl.can_approve && post.is_unapproved) {\n moderation.approve = true\n }\n if (post.acl.can_move) moderation.move = true\n if (post.acl.can_merge) moderation.merge = true\n if (post.acl.can_protect || post.acl.can_unprotect) {\n moderation.protect = true\n }\n if (post.acl.can_hide || post.acl.can_unhide) {\n moderation.hide = true\n }\n if (post.acl.can_delete) moderation.delete = true\n\n if (\n moderation.approve ||\n moderation.move ||\n moderation.merge ||\n moderation.protect ||\n moderation.hide ||\n moderation.delete\n ) {\n moderation.enabled = true\n }\n }\n })\n\n return moderation\n}\n","import { connect } from \"react-redux\"\nimport Route from \"misago/components/thread/route\"\nimport misago from \"misago/index\"\n\nexport function select(store) {\n return {\n participants: store.participants,\n poll: store.poll,\n posts: store.posts,\n thread: store.thread,\n tick: store.tick.tick,\n user: store.auth.user,\n }\n}\n\nexport function paths() {\n const thread = misago.get(\"THREAD\")\n const basePath = thread.url.index.replace(\n thread.slug + \"-\" + thread.pk,\n \":slug\"\n )\n return [\n {\n path: basePath,\n component: connect(select)(Route),\n },\n {\n path: basePath + \":page/\",\n component: connect(select)(Route),\n },\n ]\n}\n","import { paths } from \"misago/components/thread/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"THREAD\") && context.has(\"POSTS\")) {\n mount({\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:thread\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { UserNavOverlay } from \"../../components/UserNav\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"user-nav-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:user-nav-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst UsersNav = ({ baseUrl, page, pages }) => (\n
    \n
    \n \n menu\n {page.name}\n \n
      \n {pages.map((page) => {\n const url = getPageUrl(baseUrl, page)\n return (\n
    • \n {page.name}\n
    • \n )\n })}\n
    \n
    \n
      \n {pages.map((page) => {\n const url = getPageUrl(baseUrl, page)\n return (\n
    • \n {page.name}\n
    • \n )\n })}\n
    \n
    \n)\n\nconst getPageUrl = (baseUrl, page) => {\n let url = baseUrl\n if (page.component === \"rank\") {\n url += page.slug\n } else {\n url += page.component\n }\n return url + \"/\"\n}\n\nexport default UsersNav\n","import React from \"react\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n getEmptyMessage() {\n return interpolate(\n npgettext(\n \"top posters empty\",\n \"No users have posted any new messages during last %(days)s day.\",\n \"No users have posted any new messages during last %(days)s days.\",\n this.props.trackedPeriod\n ),\n { days: this.props.trackedPeriod },\n true\n )\n }\n\n render() {\n return (\n
    \n \n \n

    {this.getEmptyMessage()}

    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n getClassName() {\n if (this.props.hiddenOnMobile) {\n return \"list-group-item hidden-xs hidden-sm\"\n } else {\n return \"list-group-item\"\n }\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n\n
    \n
    \n \n \n  \n \n \n
    \n\n
    \n \n  \n \n  \n \n \n \n \n  \n \n \n \n \n  \n \n \n
    \n
    \n \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Rank\")}\n \n \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Ranked posts\")}\n \n
    \n
    \n\n
    \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Rank\")}\n
    \n\n
    \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Ranked posts\")}\n
    \n\n
    \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Total posts\")}\n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ItemPreview from \"misago/components/users/active-posters/list-item-preview\"\nimport * as random from \"misago/utils/random\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n \n \n

    \n \n  \n \n

    \n\n
    \n
      \n {[0, 1, 2].map((i) => {\n return 0} key={i} />\n })}\n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Avatar from \"misago/components/avatar\"\nimport Status, { StatusIcon, StatusLabel } from \"misago/components/user-status\"\nimport misago from \"misago/index\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.rank.css_class) {\n return \"list-group-item list-group-rank-\" + this.props.rank.css_class\n } else {\n return \"list-group-item\"\n }\n }\n\n getUserStatus() {\n if (this.props.user.status) {\n return (\n \n \n \n \n )\n }\n\n return (\n \n  \n \n  \n \n \n )\n }\n\n getRankName() {\n if (!this.props.rank.is_tab) {\n return (\n {this.props.rank.name}\n )\n }\n\n let rankUrl = misago.get(\"USERS_LIST_URL\") + this.props.rank.slug + \"/\"\n return (\n \n {this.props.rank.name}\n \n )\n }\n\n getUserTitle() {\n if (!this.props.user.title) return null\n\n return (\n \n {this.props.user.title}\n \n )\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n\n
    \n \n
    \n {this.getUserStatus()}\n {this.getRankName()}\n {this.getUserTitle()}\n
    \n
    \n \n #{this.props.counter}\n {pgettext(\"top posters list item\", \"Rank\")}\n \n\n \n {this.props.user.meta.score}\n {pgettext(\"top posters list item\", \"Ranked posts\")}\n \n
    \n
    \n\n
    \n #{this.props.counter}\n {pgettext(\"top posters list item\", \"Rank\")}\n
    \n\n
    \n {this.props.user.meta.score}\n {pgettext(\"top posters list item\", \"Ranked posts\")}\n
    \n\n
    \n {this.props.user.posts}\n {pgettext(\"top posters list item\", \"Total posts\")}\n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ListItem from \"misago/components/users/active-posters/list-item\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n getLeadMessage() {\n let message = npgettext(\n \"top posters list\",\n \"%(posters)s top poster from last %(days)s days.\",\n \"%(posters)s top posters from last %(days)s days.\",\n this.props.count\n )\n\n return interpolate(\n message,\n {\n posters: this.props.count,\n days: this.props.trackedPeriod,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n \n \n

    {this.getLeadMessage()}

    \n\n
    \n
      \n {this.props.users.map((user, i) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/users/active-posters/list-empty\"\nimport ListPreview from \"misago/components/users/active-posters/list-preview\"\nimport ListReady from \"misago/components/users/active-posters/list-ready\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"USERS\")) {\n this.initWithPreloadedData(misago.pop(\"USERS\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling()\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n\n trackedPeriod: data.tracked_period,\n count: data.count,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling() {\n polls.start({\n poll: \"active-posters\",\n url: misago.get(\"USERS_API\"),\n data: {\n list: \"active\",\n },\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data.results))\n\n this.setState({\n isLoaded: true,\n\n trackedPeriod: data.tracked_period,\n count: data.count,\n })\n }\n\n componentDidMount() {\n title.set({\n title: this.props.route.extra.name,\n parent: pgettext(\"users page title\", \"Users\"),\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"active-posters\")\n }\n\n render() {\n const page = { name: this.props.route.extra.name }\n\n if (this.state.isLoaded) {\n if (this.state.count > 0) {\n return (\n \n )\n } else {\n return (\n \n )\n }\n } else {\n return \n }\n }\n}\n","import React from \"react\"\nimport stringCount from \"misago/utils/string-count\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.copy && this.props.copy.length) {\n if (\n stringCount(this.props.copy, \"\n )\n } else {\n return null\n }\n }\n}\n","export default function (string, subString) {\n string = (string + \"\").toLowerCase()\n subString = (subString + \"\").toLowerCase()\n\n if (subString.length <= 0) return 0\n\n let n = 0\n let pos = 0\n let step = subString.length\n\n while (true) {\n pos = string.indexOf(subString, pos)\n if (pos >= 0) {\n n += 1\n pos += step\n } else {\n break\n }\n }\n\n return n\n}\n","import React from \"react\"\nimport UsersList from \"../../users-list\"\n\nconst RankUsersList = ({ users }) => (\n \n)\n\nexport default RankUsersList\n","import React from \"react\"\nimport UsersList from \"misago/components/users-list\"\n\nclass RankUsersListLoader extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render = () => \n}\n\nexport default RankUsersListLoader\n","import React from \"react\"\n\nconst RankUsersLeft = ({ users }) => {\n if (users.more) {\n return (\n

    \n {interpolate(\n npgettext(\n \"rank users list\",\n \"There is %(more)s more user with this rank.\",\n \"There are %(more)s more users with this rank.\",\n users.more\n ),\n { more: users.more },\n true\n )}\n

    \n )\n }\n\n return (\n

    \n {pgettext(\n \"rank users list empty\",\n \"There are no more users with this rank.\"\n )}\n

    \n )\n}\n\nexport default RankUsersLeft\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst RankUsersPagination = ({ baseUrl, users }) => (\n
    \n {users.isLoaded && users.first ? (\n \n first_page\n \n ) : (\n \n first_page\n \n )}\n {users.isLoaded && users.previous ? (\n 1 ? users.previous + \"/\" : \"\")}\n title={pgettext(\"rank users list paginator\", \"Go to previous page\")}\n >\n chevron_left\n \n ) : (\n \n chevron_left\n \n )}\n {users.isLoaded && users.next ? (\n \n chevron_right\n \n ) : (\n \n chevron_right\n \n )}\n {users.isLoaded && users.last ? (\n \n last_page\n \n ) : (\n \n last_page\n \n )}\n
    \n)\n\nexport default RankUsersPagination\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\nimport RankUsersLeft from \"./RankUsersLeft\"\nimport RankUsersPagination from \"./RankUsersPagination\"\n\nconst RankUsersToolbar = ({ baseUrl, users }) => (\n \n \n \n \n \n \n \n \n \n \n \n \n)\n\nexport default RankUsersToolbar\n","import React from \"react\"\nimport PageLead from \"misago/components/page-lead\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport PageContainer from \"../../PageContainer\"\nimport RankUsersList from \"./RankUsersList\"\nimport RankUsersListLoader from \"./RankUsersListLoader\"\nimport RankUsersToolbar from \"./RankUsersToolbar\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"USERS\")) {\n this.initWithPreloadedData(misago.pop(\"USERS\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling(props.params.page || 1)\n }\n\n initWithPreloadedData(data) {\n this.state = Object.assign(data, {\n isLoaded: true,\n })\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling(page) {\n polls.start({\n poll: \"rank-users\",\n url: misago.get(\"USERS_API\"),\n data: {\n rank: this.props.route.rank.id,\n page: page,\n },\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data.results))\n\n data.isLoaded = true\n this.setState(data)\n }\n\n componentDidMount() {\n title.set({\n title: this.props.route.rank.name,\n page: this.props.params.page || null,\n parent: pgettext(\"users page title\", \"Users\"),\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"rank-users\")\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.params.page !== nextProps.params.page) {\n title.set({\n title: this.props.route.rank.name,\n page: nextProps.params.page || null,\n parent: pgettext(\"users page title\", \"Users\"),\n })\n\n this.setState({\n isLoaded: false,\n })\n\n polls.stop(\"rank-users\")\n this.startPolling(nextProps.params.page)\n }\n }\n\n getClassName() {\n if (this.props.route.rank.css_class) {\n return \"rank-users-list rank-users-\" + this.props.route.rank.css_class\n } else {\n return \"rank-users-list\"\n }\n }\n\n getRankDescription() {\n if (this.props.route.rank.description) {\n return (\n
    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getComponent() {\n if (this.state.isLoaded) {\n if (this.state.count > 0) {\n return \n } else {\n return (\n

    \n {pgettext(\n \"rank users list\",\n \"There are no users with this rank at the moment.\"\n )}\n

    \n )\n }\n } else {\n return \n }\n }\n\n render() {\n return (\n
    \n \n \n {this.getRankDescription()}\n {this.getComponent()}\n \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport ActivePosters from \"misago/components/users/active-posters/root\"\nimport Rank from \"misago/components/users/rank/root\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago/index\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nexport default class extends WithDropdown {\n render() {\n return (\n
    \n \n \n \n

    {pgettext(\"users page title\", \"Users\")}

    \n
    \n
    \n
    \n {this.props.children}\n
    \n )\n }\n}\n\nexport function select(store) {\n return {\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n }\n}\n\nexport function paths() {\n let paths = []\n\n misago.get(\"USERS_LISTS\").forEach(function (item) {\n if (item.component === \"rank\") {\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/:page/\",\n component: connect(select)(Rank),\n rank: item,\n })\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/\",\n component: connect(select)(Rank),\n rank: item,\n })\n } else if (item.component === \"active-posters\") {\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.component + \"/\",\n component: connect(select)(ActivePosters),\n extra: {\n name: item.name,\n },\n })\n }\n })\n\n return paths\n}\n","import Users, { paths } from \"misago/components/users/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"USERS_LISTS\")) {\n mount({\n root: misago.get(\"USERS_LIST_URL\"),\n component: Users,\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:users\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\n\nexport default function initializer(context) {\n include.init(context.get(\"STATIC_URL\"))\n}\n\nmisago.addInitializer({\n name: \"include\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n storage.init(\"misago_\")\n}\n\nmisago.addInitializer({\n name: \"local-storage\",\n initializer: initializer,\n})\n","import mount from \"misago/utils/mount-component\"\n\nexport class MobileNavbarDropdown {\n init(element) {\n this._element = element\n this._component = null\n }\n\n show(component) {\n if (this._component === component) {\n this.hide()\n } else {\n this._component = component\n mount(component, this._element.id)\n $(this._element).addClass(\"open\")\n }\n }\n\n showConnected(name, component) {\n if (this._component === name) {\n this.hide()\n } else {\n this._component = name\n mount(component, this._element.id, true)\n $(this._element).addClass(\"open\")\n }\n }\n\n hide() {\n $(this._element).removeClass(\"open\")\n this._component = null\n }\n}\n\nexport default new MobileNavbarDropdown()\n","import misago from \"misago/index\"\nimport dropdown from \"misago/services/mobile-navbar-dropdown\"\n\nexport default function initializer() {\n let element = document.getElementById(\"mobile-navbar-dropdown-mount\")\n if (element) {\n dropdown.init(element)\n }\n}\n\nmisago.addInitializer({\n name: \"dropdown\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport modal from \"misago/services/modal\"\n\nexport default function initializer() {\n let element = document.getElementById(\"modal-mount\")\n if (element) {\n modal.init(element)\n }\n}\n\nmisago.addInitializer({\n name: \"modal\",\n initializer: initializer,\n before: \"store\",\n})\n","import moment from \"moment\"\nimport misago from \"misago/index\"\n\nexport default function initializer() {\n moment.locale($(\"html\").attr(\"lang\"))\n}\n\nmisago.addInitializer({\n name: \"moment\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport title from \"misago/services/page-title\"\n\nexport default function initializer(context) {\n title.init(\n context.get(\"SETTINGS\").forum_index_title,\n context.get(\"SETTINGS\").forum_name\n )\n}\n\nmisago.addInitializer({\n name: \"page-title\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport polls from \"misago/services/polls\"\n\nexport default function initializer() {\n polls.init(ajax, snackbar)\n}\n\nmisago.addInitializer({\n name: \"polls\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer() {\n posting.init(ajax, snackbar, document.getElementById(\"posting-mount\"))\n}\n\nmisago.addInitializer({\n name: \"posting\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/auth\"\nimport store from \"misago/services/store\"\n\nexport default function initializer(context) {\n store.addReducer(\n \"auth\",\n reducer,\n Object.assign(\n {\n isAuthenticated: context.get(\"isAuthenticated\"),\n isAnonymous: !context.get(\"isAuthenticated\"),\n\n user: context.get(\"user\"),\n },\n initialState\n )\n )\n}\n\nmisago.addInitializer({\n name: \"reducer:auth\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"../../reducers/overlay\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n store.addReducer(\"overlay\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:overlay\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/participants\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\")) {\n initialState = misago.get(\"THREAD\").participants\n }\n\n store.addReducer(\"participants\", reducer, initialState || [])\n}\n\nmisago.addInitializer({\n name: \"reducer:participants\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/poll\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\") && misago.get(\"THREAD\").poll) {\n initialState = hydrate(misago.get(\"THREAD\").poll)\n } else {\n initialState = {}\n }\n\n store.addReducer(\"poll\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:poll\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"POSTS\")) {\n initialState = hydrate(misago.get(\"POSTS\"))\n } else {\n initialState = {\n isLoaded: false,\n isBusy: false,\n }\n }\n\n store.addReducer(\"posts\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:posts\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile-details\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"PROFILE_DETAILS\")) {\n initialState = misago.get(\"PROFILE_DETAILS\")\n }\n\n store.addReducer(\"profile-details\", reducer, initialState || {})\n}\n\nmisago.addInitializer({\n name: \"reducer:profile-details\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n if (misago.has(\"PROFILE\")) {\n store.dispatch(hydrate(misago.get(\"PROFILE\")))\n }\n}\n\nmisago.addInitializer({\n name: \"reducer:profile-hydrate\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"profile\", reducer, {})\n}\n\nmisago.addInitializer({\n name: \"reducer:profile\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago\"\nimport reducer, { initialState } from \"misago/reducers/search\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\n \"search\",\n reducer,\n Object.assign({}, initialState, {\n providers: misago.get(\"SEARCH_PROVIDERS\") || [],\n query: misago.get(\"SEARCH_QUERY\") || \"\",\n })\n )\n}\n\nmisago.addInitializer({\n name: \"reducer:search\",\n initializer: initializer,\n before: \"store\",\n})\n","export function push(array, value) {\n if (array.indexOf(value) === -1) {\n let copy = array.slice()\n copy.push(value)\n return copy\n } else {\n return array\n }\n}\n\nexport function remove(array, value) {\n if (array.indexOf(value) >= 0) {\n return array.filter(function (i) {\n return i !== value\n })\n } else {\n return array\n }\n}\n\nexport function toggle(array, value) {\n if (array.indexOf(value) === -1) {\n let copy = array.slice()\n copy.push(value)\n return copy\n } else {\n return array.filter(function (i) {\n return i !== value\n })\n }\n}\n","import { toggle } from \"misago/utils/sets\"\n\nexport const SELECT_ALL = \"SELECT_ALL\"\nexport const SELECT_NONE = \"SELECT_NONE\"\nexport const SELECT_ITEM = \"SELECT_ITEM\"\n\nexport function all(itemsIds) {\n return {\n type: SELECT_ALL,\n items: itemsIds,\n }\n}\n\nexport function none() {\n return {\n type: SELECT_NONE,\n }\n}\n\nexport function item(itemId) {\n return {\n type: SELECT_ITEM,\n item: itemId,\n }\n}\n\nexport default function selection(state = [], action = null) {\n switch (action.type) {\n case SELECT_ALL:\n return action.items\n\n case SELECT_NONE:\n return []\n\n case SELECT_ITEM:\n return toggle(state, action.item)\n\n default:\n return state\n }\n}\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/selection\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"selection\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:selection\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"snackbar\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:snackbar\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/thread\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\")) {\n initialState = hydrate(misago.get(\"THREAD\"))\n } else {\n initialState = {\n isBusy: false,\n }\n }\n\n store.addReducer(\"thread\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:thread\",\n initializer: initializer,\n before: \"store\",\n})\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_THREADS = \"APPEND_THREADS\"\nexport const DELETE_THREAD = \"DELETE_THREAD\"\nexport const FILTER_THREADS = \"FILTER_THREADS\"\nexport const HYDRATE_THREADS = \"HYDRATE_THREADS\"\nexport const PATCH_THREAD = \"PATCH_THREAD\"\nexport const SORT_THREADS = \"SORT_THREADS\"\n\nexport const MODERATION_PERMISSIONS = [\n \"can_announce\",\n \"can_approve\",\n \"can_close\",\n \"can_hide\",\n \"can_move\",\n \"can_merge\",\n \"can_pin\",\n \"can_review\",\n]\n\nexport function append(items, sorting) {\n return {\n type: APPEND_THREADS,\n items,\n sorting,\n }\n}\n\nexport function deleteThread(thread) {\n return {\n type: DELETE_THREAD,\n thread,\n }\n}\n\nexport function filterThreads(category, categoriesMap) {\n return {\n type: FILTER_THREADS,\n category,\n categoriesMap,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_THREADS,\n items,\n }\n}\n\nexport function patch(thread, patch, sorting = null) {\n return {\n type: PATCH_THREAD,\n thread,\n patch,\n sorting,\n }\n}\n\nexport function sort(sorting) {\n return {\n type: SORT_THREADS,\n sorting,\n }\n}\n\nexport function getThreadModerationOptions(thread_acl) {\n let options = []\n MODERATION_PERMISSIONS.forEach(function (perm) {\n if (thread_acl[perm]) {\n options.push(perm)\n }\n })\n return options\n}\n\nexport function hydrateThread(thread) {\n return Object.assign({}, thread, {\n moderation: getThreadModerationOptions(thread.acl),\n })\n}\n\nexport default function thread(state = [], action = null) {\n switch (action.type) {\n case APPEND_THREADS:\n const mergedState = concatUnique(action.items.map(hydrateThread), state)\n return mergedState.sort(action.sorting)\n\n case DELETE_THREAD:\n return state.filter(function (item) {\n return item.id !== action.thread.id\n })\n\n case FILTER_THREADS:\n return state.filter(function (item) {\n const itemCategory = action.categoriesMap[item.category]\n if (\n itemCategory.lft >= action.category.lft &&\n itemCategory.rght <= action.category.rght\n ) {\n // same or sub category\n return true\n } else if (item.weight == 2) {\n // globally pinned\n return true\n } else {\n // thread moved outside displayed scope, hide it\n return false\n }\n })\n\n case HYDRATE_THREADS:\n return action.items.map(hydrateThread)\n\n case PATCH_THREAD:\n const patchedState = state.map(function (item) {\n if (item.id === action.thread.id) {\n return Object.assign({}, item, action.patch)\n } else {\n return item\n }\n })\n\n if (action.sorting) {\n return patchedState.sort(action.sorting)\n }\n return patchedState\n\n case SORT_THREADS:\n return state.sort(action.sorting)\n\n default:\n return state\n }\n}\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/threads\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"threads\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:threads\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"tick\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:tick\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/username-history\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"username-history\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:username-history\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/users\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"users\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:users\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n snackbar.init(store)\n}\n\nmisago.addInitializer({\n name: \"snackbar\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.init()\n}\n\nmisago.addInitializer({\n name: \"store\",\n initializer: initializer,\n before: \"_end\",\n})\n","import misago from \"misago/index\"\nimport { doTick } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nconst TICK_PERIOD = 50 * 1000 //do the tick every 50s\n\nexport default function initializer() {\n window.setInterval(function () {\n store.dispatch(doTick())\n }, TICK_PERIOD)\n}\n\nmisago.addInitializer({\n name: \"tick-start\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\nimport zxcvbn from \"misago/services/zxcvbn\"\n\nexport default function initializer() {\n zxcvbn.init(include)\n}\n\nmisago.addInitializer({\n name: \"zxcvbn\",\n initializer: initializer,\n})\n","import { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\n\nexport var initialState = {\n signedIn: false,\n signedOut: false,\n}\n\nexport const UPDATE_AUTHENTICATED_USER = \"UPDATE_AUTHENTICATED_USER\"\nexport const PATCH_USER = \"PATCH_USER\"\nexport const SIGN_IN = \"SIGN_IN\"\nexport const SIGN_OUT = \"SIGN_OUT\"\n\nexport function updateAuthenticatedUser(data) {\n return {\n type: UPDATE_AUTHENTICATED_USER,\n data,\n }\n}\n\nexport function patch(patch) {\n return {\n type: PATCH_USER,\n patch,\n }\n}\n\nexport function signIn(user) {\n return {\n type: SIGN_IN,\n user,\n }\n}\n\nexport function signOut(soft = false) {\n return {\n type: SIGN_OUT,\n soft,\n }\n}\n\nexport default function auth(state = initialState, action = null) {\n switch (action.type) {\n case PATCH_USER:\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, action.patch)\n return newState\n\n case UPDATE_AUTHENTICATED_USER:\n let updatedState = Object.assign({}, state)\n updatedState.user = Object.assign({}, state.user, action.data)\n return updatedState\n\n case SIGN_IN:\n return Object.assign({}, state, {\n signedIn: action.user,\n })\n\n case SIGN_OUT:\n return Object.assign({}, state, {\n isAuthenticated: false,\n isAnonymous: true,\n signedOut: !action.soft,\n })\n\n case UPDATE_AVATAR:\n if (state.isAuthenticated && state.user.id === action.userId) {\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, {\n avatars: action.avatars,\n })\n return newState\n }\n return state\n\n case UPDATE_USERNAME:\n if (state.isAuthenticated && state.user.id === action.userId) {\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, {\n username: action.username,\n slug: action.slug,\n })\n return newState\n }\n return state\n\n default:\n return state\n }\n}\n","export const OPEN_SITE_NAV = \"OPEN_SITE_NAV\"\nexport const OPEN_SEARCH = \"OPEN_SEARCH\"\nexport const OPEN_NOTIFICATIONS = \"OPEN_NOTIFICATIONS\"\nexport const OPEN_PRIVATE_THREADS = \"OPEN_PRIVATE_THREADS\"\nexport const OPEN_USER_NAV = \"OPEN_USER_NAV\"\nexport const CLOSE = \"CLOSE_OVERLAYS\"\n\nexport function openSiteNav() {\n return { type: OPEN_SITE_NAV }\n}\n\nexport function openSearch() {\n return { type: OPEN_SEARCH }\n}\n\nexport function openNotifications() {\n return { type: OPEN_NOTIFICATIONS }\n}\n\nexport function openPrivateThreads() {\n return { type: OPEN_PRIVATE_THREADS }\n}\n\nexport function openUserNav() {\n return { type: OPEN_USER_NAV }\n}\n\nexport function close() {\n return { type: CLOSE }\n}\n\nexport const initialState = {\n siteNav: false,\n search: false,\n notifications: false,\n privateThreads: false,\n userNav: false,\n}\n\nexport default function notifications(state = initialState, action = null) {\n switch (action.type) {\n case OPEN_SITE_NAV:\n return Object.assign({}, state, initialState, { siteNav: true })\n\n case OPEN_SEARCH:\n return Object.assign({}, state, initialState, { search: true })\n\n case OPEN_NOTIFICATIONS:\n return Object.assign({}, state, initialState, { notifications: true })\n\n case OPEN_PRIVATE_THREADS:\n return Object.assign({}, state, initialState, { privateThreads: true })\n\n case OPEN_USER_NAV:\n return Object.assign({}, state, initialState, { userNav: true })\n\n case CLOSE:\n return Object.assign({}, state, initialState)\n\n default:\n return state\n }\n}\n","export const REPLACE_PARTICIPANTS = \"REPLACE_PARTICIPANTS\"\n\nexport function replace(newState) {\n return {\n type: REPLACE_PARTICIPANTS,\n state: newState,\n }\n}\n\nexport default function participants(state = [], action = null) {\n switch (action.type) {\n case REPLACE_PARTICIPANTS:\n return action.state\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\n\nexport const BUSY_POLL = \"BUSY_POLL\"\nexport const RELEASE_POLL = \"RELEASE_POLL\"\nexport const REMOVE_POLL = \"REMOVE_POLL\"\nexport const REPLACE_POLL = \"REPLACE_POLL\"\nexport const UPDATE_POLL = \"UPDATE_POLL\"\n\nexport function hydrate(json) {\n let hasSelectedChoices = false\n for (const i in json.choices) {\n const choice = json.choices[i]\n if (choice.selected) {\n hasSelectedChoices = true\n break\n }\n }\n\n return Object.assign({}, json, {\n posted_on: moment(json.posted_on),\n\n hasSelectedChoices,\n endsOn: json.length\n ? moment(json.posted_on).add(json.length, \"days\")\n : null,\n\n isBusy: false,\n })\n}\n\nexport function busy() {\n return {\n type: BUSY_POLL,\n }\n}\n\nexport function release() {\n return {\n type: RELEASE_POLL,\n }\n}\n\nexport function replace(newState, hydrated = false) {\n return {\n type: REPLACE_POLL,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function update(data) {\n return {\n type: UPDATE_POLL,\n data,\n }\n}\n\nexport function remove() {\n return {\n type: REMOVE_POLL,\n }\n}\n\nexport default function poll(state = {}, action = null) {\n switch (action.type) {\n case BUSY_POLL:\n return Object.assign({}, state, { isBusy: true })\n\n case RELEASE_POLL:\n return Object.assign({}, state, { isBusy: false })\n\n case REMOVE_POLL:\n return {\n isBusy: false,\n }\n\n case REPLACE_POLL:\n return action.state\n\n case UPDATE_POLL:\n return Object.assign({}, state, action.data)\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport { hydrateUser } from \"./users\"\n\nexport const PATCH_POST = \"PATCH_POST\"\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n posted_on: moment(json.posted_on),\n updated_on: moment(json.updated_on),\n hidden_on: moment(json.hidden_on),\n\n attachments: json.attachments\n ? json.attachments.map(hydrateAttachment)\n : null,\n poster: json.poster ? hydrateUser(json.poster) : null,\n\n isSelected: false,\n isBusy: false,\n isDeleted: false,\n })\n}\n\nexport function hydrateAttachment(json) {\n return Object.assign({}, json, {\n uploaded_on: moment(json.uploaded_on),\n })\n}\n\nexport function patch(post, patch) {\n return {\n type: PATCH_POST,\n post,\n patch,\n }\n}\n\nexport default function post(state = {}, action = null) {\n switch (action.type) {\n case PATCH_POST:\n if (state.id == action.post.id) {\n return Object.assign({}, state, action.patch)\n }\n return state\n\n default:\n return state\n }\n}\n","import postReducer, {\n PATCH_POST,\n hydrate as hydratePost,\n} from \"misago/reducers/post\"\n\nexport const APPEND_POSTS = \"APPEND_POSTS\"\nexport const SELECT_POST = \"SELECT_POST\"\nexport const DESELECT_POST = \"DESELECT_POST\"\nexport const DESELECT_POSTS = \"DESELECT_POSTS\"\nexport const LOAD_POSTS = \"LOAD_POSTS\"\nexport const UNLOAD_POSTS = \"UNLOAD_POSTS\"\nexport const UPDATE_POSTS = \"UPDATE_POSTS\"\n\nexport function select(post) {\n return {\n type: SELECT_POST,\n post,\n }\n}\n\nexport function deselect(post) {\n return {\n type: DESELECT_POST,\n post,\n }\n}\n\nexport function deselectAll() {\n return {\n type: DESELECT_POSTS,\n }\n}\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n results: json.results.map(hydratePost),\n isLoaded: true,\n isBusy: false,\n isSelected: false,\n })\n}\n\nexport function load(newState, hydrated = false) {\n return {\n type: LOAD_POSTS,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function append(newState, hydrated = false) {\n return {\n type: APPEND_POSTS,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function unload() {\n return {\n type: UNLOAD_POSTS,\n }\n}\n\nexport function update(newState) {\n return {\n type: UPDATE_POSTS,\n update: newState,\n }\n}\n\nexport default function posts(state = {}, action = null) {\n switch (action.type) {\n case SELECT_POST:\n const selectedPosts = state.results.map((post) => {\n if (post.id == action.post.id) {\n return Object.assign({}, post, {\n isSelected: true,\n })\n } else {\n return post\n }\n })\n\n return Object.assign({}, state, {\n results: selectedPosts,\n })\n\n case DESELECT_POST:\n const deseletedPosts = state.results.map((post) => {\n if (post.id == action.post.id) {\n return Object.assign({}, post, {\n isSelected: false,\n })\n } else {\n return post\n }\n })\n\n return Object.assign({}, state, {\n results: deseletedPosts,\n })\n\n case DESELECT_POSTS:\n const deseletedAllPosts = state.results.map((post) => {\n return Object.assign({}, post, {\n isSelected: false,\n })\n })\n\n return Object.assign({}, state, {\n results: deseletedAllPosts,\n })\n\n case APPEND_POSTS:\n let results = state.results.slice()\n const resultsIds = state.results.map((post) => {\n return post.id\n })\n\n action.state.results.map((post) => {\n if (resultsIds.indexOf(post.id) === -1) {\n results.push(post)\n }\n })\n\n return Object.assign({}, action.state, {\n results,\n })\n\n case LOAD_POSTS:\n return action.state\n\n case UNLOAD_POSTS:\n return Object.assign({}, state, {\n isLoaded: false,\n })\n\n case UPDATE_POSTS:\n return Object.assign({}, state, action.update)\n\n case PATCH_POST:\n const reducedPosts = state.results.map((post) => {\n return postReducer(post, action)\n })\n\n return Object.assign({}, state, {\n results: reducedPosts,\n })\n\n default:\n return state\n }\n}\n","export const LOAD_DETAILS = \"LOAD_DETAILS\"\n\nexport function load(newState) {\n return {\n type: LOAD_DETAILS,\n\n newState,\n }\n}\n\nexport default function details(state = {}, action = null) {\n switch (action.type) {\n case LOAD_DETAILS:\n return action.newState\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport {\n UPDATE_AVATAR,\n UPDATE_USERNAME,\n hydrateStatus,\n} from \"misago/reducers/users\"\n\nexport const HYDRATE_PROFILE = \"HYDRATE_PROFILE\"\nexport const PATCH_PROFILE = \"PATCH_PROFILE\"\n\nexport function hydrate(profile) {\n return {\n type: HYDRATE_PROFILE,\n profile,\n }\n}\n\nexport function patch(patch) {\n return {\n type: PATCH_PROFILE,\n patch,\n }\n}\n\nexport default function auth(state = {}, action = null) {\n switch (action.type) {\n case HYDRATE_PROFILE:\n return Object.assign({}, action.profile, {\n joined_on: moment(action.profile.joined_on),\n status: hydrateStatus(action.profile.status),\n })\n\n case PATCH_PROFILE:\n return Object.assign({}, state, action.patch)\n\n case UPDATE_AVATAR:\n if (state.id === action.userId) {\n return Object.assign({}, state, {\n avatars: action.avatars,\n })\n }\n return state\n\n case UPDATE_USERNAME:\n if (state.id === action.userId) {\n return Object.assign({}, state, {\n username: action.username,\n slug: action.slug,\n })\n }\n return state\n\n default:\n return state\n }\n}\n","export const REPLACE_SEARCH = \"REPLACE_SEARCH\"\nexport const UPDATE_SEARCH = \"UPDATE_SEARCH\"\nexport const UPDATE_SEARCH_PROVIDER = \"UPDATE_SEARCH_PROVIDER\"\n\nexport const initialState = {\n isLoading: false,\n query: \"\",\n providers: [],\n}\n\nexport function replace(newState) {\n return {\n type: REPLACE_SEARCH,\n state: {\n isLoading: false,\n providers: newState,\n },\n }\n}\n\nexport function update(newState) {\n return {\n type: UPDATE_SEARCH,\n update: newState,\n }\n}\n\nexport function updateProvider(provider) {\n return {\n type: UPDATE_SEARCH_PROVIDER,\n provider: provider,\n }\n}\n\nexport default function participants(state = {}, action = null) {\n switch (action.type) {\n case REPLACE_SEARCH:\n return action.state\n\n case UPDATE_SEARCH:\n return Object.assign({}, state, action.update)\n\n case UPDATE_SEARCH_PROVIDER:\n return Object.assign({}, state, {\n providers: state.providers.map((provider) => {\n if (provider.id === action.provider.id) {\n return action.provider\n } else {\n return provider\n }\n }),\n })\n\n default:\n return state\n }\n}\n","export var initialState = {\n type: \"info\",\n message: \"\",\n isVisible: false,\n}\n\nexport const SHOW_SNACKBAR = \"SHOW_SNACKBAR\"\nexport const HIDE_SNACKBAR = \"HIDE_SNACKBAR\"\n\nexport function showSnackbar(message, type) {\n return {\n type: SHOW_SNACKBAR,\n message,\n messageType: type,\n }\n}\n\nexport function hideSnackbar() {\n return {\n type: HIDE_SNACKBAR,\n }\n}\n\nexport default function snackbar(state = initialState, action = null) {\n if (action.type === SHOW_SNACKBAR) {\n return {\n type: action.messageType,\n message: action.message,\n isVisible: true,\n }\n } else if (action.type === HIDE_SNACKBAR) {\n return Object.assign({}, state, {\n isVisible: false,\n })\n } else {\n return state\n }\n}\n","import moment from \"moment\"\nimport { REMOVE_POLL, REPLACE_POLL } from \"./poll\"\n\nexport const BUSY_THREAD = \"BUSY_THREAD\"\nexport const RELEASE_THREAD = \"RELEASE_THREAD\"\nexport const REPLACE_THREAD = \"REPLACE_THREAD\"\nexport const UPDATE_THREAD = \"UPDATE_THREAD\"\nexport const UPDATE_THREAD_ACL = \"UPDATE_THREAD_ACL\"\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n started_on: moment(json.started_on),\n last_post_on: moment(json.last_post_on),\n best_answer_marked_on: json.best_answer_marked_on\n ? moment(json.best_answer_marked_on)\n : null,\n\n isBusy: false,\n })\n}\n\nexport function busy() {\n return {\n type: BUSY_THREAD,\n }\n}\n\nexport function release() {\n return {\n type: RELEASE_THREAD,\n }\n}\n\nexport function replace(newState, hydrated = false) {\n return {\n type: REPLACE_THREAD,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function update(data) {\n return {\n type: UPDATE_THREAD,\n data,\n }\n}\n\nexport function updateAcl(data) {\n return {\n type: UPDATE_THREAD_ACL,\n data,\n }\n}\n\nexport default function thread(state = {}, action = null) {\n switch (action.type) {\n case BUSY_THREAD:\n return Object.assign({}, state, { isBusy: true })\n\n case RELEASE_THREAD:\n return Object.assign({}, state, { isBusy: false })\n\n case REMOVE_POLL:\n return Object.assign({}, state, { poll: null })\n\n case REPLACE_POLL:\n return Object.assign({}, state, { poll: action.state })\n\n case REPLACE_THREAD:\n return action.state\n\n case UPDATE_THREAD:\n return Object.assign({}, state, action.data)\n\n case UPDATE_THREAD_ACL:\n const acl = Object.assign({}, state.acl, action.data)\n return Object.assign({}, state, { acl })\n\n default:\n return state\n }\n}\n","export var initialState = {\n tick: 0,\n}\n\nexport const TICK = \"TICK\"\n\nexport function doTick() {\n return {\n type: TICK,\n }\n}\n\nexport default function tick(state = initialState, action = null) {\n if (action.type === TICK) {\n return Object.assign({}, state, {\n tick: state.tick + 1,\n })\n } else {\n return state\n }\n}\n","import moment from \"moment\"\nimport { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const ADD_NAME_CHANGE = \"ADD_NAME_CHANGE\"\nexport const APPEND_HISTORY = \"APPEND_HISTORY\"\nexport const HYDRATE_HISTORY = \"HYDRATE_HISTORY\"\n\nexport function addNameChange(change, user, changedBy) {\n return {\n type: ADD_NAME_CHANGE,\n change,\n user,\n changedBy,\n }\n}\n\nexport function append(items) {\n return {\n type: APPEND_HISTORY,\n items: items,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_HISTORY,\n items: items,\n }\n}\n\nexport function hydrateNamechange(namechange) {\n return Object.assign({}, namechange, {\n changed_on: moment(namechange.changed_on),\n })\n}\n\nexport default function username(state = [], action = null) {\n switch (action.type) {\n case ADD_NAME_CHANGE:\n let newState = state.slice()\n newState.unshift({\n id: Math.floor(Date.now() / 1000), // just small hax for getting id\n changed_by: action.changedBy,\n changed_by_username: action.changedBy.username,\n changed_on: moment(),\n new_username: action.change.username,\n old_username: action.user.username,\n })\n return newState\n\n case APPEND_HISTORY:\n return concatUnique(state, action.items.map(hydrateNamechange))\n\n case HYDRATE_HISTORY:\n return action.items.map(hydrateNamechange)\n\n case UPDATE_AVATAR:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.changed_by && item.changed_by.id === action.userId) {\n item.changed_by = Object.assign({}, item.changed_by, {\n avatars: action.avatars,\n })\n }\n\n return item\n })\n\n case UPDATE_USERNAME:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.changed_by && item.changed_by.id === action.userId) {\n item.changed_by = Object.assign({}, item.changed_by, {\n username: action.username,\n slug: action.slug,\n })\n }\n\n return Object.assign({}, item)\n })\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_USERS = \"APPEND_USERS\"\nexport const HYDRATE_USERS = \"HYDRATE_USERS\"\nexport const UPDATE_AVATAR = \"UPDATE_AVATAR\"\nexport const UPDATE_USERNAME = \"UPDATE_USERNAME\"\n\nexport function append(items) {\n return {\n type: APPEND_USERS,\n items,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_USERS,\n items,\n }\n}\n\nexport function hydrateStatus(status) {\n if (status) {\n return Object.assign({}, status, {\n last_click: status.last_click ? moment(status.last_click) : null,\n banned_until: status.banned_until ? moment(status.banned_until) : null,\n })\n } else {\n return null\n }\n}\n\nexport function hydrateUser(user) {\n return Object.assign({}, user, {\n joined_on: moment(user.joined_on),\n status: hydrateStatus(user.status),\n })\n}\n\nexport function updateAvatar(user, avatars) {\n return {\n type: UPDATE_AVATAR,\n userId: user.id,\n avatars,\n }\n}\n\nexport function updateUsername(user, username, slug) {\n return {\n type: UPDATE_USERNAME,\n userId: user.id,\n username,\n slug,\n }\n}\n\nexport default function user(state = [], action = null) {\n switch (action.type) {\n case APPEND_USERS:\n return concatUnique(state, action.items.map(hydrateUser))\n\n case HYDRATE_USERS:\n return action.items.map(hydrateUser)\n\n case UPDATE_AVATAR:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.id === action.userId) {\n item.avatars = action.avatars\n }\n\n return item\n })\n\n default:\n return state\n }\n}\n","export class Ajax {\n constructor() {\n this._cookieName = null\n this._csrfToken = null\n this._locks = {}\n }\n\n init(cookieName) {\n this._cookieName = cookieName\n }\n\n getCsrfToken() {\n if (document.cookie.indexOf(this._cookieName) !== -1) {\n let cookieRegex = new RegExp(this._cookieName + \"=([^;]*)\")\n let cookie = document.cookie.match(cookieRegex)[0]\n return cookie ? cookie.split(\"=\")[1] : null\n } else {\n return null\n }\n }\n\n request(method, url, data) {\n let self = this\n return new Promise(function (resolve, reject) {\n let xhr = {\n url: url,\n method: method,\n headers: {\n \"X-CSRFToken\": self.getCsrfToken(),\n },\n\n data: data ? JSON.stringify(data) : null,\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n\n success: function (data) {\n resolve(data)\n },\n\n error: function (jqXHR) {\n let rejection = jqXHR.responseJSON || {}\n\n rejection.status = jqXHR.status\n\n if (rejection.status === 0) {\n rejection.detail = pgettext(\n \"ajax client error\",\n \"Could not connect to the site.\"\n )\n }\n\n if (rejection.status === 404) {\n if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n rejection.detail = pgettext(\n \"ajax client error\",\n \"Action link is invalid.\"\n )\n }\n }\n\n if (rejection.status === 500 && !rejection.detail) {\n rejection.detail = pgettext(\n \"ajax client error\",\n \"Unknown error has occurred.\"\n )\n }\n\n rejection.statusText = jqXHR.statusText\n\n reject(rejection)\n },\n }\n\n $.ajax(xhr)\n })\n }\n\n get(url, params, lock) {\n if (params) {\n url += \"?\" + $.param(params)\n }\n\n if (lock) {\n let self = this\n\n // update url in existing lock?\n if (this._locks[lock]) {\n this._locks[lock].url = url\n }\n\n // immediately dereference promise handlers without doing anything\n // we are already waiting for existing response to resolve\n if (this._locks[lock] && this._locks[lock].waiter) {\n return {\n then: function () {\n return\n },\n }\n\n // return promise that will begin when original one resolves\n } else if (this._locks[lock] && this._locks[lock].wait) {\n this._locks[lock].waiter = true\n\n return new Promise(function (resolve, reject) {\n let wait = function (url) {\n // keep waiting on promise\n if (self._locks[lock].wait) {\n window.setTimeout(function () {\n wait(url)\n }, 300)\n\n // poll for new url\n } else if (self._locks[lock].url !== url) {\n wait(self._locks[lock].url)\n\n // ajax backend for response\n } else {\n self._locks[lock].waiter = false\n self.request(\"GET\", self._locks[lock].url).then(\n function (data) {\n if (self._locks[lock].url === url) {\n resolve(data)\n } else {\n self._locks[lock].waiter = true\n wait(self._locks[lock].url)\n }\n },\n function (rejection) {\n if (self._locks[lock].url === url) {\n reject(rejection)\n } else {\n self._locks[lock].waiter = true\n wait(self._locks[lock].url)\n }\n }\n )\n }\n }\n\n window.setTimeout(function () {\n wait(url)\n }, 300)\n })\n\n // setup new lock without waiter\n } else {\n this._locks[lock] = {\n url,\n wait: true,\n waiter: false,\n }\n\n return new Promise(function (resolve, reject) {\n self.request(\"GET\", url).then(\n function (data) {\n self._locks[lock].wait = false\n if (self._locks[lock].url === url) {\n resolve(data)\n }\n },\n function (rejection) {\n self._locks[lock].wait = false\n if (self._locks[lock].url === url) {\n reject(rejection)\n }\n }\n )\n })\n }\n } else {\n return this.request(\"GET\", url)\n }\n }\n\n post(url, data) {\n return this.request(\"POST\", url, data)\n }\n\n patch(url, data) {\n return this.request(\"PATCH\", url, data)\n }\n\n put(url, data) {\n return this.request(\"PUT\", url, data)\n }\n\n delete(url, data) {\n return this.request(\"DELETE\", url, data)\n }\n\n upload(url, data, progress) {\n let self = this\n return new Promise(function (resolve, reject) {\n let xhr = {\n url: url,\n method: \"POST\",\n headers: {\n \"X-CSRFToken\": self.getCsrfToken(),\n },\n\n data: data,\n contentType: false,\n processData: false,\n\n xhr: function () {\n let xhr = new window.XMLHttpRequest()\n xhr.upload.addEventListener(\n \"progress\",\n function (evt) {\n if (evt.lengthComputable) {\n progress(Math.round((evt.loaded / evt.total) * 100))\n }\n },\n false\n )\n return xhr\n },\n\n success: function (response) {\n resolve(response)\n },\n\n error: function (jqXHR) {\n let rejection = jqXHR.responseJSON || {}\n\n rejection.status = jqXHR.status\n\n if (rejection.status === 0) {\n rejection.detail = pgettext(\n \"api error\",\n \"Could not connect to the site.\"\n )\n }\n\n if (rejection.status === 413 && !rejection.detail) {\n rejection.detail = pgettext(\n \"api error\",\n \"Upload was rejected by the site as too large.\"\n )\n }\n\n if (rejection.status === 404) {\n if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n rejection.detail = pgettext(\n \"api error\",\n \"Action link is invalid.\"\n )\n }\n }\n\n if (rejection.status === 500 && !rejection.detail) {\n rejection.detail = pgettext(\n \"api error\",\n \"Unknown error has occurred.\"\n )\n }\n\n rejection.statusText = jqXHR.statusText\n\n reject(rejection)\n },\n }\n\n $.ajax(xhr)\n })\n }\n}\n\nexport default new Ajax()\n","import { signIn, signOut } from \"misago/reducers/auth\"\n\nexport class Auth {\n init(store, local, modal) {\n this._store = store\n this._local = local\n this._modal = modal\n\n // tell other tabs what auth state is because we are most current with it\n this.syncSession()\n\n // listen for other tabs to tell us that state changed\n this.watchState()\n }\n\n syncSession() {\n const state = this._store.getState().auth\n if (state.isAuthenticated) {\n this._local.set(\"auth\", {\n isAuthenticated: true,\n username: state.user.username,\n })\n } else {\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n }\n }\n\n watchState() {\n const state = this._store.getState().auth\n this._local.watch(\"auth\", (newState) => {\n if (newState.isAuthenticated) {\n this._store.dispatch(\n signIn({\n username: newState.username,\n })\n )\n } else if (state.isAuthenticated) {\n // check if we are authenticated in this tab\n // because some browser plugins prune local store\n // aggressively, forcing erroneous message to display here\n // tracking bug #955\n this._store.dispatch(signOut())\n }\n })\n this._modal.hide()\n }\n\n signIn(user) {\n this._store.dispatch(signIn(user))\n this._local.set(\"auth\", {\n isAuthenticated: true,\n username: user.username,\n })\n this._modal.hide()\n }\n\n signOut() {\n this._store.dispatch(signOut())\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n this._modal.hide()\n }\n\n softSignOut() {\n this._store.dispatch(signOut(true))\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n this._modal.hide()\n }\n}\n\nexport default new Auth()\n","/* global grecaptcha */\nimport React from \"react\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport class BaseCaptcha {\n init(context, ajax, include, snackbar) {\n this._context = context\n this._ajax = ajax\n this._include = include\n this._snackbar = snackbar\n }\n}\n\nexport class NoCaptcha extends BaseCaptcha {\n load() {\n return new Promise(function (resolve) {\n // immediately resolve as we don't have anything to validate\n resolve()\n })\n }\n\n validator() {\n return null\n }\n\n component() {\n return null\n }\n}\n\nexport class QACaptcha extends BaseCaptcha {\n load() {\n var self = this\n return new Promise((resolve, reject) => {\n self._ajax.get(self._context.get(\"CAPTCHA_API\")).then(\n function (data) {\n self.question = data.question\n self.helpText = data.help_text\n resolve()\n },\n function () {\n self._snackbar.error(\n pgettext(\"captcha field\", \"Failed to load CAPTCHA.\")\n )\n reject()\n }\n )\n })\n }\n\n validator() {\n return []\n }\n\n component(kwargs) {\n return (\n \n \n \n )\n }\n}\n\nexport class ReCaptchaComponent extends React.Component {\n componentDidMount() {\n grecaptcha.render(\"recaptcha\", {\n sitekey: this.props.siteKey,\n callback: (response) => {\n // fire fakey event to binding\n this.props.binding({\n target: {\n value: response,\n },\n })\n },\n })\n }\n\n render() {\n return
    \n }\n}\n\nexport class ReCaptcha extends BaseCaptcha {\n load() {\n this._include.include(\"https://www.google.com/recaptcha/api.js\", true)\n\n return new Promise(function (resolve) {\n var wait = function () {\n if (typeof grecaptcha === \"undefined\") {\n window.setTimeout(function () {\n wait()\n }, 200)\n } else {\n resolve()\n }\n }\n wait()\n })\n }\n\n validator() {\n return []\n }\n\n component(kwargs) {\n return (\n \n \n \n )\n }\n}\n\nexport class Captcha {\n init(context, ajax, include, snackbar) {\n switch (context.get(\"SETTINGS\").captcha_type) {\n case \"no\":\n this._captcha = new NoCaptcha()\n break\n\n case \"qa\":\n this._captcha = new QACaptcha()\n break\n\n case \"re\":\n this._captcha = new ReCaptcha()\n break\n }\n\n this._captcha.init(context, ajax, include, snackbar)\n }\n\n // accessors for underlying strategy\n\n load() {\n return this._captcha.load()\n }\n\n validator() {\n return this._captcha.validator()\n }\n\n component(kwargs) {\n return this._captcha.component(kwargs)\n }\n}\n\nexport default new Captcha()\n","export class Include {\n init(staticUrl) {\n this._staticUrl = staticUrl\n this._included = []\n }\n\n include(script, remote = false) {\n if (this._included.indexOf(script) === -1) {\n this._included.push(script)\n this._include(script, remote)\n }\n }\n\n _include(script, remote) {\n $.ajax({\n url: (!remote ? this._staticUrl : \"\") + script,\n cache: true,\n dataType: \"script\",\n })\n }\n}\n\nexport default new Include()\n","let storage = window.localStorage\n\nexport class LocalStorage {\n init(prefix) {\n this._prefix = prefix\n this._watchers = []\n\n window.addEventListener(\"storage\", (e) => {\n let newValueJson = JSON.parse(e.newValue)\n this._watchers.forEach(function (watcher) {\n if (watcher.key === e.key && e.oldValue !== e.newValue) {\n watcher.callback(newValueJson)\n }\n })\n })\n }\n\n set(key, value) {\n storage.setItem(this._prefix + key, JSON.stringify(value))\n }\n\n get(key) {\n let itemString = storage.getItem(this._prefix + key)\n if (itemString) {\n return JSON.parse(itemString)\n } else {\n return null\n }\n }\n\n watch(key, callback) {\n this._watchers.push({\n key: this._prefix + key,\n callback: callback,\n })\n }\n}\n\nexport default new LocalStorage()\n","import ReactDOM from \"react-dom\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Modal {\n init(element) {\n this._element = element\n\n this._modal = $(element).modal({ show: false })\n\n this._modal.on(\"hidden.bs.modal\", () => {\n ReactDOM.unmountComponentAtNode(this._element)\n })\n }\n\n show(component) {\n mount(component, this._element.id)\n this._modal.modal(\"show\")\n }\n\n hide() {\n this._modal.modal(\"hide\")\n }\n}\n\nexport default new Modal()\n","export class PageTitle {\n init(indexTitle, forumName) {\n this._indexTitle = indexTitle\n this._forumName = forumName\n }\n\n set(title) {\n if (!title) {\n document.title = this._indexTitle || this._forumName\n return\n }\n\n if (typeof title === \"string\") {\n title = { title: title }\n }\n\n let finalTitle = title.title\n\n if (title.page > 1) {\n const pageLabel = interpolate(\n pgettext(\"page title pagination\", \"page: %(page)s\"),\n {\n page: title.page,\n },\n true\n )\n\n finalTitle += \" (\" + pageLabel + \")\"\n }\n\n if (title.parent) {\n finalTitle += \" | \" + title.parent\n }\n\n document.title = finalTitle + \" | \" + this._forumName\n }\n}\n\nexport default new PageTitle()\n","export class Polls {\n init(ajax, snackbar) {\n this._ajax = ajax\n this._snackbar = snackbar\n\n this._polls = {}\n }\n\n start(kwargs) {\n this.stop(kwargs.poll)\n\n const poolServer = () => {\n this._polls[kwargs.poll] = kwargs\n\n this._ajax.get(kwargs.url, kwargs.data || null).then(\n (data) => {\n if (!this._polls[kwargs.poll]._stopped) {\n kwargs.update(data)\n\n this._polls[kwargs.poll].timeout = window.setTimeout(\n poolServer,\n kwargs.frequency\n )\n }\n },\n (rejection) => {\n if (!this._polls[kwargs.poll]._stopped) {\n if (kwargs.error) {\n kwargs.error(rejection)\n } else {\n this._snackbar.apiError(rejection)\n }\n }\n }\n )\n }\n\n if (kwargs.delayed) {\n this._polls[kwargs.poll] = {\n timeout: window.setTimeout(poolServer, kwargs.frequency),\n }\n } else {\n poolServer()\n }\n }\n\n stop(pollId) {\n if (this._polls[pollId]) {\n window.clearTimeout(this._polls[pollId].timeout)\n this._polls[pollId]._stopped = true\n }\n }\n}\n\nexport default new Polls()\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport PostingComponent from \"misago/components/posting\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Posting {\n init(ajax, snackbar, mount) {\n this._ajax = ajax\n this._snackbar = snackbar\n this._mount = mount\n\n this._mode = null\n this._spacer = document.getElementById(\"posting-spacer\")\n this._observer = new ResizeObserver((entries) => {\n this._spacer.style.height = entries[0].contentRect.height + \"px\"\n })\n\n this._isOpen = false\n this._isClosing = false\n\n this._beforeunloadSet = false\n this._props = null\n }\n\n isOpen() {\n return this._isOpen\n }\n\n setBeforeUnload() {\n if (!this._beforeunloadSet) {\n window.addEventListener(\"beforeunload\", this.beforeUnload, {\n capture: true,\n })\n this._beforeunloadSet = true\n }\n }\n\n unsetBeforeUnload() {\n window.removeEventListener(\"beforeunload\", this.beforeUnload, {\n capture: true,\n })\n this._beforeunloadSet = false\n }\n\n beforeUnload(event) {\n event.returnValue = \"true\"\n return \"true\"\n }\n\n open(props) {\n if (this._isOpen === false) {\n if (props.mode === \"QUOTE\") {\n this._mode = \"REPLY\"\n } else {\n this._mode = props.mode\n }\n\n this._isOpen = props.submit\n this._realOpen(Object.assign({}, props, { mode: this._mode }))\n } else if (props.mode === \"QUOTE\") {\n this._realOpen(\n Object.assign({}, this._props, {\n config: props.config,\n context: props.context,\n })\n )\n } else if (this._isOpen !== props.submit) {\n let message = gettext(\n \"You are already working on other message. Do you want to discard it?\"\n )\n\n const changeForm = window.confirm(message)\n if (changeForm) {\n this._mode = props.mode\n this._isOpen = props.submit\n this._realOpen(props)\n }\n } else if (this._mode == \"REPLY\" && props.mode == \"REPLY\") {\n this._realOpen(props)\n }\n }\n\n _realOpen(props) {\n mount(, this._mount.id)\n\n this._props = props\n this._mount.classList.add(\"show\")\n this._observer.observe(this._mount)\n this.setBeforeUnload()\n }\n\n close = () => {\n this.unsetBeforeUnload()\n this._props = null\n\n if (this._isOpen && !this._isClosing) {\n this._isClosing = true\n this._mount.classList.remove(\"show\")\n\n window.setTimeout(() => {\n ReactDOM.unmountComponentAtNode(this._mount)\n this._observer.unobserve(this._mount)\n this._spacer.style.height = \"0px;\"\n this._isClosing = false\n this._isOpen = false\n this._mode = null\n }, 300)\n }\n }\n}\n\nexport default new Posting()\n","import { showSnackbar, hideSnackbar } from \"misago/reducers/snackbar\"\n\nconst HIDE_ANIMATION_LENGTH = 300\nconst MESSAGE_SHOW_LENGTH = 5000\n\nexport class Snackbar {\n init(store) {\n this._store = store\n this._timeout = null\n }\n\n alert = (message, type) => {\n if (this._timeout) {\n window.clearTimeout(this._timeout)\n this._store.dispatch(hideSnackbar())\n\n this._timeout = window.setTimeout(() => {\n this._timeout = null\n this.alert(message, type)\n }, HIDE_ANIMATION_LENGTH)\n } else {\n this._store.dispatch(showSnackbar(message, type))\n this._timeout = window.setTimeout(() => {\n this._store.dispatch(hideSnackbar())\n this._timeout = null\n }, MESSAGE_SHOW_LENGTH)\n }\n }\n\n // shorthands for message types\n\n info = (message) => {\n this.alert(message, \"info\")\n }\n\n success = (message) => {\n this.alert(message, \"success\")\n }\n\n warning = (message) => {\n this.alert(message, \"warning\")\n }\n\n error = (message) => {\n this.alert(message, \"error\")\n }\n\n // shorthand for api errors\n\n apiError = (rejection) => {\n let message = rejection.data ? rejection.data.detail : rejection.detail\n\n if (!message) {\n if (rejection.status === 0) {\n message = pgettext(\"api error\", \"Could not connect to the site.\")\n } else if (rejection.status === 404) {\n message = pgettext(\"api error\", \"Action link is invalid.\")\n } else {\n message = pgettext(\"api error\", \"Unknown error has occurred.\")\n }\n }\n\n if (rejection.status === 403 && message === \"Permission denied\") {\n message = pgettext(\n \"api error\",\n \"You don't have permission to perform this action.\"\n )\n }\n\n this.error(message)\n }\n}\n\nexport default new Snackbar()\n","import { combineReducers, createStore } from \"redux\"\n\nexport class StoreWrapper {\n constructor() {\n this._store = null\n this._reducers = {}\n this._initialState = {}\n }\n\n addReducer(name, reducer, initialState) {\n this._reducers[name] = reducer\n this._initialState[name] = initialState\n }\n\n init() {\n this._store = createStore(\n combineReducers(this._reducers),\n this._initialState\n )\n }\n\n getStore() {\n return this._store\n }\n\n // Store API\n\n getState() {\n return this._store.getState()\n }\n\n dispatch(action) {\n return this._store.dispatch(action)\n }\n}\n\nexport default new StoreWrapper()\n","/* global zxcvbn */\nexport class Zxcvbn {\n init(include) {\n this._include = include\n this._isLoaded = false\n }\n\n scorePassword(password, inputs) {\n // 0-4 score, the more the stronger password\n if (this._isLoaded) {\n return zxcvbn(password, inputs).score\n }\n\n return 0\n }\n\n load() {\n if (!this._isLoaded) {\n this._include.include(\"misago/js/zxcvbn.js\")\n return this._loadingPromise()\n } else {\n return this._loadedPromise()\n }\n }\n\n _loadingPromise() {\n const self = this\n\n return new Promise(function (resolve, reject) {\n var wait = function (tries = 0) {\n tries += 1\n if (tries > 200) {\n reject()\n } else if (typeof zxcvbn === \"undefined\") {\n window.setTimeout(function () {\n wait(tries)\n }, 200)\n } else {\n self._isLoaded = true\n resolve()\n }\n }\n wait()\n })\n }\n\n _loadedPromise() {\n // we have already loaded zxcvbn.js, resolve away!\n return new Promise(function (resolve) {\n resolve()\n })\n }\n}\n\nexport default new Zxcvbn()\n","import moment from \"moment\"\nimport React from \"react\"\n\nexport default class extends React.Component {\n getReasonMessage() {\n if (this.props.message.html) {\n return (\n \n )\n } else {\n return

    {this.props.message.plain}

    \n }\n }\n\n getExpirationMessage() {\n if (this.props.expires) {\n if (this.props.expires.isAfter(moment())) {\n let title = interpolate(\n pgettext(\"banned page\", \"This ban expires on %(expires_on)s.\"),\n {\n expires_on: this.props.expires.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n pgettext(\"banned page\", \"This ban expires %(expires_on)s.\"),\n {\n expires_on: this.props.expires.fromNow(),\n },\n true\n )\n\n return {message}\n } else {\n return pgettext(\"banned page\", \"This ban has expired.\")\n }\n } else {\n return pgettext(\"banned page\", \"This ban is permanent.\")\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n highlight_off\n
    \n
    \n {this.getReasonMessage()}\n

    {this.getExpirationMessage()}

    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider, connect } from \"react-redux\"\nimport BannedPage from \"misago/components/banned-page\"\nimport misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nlet select = function (state) {\n return state.tick\n}\n\nlet RedrawedBannedPage = connect(select)(BannedPage)\n\nexport default function (ban, changeState) {\n ReactDOM.render(\n \n \n ,\n\n document.getElementById(\"page-mount\")\n )\n\n if (typeof changeState === \"undefined\" || changeState) {\n let forumName = misago.get(\"SETTINGS\").forum_name\n document.title =\n pgettext(\"banned error title\", \"You are banned\") + \" | \" + forumName\n window.history.pushState({}, \"\", misago.get(\"BANNED_URL\"))\n }\n}\n","export default function (list, rowWidth, padding = false) {\n let rows = []\n let row = []\n\n list.forEach(function (element) {\n row.push(element)\n if (row.length === rowWidth) {\n rows.push(row)\n row = []\n }\n })\n\n // pad row to required length?\n if (padding !== false && row.length > 0 && row.length < rowWidth) {\n for (let i = row.length; i < rowWidth; i++) {\n row.push(padding)\n }\n }\n\n if (row.length) {\n rows.push(row)\n }\n\n return rows\n}\n","export default function (a, b) {\n let ids = []\n return a.concat(b).filter(function (item) {\n if (ids.indexOf(item.id) === -1) {\n ids.push(item.id)\n return true\n } else {\n return false\n }\n })\n}\n","const map = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n}\n\nexport default function (text) {\n return text.replace(/[&<>\"']/g, function (m) {\n return map[m]\n })\n}\n","export default function (bytes) {\n if (bytes > 1024 * 1024 * 1024) {\n return roundSize(bytes / (1024 * 1024 * 1024)) + \" GB\"\n } else if (bytes > 1024 * 1024) {\n return roundSize(bytes / (1024 * 1024)) + \" MB\"\n } else if (bytes > 1024) {\n return roundSize(bytes / 1024) + \" KB\"\n } else {\n return roundSize(bytes) + \" B\"\n }\n}\n\nexport function roundSize(value) {\n return value.toFixed(1)\n}\n","export const ALPHA = \"12345678990abcdefghijklmnopqrstuvwxyz\"\nexport const ALPHA_LEN = ALPHA.length\n\nexport default function getRandomString(len) {\n const chars = []\n for (let i = 0; i < len; i++) {\n const index = Math.floor(Math.random() * ALPHA_LEN)\n chars.push(ALPHA[index])\n }\n return chars.join(\"\")\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport store from \"misago/services/store\"\n\nexport default function (Component, rootElementId, connected = true) {\n let rootElement = document.getElementById(rootElementId)\n\n let finalComponent = Component.props ? Component : \n\n if (rootElement) {\n if (connected) {\n ReactDOM.render(\n {finalComponent},\n\n rootElement\n )\n } else {\n ReactDOM.render(finalComponent, rootElement)\n }\n }\n}\n","export function int(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nexport function range(min, max) {\n let array = new Array(int(min, max))\n for (let i = 0; i < array.length; i++) {\n array[i] = i\n }\n\n return array\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { Router, browserHistory } from \"react-router\"\nimport store from \"misago/services/store\"\n\nconst rootElement = document.getElementById(\"page-mount\")\n\nexport default function (options) {\n let routes = {\n component: options.component || null,\n childRoutes: [],\n }\n\n if (options.root) {\n routes.childRoutes = [\n {\n path: options.root,\n onEnter: function (nextState, replaceState) {\n replaceState(null, options.paths[0].path)\n },\n },\n ].concat(options.paths)\n } else {\n routes.childRoutes = options.paths\n }\n\n ReactDOM.render(\n \n \n ,\n rootElement\n )\n}\n","const EMAIL =\n /^(([^<>()[\\]\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i\nconst USERNAME = new RegExp(\"^[0-9a-z_]+$\", \"i\")\nconst USERNAME_ALPHANUMERIC = new RegExp(\"[0-9a-z]\", \"i\")\n\nexport function required(message) {\n return function (value) {\n if (\n value === false ||\n value === null ||\n String(value).trim().length === 0\n ) {\n return message || gettext(\"This field is required.\")\n }\n }\n}\n\nexport function requiredTermsOfService(message) {\n const error = pgettext(\n \"agreement validator\",\n \"You have to accept the terms of service.\"\n )\n return required(message || error)\n}\n\nexport function requiredPrivacyPolicy(message) {\n const error = pgettext(\n \"agreement validator\",\n \"You have to accept the privacy policy.\"\n )\n return required(message || error)\n}\n\nexport function email(message) {\n return function (value) {\n if (!EMAIL.test(value)) {\n return (\n message || pgettext(\"email validator\", \"Enter a valid e-mail address.\")\n )\n }\n }\n}\n\nexport function minLength(limitValue, message) {\n return function (value) {\n var returnMessage = \"\"\n var length = value.trim().length\n\n if (length < limitValue) {\n if (message) {\n returnMessage = message(limitValue, length)\n } else {\n returnMessage = npgettext(\n \"value length validator\",\n \"Ensure this value has at least %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n }\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n\nexport function maxLength(limitValue, message) {\n return function (value) {\n var returnMessage = \"\"\n var length = value.trim().length\n\n if (length > limitValue) {\n if (message) {\n returnMessage = message(limitValue, length)\n } else {\n returnMessage = npgettext(\n \"value length validator\",\n \"Ensure this value has at most %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n }\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n\nexport function usernameMinLength(lengthMin) {\n var message = function (lengthMin) {\n return npgettext(\n \"username length validator\",\n \"Username must be at least %(limit_value)s character long.\",\n \"Username must be at least %(limit_value)s characters long.\",\n lengthMin\n )\n }\n return minLength(lengthMin, message)\n}\n\nexport function usernameMaxLength(lengthMax) {\n var message = function (lengthMax) {\n return npgettext(\n \"username length validator\",\n \"Username cannot be longer than %(limit_value)s character.\",\n \"Username cannot be longer than %(limit_value)s characters.\",\n lengthMax\n )\n }\n return maxLength(lengthMax, message)\n}\n\nexport function usernameContent() {\n return function (value) {\n const valueTrimmed = value.trim()\n if (!USERNAME.test(valueTrimmed)) {\n return pgettext(\n \"username validator\",\n \"Username can only contain Latin alphabet letters, digits, and an underscore sign.\"\n )\n }\n if (!USERNAME_ALPHANUMERIC.test(valueTrimmed)) {\n return pgettext(\n \"username validator\",\n \"Username must contain Latin alphabet letters or digits.\"\n )\n }\n }\n}\n\nexport function passwordMinLength(limitValue) {\n return function (value) {\n const length = value.length\n\n if (length < limitValue) {\n const returnMessage = npgettext(\n \"password length validator\",\n \"Valid password must be at least %(limit_value)s character long.\",\n \"Valid password must be at least %(limit_value)s characters long.\",\n limitValue\n )\n\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 30094,\n\t\"./hi.js\": 30094,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + \"hljs\" + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t174: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkmisago\"] = self[\"webpackChunkmisago\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(99170)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(58339)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(64109)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(46226)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(93240)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(75147)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(4894)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(29223)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(73806)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(27015)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(88097)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(46016)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(32488)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(11768)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(61323)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(64752)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(40949)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(78679)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(61814)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(95920)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(44095)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(63290)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(77031)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(97751)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(76093)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(87336)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(47549)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(22331)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(21513)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(98749)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(98251)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(6720)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(66806)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(10846)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(18255)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(14113)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(24444)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(1764)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(68351)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(81521)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(68585)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(41229)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(43589)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(62894)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(33934)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(85577)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(83526)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(43060)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(92292)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(33409)))\nvar __webpack_exports__ = __webpack_require__.O(undefined, [736], () => (__webpack_require__(31341)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","ApiFetch","props","url","cache","data","setState","loading","error","onData","fetch","method","credentials","signal","then","response","status","json","setCache","headers","get","rejection","request","mutation","state","controller","AbortController","this","disabled","prevProps","urlChanged","disabledChanged","abort","hasCache","getCache","children","Object","assign","refetch","update","React","ApiMutation","options","body","onSuccess","onError","mutate","csrfToken","JSON","stringify","cookieName","window","misago_csrf","document","cookie","indexOf","cookieRegex","RegExp","match","split","Dropdown","event","isOpen","root","contains","target","menu","closest","prevState","dropdown","addEventListener","handleClick","removeEventListener","onOpen","onClose","id","className","classnames","open","ref","element","toggle","aria","ariaProps","menuAlignRight","menuClassName","role","close","DropdownDivider","DropdownFooter","listItem","DropdownHeader","DropdownMenuItem","DropdownPills","DropdownSubheader","shrink","auto","ListGroup","ListGroupItem","ListGroupEmpty","icon","message","ListGroupError","detail","ListGroupLoading","ListGroupMessage","getApiUrl","filter","query","api","misago","after","before","connect","auth","user","unreadNotifications","dispatch","updateAuthenticatedUser","NotificationsListEmpty","emptyMessage","pgettext","NotificationsListGroup","NotificationsListItemActor","notification","actor","href","title","username","size","actor_name","NotificationsListItemMessage","isRead","dangerouslySetInnerHTML","__html","NotificationsListItemReadStatus","NotificationsListItemTimestamp","Timestamp","datetime","createdAt","NotificationsListItem","NotificationsList","items","length","map","NotificationsListError","gettext","NotificationsListLoading","BODY_CLASS","Overlay","scrollOrigin","pageYOffset","classList","add","remove","scrollTo","onClick","closeOnNavigation","type","styleName","header","STYLES","LABELS","_score","_password","_inputs","loaded","zxcvbn","password","inputs","cacheStale","value","i","trim","score","getScore","style","width","RegisterForm","handleToggleAgreement","agreement","errors","validator","validators","criteria","passwordMinLength","forEach","item","name","min_length","formValidators","max_length","email","captcha","termsOfService","privacyPolicy","isLoading","isValid","snackbar","validate","ajax","terms_of_service","privacy_policy","apiResponse","callback","__all__","ban","showBannedPage","modal","onSubmit","handleSubmit","display","StartSocialAuth","buttonClassName","buttonLabel","formLabel","label","for","validation","onChange","bindInput","extra","form","RegisterLegalFootnote","onPrivacyPolicyChange","handlePrivacyPolicyChange","onTermsOfServiceChange","handleTermsOfServiceChange","Form","RegisterComplete","activation","interpolate","getLead","getSubscript","complete","completeRegistration","account_activation","isLoaded","Promise","all","result","block","showRegisterForm","LegalAgreement","checked","agreementHtml","escapeHtml","termsOfServiceId","termsOfServiceUrl","privacyPolicyId","privacyPolicyUrl","SearchResultsList","SearchMessage","SearchResultPost","post","index","thread","content","category","poster","poster_name","posted_on","SearchResultUser","rank","joined_on","SearchResults","results","threads","users","count","encodeURIComponent","npgettext","replace","SearchResultsEmpty","SearchResultsError","errorDetail","SearchResultsLoading","CACHE","SearchFetch","debounce","clearTimeout","setTimeout","Api","resultsCount","isResultEmpty","SearchInput","setQuery","placeholder","SearchQuery","SearchDropdown","overlay","search","querySelector","focus","settings","DELEGATE_AUTH","LOGIN_URL","preventDefault","SiteNavMenuConnected","isAnonymous","baseUrl","mainItems","extraItems","extraFooterItems","categories","authDelegated","enable_oauth2_client","topNav","push","footerNav","tosTitle","tosUrl","privacyTitle","privacyUrl","SignInButton","RegisterButton","forum_name","targetBlank","rel","is_vanilla","last","color","short_name","SiteNavDropdown","siteNav","FormHeader","text","labelClassName","socialAuth","pk","button_text","button_color","finalButtonLabel","site","tick","now","Date","diff","Math","ceil","abs","round","date","timeout","scheduleNextUpdate","displayed","narrow","dateRelativeShort","dateRelative","fullDateTime","callApi","avatarType","avatar","onComplete","showError","gravatar","setGravatar","crop_src","showCrop","upload","showUpload","galleries","showGallery","userPeview","avatars","getAvatarPreview","getGravatarButton","setGenerated","getCropButton","getUploadButton","getGalleryButton","cropit","$","deviceRatio","cropitOffset","crop","offset","x","y","zoom","crop_tmp","dataUrl","cropperWidth","getAvatarSize","initialWidth","height","exportZoom","imageState","src","getImagePath","onImageLoaded","zoomLevel","imageSize","offsetX","offsetY","cropAvatar","showIndex","getElementById","click","image","files","validationError","validateFile","preview","URL","createObjectURL","progress","FormData","append","uploaded","limit","filesize","fileSize","invalidTypeMsg","allowed_mime_types","extensionFound","loweredFilename","toLowerCase","allowed_extensions","extension","substr","extensions","join","pickFile","getUploadRequirements","getUploadProgressLabel","uploadFile","getUploadProgress","renderCrop","renderUpload","GalleryItem","select","selection","getClassName","Gallery","batch","images","row","save","ChangeAvatarError","reason","getErrorReason","component","AvatarIndex","AvatarUpload","AvatarCrop","AvatarGallery","store","updateAvatar","completeFlow","getBody","logout","submit","UserNavMenu","selectAvatar","ChangeAvatarModal","optionsMore","slice","adminUrl","showPrivateThreads","unreadPrivateThreads","changeAvatar","revealOptions","unread_private_threads","acl","can_use_private_threads","UserNavDropdown","userNav","size2x","alt","getSrc","srcSet","av","resolveAvatarForSize","Button","defaultProps","choices","repeat","level","isValidated","helpText","labelClass","htmlFor","controlClass","getFeedbackDescription","getFeedback","getHelpText","validateRequired","required","changeValue","newState","formErrors","validateField","clean","promise","send","success","handleSuccess","handleError","optional","validatedFields","hasOwnProperty","fieldErrors","field","requiredError","isControlled","isActive","path","location","pathname","activeClassName","ytRegExp","highlightCode","embedYoutubePlayers","_youtube","hljs","codeblocks","querySelectorAll","highlightElement","anchors","a","onlyChild","parentNode","childNodes","parseYoutubeUrl","youtubeMovie","swapYoutubePlayer","youtube","video","start","player","replaceWith","wrap","cleanedUrl","cleanUrl","getVideoIdFromUrl","timebit","bits","parseInt","onebox","documentNode","find","revealSpoiler","nextProps","nextState","markup","author","undefined","node","btn","parent","addClass","PanelMessage","Default","Invalid","tooltip","format","fromNow","userTitle","css_class","is_tab","random","isReady","posts","PostingQuoteSelection","range","getQuoteSelection","rect","getBoundingClientRect","posting","globalState","getGlobalState","quote","getQuoteMarkup","focusEditor","default","onMouseUp","selected","onTouchEnd","position","left","scrollX","top","bottom","scrollY","reply","textarea","selectionStart","selectionEnd","container","getSelection","rangeCount","getRangeAt","isRangeContained","isPostContained","isAnyTextSelected","cloneContents","commonAncestorContainer","p","nodeName","dataset","noquote","child","nodeType","Node","TEXT_NODE","textContent","metadata","getQuoteMetadata","convertNodesToMarkup","prefix","suffix","codeBlock","getQuoteCodeBlock","syntax","isNodeInlineCodeBlock","isNodeElementWithQuoteMetadata","getQuoteMetadataFromNode","ELEMENT_NODE","isNodeCodeBlock","getNodeCodeBlockMeta","nodes","stack","convertNodeToMarkup","SIMPLE_NODE_MAPPINGS","H1","H2","H3","H4","H5","H6","STRONG","EM","DEL","B","U","I","SUB","SUP","toUpperCase","code","innerText","misagoReply","setGlobalState","clearGlobalState","attachments","attachment","isRemoved","MarkupAttachmentModal","is_image","filename","filetype","formatFilesize","uploaded_on","uploader","uploader_name","wrapSelection","def","newValue","caret","setSelectionRange","replaceSelection","end","createRange","moveStart","substring","scroll","scrollTop","thumb","getAttachmentMarkup","confirm","key","canProtect","empty","isProtected","submitText","showPreview","closePreview","enableProtection","disableProtection","MarkupCodeModal","ev","LANGUAGES","rows","MarkupFormattingHelpModal","ExampleFormatting","ExampleFormattingSpoiler","reveal","URL_PATTERN","isUrl","str","test","textUrl","file","maxSize","max_attachment_size","getRandomString","concat","refreshState","moment","updateAttachments","actions","insertSpoiler","input","createElement","multiple","parsed","stopPropagation","dataTransfer","onAttachmentsChange","clipboardData","kind","getAsFile","focused","atwho","at","displayTpl","insertTpl","searchKey","callbacks","remoteFilter","getJSON","q","on","_storage","source","headPos","endPos","setMentions","onDrop","onFocus","onPaste","onBlur","post_length_min","CLASS_ACTIVE","CLASS_DEFAULT","CLASS_MINIMIZED","CLASS_FULLSCREEN","fullscreen","minimized","minimize","fullscreenEnter","fullscreenExit","PostingThreadOptions","isClosed","isHidden","isPinned","hide","unhide","pinGlobally","pinLocally","unpin","icons","closed","hidden","pinned","getIcons","pin","categoryOptions","getTitleValidators","getPostValidators","config","loadSuccess","loadError","non_field_errors","dialogProps","onCancel","PostingDialogStart","Toolbar","showOptions","onTitleChange","onCategoryChange","onHide","onUnhide","onPinGlobally","onPinLocally","onUnpin","onPostChange","usernames","removedBlanks","pos","to","cleanUsernames","PostingDialogStartPrivate","onToChange","quoteText","newPost","context","onQuote","newContext","appendData","PostingDialogReply","originalPost","protect","is_protected","can_protect","originalPostSameAsCurrentPost","noAttachementsAdded","PostingDialogEditReply","mode","minLength","thread_title_length_min","limitValue","limit_value","show_value","maxLength","thread_title_length_max","post_length_max","validatePostLengthMin","choice","getChoice","Icon","getIcon","getLabel","change","showActivation","val","getActivationButton","is_banned","is_hidden","is_online_hidden","is_offline_hidden","is_online","is_offline","getClass","StatusIcon","StatusLabel","banned_until","ban_expires","last_click","getHelp","showStatus","Status","JoinDate","Posts","Threads","Followers","getStatClassName","followers","stat","colClassName","cols","list","Array","apply","Number","call","iconOn","iconOff","labelOn","labelOff","locale","misago_locale","momentAgo","momentAgoShort","dayAt","soonAt","tomorrowAt","yesterdayAt","minutesShort","hoursShort","daysShort","thisYearShort","otherYearShort","relativeNumeric","Intl","RelativeTimeFormat","numeric","DateTimeFormat","dateStyle","timeStyle","thisYearDate","month","day","otherYearDate","year","short","weekday","shortTime","absDiff","sign","minutes","hours","isSameDay","yesterday","setDate","getDate","isYesterday","isTomorrow","formatDayAtTime","getFullYear","getMonth","days","parts","formatToParts","isOrdered","_items","order","values","values_only","_order","unordered","ordered","ordering","insertItem","insertAt","splice","iterations","useLoader","silent","getAttribute","requests","onRemoveSelection","onAction","moderation","htmx","swap","tagName","control","button","selector","registerEvents","registerActions","registerElementValidator","strip","csrf","setAttribute","setFormControlValidationState","callValidationUrl","clearFormControlValidationMessages","clearFormControlValidationState","setFormControlErrorValidationState","setFormControlSuccessValidationState","set","removeSnackbars","replaceChildren","renderSnackbars","SNACKBAR_TTL","appendChild","isEventVisible","requestConfig","verb","xhr","getResponseHeader","parse","getResponseErrorMessage","updateTimestamp","timestamp","hasAttribute","updateLiveTimestamps","setInterval","loader","AjaxLoader","_initializers","_context","initializer","OrderedList","orderedValues","fallback","has","snackbars","BulkModeration","show","patch","AUTH_SYNC_RATE","storage","include","AcceptAgreement","submiting","accept","reload","handleDecline","handleAccept","mount","signedIn","signedOut","getMessage","refresh","AuthMessage","NavbarBranding","logo","logoXs","NavbarExtraMenu","NotificationsDropdownBody","showAll","showUnread","unread","NotificationsDropdownBodyPill","active","NotificationsFetch","NavbarNotificationsToggle","badge","NavbarNotificationsDropdown","NavbarPrivateThreads","NavbarSearchToggle","NavbarSearchDropdown","Search","NavbarSiteNavToggle","NavbarSiteNavDropdown","SiteNav","NavbarUserNavToggle","NavbarUserNavDropdown","UserNav","branding","logo_small","logo_text","extraMenuItems","searchUrl","notificationsUrl","privateThreadsUrl","showSearch","can_search","addInitializer","ReactDOM","NotificationsOverlayBody","NotificationsOverlayBodyPill","NotificationsOverlay","notifications","NotificationsHeader","PageHeader","subtitle","PillsNav","PillsNavLink","link","NotificationsPills","basename","NotificationsPagination","NotificationsPaginationLink","hasPrevious","firstCursor","lastCursor","hasNext","NotificationsToolbar","markAllAsRead","getSubtitle","route","getBaseUrl","PageContainer","readAll","mutating","toolbarProps","history","replaceState","browserHistory","routes","NotificationsRoute","startsWith","expires_on","initWithPreloadedData","initWithoutPreloadedData","startPolling","profile","polls","poll","frequency","user_message","html","staff_message","isAfter","keys","getUserMessage","getStaffMessage","getExpirationMessage","getPanelBody","fieldname","fields","help_text","groups","group","f","initial","CancelButton","cancel","FormDisplay","isAuthenticated","SafeValue","onEdit","showEditButton","details","load","editing","newDetails","loadDetails","profileDetails","edit","edit_details","loadItems","next","Feed","loadMore","LoadMoreButton","isBusy","loadUsers","page","more","pages","setSpecialProps","PRELOADED_DATA_KEY","TITLE","API_FILTER","hydrate","apiUrl","getEmptyMessage","getMoreButton","getListBody","changed_by","changed_by_username","renderUserAvatar","renderUsername","old_username","new_username","changed_on","changes","hiddenOnMobile","loadChanges","is_followed","follow","action","canMessage","can_start_private_threads","isProfileOwner","is_avatar_locked","avatar_lock_user_message","avatar_lock_staff_message","moderate_avatar","avatar_hash","getFormBody","getModalBody","moderate_username","addNameChange","updateUsername","slug","countdown","isDeleted","with_content","getButtonLabel","getDeletedBody","getForm","AvatarControls","ChangeUsername","DeleteAccount","showAvatarDialog","rename","showRenameDialog","showDeleteDialog","is_active","ProfileModerationButton","FlexRow","available","getModeration","can_follow","WithDropdown","delete","is_anonymous","can_rename","can_moderate_avatar","can_delete","COMPONENTS","follows","Follows","Details","UsernameHistory","BanDetails","paths","Profile","RequestLinkForm","LinkSent","reset","RequestActivationLink","RequestResetForm","showInactivePage","AccountInactivePage","getActivateButton","RequestPasswordReset","ResetPasswordForm","PasswordChangedPage","SignInModal","showSignIn","updateSearch","urlQuery","pushState","providers","provider","updateUsers","updatePosts","onQueryChange","Badge","SearchTime","time","copy","LoadMore","appendPosts","updateProvider","Blankslate","components","TYPES_CLASSES","info","warning","Snackbar","snackbarClass","isVisible","getSnackbarClass","backendName","pageTitleTpl","pageTitle","backend","Register","emailProtected","onRegistrationComplete","step","stateUpdate","backend_name","emailHelpText","emailHelpTextTpl","SocialAuth","handleRegistrationComplete","op","updateAcl","participants","ModalHeader","onUsernameChange","can_add_participants","participant","confirmed","isUser","is_owner","can_change_owner","isModerator","can_moderate_private_threads","userIsOwner","UserStatus","isOwner","getUserIsOwner","utils","PollChoice","hash","proc","votes","getVotesLabel","ChoiceVotes","UserChoice","hydratedData","voters","voter","voted_on","ModalBody","ChoicesList","ChoiceDetails","VotesCount","VotesList","Voter","VoteDate","isPollOver","showVoting","is_public","can_edit","can_see_votes","can_vote","hasSelectedChoices","allow_revotes","controls","canVote","canChangeVote","ChangeVote","SeeVotes","Edit","Delete","newThreadAcl","DATE_ABBR","PollVotes","PollLength","PollIsPublic","PollCreation","getPoster","getPostedOn","absolute","relative","ends_on","getEndsOn","endsOn","question","PollChoicesLeft","choicesLeft","PollAllowRevote","ChoiceSelect","toggleChoice","getChoicesLeft","allowed_choices","getChoiceFromHash","deselectChoice","selectChoice","showResults","getIsPollOver","setChoices","canDelete","onDelete","onAdd","every","isEdit","PollPublicSwitch","ICON","changed_title","pinned_globally","pinned_locally","unpinned","moved","merged","approved","opened","unhid","hid","changed_owner","tookover","added_participant","owner_left","participant_left","removed_participant","event_type","can_hide","Hide","Unhide","hidden_on","hidden_by_name","hidden_by","USER_SPAN","USER_URL","Hidden","Poster","event_by","event_on","MESSAGE","ITEM_LINK","ITEM_SPAN","ChangedTitle","Moved","Merged","ChangedOwner","AddedParticipant","RemovedParticipant","msgstring","oldTitle","event_context","old_title","fromCategory","from_category","mergedThread","merged_thread","newOwner","is_read","initialized","observer","IntersectionObserver","entries","observe","entry","isIntersecting","primed","read","destroy","disconnect","ready","initialize","AttachmentPreview","AttachmentDetails","AttachmentThumbnail","AttachmentIcon","backgroundImage","can_see_hidden","Row","FlagBestAnswer","best_answer","best_answer_marked_by","marked_on","best_answer_marked_on","marked_by","best_answer_marked_by_name","FlagHidden","FlagUnapproved","is_unapproved","FlagProtected","approve","unprotect","like","lastLikes","last_likes","concatedLikes","finalLikes","is_liked","likes","unlike","previousState","ops","markAsBestAnswer","best_answer_is_protected","best_answer_marked_by_slug","patchThread","unmarkBestAnswer","hydrateLike","ModalDialog","LikesList","liked_on","likesCount","LikeDetails","liker_id","LikeDate","likedOn","can_reply","can_see_likes","can_like","MarkAsBestAnswer","MarkAsBestAnswerCompact","Like","Likes","LikesCompact","Reply","Quote","can_mark_best_answer","can_mark_as_best_answer","can_change_best_answer","hasLikes","getLikesMessage","u","hiddenLikes","otherUsers","lastUser","usernamesList","last_user","editor","move","new_thread","onUrlChange","DiffItem","revertEdit","canRevert","goToEdit","previous","GoBackBtn","goBack","GoForwardBtn","goForward","GoLastBtn","goLast","Label","RevertBtn","editor_name","edited_on","edited_by","hydrateEdit","edits","hydratedPost","PostingConfig","ModerationForm","isError","Error","Loader","categoryId","can_pin_threads","weight","can_hide_threads","can_close_threads","is_closed","isHiddenChoices","isClosedChoices","getWeightChoices","Modal","renderWeightField","renderHiddenField","renderClosedField","Permalink","UnmarkMarkBestAnswer","PostEdits","Approve","Move","Split","Protect","Unprotect","permaUrl","protocol","host","prompt","can_unmark_best_answer","isUnedited","can_approve","can_move","can_unhide","isSelected","can_merge_posts","UnreadLabel","UnreadCompact","PostedOn","PostedOnCompact","PostEditsCompacts","ProtectedLabel","postAuthor","hasAcl","hasVisibleTitle","ListItem","is_event","has_poll","has_unapproved_posts","replies","starter","starter_name","started_on","handleSuccessUnmounted","bestAnswer","BestAnswerSelect","bestAnswers","onBestAnswerChange","PollSelect","onPollChange","best_answers","merge","other_thread","post_set","ModalMessage","ModalLoading","successMessage","changeTitle","dropup","stickToBottom","watch","setNotifications","special_role","breadcrumbs","hasFlags","is_authenticated","enabled","resetScroll","ThreadPaginatorConnected","withRouter","router","scrollToTop","first","formData","min","max","PostErrors","heading","ids","rollback","isArray","Merge","can_merge","onReply","compact","is_new","new_post","unapproved_post","last_post","pollDisabled","onPoll","can_start_poll","setPageTitle","editPoll","shouldFetchData","fetchData","startPollingApi","stopPollingApi","params","delayed","threadModeration","getThreadModeration","postsModeration","getPostsModeration","openPollForm","openReplyForm","closePollForm","can_close","can_pin_globally","can_pin","can_unprotect","basePath","Route","getPageUrl","trackedPeriod","rankUrl","getUserStatus","getRankName","getUserTitle","counter","meta","posters","getLeadMessage","tracked_period","string","subString","n","stringCount","description","getRankDescription","getComponent","Rank","ActivePosters","Users","_element","_component","removeClass","attr","forum_index_title","reducer","initialState","array","SELECT_ALL","SELECT_NONE","SELECT_ITEM","APPEND_THREADS","DELETE_THREAD","FILTER_THREADS","HYDRATE_THREADS","PATCH_THREAD","SORT_THREADS","MODERATION_PERMISSIONS","hydrateThread","thread_acl","perm","mergedState","concatUnique","sort","sorting","itemCategory","categoriesMap","lft","rght","patchedState","doTick","UPDATE_AUTHENTICATED_USER","PATCH_USER","SIGN_IN","SIGN_OUT","signIn","signOut","soft","updatedState","UPDATE_AVATAR","userId","UPDATE_USERNAME","OPEN_SITE_NAV","OPEN_SEARCH","OPEN_NOTIFICATIONS","OPEN_PRIVATE_THREADS","OPEN_USER_NAV","CLOSE","openSiteNav","openSearch","openNotifications","openUserNav","privateThreads","REPLACE_PARTICIPANTS","BUSY_POLL","RELEASE_POLL","REMOVE_POLL","REPLACE_POLL","UPDATE_POLL","busy","release","hydrated","PATCH_POST","updated_on","hydrateAttachment","hydrateUser","APPEND_POSTS","SELECT_POST","DESELECT_POST","DESELECT_POSTS","LOAD_POSTS","UNLOAD_POSTS","UPDATE_POSTS","deselect","deselectAll","hydratePost","unload","selectedPosts","deseletedPosts","deseletedAllPosts","resultsIds","reducedPosts","postReducer","LOAD_DETAILS","HYDRATE_PROFILE","PATCH_PROFILE","hydrateStatus","REPLACE_SEARCH","UPDATE_SEARCH","UPDATE_SEARCH_PROVIDER","SHOW_SNACKBAR","HIDE_SNACKBAR","showSnackbar","messageType","hideSnackbar","BUSY_THREAD","RELEASE_THREAD","REPLACE_THREAD","UPDATE_THREAD","UPDATE_THREAD_ACL","last_post_on","TICK","ADD_NAME_CHANGE","APPEND_HISTORY","HYDRATE_HISTORY","changedBy","hydrateNamechange","namechange","unshift","floor","APPEND_USERS","HYDRATE_USERS","_cookieName","_csrfToken","_locks","self","resolve","reject","getCsrfToken","contentType","dataType","jqXHR","responseJSON","statusText","lock","param","waiter","wait","processData","XMLHttpRequest","evt","lengthComputable","total","local","_store","_local","_modal","syncSession","watchState","getState","BaseCaptcha","_ajax","_include","_snackbar","NoCaptcha","QACaptcha","kwargs","ReCaptchaComponent","grecaptcha","render","sitekey","siteKey","binding","ReCaptcha","recaptcha_site_key","captcha_type","_captcha","init","staticUrl","_staticUrl","_included","script","remote","localStorage","_prefix","_watchers","e","newValueJson","watcher","oldValue","setItem","itemString","getItem","indexTitle","forumName","_indexTitle","_forumName","finalTitle","_polls","stop","poolServer","_stopped","apiError","pollId","unsetBeforeUnload","_props","_isOpen","_isClosing","_mount","_observer","unobserve","_spacer","_mode","ResizeObserver","contentRect","_beforeunloadSet","beforeUnload","capture","returnValue","_realOpen","setBeforeUnload","_timeout","alert","_reducers","_initialState","createStore","combineReducers","_isLoaded","_loadedPromise","_loadingPromise","tries","plain","expires","getReasonMessage","RedrawedBannedPage","BannedPage","changeState","rowWidth","padding","b","m","bytes","roundSize","toFixed","ALPHA","ALPHA_LEN","len","chars","Component","rootElementId","connected","rootElement","finalComponent","int","childRoutes","onEnter","EMAIL","USERNAME","USERNAME_ALPHANUMERIC","String","requiredTermsOfService","requiredPrivacyPolicy","returnMessage","usernameMinLength","lengthMin","usernameMaxLength","lengthMax","usernameContent","valueTrimmed","webpackContext","req","webpackContextResolve","__webpack_require__","o","module","exports","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","r","getter","__esModule","d","definition","defineProperty","enumerable","chunkId","reduce","promises","miniCssF","g","globalThis","Function","hmd","create","obj","prop","prototype","l","done","needAttach","scripts","getElementsByTagName","s","charset","nc","onScriptComplete","prev","onerror","onload","doneFns","removeChild","bind","head","Symbol","toStringTag","nmd","scriptUrl","importScripts","currentScript","installedChunks","installedChunkData","errorType","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"misago.js","mappings":"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MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,QACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,QACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,QACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnE,IAAImE,EAAsBnE,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SAC7FmE,EAAsBnE,EAAoBQ,EAAE2D,E","sources":["webpack://misago/webpack/runtime/chunk loaded","webpack://misago/webpack/runtime/load script","webpack://misago/./src/components/Api/ApiFetch.jsx","webpack://misago/./src/components/Api/ApiMutation.jsx","webpack://misago/./src/components/Dropdown/Dropdown.jsx","webpack://misago/./src/components/Dropdown/DropdownDivider.jsx","webpack://misago/./src/components/Dropdown/DropdownFooter.jsx","webpack://misago/./src/components/Dropdown/DropdownHeader.jsx","webpack://misago/./src/components/Dropdown/DropdownMenuItem.jsx","webpack://misago/./src/components/Dropdown/DropdownPills.jsx","webpack://misago/./src/components/Dropdown/DropdownSubheader.jsx","webpack://misago/./src/components/FlexRow/FlexRow.jsx","webpack://misago/./src/components/FlexRow/FlexRowCol.jsx","webpack://misago/./src/components/FlexRow/FlexRowSection.jsx","webpack://misago/./src/components/ListGroup/ListGroup.jsx","webpack://misago/./src/components/ListGroup/ListGroupItem.jsx","webpack://misago/./src/components/ListGroup/ListGroupEmpty.jsx","webpack://misago/./src/components/ListGroup/ListGroupError.jsx","webpack://misago/./src/components/ListGroup/ListGroupLoading.jsx","webpack://misago/./src/components/ListGroup/ListGroupMessage.jsx","webpack://misago/./src/components/NotificationsFetch/NotificationsFetch.jsx","webpack://misago/./src/components/NotificationsFetch/index.js","webpack://misago/./src/components/NotificationsList/NotificationsListEmpty.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListGroup.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItemActor.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItemMessage.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItemReadStatus.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItemTimestamp.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItem.jsx","webpack://misago/./src/components/NotificationsList/NotificationsList.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListError.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListLoading.jsx","webpack://misago/./src/components/Overlay/Overlay.jsx","webpack://misago/./src/components/Overlay/OverlayHeader.jsx","webpack://misago/./src/components/PageContainer.jsx","webpack://misago/./src/components/PageHeader/PageHeader.jsx","webpack://misago/./src/components/PageHeader/PageHeaderBanner.jsx","webpack://misago/./src/components/PageHeader/PageHeaderContainer.jsx","webpack://misago/./src/components/PageHeader/PageHeaderDetails.jsx","webpack://misago/./src/components/PageHeader/PageHeaderPlain.jsx","webpack://misago/./src/components/password-strength.js","webpack://misago/./src/components/register.js","webpack://misago/./src/components/RegisterButton/index.js","webpack://misago/./src/components/RegisterButton/RegisterButton.jsx","webpack://misago/./src/components/RegisterLegalFootnote.js","webpack://misago/./src/components/Search/SearchResultsList.jsx","webpack://misago/./src/components/Search/SearchMessage.jsx","webpack://misago/./src/components/Search/SearchResultPost.jsx","webpack://misago/./src/components/Search/SearchResultUser.jsx","webpack://misago/./src/components/Search/SearchResults.jsx","webpack://misago/./src/components/Search/SearchResultsEmpty.jsx","webpack://misago/./src/components/Search/SearchResultsError.jsx","webpack://misago/./src/components/Search/SearchResultsLoading.jsx","webpack://misago/./src/components/Search/SearchFetch.jsx","webpack://misago/./src/components/Search/SearchInput.jsx","webpack://misago/./src/components/Search/SearchQuery.jsx","webpack://misago/./src/components/Search/SearchDropdown.jsx","webpack://misago/./src/components/Search/SearchOverlay.jsx","webpack://misago/./src/components/SignInButton/index.js","webpack://misago/./src/components/SignInButton/SignInButton.jsx","webpack://misago/./src/components/SiteNav/SiteNavMenu.jsx","webpack://misago/./src/components/SiteNav/SiteNavDropdown.jsx","webpack://misago/./src/components/SiteNav/SiteNavOverlay.jsx","webpack://misago/./src/components/StartSocialAuth.js","webpack://misago/./src/components/Timestamp/Timestamp.jsx","webpack://misago/./src/components/Timestamp/index.js","webpack://misago/./src/components/Toolbar/Toolbar.jsx","webpack://misago/./src/components/Toolbar/ToolbarItem.jsx","webpack://misago/./src/components/Toolbar/ToolbarSection.jsx","webpack://misago/./src/components/Toolbar/ToolbarSpacer.jsx","webpack://misago/./src/components/change-avatar/index.js","webpack://misago/./src/components/change-avatar/crop.js","webpack://misago/./src/components/change-avatar/upload.js","webpack://misago/./src/components/change-avatar/gallery.js","webpack://misago/./src/components/change-avatar/root.js","webpack://misago/./src/components/UserNav/logout.js","webpack://misago/./src/components/UserNav/UserNavMenu.jsx","webpack://misago/./src/components/UserNav/UserNavDropdown.jsx","webpack://misago/./src/components/UserNav/UserNavOverlay.jsx","webpack://misago/./src/components/avatar.js","webpack://misago/./src/components/button.js","webpack://misago/./src/components/category-select.js","webpack://misago/./src/components/form-group.js","webpack://misago/./src/components/form.js","webpack://misago/./src/components/li.js","webpack://misago/./src/components/loader.js","webpack://misago/./src/services/one-box.js","webpack://misago/./src/components/misago-markup.js","webpack://misago/./src/components/modal-loader.js","webpack://misago/./src/components/modal-message.js","webpack://misago/./src/components/panel-message.js","webpack://misago/./src/components/post-feed/post/body.js","webpack://misago/./src/components/post-feed/post/header.js","webpack://misago/./src/components/post-feed/post/post-side/button.js","webpack://misago/./src/components/post-feed/post/post-side/anonymous.js","webpack://misago/./src/components/post-feed/post/post-side/user-title.js","webpack://misago/./src/components/post-feed/post/post-side/registered.js","webpack://misago/./src/components/post-feed/post/post-side/index.js","webpack://misago/./src/components/post-feed/post/index.js","webpack://misago/./src/components/post-feed/preview.js","webpack://misago/./src/components/post-feed/index.js","webpack://misago/./src/components/posting/PostingQuoteSelection.jsx","webpack://misago/./src/components/posting/getQuoteMarkup.js","webpack://misago/./src/components/posting/globalState.js","webpack://misago/./src/components/posting/utils/attachments.js","webpack://misago/./src/components/MarkupEditor/MarkupAttachmentModal.jsx","webpack://misago/./src/components/MarkupEditor/operations.js","webpack://misago/./src/components/MarkupEditor/MarkupEditorAttachment.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditorAttachments.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditorFooter.jsx","webpack://misago/./src/components/MarkupEditor/MarkupCodeModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupFormattingHelpModal.jsx","webpack://misago/./src/components/MarkupEditor/isUrl.js","webpack://misago/./src/components/MarkupEditor/MarkupImageModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupLinkModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupQuoteModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditorButton.jsx","webpack://misago/./src/components/MarkupEditor/uploadFile.js","webpack://misago/./src/components/MarkupEditor/MarkupEditorToolbar.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditor.jsx","webpack://misago/./src/components/MarkupEditor/index.js","webpack://misago/./src/components/posting/PostingDialog.jsx","webpack://misago/./src/components/posting/PostingDialogBody.jsx","webpack://misago/./src/components/posting/PostingDialogError.jsx","webpack://misago/./src/components/posting/PostingDialogHeader.jsx","webpack://misago/./src/components/posting/PostingThreadOptions.jsx","webpack://misago/./src/components/posting/start.js","webpack://misago/./src/components/posting/utils/usernames.js","webpack://misago/./src/components/posting/start-private.js","webpack://misago/./src/components/posting/reply.js","webpack://misago/./src/components/posting/edit.js","webpack://misago/./src/components/posting/index.js","webpack://misago/./src/components/posting/utils/validators.js","webpack://misago/./src/components/select.js","webpack://misago/./src/components/sign-in.js","webpack://misago/./src/components/user-status.js","webpack://misago/./src/components/users-list/card/stats.js","webpack://misago/./src/components/users-list/card/user-title.js","webpack://misago/./src/components/users-list/card/index.js","webpack://misago/./src/components/users-list/preview/card.js","webpack://misago/./src/components/users-list/preview/index.js","webpack://misago/./src/components/users-list/index.js","webpack://misago/./src/components/with-dropdown.js","webpack://misago/./src/components/yes-no-switch.js","webpack://misago/./src/formats.js","webpack://misago/./src/utils/ordered-list.js","webpack://misago/./src/AjaxLoader.js","webpack://misago/./src/BulkModeration.js","webpack://misago/./src/formValidators.js","webpack://misago/./src/snackbars.js","webpack://misago/./src/htmxErrors.js","webpack://misago/./src/liveTimestamps.js","webpack://misago/./src/index.js","webpack://misago/./src/initializers/ajax.js","webpack://misago/./src/initializers/auth-sync.js","webpack://misago/./src/initializers/auth.js","webpack://misago/./src/initializers/captcha.js","webpack://misago/./src/components/accept-agreement.js","webpack://misago/./src/initializers/components/accept-agreement.js","webpack://misago/./src/components/auth-message.js","webpack://misago/./src/initializers/components/auth-message.js","webpack://misago/./src/initializers/components/banned-page.js","webpack://misago/./src/components/SignInModalAutoOpen.js","webpack://misago/./src/components/Navbar/NavbarBranding.jsx","webpack://misago/./src/components/Navbar/NavbarExtraMenu.jsx","webpack://misago/./src/components/NotificationsDropdown/NotificationsDropdownBody.jsx","webpack://misago/./src/components/NotificationsDropdown/index.js","webpack://misago/./src/components/NotificationsDropdown/NotificationsDropdown.jsx","webpack://misago/./src/components/Navbar/NavbarNotificationsToggle.jsx","webpack://misago/./src/components/Navbar/NavbarNotificationsDropdown.jsx","webpack://misago/./src/components/Navbar/NavbarPrivateThreads.jsx","webpack://misago/./src/components/Navbar/NavbarSearchToggle.jsx","webpack://misago/./src/components/Navbar/NavbarSearchDropdown.jsx","webpack://misago/./src/components/Navbar/NavbarSiteNavToggle.jsx","webpack://misago/./src/components/Navbar/NavbarSiteNavDropdown.jsx","webpack://misago/./src/components/Navbar/NavbarUserNavToggle.jsx","webpack://misago/./src/components/Navbar/NavbarUserNavDropdown.jsx","webpack://misago/./src/components/Navbar/Navbar.jsx","webpack://misago/./src/components/Navbar/index.js","webpack://misago/./src/initializers/components/navbar.js","webpack://misago/./src/components/NotificationsOverlay/NotificationsOverlayBody.jsx","webpack://misago/./src/components/NotificationsOverlay/NotificationsOverlay.jsx","webpack://misago/./src/components/NotificationsOverlay/index.js","webpack://misago/./src/initializers/components/notifications-overlay.js","webpack://misago/./src/components/Notifications/NotificationsHeader.jsx","webpack://misago/./src/components/PageTitle/index.js","webpack://misago/./src/components/PageTitle/PageTitle.jsx","webpack://misago/./src/components/PillsNav/PillsNav.jsx","webpack://misago/./src/components/PillsNav/PillsNavLink.jsx","webpack://misago/./src/components/Notifications/NotificationsPills.jsx","webpack://misago/./src/components/Notifications/NotificationsPagination.jsx","webpack://misago/./src/components/Notifications/NotificationsToolbar.jsx","webpack://misago/./src/components/Notifications/NotificationsRoute.jsx","webpack://misago/./src/components/Notifications/index.js","webpack://misago/./src/components/Notifications/Notifications.jsx","webpack://misago/./src/initializers/components/notifications.js","webpack://misago/./src/components/panel-loader.js","webpack://misago/./src/components/profile/ban-details.js","webpack://misago/./src/components/edit-details/blankslate.js","webpack://misago/./src/components/edit-details/loader.js","webpack://misago/./src/components/edit-details/field-input.js","webpack://misago/./src/components/edit-details/fieldset.js","webpack://misago/./src/components/edit-details/form.js","webpack://misago/./src/components/edit-details/index.js","webpack://misago/./src/components/profile/details/form.js","webpack://misago/./src/components/profile/details/empty-message.js","webpack://misago/./src/components/profile/details/field-value.js","webpack://misago/./src/components/profile/details/field.js","webpack://misago/./src/components/profile/details/group.js","webpack://misago/./src/components/profile/details/groups-list.js","webpack://misago/./src/components/profile/details/header.js","webpack://misago/./src/data/profile-details.js","webpack://misago/./src/components/profile/details/index.js","webpack://misago/./src/components/profile/feed/route.js","webpack://misago/./src/components/quick-search.js","webpack://misago/./src/components/profile/followers.js","webpack://misago/./src/components/profile/follows.js","webpack://misago/./src/components/username-history/list-empty.js","webpack://misago/./src/components/username-history/change.js","webpack://misago/./src/components/username-history/list-ready.js","webpack://misago/./src/components/username-history/change-preview.js","webpack://misago/./src/components/username-history/list-preview.js","webpack://misago/./src/components/username-history/root.js","webpack://misago/./src/components/profile/username-history.js","webpack://misago/./src/components/profile/follow-button.js","webpack://misago/./src/components/profile/message-button.js","webpack://misago/./src/components/profile/moderation/avatar-controls.js","webpack://misago/./src/components/profile/moderation/change-username.js","webpack://misago/./src/components/profile/moderation/delete-account.js","webpack://misago/./src/components/profile/moderation/nav.js","webpack://misago/./src/components/profile/ProfileDataList.jsx","webpack://misago/./src/components/profile/ProfileHeader.jsx","webpack://misago/./src/components/profile/ProfileNav.js","webpack://misago/./src/components/profile/root.js","webpack://misago/./src/components/profile/feed/index.js","webpack://misago/./src/initializers/components/profile.js","webpack://misago/./src/components/request-activation-link.js","webpack://misago/./src/initializers/components/request-activation-link.js","webpack://misago/./src/components/request-password-reset.js","webpack://misago/./src/initializers/components/request-password-reset.js","webpack://misago/./src/components/reset-password-form.js","webpack://misago/./src/initializers/components/reset-password-form.js","webpack://misago/./src/initializers/components/search-overlay.js","webpack://misago/./src/components/search-route/form.js","webpack://misago/./src/components/search-route/sidenav.js","webpack://misago/./src/components/search-route/page.js","webpack://misago/./src/components/search-route/threads/results.js","webpack://misago/./src/components/search-route/threads/index.js","webpack://misago/./src/components/search-route/users/index.js","webpack://misago/./src/components/search-route/index.js","webpack://misago/./src/initializers/components/search.js","webpack://misago/./src/initializers/components/site-nav-overlay.js","webpack://misago/./src/components/snackbar.js","webpack://misago/./src/initializers/components/snackbar.js","webpack://misago/./src/components/social-auth/header.js","webpack://misago/./src/components/social-auth/register.js","webpack://misago/./src/components/social-auth/complete.js","webpack://misago/./src/components/social-auth/index.js","webpack://misago/./src/initializers/components/social-auth.js","webpack://misago/./src/components/add-participant.js","webpack://misago/./src/components/participants/add-participant.js","webpack://misago/./src/components/participants/cards-list/make-owner.js","webpack://misago/./src/components/participants/cards-list/actions.js","webpack://misago/./src/components/participants/cards-list/remove.js","webpack://misago/./src/components/participants/cards-list/card.js","webpack://misago/./src/components/participants/cards-list/index.js","webpack://misago/./src/components/participants/index.js","webpack://misago/./src/components/participants/utils.js","webpack://misago/./src/components/poll/results/chart.js","webpack://misago/./src/components/poll/results/modal.js","webpack://misago/./src/components/poll/results/options.js","webpack://misago/./src/components/poll/info.js","webpack://misago/./src/components/poll/results/index.js","webpack://misago/./src/components/poll/voting/help.js","webpack://misago/./src/components/poll/voting/select.js","webpack://misago/./src/components/poll/voting/utils.js","webpack://misago/./src/components/poll/voting/index.js","webpack://misago/./src/components/poll/poll.js","webpack://misago/./src/components/poll/form/choices-control.js","webpack://misago/./src/components/poll/form/index.js","webpack://misago/./src/components/posts-list/event/icon.js","webpack://misago/./src/components/posts-list/event/controls.js","webpack://misago/./src/components/posts-list/event/info.js","webpack://misago/./src/components/posts-list/event/message.js","webpack://misago/./src/components/posts-list/event/unread-label.js","webpack://misago/./src/components/posts-list/waypoint.js","webpack://misago/./src/components/posts-list/event/index.js","webpack://misago/./src/components/posts-list/post/attachments/attachment.js","webpack://misago/./src/components/posts-list/post/attachments/index.js","webpack://misago/./src/components/posts-list/post/body.js","webpack://misago/./src/components/posts-list/post/flags.js","webpack://misago/./src/components/posts-list/post/controls/actions.js","webpack://misago/./src/components/post-likes.js","webpack://misago/./src/components/posts-list/post/footer.js","webpack://misago/./src/components/posts-list/post/controls/move.js","webpack://misago/./src/components/post-changelog/diff.js","webpack://misago/./src/components/post-changelog/footer.js","webpack://misago/./src/components/post-changelog/toolbar.js","webpack://misago/./src/components/post-changelog/utils.js","webpack://misago/./src/components/post-changelog/index.js","webpack://misago/./src/components/posts-list/post/controls/split.js","webpack://misago/./src/components/posts-list/post/controls/dropdown.js","webpack://misago/./src/components/posts-list/post/controls/index.js","webpack://misago/./src/components/posts-list/post/select.js","webpack://misago/./src/components/posts-list/post/header.js","webpack://misago/./src/components/posts-list/post/post-side/anonymous.js","webpack://misago/./src/components/posts-list/post/post-side/has-visible-title.js","webpack://misago/./src/components/posts-list/post/post-side/user-postcount.js","webpack://misago/./src/components/posts-list/post/post-side/user-status.js","webpack://misago/./src/components/posts-list/post/post-side/user-title.js","webpack://misago/./src/components/posts-list/post/post-side/registered.js","webpack://misago/./src/components/posts-list/post/post-side/index.js","webpack://misago/./src/components/posts-list/post/index.js","webpack://misago/./src/components/posts-list/post/preview.js","webpack://misago/./src/components/posts-list/index.js","webpack://misago/./src/components/ThreadFlags.jsx","webpack://misago/./src/components/ThreadReplies.jsx","webpack://misago/./src/components/ThreadStarterCard.jsx","webpack://misago/./src/components/thread/moderation/thread/ThreadChangeTitleModal.jsx","webpack://misago/./src/components/merge-conflict.js","webpack://misago/./src/components/thread/moderation/thread/merge.js","webpack://misago/./src/components/thread/moderation/thread/move.js","webpack://misago/./src/components/thread/moderation/thread/controls.js","webpack://misago/./src/components/thread/moderation/thread/index.js","webpack://misago/./src/components/thread/ThreadModeration.jsx","webpack://misago/./src/components/thread/ThreadWatchButton.jsx","webpack://misago/./src/components/Breadcrumbs/Breadcrumbs.jsx","webpack://misago/./src/components/Breadcrumbs/BreadcrumbsCategory.jsx","webpack://misago/./src/components/Breadcrumbs/BreadcrumbsRootCategory.jsx","webpack://misago/./src/components/thread/ThreadHeader/ThreadHeaderBreadcrumbs.jsx","webpack://misago/./src/components/thread/ThreadHeader/ThreadHeader.jsx","webpack://misago/./src/components/thread/ThreadHeader/index.js","webpack://misago/./src/components/thread/ThreadPaginator.jsx","webpack://misago/./src/components/thread/moderation/posts/errors-list.js","webpack://misago/./src/components/thread/moderation/posts/actions.js","webpack://misago/./src/components/thread/moderation/posts/move.js","webpack://misago/./src/components/thread/moderation/posts/split.js","webpack://misago/./src/components/thread/moderation/posts/dropdown.js","webpack://misago/./src/components/thread/ThreadPostsModeration.jsx","webpack://misago/./src/components/thread/ThreadReplyButton.jsx","webpack://misago/./src/components/thread/ThreadToolbarBottom.jsx","webpack://misago/./src/components/thread/ThreadToolbarThird.jsx","webpack://misago/./src/components/thread/ThreadPollButton.jsx","webpack://misago/./src/components/thread/ThreadShortcutsButton.jsx","webpack://misago/./src/components/thread/ThreadToolbarTop.jsx","webpack://misago/./src/components/thread/route.js","webpack://misago/./src/components/thread/root.js","webpack://misago/./src/initializers/components/thread.js","webpack://misago/./src/initializers/components/user-nav-overlay.js","webpack://misago/./src/components/users/UsersNav.js","webpack://misago/./src/components/users/active-posters/list-empty.js","webpack://misago/./src/components/users/active-posters/list-item-preview.js","webpack://misago/./src/components/users/active-posters/list-preview.js","webpack://misago/./src/components/users/active-posters/list-item.js","webpack://misago/./src/components/users/active-posters/list-ready.js","webpack://misago/./src/components/users/active-posters/root.js","webpack://misago/./src/components/page-lead.js","webpack://misago/./src/utils/string-count.js","webpack://misago/./src/components/users/rank/RankUsersList.js","webpack://misago/./src/components/users/rank/RankUsersListLoader.js","webpack://misago/./src/components/users/rank/RankUsersLeft.jsx","webpack://misago/./src/components/users/rank/RankUsersPagination.jsx","webpack://misago/./src/components/users/rank/RankUsersToolbar.jsx","webpack://misago/./src/components/users/rank/root.js","webpack://misago/./src/components/users/root.js","webpack://misago/./src/initializers/components/users.js","webpack://misago/./src/initializers/include.js","webpack://misago/./src/initializers/local-storage.js","webpack://misago/./src/services/mobile-navbar-dropdown.js","webpack://misago/./src/initializers/mobile-navbar-dropdown.js","webpack://misago/./src/initializers/modal.js","webpack://misago/./src/initializers/moment-locale.js","webpack://misago/./src/initializers/page-title.js","webpack://misago/./src/initializers/polls.js","webpack://misago/./src/initializers/posting.js","webpack://misago/./src/initializers/reducers/auth.js","webpack://misago/./src/initializers/reducers/overlay.js","webpack://misago/./src/initializers/reducers/participants.js","webpack://misago/./src/initializers/reducers/poll.js","webpack://misago/./src/initializers/reducers/posts.js","webpack://misago/./src/initializers/reducers/profile-details.js","webpack://misago/./src/initializers/reducers/profile-hydrate.js","webpack://misago/./src/initializers/reducers/profile.js","webpack://misago/./src/initializers/reducers/search.js","webpack://misago/./src/utils/sets.js","webpack://misago/./src/reducers/selection.js","webpack://misago/./src/initializers/reducers/selection.js","webpack://misago/./src/initializers/reducers/snackbar.js","webpack://misago/./src/initializers/reducers/thread.js","webpack://misago/./src/reducers/threads.js","webpack://misago/./src/initializers/reducers/threads.js","webpack://misago/./src/initializers/reducers/tick.js","webpack://misago/./src/initializers/reducers/username-history.js","webpack://misago/./src/initializers/reducers/users.js","webpack://misago/./src/initializers/snackbar.js","webpack://misago/./src/initializers/store.js","webpack://misago/./src/initializers/tick-start.js","webpack://misago/./src/initializers/zxcvbn.js","webpack://misago/./src/reducers/auth.js","webpack://misago/./src/reducers/overlay.js","webpack://misago/./src/reducers/participants.js","webpack://misago/./src/reducers/poll.js","webpack://misago/./src/reducers/post.js","webpack://misago/./src/reducers/posts.js","webpack://misago/./src/reducers/profile-details.js","webpack://misago/./src/reducers/profile.js","webpack://misago/./src/reducers/search.js","webpack://misago/./src/reducers/snackbar.js","webpack://misago/./src/reducers/thread.js","webpack://misago/./src/reducers/tick.js","webpack://misago/./src/reducers/username-history.js","webpack://misago/./src/reducers/users.js","webpack://misago/./src/services/ajax.js","webpack://misago/./src/services/auth.js","webpack://misago/./src/services/captcha.js","webpack://misago/./src/services/include.js","webpack://misago/./src/services/local-storage.js","webpack://misago/./src/services/modal.js","webpack://misago/./src/services/page-title.js","webpack://misago/./src/services/polls.js","webpack://misago/./src/services/posting.js","webpack://misago/./src/services/snackbar.js","webpack://misago/./src/services/store.js","webpack://misago/./src/services/zxcvbn.js","webpack://misago/./src/components/banned-page.js","webpack://misago/./src/utils/banned-page.js","webpack://misago/./src/utils/batch.js","webpack://misago/./src/utils/concat-unique.js","webpack://misago/./src/utils/escape-html.js","webpack://misago/./src/utils/file-size.js","webpack://misago/./src/utils/getRandomString.js","webpack://misago/./src/utils/mount-component.js","webpack://misago/./src/utils/random.js","webpack://misago/./src/utils/routed-component.js","webpack://misago/./src/utils/validators.js","webpack://misago/./node_modules/moment/locale/ sync ^\\.\\/.*$","webpack://misago/webpack/bootstrap","webpack://misago/webpack/runtime/compat get default export","webpack://misago/webpack/runtime/define property getters","webpack://misago/webpack/runtime/ensure chunk","webpack://misago/webpack/runtime/get javascript chunk filename","webpack://misago/webpack/runtime/get mini-css chunk filename","webpack://misago/webpack/runtime/global","webpack://misago/webpack/runtime/harmony module decorator","webpack://misago/webpack/runtime/hasOwnProperty shorthand","webpack://misago/webpack/runtime/make namespace object","webpack://misago/webpack/runtime/node module decorator","webpack://misago/webpack/runtime/publicPath","webpack://misago/webpack/runtime/jsonp chunk loading","webpack://misago/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"misago:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import React from \"react\"\n\nexport default class ApiFetch extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n data: null,\n loading: false,\n error: null,\n }\n\n this.controller = new AbortController()\n this.signal = this.controller.signal\n }\n\n componentDidMount() {\n if (this.props.url && !this.props.disabled) {\n this.request(this.props.url)\n }\n }\n\n componentDidUpdate(prevProps) {\n const url = this.props.url\n const urlChanged = url && url !== prevProps.url\n const disabledChanged = this.props.disabled != prevProps.disabled\n\n if (urlChanged || disabledChanged) {\n if (!this.props.disabled) {\n if (this.hasCache(url)) {\n this.getCache(url)\n } else {\n this.controller.abort()\n\n this.controller = new AbortController()\n this.signal = this.controller.signal\n this.request(url)\n }\n } else {\n this.controller.abort()\n }\n }\n }\n\n componentWillUnmount() {\n this.controller.abort()\n }\n\n hasCache = (url) => {\n return this.props.cache && this.props.cache[url]\n }\n\n getCache = async (url) => {\n const data = this.props.cache[url]\n this.setState({ loading: false, error: null, data })\n if (this.props.onData) {\n await this.props.onData(data)\n }\n }\n\n setCache = (url, data) => {\n if (this.props.cache) {\n this.props.cache[url] = data\n }\n }\n\n request = (url) => {\n this.setState({ loading: true })\n\n fetch(url, {\n method: \"GET\",\n credentials: \"include\",\n signal: this.signal,\n }).then(\n async (response) => {\n if (url === this.props.url) {\n if (response.status == 200) {\n const data = await response.json()\n this.setState({ loading: false, error: null, data })\n this.setCache(url, data)\n if (this.props.onData) {\n await this.props.onData(data)\n }\n } else {\n const error = { status: response.status }\n if (response.headers.get(\"Content-Type\") === \"application/json\") {\n error.data = await response.json()\n }\n this.setState({ loading: false, error })\n }\n }\n },\n (rejection) => {\n if (url === this.props.url) {\n this.setState({ loading: false, error: { status: 0, rejection } })\n }\n }\n )\n }\n\n refetch = () => {\n this.request(this.props.url)\n }\n\n update = (mutation) => {\n this.setState((state) => {\n return { data: mutation(state.data) }\n })\n }\n\n render() {\n return this.props.children(\n Object.assign({ refetch: this.refetch, update: this.update }, this.state)\n )\n }\n}\n","import React from \"react\"\n\nexport default class ApiMutation extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n data: null,\n loading: false,\n error: null,\n }\n }\n\n mutate = (options) => {\n this.setState({ loading: true })\n\n fetch(this.props.url, {\n method: this.props.method || \"POST\",\n credentials: \"include\",\n headers: headers(options),\n body: body(options),\n }).then(\n async (response) => {\n if (response.status == 200) {\n const data = await response.json()\n this.setState({ loading: false, data })\n if (options.onSuccess) {\n await options.onSuccess(data)\n }\n } else if (response.status == 204) {\n this.setState({ loading: false })\n if (options.onSuccess) {\n await options.onSuccess()\n }\n } else {\n const error = { status: response.status }\n if (response.headers.get(\"Content-Type\") === \"application/json\") {\n error.data = await response.json()\n }\n this.setState({ loading: false, error })\n if (options.onError) {\n await options.onError(error)\n }\n }\n },\n async (rejection) => {\n const error = { status: 0, rejection }\n this.setState({ loading: false, error })\n if (options.onError) {\n await options.onError(error)\n }\n }\n )\n }\n\n render() {\n return this.props.children(this.mutate, this.state)\n }\n}\n\nfunction headers(options) {\n if (!!options.json) {\n return {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-CSRFToken\": csrfToken(),\n }\n }\n\n return {\n \"X-CSRFToken\": csrfToken(),\n }\n}\n\nfunction body(options) {\n if (!!options.json) {\n return JSON.stringify(options.json)\n }\n\n return undefined\n}\n\nfunction csrfToken() {\n const cookieName = window.misago_csrf\n\n if (document.cookie.indexOf(cookieName) !== -1) {\n const cookieRegex = new RegExp(cookieName + \"=([^;]*)\")\n const cookie = document.cookie.match(cookieRegex)[0]\n return cookie ? cookie.split(\"=\")[1] : null\n } else {\n return null\n }\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default class Dropdown extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isOpen: false,\n }\n\n this.root = null\n this.dropdown = null\n }\n\n componentDidMount() {\n window.addEventListener(\"click\", this.handleClick)\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"click\", this.handleClick)\n }\n\n componentDidUpdate(prevProps, prevState) {\n const didUpdate = prevState.isOpen !== this.state.isOpen\n if (didUpdate) {\n if (this.state.isOpen && this.props.onOpen) {\n this.props.onOpen(this.root)\n }\n\n if (!this.state.isOpen && this.props.onClose) {\n this.props.onClose(this.root)\n }\n }\n }\n\n handleClick = (event) => {\n if (\n this.state.isOpen &&\n (!this.root.contains(event.target) ||\n (this.menu.contains(event.target) && event.target.closest(\"a\")))\n ) {\n this.setState({ isOpen: false })\n }\n }\n\n toggle = () => {\n this.setState((prevState) => {\n return { isOpen: !prevState.isOpen }\n })\n }\n\n close = () => {\n this.setState({ isOpen: false })\n }\n\n render() {\n const { isOpen } = this.state\n\n return (\n {\n if (element && !this.element) {\n this.root = element\n }\n }}\n >\n {this.props.toggle({\n isOpen,\n toggle: this.toggle,\n aria: ariaProps(isOpen),\n })}\n {\n if (element && !this.menu) {\n this.menu = element\n }\n }}\n role=\"menu\"\n >\n {this.props.children({ isOpen, close: this.close })}\n
    \n
    \n )\n }\n}\n\nfunction ariaProps(isOpen) {\n return {\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isOpen ? \"true\" : \"false\",\n }\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownDivider({ className }) {\n return
  • \n}\n","import React from \"react\"\n\nexport default function DropdownFooter({ children, listItem }) {\n if (listItem) {\n return
  • {children}
  • \n }\n\n return
    {children}
    \n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownHeader({ className, children }) {\n return (\n
    {children}
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownMenuItem({ className, children }) {\n return (\n
  • {children}
  • \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownPills({ className, children }) {\n return (\n
    {children}
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownSubheader({ className, children }) {\n return (\n
  • {children}
  • \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRow = ({ children, className }) => (\n
    {children}
    \n)\n\nexport default FlexRow\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRowCol = ({ children, className, shrink }) => (\n \n {children}\n
    \n)\n\nexport default FlexRowCol\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRowSection = ({ auto, children, className }) => (\n \n {children}\n
    \n)\n\nexport default FlexRowSection\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function ListGroup({ className, children }) {\n return
      {children}
    \n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function ListGroupItem({ className, children }) {\n return (\n
  • {children}
  • \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupEmpty({ className, icon, message }) {\n return (\n \n {!!icon && (\n
    \n {icon}\n
    \n )}\n

    {message}

    \n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupError({ className, icon, message, detail }) {\n return (\n \n {!!icon && (\n
    \n {icon}\n
    \n )}\n

    {message}

    \n {!!detail &&

    {detail}

    }\n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupLoading({ className, message }) {\n return (\n \n

    {message}

    \n
    \n
    \n
    \n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupMessage({ className, icon, message, detail }) {\n return (\n \n {!!icon && (\n
    \n {icon}\n
    \n )}\n

    {message}

    \n {!!detail &&

    {detail}

    }\n
    \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { updateAuthenticatedUser } from \"../../reducers/auth\"\nimport { ApiFetch } from \"../Api\"\n\nfunction NotificationsFetch({\n children,\n filter,\n query,\n dispatch,\n unreadNotifications,\n disabled,\n}) {\n return (\n {\n if (data.unreadNotifications != unreadNotifications) {\n dispatch(\n updateAuthenticatedUser({\n unreadNotifications: data.unreadNotifications,\n })\n )\n }\n }}\n >\n {({ data, loading, error, refetch }) => {\n return children({ data, loading, error, refetch })\n }}\n \n )\n}\n\nfunction getApiUrl(filter, query) {\n let api = misago.get(\"NOTIFICATIONS_API\") + \"?limit=30\"\n api += \"&filter=\" + filter\n\n if (query) {\n if (query.after) {\n api += \"&after=\" + query.after\n }\n if (query.before) {\n api += \"&before=\" + query.before\n }\n }\n\n return api\n}\n\nfunction selectState({ auth }) {\n if (!auth.user) {\n return { unreadNotifications: null }\n }\n\n return {\n unreadNotifications: auth.user.unreadNotifications,\n }\n}\n\nconst NotificationsFetchConnected = connect(selectState)(NotificationsFetch)\n\nexport default NotificationsFetchConnected\n","import NotificationsFetch from \"./NotificationsFetch\"\n\nexport default NotificationsFetch\n","import React from \"react\"\nimport { ListGroupEmpty } from \"../ListGroup\"\n\nexport default function NotificationsListEmpty({ filter }) {\n return (\n \n )\n}\n\nfunction emptyMessage(filter) {\n if (filter === \"read\") {\n return pgettext(\n \"notifications list\",\n \"You don't have any read notifications.\"\n )\n } else if (filter === \"unread\") {\n return pgettext(\n \"notifications list\",\n \"You don't have any unread notifications.\"\n )\n }\n\n return pgettext(\"notifications list\", \"You don't have any notifications.\")\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { ListGroup } from \"../ListGroup\"\n\nexport default function NotificationsListGroup({ className, children }) {\n return (\n
    \n {children}\n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"../avatar\"\n\nexport default function NotificationsListItemActor({ notification }) {\n if (!!notification.actor) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NotificationsListItemMessage({ notification }) {\n return (\n \n )\n}\n","import React from \"react\"\n\nexport default function NotificationsListItemReadStatus({ notification }) {\n if (notification.isRead) {\n return (\n \n \n
    \n )\n }\n\n return (\n \n \n
    \n )\n}\n","import React from \"react\"\nimport Timestamp from \"../Timestamp\"\n\nexport default function NotificationsListItemTimestamp({ notification }) {\n return (\n
    \n \n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport NotificationsListItemActor from \"./NotificationsListItemActor\"\nimport NotificationsListItemMessage from \"./NotificationsListItemMessage\"\nimport NotificationsListItemReadStatus from \"./NotificationsListItemReadStatus\"\nimport NotificationsListItemTimestamp from \"./NotificationsListItemTimestamp\"\n\nexport default function NotificationsListItem({ notification }) {\n return (\n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n )\n}\n","import React from \"react\"\nimport NotificationsListEmpty from \"./NotificationsListEmpty\"\nimport NotificationsListGroup from \"./NotificationsListGroup\"\nimport NotificationsListItem from \"./NotificationsListItem\"\n\nexport default function NotificationsList({ filter, items }) {\n return (\n 0\n ? \"notifications-list-ready\"\n : \"notifications-list-pending\"\n }\n >\n {items.length === 0 && }\n {items.map((notification) => (\n \n ))}\n \n )\n}\n","import React from \"react\"\nimport { ListGroupError } from \"../ListGroup\"\nimport NotificationsListGroup from \"./NotificationsListGroup\"\n\nexport default function NotificationsListError({ error }) {\n const detail = errorDetail(error)\n\n return (\n \n \n \n )\n}\n\nfunction errorDetail(error) {\n if (error.status === 0) {\n return gettext(\n \"Check your internet connection and try refreshing the site.\"\n )\n }\n\n if (error.data && error.data.detail) {\n return error.data.detail\n }\n}\n","import React from \"react\"\nimport { ListGroupLoading } from \"../ListGroup\"\nimport NotificationsListGroup from \"./NotificationsListGroup\"\n\nexport default function NotificationsListLoading() {\n return (\n \n \n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\n\nconst BODY_CLASS = \"has-overlay\"\n\nclass Overlay extends React.Component {\n constructor(props) {\n super(props)\n\n this.scrollOrigin = null\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.open !== this.props.open) {\n if (this.props.open) {\n this.scrollOrigin = window.pageYOffset\n document.body.classList.add(BODY_CLASS)\n if (this.props.onOpen) {\n this.props.onOpen()\n }\n } else {\n document.body.classList.remove(BODY_CLASS)\n window.scrollTo(0, this.scrollOrigin)\n this.scrollOrigin = null\n }\n }\n }\n\n closeOnNavigation = (event) => {\n if (event.target.closest(\"a\")) {\n this.props.dispatch(close())\n }\n }\n\n render() {\n return (\n \n {this.props.children}\n \n )\n }\n}\n\nconst OverlayConnected = connect()(Overlay)\n\nexport default OverlayConnected\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\n\nexport function OverlayHeader({ children, dispatch }) {\n return (\n
    \n
    {children}
    \n dispatch(close())}\n >\n close\n \n
    \n )\n}\n\nconst OverlayHeaderConnected = connect()(OverlayHeader)\n\nexport default OverlayHeaderConnected\n","import React from \"react\"\n\nconst PageContainer = ({ children }) => (\n
    {children}
    \n)\n\nexport default PageContainer\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeader = ({ children, className, styleName }) => (\n \n
    \n
    \n
    \n {children}\n
    \n
    \n
    \n)\n\nexport default PageHeader\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderBanner = ({ children, className, styleName }) => (\n \n
    \n
    {children}
    \n
    \n \n)\n\nexport default PageHeaderBanner\n","import React from \"react\"\n\nconst PageHeaderContainer = ({ children }) => (\n
    {children}
    \n)\n\nexport default PageHeaderContainer\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderDetails = ({ children, className }) => (\n
    {children}
    \n)\n\nexport default PageHeaderDetails\n","import React from \"react\"\nimport PageHeader from \"./PageHeader\"\nimport PageHeaderBanner from \"./PageHeaderBanner\"\nimport PageHeaderContainer from \"./PageHeaderContainer\"\nimport PageHeaderDetails from \"./PageHeaderDetails\"\n\nconst PageHeaderPlain = ({ styleName, header, message }) => (\n \n \n \n

    {header}

    \n
    \n {message && (\n {message}\n )}\n
    \n
    \n)\n\nexport default PageHeaderPlain\n","import React from \"react\"\nimport zxcvbn from \"misago/services/zxcvbn\"\n\nexport const STYLES = [\n \"progress-bar-danger\",\n \"progress-bar-warning\",\n \"progress-bar-warning\",\n \"progress-bar-primary\",\n \"progress-bar-success\",\n]\n\nexport const LABELS = [\n pgettext(\"password strength indicator\", \"Entered password is very weak.\"),\n pgettext(\"password strength indicator\", \"Entered password is weak.\"),\n pgettext(\"password strength indicator\", \"Entered password is average.\"),\n pgettext(\"password strength indicator\", \"Entered password is strong.\"),\n pgettext(\"password strength indicator\", \"Entered password is very strong.\"),\n]\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this._score = 0\n this._password = null\n this._inputs = []\n\n this.state = {\n loaded: false,\n }\n }\n\n componentDidMount() {\n zxcvbn.load().then(() => {\n this.setState({ loaded: true })\n })\n }\n\n getScore(password, inputs) {\n let cacheStale = false\n\n if (password !== this._password) {\n cacheStale = true\n }\n\n if (inputs.length !== this._inputs.length) {\n cacheStale = true\n } else {\n inputs.map((value, i) => {\n if (value.trim() !== this._inputs[i]) {\n cacheStale = true\n }\n })\n }\n\n if (cacheStale) {\n this._score = zxcvbn.scorePassword(password, inputs)\n this._password = password\n this._inputs = inputs.map(function (value) {\n return value.trim()\n })\n }\n\n return this._score\n }\n\n render() {\n if (!this.state.loaded) return null\n\n let score = this.getScore(this.props.password, this.props.inputs)\n\n return (\n
    \n
    \n \n {LABELS[score]}\n
    \n
    \n

    {LABELS[score]}

    \n \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport PasswordStrength from \"misago/components/password-strength\"\nimport RegisterLegalFootnote from \"misago/components/RegisterLegalFootnote\"\nimport StartSocialAuth from \"misago/components/StartSocialAuth\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport auth from \"misago/services/auth\"\nimport captcha from \"misago/services/captcha\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\nimport * as validators from \"misago/utils/validators\"\n\nexport class RegisterForm extends Form {\n constructor(props) {\n super(props)\n\n const { username, password } = this.props.criteria\n\n let passwordMinLength = 0\n password.forEach((item) => {\n if (item.name === \"MinimumLengthValidator\") {\n passwordMinLength = item.min_length\n }\n })\n\n const formValidators = {\n username: [\n validators.usernameContent(),\n validators.usernameMinLength(username.min_length),\n validators.usernameMaxLength(username.max_length),\n ],\n email: [validators.email()],\n password: [validators.passwordMinLength(passwordMinLength)],\n captcha: captcha.validator(),\n }\n\n if (!!misago.get(\"TERMS_OF_SERVICE_ID\")) {\n formValidators.termsOfService = [validators.requiredTermsOfService()]\n }\n\n if (!!misago.get(\"PRIVACY_POLICY_ID\")) {\n formValidators.privacyPolicy = [validators.requiredPrivacyPolicy()]\n }\n\n this.state = {\n isLoading: false,\n\n username: \"\",\n email: \"\",\n password: \"\",\n captcha: \"\",\n\n termsOfService: null,\n privacyPolicy: null,\n\n validators: formValidators,\n errors: {},\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"USERS_API\"), {\n username: this.state.username,\n email: this.state.email,\n password: this.state.password,\n captcha: this.state.captcha,\n terms_of_service: this.state.termsOfService,\n privacy_policy: this.state.privacyPolicy,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n\n if (rejection.__all__ && rejection.__all__.length > 0) {\n snackbar.error(rejection.__all__[0])\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n }\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n modal.hide()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n handlePrivacyPolicyChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"privacyPolicy\", value)\n }\n\n handleTermsOfServiceChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"termsOfService\", value)\n }\n\n handleToggleAgreement = (agreement, value) => {\n this.setState((prevState, props) => {\n if (prevState[agreement] === null) {\n const errors = { ...prevState.errors, [agreement]: null }\n return { errors, [agreement]: value }\n }\n\n const validator = this.state.validators[agreement][0]\n const errors = { ...prevState.errors, [agreement]: [validator(null)] }\n return { errors, [agreement]: null }\n })\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"register modal title\", \"Register\")}\n

    \n
    \n
    \n \n \n
    \n \n\n \n \n \n\n \n \n \n\n \n }\n >\n \n \n\n {captcha.component({\n form: this,\n })}\n\n \n
    \n
    \n \n {pgettext(\"register modal btn\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport class RegisterComplete extends React.Component {\n getLead() {\n if (this.props.activation === \"user\") {\n return pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\"\n )\n } else if (this.props.activation === \"admin\") {\n return pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but the site administrator will have to activate it before you will be able to sign in.\"\n )\n }\n }\n\n getSubscript() {\n if (this.props.activation === \"user\") {\n return pgettext(\n \"account activation required\",\n \"We have sent an e-mail to %(email)s with link that you have to click to activate your account.\"\n )\n } else if (this.props.activation === \"admin\") {\n return pgettext(\n \"account activation required\",\n \"We will send an e-mail to %(email)s when this takes place.\"\n )\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"register modal title\", \"Registration complete\")}\n

    \n
    \n
    \n
    \n info_outline\n
    \n
    \n

    \n {interpolate(\n this.getLead(),\n { username: this.props.username },\n true\n )}\n

    \n

    \n {interpolate(\n this.getSubscript(),\n { email: this.props.email },\n true\n )}\n

    \n \n {pgettext(\"register modal dismiss\", \"Ok\")}\n \n
    \n
    \n
    \n \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n completeRegistration = (apiResponse) => {\n if (apiResponse.activation === \"active\") {\n modal.hide()\n auth.signIn(apiResponse)\n } else {\n this.setState({\n complete: apiResponse,\n })\n }\n }\n\n render() {\n if (this.state.complete) {\n return (\n \n )\n }\n\n return \n }\n}\n","import RegisterButton from \"./RegisterButton\"\n\nexport default RegisterButton\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ajax from \"../../services/ajax\"\nimport captcha from \"../../services/captcha\"\nimport modal from \"../../services/modal\"\nimport snackbar from \"../../services/snackbar\"\nimport Loader from \"../loader\"\nimport RegisterForm from \"../register.js\"\n\nexport default class RegisterButton extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n isLoaded: false,\n\n criteria: null,\n }\n }\n\n showRegisterForm = () => {\n if (this.props.onClick) {\n this.props.onClick()\n }\n\n if (misago.get(\"SETTINGS\").account_activation === \"closed\") {\n snackbar.info(\n pgettext(\n \"register form\",\n \"Registration form is currently disabled by the site administrator.\"\n )\n )\n } else if (this.state.isLoaded) {\n modal.show()\n } else {\n this.setState({ isLoading: true })\n\n Promise.all([\n captcha.load(),\n ajax.get(misago.get(\"AUTH_CRITERIA_API\")),\n ]).then(\n (result) => {\n this.setState({\n isLoading: false,\n isLoaded: true,\n criteria: result[1],\n })\n\n modal.show()\n },\n () => {\n this.setState({ isLoading: false })\n\n snackbar.error(\n pgettext(\n \"register form\",\n \"Registration form is currently unavailable due to an error.\"\n )\n )\n }\n )\n }\n }\n\n render() {\n return (\n \n {pgettext(\"cta\", \"Register\")}\n {this.state.isLoading ? : null}\n \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst AGREEMENT_URL = '%(agreement)s'\n\nconst RegisterLegalFootnote = (props) => {\n const {\n errors,\n privacyPolicy,\n termsOfService,\n onPrivacyPolicyChange,\n onTermsOfServiceChange,\n } = props\n\n const termsOfServiceId = misago.get(\"TERMS_OF_SERVICE_ID\")\n const termsOfServiceUrl = misago.get(\"TERMS_OF_SERVICE_URL\")\n\n const privacyPolicyId = misago.get(\"PRIVACY_POLICY_ID\")\n const privacyPolicyUrl = misago.get(\"PRIVACY_POLICY_URL\")\n\n if (!termsOfServiceId && !privacyPolicyId) return null\n\n return (\n
    \n \n \n
    \n )\n}\n\nconst LegalAgreement = (props) => {\n const { agreement, checked, errors, url, value, onChange } = props\n\n if (!url) return null\n\n const agreementHtml = interpolate(\n AGREEMENT_URL,\n { agreement: escapeHtml(agreement), url: escapeHtml(url) },\n true\n )\n const label = interpolate(\n pgettext(\n \"register form agreement prompt\",\n \"I have read and accept %(agreement)s.\"\n ),\n { agreement: agreementHtml },\n true\n )\n\n return (\n
    \n \n {errors &&\n errors.map((error, i) => (\n
    \n {error}\n
    \n ))}\n
    \n )\n}\n\nexport default RegisterLegalFootnote\n","import React from \"react\"\nimport { ListGroup } from \"../ListGroup\"\n\nexport default function SearchResultsList({ children }) {\n return {children}\n}\n","import React from \"react\"\nimport { ListGroupMessage } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchMessage() {\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport Timestamp from \"../Timestamp\"\n\nexport default function SearchResultPost({ post }) {\n return (\n \n \n
    \n
    {post.thread.title}
    \n \n
      \n
    • \n {post.category.name}\n
    • \n
    • {post.poster ? post.poster.username : post.poster_name}
    • \n
    • \n \n
    • \n
    \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"../avatar\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport Timestamp from \"../Timestamp\"\n\nexport default function SearchResultUser({ user }) {\n const title = user.title || user.rank.title\n\n return (\n \n \n \n
    \n
    {user.username}
    \n
      \n {!!title && (\n
    • \n {title}\n
    • \n )}\n
    • {user.rank.name}
    • \n
    • \n \n
    • \n
    \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\nimport SearchResultPost from \"./SearchResultPost\"\nimport SearchResultUser from \"./SearchResultUser\"\n\nexport default function SearchResults({ query, results }) {\n const threads = results[0]\n const users = results[1]\n\n const { count } = threads.results\n\n return (\n \n {users.results.results.map((user) => (\n \n ))}\n {threads.results.results.map((post) => (\n \n ))}\n {count > 0 && (\n \n \n {npgettext(\n \"search results list\",\n \"See all %(count)s result.\",\n \"See all %(count)s results.\",\n threads.results.count\n ).replace(\"%(count)s\", threads.results.count)}\n \n \n )}\n \n )\n}\n","import React from \"react\"\nimport { ListGroupEmpty } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchResultsEmpty() {\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport { ListGroupError } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchResultsError({ error }) {\n return (\n \n \n \n )\n}\n\nfunction errorDetail(error) {\n if (error.status === 0) {\n return gettext(\n \"Check your internet connection and try refreshing the site.\"\n )\n }\n\n if (error.data && error.data.detail) {\n return error.data.detail\n }\n}\n","import React from \"react\"\nimport { ListGroupLoading } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchResultsLoading() {\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport { ApiFetch } from \"../Api\"\nimport SearchMessage from \"./SearchMessage\"\nimport SearchResults from \"./SearchResults\"\nimport SearchResultsEmpty from \"./SearchResultsEmpty\"\nimport SearchResultsError from \"./SearchResultsError\"\nimport SearchResultsLoading from \"./SearchResultsLoading\"\n\nconst DEBOUNCE = 750\nconst CACHE = {}\n\nexport default class SearchFetch extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n query: this.props.query.trim(),\n }\n\n this.debounce = null\n }\n\n componentDidUpdate() {\n const query = this.props.query.trim()\n\n if (this.state.query != query) {\n if (this.debounce) {\n window.clearTimeout(this.debounce)\n }\n\n this.debounce = window.setTimeout(() => {\n this.setState({ query })\n }, DEBOUNCE)\n }\n }\n\n componentWillUnmount() {\n if (this.debounce) {\n window.clearTimeout(this.debounce)\n }\n }\n\n render() {\n return (\n \n {({ data, loading, error }) => {\n if (this.state.query.length < 3) {\n return \n }\n\n if (loading) {\n return \n }\n\n if (error) {\n return \n }\n\n if (isResultEmpty(data)) {\n return \n }\n\n if (data !== null) {\n return \n }\n\n return null\n }}\n \n )\n }\n}\n\nfunction getSearchUrl(query) {\n return misago.get(\"SEARCH_API\") + \"?q=\" + encodeURIComponent(query)\n}\n\nfunction isResultEmpty(results) {\n if (results === null) {\n return true\n }\n\n let resultsCount = 0\n results.forEach((result) => {\n resultsCount += result.results.count\n })\n return resultsCount === 0\n}\n","import React from \"react\"\n\nexport default function SearchInput({ query, setQuery }) {\n return (\n
    \n setQuery(event.target.value)}\n />\n
    \n )\n}\n","import React from \"react\"\n\nexport default class SearchQuery extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n query: \"\",\n }\n }\n\n setQuery = (query) => {\n this.setState({ query })\n }\n\n render() {\n return this.props.children({\n query: this.state.query,\n setQuery: this.setQuery,\n })\n }\n}\n","import React from \"react\"\nimport SearchFetch from \"./SearchFetch\"\nimport SearchInput from \"./SearchInput\"\nimport SearchQuery from \"./SearchQuery\"\n\nexport default function SearchDropdown() {\n return (\n \n {({ query, setQuery }) => {\n return (\n
    \n \n \n
    \n )\n }}\n
    \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\nimport SearchFetch from \"./SearchFetch\"\nimport SearchInput from \"./SearchInput\"\nimport SearchQuery from \"./SearchQuery\"\n\nfunction SearchOverlay({ open }) {\n return (\n {\n window.setTimeout(() => {\n document.querySelector(\"#search-mount .form-control-search\").focus()\n }, 0)\n }}\n >\n {pgettext(\"cta\", \"Search\")}\n \n {({ query, setQuery }) => {\n return (\n
    \n \n
    \n \n
    \n
    \n )\n }}\n
    \n \n )\n}\n\nfunction select(state) {\n return { open: state.overlay.search }\n}\n\nconst SearchOverlayConnected = connect(select)(SearchOverlay)\n\nexport default SearchOverlayConnected\n","import SignInButton from \"./SignInButton\"\n\nexport default SignInButton\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport modal from \"../../services/modal\"\nimport SignInModal from \"../sign-in\"\n\nexport default function SignInButton({ block, className, onClick }) {\n const settings = misago.get(\"SETTINGS\")\n\n if (settings.DELEGATE_AUTH) {\n return (\n {\n if (onClick) {\n onClick()\n }\n }}\n >\n {pgettext(\"cta\", \"Sign in\")}\n \n )\n }\n\n return (\n {\n event.preventDefault()\n\n if (onClick) {\n onClick()\n }\n\n modal.show()\n }}\n >\n {pgettext(\"cta\", \"Sign in\")}\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport {\n DropdownDivider,\n DropdownHeader,\n DropdownMenuItem,\n DropdownPills,\n DropdownSubheader,\n} from \"../Dropdown\"\nimport RegisterButton from \"../RegisterButton\"\nimport SignInButton from \"../SignInButton\"\n\nfunction SiteNavMenu({ isAnonymous, close, dropdown, overlay }) {\n const baseUrl = misago.get(\"MISAGO_PATH\")\n const settings = misago.get(\"SETTINGS\")\n const mainItems = misago.get(\"main_menu\")\n const extraItems = misago.get(\"extraMenuItems\")\n const extraFooterItems = misago.get(\"extraFooterItems\")\n const categories = misago.get(\"categories_menu\")\n const users = misago.get(\"usersLists\")\n const authDelegated = settings.enable_oauth2_client\n\n const topNav = []\n mainItems.forEach((item) => {\n topNav.push({ title: item.label, url: item.url })\n })\n\n topNav.push({\n title: pgettext(\"site nav\", \"Search\"),\n url: baseUrl + \"search/\",\n })\n\n const footerNav = []\n\n const tosTitle = misago.get(\"TERMS_OF_SERVICE_TITLE\")\n const tosUrl = misago.get(\"TERMS_OF_SERVICE_URL\")\n if (tosTitle && tosUrl) {\n footerNav.push({\n title: tosTitle,\n url: tosUrl,\n })\n }\n\n const privacyTitle = misago.get(\"PRIVACY_POLICY_TITLE\")\n const privacyUrl = misago.get(\"PRIVACY_POLICY_URL\")\n if (privacyTitle && privacyUrl) {\n footerNav.push({\n title: privacyTitle,\n url: privacyUrl,\n })\n }\n\n return (\n \n {isAnonymous && (\n \n {pgettext(\"cta\", \"You are not signed in\")}\n \n )}\n {isAnonymous && (\n \n \n {!authDelegated && }\n \n )}\n {settings.forum_name}\n {topNav.map((item) => (\n \n {item.title}\n \n ))}\n {extraItems.map((item, index) => (\n \n \n {item.title}\n \n \n ))}\n {!!users.length && }\n {!!users.length && (\n \n {pgettext(\"site nav section\", \"Users\")}\n \n )}\n {users.map((item) => (\n \n {item.name}\n \n ))}\n \n \n {pgettext(\"site nav section\", \"Categories\")}\n \n {categories.map((category) =>\n category.is_vanilla ? (\n \n {category.name}\n \n ) : (\n \n \n {category.name}\n \n {category.short_name || category.name}\n \n \n \n )\n )}\n {(!!footerNav.length || !!extraFooterItems.length) && (\n \n )}\n {(!!footerNav.length || !!extraFooterItems.length) && (\n \n {pgettext(\"site nav section\", \"Footer\")}\n \n )}\n {extraFooterItems.map((item, index) => (\n \n \n {item.title}\n \n \n ))}\n {footerNav.map((item) => (\n \n {item.title}\n \n ))}\n \n )\n}\n\nfunction select(state) {\n return {\n isAnonymous: !state.auth.user.id,\n }\n}\n\nconst SiteNavMenuConnected = connect(select)(SiteNavMenu)\n\nexport default SiteNavMenuConnected\n","import React from \"react\"\nimport SiteNavMenu from \"./SiteNavMenu\"\n\nexport default function SiteNavDropdown({ close }) {\n return \n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\nimport SiteNavMenu from \"./SiteNavMenu\"\n\nexport function SiteNavOverlay({ dispatch, isOpen }) {\n return (\n \n {pgettext(\"site nav title\", \"Menu\")}\n dispatch(close())} overlay />\n \n )\n}\n\nfunction select(state) {\n return {\n isOpen: state.overlay.siteNav,\n }\n}\n\nconst SiteNavOverlayConnected = connect(select)(SiteNavOverlay)\n\nexport default SiteNavOverlayConnected\n","import React from \"react\"\nimport misago from \"misago\"\n\nconst StartSocialAuth = (props) => {\n const { buttonClassName, buttonLabel, formLabel, header, labelClassName } =\n props\n const socialAuth = misago.get(\"SOCIAL_AUTH\")\n\n if (socialAuth.length === 0) return null\n\n return (\n
    \n \n
    \n {socialAuth.map(({ pk, name, button_text, button_color, url }) => {\n const className = \"btn btn-block btn-default btn-social-\" + pk\n const style = button_color ? { color: button_color } : null\n const finalButtonLabel =\n button_text || interpolate(buttonLabel, { site: name }, true)\n\n return (\n \n )\n })}\n
    \n
    \n \n
    \n )\n}\n\nconst FormHeader = ({ className, text }) => {\n if (!text) return null\n return
    {text}
    \n}\n\nexport default StartSocialAuth\n","import React from \"react\"\nimport {\n dateRelative,\n dateRelativeShort,\n fullDateTime,\n} from \"../../formats\"\n\nclass Timestamp extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = { tick: 0 }\n this.date = new Date(props.datetime)\n this.timeout = null\n }\n\n componentDidMount() {\n this.scheduleNextUpdate()\n }\n\n componentWillUnmount() {\n if (this.timeout) {\n window.clearTimeout(this.timeout)\n }\n }\n\n scheduleNextUpdate = () => {\n const now = new Date()\n const diff = Math.ceil(Math.abs(Math.round((this.date - now) / 1000)))\n\n if (diff < 3600) {\n this.timeout = window.setTimeout(\n () => {\n this.setState(tick)\n this.scheduleNextUpdate()\n },\n 50 * 1000 // Update every 50 seconds\n )\n } else if (diff < 3600 * 24) {\n this.timeout = window.setTimeout(\n () => {\n this.setState(tick)\n },\n 40 * 60 * 1000 // Update every 40 minutes\n )\n }\n }\n\n render() {\n const displayed = this.props.narrow\n ? dateRelativeShort(this.date)\n : dateRelative(this.date)\n\n return (\n \n {displayed}\n \n )\n }\n}\n\nfunction tick(state) {\n return { tick: state.tick + 1 }\n}\n\nexport default Timestamp\n","import Timestamp from \"./Timestamp\"\n\nexport default Timestamp\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst Toolbar = ({ children, className }) => (\n \n)\n\nexport default Toolbar\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarItem = ({ children, className, shrink }) => (\n \n {children}\n \n)\n\nexport default ToolbarItem\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarSection = ({ auto, children, className }) => (\n \n {children}\n \n)\n\nexport default ToolbarSection\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarSpacer = ({ className }) => (\n
    \n)\n\nexport default ToolbarSpacer\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport Loader from \"misago/components/loader\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n callApi(avatarType) {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: avatarType,\n })\n .then(\n (response) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.success(response.detail)\n this.props.onComplete(response)\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n setGravatar = () => {\n this.callApi(\"gravatar\")\n }\n\n setGenerated = () => {\n this.callApi(\"generated\")\n }\n\n getGravatarButton() {\n if (this.props.options.gravatar) {\n return (\n \n {pgettext(\"avatar modal btn\", \"Download my Gravatar\")}\n \n )\n } else {\n return null\n }\n }\n\n getCropButton() {\n if (!this.props.options.crop_src) return null\n\n return (\n \n {pgettext(\"avatar modal btn\", \"Re-crop uploaded image\")}\n \n )\n }\n\n getUploadButton() {\n if (!this.props.options.upload) return null\n\n return (\n \n {pgettext(\"avatar modal btn\", \"Upload new image\")}\n \n )\n }\n\n getGalleryButton() {\n if (!this.props.options.galleries) return null\n\n return (\n \n {pgettext(\"avatar modal btn\", \"Pick avatar from gallery\")}\n \n )\n }\n\n getAvatarPreview() {\n let userPeview = {\n id: this.props.user.id,\n avatars: this.props.options.avatars,\n }\n\n if (this.state.isLoading) {\n return (\n
    \n \n \n
    \n )\n }\n\n return (\n
    \n \n
    \n )\n }\n\n render() {\n return (\n
    \n
    \n
    {this.getAvatarPreview()}
    \n
    \n {this.getGravatarButton()}\n\n \n {pgettext(\"avatar modal btn\", \"Generate my individual avatar\")}\n \n\n {this.getCropButton()}\n {this.getUploadButton()}\n {this.getGalleryButton()}\n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n deviceRatio: 1,\n }\n }\n\n getAvatarSize() {\n if (this.props.upload) {\n return this.props.options.crop_tmp.size\n } else {\n return this.props.options.crop_src.size\n }\n }\n\n getImagePath() {\n if (this.props.upload) {\n return this.props.dataUrl\n } else {\n return this.props.options.crop_src.url\n }\n }\n\n componentDidMount() {\n let cropit = $(\".crop-form\")\n let cropperWidth = this.getAvatarSize()\n\n const initialWidth = cropit.width()\n while (initialWidth < cropperWidth) {\n cropperWidth = cropperWidth / 2\n }\n\n const deviceRatio = this.getAvatarSize() / cropperWidth\n\n cropit.width(cropperWidth)\n\n cropit.cropit({\n width: cropperWidth,\n height: cropperWidth,\n exportZoom: deviceRatio,\n imageState: {\n src: this.getImagePath(),\n },\n onImageLoaded: () => {\n if (this.props.upload) {\n // center uploaded image\n let zoomLevel = cropit.cropit(\"zoom\")\n let imageSize = cropit.cropit(\"imageSize\")\n\n // is it wider than taller?\n if (imageSize.width > imageSize.height) {\n let displayedWidth = imageSize.width * zoomLevel\n let offsetX = (displayedWidth - this.getAvatarSize()) / -2\n\n cropit.cropit(\"offset\", {\n x: offsetX,\n y: 0,\n })\n } else if (imageSize.width < imageSize.height) {\n let displayedHeight = imageSize.height * zoomLevel\n let offsetY = (displayedHeight - this.getAvatarSize()) / -2\n\n cropit.cropit(\"offset\", {\n x: 0,\n y: offsetY,\n })\n } else {\n cropit.cropit(\"offset\", {\n x: 0,\n y: 0,\n })\n }\n } else {\n // use preserved crop\n let crop = this.props.options.crop_src.crop\n\n if (crop) {\n cropit.cropit(\"zoom\", crop.zoom)\n cropit.cropit(\"offset\", {\n x: crop.x,\n y: crop.y,\n })\n }\n }\n },\n })\n }\n\n componentWillUnmount() {\n $(\".crop-form\").cropit(\"disable\")\n }\n\n cropAvatar = () => {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n let avatarType = this.props.upload ? \"crop_tmp\" : \"crop_src\"\n let cropit = $(\".crop-form\")\n\n const deviceRatio = cropit.cropit(\"exportZoom\")\n const cropitOffset = cropit.cropit(\"offset\")\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: avatarType,\n crop: {\n offset: {\n x: cropitOffset.x * deviceRatio,\n y: cropitOffset.y * deviceRatio,\n },\n zoom: cropit.cropit(\"zoom\") * deviceRatio,\n },\n })\n .then(\n (data) => {\n this.props.onComplete(data)\n snackbar.success(data.detail)\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n {this.props.upload\n ? pgettext(\"avatar crop modal btn\", \"Set avatar\")\n : pgettext(\"avatar crop modal btn\", \"Crop image\")}\n \n\n \n {pgettext(\"avatar crop modal btn\", \"Cancel\")}\n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport AvatarCrop from \"misago/components/change-avatar/crop\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport fileSize from \"misago/utils/file-size\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n image: null,\n preview: null,\n progress: 0,\n uploaded: null,\n dataUrl: null,\n }\n }\n\n validateFile(image) {\n if (image.size > this.props.options.upload.limit) {\n return interpolate(\n pgettext(\n \"avatar upload modal\",\n \"Selected file is too big. (%(filesize)s)\"\n ),\n {\n filesize: fileSize(image.size),\n },\n true\n )\n }\n\n let invalidTypeMsg = pgettext(\n \"avatar upload modal\",\n \"Selected file type is not supported.\"\n )\n if (\n this.props.options.upload.allowed_mime_types.indexOf(image.type) === -1\n ) {\n return invalidTypeMsg\n }\n\n let extensionFound = false\n let loweredFilename = image.name.toLowerCase()\n this.props.options.upload.allowed_extensions.map(function (extension) {\n if (loweredFilename.substr(extension.length * -1) === extension) {\n extensionFound = true\n }\n })\n\n if (!extensionFound) {\n return invalidTypeMsg\n }\n\n return false\n }\n\n pickFile = () => {\n document.getElementById(\"avatar-hidden-upload\").click()\n }\n\n uploadFile = () => {\n let image = document.getElementById(\"avatar-hidden-upload\").files[0]\n if (!image) return\n\n let validationError = this.validateFile(image)\n if (validationError) {\n snackbar.error(validationError)\n return\n }\n\n this.setState({\n image,\n preview: URL.createObjectURL(image),\n progress: 0,\n })\n\n let data = new FormData()\n data.append(\"avatar\", \"upload\")\n data.append(\"image\", image)\n\n ajax\n .upload(this.props.user.api.avatar, data, (progress) => {\n this.setState({\n progress,\n })\n })\n .then(\n (data) => {\n this.setState({\n options: data,\n uploaded: data.detail,\n })\n\n snackbar.info(\n pgettext(\n \"avatar upload modal\",\n \"Your image has been uploaded and you may now crop it.\"\n )\n )\n },\n (rejection) => {\n if (rejection.status === 400 || rejection.status === 413) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n image: null,\n progress: 0,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n getUploadRequirements(options) {\n let extensions = options.allowed_extensions.map(function (extension) {\n return extension.substr(1)\n })\n\n return interpolate(\n pgettext(\"avatar upload modal\", \"%(files)s files smaller than %(limit)s\"),\n {\n files: extensions.join(\", \"),\n limit: fileSize(options.limit),\n },\n true\n )\n }\n\n getUploadButton() {\n return (\n
    \n \n

    \n {this.getUploadRequirements(this.props.options.upload)}\n

    \n
    \n )\n }\n\n getUploadProgressLabel() {\n return interpolate(\n pgettext(\"avatar upload modal field\", \"%(progress)s % complete\"),\n {\n progress: this.state.progress,\n },\n true\n )\n }\n\n getUploadProgress() {\n return (\n
    \n
    \n \n\n
    \n \n {this.getUploadProgressLabel()}\n
    \n
    \n
    \n
    \n )\n }\n\n renderUpload() {\n return (\n
    \n \n {this.state.image ? this.getUploadProgress() : this.getUploadButton()}\n
    \n
    \n \n {pgettext(\"avatar upload modal btn\", \"Cancel\")}\n \n
    \n
    \n
    \n )\n }\n\n renderCrop() {\n return (\n \n )\n }\n\n render() {\n if (this.state.uploaded) return this.renderCrop()\n\n return this.renderUpload()\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport batch from \"misago/utils/batch\"\n\nexport class GalleryItem extends React.Component {\n select = () => {\n this.props.select(this.props.id)\n }\n\n getClassName() {\n if (this.props.selection === this.props.id) {\n if (this.props.disabled) {\n return \"btn btn-avatar btn-disabled avatar-selected\"\n } else {\n return \"btn btn-avatar avatar-selected\"\n }\n } else if (this.props.disabled) {\n return \"btn btn-avatar btn-disabled\"\n } else {\n return \"btn btn-avatar\"\n }\n }\n\n render() {\n return (\n \n \n \n )\n }\n}\n\nexport class Gallery extends React.Component {\n render() {\n return (\n
    \n

    {this.props.name}

    \n\n
    \n {batch(this.props.images, 4, null).map((row, i) => {\n return (\n
    \n {row.map((item, i) => {\n return (\n
    \n {item ? (\n \n ) : (\n
    \n )}\n
    \n )\n })}\n
    \n )\n })}\n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n selection: null,\n isLoading: false,\n }\n }\n\n select = (image) => {\n this.setState({\n selection: image,\n })\n }\n\n save = () => {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: \"galleries\",\n image: this.state.selection,\n })\n .then(\n (response) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.success(response.detail)\n this.props.onComplete(response)\n this.props.showIndex()\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n {this.props.options.galleries.map((item, i) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n \n {this.state.selection\n ? pgettext(\"avatar gallery modal btn\", \"Save choice\")\n : pgettext(\"avatar gallery modal btn\", \"Select avatar\")}\n \n\n \n {pgettext(\"avatar gallery modal btn\", \"Cancel\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport AvatarIndex from \"misago/components/change-avatar/index\"\nimport AvatarCrop from \"misago/components/change-avatar/crop\"\nimport AvatarUpload from \"misago/components/change-avatar/upload\"\nimport AvatarGallery from \"misago/components/change-avatar/gallery\"\nimport Loader from \"misago/components/modal-loader\"\nimport { updateAvatar } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport store from \"misago/services/store\"\n\nexport class ChangeAvatarError extends React.Component {\n getErrorReason() {\n if (this.props.reason) {\n return

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n

    \n
    \n remove_circle_outline\n
    \n
    \n

    {this.props.message}

    \n {this.getErrorReason()}\n \n {pgettext(\"avatar modal dismiss\", \"Ok\")}\n \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n componentDidMount() {\n ajax.get(this.props.user.api.avatar).then(\n (options) => {\n this.setState({\n component: AvatarIndex,\n options: options,\n error: null,\n })\n },\n (rejection) => {\n this.showError(rejection)\n }\n )\n }\n\n showError = (error) => {\n this.setState({\n error,\n })\n }\n\n showIndex = () => {\n this.setState({\n component: AvatarIndex,\n })\n }\n\n showUpload = () => {\n this.setState({\n component: AvatarUpload,\n })\n }\n\n showCrop = () => {\n this.setState({\n component: AvatarCrop,\n })\n }\n\n showGallery = () => {\n this.setState({\n component: AvatarGallery,\n })\n }\n\n completeFlow = (options) => {\n store.dispatch(updateAvatar(this.props.user, options.avatars))\n\n this.setState({\n component: AvatarIndex,\n options,\n })\n }\n\n getBody() {\n if (this.state) {\n if (this.state.error) {\n return (\n \n )\n } else {\n return (\n \n )\n }\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state && this.state.error) {\n return \"modal-dialog modal-message modal-change-avatar\"\n } else {\n return \"modal-dialog modal-change-avatar\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"avatar modal title\", \"Change your avatar\")}\n

    \n
    \n\n {this.getBody()}\n
    \n
    \n )\n }\n}\n\nexport function select(state) {\n return {\n user: state.auth.user,\n }\n}\n","export default function logout() {\n document.getElementById(\"hidden-logout-form\").submit()\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport modal from \"../../services/modal\"\nimport ChangeAvatarModal, {\n select as selectAvatar,\n} from \"../change-avatar/root\"\nimport {\n DropdownDivider,\n DropdownFooter,\n DropdownMenuItem,\n DropdownSubheader,\n} from \"../Dropdown\"\nimport logout from \"./logout\"\n\nclass UserNavMenu extends React.Component {\n constructor(props) {\n super(props)\n\n if (props.dropdown) {\n // Collapse options on dropdown\n this.state = {\n options: props.options.slice(0, 2),\n optionsMore: props.options.length > 2,\n }\n } else {\n // Reveal all options on mobile overlay\n this.state = {\n options: props.options,\n optionsMore: false,\n }\n }\n }\n\n changeAvatar = () => {\n this.props.close()\n modal.show(connect(selectAvatar)(ChangeAvatarModal))\n }\n\n revealOptions = () => {\n this.setState({\n options: this.props.options,\n optionsMore: false,\n })\n }\n\n render() {\n const { user, close, dropdown, overlay } = this.props\n\n if (!user) {\n return null\n }\n\n const adminUrl = misago.get(\"ADMIN_URL\")\n\n return (\n \n
  • \n \n {user.username}\n {pgettext(\"user nav\", \"Go to your profile\")}\n \n
  • \n \n \n \n \n {user.unreadNotifications\n ? \"notifications_active\"\n : \"notifications_none\"}\n \n {pgettext(\"user nav\", \"Notifications\")}\n {!!user.unreadNotifications && (\n {user.unreadNotifications}\n )}\n \n \n {!!user.showPrivateThreads && (\n \n \n inbox\n {pgettext(\"user nav\", \"Private threads\")}\n {!!user.unreadPrivateThreads && (\n {user.unreadPrivateThreads}\n )}\n \n \n )}\n {!!adminUrl && (\n \n \n security\n {pgettext(\"user nav\", \"Admin control panel\")}\n \n \n )}\n \n \n {pgettext(\"user nav section\", \"Account settings\")}\n \n \n \n portrait\n {pgettext(\"user nav\", \"Change avatar\")}\n \n \n {this.state.options.map((item) => (\n \n \n {item.icon}\n {item.name}\n \n \n ))}\n \n \n more_vertical\n {pgettext(\"user nav\", \"See more\")}\n \n \n {!!dropdown && (\n \n {\n logout()\n close()\n }}\n type=\"button\"\n >\n {pgettext(\"user nav\", \"Log out\")}\n \n \n )}\n \n )\n }\n}\n\nfunction select(state) {\n const user = state.auth.user\n if (!user.id) {\n return { user: null }\n }\n\n return {\n user: {\n username: user.username,\n unreadNotifications: user.unreadNotifications,\n unreadPrivateThreads: user.unread_private_threads,\n showPrivateThreads: user.acl.can_use_private_threads,\n url: user.url,\n },\n options: [...misago.get(\"userOptions\")],\n }\n}\n\nconst UserNavMenuConnected = connect(select)(UserNavMenu)\n\nexport default UserNavMenuConnected\n","import React from \"react\"\nimport UserNavMenu from \"./UserNavMenu\"\n\nexport default function UserNavDropdown({ close }) {\n return \n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\nimport { DropdownFooter } from \"../Dropdown\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\nimport UserNavMenu from \"./UserNavMenu\"\nimport logout from \"./logout\"\n\nexport function UserNavOverlay({ dispatch, isOpen }) {\n return (\n \n \n {pgettext(\"user nav title\", \"Your options\")}\n \n dispatch(close())} overlay />\n \n {\n logout()\n dispatch(close())\n }}\n type=\"button\"\n >\n {pgettext(\"user nav\", \"Log out\")}\n \n \n \n )\n}\n\nfunction select(state) {\n return {\n isOpen: state.overlay.userNav,\n }\n}\n\nconst UserNavOverlayConnected = connect(select)(UserNavOverlay)\n\nexport default UserNavOverlayConnected\n","import React from \"react\"\nimport misago from \"misago\"\n\nexport default function (props) {\n const size = props.size || 100\n const size2x = props.size2x || size * 2\n\n return (\n \n )\n}\n\nexport function getSrc(user, size) {\n if (user && user.id) {\n // just avatar hash, size and user id\n return resolveAvatarForSize(user.avatars, size).url\n } else {\n // just append avatar size to file to produce no-avatar placeholder\n return misago.get(\"BLANK_AVATAR_URL\")\n }\n}\n\nexport function resolveAvatarForSize(avatars, size) {\n let avatar = avatars[0]\n avatars.forEach((av) => {\n if (av.size >= size) {\n avatar = av\n }\n })\n return avatar\n}\n","import React from \"react\"\nimport Loader from \"./loader\"\n\nexport default class Button extends React.Component {\n render() {\n let className = \"btn \" + this.props.className\n let disabled = this.props.disabled\n\n if (this.props.loading) {\n className += \" btn-loading\"\n disabled = true\n }\n\n return (\n \n {this.props.children}\n {this.props.loading ? : null}\n \n )\n }\n}\n\nButton.defaultProps = {\n className: \"btn-default\",\n\n type: \"submit\",\n\n loading: false,\n disabled: false,\n\n onClick: null,\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n \n {props.choices.map((item) => {\n return (\n \n {\"- - \".repeat(item.level) + item.label}\n \n )\n })}\n \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n isValidated() {\n return typeof this.props.validation !== \"undefined\"\n }\n\n getClassName() {\n let className = \"form-group\"\n if (this.isValidated()) {\n className += \" has-feedback\"\n if (this.props.validation === null) {\n className += \" has-success\"\n } else {\n className += \" has-error\"\n }\n }\n return className\n }\n\n getFeedback() {\n if (this.props.validation) {\n return (\n
    \n {this.props.validation.map((error, i) => {\n return

    {error}

    \n })}\n
    \n )\n } else {\n return null\n }\n }\n\n getFeedbackDescription() {\n if (this.isValidated()) {\n return (\n \n {this.props.validation\n ? pgettext(\"field validation status\", \"(error)\")\n : pgettext(\"field validation status\", \"(success)\")}\n \n )\n } else {\n return null\n }\n }\n\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n \n {this.props.label + \":\"}\n \n
    \n {this.props.children}\n {this.getFeedbackDescription()}\n {this.getFeedback()}\n {this.getHelpText()}\n {this.props.extra || null}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { required } from \"../utils/validators\"\nimport snackbar from \"../services/snackbar\"\n\nlet validateRequired = required()\n\nexport default class extends React.Component {\n validate() {\n let errors = {}\n if (!this.state.validators) {\n return errors\n }\n\n let validators = {\n required: this.state.validators.required || this.state.validators,\n optional: this.state.validators.optional || {},\n }\n\n let validatedFields = []\n\n // add required fields to validation\n for (let name in validators.required) {\n if (\n validators.required.hasOwnProperty(name) &&\n validators.required[name]\n ) {\n validatedFields.push(name)\n }\n }\n\n // add optional fields to validation\n for (let name in validators.optional) {\n if (\n validators.optional.hasOwnProperty(name) &&\n validators.optional[name]\n ) {\n validatedFields.push(name)\n }\n }\n\n // validate fields values\n for (let i in validatedFields) {\n let name = validatedFields[i]\n let fieldErrors = this.validateField(name, this.state[name])\n\n if (fieldErrors === null) {\n errors[name] = null\n } else if (fieldErrors) {\n errors[name] = fieldErrors\n }\n }\n\n return errors\n }\n\n isValid() {\n let errors = this.validate()\n for (let field in errors) {\n if (errors.hasOwnProperty(field)) {\n if (errors[field] !== null) {\n return false\n }\n }\n }\n\n return true\n }\n\n validateField(name, value) {\n let errors = []\n if (!this.state.validators) {\n return errors\n }\n\n let validators = {\n required: (this.state.validators.required || this.state.validators)[name],\n optional: (this.state.validators.optional || {})[name],\n }\n\n let requiredError = validateRequired(value) || false\n\n if (validators.required) {\n if (requiredError) {\n errors = [requiredError]\n } else {\n for (let i in validators.required) {\n let validationError = validators.required[i](value)\n if (validationError) {\n errors.push(validationError)\n }\n }\n }\n\n return errors.length ? errors : null\n } else if (requiredError === false && validators.optional) {\n for (let i in validators.optional) {\n let validationError = validators.optional[i](value)\n if (validationError) {\n errors.push(validationError)\n }\n }\n\n return errors.length ? errors : null\n }\n\n return false // false === field wasn't validated\n }\n\n bindInput = (name) => {\n return (event) => {\n this.changeValue(name, event.target.value)\n }\n }\n\n changeValue = (name, value) => {\n let newState = {\n [name]: value,\n }\n\n const formErrors = this.state.errors || {}\n formErrors[name] = this.validateField(name, newState[name])\n newState.errors = formErrors\n\n this.setState(newState)\n }\n\n clean() {\n return true\n }\n\n send() {\n return null\n }\n\n handleSuccess(success) {\n return\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n }\n\n handleSubmit = (event) => {\n // we don't reload page on submissions\n if (event) {\n event.preventDefault()\n }\n\n if (this.state.isLoading) {\n return\n }\n\n if (this.clean()) {\n this.setState({ isLoading: true })\n let promise = this.send()\n\n if (promise) {\n promise.then(\n (success) => {\n this.setState({ isLoading: false })\n this.handleSuccess(success)\n },\n (rejection) => {\n this.setState({ isLoading: false })\n this.handleError(rejection)\n }\n )\n } else {\n this.setState({ isLoading: false })\n }\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n isActive() {\n if (this.props.isControlled) {\n return this.props.isActive\n } else {\n if (this.props.path) {\n return document.location.pathname.indexOf(this.props.path) === 0\n } else {\n return false\n }\n }\n }\n\n getClassName() {\n if (this.isActive()) {\n return (\n (this.props.className || \"\") +\n \" \" +\n (this.props.activeClassName || \"active\")\n )\n } else {\n return this.props.className || \"\"\n }\n }\n\n render() {\n return
  • {this.props.children}
  • \n }\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n
    \n
    \n )\n}\n","const ytRegExp = new RegExp(\n \"^.*(?:(?:youtu.be/|v/|vi/|u/w/|embed/)|(?:(?:watch)??v(?:i)?=|&v(?:i)?=))([^#&?]*).*\"\n)\n\nexport class OneBox {\n constructor() {\n this._youtube = {}\n }\n\n render = (element) => {\n if (!element) return\n this.highlightCode(element)\n this.embedYoutubePlayers(element)\n }\n\n highlightCode(element) {\n import(\"highlight\").then(({ default: hljs }) => {\n const codeblocks = element.querySelectorAll(\"pre>code\")\n for (let i = 0; i < codeblocks.length; i++) {\n hljs.highlightElement(codeblocks[i])\n }\n })\n }\n\n embedYoutubePlayers(element) {\n const anchors = element.querySelectorAll(\"p>a\")\n for (let i = 0; i < anchors.length; i++) {\n const a = anchors[i]\n const p = a.parentNode\n const onlyChild = p.childNodes.length === 1\n\n if (!this._youtube[a.href]) {\n this._youtube[a.href] = parseYoutubeUrl(a.href)\n }\n\n const youtubeMovie = this._youtube[a.href]\n if (onlyChild && !!youtubeMovie && youtubeMovie.data !== false) {\n this.swapYoutubePlayer(a, youtubeMovie)\n }\n }\n }\n\n swapYoutubePlayer(element, youtube) {\n let url = \"https://www.youtube.com/embed/\"\n url += youtube.video\n url += \"?feature=oembed\"\n if (youtube.start) {\n url += \"&start=\" + youtube.start\n }\n\n const player = $(\n '\"\n )\n $(element).replaceWith(player)\n player.wrap('
    ')\n }\n}\n\nexport default new OneBox()\n\nexport function parseYoutubeUrl(url) {\n const cleanedUrl = cleanUrl(url)\n const video = getVideoIdFromUrl(cleanedUrl)\n\n if (!video) return null\n\n let start = 0\n if (cleanedUrl.indexOf(\"?\") > 0) {\n const query = cleanedUrl.substr(cleanedUrl.indexOf(\"?\") + 1)\n const timebit = query.split(\"&\").filter((i) => {\n return i.substr(0, 2) === \"t=\"\n })[0]\n\n if (timebit) {\n const bits = timebit.substr(2).split(\"m\")\n if (bits[0].substr(-1) === \"s\") {\n start += parseInt(bits[0].substr(0, bits[0].length - 1))\n } else {\n start += parseInt(bits[0]) * 60\n if (!!bits[1] && bits[1].substr(-1) === \"s\") {\n start += parseInt(bits[1].substr(0, bits[1].length - 1))\n }\n }\n }\n }\n\n return {\n start,\n video,\n }\n}\n\nexport function cleanUrl(url) {\n let clean = url\n\n if (url.substr(0, 8) === \"https://\") {\n clean = clean.substr(8)\n } else if (url.substr(0, 7) === \"http://\") {\n clean = clean.substr(7)\n }\n\n if (clean.substr(0, 4) === \"www.\") {\n clean = clean.substr(4)\n }\n\n return clean\n}\n\nexport function getVideoIdFromUrl(url) {\n if (url.indexOf(\"youtu\") === -1) return null\n\n const video = url.match(ytRegExp)\n if (video) {\n return video[1]\n }\n return null\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport onebox from \"misago/services/one-box\"\n\nexport default class extends React.Component {\n componentDidMount() {\n onebox.render(this.documentNode)\n $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n }\n\n componentDidUpdate(prevProps, prevState) {\n onebox.render(this.documentNode)\n $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n return nextProps.markup !== this.props.markup\n }\n\n render() {\n return (\n {\n this.documentNode = node\n }}\n />\n )\n }\n}\n\nfunction revealSpoiler(event) {\n var btn = event.target\n $(btn).parent().parent().addClass(\"revealed\")\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default class extends PanelMessage {\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n \n {this.props.icon || \"info_outline\"}\n \n
    \n
    \n

    {this.props.message}

    \n {this.getHelpText()}\n \n {pgettext(\"modal message dismiss btn\", \"Ok\")}\n \n
    \n
    \n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n \n {this.props.icon || \"info_outline\"}\n \n
    \n
    \n

    {this.props.message}

    \n {this.getHelpText()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\n\nexport default function (props) {\n if (props.post.content) {\n return \n } else {\n return \n }\n}\n\nexport function Default(props) {\n return (\n
    \n \n
    \n )\n}\n\nexport function Invalid(props) {\n return (\n
    \n

    \n {pgettext(\n \"post body invalid\",\n \"This post's contents cannot be displayed.\"\n )}\n

    \n

    \n {pgettext(\n \"post body invalid\",\n \"This error is caused by invalid post content manipulation.\"\n )}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n const { category, thread } = post\n\n const tooltip = interpolate(\n pgettext(\"posts feed item header\", \"posted %(posted_on)s\"),\n {\n posted_on: post.posted_on.format(\"LL, LT\"),\n },\n true\n )\n\n return (\n
    \n \n {thread.title}\n \n \n {category.name}\n \n \n {post.posted_on.fromNow()}\n \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n return (\n \n \n {pgettext(\"go to post link\", \"See post\")}\n \n chevron_right\n \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\n\nexport default function ({ post }) {\n return (\n
    \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n {post.poster_name}\n
    \n \n {pgettext(\"post removed poster username\", \"Removed user\")}\n \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title || rank.name\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n {userTitle}\n \n )\n }\n\n return {userTitle}\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ post, poster }) {\n return (\n
    \n \n
    \n
    \n \n \n \n
    \n \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Anonymous from \"./anonymous\"\nimport Registered from \"./registered\"\n\nexport default function ({ post, poster }) {\n if (poster && poster.id) {\n return \n }\n\n return \n}\n","import React from \"react\"\nimport Body from \"./body\"\nimport Header from \"./header\"\nimport PostSide from \"./post-side\"\n\nexport default function ({ post, poster }) {\n const user = poster || post.poster\n\n let className = \"post\"\n if (user && user.rank.css_class) {\n className += \" post-\" + user.rank.css_class\n }\n\n return (\n
  • \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
  • \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default function () {\n return (\n
      \n
    • \n
      \n
      \n
      \n
      \n
      \n
      \n \n \n \n
      \n
      \n
      \n \n \n  \n \n \n
      \n \n \n  \n \n \n
      \n
      \n
      \n
      \n \n  \n \n
      \n
      \n
      \n

      \n \n  \n \n  \n \n  \n \n  \n \n  \n \n

      \n
      \n
      \n
      \n
      \n
      \n
    • \n
    \n )\n}\n","import React from \"react\"\nimport Post from \"./post\"\nimport Preview from \"./preview\"\n\nexport default function ({ isReady, posts, poster }) {\n if (!isReady) {\n return \n }\n\n return (\n
      \n {posts.map((post) => {\n return \n })}\n
    \n )\n}\n","import React from \"react\"\nimport posting from \"../../services/posting\"\nimport { getGlobalState, getQuoteMarkup } from \"../posting\"\n\nexport default class PostingQuoteSelection extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n range: null,\n rect: null,\n }\n\n this.element = null\n }\n\n selected = () => {\n if (this.element) {\n const range = getQuoteSelection(this.element) || null\n const rect = range ? range.getBoundingClientRect() : null\n\n this.setState({ range, rect })\n }\n }\n\n reply = () => {\n if (!posting.isOpen()) {\n const content = getQuoteMarkup(this.state.range)\n posting.open(Object.assign({}, this.props.posting, { default: content }))\n\n this.setState({ range: null, rect: null })\n\n window.setTimeout(focusEditor, 1000)\n } else {\n const globalState = getGlobalState()\n if (globalState && !globalState.disabled) {\n globalState.quote(getQuoteMarkup(this.state.range))\n this.setState({ range: null, rect: null })\n focusEditor()\n }\n }\n }\n\n render = () => (\n
    \n {\n if (element) {\n this.element = element\n }\n }}\n onMouseUp={this.selected}\n onTouchEnd={this.selected}\n >\n {this.props.children}\n
    \n {!!this.state.rect && (\n \n
    \n
    \n \n {pgettext(\"post reply\", \"Quote\")}\n \n
    \n
    \n )}\n
    \n )\n}\n\nfunction focusEditor() {\n const textarea = document.querySelector(\"#posting-mount textarea\")\n textarea.focus()\n textarea.selectionStart = textarea.selectionEnd = textarea.value.length\n}\n\nconst getQuoteSelection = (container) => {\n if (typeof window.getSelection === \"undefined\") return\n\n // Validate that selection is of valid type and has one range\n const selection = window.getSelection()\n if (!selection) return\n if (selection.type !== \"Range\") return\n if (selection.rangeCount !== 1) return\n\n // Validate that selection is within the container and post's article\n const range = selection.getRangeAt(0)\n if (!isRangeContained(range, container)) return\n if (!isPostContained(range)) return\n if (!isAnyTextSelected(range.cloneContents())) return\n\n return range\n}\n\nconst isRangeContained = (range, container) => {\n const node = range.commonAncestorContainer\n if (node === container) return true\n\n let p = node.parentNode\n while (p) {\n if (p === container) return true\n p = p.parentNode\n }\n\n return false\n}\n\nconst isPostContained = (range) => {\n const element = range.commonAncestorContainer\n if (element.nodeName === \"ARTICLE\") return true\n if (element.dataset && element.dataset.noquote === \"1\") return false\n let p = element.parentNode\n while (p) {\n if (p.dataset && p.dataset.noquote === \"1\") return false\n if (p.nodeName === \"ARTICLE\") return true\n p = p.parentNode\n }\n return false\n}\n\nconst isAnyTextSelected = (node) => {\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i]\n if (child.nodeType === Node.TEXT_NODE) {\n if (child.textContent && child.textContent.trim().length > 0) return true\n }\n if (child.nodeName === \"IMG\") return true\n if (isAnyTextSelected(child)) return true\n }\n\n return false\n}\n","const getQuoteMarkup = (range) => {\n const metadata = getQuoteMetadata(range)\n let markup = convertNodesToMarkup(range.cloneContents().childNodes, [])\n let prefix = metadata ? `[quote=\"${metadata}\"]\\n` : \"[quote]\\n\"\n let suffix = \"\\n[/quote]\\n\\n\"\n\n const codeBlock = getQuoteCodeBlock(range)\n if (codeBlock) {\n prefix += codeBlock.syntax ? `[code=${codeBlock.syntax}]\\n` : \"[code]\\n\"\n suffix = \"\\n[/code]\" + suffix\n } else if (isNodeInlineCodeBlock(range)) {\n markup = markup.trim()\n prefix += \"`\"\n suffix = \"`\" + suffix\n } else {\n markup = markup.trim()\n }\n\n return prefix + markup + suffix\n}\n\nexport default getQuoteMarkup\n\nconst getQuoteMetadata = (range) => {\n const node = range.commonAncestorContainer\n if (isNodeElementWithQuoteMetadata(node)) {\n return getQuoteMetadataFromNode(node)\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeElementWithQuoteMetadata(p)) {\n return getQuoteMetadataFromNode(p)\n }\n p = p.parentNode\n }\n\n return \"\"\n}\n\nconst isNodeElementWithQuoteMetadata = (node) => {\n if (node.nodeType !== Node.ELEMENT_NODE) return false\n if (node.nodeName === \"ARTICLE\") return true\n if (node.nodeName === \"BLOCKQUOTE\") {\n return node.dataset && node.dataset.block === \"quote\"\n }\n\n return false\n}\n\nconst getQuoteMetadataFromNode = (element) => {\n if (element.dataset) {\n return element.dataset.author || null\n }\n return null\n}\n\nconst getQuoteCodeBlock = (range) => {\n const node = range.commonAncestorContainer\n if (isNodeCodeBlock(node)) {\n return getNodeCodeBlockMeta(node)\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeCodeBlock(p)) {\n return getNodeCodeBlockMeta(p)\n }\n p = p.parentNode\n }\n\n return null\n}\n\nconst isNodeCodeBlock = (node) => {\n return node.nodeName === \"PRE\"\n}\n\nconst isNodeInlineCodeBlock = (range) => {\n const node = range.commonAncestorContainer\n if (node.nodeName === \"CODE\") {\n return true\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeElementWithQuoteMetadata(p)) {\n return false\n }\n\n if (p.nodeName === \"CODE\") {\n return true\n }\n\n p = p.parentNode\n }\n\n return false\n}\n\nconst getNodeCodeBlockMeta = (node) => {\n if (!node.dataset) {\n return { syntax: null }\n }\n\n return { syntax: node.dataset.syntax || null }\n}\n\nconst convertNodesToMarkup = (nodes, stack) => {\n let markup = \"\"\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n markup += convertNodeToMarkup(node, stack)\n }\n return markup\n}\n\nconst SIMPLE_NODE_MAPPINGS = {\n H1: [\"\\n\\n# \", \"\"],\n H2: [\"\\n\\n## \", \"\"],\n H3: [\"\\n\\n### \", \"\"],\n H4: [\"\\n\\n#### \", \"\"],\n H5: [\"\\n\\n##### \", \"\"],\n H6: [\"\\n\\n###### \", \"\"],\n STRONG: [\"**\", \"**\"],\n EM: [\"*\", \"*\"],\n DEL: [\"~~\", \"~~\"],\n B: [\"[b]\", \"[/b]\"],\n U: [\"[u]\", \"[/u]\"],\n I: [\"[i]\", \"[/i]\"],\n SUB: [\"[sub]\", \"[/sub]\"],\n SUP: [\"[sup]\", \"[/sup]\"],\n}\n\nconst convertNodeToMarkup = (node, stack) => {\n const dataset = node.dataset || {}\n\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent || \"\"\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n if (dataset.quote) {\n return dataset.quote || \"\"\n }\n if (dataset.noquote === \"1\") return \"\"\n }\n\n if (\n node.nodeType === Node.ELEMENT_NODE &&\n dataset.quote &&\n dataset.quote.trim()\n ) {\n return \"\"\n }\n\n if (node.nodeName === \"HR\") {\n return \"\\n\\n- - -\"\n }\n\n if (SIMPLE_NODE_MAPPINGS[node.nodeName]) {\n const [prefix, suffix] = SIMPLE_NODE_MAPPINGS[node.nodeName]\n return (\n prefix +\n convertNodesToMarkup(node.childNodes, [...stack, node.nodeName]) +\n suffix\n )\n }\n\n if (node.nodeName === \"A\") {\n const href = node.href\n const text = convertNodesToMarkup(node.childNodes, [\n ...stack,\n node.nodeName,\n ])\n if (text) {\n return `[${text}](${href})`\n } else {\n return `!(${href})`\n }\n }\n\n if (node.nodeName === \"IMG\") {\n const src = node.src\n const alt = node.alt\n if (alt) {\n return `![${alt}](${src})`\n } else {\n return `!(${src})`\n }\n }\n\n if (node.nodeName === \"DIV\" || node.nodeName === \"ASIDE\") {\n const block = dataset.block && dataset.block.toUpperCase()\n if (block && SIMPLE_NODE_MAPPINGS[block]) {\n const [prefix, suffix] = SIMPLE_NODE_MAPPINGS[block]\n return (\n prefix +\n convertNodesToMarkup(node.childNodes, [...stack, block]) +\n suffix\n )\n } else {\n return convertNodesToMarkup(node.childNodes, stack)\n }\n }\n\n if (node.nodeName === \"BLOCKQUOTE\") {\n if (dataset.block === \"spoiler\") {\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n \"SPOILER\",\n ]).trim()\n\n if (!content) return \"\"\n\n let markup = \"\\n[spoiler]\\n\"\n markup += content\n markup += \"\\n[/spoiler]\"\n return markup\n }\n\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n \"QUOTE\",\n ]).trim()\n\n if (!content) return \"\"\n\n const metadata = getQuoteMetadataFromNode(node)\n let markup = metadata ? `\\n[quote=${metadata}]\\n` : \"\\n\\n[quote]\\n\"\n markup += content\n markup += \"\\n[/quote]\"\n return markup\n }\n\n if (node.nodeName === \"PRE\") {\n const syntax = dataset.syntax || null\n const code = node.querySelector(\"code\")\n const content = code ? code.innerText || \"\" : \"\"\n\n if (!content.trim()) return \"\"\n\n return \"\\n[code\" + (syntax ? \"=\" + syntax : \"\") + \"]\" + content + \"[/code]\"\n }\n\n if (node.nodeName === \"CODE\") {\n return \"`\" + node.innerText + \"`\"\n }\n\n if (node.nodeName === \"P\") {\n return (\n \"\\n\" + convertNodesToMarkup(node.childNodes, [...stack, node.nodeName])\n )\n }\n\n if (node.nodeName === \"UL\" || node.nodeName === \"OL\") {\n const level = stack.filter((item) => item === \"OL\" || item === \"UL\").length\n const prefix = level === 0 ? \"\\n\" : \"\"\n return (\n prefix + convertNodesToMarkup(node.childNodes, [...stack, node.nodeName])\n )\n }\n\n if (node.nodeName === \"LI\") {\n let prefix = \"\"\n const level = stack.filter((item) => item === \"OL\" || item === \"UL\").length\n for (let i = 1; i < level; i++) {\n prefix += \" \"\n }\n\n const ordered = stack[stack.length - 1] === \"OL\"\n if (ordered) {\n prefix += dataset.index ? dataset.index + \". \" : \"1. \"\n } else {\n prefix += \"- \"\n }\n\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n node.nodeName,\n ])\n if (!content.trim()) return \"\"\n\n return \"\\n\" + prefix + content\n }\n\n if (node.nodeName === \"SPAN\") {\n return convertNodesToMarkup(node.childNodes, stack)\n }\n\n return \"\"\n}\n","export function getGlobalState() {\n return window.misagoReply\n}\n\nexport function setGlobalState(disabled, quote) {\n window.misagoReply = { disabled, quote }\n}\n\nexport function clearGlobalState() {\n window.misagoReply = null\n}\n","import moment from \"moment\"\n\nexport function clean(attachments) {\n return attachments\n .filter((attachment) => {\n return attachment.id && !attachment.isRemoved\n })\n .map((a) => {\n return a.id\n })\n}\n\nexport function hydrate(attachments) {\n return attachments.map((attachment) => {\n return Object.assign({}, attachment, {\n uploaded_on: moment(attachment.uploaded_on),\n })\n })\n}\n","import React from \"react\"\nimport formatFilesize from \"../../utils/file-size\"\n\nexport default function MarkupAttachmentModal({ attachment }) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Attachment details\")}\n

    \n
    \n
    \n {!!attachment.is_image && (\n
    \n \n \"\"\n \n
    \n )}\n
    \n {attachment.filename}\n
    \n
    \n
    \n \n {attachment.filetype + \", \" + formatFilesize(attachment.size)}\n \n
    \n {pgettext(\"markup editor\", \"Type and size\")}\n
    \n
    \n
    \n \n \n {attachment.uploaded_on.fromNow()}\n \n \n
    \n {pgettext(\"markup editor\", \"Uploaded at\")}\n
    \n
    \n
    \n {attachment.url.uploader ? (\n \n {attachment.uploader_name}\n \n ) : (\n {attachment.uploader_name}\n )}\n
    \n {pgettext(\"markup editor\", \"Uploader\")}\n
    \n
    \n
    \n
    \n
    \n \n {pgettext(\"modal\", \"Close\")}\n \n
    \n
    \n
    \n )\n}\n","const wrapSelection = (selection, update, prefix, suffix, def) => {\n const text = selection.text || def || \"\"\n let newValue = selection.prefix\n newValue += prefix + text + suffix\n newValue += selection.suffix\n update(newValue)\n\n window.setTimeout(() => {\n focus(selection.textarea)\n\n const caret = selection.start + prefix.length\n selection.textarea.setSelectionRange(caret, caret + text.length)\n }, 250)\n}\n\nconst replaceSelection = (selection, update, text) => {\n let newValue = selection.prefix\n newValue += text\n newValue += selection.suffix\n update(newValue)\n\n window.setTimeout(() => {\n focus(selection.textarea)\n\n const caret = selection.end + text.length\n selection.textarea.setSelectionRange(caret, caret)\n }, 250)\n}\n\nconst getSelection = (textarea) => {\n if (document.selection) {\n textarea.focus()\n const range = document.selection.createRange()\n const length = range.text.length\n range.moveStart(\"character\", -textarea.value.length)\n return createRange(textarea, range.text.length - length, range.text.length)\n }\n\n if (textarea.selectionStart || textarea.selectionStart == \"0\") {\n return createRange(textarea, textarea.selectionStart, textarea.selectionEnd)\n }\n}\n\nconst createRange = (textarea, start, end) => {\n return {\n textarea: textarea,\n start: start,\n end: end,\n text: textarea.value.substring(start, end),\n prefix: textarea.value.substring(0, start),\n suffix: textarea.value.substring(end),\n }\n}\n\nexport function focus(textarea) {\n const scroll = textarea.scrollTop\n textarea.focus()\n textarea.scrollTop = scroll\n}\n\nexport { getSelection, replaceSelection, wrapSelection }\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport snackbar from \"../../services/snackbar\"\nimport formatFilesize from \"../../utils/file-size\"\nimport MarkupAttachmentModal from \"./MarkupAttachmentModal\"\nimport { getSelection, replaceSelection } from \"./operations\"\n\nconst MarkupEditorAttachment = ({\n attachment,\n disabled,\n element,\n setState,\n update,\n}) => (\n
    \n
    \n
    \n {attachment.id ? (\n {\n event.preventDefault()\n modal.show()\n }}\n >\n {attachment.filename}\n \n ) : (\n {attachment.filename}\n )}\n
    \n
      \n {!attachment.id &&
    • {attachment.progress + \"%\"}
    • }\n {!!attachment.filetype &&
    • {attachment.filetype}
    • }\n {attachment.size > 0 &&
    • {formatFilesize(attachment.size)}
    • }\n
    \n
    \n
    \n {!!attachment.id && (\n
    \n {\n const markup = getAttachmentMarkup(attachment)\n const selection = getSelection(element)\n replaceSelection(selection, update, markup)\n }}\n >\n flip_to_front\n \n {\n setState(({ attachments }) => {\n const confirm = window.confirm(\n pgettext(\"markup editor\", \"Remove this attachment?\")\n )\n\n if (confirm) {\n return {\n attachments: attachments.filter(\n ({ id }) => id !== attachment.id\n ),\n }\n }\n })\n }}\n >\n close\n \n
    \n )}\n {!attachment.id && !!attachment.key && (\n
    \n {attachment.error && (\n {\n snackbar.error(\n interpolate(\n pgettext(\"markup editor\", \"%(filename)s: %(error)s\"),\n { filename: attachment.filename, error: attachment.error },\n true\n )\n )\n }}\n >\n warning\n \n )}\n {\n setState(({ attachments }) => {\n return {\n attachments: attachments.filter(\n ({ key }) => key !== attachment.key\n ),\n }\n })\n }}\n >\n close\n \n
    \n )}\n
    \n
    \n)\n\nexport default MarkupEditorAttachment\n\nfunction getAttachmentMarkup(attachment) {\n let markup = \"[\"\n\n if (attachment.is_image) {\n markup += \"![\" + attachment.filename + \"]\"\n markup += \"(\" + (attachment.url.thumb || attachment.url.index) + \"?shva=1)\"\n } else {\n markup += attachment.filename\n }\n\n markup += \"](\" + attachment.url.index + \"?shva=1)\"\n return markup\n}\n","import React from \"react\"\nimport MarkupEditorAttachment from \"./MarkupEditorAttachment\"\n\nconst MarkupEditorAttachments = ({\n attachments,\n disabled,\n element,\n setState,\n update,\n}) => (\n
    \n
    \n {attachments.map((attachment) => (\n \n ))}\n
    \n
    \n)\n\nexport default MarkupEditorAttachments\n","import React from \"react\"\nimport Button from \"../button\"\n\nconst MarkupEditorFooter = ({\n canProtect,\n disabled,\n empty,\n preview,\n isProtected,\n submitText,\n showPreview,\n closePreview,\n enableProtection,\n disableProtection,\n}) => (\n
    \n {!!canProtect && (\n {\n if (isProtected) {\n disableProtection()\n } else {\n enableProtection()\n }\n }}\n >\n \n {isProtected ? \"lock\" : \"lock_open\"}\n \n \n )}\n {!!canProtect && (\n
    \n {\n if (isProtected) {\n disableProtection()\n } else {\n enableProtection()\n }\n }}\n >\n \n {isProtected ? \"lock\" : \"lock_open\"}\n \n {isProtected\n ? pgettext(\"markup editor\", \"Protected\")\n : pgettext(\"markup editor\", \"Protect\")}\n \n
    \n )}\n
    \n {preview ? (\n \n {pgettext(\"markup editor\", \"Edit\")}\n \n ) : (\n \n {pgettext(\"markup editor\", \"Preview\")}\n \n )}\n \n
    \n)\n\nexport default MarkupEditorFooter\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupCodeModal extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: null,\n syntax: \"\",\n text: props.selection.text,\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const syntax = this.state.syntax.trim()\n const text = this.state.text.trim()\n\n if (text.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n replaceSelection(\n Object.assign({}, selection, { text }),\n update,\n prefix + \"```\" + syntax + \"\\n\" + text + \"\\n```\\n\\n\"\n )\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {pgettext(\"markup editor\", \"Code\")}

    \n
    \n
    \n
    \n \n \n this.setState({ syntax: event.target.value })\n }\n >\n \n {LANGUAGES.map(({ value, name }) => (\n \n ))}\n \n \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nconst LANGUAGES = [\n { value: \"bash\", name: \"Bash\" },\n { value: \"c\", name: \"C\" },\n { value: \"c#\", name: \"C#\" },\n { value: \"c++\", name: \"C++\" },\n { value: \"css\", name: \"CSS\" },\n { value: \"diff\", name: \"Diff\" },\n { value: \"go\", name: \"Go\" },\n { value: \"graphql\", name: \"GraphQL\" },\n { value: \"html,\", name: \"HTML\" },\n { value: \"xml\", name: \"XML\" },\n { value: \"json\", name: \"JSON\" },\n { value: \"java\", name: \"Java\" },\n { value: \"javascript\", name: \"JavaScript\" },\n { value: \"kotlin\", name: \"Kotlin\" },\n { value: \"less\", name: \"Less\" },\n { value: \"lua\", name: \"Lua\" },\n { value: \"makefile\", name: \"Makefile\" },\n { value: \"markdown\", name: \"Markdown\" },\n { value: \"objective-C\", name: \"Objective-C\" },\n { value: \"php\", name: \"PHP\" },\n { value: \"perl\", name: \"Perl\" },\n { value: \"plain\", name: \"Plain\" },\n { value: \"text\", name: \"text\" },\n { value: \"python\", name: \"Python\" },\n { value: \"repl\", name: \"REPL\" },\n { value: \"r\", name: \"R\" },\n { value: \"ruby\", name: \"Ruby\" },\n { value: \"rust\", name: \"Rust\" },\n { value: \"scss\", name: \"SCSS\" },\n { value: \"sql\", name: \"SQL\" },\n { value: \"shell\", name: \"Shell Session\" },\n { value: \"swift\", name: \"Swift\" },\n { value: \"toml\", name: \"TOML\" },\n { value: \"ini\", name: \"INI\" },\n { value: \"typescript\", name: \"TypeScript\" },\n { value: \"visualbasic\", name: \"Visual Basic .NET\" },\n { value: \"webassembly\", name: \"WebAssembly\" },\n { value: \"yaml\", name: \"YAML\" },\n]\n\nexport default MarkupCodeModal\n","import React from \"react\"\nimport formatFilesize from \"../../utils/file-size\"\n\nexport default function MarkupFormattingHelpModal() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup help\", \"Formatting help\")}\n

    \n
    \n
    \n

    {pgettext(\"markup help\", \"Emphasis text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will have emphasis\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Bold text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will be bold\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Removed text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will be removed\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Bold text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be bold\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Underlined text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be underlined\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Italics text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be in italics\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link\")}

    \n \"\n result={\n

    \n example.com\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link with text\")}

    \n \n {pgettext(\"markup help\", \"Link text\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link (BBCode)\")}

    \n \n example.com\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link with text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"Link text\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image\")}

    \n \n \"\"\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image with alternate text\")}

    \n \n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image (BBCode)\")}

    \n \n \"\"\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Mention user by their name\")}

    \n \n @username\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 1\")}

    \n {pgettext(\"markup help\", \"First level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 2\")}

    \n {pgettext(\"markup help\", \"Second level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 3\")}

    \n {pgettext(\"markup help\", \"Third level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 4\")}

    \n {pgettext(\"markup help\", \"Fourth level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 5\")}

    \n {pgettext(\"markup help\", \"Fifth level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Unordered list\")}

    \n \n
  • Lorem ipsum
  • \n
  • Dolor met
  • \n
  • Vulputate lectus
  • \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Ordered list\")}

    \n \n
  • Lorem ipsum
  • \n
  • Dolor met
  • \n
  • Vulputate lectus
  • \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text\")}

    \n \" + pgettext(\"markup help\", \"Quoted text\")}\n result={\n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text (BBCode)\")}

    \n \n
    \n {gettext(\"Quoted message:\")}\n
    \n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text with author (BBCode)\")}

    \n \n
    \n {pgettext(\"markup help\", \"Quote author has written:\")}\n
    \n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Spoiler\")}

    \n \n {pgettext(\"markup help\", \"Secret text\")}\n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Inline code\")}

    \n \n {pgettext(\"markup help\", \"Inline code\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Code block\")}

    \n \n alert(\"Hello world!\");\n \n }\n />\n\n
    \n\n

    \n {pgettext(\"markup help\", \"Code block with syntax highlighting\")}\n

    \n \n \n print(\"Hello world!\");\n \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Code block (BBCode)\")}

    \n \n alert(\"Hello world!\");\n \n }\n />\n\n
    \n\n

    \n {pgettext(\n \"markup help\",\n \"Code block with syntax highlighting (BBCode)\"\n )}\n

    \n \n \n print(\"Hello world!\");\n \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Horizontal rule\")}

    \n \n

    Lorem ipsum

    \n
    \n

    Dolor met

    \n
    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Horizontal rule (BBCode)\")}

    \n \n

    Lorem ipsum

    \n
    \n

    Dolor met

    \n
    \n }\n />\n
    \n
    \n \n {pgettext(\"modal\", \"Close\")}\n \n
    \n
    \n
    \n )\n}\n\nfunction ExampleFormatting({ markup, result }) {\n return (\n
    \n
    \n
    \n          {markup}\n        
    \n
    \n
    \n
    {result}
    \n
    \n
    \n )\n}\n\nclass ExampleFormattingSpoiler extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n reveal: false,\n }\n }\n\n render() {\n return (\n \n
    \n

    {this.props.children}

    \n
    \n {!this.state.reveal && (\n
    \n {\n this.setState({ reveal: true })\n }}\n >\n {gettext(\"Reveal spoiler\")}\n \n
    \n )}\n \n )\n }\n}\n","const URL_PATTERN = new RegExp(\"^(((ftps?)|(https?))://)\", \"i\")\n\nexport default function isUrl(str) {\n return URL_PATTERN.test(str.trim())\n}\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport isUrl from \"./isUrl\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupImageModal extends React.Component {\n constructor(props) {\n super(props)\n\n const text = props.selection.text.trim()\n const textUrl = isUrl(text)\n\n this.state = {\n error: null,\n text: textUrl ? \"\" : text,\n url: textUrl ? text : \"\",\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const text = this.state.text.trim()\n const url = this.state.url.trim()\n\n if (url.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n if (text.length > 0) {\n replaceSelection(selection, update, \"![\" + text + \"](\" + url + \")\")\n } else {\n replaceSelection(selection, update, \"!(\" + url + \")\")\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Image\")}\n

    \n
    \n
    \n
    \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n \n \n this.setState({ url: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupImageModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport isUrl from \"./isUrl\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupLinkModal extends React.Component {\n constructor(props) {\n super(props)\n\n const text = props.selection.text.trim()\n const textUrl = isUrl(text)\n\n this.state = {\n error: null,\n text: textUrl ? \"\" : text,\n url: textUrl ? text : \"\",\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const text = this.state.text.trim()\n const url = this.state.url.trim()\n\n if (url.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n if (text.length > 0) {\n replaceSelection(selection, update, \"[\" + text + \"](\" + url + \")\")\n } else {\n replaceSelection(selection, update, \"<\" + url + \">\")\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {pgettext(\"markup editor\", \"Link\")}

    \n
    \n
    \n
    \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n \n \n this.setState({ url: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupLinkModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupQuoteModal extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: null,\n author: \"\",\n text: props.selection.text,\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const author = this.state.author.trim()\n const text = this.state.text.trim()\n\n if (text.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n if (author) {\n replaceSelection(\n selection,\n update,\n prefix + '[quote=\"' + author + '\"]\\n' + text + \"\\n[/quote]\\n\\n\"\n )\n } else {\n replaceSelection(\n selection,\n update,\n prefix + \"[quote]\\n\" + text + \"\\n[/quote]\\n\\n\"\n )\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Quote\")}\n

    \n
    \n
    \n
    \n \n \n this.setState({ author: event.target.value })\n }\n />\n \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupQuoteModal\n","import React from \"react\"\n\nconst MarkupEditorButton = ({ disabled, icon, title, onClick }) => (\n \n {icon}\n \n)\n\nexport default MarkupEditorButton\n","import moment from \"moment\"\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport formatFilesize from \"../../utils/file-size\"\nimport getRandomString from \"../../utils/getRandomString\"\n\nconst ID_LEN = 32\n\nconst uploadFile = (file, setState) => {\n const maxSize = misago.get(\"user\").acl.max_attachment_size * 1024\n\n if (file.size > maxSize) {\n snackbar.error(\n interpolate(\n pgettext(\n \"markup editor\",\n \"File %(filename)s is bigger than %(limit)s.\"\n ),\n { filename: file.name, limit: formatFilesize(maxSize) },\n true\n )\n )\n\n return\n }\n\n let upload = {\n id: null,\n key: getRandomString(ID_LEN),\n error: null,\n uploaded_on: null,\n progress: 0,\n filename: file.name,\n filetype: null,\n is_image: false,\n size: file.size,\n url: null,\n uploader_name: null,\n }\n\n setState(({ attachments }) => {\n return { attachments: [upload].concat(attachments) }\n })\n\n const refreshState = () => {\n setState(({ attachments }) => {\n return { attachments: attachments.concat() }\n })\n }\n\n const data = new FormData()\n data.append(\"upload\", file)\n\n ajax\n .upload(misago.get(\"ATTACHMENTS_API\"), data, (progress) => {\n upload.progress = progress\n refreshState()\n })\n .then(\n (data) => {\n Object.assign(upload, data, { uploaded_on: moment(data.uploaded_on) })\n refreshState()\n },\n (rejection) => {\n if (rejection.status === 400 || rejection.status === 413) {\n upload.error = rejection.detail\n snackbar.error(rejection.detail)\n refreshState()\n } else {\n snackbar.apiError(rejection)\n }\n }\n )\n}\n\nexport default uploadFile\n","import React from \"react\"\nimport misago from \"../../\"\nimport modal from \"../../services/modal\"\nimport MarkupCodeModal from \"./MarkupCodeModal\"\nimport MarkupFormattingHelpModal from \"./MarkupFormattingHelpModal\"\nimport MarkupImageModal from \"./MarkupImageModal\"\nimport MarkupLinkModal from \"./MarkupLinkModal\"\nimport MarkupQuoteModal from \"./MarkupQuoteModal\"\nimport MarkupEditorButton from \"./MarkupEditorButton\"\nimport { getSelection, replaceSelection, wrapSelection } from \"./operations\"\nimport uploadFile from \"./uploadFile\"\n\nconst MarkupEditorToolbar = ({\n disabled,\n element,\n update,\n updateAttachments,\n}) => {\n const actions = [\n {\n name: pgettext(\"markup editor\", \"Strong\"),\n icon: \"format_bold\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"**\",\n \"**\",\n pgettext(\"example markup\", \"Strong text\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Emphasis\"),\n icon: \"format_italic\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"*\",\n \"*\",\n pgettext(\"example markup\", \"Text with emphasis\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Strikethrough\"),\n icon: \"format_strikethrough\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"~~\",\n \"~~\",\n pgettext(\"example markup\", \"Text with strikethrough\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Horizontal ruler\"),\n icon: \"remove\",\n onClick: () => {\n replaceSelection(getSelection(element), update, \"\\n\\n- - -\\n\\n\")\n },\n },\n {\n name: pgettext(\"markup editor\", \"Link\"),\n icon: \"insert_link\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Image\"),\n icon: \"insert_photo\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Quote\"),\n icon: \"format_quote\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Spoiler\"),\n icon: \"visibility_off\",\n onClick: () => {\n insertSpoiler(element, update)\n },\n },\n {\n name: pgettext(\"markup editor\", \"Code\"),\n icon: \"code\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n ]\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n actions.push({\n name: pgettext(\"markup editor\", \"Upload file\"),\n icon: \"file_upload\",\n onClick: () => uploadFiles(updateAttachments),\n })\n }\n\n return (\n
    \n
    \n {actions.map(({ name, icon, onClick }) => (\n \n ))}\n
    \n
    \n
    \n \n more_vert\n \n
      \n {actions.map(({ name, icon, onClick }) => (\n
    • \n \n {icon}\n {name}\n \n
    • \n ))}\n
    \n
    \n {\n modal.show()\n }}\n />\n
    \n
    \n )\n}\n\nconst insertSpoiler = (element, update) => {\n const selection = getSelection(element)\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n wrapSelection(\n selection,\n update,\n prefix + \"[spoiler]\\n\",\n \"\\n[/spoiler]\\n\\n\",\n pgettext(\"markup editor\", \"Spoiler text\")\n )\n}\n\nconst uploadFiles = (setState) => {\n const input = document.createElement(\"input\")\n input.type = \"file\"\n input.multiple = \"multiple\"\n\n input.addEventListener(\"change\", function () {\n for (let i = 0; i < input.files.length; i++) {\n uploadFile(input.files[i], setState)\n }\n })\n\n input.click()\n}\n\nexport default MarkupEditorToolbar\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport MisagoMarkup from \"../misago-markup\"\nimport MarkupEditorAttachments from \"./MarkupEditorAttachments\"\nimport MarkupEditorFooter from \"./MarkupEditorFooter\"\nimport MarkupEditorToolbar from \"./MarkupEditorToolbar\"\nimport uploadFile from \"./uploadFile\"\n\nclass MarkupEditor extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n element: null,\n focused: false,\n loading: false,\n preview: false,\n parsed: null,\n }\n }\n\n showPreview = () => {\n if (this.state.loading) return\n\n this.setState({ loading: true, preview: true, element: null })\n\n ajax.post(misago.get(\"PARSE_MARKUP_API\"), { post: this.props.value }).then(\n (data) => {\n this.setState({ loading: false, parsed: data.parsed })\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n this.setState({ loading: false, preview: false })\n }\n )\n }\n\n closePreview = () => {\n this.setState({ loading: false, preview: false })\n }\n\n onDrop = (event) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!event.dataTransfer.files) return\n\n const { onAttachmentsChange: setState } = this.props\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n for (let i = 0; i < event.dataTransfer.files.length; i++) {\n const file = event.dataTransfer.files[i]\n uploadFile(file, setState)\n }\n }\n }\n\n onPaste = (event) => {\n const { onAttachmentsChange: setState } = this.props\n\n const files = []\n for (let i = 0; i < event.clipboardData.items.length; i++) {\n const item = event.clipboardData.items[i]\n if (item.kind === \"file\") {\n files.push(item.getAsFile())\n }\n }\n\n if (files.length) {\n event.preventDefault()\n event.stopPropagation()\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n for (let i = 0; i < files.length; i++) {\n uploadFile(files[i], setState)\n }\n }\n }\n }\n\n render = () => (\n \n this.props.onChange({ target: { value } })}\n updateAttachments={this.props.onAttachmentsChange}\n />\n {this.state.preview ? (\n
    \n {this.state.loading ? (\n
    \n
    \n \n
    \n
    \n ) : (\n \n )}\n
    \n ) : (\n {\n if (element && this.state.element !== element) {\n this.setState({ element })\n setMentions(this.props, element)\n }\n }}\n onChange={this.props.onChange}\n onDrop={this.onDrop}\n onFocus={() => this.setState({ focused: true })}\n onPaste={this.onPaste}\n onBlur={() => this.setState({ focused: false })}\n />\n )}\n {this.props.attachments.length > 0 && (\n this.props.onChange({ target: { value } })}\n />\n )}\n \n
    \n )\n}\n\nfunction setMentions(props, element) {\n $(element).atwho({\n at: \"@\",\n displayTpl: '
  • \"\"${username}
  • ',\n insertTpl: \"@${username}\",\n searchKey: \"username\",\n callbacks: {\n remoteFilter: function (query, callback) {\n $.getJSON(misago.get(\"MENTION_API\"), { q: query }, callback)\n },\n },\n })\n\n $(element).on(\"inserted.atwho\", (event, _storage, source, controller) => {\n const { query } = controller\n const username = source.target.innerText.trim()\n const prefix = event.target.value.substr(0, query.headPos)\n const suffix = event.target.value.substr(query.endPos)\n\n event.target.value = prefix + username + suffix\n props.onChange(event)\n\n const caret = query.headPos + username.length\n event.target.setSelectionRange(caret, caret)\n event.target.focus()\n })\n}\n\nexport default MarkupEditor\n","import MarkupEditor from \"./MarkupEditor\"\n\nexport default MarkupEditor\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nconst CLASS_ACTIVE = \"posting-active\"\nconst CLASS_DEFAULT = \"posting-default\"\nconst CLASS_MINIMIZED = \"posting-minimized\"\nconst CLASS_FULLSCREEN = \"posting-fullscreen\"\n\nclass PostingDialog extends React.Component {\n componentDidMount() {\n document.body.classList.add(CLASS_ACTIVE, CLASS_DEFAULT)\n }\n\n componentWillUnmount() {\n document.body.classList.remove(\n CLASS_ACTIVE,\n CLASS_DEFAULT,\n CLASS_MINIMIZED,\n CLASS_FULLSCREEN\n )\n }\n\n componentWillReceiveProps({ fullscreen, minimized }) {\n if (minimized) {\n document.body.classList.remove(CLASS_DEFAULT, CLASS_FULLSCREEN)\n document.body.classList.add(CLASS_MINIMIZED)\n } else {\n if (fullscreen) {\n document.body.classList.remove(CLASS_DEFAULT, CLASS_MINIMIZED)\n document.body.classList.add(CLASS_FULLSCREEN)\n } else {\n document.body.classList.remove(CLASS_FULLSCREEN, CLASS_MINIMIZED)\n document.body.classList.add(CLASS_DEFAULT)\n }\n }\n }\n\n render() {\n const { children, fullscreen, minimized } = this.props\n\n return (\n \n
    {children}
    \n \n )\n }\n}\n\nexport default PostingDialog\n","import React from \"react\"\n\nconst PostingDialogBody = ({ children }) => (\n
    {children}
    \n)\n\nexport default PostingDialogBody\n","import React from \"react\"\n\nconst PostingDialogError = ({ close, message }) => (\n
    \n
    \n error_outlined\n
    \n
    \n

    {message}

    \n \n
    \n
    \n)\n\nexport default PostingDialogError\n","import React from \"react\"\n\nconst PostingDialogHeader = ({\n children,\n close,\n fullscreen,\n minimize,\n minimized,\n fullscreenEnter,\n fullscreenExit,\n open,\n}) => (\n
    \n
    {children}
    \n {minimized ? (\n \n expand_less\n \n ) : (\n \n expand_more\n \n )}\n {fullscreen ? (\n \n fullscreen_exit\n \n ) : (\n \n fullscreen\n \n )}\n \n close\n \n
    \n)\n\nexport default PostingDialogHeader\n","import React from \"react\"\n\nexport default function PostingThreadOptions({\n isClosed,\n isHidden,\n isPinned,\n disabled,\n options,\n close,\n open,\n hide,\n unhide,\n pinGlobally,\n pinLocally,\n unpin,\n}) {\n const icons = getIcons(isClosed, isHidden, isPinned)\n\n return (\n
    \n \n {icons.length > 0 ? (\n \n {icons.map((icon) => (\n \n {icon}\n \n ))}\n \n ) : (\n more_horiz\n )}\n \n
      \n {options.pin === 2 && isPinned !== 2 && (\n
    • \n \n bookmark\n {pgettext(\"post thread\", \"Pinned globally\")}\n \n
    • \n )}\n {options.pin >= isPinned && isPinned !== 1 && (\n
    • \n \n bookmark_outline\n {pgettext(\"post thread\", \"Pinned in category\")}\n \n
    • \n )}\n {options.pin >= isPinned && isPinned !== 0 && (\n
    • \n \n radio_button_unchecked\n {pgettext(\"post thread\", \"Not pinned\")}\n \n
    • \n )}\n {options.close && !!isClosed && (\n
    • \n \n lock_outline\n {pgettext(\"post thread\", \"Open\")}\n \n
    • \n )}\n {options.close && !isClosed && (\n
    • \n \n lock\n {pgettext(\"post thread\", \"Closed\")}\n \n
    • \n )}\n {options.hide && !!isHidden && (\n
    • \n \n visibility\n {pgettext(\"post thread\", \"Visible\")}\n \n
    • \n )}\n {options.hide && !isHidden && (\n
    • \n \n visibility_off\n {pgettext(\"post thread\", \"Hidden\")}\n \n
    • \n )}\n
    \n
    \n )\n}\n\nfunction getIcons(closed, hidden, pinned) {\n const icons = []\n if (pinned === 2) icons.push(\"bookmark\")\n if (pinned === 1) icons.push(\"bookmark_outline\")\n if (closed) icons.push(\"lock\")\n if (hidden) icons.push(\"visibility_off\")\n return icons\n}\n","import React from \"react\"\nimport CategorySelect from \"misago/components/category-select\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport PostingThreadOptions from \"./PostingThreadOptions\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n options: null,\n\n title: \"\",\n category: props.category || null,\n categories: [],\n post: \"\",\n attachments: [],\n close: false,\n hide: false,\n pin: 0,\n\n validators: {\n title: getTitleValidators(),\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n }\n\n loadSuccess = (data) => {\n let category = null\n let options = null\n\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n // pick first category that allows posting and if it may, override it with initial one\n if (\n item.post !== false &&\n (!category || item.id == this.state.category)\n ) {\n category = item.id\n options = item.post\n }\n\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n })\n })\n\n this.setState({\n isReady: true,\n options,\n\n categories,\n category,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n onCancel = () => {\n const formEmpty = !!(\n this.state.post.length === 0 &&\n this.state.title.length === 0 &&\n this.state.attachments.length === 0\n )\n\n if (formEmpty) {\n this.minimize()\n return posting.close()\n }\n\n const cancel = window.confirm(\n pgettext(\"post thread\", \"Are you sure you want to discard thread?\")\n )\n if (cancel) {\n this.minimize()\n posting.close()\n }\n }\n\n onTitleChange = (event) => {\n this.changeValue(\"title\", event.target.value)\n }\n\n onCategoryChange = (event) => {\n const category = this.state.categories.find((item) => {\n return event.target.value == item.value\n })\n\n // if selected pin is greater than allowed, reduce it\n let pin = this.state.pin\n if (category.post.pin && category.post.pin < pin) {\n pin = category.post.pin\n }\n\n this.setState({\n category: category.id,\n categoryOptions: category.post,\n\n pin,\n })\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onClose = () => {\n this.changeValue(\"close\", true)\n }\n\n onOpen = () => {\n this.changeValue(\"close\", false)\n }\n\n onPinGlobally = () => {\n this.changeValue(\"pin\", 2)\n }\n\n onPinLocally = () => {\n this.changeValue(\"pin\", 1)\n }\n\n onUnpin = () => {\n this.changeValue(\"pin\", 0)\n }\n\n onHide = () => {\n this.changeValue(\"hide\", true)\n }\n\n onUnhide = () => {\n this.changeValue(\"hide\", false)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n clean() {\n if (!this.state.title.trim().length) {\n snackbar.error(\n pgettext(\"posting form\", \"You have to enter thread title.\")\n )\n return false\n }\n\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.title) {\n snackbar.error(errors.title[0])\n return false\n }\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.submit, {\n title: this.state.title,\n category: this.state.category,\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n close: this.state.close,\n hide: this.state.hide,\n pin: this.state.pin,\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n window.location = success.url\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.category || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n const dialogProps = {\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n const showOptions = !!(\n this.state.options.close ||\n this.state.options.hide ||\n this.state.options.pin\n )\n\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n {showOptions && (\n \n \n \n )}\n \n \n \n \n
    \n )\n }\n}\n\nconst PostingDialogStart = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n}) => (\n \n \n {pgettext(\"post thread\", \"Start new thread\")}\n \n {children}\n \n)\n","export default function (usernames) {\n const normalisedNames = usernames\n .split(\",\")\n .map((i) => i.trim().toLowerCase())\n const removedBlanks = normalisedNames.filter((i) => i.length > 0)\n const removedDuplicates = removedBlanks.filter((name, pos) => {\n return removedBlanks.indexOf(name) == pos\n })\n\n return removedDuplicates\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport cleanUsernames from \"./utils/usernames\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n const to = (props.to || []).map((user) => user.username).join(\", \")\n\n this.state = {\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n to: to,\n title: \"\",\n post: \"\",\n attachments: [],\n\n validators: {\n title: getTitleValidators(),\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n onCancel = () => {\n const formEmpty = !!(\n this.state.post.length === 0 &&\n this.state.title.length === 0 &&\n this.state.to.length === 0 &&\n this.state.attachments.length === 0\n )\n\n if (formEmpty) {\n return this.close()\n }\n\n const cancel = window.confirm(\n pgettext(\n \"post thread\",\n \"Are you sure you want to discard private thread?\"\n )\n )\n if (cancel) {\n this.close()\n }\n }\n\n onToChange = (event) => {\n this.changeValue(\"to\", event.target.value)\n }\n\n onTitleChange = (event) => {\n this.changeValue(\"title\", event.target.value)\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n clean() {\n if (!cleanUsernames(this.state.to).length) {\n snackbar.error(\n pgettext(\"posting form\", \"You have to enter at least one recipient.\")\n )\n return false\n }\n\n if (!this.state.title.trim().length) {\n snackbar.error(\n pgettext(\"posting form\", \"You have to enter thread title.\")\n )\n return false\n }\n\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.title) {\n snackbar.error(errors.title[0])\n return false\n }\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.submit, {\n to: cleanUsernames(this.state.to),\n title: this.state.title,\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n window.location = success.url\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.to || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n )\n }\n}\n\nconst PostingDialogStartPrivate = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n}) => (\n \n \n {pgettext(\"post thread\", \"Start private thread\")}\n \n {children}\n \n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n post: this.props.default || \"\",\n attachments: [],\n\n validators: {\n post: getPostValidators(),\n },\n errors: {},\n }\n\n this.quoteText = \"\"\n }\n\n componentDidMount() {\n ajax\n .get(this.props.config, this.props.context || null)\n .then(this.loadSuccess, this.loadError)\n\n setGlobalState(false, this.onQuote)\n }\n\n componentWillUnmount() {\n clearGlobalState()\n }\n\n componentWillReceiveProps(nextProps) {\n const context = this.props.context\n const newContext = nextProps.context\n\n // User clicked \"reply\" instead of \"quote\"\n if (context && newContext && !newContext.reply) return\n\n ajax\n .get(nextProps.config, nextProps.context || null)\n .then(this.appendData, snackbar.apiError)\n }\n\n loadSuccess = (data) => {\n this.setState({\n isReady: true,\n\n post: data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\"\n : this.state.post,\n })\n\n this.quoteText = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\"\n : this.state.post\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n appendData = (data) => {\n const newPost = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n : \"\"\n\n this.setState((prevState, props) => {\n if (prevState.post.length > 0) {\n return {\n post: prevState.post.trim() + \"\\n\\n\" + newPost,\n }\n }\n\n return {\n post: newPost,\n }\n })\n\n this.open()\n }\n\n onCancel = () => {\n // If only the quote text is on editor user didn't add anything\n // so no changes to discard\n const onlyQuoteTextInEditor = this.state.post === this.quoteText\n\n if (onlyQuoteTextInEditor && this.state.attachments.length === 0) {\n return this.close()\n }\n\n const cancel = window.confirm(\n pgettext(\"post reply\", \"Are you sure you want to discard your reply?\")\n )\n if (cancel) {\n this.close()\n }\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onQuote = (quote) => {\n this.setState(({ post }) => {\n if (post.length > 0) {\n return { post: post.trim() + \"\\n\\n\" + quote }\n }\n\n return { post: quote }\n })\n\n this.open()\n }\n\n clean() {\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n setGlobalState(true, this.onQuote)\n\n return ajax.post(this.props.submit, {\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n setGlobalState(false, this.onQuote)\n\n snackbar.success(pgettext(\"post reply\", \"Your reply has been posted.\"))\n window.location = success.url.index\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n setGlobalState(false, this.onQuote)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n thread: this.props.thread,\n\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n return (\n \n \n \n \n \n )\n }\n}\n\nconst PostingDialogReply = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n thread,\n}) => (\n \n \n {interpolate(\n pgettext(\"post reply\", \"Reply to: %(thread)s\"),\n { thread: thread.title },\n true\n )}\n \n {children}\n \n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: false,\n\n minimized: false,\n fullscreen: false,\n\n post: \"\",\n attachments: [],\n protect: false,\n\n canProtect: false,\n\n validators: {\n post: getPostValidators(),\n },\n errors: {},\n }\n\n this.originalPost = \"\"\n }\n\n componentDidMount() {\n ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n\n setGlobalState(false, this.onQuote)\n }\n\n componentWillUnmount() {\n clearGlobalState()\n }\n\n componentWillReceiveProps(nextProps) {\n const context = this.props.context\n const newContext = nextProps.context\n\n if (context && newContext && context.reply === newContext.reply) return\n\n ajax\n .get(nextProps.config, nextProps.context || null)\n .then(this.appendData, snackbar.apiError)\n }\n\n loadSuccess = (data) => {\n this.originalPost = data.post\n\n this.setState({\n isReady: true,\n\n post: data.post,\n attachments: attachments.hydrate(data.attachments),\n protect: data.is_protected,\n\n canProtect: data.can_protect,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n appendData = (data) => {\n const newPost = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n : \"\"\n\n this.setState((prevState, props) => {\n if (prevState.post.length > 0) {\n return {\n post: prevState.post.trim() + \"\\n\\n\" + newPost,\n }\n }\n\n return {\n post: newPost,\n }\n })\n\n this.open()\n }\n\n onCancel = () => {\n const originalPostSameAsCurrentPost =\n this.state.originalPost === this.state.post\n const noAttachementsAdded = this.state.attachments.length === 0\n\n if (originalPostSameAsCurrentPost && noAttachementsAdded) {\n return this.close()\n }\n\n const cancel = window.confirm(\n pgettext(\"edit reply\", \"Are you sure you want to discard changes?\")\n )\n if (cancel) {\n this.close()\n }\n }\n\n onProtect = () => {\n this.setState({\n protect: true,\n })\n }\n\n onUnprotect = () => {\n this.setState({\n protect: false,\n })\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onQuote = (quote) => {\n this.setState(({ post }) => {\n if (post.length > 0) {\n return { post: post.trim() + \"\\n\\n\" + quote }\n }\n\n return { post: quote }\n })\n\n this.open()\n }\n\n clean() {\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n setGlobalState(true, this.onQuote)\n\n return ajax.put(this.props.submit, {\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n protect: this.state.protect,\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n setGlobalState(false, this.onQuote)\n\n snackbar.success(pgettext(\"edit reply\", \"Reply has been edited.\"))\n window.location = success.url.index\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.category || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n setGlobalState(false, this.onQuote)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n post: this.props.post,\n\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n return (\n \n \n this.setState({ protect: true })}\n disableProtection={() => this.setState({ protect: false })}\n value={this.state.post}\n submitText={pgettext(\"edit reply submit\", \"Edit reply\")}\n disabled={this.state.isLoading}\n onAttachmentsChange={this.onAttachmentsChange}\n onChange={this.onPostChange}\n />\n \n \n )\n }\n}\n\nconst PostingDialogEditReply = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n post,\n}) => (\n \n \n {interpolate(\n pgettext(\"edit reply\", \"Edit reply by %(poster)s from %(date)s\"),\n {\n poster: post.poster ? post.poster.username : post.poster_name,\n date: post.posted_on.fromNow(),\n },\n true\n )}\n \n {children}\n \n)\n","import React from \"react\"\nimport PostingQuoteSelection from \"./PostingQuoteSelection\"\nimport getQuoteMarkup from \"./getQuoteMarkup\"\nimport { clearGlobalState, getGlobalState, setGlobalState } from \"./globalState\"\nimport Start from \"./start\"\nimport StartPrivate from \"./start-private\"\nimport Reply from \"./reply\"\nimport Edit from \"./edit\"\n\nexport default function (props) {\n switch (props.mode) {\n case \"START\":\n return \n\n case \"START_PRIVATE\":\n return \n\n case \"REPLY\":\n return \n\n case \"EDIT\":\n return \n\n default:\n return null\n }\n}\n\nexport {\n PostingQuoteSelection,\n clearGlobalState,\n getGlobalState,\n getQuoteMarkup,\n setGlobalState,\n}\n","import { maxLength, minLength } from \"misago/utils/validators\"\nimport misago from \"misago\"\n\nexport function getTitleValidators() {\n return [getTitleLengthMin(), getTitleLengthMax()]\n}\n\nexport function getPostValidators() {\n if (misago.get(\"SETTINGS\").post_length_max) {\n return [validatePostLengthMin(), validatePostLengthMax()]\n } else {\n return [validatePostLengthMin()]\n }\n}\n\nexport function getTitleLengthMin() {\n return minLength(\n misago.get(\"SETTINGS\").thread_title_length_min,\n (limitValue, length) => {\n const message = npgettext(\n \"thread title length validator\",\n \"Thread title should be at least %(limit_value)s character long (it has %(show_value)s).\",\n \"Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function getTitleLengthMax() {\n return maxLength(\n misago.get(\"SETTINGS\").thread_title_length_max,\n (limitValue, length) => {\n const message = npgettext(\n \"thread title length validator\",\n \"Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n \"Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function validatePostLengthMin() {\n return minLength(\n misago.get(\"SETTINGS\").post_length_min,\n (limitValue, length) => {\n const message = npgettext(\n \"post length validator\",\n \"Posted message should be at least %(limit_value)s character long (it has %(show_value)s).\",\n \"Posted message should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function validatePostLengthMax() {\n return maxLength(\n misago.get(\"SETTINGS\").post_length_max || 1000000,\n (limitValue, length) => {\n const message = npgettext(\n \"post length validator\",\n \"Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n \"Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getChoice() {\n let choice = null\n this.props.choices.map((item) => {\n if (item.value === this.props.value) {\n choice = item\n }\n })\n return choice\n }\n\n getIcon() {\n return this.getChoice().icon\n }\n\n getLabel() {\n return this.getChoice().label\n }\n\n change = (value) => {\n return () => {\n this.props.onChange({\n target: {\n value: value,\n },\n })\n }\n }\n\n render() {\n return (\n
    \n \n \n {this.getLabel()}\n \n
      \n {this.props.choices.map((item, i) => {\n return (\n
    • \n \n \n {item.label}\n \n
    • \n )\n })}\n
    \n
    \n )\n }\n}\n\nexport function Icon({ icon }) {\n if (!icon) return null\n\n return {icon}\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport StartSocialAuth from \"misago/components/StartSocialAuth\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n showActivation: false,\n\n username: \"\",\n password: \"\",\n\n validators: {\n username: [],\n password: [],\n },\n }\n }\n\n clean() {\n if (!this.isValid()) {\n snackbar.error(pgettext(\"sign in modal\", \"Fill out both fields.\"))\n return false\n } else {\n return true\n }\n }\n\n send() {\n return ajax.post(misago.get(\"AUTH_API\"), {\n username: this.state.username,\n password: this.state.password,\n })\n }\n\n handleSuccess() {\n let form = $(\"#hidden-login-form\")\n\n form.append('')\n form.append('')\n\n // fill out form with user credentials and submit it, this will tell\n // Misago to redirect user back to right page, and will trigger browser's\n // key ring feature\n form.find('input[type=\"hidden\"]').val(ajax.getCsrfToken())\n form.find('input[name=\"next\"]').val(window.location.pathname)\n form.find('input[name=\"username\"]').val(this.state.username)\n form.find('input[name=\"password\"]').val(this.state.password)\n form.submit()\n\n // keep form loading\n this.setState({\n isLoading: true,\n })\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.code === \"inactive_admin\") {\n snackbar.info(rejection.detail)\n } else if (rejection.code === \"inactive_user\") {\n snackbar.info(rejection.detail)\n this.setState({\n showActivation: true,\n })\n } else if (rejection.code === \"banned\") {\n showBannedPage(rejection.detail)\n modal.hide()\n } else {\n snackbar.error(rejection.detail)\n }\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n modal.hide()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n getActivationButton() {\n if (!this.state.showActivation) return null\n\n return (\n \n {pgettext(\"sign in modal btn\", \"Activate account\")}\n \n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"sign in modal title\", \"Sign in\")}\n

    \n
    \n
    \n
    \n \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    \n {this.getActivationButton()}\n \n {pgettext(\"sign in modal btn\", \"Sign in\")}\n \n \n {pgettext(\"sign in modal btn\", \"Forgot password?\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClass() {\n return getStatusClassName(this.props.status)\n }\n\n render() {\n return {this.props.children}\n }\n}\n\nexport class StatusIcon extends React.Component {\n getIcon() {\n if (this.props.status.is_banned) {\n return \"remove_circle_outline\"\n } else if (this.props.status.is_hidden) {\n return \"help_outline\"\n } else if (this.props.status.is_online_hidden) {\n return \"label\"\n } else if (this.props.status.is_offline_hidden) {\n return \"label_outline\"\n } else if (this.props.status.is_online) {\n return \"lens\"\n } else if (this.props.status.is_offline) {\n return \"panorama_fish_eye\"\n }\n }\n\n render() {\n return {this.getIcon()}\n }\n}\n\nexport class StatusLabel extends React.Component {\n getHelp() {\n return getStatusDescription(this.props.user, this.props.status)\n }\n\n getLabel() {\n if (this.props.status.is_banned) {\n return pgettext(\"user status\", \"Banned\")\n } else if (this.props.status.is_hidden) {\n return pgettext(\"user status\", \"Hidden\")\n } else if (this.props.status.is_online_hidden) {\n return pgettext(\"user status\", \"Online (hidden)\")\n } else if (this.props.status.is_offline_hidden) {\n return pgettext(\"user status\", \"Offline (hidden)\")\n } else if (this.props.status.is_online) {\n return pgettext(\"user status\", \"Online\")\n } else if (this.props.status.is_offline) {\n return pgettext(\"user status\", \"Offline\")\n }\n }\n\n render() {\n return (\n \n {this.getLabel()}\n \n )\n }\n}\n\nexport function getStatusClassName(status) {\n let className = \"\"\n if (status.is_banned) {\n className = \"banned\"\n } else if (status.is_hidden) {\n className = \"offline\"\n } else if (status.is_online_hidden) {\n className = \"online\"\n } else if (status.is_offline_hidden) {\n className = \"offline\"\n } else if (status.is_online) {\n className = \"online\"\n } else if (status.is_offline) {\n className = \"offline\"\n }\n\n return \"user-status user-\" + className\n}\n\nexport function getStatusDescription(user, status) {\n if (status.is_banned) {\n if (status.banned_until) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is banned until %(ban_expires)s\"),\n {\n username: user.username,\n ban_expires: status.banned_until.format(\"LL, LT\"),\n },\n true\n )\n } else {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is banned\"),\n {\n username: user.username,\n },\n true\n )\n }\n } else if (status.is_hidden) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is hiding presence\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_online_hidden) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is online (hidden)\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_offline_hidden) {\n return interpolate(\n pgettext(\n \"user status\",\n \"%(username)s was last seen %(last_click)s (hidden)\"\n ),\n {\n username: user.username,\n last_click: status.last_click.fromNow(),\n },\n true\n )\n } else if (status.is_online) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is online\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_offline) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s was last seen %(last_click)s\"),\n {\n username: user.username,\n last_click: status.last_click.fromNow(),\n },\n true\n )\n }\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\n\nexport default function ({ showStatus, user }) {\n return (\n
      \n \n \n
    • \n \n \n \n
    \n )\n}\n\nexport function Status({ showStatus, user }) {\n if (!showStatus) return null\n\n return (\n
  • \n \n \n \n
  • \n )\n}\n\nexport function JoinDate({ user }) {\n const { joined_on } = user\n\n let title = interpolate(\n pgettext(\"users list item\", \"Joined on %(joined_on)s\"),\n {\n joined_on: joined_on.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n pgettext(\"users list item\", \"Joined %(joined_on)s\"),\n {\n joined_on: joined_on.fromNow(),\n },\n true\n )\n\n return (\n
  • \n {message}\n
  • \n )\n}\n\nexport function Posts({ user }) {\n const className = getStatClassName(\"user-stat-posts\", user.posts)\n const message = npgettext(\n \"users list item\",\n \"%(posts)s post\",\n \"%(posts)s posts\",\n user.posts\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n posts: user.posts,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Threads({ user }) {\n const className = getStatClassName(\"user-stat-threads\", user.threads)\n const message = npgettext(\n \"users list item\",\n \"%(threads)s thread\",\n \"%(threads)s threads\",\n user.threads\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n threads: user.threads,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Followers({ user }) {\n const className = getStatClassName(\"user-stat-followers\", user.followers)\n const message = npgettext(\n \"users list item\",\n \"%(followers)s follower\",\n \"%(followers)s followers\",\n user.followers\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n followers: user.followers,\n },\n true\n )}\n
  • \n )\n}\n\nexport function getStatClassName(className, stat) {\n if (stat === 0) {\n return className + \" user-stat-empty\"\n }\n return className\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title || rank.name\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n {userTitle}\n \n )\n }\n\n return {userTitle}\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Stats from \"./stats\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ showStatus, user }) {\n const { rank } = user\n\n let className = \"panel user-card\"\n if (rank.css_class) {\n className += \" user-card-\" + rank.css_class\n }\n\n return (\n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n\n \n
    \n \n
    \n\n
    \n \n
    \n
    \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n\n
    \n \n  \n \n
    \n
    \n \n  \n \n
    \n\n
    \n
      \n
    • \n \n  \n \n
    • \n
    • \n \n  \n \n
    • \n
    • \n
    • \n \n  \n \n
    • \n
    • \n \n  \n \n
    • \n
    \n
    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ colClassName, cols }) {\n const list = Array.apply(null, { length: cols }).map(Number.call, Number)\n\n return (\n
    \n
    \n {list.map((i) => {\n let className = colClassName\n if (i !== 0) className += \" hidden-xs\"\n if (i === 3) className += \" hidden-sm\"\n\n return (\n
    \n \n
    \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport Card from \"./card\"\nimport Preview from \"./preview\"\n\nexport default function ({ cols, isReady, showStatus, users }) {\n let colClassName = \"col-xs-12 col-sm-4\"\n if (cols === 4) {\n colClassName += \" col-md-3\"\n }\n\n if (!isReady) {\n return \n }\n\n return (\n
    \n
    \n {users.map((user) => {\n return (\n
    \n \n
    \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n dropdown: false,\n }\n }\n\n toggleNav = () => {\n this.setState({\n dropdown: !this.state.dropdown,\n })\n }\n\n hideNav = () => {\n this.setState({\n dropdown: false,\n })\n }\n\n getCompactNavClassName() {\n if (this.state.dropdown) {\n return \"compact-nav open\"\n } else {\n return \"compact-nav\"\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.value) {\n return \"btn btn-yes-no btn-yes-no-on\"\n } else {\n return \"btn btn-yes-no btn-yes-no-off\"\n }\n }\n\n getIcon() {\n if (!!this.props.value) {\n return this.props.iconOn || \"check_box\"\n } else {\n return this.props.iconOff || \"check_box_outline_blank\"\n }\n }\n\n getLabel() {\n if (!!this.props.value) {\n return this.props.labelOn || pgettext(\"yesno switch choice\", \"yes\")\n } else {\n return this.props.labelOff || pgettext(\"yesno switch choice\", \"no\")\n }\n }\n\n toggle = () => {\n this.props.onChange({\n target: {\n value: !this.props.value,\n },\n })\n }\n\n render() {\n return (\n \n {this.getIcon()}\n {this.getLabel()}\n \n )\n }\n}\n","export const locale = window.misago_locale || \"en-us\"\n\nexport const momentAgo = pgettext(\"time ago\", \"moment ago\")\nexport const momentAgoShort = pgettext(\"time ago\", \"now\")\nexport const dayAt = pgettext(\"day at time\", \"%(day)s at %(time)s\")\nexport const soonAt = pgettext(\"day at time\", \"Today at %(time)s\")\nexport const tomorrowAt = pgettext(\"day at time\", \"Tomorrow at %(time)s\")\nexport const yesterdayAt = pgettext(\"day at time\", \"Yesterday at %(time)s\")\n\nexport const minutesShort = pgettext(\"short minutes\", \"%(time)sm\")\nexport const hoursShort = pgettext(\"short hours\", \"%(time)sh\")\nexport const daysShort = pgettext(\"short days\", \"%(time)sd\")\nexport const thisYearShort = pgettext(\"short month\", \"%(day)s %(month)s\")\nexport const otherYearShort = pgettext(\"short month\", \"%(month)s %(year)s\")\n\nexport const relativeNumeric = new Intl.RelativeTimeFormat(locale, {\n numeric: \"always\",\n style: \"long\",\n})\n\nexport const fullDateTime = new Intl.DateTimeFormat(locale, {\n dateStyle: \"full\",\n timeStyle: \"medium\",\n})\n\nexport const thisYearDate = new Intl.DateTimeFormat(locale, {\n month: \"long\",\n day: \"numeric\",\n})\n\nexport const otherYearDate = new Intl.DateTimeFormat(locale, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n})\n\nexport const short = new Intl.DateTimeFormat(locale, {\n year: \"2-digit\",\n month: \"short\",\n day: \"numeric\",\n})\n\nexport const weekday = new Intl.DateTimeFormat(locale, {\n weekday: \"long\",\n})\n\nexport const shortTime = new Intl.DateTimeFormat(locale, { timeStyle: \"short\" })\n\nexport function dateRelative(date) {\n const now = new Date()\n const diff = Math.round((date - now) / 1000)\n const absDiff = Math.abs(diff)\n const sign = diff < 1 ? -1 : 1\n\n if (absDiff < 90) {\n return momentAgo\n }\n\n if (absDiff < 60 * 47) {\n const minutes = Math.round(absDiff / 60) * sign\n return relativeNumeric.format(minutes, \"minute\")\n }\n\n if (absDiff < 3600 * 3) {\n const hours = Math.round(absDiff / 3600) * sign\n return relativeNumeric.format(hours, \"hour\")\n }\n\n if (isSameDay(now, date)) {\n if (diff > 0) {\n return soonAt.replace(\"%(time)s\", shortTime.format(date))\n }\n\n return shortTime.format(date)\n }\n\n if (isYesterday(date)) {\n return yesterdayAt.replace(\"%(time)s\", shortTime.format(date))\n }\n\n if (isTomorrow(date)) {\n return tomorrowAt.replace(\"%(time)s\", shortTime.format(date))\n }\n\n if (diff < 0 && absDiff < 3600 * 24 * 6) {\n const day = weekday.format(date)\n return formatDayAtTime(day, date)\n }\n\n if (now.getFullYear() == date.getFullYear()) {\n return thisYearDate.format(date)\n }\n\n return otherYearDate.format(date)\n}\n\nexport function isSameDay(now, date) {\n return (\n now.getFullYear() == date.getFullYear() &&\n now.getMonth() == date.getMonth() &&\n now.getDate() == date.getDate()\n )\n}\n\nexport function isYesterday(date) {\n const yesterday = new Date()\n yesterday.setDate(yesterday.getDate() - 1)\n return isSameDay(yesterday, date)\n}\n\nexport function isTomorrow(date) {\n const yesterday = new Date()\n yesterday.setDate(yesterday.getDate() + 1)\n return isSameDay(yesterday, date)\n}\n\nexport function formatDayAtTime(day, date) {\n return dayAt\n .replace(\"%(day)s\", day)\n .replace(\"%(time)s\", shortTime.format(date))\n}\n\nexport function dateRelativeShort(date) {\n const now = new Date()\n const absDiff = Math.abs(Math.round((date - now) / 1000))\n\n if (absDiff < 60) {\n return momentAgoShort\n }\n\n if (absDiff < 60 * 55) {\n const minutes = Math.round(absDiff / 60)\n return minutesShort.replace(\"%(time)s\", minutes)\n }\n\n if (absDiff < 3600 * 24) {\n const hours = Math.round(absDiff / 3600)\n return hoursShort.replace(\"%(time)s\", hours)\n }\n\n if (absDiff < 86400 * 7) {\n const days = Math.round(absDiff / 86400)\n return daysShort.replace(\"%(time)s\", days)\n }\n\n const parts = {}\n short.formatToParts(date).forEach(function ({ type, value }) {\n parts[type] = value\n })\n\n if (date.getFullYear() === now.getFullYear()) {\n return thisYearShort\n .replace(\"%(day)s\", parts.day)\n .replace(\"%(month)s\", parts.month)\n }\n\n return otherYearShort\n .replace(\"%(year)s\", parts.year)\n .replace(\"%(month)s\", parts.month)\n}\n","class OrderedList {\n constructor(items) {\n this.isOrdered = false\n this._items = items || []\n }\n\n add(key, item, order) {\n this._items.push({\n key: key,\n item: item,\n\n after: order ? order.after || null : null,\n before: order ? order.before || null : null,\n })\n }\n\n get(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 has(key) {\n return this.get(key) !== undefined\n }\n\n values() {\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 order(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 orderedValues() {\n return this.order(true)\n }\n\n _order(unordered) {\n // Index of unordered items\n var index = []\n unordered.forEach(function (item) {\n index.push(item.key)\n })\n\n // Ordered items\n var ordered = []\n var ordering = []\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item)\n ordering.push(item.key)\n }\n })\n\n // Second pass: register items that\n // specify their before to \"_end\"\n unordered.forEach(function (item) {\n if (item.before === \"_end\") {\n ordered.push(item)\n ordering.push(item.key)\n }\n })\n\n // Third pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after)\n if (insertAt !== -1) {\n insertAt += 1\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before)\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item)\n ordering.splice(insertAt, 0, item.key)\n }\n }\n }\n\n var iterations = 200\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1\n unordered.forEach(insertItem)\n }\n\n return ordered\n }\n}\n\nexport default OrderedList\n","class AjaxLoader {\n constructor() {\n this.element = document.getElementById(\"misago-ajax-loader\")\n this.requests = 0\n this.timeout = null\n }\n\n show = () => {\n this.requests += 1\n this.update()\n }\n\n hide = () => {\n if (this.requests) {\n this.requests -= 1\n this.update()\n }\n }\n\n update = () => {\n if (this.timeout) {\n window.clearTimeout(this.timeout)\n }\n\n if (this.requests) {\n this.element.classList.add(\"busy\")\n this.element.classList.remove(\"complete\")\n } else {\n this.element.classList.remove(\"busy\")\n this.element.classList.add(\"complete\")\n\n this.timeout = setTimeout(() => {\n this.element.classList.remove(\"complete\")\n }, 1500)\n }\n }\n}\n\nexport function useLoader(target) {\n const silent = target.closest(\"[hx-silent]\")\n if (silent) {\n return silent.getAttribute(\"hx-silent\") !== \"true\"\n }\n\n return true\n}\n\nexport default AjaxLoader\n","import htmx from \"htmx.org\"\n\nclass BulkModeration {\n constructor(options) {\n this.menu = options.menu ? document.querySelector(options.menu) : null\n this.form = options.form\n this.modal = options.modal\n this.actions = document.querySelectorAll(options.actions)\n this.selection = options.selection\n this.control = document.querySelector(options.button.selector)\n this.text = options.button.text\n\n this.update()\n this.registerEvents()\n this.registerActions()\n }\n\n registerActions = () => {\n this.actions.forEach((element) => {\n if (element.getAttribute(\"moderation-action\") === \"remove-selection\") {\n element.addEventListener(\"click\", this.onRemoveSelection)\n } else {\n element.addEventListener(\"click\", this.onAction)\n }\n })\n }\n\n onAction = (event) => {\n const form = document.querySelector(this.form)\n const data = {}\n\n new FormData(form).forEach((value, key) => {\n if (typeof data[key] === \"undefined\") {\n data[key] = []\n }\n data[key].push(value)\n })\n\n const target = event.target\n data.moderation = target.getAttribute(\"moderation-action\")\n\n if (target.getAttribute(\"moderation-multistage\") === \"true\") {\n htmx\n .ajax(\"POST\", document.location.href, {\n target: this.modal,\n swap: \"innerHTML\",\n values: data,\n })\n .then(() => {\n $(this.modal).modal(\"show\")\n })\n } else {\n htmx.ajax(\"POST\", document.location.href, {\n target: \"#misago-htmx-root\",\n swap: \"outerHTML\",\n values: data,\n })\n }\n }\n\n onRemoveSelection = (event) => {\n document.querySelectorAll(this.selection).forEach((element) => {\n element.checked = false\n })\n this.update()\n }\n\n registerEvents = () => {\n document.body.addEventListener(\"click\", ({ target }) => {\n if (target.tagName === \"INPUT\" && target.type === \"checkbox\") {\n this.update()\n }\n })\n\n htmx.onLoad(() => this.update())\n }\n\n update = () => {\n const selection = document.querySelectorAll(this.selection).length\n\n this.control.innerText = this.text.replace(\"%(number)s\", selection)\n this.control.disabled = !selection\n\n if (this.menu) {\n if (selection) {\n this.menu.classList.add(\"visible\")\n } else {\n this.menu.classList.remove(\"visible\")\n }\n }\n }\n}\n\nexport default BulkModeration\n","import htmx from \"htmx.org\"\n\nconst DEBOUNCE = 1000\n\nconst cache = {}\n\nexport function registerElementValidator(element) {\n const active = element.getAttribute(\"misago-validate-active\")\n if (active) {\n return\n }\n\n const url = element.getAttribute(\"misago-validate\")\n const user = element.getAttribute(\"misago-validate-user\")\n const strip =\n element.getAttribute(\"misago-validate-strip\") == \"false\" ? false : true\n const input = element.querySelector(\"input\")\n const csrf = input.closest(\"form\").querySelector(\"input[type=hidden]\")\n\n if (!url || !input) {\n return\n }\n\n if (!cache[url]) {\n cache[url] = {}\n }\n\n element.setAttribute(\"misago-validate-active\", \"true\")\n\n let timeout = null\n\n input.addEventListener(\"keyup\", (event) => {\n let value = event.target.value\n if (strip) {\n value = value.trim()\n }\n\n if (value.trim().length === 0) {\n clearFormControlValidationState(element)\n return\n }\n\n if (cache[url][value]) {\n setFormControlValidationState(element, input, cache[url][value])\n } else {\n if (timeout) {\n window.clearTimeout(timeout)\n }\n\n timeout = window.setTimeout(async () => {\n const { errors } = await callValidationUrl(url, csrf, value, user)\n cache[url][value] = errors\n setFormControlValidationState(element, input, errors)\n }, DEBOUNCE)\n }\n })\n}\n\nfunction setFormControlValidationState(element, input, errors) {\n if (errors.length) {\n setFormControlErrorValidationState(element, input, errors)\n } else {\n setFormControlSuccessValidationState(element)\n }\n}\n\nfunction setFormControlErrorValidationState(element, input, errors) {\n element.classList.remove(\"has-success\")\n element.classList.add(\"has-error\")\n\n clearFormControlValidationMessages(element)\n\n errors.forEach((error) => {\n const message = document.createElement(\"p\")\n message.className = \"help-block\"\n message.setAttribute(\"misago-dynamic-message\", \"true\")\n message.innerText = error\n input.after(message)\n })\n}\n\nfunction setFormControlSuccessValidationState(element) {\n element.classList.remove(\"has-error\")\n element.classList.add(\"has-success\")\n\n clearFormControlValidationMessages(element)\n}\n\nfunction clearFormControlValidationState(element) {\n element.classList.remove(\"has-error\")\n element.classList.remove(\"has-success\")\n\n clearFormControlValidationMessages(element)\n}\n\nfunction clearFormControlValidationMessages(element) {\n element\n .querySelectorAll(\"[misago-dynamic-message]\")\n .forEach((i) => i.remove())\n}\n\nasync function callValidationUrl(url, csrf, value, user) {\n const data = new FormData()\n data.set(csrf.name, csrf.value)\n data.set(\"value\", value)\n if (user) {\n data.set(\"user\", user)\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n mode: \"cors\",\n credentials: \"same-origin\",\n body: data,\n })\n return await response.json()\n}\n\nexport function registerValidators(element) {\n const target = element || document\n target.querySelectorAll(\"[misago-validate]\").forEach(registerElementValidator)\n}\n\nhtmx.onLoad(registerValidators)\n","import htmx from \"htmx.org\"\n\nconst SNACKBAR_TTL = 6\n\nconst container = document.getElementById(\"misago-snackbars\")\nlet timeout = null\n\nexport function removeSnackbars() {\n container.replaceChildren()\n}\n\nfunction renderSnackbars() {\n if (timeout) {\n window.clearTimeout(timeout)\n }\n\n container.querySelectorAll(\".snackbar\").forEach((element) => {\n element.classList.add(\"in\")\n })\n\n timeout = window.setTimeout(() => {\n container.querySelectorAll(\".snackbar\").forEach((element) => {\n element.classList.add(\"out\")\n timeout = window.setTimeout(removeSnackbars, 1000)\n })\n }, SNACKBAR_TTL * 1000)\n}\n\nexport function snackbar(type, message) {\n removeSnackbars()\n\n if (timeout) {\n window.clearTimeout(timeout)\n }\n\n const element = document.createElement(\"div\")\n element.classList.add(\"snackbar\")\n element.classList.add(\"snackbar-\" + type)\n element.innerText = message\n element.role = \"alert\"\n container.appendChild(element)\n\n timeout = window.setTimeout(renderSnackbars, 100)\n}\n\nexport function info(message) {\n snackbar(\"info\", message)\n}\n\nexport function success(message) {\n snackbar(\"success\", message)\n}\n\nexport function warning(message) {\n snackbar(\"warning\", message)\n}\n\nexport function error(message) {\n snackbar(\"danger\", message)\n}\n\nhtmx.onLoad(renderSnackbars)\n","import { error } from \"./snackbars\"\n\nfunction handleResponseError(event) {\n if (isEventVisible(event)) {\n const message = getResponseErrorMessage(event.detail.xhr)\n error(message)\n }\n}\n\nfunction getResponseErrorMessage(xhr) {\n if (xhr.getResponseHeader(\"content-type\") === \"application/json\") {\n const data = JSON.parse(xhr.response)\n if (data.error) {\n return data.error\n }\n }\n\n if (xhr.status === 404) {\n return pgettext(\"htmx response error\", \"Page not found\")\n }\n\n if (xhr.status === 403) {\n return pgettext(\"htmx response error\", \"Permission denied\")\n }\n\n return pgettext(\"htmx response error\", \"Unexpected error\")\n}\n\nfunction handleSendError(event) {\n if (isEventVisible(event)) {\n const message = pgettext(\"htmx response error\", \"Site could not be reached.\")\n error(message)\n }\n}\n\nfunction handleTimeoutError(event) {\n if (isEventVisible(event)) {\n const message = pgettext(\n \"htmx response error\",\n \"Site took too long to reply\"\n )\n error(message)\n }\n}\n\nfunction isEventVisible({ detail }) {\n const silent = getEventTargetSilentAttr(detail.target)\n return !(silent === \"true\" && detail.requestConfig.verb === \"get\")\n}\n\nfunction getEventTargetSilentAttr(target) {\n const element = target.closest(\"[hx-silent]\")\n if (element) {\n return element.getAttribute(\"hx-silent\")\n }\n return null\n}\n\nexport function setupHtmxErrors() {\n document.addEventListener(\"htmx:responseError\", handleResponseError)\n document.addEventListener(\"htmx:sendError\", handleSendError)\n document.addEventListener(\"htmx:timeout\", handleTimeoutError)\n}\n\nsetupHtmxErrors()\n","import htmx from \"htmx.org\"\n\nimport { dateRelative, dateRelativeShort, fullDateTime } from \"./formats\"\n\nconst cache = {}\n\nexport function updateTimestamp(element) {\n const timestamp = element.getAttribute(\"misago-timestamp\")\n if (!cache[timestamp]) {\n cache[timestamp] = new Date(timestamp)\n }\n\n if (!element.hasAttribute(\"misago-timestamp-title\")) {\n element.setAttribute(\"misago-timestamp-title\", \"true\")\n element.setAttribute(\"title\", fullDateTime.format(cache[timestamp]))\n }\n\n const format = element.getAttribute(\"misago-timestamp-format\")\n\n if (format == \"short\") {\n element.textContent = dateRelativeShort(cache[timestamp])\n } else {\n element.textContent = dateRelative(cache[timestamp])\n }\n}\n\nexport function startLiveTimestamps() {\n document.querySelectorAll(\"[misago-timestamp]\").forEach(updateTimestamp)\n\n updateLiveTimestamps()\n window.setInterval(updateLiveTimestamps, 1000 * 55)\n}\n\nexport function updateLiveTimestamps(element) {\n const target = element || document\n target.querySelectorAll(\"[misago-timestamp]\").forEach(updateTimestamp)\n}\n\nstartLiveTimestamps()\nhtmx.onLoad(updateLiveTimestamps)\n","import \"bootstrap/js/transition\"\nimport \"bootstrap/js/affix\"\nimport \"bootstrap/js/modal\"\nimport \"bootstrap/js/dropdown\"\nimport \"at-js\"\nimport \"cropit\"\nimport \"jquery-caret\"\nimport htmx from \"htmx.org\"\nimport OrderedList from \"misago/utils/ordered-list\"\nimport \"misago/style/index.less\"\nimport AjaxLoader, { useLoader } from \"./AjaxLoader\"\nimport BulkModeration from \"./BulkModeration\"\nimport \"./formValidators\"\nimport \"./htmxErrors\"\nimport \"./liveTimestamps\"\nimport * as snackbars from \"./snackbars\"\n\nconst loader = new AjaxLoader()\n\nexport class Misago {\n constructor() {\n this._initializers = []\n this._context = {}\n\n this.loader = loader\n }\n\n addInitializer(initializer) {\n this._initializers.push({\n key: initializer.name,\n\n item: initializer.initializer,\n\n after: initializer.after,\n before: initializer.before,\n })\n }\n\n init(context) {\n this._context = context\n\n var initOrder = new OrderedList(this._initializers).orderedValues()\n initOrder.forEach((initializer) => {\n initializer(this)\n })\n }\n\n // context accessors\n has(key) {\n return !!this._context[key]\n }\n\n get(key, fallback) {\n if (this.has(key)) {\n return this._context[key]\n } else {\n return fallback || undefined\n }\n }\n\n pop(key) {\n if (this.has(key)) {\n let value = this._context[key]\n this._context[key] = null\n return value\n } else {\n return undefined\n }\n }\n\n snackbar(type, message) {\n snackbars.snackbar(type, message)\n }\n\n snackbarInfo(message) {\n snackbars.info(message)\n }\n\n snackbarSuccess(message) {\n snackbars.success(message)\n }\n\n snackbarWarning(message) {\n snackbars.warning(message)\n }\n\n snackbarError(message) {\n snackbars.error(message)\n }\n\n bulkModeration(options) {\n return new BulkModeration(options)\n }\n}\n\n// create the singleton\nconst misago = new Misago()\n\n// expose it globally\nwindow.misago = misago\n\n// and export it for tests and stuff\nexport default misago\n\n// Register ajax loader events\ndocument.addEventListener(\"htmx:beforeRequest\", ({ target }) => {\n if (useLoader(target)) {\n loader.show()\n }\n})\n\ndocument.addEventListener(\"htmx:afterRequest\", ({ target }) => {\n if (useLoader(target)) {\n loader.hide()\n }\n})\n\n// Hide moderation modal after moderation action completes\ndocument.addEventListener(\"misago:afterModeration\", () => {\n $(\"#threads-moderation-modal\").modal(\"hide\")\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\n\nexport default function initializer() {\n ajax.init(misago.get(\"CSRF_COOKIE_NAME\"))\n}\n\nmisago.addInitializer({\n name: \"ajax\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport { patch } from \"misago/reducers/auth\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nconst AUTH_SYNC_RATE = 45 // sync user with backend every 45 seconds\n\nexport default function initializer(context) {\n if (context.get(\"isAuthenticated\")) {\n window.setInterval(function () {\n ajax.get(context.get(\"AUTH_API\")).then(\n function (data) {\n store.dispatch(patch(data))\n },\n function (rejection) {\n snackbar.apiError(rejection)\n }\n )\n }, AUTH_SYNC_RATE * 1000)\n }\n}\n\nmisago.addInitializer({\n name: \"auth-sync\",\n initializer: initializer,\n after: \"auth\",\n})\n","import misago from \"misago/index\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport store from \"misago/services/store\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n auth.init(store, storage, modal)\n}\n\nmisago.addInitializer({\n name: \"auth\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport captcha from \"misago/services/captcha\"\nimport include from \"misago/services/include\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer(context) {\n captcha.init(context, ajax, include, snackbar)\n}\n\nmisago.addInitializer({\n name: \"captcha\",\n initializer: initializer,\n})\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class AcceptAgreement extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = { submiting: false }\n }\n\n handleDecline = () => {\n if (this.state.submiting) return\n\n const confirmation = window.confirm(\n pgettext(\n \"accept agreement prompt\",\n \"Declining will result in immediate deactivation and deletion of your account. This action is not reversible.\"\n )\n )\n if (!confirmation) return\n\n this.setState({ submiting: true })\n\n ajax.post(this.props.api, { accept: false }).then(() => {\n window.location.reload(true)\n })\n }\n\n handleAccept = () => {\n if (this.state.submiting) return\n\n this.setState({ submiting: true })\n\n ajax.post(this.props.api, { accept: true }).then(() => {\n window.location.reload(true)\n })\n }\n\n render() {\n return (\n
    \n \n {pgettext(\"accept agreement choice\", \"Decline\")}\n \n \n {pgettext(\"accept agreement choice\", \"Accept and continue\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport AcceptAgreement from \"misago/components/accept-agreement\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n if (document.getElementById(\"required-agreement-mount\")) {\n mount(\n ,\n \"required-agreement-mount\",\n false\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:accept-agreement\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nexport default class extends React.Component {\n refresh() {\n window.location.reload()\n }\n\n getMessage() {\n if (this.props.signedIn) {\n return interpolate(\n pgettext(\n \"auth message\",\n \"You have signed in as %(username)s. Please refresh the page before continuing.\"\n ),\n { username: this.props.signedIn.username },\n true\n )\n } else if (this.props.signedOut) {\n return interpolate(\n pgettext(\n \"auth message\",\n \"%(username)s, you have been signed out. Please refresh the page before continuing.\"\n ),\n { username: this.props.user.username },\n true\n )\n }\n }\n\n render() {\n let className = \"auth-message\"\n if (this.props.signedIn || this.props.signedOut) {\n className += \" show\"\n }\n\n return (\n
    \n
    \n

    {this.getMessage()}

    \n

    \n \n {pgettext(\"auth message\", \"Reload page\")}\n \n \n {\" \" + pgettext(\"auth message\", \"or press F5 key.\")}\n \n

    \n
    \n
    \n )\n }\n}\n\nexport function select(state) {\n return {\n user: state.auth.user,\n signedIn: state.auth.signedIn,\n signedOut: state.auth.signedOut,\n }\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport AuthMessage, { select } from \"misago/components/auth-message\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(AuthMessage), \"auth-message-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:auth-message\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default function initializer(context) {\n if (context.has(\"BAN_MESSAGE\")) {\n showBannedPage(context.get(\"BAN_MESSAGE\"), false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:banmed-page\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport modal from \"../services/modal\"\nimport SignInModal from \"./sign-in\"\n\nclass SignInModalAutoOpen extends React.Component {\n componentDidMount() {\n const query = window.document.location.search\n if (query === \"?modal=login\") {\n window.setTimeout(() => modal.show(), 300)\n }\n }\n\n render() {\n return null\n }\n}\n\nexport default SignInModalAutoOpen\n","import React from \"react\"\n\nexport default function NavbarBranding({ logo, logoXs, text, url }) {\n if (logo) {\n return (\n
    \n \n {text}\n \n
    \n )\n }\n\n return (\n
    \n {!!logoXs && (\n \n {text}\n \n )}\n {!!text && (\n \n {text}\n \n )}\n
    \n )\n}\n","import React from \"react\"\n\nexport default function NavbarExtraMenu({ items }) {\n return (\n
      \n {items.map((item, index) => (\n
    • \n \n {item.title}\n \n
    • \n ))}\n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { DropdownFooter, DropdownHeader, DropdownPills } from \"../Dropdown\"\n\nexport default function NotificationsDropdownBody({\n children,\n showAll,\n showUnread,\n unread,\n}) {\n return (\n
    \n \n {pgettext(\"notifications title\", \"Notifications\")}\n \n \n \n {pgettext(\"notifications dropdown\", \"All\")}\n \n \n {pgettext(\"notifications dropdown\", \"Unread\")}\n \n \n {children}\n \n \n {pgettext(\"notifications\", \"See all notifications\")}\n \n \n
    \n )\n}\n\nfunction NotificationsDropdownBodyPill({ active, children, onClick }) {\n return (\n \n {children}\n \n )\n}\n","import NotificationsDropdown from \"./NotificationsDropdown\"\n\nexport default NotificationsDropdown\n","import React from \"react\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport {\n NotificationsList,\n NotificationsListError,\n NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsDropdownBody from \"./NotificationsDropdownBody\"\n\nexport default class NotificationsDropdown extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n unread: false,\n url: \"\",\n }\n }\n\n getApiUrl() {\n let url = misago.get(\"NOTIFICATIONS_API\") + \"?limit=20\"\n url += this.state.unread ? \"&filter=unread\" : \"\"\n return url\n }\n\n render = () => (\n this.setState({ unread: false })}\n showUnread={() => this.setState({ unread: true })}\n >\n \n {({ data, loading, error }) => {\n if (loading) {\n return \n }\n\n if (error) {\n return \n }\n\n return (\n \n )\n }}\n \n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarNotificationsToggle({\n id,\n className,\n badge,\n url,\n active,\n onClick,\n}) {\n const title = !!badge\n ? pgettext(\"navbar\", \"You have unread notifications!\")\n : pgettext(\"navbar\", \"Open notifications\")\n\n return (\n \n {!!badge && {badge}}\n \n {!!badge ? \"notifications_active\" : \"notifications_none\"}\n \n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NotificationsDropdown from \"../NotificationsDropdown\"\nimport NavbarNotificationsToggle from \"./NavbarNotificationsToggle\"\n\nexport default function NavbarNotificationsDropdown({\n id,\n className,\n badge,\n url,\n}) {\n return (\n (\n {\n event.preventDefault()\n toggle()\n }}\n />\n )}\n menuClassName=\"notifications-dropdown\"\n menuAlignRight\n >\n {({ isOpen }) => }\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarPrivateThreads({\n id,\n className,\n badge,\n url,\n active,\n onClick,\n}) {\n const title = !!badge\n ? pgettext(\"navbar\", \"You have unread private threads!\")\n : pgettext(\"navbar\", \"Open private threads\")\n\n return (\n \n {!!badge && {badge}}\n inbox\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarSearchToggle({\n id,\n className,\n url,\n active,\n onClick,\n}) {\n return (\n \n search\n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport { SearchDropdown } from \"../Search\"\nimport NavbarSearchToggle from \"./NavbarSearchToggle\"\n\nexport default function NavbarSearchDropdown({ id, className, url }) {\n return (\n (\n {\n event.preventDefault()\n toggle()\n\n window.setTimeout(() => {\n document\n .querySelector(\".search-dropdown .form-control-search\")\n .focus()\n }, 0)\n }}\n />\n )}\n menuClassName=\"search-dropdown\"\n menuAlignRight\n >\n {() => }\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarSiteNavToggle({\n id,\n className,\n active,\n onClick,\n}) {\n return (\n \n menu\n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NavbarSiteNavToggle from \"./NavbarSiteNavToggle\"\nimport { SiteNavDropdown } from \"../SiteNav\"\n\nexport default function NavbarSiteNavDropdown({ id, className }) {\n return (\n (\n \n )}\n menuClassName=\"site-nav-dropdown\"\n menuAlignRight\n >\n {({ isOpen, close }) => }\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport Avatar from \"../avatar\"\n\nexport default function NavbarUserNavToggle({\n id,\n className,\n user,\n active,\n onClick,\n}) {\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NavbarUserNavToggle from \"./NavbarUserNavToggle\"\nimport { UserNavDropdown } from \"../UserNav\"\n\nexport default function NavbarUserNavDropdown({ id, className, user }) {\n return (\n (\n {\n event.preventDefault()\n toggle()\n }}\n />\n )}\n menuClassName=\"user-nav-dropdown\"\n menuAlignRight\n >\n {({ isOpen, close }) => }\n \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport * as overlay from \"../../reducers/overlay\"\nimport RegisterButton from \"../RegisterButton\"\nimport SignInButton from \"../SignInButton\"\nimport SignInModalAutoOpen from \"../SignInModalAutoOpen\"\nimport NavbarBranding from \"./NavbarBranding\"\nimport NavbarExtraMenu from \"./NavbarExtraMenu\"\nimport NavbarNotificationsDropdown from \"./NavbarNotificationsDropdown\"\nimport NavbarNotificationsToggle from \"./NavbarNotificationsToggle\"\nimport NavbarPrivateThreads from \"./NavbarPrivateThreads\"\nimport NavbarSearchDropdown from \"./NavbarSearchDropdown\"\nimport NavbarSearchToggle from \"./NavbarSearchToggle\"\nimport NavbarSiteNavDropdown from \"./NavbarSiteNavDropdown\"\nimport NavbarSiteNavToggle from \"./NavbarSiteNavToggle\"\nimport NavbarUserNavDropdown from \"./NavbarUserNavDropdown\"\nimport NavbarUserNavToggle from \"./NavbarUserNavToggle\"\n\nexport function Navbar({\n dispatch,\n branding,\n extraMenuItems,\n authDelegated,\n user,\n searchUrl,\n notificationsUrl,\n privateThreadsUrl,\n showSearch,\n showPrivateThreads,\n}) {\n return (\n
    \n \n
    \n {extraMenuItems.length > 0 && (\n \n )}\n {!!showSearch && (\n \n )}\n {!!showSearch && (\n {\n dispatch(overlay.openSearch())\n event.preventDefault()\n }}\n />\n )}\n \n {\n dispatch(overlay.openSiteNav())\n }}\n />\n {!!showPrivateThreads && (\n \n )}\n {!!user && (\n \n )}\n {!!user && (\n {\n dispatch(overlay.openNotifications())\n event.preventDefault()\n }}\n />\n )}\n {!!user && (\n \n )}\n {!!user && (\n {\n dispatch(overlay.openUserNav())\n event.preventDefault()\n }}\n />\n )}\n {!user && }\n {!user && !authDelegated && (\n \n )}\n {!user && !authDelegated && }\n
    \n
    \n )\n}\n\nfunction select(state) {\n const settings = misago.get(\"SETTINGS\")\n const user = state.auth.user\n\n return {\n branding: {\n logo: settings.logo,\n logoXs: settings.logo_small,\n text: settings.logo_text,\n url: misago.get(\"MISAGO_PATH\"),\n },\n extraMenuItems: misago.get(\"extraMenuItems\"),\n\n user: !user.id\n ? null\n : {\n id: user.id,\n username: user.username,\n email: user.email,\n avatars: user.avatars,\n unreadNotifications: user.unreadNotifications,\n unreadPrivateThreads: user.unread_private_threads,\n url: user.url,\n },\n\n searchUrl: misago.get(\"SEARCH_URL\"),\n notificationsUrl: misago.get(\"NOTIFICATIONS_URL\"),\n privateThreadsUrl: misago.get(\"PRIVATE_THREADS_URL\"),\n\n authDelegated: settings.enable_oauth2_client,\n showSearch: !!user.acl.can_search,\n showPrivateThreads: !!user && !!user.acl.can_use_private_threads,\n }\n}\n\nconst NavbarConnected = connect(select)(Navbar)\n\nexport default NavbarConnected\n","import Navbar from \"./Navbar\"\n\nexport default Navbar\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport Navbar from \"../../components/Navbar\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"misago-navbar\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:navbar\",\n initializer: initializer,\n after: \"store\",\n})\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { DropdownFooter, DropdownPills } from \"../Dropdown\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\n\nexport default function NotificationsOverlayBody({\n children,\n open,\n showAll,\n showUnread,\n unread,\n}) {\n return (\n \n \n {pgettext(\"notifications title\", \"Notifications\")}\n \n \n \n {pgettext(\"notifications dropdown\", \"All\")}\n \n \n {pgettext(\"notifications dropdown\", \"Unread\")}\n \n \n {children}\n \n \n {pgettext(\"notifications\", \"See all notifications\")}\n \n \n \n )\n}\n\nfunction NotificationsOverlayBodyPill({ active, children, onClick }) {\n return (\n \n {children}\n \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport {\n NotificationsList,\n NotificationsListError,\n NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsOverlayBody from \"./NotificationsOverlayBody\"\n\nclass NotificationsOverlay extends React.Component {\n constructor(props) {\n super(props)\n\n this.body = document.body\n\n this.state = {\n unread: false,\n url: \"\",\n }\n }\n\n getApiUrl() {\n let url = misago.get(\"NOTIFICATIONS_API\") + \"?limit=20\"\n url += this.state.unread ? \"&filter=unread\" : \"\"\n return url\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.open !== this.props.open) {\n if (this.props.open) {\n this.body.classList.add(\"notifications-fullscreen\")\n } else {\n this.body.classList.remove(\"notifications-fullscreen\")\n }\n }\n }\n\n render = () => (\n this.setState({ unread: false })}\n showUnread={() => this.setState({ unread: true })}\n >\n \n {({ data, loading, error }) => {\n if (loading) {\n return \n }\n\n if (error) {\n return \n }\n\n return (\n \n )\n }}\n \n \n )\n}\n\nfunction select(state) {\n return { open: state.overlay.notifications }\n}\n\nconst NotificationsOverlayConnected = connect(select)(NotificationsOverlay)\n\nexport default NotificationsOverlayConnected\n","import NotificationsOverlay from \"./NotificationsOverlay\"\n\nexport default NotificationsOverlay\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport NotificationsOverlay from \"../../components/NotificationsOverlay\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n if (context.get(\"isAuthenticated\")) {\n const root = document.getElementById(\"notifications-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:notifications-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport { PageHeaderPlain } from \"../PageHeader\"\n\nexport default function NotificationsHeader() {\n return (\n \n )\n}\n","import PageTitle from \"./PageTitle\"\n\nexport default PageTitle\n","export default function PageTitle({ title, subtitle }) {\n const parts = []\n if (subtitle) {\n parts.push(subtitle)\n }\n if (title) {\n parts.push(title)\n }\n parts.push(misago.get(\"SETTINGS\").forum_name)\n\n document.title = parts.join(\" | \")\n return null\n}\n","import React from \"react\"\n\nexport default function PillsNav({ children }) {\n return
      {children}
    \n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function PillsNavLink({ active, link, icon, children }) {\n return (\n
  • \n \n {!!icon && {icon}}\n {children}\n \n
  • \n )\n}\n","import React from \"react\"\nimport { PillsNav, PillsNavLink } from \"../PillsNav\"\nimport { Toolbar, ToolbarSection, ToolbarItem } from \"../Toolbar\"\n\nexport default function NotificationsPills({ filter }) {\n const basename = misago.get(\"NOTIFICATIONS_URL\")\n\n return (\n \n \n \n \n \n {pgettext(\"notifications nav\", \"All\")}\n \n \n {pgettext(\"notifications nav\", \"Unread\")}\n \n \n {pgettext(\"notifications nav\", \"Read\")}\n \n \n \n \n \n )\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function NotificationsPagination({ baseUrl, data, disabled }) {\n return (\n
    \n \n {pgettext(\"notifications pagination\", \"Latest\")}\n \n \n {pgettext(\"notifications pagination\", \"Newer\")}\n \n \n {pgettext(\"notifications pagination\", \"Older\")}\n \n
    \n )\n}\n\nfunction NotificationsPaginationLink({ disabled, children, url }) {\n if (disabled) {\n return (\n \n )\n }\n\n return (\n \n {children}\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport Button from \"../button\"\nimport { Toolbar, ToolbarSection, ToolbarItem, ToolbarSpacer } from \"../Toolbar\"\nimport NotificationsPagination from \"./NotificationsPagination\"\n\nexport default function NotificationsToolbar({\n baseUrl,\n data,\n disabled,\n bottom,\n markAllAsRead,\n}) {\n return (\n \n \n \n \n \n \n \n \n \n \n done_all\n {pgettext(\"notifications\", \"Mark all as read\")}\n \n \n \n \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { updateAuthenticatedUser } from \"../../reducers/auth\"\nimport snackbar from \"../../services/snackbar\"\nimport { ApiMutation } from \"../Api\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport PageTitle from \"../PageTitle\"\nimport PageContainer from \"../PageContainer\"\nimport {\n NotificationsList,\n NotificationsListError,\n NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsPills from \"./NotificationsPills\"\nimport NotificationsToolbar from \"./NotificationsToolbar\"\n\nfunction NotificationsRoute({ dispatch, location, route }) {\n const { query } = location\n const { filter } = route.props\n\n const baseUrl = getBaseUrl(filter)\n\n return (\n \n \n\n \n\n \n {({ data, loading, error, refetch }) => (\n \n {(readAll, { loading: mutating }) => {\n const toolbarProps = {\n baseUrl,\n data,\n disabled:\n loading || mutating || !data || data.results.length === 0,\n markAllAsRead: async () => {\n const confirmed = window.confirm(\n pgettext(\"notifications\", \"Mark all notifications as read?\")\n )\n\n if (confirmed) {\n readAll({\n onSuccess: async () => {\n refetch()\n dispatch(\n updateAuthenticatedUser({ unreadNotifications: null })\n )\n snackbar.success(\n pgettext(\n \"notifications\",\n \"All notifications have been marked as read.\"\n )\n )\n },\n onError: snackbar.apiError,\n })\n }\n },\n }\n\n if (loading || mutating) {\n return (\n
    \n \n \n \n
    \n )\n }\n\n if (error) {\n return (\n
    \n \n \n \n
    \n )\n }\n\n if (data) {\n if (!data.hasPrevious && query) {\n window.history.replaceState({}, \"\", baseUrl)\n }\n\n return (\n
    \n \n \n \n
    \n )\n }\n\n return null\n }}\n
    \n )}\n
    \n
    \n )\n}\n\nfunction getSubtitle(filter) {\n if (filter === \"unread\") {\n return pgettext(\"notifications title\", \"Unread notifications\")\n } else if (filter === \"read\") {\n return pgettext(\"notifications title\", \"Read notifications\")\n } else {\n return null\n }\n}\n\nfunction getBaseUrl(filter) {\n let url = misago.get(\"NOTIFICATIONS_URL\")\n if (filter !== \"all\") {\n url += filter + \"/\"\n }\n return url\n}\n\nconst NotificationsRouteConnected = connect()(NotificationsRoute)\n\nexport default NotificationsRouteConnected\n","import Notifications from \"./Notifications\"\nimport NotificationsFetch from \"../NotificationsFetch/NotificationsFetch\"\n\nexport default Notifications\n\nexport { NotificationsFetch }\n","import React from \"react\"\nimport { Router, browserHistory } from \"react-router\"\nimport NotificationsHeader from \"./NotificationsHeader\"\nimport NotificationsRoute from \"./NotificationsRoute\"\n\nexport default function Notifications() {\n const basename = misago.get(\"NOTIFICATIONS_URL\")\n\n return (\n
    \n \n \n
    \n )\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport Notifications from \"../../components/Notifications\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const basename = misago.get(\"NOTIFICATIONS_URL\")\n if (\n document.location.pathname.startsWith(basename) &&\n !document.location.pathname.startsWith(basename + \"disable-email/\") &&\n context.get(\"isAuthenticated\")\n ) {\n const root = document.getElementById(\"page-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:notifications\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n \n
    \n )\n }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport PanelLoader from \"misago/components/panel-loader\"\nimport PanelMessage from \"misago/components/panel-message\"\nimport misago from \"misago/index\"\nimport polls from \"misago/services/polls\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"PROFILE_BAN\")) {\n this.initWithPreloadedData(misago.pop(\"PROFILE_BAN\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling(props.profile.api.ban)\n }\n\n initWithPreloadedData(ban) {\n if (ban.expires_on) {\n ban.expires_on = moment(ban.expires_on)\n }\n\n this.state = {\n isLoaded: true,\n ban,\n }\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling(api) {\n polls.start({\n poll: \"ban-details\",\n url: api,\n frequency: 90 * 1000,\n update: this.update,\n error: this.error,\n })\n }\n\n update = (ban) => {\n if (ban.expires_on) {\n ban.expires_on = moment(ban.expires_on)\n }\n\n this.setState({\n isLoaded: true,\n error: null,\n\n ban,\n })\n }\n\n error = (error) => {\n this.setState({\n isLoaded: true,\n error: error.detail,\n ban: null,\n })\n }\n\n componentDidMount() {\n title.set({\n title: pgettext(\"profile ban details title\", \"Ban details\"),\n parent: this.props.profile.username,\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"ban-details\")\n }\n\n getUserMessage() {\n if (this.state.ban.user_message) {\n return (\n
    \n

    {pgettext(\"profile ban details\", \"User-shown ban message\")}

    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getStaffMessage() {\n if (this.state.ban.staff_message) {\n return (\n
    \n

    {pgettext(\"profile ban details\", \"Team-shown ban message\")}

    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getExpirationMessage() {\n if (this.state.ban.expires_on) {\n if (this.state.ban.expires_on.isAfter(moment())) {\n let title = interpolate(\n pgettext(\n \"profile ban details\",\n \"This ban expires on %(expires_on)s.\"\n ),\n {\n expires_on: this.state.ban.expires_on.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n pgettext(\"profile ban details\", \"This ban expires %(expires_on)s.\"),\n {\n expires_on: this.state.ban.expires_on.fromNow(),\n },\n true\n )\n\n return {message}\n } else {\n return pgettext(\"profile ban details\", \"This ban has expired.\")\n }\n } else {\n return interpolate(\n pgettext(\"profile ban details\", \"%(username)s's ban is permanent.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getPanelBody() {\n if (this.state.ban) {\n if (Object.keys(this.state.ban).length) {\n return (\n
    \n {this.getUserMessage()}\n {this.getStaffMessage()}\n\n
    \n

    {pgettext(\"profile ban details\", \"Ban expiration\")}

    \n

    {this.getExpirationMessage()}

    \n
    \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n } else if (this.state.error) {\n return (\n
    \n \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n

    \n {pgettext(\"profile ban details title\", \"Ban details\")}\n

    \n
    \n\n {this.getPanelBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default function ({ display }) {\n if (!display) return null\n\n return (\n \n )\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({ display }) {\n if (!display) return null\n\n return (\n
    \n \n
    \n )\n}\n","import React from \"react\"\nimport Select from \"misago/components/select\"\n\nexport default class extends React.Component {\n onChange = (ev) => {\n const { field, onChange } = this.props\n onChange(field.fieldname, ev.target.value)\n }\n\n render() {\n const { disabled, field, value } = this.props\n const { input } = field\n\n if (input.type === \"select\") {\n return (\n \n )\n }\n\n if (input.type === \"textarea\") {\n return (\n \n )\n }\n\n if (input.type === \"text\") {\n return (\n \n )\n }\n\n return null\n }\n}\n","import React from \"react\"\nimport FieldInput from \"./field-input\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport default function ({ disabled, errors, fields, name, onChange, value }) {\n return (\n
    \n {name}\n {fields.map((field) => {\n return (\n \n \n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Fieldset from \"./fieldset\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n errors: {},\n }\n\n const groups = props.groups.length\n for (let i = 0; i < groups; i++) {\n const group = props.groups[i]\n const fields = group.fields.length\n for (let f = 0; f < fields; f++) {\n const fieldname = group.fields[f].fieldname\n const initial = group.fields[f].initial\n this.state[fieldname] = initial\n }\n }\n }\n\n send() {\n const data = Object.assign({}, this.state, {\n errors: null,\n isLoading: null,\n })\n\n return ajax.post(this.props.api, data)\n }\n\n handleSuccess(data) {\n this.props.onSuccess(data)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({ errors: rejection })\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onChange = (name, value) => {\n this.setState({\n [name]: value,\n })\n }\n\n render() {\n return (\n
    \n
    \n {this.props.groups.map((group, i) => {\n return (\n \n )\n })}\n
    \n
    \n {\" \"}\n \n
    \n
    \n )\n }\n}\n\nexport function CancelButton({ onCancel, disabled }) {\n if (!onCancel) return null\n\n return (\n \n {pgettext(\"user profile details form btn\", \"Cancel\")}\n \n )\n}\n","import React from \"react\"\nimport Blankslate from \"./blankslate\"\nimport Loader from \"./loader\"\nimport Form from \"./form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n loading: true,\n groups: null,\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.api).then(\n (groups) => {\n this.setState({\n loading: false,\n\n groups,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n if (this.props.cancel) {\n this.props.cancel()\n }\n }\n )\n }\n\n render() {\n const { groups, loading } = this.state\n\n return (\n
    \n
    \n

    \n {pgettext(\"user profile details form title\", \"Edit details\")}\n

    \n
    \n \n \n \n
    \n )\n }\n}\n\nexport function FormDisplay({ api, display, groups, onCancel, onSuccess }) {\n if (!display) return null\n\n return (\n
    \n )\n}\n","import React from \"react\"\nimport Form from \"misago/components/edit-details\"\n\nexport default function ({ api, display, onCancel, onSuccess }) {\n if (!display) return null\n\n return \n}\n","import React from \"react\"\n\nexport default function ({ isAuthenticated, profile }) {\n let message = null\n if (isAuthenticated) {\n message = pgettext(\n \"profile details empty\",\n \"You are not sharing any details with others.\"\n )\n } else {\n message = interpolate(\n pgettext(\n \"profile details empty\",\n \"%(username)s is not sharing any details with others.\"\n ),\n {\n username: profile.username,\n },\n true\n )\n }\n\n return (\n
    \n
    {message}
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ html, text, url }) {\n if (html) {\n return (\n \n )\n }\n\n return (\n
    \n \n
    \n )\n}\n\nexport function SafeValue({ text, url }) {\n if (url) {\n return (\n

    \n \n {text || url}\n \n

    \n )\n }\n\n if (text) {\n return

    {text}

    \n }\n\n return null\n}\n","import React from \"react\"\nimport FieldValue from \"./field-value\"\n\nexport default function (props) {\n return (\n
    \n {props.name}:\n \n
    \n )\n}\n","import React from \"react\"\nimport Field from \"./field\"\n\nexport default function ({ fields, name }) {\n return (\n
    \n
    \n

    {name}

    \n
    \n
    \n
    \n {fields.map(({ fieldname, html, name, text, url }) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport EmptyMessage from \"./empty-message\"\nimport Group from \"./group\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({\n display,\n groups,\n isAuthenticated,\n loading,\n profile,\n}) {\n if (!display) return null\n\n if (loading) {\n return \n }\n\n if (!groups.length) {\n return \n }\n\n return (\n
    \n {groups.map((group, i) => {\n return \n })}\n
    \n )\n}\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nconst ProfileDetailsHeader = ({ onEdit, showEditButton }) => (\n \n \n \n

    {pgettext(\"profile details title\", \"Details\")}

    \n
    \n
    \n {showEditButton && (\n \n \n \n {pgettext(\"profile details edit btn\", \"Edit\")}\n \n \n \n )}\n
    \n)\n\nexport default ProfileDetailsHeader\n","import React from \"react\"\nimport { load } from \"misago/reducers/profile-details\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n componentDidMount() {\n const { data, dispatch, user } = this.props\n if (data && data.id === user.id) return\n\n ajax.get(this.props.user.api.details).then(\n (data) => {\n dispatch(load(data))\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n return this.props.children\n }\n}\n","import React from \"react\"\nimport Form from \"./form\"\nimport GroupsList from \"./groups-list\"\nimport Header from \"./header\"\nimport ProfileDetailsData from \"misago/data/profile-details\"\nimport { load as loadDetails } from \"misago/reducers/profile-details\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n editing: false,\n }\n }\n\n componentDidMount() {\n title.set({\n title: pgettext(\"profile details title\", \"Details\"),\n parent: this.props.profile.username,\n })\n }\n\n onCancel = () => {\n this.setState({ editing: false })\n }\n\n onEdit = () => {\n this.setState({ editing: true })\n }\n\n onSuccess = (newDetails) => {\n const { dispatch, isAuthenticated, profile } = this.props\n\n let message = null\n if (isAuthenticated) {\n message = pgettext(\n \"profile details form\",\n \"Your details have been changed.\"\n )\n } else {\n message = interpolate(\n pgettext(\n \"profile details form\",\n \"%(username)s's details have been changed.\"\n ),\n {\n username: profile.username,\n },\n true\n )\n }\n\n snackbar.info(message)\n dispatch(loadDetails(newDetails))\n this.setState({ editing: false })\n }\n\n render() {\n const { dispatch, isAuthenticated, profile, profileDetails } = this.props\n const loading = profileDetails.id !== profile.id\n\n return (\n \n
    \n \n \n \n
    \n \n )\n }\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport * as posts from \"misago/reducers/posts\"\nimport title from \"misago/services/page-title\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n loadItems(start = 0) {\n ajax\n .get(this.props.api, {\n start: start || 0,\n })\n .then(\n (data) => {\n if (start === 0) {\n store.dispatch(posts.load(data))\n } else {\n store.dispatch(posts.append(data))\n }\n\n this.setState({\n isLoading: false,\n })\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.apiError(rejection)\n }\n )\n }\n\n loadMore = () => {\n this.setState({\n isLoading: true,\n })\n\n this.loadItems(this.props.posts.next)\n }\n\n componentDidMount() {\n title.set({\n title: this.props.title,\n parent: this.props.profile.username,\n })\n\n this.loadItems()\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.props.header}

    \n
    \n
    \n
    \n \n
    \n )\n }\n}\n\nexport function Feed(props) {\n if (props.posts.isLoaded && !props.posts.results.length) {\n return

    {props.emptyMessage}

    \n }\n\n return (\n
    \n \n \n
    \n )\n}\n\nexport function LoadMoreButton(props) {\n if (!props.next) return null\n\n return (\n
    \n \n {pgettext(\"profile load more btn\", \"Show older activity\")}\n \n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.className) {\n return \"form-search \" + this.props.className\n } else {\n return \"form-search\"\n }\n }\n\n render() {\n return (\n
    \n \n search\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsersList from \"misago/components/users-list\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.setSpecialProps()\n\n if (misago.has(this.PRELOADED_DATA_KEY)) {\n this.initWithPreloadedData(misago.pop(this.PRELOADED_DATA_KEY))\n } else {\n this.initWithoutPreloadedData()\n }\n }\n\n setSpecialProps() {\n this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWERS\"\n this.TITLE = pgettext(\"profile followers title\", \"Followers\")\n this.API_FILTER = \"followers\"\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n isBusy: false,\n\n search: \"\",\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n isBusy: false,\n\n search: \"\",\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n }\n\n this.loadUsers()\n }\n\n loadUsers(page = 1, search = null) {\n const apiUrl = this.props.profile.api[this.API_FILTER]\n\n ajax\n .get(\n apiUrl,\n {\n search: search,\n page: page || 1,\n },\n \"user-\" + this.API_FILTER\n )\n .then(\n (data) => {\n if (page === 1) {\n store.dispatch(hydrate(data.results))\n } else {\n store.dispatch(append(data.results))\n }\n\n this.setState({\n isLoaded: true,\n isBusy: false,\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n componentDidMount() {\n title.set({\n title: this.TITLE,\n parent: this.props.profile.username,\n })\n }\n\n loadMore = () => {\n this.setState({\n isBusy: true,\n })\n\n this.loadUsers(this.state.page + 1, this.state.search)\n }\n\n search = (ev) => {\n this.setState({\n isLoaded: false,\n isBusy: true,\n\n search: ev.target.value,\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n })\n\n this.loadUsers(1, ev.target.value)\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return pgettext(\"Loading...\")\n } else if (this.state.search) {\n let message = npgettext(\n \"profile followers\",\n \"Found %(users)s user.\",\n \"Found %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = npgettext(\n \"profile followers\",\n \"You have %(users)s follower.\",\n \"You have %(users)s followers.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else {\n let message = npgettext(\n \"profile followers\",\n \"%(username)s has %(users)s follower.\",\n \"%(username)s has %(users)s followers.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n users: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return pgettext(\n \"profile followers\",\n \"Search returned no users matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return pgettext(\"profile followers\", \"You have no followers.\")\n } else {\n return interpolate(\n pgettext(\"profile followers\", \"%(username)s has no followers.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getMoreButton() {\n if (!this.state.more) return null\n\n return (\n
    \n \n {interpolate(\n pgettext(\"profile followers\", \"Show more (%(more)s)\"),\n {\n more: this.state.more,\n },\n true\n )}\n \n
    \n )\n }\n\n getListBody() {\n if (this.state.isLoaded && this.state.count === 0) {\n return

    {this.getEmptyMessage()}

    \n }\n\n return (\n
    \n \n\n {this.getMoreButton()}\n
    \n )\n }\n\n getClassName() {\n return \"profile-\" + this.API_FILTER\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.getLabel()}

    \n
    \n
    \n \n \n \n \n \n
    \n\n {this.getListBody()}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Followers from \"misago/components/profile/followers\"\n\nexport default class extends Followers {\n setSpecialProps() {\n this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWS\"\n this.TITLE = pgettext(\"profile follows title\", \"Follows\")\n this.API_FILTER = \"follows\"\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return pgettext(\"profile follows\", \"Loading...\")\n } else if (this.state.search) {\n let message = npgettext(\n \"profile follows\",\n \"Found %(users)s user.\",\n \"Found %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = npgettext(\n \"profile follows\",\n \"You are following %(users)s user.\",\n \"You are following %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else {\n let message = npgettext(\n \"profile follows\",\n \"%(username)s is following %(users)s user.\",\n \"%(username)s is following %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n users: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return pgettext(\n \"profile follows\",\n \"Search returned no users matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return pgettext(\"profile follows\", \"You are not following any users.\")\n } else {\n return interpolate(\n pgettext(\"profile follows\", \"%(username)s is not following any users.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getEmptyMessage() {\n if (this.props.emptyMessage) {\n return this.props.emptyMessage\n } else {\n return pgettext(\n \"username history empty\",\n \"Your account has no history of name changes.\"\n )\n }\n }\n\n render() {\n return (\n
    \n
      \n
    • \n {this.getEmptyMessage()}\n
    • \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default class extends React.Component {\n renderUserAvatar() {\n if (this.props.change.changed_by) {\n return (\n \n \n \n )\n } else {\n return (\n \n \n \n )\n }\n }\n\n renderUsername() {\n if (this.props.change.changed_by) {\n return (\n \n {this.props.change.changed_by.username}\n \n )\n } else {\n return (\n \n {this.props.change.changed_by_username}\n \n )\n }\n }\n\n render() {\n return (\n
  • \n
    {this.renderUserAvatar()}
    \n
    {this.renderUsername()}
    \n
    \n {this.props.change.old_username}\n arrow_forward\n {this.props.change.new_username}\n
    \n
    \n \n {this.props.change.changed_on.fromNow()}\n \n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport Change from \"misago/components/username-history/change\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n
      \n {this.props.changes.map((change) => {\n return \n })}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n getClassName() {\n if (this.props.hiddenOnMobile) {\n return \"list-group-item hidden-xs hidden-sm\"\n } else {\n return \"list-group-item\"\n }\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n
    \n \n  \n \n
    \n
    \n \n  \n \n arrow_forward\n \n  \n \n
    \n
    \n \n  \n \n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ChangePreview from \"misago/components/username-history/change-preview\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n
      \n {[0, 1, 2].map((i) => {\n return 0} key={i} />\n })}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/username-history/list-empty\"\nimport ListReady from \"misago/components/username-history/list-ready\"\nimport ListPreview from \"misago/components/username-history/list-preview\"\n\nexport default class extends React.Component {\n render() {\n if (this.props.isLoaded) {\n if (this.props.changes.length) {\n return \n } else {\n return \n }\n } else {\n return \n }\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsernameHistory from \"misago/components/username-history/root\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/username-history\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"PROFILE_NAME_HISTORY\")) {\n this.initWithPreloadedData(misago.pop(\"PROFILE_NAME_HISTORY\"))\n } else {\n this.initWithoutPreloadedData()\n }\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n isBusy: false,\n\n search: \"\",\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n isBusy: false,\n\n search: \"\",\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n }\n\n this.loadChanges()\n }\n\n loadChanges(page = 1, search = null) {\n ajax\n .get(\n misago.get(\"USERNAME_CHANGES_API\"),\n {\n user: this.props.profile.id,\n search: search,\n page: page || 1,\n },\n \"search-username-history\"\n )\n .then(\n (data) => {\n if (page === 1) {\n store.dispatch(hydrate(data.results))\n } else {\n store.dispatch(append(data.results))\n }\n\n this.setState({\n isLoaded: true,\n isBusy: false,\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n componentDidMount() {\n title.set({\n title: pgettext(\"profile username history title\", \"Username history\"),\n parent: this.props.profile.username,\n })\n }\n\n loadMore = () => {\n this.setState({\n isBusy: true,\n })\n\n this.loadChanges(this.state.page + 1, this.state.search)\n }\n\n search = (ev) => {\n this.setState({\n isLoaded: false,\n isBusy: true,\n\n search: ev.target.value,\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n })\n\n this.loadChanges(1, ev.target.value)\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return pgettext(\"profile username history\", \"Loading...\")\n } else if (this.state.search) {\n let message = npgettext(\n \"profile username history\",\n \"Found %(changes)s username change.\",\n \"Found %(changes)s username changes.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n changes: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = npgettext(\n \"profile username history\",\n \"Your username was changed %(changes)s time.\",\n \"Your username was changed %(changes)s times.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n changes: this.state.count,\n },\n true\n )\n } else {\n let message = npgettext(\n \"profile username history\",\n \"%(username)s's username was changed %(changes)s time.\",\n \"%(username)s's username was changed %(changes)s times.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n changes: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return pgettext(\n \"profile username history\",\n \"Search returned no username changes matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return pgettext(\n \"username history empty\",\n \"Your account has no history of name changes.\"\n )\n } else {\n return interpolate(\n pgettext(\n \"profile username history\",\n \"%(username)s's username was never changed.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getMoreButton() {\n if (!this.state.more) return null\n\n return (\n
    \n \n {interpolate(\n pgettext(\"profile username history\", \"Show older (%(more)s)\"),\n {\n more: this.state.more,\n },\n true\n )}\n \n
    \n )\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.getLabel()}

    \n
    \n
    \n \n \n \n \n \n
    \n\n \n\n {this.getMoreButton()}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport { patch } from \"misago/reducers/profile\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n getClassName() {\n if (this.props.profile.is_followed) {\n return this.props.className + \" btn-default btn-following\"\n } else {\n return this.props.className + \" btn-default btn-follow\"\n }\n }\n\n getIcon() {\n if (this.props.profile.is_followed) {\n return \"favorite\"\n } else {\n return \"favorite_border\"\n }\n }\n\n getLabel() {\n if (this.props.profile.is_followed) {\n return pgettext(\"user profile follow btn\", \"Following\")\n } else {\n return pgettext(\"user profile follow btn\", \"Follow\")\n }\n }\n\n action = () => {\n this.setState({\n isLoading: true,\n })\n\n if (this.props.profile.is_followed) {\n store.dispatch(\n patch({\n is_followed: false,\n followers: this.props.profile.followers - 1,\n })\n )\n } else {\n store.dispatch(\n patch({\n is_followed: true,\n followers: this.props.profile.followers + 1,\n })\n )\n }\n\n ajax.post(this.props.profile.api.follow).then(\n (data) => {\n this.setState({\n isLoading: false,\n })\n\n store.dispatch(patch(data))\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n })\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n return (\n \n {this.getIcon()}\n {this.getLabel()}\n \n )\n }\n}\n","import React from \"react\"\nimport posting from \"misago/services/posting\"\nimport misago from \"misago\"\n\nexport default class extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"START_PRIVATE\",\n submit: misago.get(\"PRIVATE_THREADS_API\"),\n\n to: [this.props.profile],\n })\n }\n\n render() {\n const canMessage = this.props.user.acl.can_start_private_threads\n const isProfileOwner = this.props.user.id === this.props.profile.id\n\n if (!canMessage || isProfileOwner) return null\n\n return (\n \n comment\n {pgettext(\"profile message btn\", \"Message\")}\n \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { updateAvatar } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n error: null,\n\n is_avatar_locked: \"\",\n avatar_lock_user_message: \"\",\n avatar_lock_staff_message: \"\",\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.moderate_avatar).then(\n (options) => {\n this.setState({\n isLoaded: true,\n\n is_avatar_locked: options.is_avatar_locked,\n avatar_lock_user_message: options.avatar_lock_user_message || \"\",\n avatar_lock_staff_message: options.avatar_lock_staff_message || \"\",\n })\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(this.validate().username[0])\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.profile.api.moderate_avatar, {\n is_avatar_locked: this.state.is_avatar_locked,\n avatar_lock_user_message: this.state.avatar_lock_user_message,\n avatar_lock_staff_message: this.state.avatar_lock_staff_message,\n })\n }\n\n handleSuccess(apiResponse) {\n store.dispatch(updateAvatar(this.props.profile, apiResponse.avatar_hash))\n snackbar.success(\n pgettext(\n \"profile avatar moderation\",\n \"Avatar controls have been changed.\"\n )\n )\n }\n\n getFormBody() {\n return (\n \n
    \n \n \n \n\n \n \n \n\n \n \n \n
    \n
    \n \n {pgettext(\"profile avatar moderation btn\", \"Close\")}\n \n \n
    \n \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n return this.getFormBody()\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error) {\n return \"modal-dialog modal-message modal-avatar-controls\"\n } else {\n return \"modal-dialog modal-avatar-controls\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"profile avatar moderation title\", \"Avatar controls\")}\n

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { addNameChange } from \"misago/reducers/username-history\"\nimport { updateUsername } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n error: null,\n\n username: \"\",\n validators: {\n username: [validators.usernameContent()],\n },\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.moderate_username).then(\n () => {\n this.setState({\n isLoaded: true,\n })\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(this.validate().username[0])\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.profile.api.moderate_username, {\n username: this.state.username,\n })\n }\n\n handleSuccess(apiResponse) {\n this.setState({\n username: \"\",\n })\n\n store.dispatch(\n addNameChange(apiResponse, this.props.profile, this.props.user)\n )\n store.dispatch(\n updateUsername(this.props.profile, apiResponse.username, apiResponse.slug)\n )\n\n snackbar.success(\n pgettext(\"profile username moderation\", \"Username has been changed.\")\n )\n }\n\n getFormBody() {\n return (\n
    \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"profile username moderation btn\", \"Cancel\")}\n \n \n
    \n
    \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n return this.getFormBody()\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error) {\n return \"modal-dialog modal-message modal-rename-user\"\n } else {\n return \"modal-dialog modal-rename-user\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"profile username moderation title\", \"Change username\")}\n

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport polls from \"misago/services/polls\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n isDeleted: false,\n error: null,\n\n countdown: 5,\n confirm: false,\n\n with_content: false,\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.delete).then(\n () => {\n this.setState({\n isLoaded: true,\n })\n\n this.countdown()\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n countdown = () => {\n window.setTimeout(() => {\n if (this.state.countdown > 1) {\n this.setState({\n countdown: this.state.countdown - 1,\n })\n this.countdown()\n } else if (!this.state.confirm) {\n this.setState({\n confirm: true,\n })\n }\n }, 1000)\n }\n\n send() {\n return ajax.post(this.props.profile.api.delete, {\n with_content: this.state.with_content,\n })\n }\n\n handleSuccess() {\n polls.stop(\"user-profile\")\n\n if (this.state.with_content) {\n this.setState({\n isDeleted: interpolate(\n pgettext(\n \"profile delete\",\n \"%(username)s's account, threads, posts and other content has been deleted.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n ),\n })\n } else {\n this.setState({\n isDeleted: interpolate(\n pgettext(\n \"profile delete\",\n \"%(username)s's account has been deleted and other content has been hidden.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n ),\n })\n }\n }\n\n getButtonLabel() {\n if (this.state.confirm) {\n return interpolate(\n pgettext(\"profile delete btn\", \"Delete %(username)s\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n } else {\n return interpolate(\n pgettext(\"profile delete btn\", \"Please wait... (%(countdown)ss)\"),\n {\n countdown: this.state.countdown,\n },\n true\n )\n }\n }\n\n getForm() {\n return (\n
    \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"profile delete btn\", \"Cancel\")}\n \n\n \n {this.getButtonLabel()}\n \n
    \n
    \n )\n }\n\n getDeletedBody() {\n return (\n
    \n
    \n info_outline\n
    \n \n
    \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n if (this.state.isDeleted) {\n return this.getDeletedBody()\n } else {\n return this.getForm()\n }\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error || this.state.isDeleted) {\n return \"modal-dialog modal-message modal-delete-account\"\n } else {\n return \"modal-dialog modal-delete-account\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"profile delete title\", \"Delete user account\")}\n

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport AvatarControls from \"misago/components/profile/moderation/avatar-controls\"\nimport ChangeUsername from \"misago/components/profile/moderation/change-username\"\nimport DeleteAccount from \"misago/components/profile/moderation/delete-account\"\nimport modal from \"misago/services/modal\"\n\nlet select = function (store) {\n return {\n tick: store.tick,\n user: store.auth,\n profile: store.profile,\n }\n}\n\nexport default class extends React.Component {\n showAvatarDialog = () => {\n modal.show(connect(select)(AvatarControls))\n }\n\n showRenameDialog = () => {\n modal.show(connect(select)(ChangeUsername))\n }\n\n showDeleteDialog = () => {\n modal.show(connect(select)(DeleteAccount))\n }\n\n render() {\n const { moderation } = this.props\n\n return (\n
      \n {!!moderation.avatar && (\n
    • \n \n portrait\n {pgettext(\"profile moderation menu\", \"Avatar controls\")}\n \n
    • \n )}\n {!!moderation.rename && (\n
    • \n \n credit_card\n {pgettext(\"profile moderation menu\", \"Change username\")}\n \n
    • \n )}\n {!!moderation.delete && (\n
    • \n \n clear\n {pgettext(\"profile moderation menu\", \"Delete account\")}\n \n
    • \n )}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Status, { StatusIcon, StatusLabel } from \"../user-status\"\n\nconst ProfileDataList = ({ profile }) => (\n
      \n {profile.is_active === false && (\n
    • \n \n {pgettext(\"profile data list\", \"Account disabled\")}\n \n
    • \n )}\n
    • \n \n \n \n \n
    • \n {profile.rank.is_tab ? (\n
    • \n \n {profile.rank.name}\n \n
    • \n ) : (\n
    • \n {profile.rank.name}\n
    • \n )}\n {(profile.title || profile.rank.title) && (\n
    • {profile.title || profile.rank.title}
    • \n )}\n
    • \n \n {interpolate(\n pgettext(\"profile data list\", \"Joined %(joined_on)s\"),\n {\n joined_on: profile.joined_on.fromNow(),\n },\n true\n )}\n \n
    • \n {profile.email && (\n
    • \n \n {profile.email}\n \n
    • \n )}\n
    \n)\n\nexport default ProfileDataList\n","import React from \"react\"\nimport Avatar from \"../avatar\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n PageHeaderDetails,\n} from \"../PageHeader\"\nimport FollowButton from \"./follow-button\"\nimport MessageButton from \"./message-button\"\nimport ModerationOptions from \"./moderation/nav\"\nimport ProfileDataList from \"./ProfileDataList\"\n\nconst ProfileHeader = ({ profile, user, moderation, message, follow }) => (\n \n \n \n
    \n
    \n \n \n \n
    \n

    {profile.username}

    \n
    \n \n \n \n \n \n \n \n \n {message && (\n \n \n \n \n {moderation.available && !follow && (\n \n
    \n \n \n
    \n
    \n )}\n
    \n )}\n {follow && (\n \n \n \n \n {moderation.available && (\n \n
    \n \n \n
    \n
    \n )}\n
    \n )}\n {moderation.available && !follow && !message && (\n \n \n
    \n \n \n
    \n
    \n \n
    \n \n settings\n {pgettext(\"profile options btn\", \"Options\")}\n \n \n
    \n
    \n
    \n )}\n
    \n
    \n \n
    \n)\n\nconst ProfileModerationButton = () => (\n \n settings\n \n)\n\nexport default ProfileHeader\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst ProfileNav = ({ baseUrl, page, pages }) => (\n
    \n
    \n \n {page.icon}\n {page.name}\n \n
      \n {pages.map((page) => (\n
    • \n \n {page.icon}\n {page.name}\n \n
    • \n ))}\n
    \n
    \n
      \n {pages.map((page) => (\n
    • \n \n {page.icon}\n {page.name}\n \n
    • \n ))}\n
    \n
    \n)\n\nexport default ProfileNav\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport BanDetails from \"./ban-details\"\nimport Details from \"./details\"\nimport { Posts, Threads } from \"./feed\"\nimport Followers from \"./followers\"\nimport Follows from \"./follows\"\nimport UsernameHistory from \"./username-history\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport PageContainer from \"../PageContainer\"\nimport ProfileHeader from \"./ProfileHeader\"\nimport ProfileNav from \"./ProfileNav\"\n\nexport default class extends WithDropdown {\n constructor(props) {\n super(props)\n\n this.startPolling(props.profile.api.index)\n }\n\n startPolling(api) {\n polls.start({\n poll: \"user-profile\",\n url: api,\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data))\n }\n\n render() {\n const baseUrl = misago.get(\"PROFILE\").url\n const pages = misago.get(\"PROFILE_PAGES\")\n const page = pages.filter((page) => {\n const url = baseUrl + page.component + \"/\"\n return this.props.location.pathname === url\n })[0]\n const { profile, user } = this.props\n const moderation = getModeration(profile, user)\n const message =\n !!user.acl.can_start_private_threads && profile.id !== user.id\n const follow = !!profile.acl.can_follow && profile.id !== user.id\n\n return (\n
    \n \n \n \n\n {this.props.children}\n \n
    \n )\n }\n}\n\nconst getModeration = (profile, user) => {\n const moderation = {\n available: false,\n rename: false,\n avatar: false,\n delete: false,\n }\n\n if (user.is_anonymous) return moderation\n\n moderation.rename = profile.acl.can_rename\n moderation.avatar = profile.acl.can_moderate_avatar\n moderation.delete = profile.acl.can_delete\n moderation.available = !!(\n moderation.rename ||\n moderation.avatar ||\n moderation.delete\n )\n\n return moderation\n}\n\nexport function select(store) {\n return {\n isAuthenticated: store.auth.user.id === store.profile.id,\n\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n posts: store.posts,\n profile: store.profile,\n profileDetails: store[\"profile-details\"],\n \"username-history\": store[\"username-history\"],\n }\n}\n\nconst COMPONENTS = {\n posts: Posts,\n threads: Threads,\n followers: Followers,\n follows: Follows,\n details: Details,\n \"username-history\": UsernameHistory,\n \"ban-details\": BanDetails,\n}\n\nexport function paths() {\n let paths = []\n misago.get(\"PROFILE_PAGES\").forEach(function (item) {\n paths.push(\n Object.assign({}, item, {\n path: misago.get(\"PROFILE\").url + item.component + \"/\",\n component: connect(select)(COMPONENTS[item.component]),\n })\n )\n })\n\n return paths\n}\n","import React from \"react\"\nimport Route from \"./route\"\n\nexport function Threads(props) {\n let emptyMessage = null\n if (props.user.id === props.profile.id) {\n emptyMessage = pgettext(\n \"profile threads\",\n \"You haven't started any threads.\"\n )\n } else {\n emptyMessage = interpolate(\n pgettext(\"profile threads\", \"%(username)s hasn't started any threads\"),\n {\n username: props.profile.username,\n },\n true\n )\n }\n\n let header = null\n if (!props.posts.isLoaded) {\n header = pgettext(\"profile threads\", \"Loading...\")\n } else if (props.profile.id === props.user.id) {\n const message = npgettext(\n \"profile threads\",\n \"You have started %(threads)s thread.\",\n \"You have started %(threads)s threads.\",\n props.profile.threads\n )\n\n header = interpolate(\n message,\n {\n threads: props.profile.threads,\n },\n true\n )\n } else {\n const message = npgettext(\n \"profile threads\",\n \"%(username)s has started %(threads)s thread.\",\n \"%(username)s has started %(threads)s threads.\",\n props.profile.threads\n )\n\n header = interpolate(\n message,\n {\n username: props.profile.username,\n threads: props.profile.threads,\n },\n true\n )\n }\n\n return (\n \n )\n}\n\nexport function Posts(props) {\n let emptyMessage = null\n if (props.user.id === props.profile.id) {\n emptyMessage = pgettext(\"profile posts\", \"You have posted no messages.\")\n } else {\n emptyMessage = interpolate(\n pgettext(\"profile posts\", \"%(username)s posted no messages.\"),\n {\n username: props.profile.username,\n },\n true\n )\n }\n\n let header = null\n if (!props.posts.isLoaded) {\n header = pgettext(\"profile posts\", \"Loading...\")\n } else if (props.profile.id === props.user.id) {\n const message = npgettext(\n \"profile posts\",\n \"You have posted %(posts)s message.\",\n \"You have posted %(posts)s messages.\",\n props.profile.posts\n )\n\n header = interpolate(\n message,\n {\n posts: props.profile.posts,\n },\n true\n )\n } else {\n const message = npgettext(\n \"profile posts\",\n \"%(username)s has posted %(posts)s message.\",\n \"%(username)s has posted %(posts)s messages.\",\n props.profile.posts\n )\n\n header = interpolate(\n message,\n {\n username: props.profile.username,\n posts: props.profile.posts,\n },\n true\n )\n }\n\n return (\n \n )\n}\n","import { connect } from \"react-redux\"\nimport Profile, { paths, select } from \"misago/components/profile/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"PROFILE\") && context.has(\"PROFILE_PAGES\")) {\n mount({\n root: misago.get(\"PROFILE\").url,\n component: connect(select)(Profile),\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:profile\",\n initializer: initializer,\n after: \"reducer:profile-hydrate\",\n})\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestLinkForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n email: \"\",\n\n validators: {\n email: [validators.email()],\n },\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(\n pgettext(\n \"request activation link form\",\n \"Enter a valid e-mail address.\"\n )\n )\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"SEND_ACTIVATION_API\"), {\n email: this.state.email,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if ([\"already_active\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n snackbar.info(rejection.detail)\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {pgettext(\"request activation link form btn\", \"Send link\")}\n \n \n
    \n )\n }\n}\n\nexport class LinkSent extends React.Component {\n getMessage() {\n return interpolate(\n pgettext(\n \"request activation link form\",\n \"Activation link was sent to %(email)s\"\n ),\n {\n email: this.props.user.email,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n check\n
    \n
    \n

    {this.getMessage()}

    \n
    \n \n {pgettext(\n \"request activation link form btn\",\n \"Request another link\"\n )}\n \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n complete = (apiResponse) => {\n this.setState({\n complete: apiResponse,\n })\n }\n\n reset = () => {\n this.setState({\n complete: false,\n })\n }\n\n render() {\n if (this.state.complete) {\n return \n } else {\n return \n }\n }\n}\n","import misago from \"misago/index\"\nimport RequestActivationLink from \"misago/components/request-activation-link\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"request-activation-link-mount\")) {\n mount(RequestActivationLink, \"request-activation-link-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:request-activation-link\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestResetForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n email: \"\",\n\n validators: {\n email: [validators.email()],\n },\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(\n pgettext(\"request password reset form\", \"Enter a valid e-mail address.\")\n )\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"SEND_PASSWORD_RESET_API\"), {\n email: this.state.email,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if ([\"inactive_user\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n this.props.showInactivePage(rejection)\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {pgettext(\"request password reset form btn\", \"Send link\")}\n \n \n
    \n )\n }\n}\n\nexport class LinkSent extends React.Component {\n getMessage() {\n return interpolate(\n pgettext(\n \"request password reset form\",\n \"Reset password link was sent to %(email)s\"\n ),\n {\n email: this.props.user.email,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n check\n
    \n
    \n

    {this.getMessage()}

    \n
    \n \n {pgettext(\n \"request password reset form btn\",\n \"Request another link\"\n )}\n \n
    \n
    \n )\n }\n}\n\nexport class AccountInactivePage extends React.Component {\n getActivateButton() {\n if (this.props.activation === \"inactive_user\") {\n return (\n

    \n \n {pgettext(\n \"request password reset form error\",\n \"Activate your account.\"\n )}\n \n

    \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n info_outline\n
    \n\n
    \n

    \n {pgettext(\n \"request password reset form error\",\n \"Your account is inactive.\"\n )}\n

    \n

    {this.props.message}

    \n {this.getActivateButton()}\n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n complete = (apiResponse) => {\n this.setState({\n complete: apiResponse,\n })\n }\n\n reset = () => {\n this.setState({\n complete: false,\n })\n }\n\n showInactivePage(apiResponse) {\n ReactDOM.render(\n ,\n document.getElementById(\"page-mount\")\n )\n }\n\n render() {\n if (this.state.complete) {\n return \n }\n\n return (\n \n )\n }\n}\n","import misago from \"misago/index\"\nimport RequestPasswordReset from \"misago/components/request-password-reset\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"request-password-reset-mount\")) {\n mount(RequestPasswordReset, \"request-password-reset-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:request-password-reset\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport SignInModal from \"misago/components/sign-in.js\"\nimport ajax from \"misago/services/ajax\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class ResetPasswordForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n password: \"\",\n }\n }\n\n clean() {\n if (this.state.password.trim().length) {\n return true\n } else {\n snackbar.error(pgettext(\"password reset form\", \"Enter new password.\"))\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"CHANGE_PASSWORD_API\"), {\n password: this.state.password,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {pgettext(\"password reset form btn\", \"Change password\")}\n \n \n
    \n )\n }\n}\n\nexport class PasswordChangedPage extends React.Component {\n getMessage() {\n return interpolate(\n pgettext(\n \"password reset form\",\n \"%(username)s, your password has been changed.\"\n ),\n {\n username: this.props.user.username,\n },\n true\n )\n }\n\n showSignIn() {\n modal.show(SignInModal)\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n check\n
    \n\n
    \n

    {this.getMessage()}

    \n

    \n {pgettext(\n \"password reset form\",\n \"Sign in using new password to continue.\"\n )}\n

    \n

    \n \n {pgettext(\"password reset form btn\", \"Sign in\")}\n \n

    \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n complete = (apiResponse) => {\n auth.softSignOut()\n\n // nuke \"next\" field so we don't end\n // coming back to error page after sign in\n $('#hidden-login-form input[name=\"next\"]').remove()\n\n ReactDOM.render(\n ,\n document.getElementById(\"page-mount\")\n )\n }\n\n render() {\n return \n }\n}\n","import misago from \"misago\"\nimport ResetPasswordForm from \"misago/components/reset-password-form\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"reset-password-form-mount\")) {\n mount(ResetPasswordForm, \"reset-password-form-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:reset-password-form\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { SearchOverlay } from \"../../components/Search\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"search-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:search-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport misago from \"misago\"\nimport Form from \"misago/components/form\"\nimport { load as updatePosts } from \"misago/reducers/posts\"\nimport { update as updateSearch } from \"misago/reducers/search\"\nimport { hydrate as updateUsers } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n PageHeader,\n PageHeaderContainer,\n PageHeaderBanner,\n PageHeaderDetails,\n} from \"../PageHeader\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n query: props.search.query,\n }\n }\n\n componentDidMount() {\n if (this.state.query.length) {\n this.handleSubmit()\n }\n }\n\n onQueryChange = (event) => {\n this.changeValue(\"query\", event.target.value)\n }\n\n clean() {\n if (!this.state.query.trim().length) {\n snackbar.error(pgettext(\"search form\", \"You have to enter search query.\"))\n return false\n }\n\n return true\n }\n\n send() {\n store.dispatch(\n updateSearch({\n isLoading: true,\n })\n )\n\n const query = this.state.query.trim()\n\n let url = window.location.href\n const urlQuery = url.indexOf(\"?q=\")\n if (urlQuery > 0) {\n url = url.substring(0, urlQuery + 3)\n }\n window.history.pushState({}, \"\", url + encodeURIComponent(query))\n\n return ajax.get(misago.get(\"SEARCH_API\"), { q: query })\n }\n\n handleSuccess(providers) {\n store.dispatch(\n updateSearch({\n query: this.state.query.trim(),\n isLoading: false,\n providers,\n })\n )\n\n providers.forEach((provider) => {\n if (provider.id === \"users\") {\n store.dispatch(updateUsers(provider.results.results))\n } else if (provider.id === \"threads\") {\n store.dispatch(updatePosts(provider.results))\n }\n })\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n\n store.dispatch(\n updateSearch({\n isLoading: false,\n })\n )\n }\n\n render() {\n return (\n
    \n \n \n \n

    {pgettext(\"search form title\", \"Search\")}

    \n
    \n \n \n \n \n \n \n \n \n search\n \n \n \n \n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function (props) {\n return (\n
    \n {props.providers.map((provider) => {\n return (\n \n {provider.icon}\n {provider.name}\n \n \n )\n })}\n
    \n )\n}\n\nexport function Badge(props) {\n if (!props.results) return null\n\n let count = props.results.count\n if (count > 1000000) {\n count = Math.ceil(count / 1000000) + \"KK\"\n } else if (count > 1000) {\n count = Math.ceil(count / 1000) + \"K\"\n }\n\n return {count}\n}\n","import React from \"react\"\nimport PageContainer from \"../PageContainer\"\nimport SearchForm from \"./form\"\nimport SideNav from \"./sidenav\"\n\nexport default function (props) {\n return (\n
    \n \n \n
    \n
    \n \n
    \n
    \n {props.children}\n \n
    \n
    \n
    \n
    \n )\n}\n\nexport function SearchTime(props) {\n let time = null\n props.search.providers.forEach((p) => {\n if (p.id === props.provider.id) {\n time = p.time\n }\n })\n\n if (time === null) return null\n\n const copy = pgettext(\"search time\", \"Search took %(time)s s\")\n\n return (\n
    \n

    {interpolate(copy, { time }, true)}

    \n
    \n )\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport {\n update as updatePosts,\n append as appendPosts,\n} from \"misago/reducers/posts\"\nimport { updateProvider } from \"misago/reducers/search\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n return (\n
    \n \n \n
    \n )\n}\n\nexport class LoadMore extends React.Component {\n onClick = () => {\n store.dispatch(\n updatePosts({\n isBusy: true,\n })\n )\n\n ajax\n .get(this.props.provider.api, {\n q: this.props.query,\n page: this.props.next,\n })\n .then(\n (providers) => {\n providers.forEach((provider) => {\n if (provider.id !== \"threads\") return\n store.dispatch(appendPosts(provider.results))\n store.dispatch(updateProvider(provider))\n })\n\n store.dispatch(\n updatePosts({\n isBusy: false,\n })\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n store.dispatch(\n updatePosts({\n isBusy: false,\n })\n )\n }\n )\n }\n\n render() {\n if (!this.props.more) return null\n\n return (\n
    \n \n {pgettext(\"search threads btn\", \"Show more\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport Results from \"./results\"\n\nexport default function (props) {\n return (\n \n \n \n \n \n )\n}\n\nexport function Blankslate({ children, loading, posts, query }) {\n if (posts && posts.count) return children\n\n if (query.length) {\n return (\n

    \n {loading\n ? pgettext(\"search threads\", \"Loading results...\")\n : pgettext(\n \"search threads\",\n \"No threads matching search query have been found.\"\n )}\n

    \n )\n }\n\n return (\n

    \n {pgettext(\n \"search threads\",\n \"Enter at least two characters to search threads.\"\n )}\n

    \n )\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport UsersList from \"misago/components/users-list\"\n\nexport default function (props) {\n return (\n \n \n \n \n \n )\n}\n\nexport function Blankslate({ children, loading, query, users }) {\n if (users.length) return children\n\n if (query.length) {\n return (\n

    \n {loading\n ? pgettext(\"search users\", \"Loading results...\")\n : pgettext(\n \"search users\",\n \"No users matching search query have been found.\"\n )}\n

    \n )\n }\n\n return (\n

    \n {pgettext(\n \"search users\",\n \"Enter at least two characters to search users.\"\n )}\n

    \n )\n}\n","import { connect } from \"react-redux\"\nimport SearchThreads from \"./threads\"\nimport SearchUsers from \"./users\"\n\nconst components = {\n threads: SearchThreads,\n users: SearchUsers,\n}\n\nexport function select(store) {\n return {\n posts: store.posts,\n search: store.search,\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n }\n}\n\nexport default function (providers) {\n return providers.map((provider) => {\n return {\n path: provider.url,\n component: connect(select)(components[provider.id]),\n provider: provider,\n }\n })\n}\n","import paths from \"misago/components/search-route\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.get(\"CURRENT_LINK\") === \"misago:search\") {\n mount({\n paths: paths(misago.get(\"SEARCH_PROVIDERS\")),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:search\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { SiteNavOverlay } from \"../../components/SiteNav\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"site-nav-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:site-nav-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nconst TYPES_CLASSES = {\n info: \"alert-info\",\n success: \"alert-success\",\n warning: \"alert-warning\",\n error: \"alert-danger\",\n}\n\nexport class Snackbar extends React.Component {\n getSnackbarClass() {\n let snackbarClass = \"alerts-snackbar\"\n if (this.props.isVisible) {\n snackbarClass += \" in\"\n } else {\n snackbarClass += \" out\"\n }\n return snackbarClass\n }\n\n render() {\n return (\n
    \n

    \n {this.props.message}\n

    \n
    \n )\n }\n}\n\nexport function select(state) {\n return state.snackbar\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport { Snackbar, select } from \"misago/components/snackbar\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(Snackbar), \"snackbar-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:snackbar\",\n initializer: initializer,\n after: \"snackbar\",\n})\n","import React from \"react\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nconst Header = ({ backendName }) => {\n const pageTitleTpl = pgettext(\"social auth title\", \"Sign in with %(backend)s\")\n const pageTitle = interpolate(pageTitleTpl, { backend: backendName }, true)\n\n return (\n \n \n \n

    {pageTitle}

    \n
    \n
    \n
    \n )\n}\n\nexport default Header\n","import React from \"react\"\nimport misago from \"misago\"\nimport RegisterLegalFootnote from \"misago/components/RegisterLegalFootnote\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nexport default class Register extends Form {\n constructor(props) {\n super(props)\n\n const formValidators = {\n email: [validators.email()],\n username: [validators.usernameContent()],\n }\n\n if (!!misago.get(\"TERMS_OF_SERVICE_ID\")) {\n formValidators.termsOfService = [validators.requiredTermsOfService()]\n }\n\n if (!!misago.get(\"PRIVACY_POLICY_ID\")) {\n formValidators.privacyPolicy = [validators.requiredPrivacyPolicy()]\n }\n\n this.state = {\n email: props.email || \"\",\n emailProtected: !!props.email,\n username: props.username || \"\",\n\n termsOfService: null,\n privacyPolicy: null,\n\n validators: formValidators,\n errors: {},\n\n isLoading: false,\n }\n }\n\n clean() {\n let errors = this.validate()\n let lengths = [\n this.state.email.trim().length,\n this.state.username.trim().length,\n ]\n\n if (lengths.indexOf(0) !== -1) {\n snackbar.error(pgettext(\"social auth form\", \"Fill out all fields.\"))\n return false\n }\n\n const { validators } = this.state\n\n const checkTermsOfService = !!misago.get(\"TERMS_OF_SERVICE_ID\")\n if (checkTermsOfService && this.state.termsOfService === null) {\n snackbar.error(validators.termsOfService[0](null))\n return false\n }\n\n const checkPrivacyPolicy = !!misago.get(\"PRIVACY_POLICY_ID\")\n if (checkPrivacyPolicy && this.state.privacyPolicy === null) {\n snackbar.error(validators.privacyPolicy[0](null))\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.url, {\n email: this.state.email,\n username: this.state.username,\n terms_of_service: this.state.termsOfService,\n privacy_policy: this.state.privacyPolicy,\n })\n }\n\n handleSuccess(response) {\n const { onRegistrationComplete } = this.props\n onRegistrationComplete(response)\n }\n\n handleError(rejection) {\n if (rejection.status === 200) {\n // We've entered \"errored\" state because response is HTML instead of exptected JSON\n const { onRegistrationComplete } = this.props\n const { username } = this.state\n onRegistrationComplete({ activation: \"active\", step: \"done\", username })\n } else if (rejection.status === 400) {\n const stateUpdate = { errors: rejection }\n if (rejection.email) {\n stateUpdate.emailProtected = false\n }\n this.setState(stateUpdate)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n handlePrivacyPolicyChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"privacyPolicy\", value)\n }\n\n handleTermsOfServiceChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"termsOfService\", value)\n }\n\n handleToggleAgreement = (agreement, value) => {\n this.setState((prevState, props) => {\n if (prevState[agreement] === null) {\n const errors = { ...prevState.errors, [agreement]: null }\n return { errors, [agreement]: value }\n }\n\n const validator = this.state.validators[agreement][0]\n const errors = { ...prevState.errors, [agreement]: [validator(null)] }\n return { errors, [agreement]: null }\n })\n }\n\n render() {\n const { backend_name } = this.props\n const { email, emailProtected, username, isLoading } = this.state\n\n let emailHelpText = null\n if (emailProtected) {\n const emailHelpTextTpl = pgettext(\n \"social auth form\",\n \"Your e-mail address has been verified by %(backend)s.\"\n )\n emailHelpText = interpolate(\n emailHelpTextTpl,\n { backend: backend_name },\n true\n )\n }\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n {pgettext(\n \"social auth form title\",\n \"Complete your account\"\n )}\n

    \n
    \n
    \n \n \n \n \n \n \n \n
    \n
    \n \n {pgettext(\"social auth form btn\", \"Sign in\")}\n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nconst Complete = ({ activation, backend_name, username }) => {\n let icon = \"\"\n let message = \"\"\n if (activation === \"user\") {\n message = pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\"\n )\n } else if (activation === \"admin\") {\n message = pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but the site administrator will have to activate it before you will be able to sign in.\"\n )\n } else {\n message = pgettext(\n \"social auth complete\",\n \"%(username)s, your account has been created and you have been signed in to it.\"\n )\n }\n\n if (activation === \"active\") {\n icon = \"check\"\n } else {\n icon = \"info_outline\"\n }\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n
    \n

    \n {pgettext(\n \"social auth complete title\",\n \"Registration completed!\"\n )}\n

    \n
    \n
    \n
    \n {icon}\n
    \n
    \n

    \n {interpolate(message, { username }, true)}\n

    \n

    \n \n {pgettext(\n \"social auth complete link\",\n \"Return to forum index\"\n )}\n \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n )\n}\n\nexport default Complete\n","import React from \"react\"\nimport Register from \"./register\"\nimport Complete from \"./complete\"\n\nexport default class SocialAuth extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n step: props.step,\n\n activation: props.activation || \"\",\n email: props.email || \"\",\n username: props.username || \"\",\n }\n }\n\n handleRegistrationComplete = ({ activation, email, step, username }) => {\n this.setState({ activation, email, step, username })\n }\n\n render() {\n const { backend_name, url } = this.props\n const { activation, email, step, username } = this.state\n\n if (step === \"register\") {\n return (\n \n )\n }\n\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport SocialAuth from \"misago/components/social-auth\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n if (context.get(\"CURRENT_LINK\") === \"misago:social-complete\") {\n const props = context.get(\"SOCIAL_AUTH_FORM\")\n mount(, \"page-mount\")\n }\n}\n\nmisago.addInitializer({\n name: \"component:social-auth\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport Form from \"./form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n username: \"\",\n }\n }\n\n onUsernameChange = (event) => {\n this.changeValue(\"username\", event.target.value)\n }\n\n clean() {\n if (!this.state.username.trim().length) {\n snackbar.error(\n pgettext(\n \"add private thread participant\",\n \"You have to enter user name.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.patch(this.props.thread.api.index, [\n { op: \"add\", path: \"participants\", value: this.state.username },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n }\n\n handleSuccess(data) {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n snackbar.success(\n pgettext(\n \"add private thread participant\",\n \"New participant has been added to thread.\"\n )\n )\n\n modal.hide()\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\n \"add private thread participant btn\",\n \"Add participant\"\n )}\n \n \n {pgettext(\"add private thread participant btn\", \"Cancel\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\n \"add private thread participant modal title\",\n \"Add participant\"\n )}\n

    \n
    \n )\n}\n","import React from \"react\"\nimport AddParticipantModal from \"misago/components/add-participant\"\nimport modal from \"misago/services/modal\"\n\nexport default class extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.thread.acl.can_add_participants) return null\n\n return (\n
    \n \n person_add\n {pgettext(\"add participant btn\", \"Add participant\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport { changeOwner } from \"./actions\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.isUser = props.participant.id === props.user.id\n }\n\n onClick = () => {\n let confirmed = false\n if (this.isUser) {\n confirmed = window.confirm(\n pgettext(\n \"private thread owner change\",\n \"Are you sure you want to take over this thread?\"\n )\n )\n } else {\n const message = pgettext(\n \"private thread owner change\",\n \"Are you sure you want to change thread owner to %(user)s?\"\n )\n confirmed = window.confirm(\n interpolate(\n message,\n {\n user: this.props.participant.username,\n },\n true\n )\n )\n }\n\n if (!confirmed) return\n\n changeOwner(this.props.thread, this.props.participant)\n }\n\n render() {\n if (this.props.participant.is_owner) return null\n if (!this.props.thread.acl.can_change_owner) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function leave(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"remove\", path: \"participants\", value: participant.id },\n ])\n .then(\n () => {\n snackbar.success(\n pgettext(\"thread participants actions\", \"You have left this thread.\")\n )\n window.setTimeout(() => {\n window.location = misago.get(\"PRIVATE_THREADS_URL\")\n }, 3 * 1000)\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n\nexport function remove(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"remove\", path: \"participants\", value: participant.id },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n .then(\n (data) => {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n const message = pgettext(\n \"thread participants actions\",\n \"%(user)s has been removed from this thread.\"\n )\n snackbar.success(\n interpolate(\n message,\n {\n user: participant.username,\n },\n true\n )\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n\nexport function changeOwner(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"replace\", path: \"owner\", value: participant.id },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n .then(\n (data) => {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n const message = pgettext(\n \"thread participants actions\",\n \"%(user)s has been made new thread owner.\"\n )\n snackbar.success(\n interpolate(\n message,\n {\n user: participant.username,\n },\n true\n )\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n","import React from \"react\"\nimport { remove, leave } from \"./actions\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.isUser = props.participant.id === props.user.id\n }\n\n onClick = () => {\n let confirmed = false\n if (this.isUser) {\n confirmed = window.confirm(\n pgettext(\n \"private thread leave\",\n \"Are you sure you want to leave this thread?\"\n )\n )\n } else {\n const message = pgettext(\n \"private thread leave\",\n \"Are you sure you want to remove %(user)s from this thread?\"\n )\n confirmed = window.confirm(\n interpolate(\n message,\n {\n user: this.props.participant.username,\n },\n true\n )\n )\n }\n\n if (!confirmed) return\n\n if (this.isUser) {\n leave(this.props.thread, this.props.participant)\n } else {\n remove(this.props.thread, this.props.participant)\n }\n }\n\n render() {\n const isModerator = this.props.user.acl.can_moderate_private_threads\n\n if (!(this.props.userIsOwner || this.isUser || isModerator)) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport MakeOwner from \"./make-owner\"\nimport Remove from \"./remove\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default function (props) {\n const participant = props.participant\n\n let className = \"btn btn-default\"\n if (participant.is_owner) {\n className = \"btn btn-primary\"\n }\n className += \" btn-user btn-block\"\n\n return (\n
    \n
    \n \n \n {participant.username}\n \n \n
    \n
    \n )\n}\n\nexport function UserStatus({ isOwner }) {\n if (!isOwner) return null\n\n return (\n
  • \n start\n \n {pgettext(\"thread participants owner status\", \"Thread owner\")}\n \n
  • \n )\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ participants, thread, user, userIsOwner }) {\n return (\n
    \n
    \n {participants.map((participant) => {\n return (\n \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport AddParticipant from \"./add-participant\"\nimport CardsList from \"./cards-list\"\nimport * as utils from \"./utils\"\n\nexport default function (props) {\n if (!props.participants.length) return null\n\n return (\n
    \n
    \n \n
    \n \n
    \n

    {utils.getParticipantsCopy(props.participants)}

    \n
    \n
    \n
    \n
    \n )\n}\n\nexport function getUserIsOwner(user, participants) {\n return participants[0].id === user.id\n}\n","export function getParticipantsCopy(participants) {\n const count = participants.length\n const message = npgettext(\n \"thread participants stat\",\n \"This thread has %(users)s participant.\",\n \"This thread has %(users)s participants.\",\n count\n )\n\n return interpolate(\n message,\n {\n users: count,\n },\n true\n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n {props.poll.choices.map((choice) => {\n return (\n \n )\n })}\n
    \n )\n}\n\nexport function PollChoice(props) {\n let proc = 0\n if (props.choice.votes && props.poll.votes) {\n proc = Math.ceil((props.choice.votes * 100) / props.poll.votes)\n }\n\n return (\n
    \n
    {props.choice.label}
    \n
    \n
    \n \n \n {getVotesLabel(props.votes, props.proc)}\n \n
    \n \n
      \n \n \n
    \n
    \n
    \n )\n}\n\nexport function ChoiceVotes(props) {\n return (\n
  • \n {getVotesLabel(props.votes, props.proc)}\n
  • \n )\n}\n\nexport function getVotesLabel(votes, proc) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s vote, %(proc)s% of total.\",\n \"%(votes)s votes, %(proc)s% of total.\",\n votes\n )\n\n return interpolate(\n message,\n {\n votes: votes,\n proc: proc,\n },\n true\n )\n}\n\nexport function UserChoice(props) {\n if (!props.selected) return null\n\n return (\n
  • \n check_box\n {pgettext(\"thread poll\", \"You've voted on this choice.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: true,\n error: null,\n data: [],\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.poll.api.votes).then(\n (data) => {\n const hydratedData = data.map((choice) => {\n return Object.assign({}, choice, {\n voters: choice.voters.map((voter) => {\n return Object.assign({}, voter, {\n voted_on: moment(voter.voted_on),\n })\n }),\n })\n })\n\n this.setState({\n isLoading: false,\n data: hydratedData,\n })\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n error: rejection.detail,\n })\n }\n )\n }\n\n render() {\n return (\n \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"thread poll\", \"Poll votes\")}\n

    \n
    \n\n \n
    \n \n )\n }\n}\n\nexport function ModalBody(props) {\n if (props.isLoading) {\n return \n } else if (props.error) {\n return \n }\n\n return \n}\n\nexport function ChoicesList(props) {\n return (\n
    \n
      \n {props.data.map((choice) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function ChoiceDetails(props) {\n return (\n
  • \n

    {props.label}

    \n \n \n
    \n
  • \n )\n}\n\nexport function VotesCount(props) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s user has voted for this choice.\",\n \"%(votes)s users have voted for this choice.\",\n props.votes\n )\n\n const label = interpolate(\n message,\n {\n votes: props.votes,\n },\n true\n )\n\n return

    {label}

    \n}\n\nexport function VotesList(props) {\n if (!props.voters.length) return null\n\n return (\n
      \n {props.voters.map((user) => {\n return \n })}\n
    \n )\n}\n\nexport function Voter(props) {\n if (props.url) {\n return (\n
  • \n \n {props.username}\n {\" \"}\n \n
  • \n )\n }\n\n return (\n
  • \n {props.username} \n
  • \n )\n}\n\nexport function VoteDate(props) {\n return (\n \n {props.voted_on.fromNow()}\n \n )\n}\n","import React from \"react\"\nimport Modal from \"./modal\"\nimport * as poll from \"misago/reducers/poll\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n const { isPollOver, poll, showVoting, thread } = props\n\n if (!isVisible(isPollOver, poll.acl, poll)) return null\n\n const controls = []\n\n const canVote = poll.acl.can_vote\n const canChangeVote = !poll.hasSelectedChoices || poll.allow_revotes\n\n if (canVote && canChangeVote) controls.push(0)\n if (poll.is_public || poll.acl.can_see_votes) controls.push(1)\n if (poll.acl.can_edit) controls.push(2)\n if (poll.acl.can_delete) controls.push(3)\n\n return (\n
    \n \n \n \n \n
    \n )\n}\n\nexport function isVisible(isPollOver, acl, poll) {\n return (\n poll.is_public ||\n acl.can_delete ||\n acl.can_edit ||\n acl.can_see_votes ||\n (acl.can_vote &&\n !isPollOver &&\n (!poll.hasSelectedChoices || poll.allow_revotes))\n )\n}\n\nexport function getClassName(controls, control) {\n let className = \"col-xs-6\"\n\n if (controls.length === 1) {\n className = \"col-xs-12\"\n }\n\n if (controls.length === 3 && controls[0] === control) {\n className = \"col-xs-12\"\n }\n\n return className + \" col-sm-3 col-md-2\"\n}\n\nexport function ChangeVote(props) {\n const canVote = props.poll.acl.can_vote\n const canChangeVote =\n !props.poll.hasSelectedChoices || props.poll.allow_revotes\n\n if (!(canVote && canChangeVote)) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Vote\")}\n \n
    \n )\n}\n\nexport class SeeVotes extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const seeVotes =\n this.props.poll.is_public || this.props.poll.acl.can_see_votes\n if (!seeVotes) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"See votes\")}\n \n
    \n )\n }\n}\n\nexport function Edit(props) {\n if (!props.poll.acl.can_edit) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Edit\")}\n \n
    \n )\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n const deletePoll = window.confirm(\n pgettext(\n \"thread poll\",\n \"Are you sure you want to delete this poll? This action is not reversible.\"\n )\n )\n if (!deletePoll) return false\n\n store.dispatch(poll.busy())\n\n ajax\n .delete(this.props.poll.api.index)\n .then(this.handleSuccess, this.handleError)\n }\n\n handleSuccess = (newThreadAcl) => {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been deleted\"))\n store.dispatch(poll.remove())\n store.dispatch(thread.updateAcl(newThreadAcl))\n }\n\n handleError = (rejection) => {\n snackbar.apiError(rejection)\n store.dispatch(poll.release())\n }\n\n render() {\n if (!this.props.poll.acl.can_delete) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Delete\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n
    \n )\n}\n\nexport function PollCreation(props) {\n const message = interpolate(\n escapeHtml(pgettext(\"thread poll\", \"Started by %(poster)s %(posted_on)s.\")),\n {\n poster: getPoster(props.poll),\n posted_on: getPostedOn(props.poll),\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getPoster(poll) {\n if (poll.url.poster) {\n return interpolate(\n USER_URL,\n {\n url: escapeHtml(poll.url.poster),\n user: escapeHtml(poll.poster_name),\n },\n true\n )\n }\n\n return interpolate(\n USER_SPAN,\n {\n user: escapeHtml(poll.poster_name),\n },\n true\n )\n}\n\nexport function getPostedOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.posted_on.format(\"LLL\")),\n relative: escapeHtml(poll.posted_on.fromNow()),\n },\n true\n )\n}\n\nexport function PollLength(props) {\n if (!props.poll.length) {\n return null\n }\n\n const message = interpolate(\n escapeHtml(pgettext(\"thread poll\", \"Voting ends %(ends_on)s.\")),\n {\n ends_on: getEndsOn(props.poll),\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getEndsOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.endsOn.format(\"LLL\")),\n relative: escapeHtml(poll.endsOn.fromNow()),\n },\n true\n )\n}\n\nexport function PollVotes(props) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s vote.\",\n \"%(votes)s votes.\",\n props.votes\n )\n const label = interpolate(\n message,\n {\n votes: props.votes,\n },\n true\n )\n\n return
  • {label}
  • \n}\n\nexport function PollIsPublic(props) {\n if (!props.poll.is_public) {\n return null\n }\n\n return (\n
  • \n {pgettext(\"thread poll\", \"Voting is public.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport Chart from \"./chart\"\nimport Options from \"./options\"\nimport PollInfo from \"../info\"\n\nexport default function (props) {\n return (\n
    \n
    \n

    {props.poll.question}

    \n \n \n \n
    \n
    \n )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n
    \n )\n}\n\nexport function PollChoicesLeft({ choicesLeft }) {\n if (choicesLeft === 0) {\n return (\n
  • \n {pgettext(\"thread poll\", \"You can't select any more choices.\")}\n
  • \n )\n }\n\n const message = npgettext(\n \"thread poll\",\n \"You can select %(choices)s more choice.\",\n \"You can select %(choices)s more choices.\",\n choicesLeft\n )\n\n const label = interpolate(\n message,\n {\n choices: choicesLeft,\n },\n true\n )\n\n return
  • {label}
  • \n}\n\nexport function PollAllowRevote(props) {\n if (props.poll.allow_revotes) {\n return (\n
  • \n {pgettext(\"thread poll\", \"You can change your vote later.\")}\n
  • \n )\n }\n\n return (\n
  • \n {pgettext(\"thread poll\", \"Votes are final.\")}\n
  • \n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
      \n {props.choices.map((choice) => {\n return (\n \n )\n })}\n
    \n )\n}\n\nexport class ChoiceSelect extends React.Component {\n onClick = () => {\n this.props.toggleChoice(this.props.choice.hash)\n }\n\n render() {\n return (\n
  • \n \n \n {this.props.choice.selected\n ? \"check_box\"\n : \"check_box_outline_blank\"}\n \n {this.props.choice.label}\n \n
  • \n )\n }\n}\n","export function getChoiceFromHash(choices, hash) {\n for (const i in choices) {\n const choice = choices[i]\n if (choice.hash === hash) {\n return choice\n }\n }\n\n return null\n}\n\nexport function getChoicesLeft(poll, choices) {\n let selection = []\n for (const i in choices) {\n const choice = choices[i]\n if (choice.selected) {\n selection.push(choice)\n }\n }\n\n return poll.allowed_choices - selection.length\n}\n","import React from \"react\"\nimport ChoicesHelp from \"./help\"\nimport ChoicesSelect from \"./select\"\nimport { getChoicesLeft, getChoiceFromHash } from \"./utils\"\nimport PollInfo from \"../info\"\nimport { Delete, Edit, getClassName } from \"../results/options\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n choices: props.poll.choices,\n choicesLeft: getChoicesLeft(props.poll, props.poll.choices),\n }\n }\n\n toggleChoice = (hash) => {\n const choice = getChoiceFromHash(this.state.choices, hash)\n\n let choices = null\n if (!choice.selected) {\n choices = this.selectChoice(choice, hash)\n } else {\n choices = this.deselectChoice(choice, hash)\n }\n\n this.setState({\n choices,\n choicesLeft: getChoicesLeft(this.props.poll, choices),\n })\n }\n\n selectChoice = (choice, hash) => {\n const choicesLeft = getChoicesLeft(this.props.poll, this.state.choices)\n\n if (!choicesLeft) {\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected && item.hash != hash) {\n item.selected = false\n break\n }\n }\n }\n\n return this.state.choices.map((choice) => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? true : choice.selected,\n })\n })\n }\n\n deselectChoice = (choice, hash) => {\n return this.state.choices.map((choice) => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? false : choice.selected,\n })\n })\n }\n\n clean() {\n if (this.state.choicesLeft === this.props.poll.allowed_choices) {\n snackbar.error(\n pgettext(\"thread poll vote\", \"You need to select at least one choice.\")\n )\n return false\n }\n\n return true\n }\n\n send() {\n let data = []\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected) {\n data.push(item.hash)\n }\n }\n\n return ajax.post(this.props.poll.api.votes, data)\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n snackbar.success(pgettext(\"thread poll vote\", \"Your vote has been saved.\"))\n\n this.props.showResults()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n const controls = []\n\n if (this.props.poll.acl.can_vote) controls.push(0)\n if (this.props.poll.is_public || this.props.poll.acl.can_see_votes)\n controls.push(1)\n if (this.props.poll.acl.can_edit) controls.push(2)\n if (this.props.poll.acl.can_delete) controls.push(3)\n\n return (\n
    \n
    \n
    \n

    {this.props.poll.question}

    \n \n \n \n
    \n
    \n
    \n
    \n \n {pgettext(\"thread poll vote btn\", \"Save your vote\")}\n \n
    \n
    \n \n {pgettext(\"thread poll vote btn\", \"See results\")}\n \n
    \n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Results from \"./results\"\nimport Voting from \"./voting\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n let showResults = true\n if (props.user.id && !props.poll.hasSelectedChoices) {\n showResults = false\n }\n\n this.state = {\n showResults,\n }\n }\n\n showResults = () => {\n this.setState({\n showResults: true,\n })\n }\n\n showVoting = () => {\n this.setState({\n showResults: false,\n })\n }\n\n render() {\n if (!this.props.thread.poll) return null\n\n const isPollOver = getIsPollOver(this.props.poll)\n\n if (\n !isPollOver &&\n this.props.poll.acl.can_vote &&\n !this.state.showResults\n ) {\n return \n } else {\n return (\n \n )\n }\n }\n}\n\nexport function getIsPollOver(poll) {\n if (poll.length) {\n return moment().isAfter(poll.endsOn)\n }\n return false\n}\n","import React from \"react\"\nimport getRandomString from \"../../../utils/getRandomString\"\n\nconst HASH_LENGTH = 12\n\nexport default class extends React.Component {\n onAdd = () => {\n let choices = this.props.choices.slice()\n choices.push({\n hash: getRandomString(HASH_LENGTH),\n label: \"\",\n })\n\n this.props.setChoices(choices)\n }\n\n onChange = (hash, label) => {\n const choices = this.props.choices.map((choice) => {\n if (choice.hash === hash) {\n choice.label = label\n }\n\n return choice\n })\n this.props.setChoices(choices)\n }\n\n onDelete = (hash) => {\n const choices = this.props.choices.filter((choice) => {\n return choice.hash !== hash\n })\n this.props.setChoices(choices)\n }\n\n render() {\n return (\n
    \n
      \n {this.props.choices.map((choice) => {\n return (\n 2}\n choice={choice}\n disabled={this.props.disabled}\n key={choice.hash}\n onChange={this.onChange}\n onDelete={this.onDelete}\n />\n )\n })}\n
    \n \n {pgettext(\"thread poll\", \"Add choice\")}\n \n
    \n )\n }\n}\n\nexport class PollChoice extends React.Component {\n onChange = (event) => {\n this.props.onChange(this.props.choice.hash, event.target.value)\n }\n\n onDelete = () => {\n const deleteItem =\n this.props.choice.label.length === 0\n ? true\n : window.confirm(\n pgettext(\n \"thread poll\",\n \"Are you sure you want to remove this choice?\"\n )\n )\n if (deleteItem) {\n this.props.onDelete(this.props.choice.hash)\n }\n }\n\n render() {\n return (\n
  • \n \n close\n \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ChoicesControl from \"./choices-control\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n const poll = props.poll.id\n ? props.poll\n : {\n question: \"\",\n choices: [\n {\n hash: \"choice-10000\",\n label: \"\",\n },\n {\n hash: \"choice-20000\",\n label: \"\",\n },\n ],\n length: 0,\n allowed_choices: 1,\n allow_revotes: 0,\n is_public: 0,\n }\n\n this.state = {\n isLoading: false,\n isEdit: !!poll.id,\n\n question: poll.question,\n choices: poll.choices,\n length: poll.length,\n allowed_choices: poll.allowed_choices,\n allow_revotes: poll.allow_revotes,\n is_public: poll.is_public,\n\n validators: {\n question: [],\n choices: [],\n length: [],\n allowed_choices: [],\n },\n\n errors: {},\n }\n }\n\n setChoices = (choices) => {\n this.setState((state) => {\n return {\n choices,\n errors: Object.assign({}, state.errors, { choices: null }),\n }\n })\n }\n\n onCancel = () => {\n let cancel = false\n\n // Nothing added to the poll so no changes to discard\n const formEmpty = !!(\n this.state.question === \"\" &&\n this.state.choices &&\n this.state.choices.every((choice) => choice.label === \"\") &&\n this.state.length === 0 &&\n this.state.allowed_choices === 1\n )\n\n if (formEmpty) {\n return this.props.close()\n }\n\n if (!!this.props.poll) {\n cancel = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to discard changes?\")\n )\n } else {\n cancel = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to discard new poll?\")\n )\n }\n\n if (cancel) {\n this.props.close()\n }\n }\n\n send() {\n const data = {\n question: this.state.question,\n choices: this.state.choices,\n length: this.state.length,\n allowed_choices: this.state.allowed_choices,\n allow_revotes: this.state.allow_revotes,\n is_public: this.state.is_public,\n }\n\n if (this.state.isEdit) {\n return ajax.put(this.props.poll.api.index, data)\n }\n\n return ajax.post(this.props.thread.api.poll, data)\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n\n if (this.state.isEdit) {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been edited.\"))\n } else {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been posted.\"))\n }\n\n this.props.close()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.non_field_errors) {\n rejection.allowed_choices = rejection.non_field_errors\n }\n\n this.setState({\n errors: Object.assign({}, rejection),\n })\n\n snackbar.error(gettext(\"Form contains errors.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n

    \n {this.state.isEdit\n ? pgettext(\"thread poll\", \"Edit poll\")\n : pgettext(\"thread poll\", \"Add poll\")}\n

    \n
    \n
    \n
    \n \n {pgettext(\"thread poll\", \"Question and choices\")}\n \n\n \n \n \n\n \n \n \n
    \n\n
    \n {pgettext(\"thread poll\", \"Voting\")}\n\n
    \n
    \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n \n {pgettext(\"thread poll\", \"Cancel\")}\n {\" \"}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function PollPublicSwitch(props) {\n if (props.isEdit) return null\n\n return (\n
    \n \n \n \n
    \n )\n}\n","import React from \"react\"\n\nconst ICON = {\n changed_title: \"edit\",\n\n pinned_globally: \"bookmark\",\n pinned_locally: \"bookmark_border\",\n unpinned: \"panorama_fish_eye\",\n\n moved: \"arrow_forward\",\n merged: \"call_merge\",\n\n approved: \"done\",\n\n opened: \"lock_open\",\n closed: \"lock_outline\",\n\n unhid: \"visibility\",\n hid: \"visibility_off\",\n\n changed_owner: \"grade\",\n tookover: \"grade\",\n\n added_participant: \"person_add\",\n\n owner_left: \"person_outline\",\n participant_left: \"person_outline\",\n removed_participant: \"remove_circle_outline\",\n}\n\nconst EventIcon = (props) => (\n \n {ICON[props.post.event_type]}\n \n)\n\nexport default EventIcon\n","import React from \"react\"\nimport moment from \"moment\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n if (isVisible(props.post.acl)) {\n return (\n
  • \n \n \n \n
  • \n )\n } else {\n return null\n }\n}\n\nexport function isVisible(acl) {\n return acl.can_hide\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: this.props.user.username,\n url: Object.assign(this.props.post.url, {\n hidden_by: this.props.user.url,\n }),\n })\n )\n\n const op = { op: \"replace\", path: \"is-hidden\", value: true }\n\n ajax.patch(this.props.post.api.index, [op]).then(\n (patch) => {\n store.dispatch(post.patch(this.props.post, patch))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: false,\n })\n )\n }\n )\n }\n\n render() {\n if (!this.props.post.is_hidden) {\n return (\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: false,\n })\n )\n\n const op = { op: \"replace\", path: \"is-hidden\", value: false }\n\n ajax.patch(this.props.post.api.index, [op]).then(\n (patch) => {\n store.dispatch(post.patch(this.props.post, patch))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: true,\n })\n )\n }\n )\n }\n\n render() {\n if (this.props.post.is_hidden) {\n return (\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n const decision = window.confirm(\n pgettext(\n \"event delete\",\n \"Are you sure you wish to delete this event? This action is not reversible!\"\n )\n )\n if (decision) {\n this.delete()\n }\n }\n\n delete = () => {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n ajax.delete(this.props.post.api.index).then(\n () => {\n snackbar.success(pgettext(\"event delete\", \"Event has been deleted.\"))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: false,\n })\n )\n }\n )\n }\n\n render() {\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport Controls from \"./controls\"\n\nconst DATE_ABBR = '%(relative)s'\nconst DATE_URL = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n \n
    \n )\n}\n\nexport function Hidden(props) {\n if (props.post.is_hidden) {\n let user = null\n if (props.post.url.hidden_by) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.post.url.hidden_by),\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n relative: escapeHtml(props.post.hidden_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\"event info\", \"Hidden by %(event_by)s %(event_on)s.\")\n ),\n {\n event_by: user,\n event_on: date,\n },\n true\n )\n\n return (\n \n )\n } else {\n return null\n }\n}\n\nexport function Poster(props) {\n let user = null\n if (props.post.poster) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.post.poster.url),\n user: escapeHtml(props.post.poster_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.post.poster_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_URL,\n {\n url: escapeHtml(props.post.url.index),\n absolute: escapeHtml(props.post.posted_on.format(\"LLL\")),\n relative: escapeHtml(props.post.posted_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(pgettext(\"event info\", \"By %(event_by)s %(event_on)s.\")),\n {\n event_by: user,\n event_on: date,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst MESSAGE = {\n pinned_globally: pgettext(\n \"event message\",\n \"Thread has been pinned globally.\"\n ),\n pinned_locally: pgettext(\n \"event message\",\n \"Thread has been pinned in category.\"\n ),\n unpinned: pgettext(\"event message\", \"Thread has been unpinned.\"),\n\n approved: pgettext(\"event message\", \"Thread has been approved.\"),\n\n opened: pgettext(\"event message\", \"Thread has been opened.\"),\n closed: pgettext(\"event message\", \"Thread has been closed.\"),\n\n unhid: pgettext(\"event message\", \"Thread has been revealed.\"),\n hid: pgettext(\"event message\", \"Thread has been made hidden.\"),\n\n tookover: pgettext(\"event message\", \"Took thread over.\"),\n\n owner_left: pgettext(\n \"event message\",\n \"Owner has left thread. This thread is now closed.\"\n ),\n participant_left: pgettext(\"event message\", \"Participant has left thread.\"),\n}\n\nconst ITEM_LINK = '%(name)s'\nconst ITEM_SPAN = '%(name)s'\n\nexport default function (props) {\n if (MESSAGE[props.post.event_type]) {\n return

    {MESSAGE[props.post.event_type]}

    \n } else if (props.post.event_type === \"changed_title\") {\n return \n } else if (props.post.event_type === \"moved\") {\n return \n } else if (props.post.event_type === \"merged\") {\n return \n } else if (props.post.event_type === \"changed_owner\") {\n return \n } else if (props.post.event_type === \"added_participant\") {\n return \n } else if (props.post.event_type === \"removed_participant\") {\n return \n } else {\n return null\n }\n}\n\nexport function ChangedTitle(props) {\n const msgstring = escapeHtml(\n pgettext(\n \"event message\",\n \"Thread title has been changed from %(old_title)s.\"\n )\n )\n const oldTitle = interpolate(\n ITEM_SPAN,\n {\n name: escapeHtml(props.post.event_context.old_title),\n },\n true\n )\n const message = interpolate(\n msgstring,\n {\n old_title: oldTitle,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function Moved(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Thread has been moved from %(from_category)s.\")\n )\n const fromCategory = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.from_category.url),\n name: escapeHtml(props.post.event_context.from_category.name),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n from_category: fromCategory,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function Merged(props) {\n const msgstring = escapeHtml(\n pgettext(\n \"event message\",\n \"The %(merged_thread)s thread has been merged into this thread.\"\n )\n )\n const mergedThread = interpolate(\n ITEM_SPAN,\n {\n name: escapeHtml(props.post.event_context.merged_thread),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n merged_thread: mergedThread,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function ChangedOwner(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Changed thread owner to %(user)s.\")\n )\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function AddedParticipant(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Added %(user)s to thread.\")\n )\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function RemovedParticipant(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Removed %(user)s from thread.\")\n )\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n if (post.is_read) return null\n\n return (\n
    \n \n {pgettext(\"event unread label\", \"New event\")}\n \n
    \n )\n}\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.initialized = false\n this.primed = false\n this.observer = null\n }\n\n initialize = (element) => {\n this.initialized = true\n\n this.observer = new IntersectionObserver((entries) =>\n entries.forEach(this.callback)\n )\n this.observer.observe(element)\n }\n\n callback = (entry) => {\n if (!entry.isIntersecting || this.props.post.is_read || this.primed) {\n return\n }\n\n window.setTimeout(() => {\n ajax.post(this.props.post.api.read)\n }, 0)\n\n this.primed = true\n this.destroy()\n }\n\n destroy() {\n if (this.observer) {\n this.observer.disconnect()\n this.observer = null\n }\n }\n\n componentWillUnmount() {\n this.destroy()\n }\n\n render() {\n const ready = !this.initialized && !this.primed && !this.props.post.is_read\n\n return (\n {\n if (node && ready) {\n this.initialize(node)\n }\n }}\n >\n {this.props.children}\n \n )\n }\n}\n","import React from \"react\"\nimport Icon from \"./icon\"\nimport Info from \"./info\"\nimport Message from \"./message\"\nimport UnreadLabel from \"./unread-label\"\nimport Waypoint from \"../waypoint\"\n\nexport default function (props) {\n let className = \"event\"\n if (props.post.isDeleted) {\n className = \"hide\"\n } else if (props.post.is_hidden) {\n className = \"event post-hidden\"\n }\n\n return (\n
  • \n \n
    \n
    \n \n
    \n \n \n \n \n
    \n
  • \n )\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport formatFilesize from \"misago/utils/file-size\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
    \n \n
    \n \n {props.attachment.filename}\n \n \n
    \n
    \n )\n}\n\nexport function AttachmentPreview(props) {\n if (props.attachment.is_image) {\n return (\n
    \n \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n}\n\nexport function AttachmentIcon(props) {\n return (\n \n insert_drive_file\n \n )\n}\n\nexport function AttachmentThumbnail(props) {\n const url = props.attachment.url.thumb || props.attachment.url.index\n return (\n \n )\n}\n\nexport function AttachmentDetails(props) {\n let user = null\n if (props.attachment.url.uploader) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.attachment.url.uploader),\n user: escapeHtml(props.attachment.uploader_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.attachment.uploader_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.attachment.uploaded_on.format(\"LLL\")),\n relative: escapeHtml(props.attachment.uploaded_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\n \"post attachment\",\n \"%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.\"\n )\n ),\n {\n filetype: props.attachment.filetype,\n size: formatFilesize(props.attachment.size),\n uploader: user,\n uploaded_on: date,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\nimport batch from \"misago/utils/batch\"\nimport Attachment from \"./attachment\"\n\nexport default function (props) {\n if (!isVisible(props.post)) {\n return null\n }\n\n return (\n
    \n {batch(props.post.attachments, 2).map((row) => {\n const key = row\n .map((a) => {\n return a ? a.id : 0\n })\n .join(\"_\")\n return \n })}\n
    \n )\n}\n\nexport function isVisible(post) {\n return (!post.is_hidden || post.acl.can_see_hidden) && post.attachments\n}\n\nexport function Row(props) {\n return (\n
    \n {props.row.map((attachment) => {\n return (\n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Waypoint from \"../waypoint\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst HIDDEN_BY_URL = '%(user)s'\nconst HIDDEN_BY_SPAN = '%(user)s'\nconst HIDDEN_ON =\n '%(relative)s'\n\nexport default function (props) {\n if (props.post.is_hidden && !props.post.acl.can_see_hidden) {\n return \n } else if (props.post.content) {\n return \n } else {\n return \n }\n}\n\nexport function Default({ post }) {\n const poster = \"@\" + (post.poster ? post.poster.username : post.poster_name)\n\n return (\n \n \n \n )\n}\n\nexport function Hidden(props) {\n let user = null\n if (props.post.hidden_by) {\n user = interpolate(\n HIDDEN_BY_URL,\n {\n url: escapeHtml(props.post.url.hidden_by),\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n } else {\n user = interpolate(\n HIDDEN_BY_SPAN,\n {\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n }\n\n const date = interpolate(\n HIDDEN_ON,\n {\n absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n relative: escapeHtml(props.post.hidden_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\"post body hidden\", \"Hidden by %(hidden_by)s %(hidden_on)s.\")\n ),\n {\n hidden_by: user,\n hidden_on: date,\n },\n true\n )\n\n return (\n \n

    \n {pgettext(\n \"post body hidden\",\n \"This post is hidden. You cannot see its contents.\"\n )}\n

    \n

    \n \n )\n}\n\nexport function Invalid(props) {\n return (\n \n

    \n {pgettext(\n \"post body invalid\",\n \"This post's contents cannot be displayed.\"\n )}\n

    \n

    \n {pgettext(\n \"post body invalid\",\n \"This error is caused by invalid post content manipulation.\"\n )}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport function FlagBestAnswer({ post, thread, user }) {\n if (!(isVisible(post) && post.id === thread.best_answer)) {\n return null\n }\n\n let message = null\n if (user.id && thread.best_answer_marked_by === user.id) {\n message = interpolate(\n pgettext(\n \"post best answer flag\",\n \"Marked as best answer by you %(marked_on)s.\"\n ),\n {\n marked_on: thread.best_answer_marked_on.fromNow(),\n },\n true\n )\n } else {\n message = interpolate(\n pgettext(\n \"post best answer flag\",\n \"Marked as best answer by %(marked_by)s %(marked_on)s.\"\n ),\n {\n marked_by: thread.best_answer_marked_by_name,\n marked_on: thread.best_answer_marked_on.fromNow(),\n },\n true\n )\n }\n\n return (\n
    \n check_box\n

    {message}

    \n
    \n )\n}\n\nexport function FlagHidden(props) {\n if (!(isVisible(props.post) && props.post.is_hidden)) {\n return null\n }\n\n return (\n
    \n visibility_off\n

    \n {pgettext(\n \"post hidden flag\",\n \"This post is hidden. Only users with permission may see its contents.\"\n )}\n

    \n
    \n )\n}\n\nexport function FlagUnapproved(props) {\n if (!(isVisible(props.post) && props.post.is_unapproved)) {\n return null\n }\n\n return (\n
    \n remove_circle_outline\n

    \n {pgettext(\n \"post unapproved flag\",\n \"This post is unapproved. Only users with permission to approve posts and its author may see its contents.\"\n )}\n

    \n
    \n )\n}\n\nexport function FlagProtected(props) {\n if (!(isVisible(props.post) && props.post.is_protected)) {\n return null\n }\n\n return (\n
    \n lock_outline\n

    \n {pgettext(\n \"post protected flag\",\n \"This post is protected. Only moderators may change it.\"\n )}\n

    \n
    \n )\n}\n\nexport function isVisible(post) {\n return !post.is_hidden || post.acl.can_see_hidden\n}\n","import moment from \"moment\"\nimport * as thread from \"misago/reducers/thread\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function approve(props) {\n store.dispatch(\n post.patch(props.post, {\n is_unapproved: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-unapproved\", value: false }]\n\n const previousState = {\n is_unapproved: props.post.is_unapproved,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function protect(props) {\n store.dispatch(\n post.patch(props.post, {\n is_protected: true,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: true }]\n\n const previousState = {\n is_protected: props.post.is_protected,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unprotect(props) {\n store.dispatch(\n post.patch(props.post, {\n is_protected: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: false }]\n\n const previousState = {\n is_protected: props.post.is_protected,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function hide(props) {\n store.dispatch(\n post.patch(props.post, {\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(props.post.url, {\n hidden_by: props.user.url,\n }),\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: true }]\n\n const previousState = {\n is_hidden: props.post.is_hidden,\n hidden_on: props.post.hidden_on,\n hidden_by_name: props.post.hidden_by_name,\n url: props.post.url,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unhide(props) {\n store.dispatch(\n post.patch(props.post, {\n is_hidden: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: false }]\n\n const previousState = {\n is_hidden: props.post.is_hidden,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function like(props) {\n const lastLikes = props.post.last_likes || []\n const concatedLikes = [props.user].concat(lastLikes)\n const finalLikes =\n concatedLikes.length > 3 ? concatedLikes.slice(0, -1) : concatedLikes\n\n store.dispatch(\n post.patch(props.post, {\n is_liked: true,\n likes: props.post.likes + 1,\n last_likes: finalLikes,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-liked\", value: true }]\n\n const previousState = {\n is_liked: props.post.is_liked,\n likes: props.post.likes,\n last_likes: props.post.last_likes,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unlike(props) {\n store.dispatch(\n post.patch(props.post, {\n is_liked: false,\n likes: props.post.likes - 1,\n last_likes: props.post.last_likes.filter((user) => {\n return !user.id || user.id !== props.user.id\n }),\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-liked\", value: false }]\n\n const previousState = {\n is_liked: props.post.is_liked,\n likes: props.post.likes,\n last_likes: props.post.last_likes,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function patch(props, ops, previousState) {\n ajax.patch(props.post.api.index, ops).then(\n (newState) => {\n store.dispatch(post.patch(props.post, newState))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(post.patch(props.post, previousState))\n }\n )\n}\n\nexport function remove(props) {\n let confirmed = window.confirm(\n pgettext(\n \"post delete\",\n \"Are you sure you want to delete this post? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n store.dispatch(\n post.patch(props.post, {\n isDeleted: true,\n })\n )\n\n ajax.delete(props.post.api.index).then(\n () => {\n snackbar.success(pgettext(\"post delete\", \"Post has been deleted.\"))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(props.post, {\n isDeleted: false,\n })\n )\n }\n )\n}\n\nexport function markAsBestAnswer(props) {\n const { post, user } = props\n\n store.dispatch(\n thread.update({\n best_answer: post.id,\n best_answer_is_protected: post.is_protected,\n best_answer_marked_on: moment(),\n best_answer_marked_by: user.id,\n best_answer_marked_by_name: user.username,\n best_answer_marked_by_slug: user.slug,\n })\n )\n\n const ops = [\n { op: \"replace\", path: \"best-answer\", value: post.id },\n { op: \"add\", path: \"acl\", value: true },\n ]\n\n const previousState = {\n best_answer: props.thread.best_answer,\n best_answer_is_protected: props.thread.best_answer_is_protected,\n best_answer_marked_on: props.thread.best_answer_marked_on,\n best_answer_marked_by: props.thread.best_answer_marked_by,\n best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n }\n\n patchThread(props, ops, previousState)\n}\n\nexport function unmarkBestAnswer(props) {\n const { post } = props\n\n store.dispatch(\n thread.update({\n best_answer: null,\n best_answer_is_protected: false,\n best_answer_marked_on: null,\n best_answer_marked_by: null,\n best_answer_marked_by_name: null,\n best_answer_marked_by_slug: null,\n })\n )\n\n const ops = [\n { op: \"remove\", path: \"best-answer\", value: post.id },\n { op: \"add\", path: \"acl\", value: true },\n ]\n\n const previousState = {\n best_answer: props.thread.best_answer,\n best_answer_is_protected: props.thread.best_answer_is_protected,\n best_answer_marked_on: props.thread.best_answer_marked_on,\n best_answer_marked_by: props.thread.best_answer_marked_by,\n best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n }\n\n patchThread(props, ops, previousState)\n}\n\nexport function patchThread(props, ops, previousState) {\n ajax.patch(props.thread.api.index, ops).then(\n (newState) => {\n if (newState.best_answer_marked_on) {\n newState.best_answer_marked_on = moment(newState.best_answer_marked_on)\n }\n store.dispatch(thread.update(newState))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(thread.update(previousState))\n }\n )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Avatar from \"misago/components/avatar\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n\n error: null,\n likes: [],\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.post.api.likes).then(\n (data) => {\n this.setState({\n isReady: true,\n likes: data.map(hydrateLike),\n })\n },\n (rejection) => {\n this.setState({\n isReady: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.error) {\n return (\n \n \n \n )\n } else if (this.state.isReady) {\n if (this.state.likes.length) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n}\n\nexport function hydrateLike(data) {\n return Object.assign({}, data, {\n liked_on: moment(data.liked_on),\n })\n}\n\nexport function ModalDialog({ className, children, likes }) {\n let title = pgettext(\"post likes modal title\", \"Post Likes\")\n if (likes) {\n const likesCount = likes.length\n const message = npgettext(\n \"post likes modal\",\n \"%(likes)s like\",\n \"%(likes)s likes\",\n likesCount\n )\n\n title = interpolate(message, { likes: likesCount }, true)\n }\n\n return (\n
    \n
    \n
    \n \n ×\n \n

    {title}

    \n
    \n {children}\n
    \n
    \n )\n}\n\nexport function LikesList(props) {\n return (\n
    \n
      \n {props.likes.map((like) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function LikeDetails(props) {\n if (props.url) {\n const user = {\n id: props.liker_id,\n avatars: props.avatars,\n }\n\n return (\n
  • \n
    \n \n \n \n
    \n
    \n \n {props.username}\n {\" \"}\n \n
    \n
  • \n )\n }\n\n return (\n
  • \n
    \n \n \n \n
    \n
    \n {props.username} \n
    \n
  • \n )\n}\n\nexport function LikeDate(props) {\n return (\n \n {props.likedOn.fromNow()}\n \n )\n}\n","import React from \"react\"\nimport * as actions from \"./controls/actions\"\nimport LikesModal from \"misago/components/post-likes\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\n\nexport default function (props) {\n if (!isVisible(props.post)) return null\n\n return (\n
    \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport function isVisible(post) {\n return (\n (!post.is_hidden || post.acl.can_see_hidden) &&\n (post.acl.can_reply ||\n post.acl.can_edit ||\n (post.acl.can_see_likes && (post.last_likes || []).length) ||\n post.acl.can_like)\n )\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n onClick = () => {\n actions.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n \n check_box\n {pgettext(\"post footer btn\", \"Best answer\")}\n \n )\n }\n}\n\nexport class MarkAsBestAnswerCompact extends React.Component {\n onClick = () => {\n actions.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n \n check_box\n \n )\n }\n}\n\nexport class Like extends React.Component {\n onClick = () => {\n if (this.props.post.is_liked) {\n actions.unlike(this.props)\n } else {\n actions.like(this.props)\n }\n }\n\n render() {\n if (!this.props.post.acl.can_like) return null\n\n let className = \"btn btn-default btn-sm pull-left\"\n if (this.props.post.is_liked) {\n className = \"btn btn-success btn-sm pull-left\"\n }\n\n return (\n \n {this.props.post.is_liked\n ? pgettext(\"post footer btn\", \"Liked\")\n : pgettext(\"post footer btn\", \"Like\")}\n \n )\n }\n}\n\nexport class Likes extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const hasLikes = (this.props.post.last_likes || []).length > 0\n if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n if (this.props.post.acl.can_see_likes === 2) {\n return (\n \n {getLikesMessage(this.props.likes, this.props.lastLikes)}\n \n )\n }\n\n return (\n

    \n {getLikesMessage(this.props.likes, this.props.lastLikes)}\n

    \n )\n }\n}\n\nexport class LikesCompact extends Likes {\n render() {\n const hasLikes = (this.props.post.last_likes || []).length > 0\n if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n if (this.props.post.acl.can_see_likes === 2) {\n return (\n \n favorite\n {this.props.likes}\n \n )\n }\n\n return (\n

    \n favorite\n {this.props.likes}\n

    \n )\n }\n}\n\nexport function getLikesMessage(likes, users) {\n const usernames = users.slice(0, 3).map((u) => u.username)\n\n if (usernames.length == 1) {\n return interpolate(\n pgettext(\"post likes\", \"%(user)s likes this.\"),\n {\n user: usernames[0],\n },\n true\n )\n }\n\n const hiddenLikes = likes - usernames.length\n\n const otherUsers = usernames.slice(0, -1).join(\", \")\n const lastUser = usernames.slice(-1)[0]\n\n const usernamesList = interpolate(\n pgettext(\"post likes\", \"%(users)s and %(last_user)s\"),\n {\n users: otherUsers,\n last_user: lastUser,\n },\n true\n )\n\n if (hiddenLikes === 0) {\n return interpolate(\n pgettext(\"post likes\", \"%(users)s like this.\"),\n {\n users: usernamesList,\n },\n true\n )\n }\n\n const message = npgettext(\n \"post likes\",\n \"%(users)s and %(likes)s other user like this.\",\n \"%(users)s and %(likes)s other users like this.\",\n hiddenLikes\n )\n\n return interpolate(\n message,\n {\n users: usernames.join(\", \"),\n likes: hiddenLikes,\n },\n true\n )\n}\n\nexport class Reply extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"REPLY\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n })\n }\n\n render() {\n if (this.props.post.acl.can_reply) {\n return (\n \n {pgettext(\"post footer btn\", \"Reply\")}\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Quote extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"QUOTE\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n\n context: {\n reply: this.props.post.id,\n },\n })\n }\n\n render() {\n if (this.props.post.acl.can_reply) {\n return (\n \n {pgettext(\"post footer btn\", \"Quote\")}\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Edit extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"EDIT\",\n\n thread: this.props.thread,\n post: this.props.post,\n config: this.props.post.api.editor,\n submit: this.props.post.api.index,\n })\n }\n\n render() {\n if (this.props.post.acl.can_edit) {\n return (\n \n {pgettext(\"post footer btn\", \"Edit\")}\n \n )\n } else {\n return null\n }\n }\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(\n pgettext(\n \"post move modal\",\n \"You have to enter link to the other thread.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.move, {\n new_thread: this.state.url,\n posts: [this.props.post.id],\n })\n }\n\n handleSuccess(success) {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n modal.hide()\n\n snackbar.success(\n pgettext(\n \"post move modal\",\n \"Selected post was moved to the other thread.\"\n )\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"post move modal btn\", \"Move post\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"post move modal title\", \"Move post\")}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n
      \n {props.diff.map((item, i) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function DiffItem(props) {\n if (props.item[0] === \"?\") return null\n\n return (\n
  • {cleanItem(props.item)}
  • \n )\n}\n\nexport function getItemClassName(item) {\n let className = \"diff-item\"\n if (item[0] === \"-\") {\n className += \" diff-item-sub\"\n } else if (item[0] === \"+\") {\n className += \" diff-item-add\"\n }\n return className\n}\n\nexport function cleanItem(item) {\n return item.substr(2)\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\n\nexport default class extends React.Component {\n onClick = () => {\n this.props.revertEdit(this.props.edit.id)\n }\n\n render() {\n if (!this.props.canRevert) return null\n\n return (\n
    \n \n {pgettext(\"post revert btn\", \"Revert\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default class extends React.Component {\n goLast = () => {\n this.props.goToEdit()\n }\n\n goForward = () => {\n this.props.goToEdit(this.props.edit.next)\n }\n\n goBack = () => {\n this.props.goToEdit(this.props.edit.previous)\n }\n\n revertEdit = () => {\n this.props.revertEdit(this.props.edit.id)\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n )\n }\n}\n\nexport function GoBackBtn(props) {\n return (\n \n chevron_left\n \n )\n}\n\nexport function GoForwardBtn(props) {\n return (\n \n chevron_right\n \n )\n}\n\nexport function GoLastBtn(props) {\n return (\n \n last_page\n \n )\n}\n\nexport function RevertBtn(props) {\n if (!props.canRevert) return null\n\n return (\n
    \n \n {pgettext(\"post revert btn\", \"Revert\")}\n \n
    \n )\n}\n\nexport function Label(props) {\n let user = null\n if (props.edit.url.editor) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.edit.url.editor),\n user: escapeHtml(props.edit.editor_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.edit.editor_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.edit.edited_on.format(\"LLL\")),\n relative: escapeHtml(props.edit.edited_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\"post history modal\", \"By %(edited_by)s %(edited_on)s.\")\n ),\n {\n edited_by: user,\n edited_on: date,\n },\n true\n )\n\n return

    \n}\n","import moment from \"moment\"\n\nexport function hydrateEdit(json) {\n return Object.assign({}, json, {\n edited_on: moment(json.edited_on),\n })\n}\n","import React from \"react\"\nimport Diff from \"./diff\"\nimport Footer from \"./footer\"\nimport Toolbar from \"./toolbar\"\nimport { hydrateEdit } from \"./utils\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isBusy: true,\n\n canRevert: props.post.acl.can_edit,\n\n error: null,\n edit: null,\n }\n }\n\n componentDidMount() {\n this.goToEdit()\n }\n\n goToEdit = (edit = null) => {\n this.setState({\n isBusy: true,\n })\n\n let url = this.props.post.api.edits\n if (edit !== null) {\n url += \"?edit=\" + edit\n }\n\n ajax.get(url).then(\n (data) => {\n this.setState({\n isReady: true,\n isBusy: false,\n edit: hydrateEdit(data),\n })\n },\n (rejection) => {\n this.setState({\n isReady: true,\n isBusy: false,\n error: rejection.detail,\n })\n }\n )\n }\n\n revertEdit = (edit) => {\n if (this.state.isBusy) return\n\n const confirmation = window.confirm(\n pgettext(\n \"post revert\",\n \"Are you sure you with to revert this post to the state from before this edit?\"\n )\n )\n if (!confirmation) return\n\n this.setState({\n isBusy: true,\n })\n\n const url = this.props.post.api.edits + \"?edit=\" + edit\n ajax.post(url).then(\n (data) => {\n const hydratedPost = post.hydrate(data)\n store.dispatch(post.patch(data, hydratedPost))\n\n snackbar.success(\n pgettext(\"post revert\", \"Post has been reverted to previous state.\")\n )\n modal.hide()\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n this.setState({\n isBusy: false,\n })\n }\n )\n }\n\n render() {\n if (this.state.error) {\n return (\n \n \n \n )\n } else if (this.state.isReady) {\n return (\n \n \n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n}\n\nexport function ModalDialog(props) {\n return (\n

    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"post history modal title\", \"Post edits history\")}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport Select from \"misago/components/select\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default function (props) {\n return \n}\n\nexport class PostingConfig extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isError: false,\n\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n post: item.post,\n })\n })\n\n this.setState({\n isLoaded: true,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.isError) {\n return \n } else if (this.state.isLoaded) {\n return (\n \n )\n } else {\n return \n }\n }\n}\n\nexport class ModerationForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n title: \"\",\n category: null,\n categories: props.categories,\n weight: 0,\n is_hidden: 0,\n is_closed: false,\n\n validators: {\n title: [validators.required()],\n },\n\n errors: {},\n }\n\n this.isHiddenChoices = [\n {\n value: 0,\n icon: \"visibility\",\n label: pgettext(\"thread hidden switch choice\", \"No\"),\n },\n {\n value: 1,\n icon: \"visibility_off\",\n label: pgettext(\"thread hidden switch choice\", \"Yes\"),\n },\n ]\n\n this.isClosedChoices = [\n {\n value: false,\n icon: \"lock_outline\",\n label: pgettext(\"thread closed switch choice\", \"No\"),\n },\n {\n value: true,\n icon: \"lock\",\n label: pgettext(\"thread closed switch choice\", \"Yes\"),\n },\n ]\n\n this.acl = {}\n this.props.categories.forEach((category) => {\n if (category.post) {\n if (!this.state.category) {\n this.state.category = category.id\n }\n\n this.acl[category.id] = {\n can_pin_threads: category.post.pin,\n can_close_threads: category.post.close,\n can_hide_threads: category.post.hide,\n }\n }\n })\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.split, {\n title: this.state.title,\n category: this.state.category,\n weight: this.state.weight,\n is_hidden: this.state.is_hidden,\n is_closed: this.state.is_closed,\n posts: [this.props.post.id],\n })\n }\n\n handleSuccess(apiResponse) {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n modal.hide()\n\n snackbar.success(\n pgettext(\"post split modal\", \"Selected post was split into new thread.\")\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n snackbar.error(gettext(\"Form contains errors.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (ev) => {\n const categoryId = ev.target.value\n const newState = {\n category: categoryId,\n }\n\n if (this.acl[categoryId].can_pin_threads < newState.weight) {\n newState.weight = 0\n }\n\n if (!this.acl[categoryId].can_hide_threads) {\n newState.is_hidden = 0\n }\n\n if (!this.acl[categoryId].can_close_threads) {\n newState.is_closed = false\n }\n\n this.setState(newState)\n }\n\n getWeightChoices() {\n const choices = [\n {\n value: 0,\n icon: \"remove\",\n label: pgettext(\"thread weight choice\", \"Not pinned\"),\n },\n {\n value: 1,\n icon: \"bookmark_border\",\n label: pgettext(\"thread weight choice\", \"Pinned in category\"),\n },\n ]\n\n if (this.acl[this.state.category].can_pin_threads == 2) {\n choices.push({\n value: 2,\n icon: \"bookmark\",\n label: pgettext(\"thread weight choice\", \"Pinned globally\"),\n })\n }\n\n return choices\n }\n\n renderWeightField() {\n if (this.acl[this.state.category].can_pin_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderHiddenField() {\n if (this.acl[this.state.category].can_hide_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderClosedField() {\n if (this.acl[this.state.category].can_close_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n \n \n
    \n\n \n \n \n
    \n\n {this.renderWeightField()}\n {this.renderHiddenField()}\n {this.renderClosedField()}\n
    \n
    \n \n
    \n \n \n )\n }\n}\n\nexport function Loader() {\n return (\n \n \n \n )\n}\n\nexport function Error(props) {\n return (\n \n
    \n info_outline\n
    \n
    \n

    \n {pgettext(\n \"post split modal\",\n \"You can't move this post at the moment.\"\n )}\n

    \n

    {props.message}

    \n
    \n
    \n )\n}\n\nexport function Modal(props) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"posts split modal title\", \"Split post into new thread\")}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport * as moderation from \"./actions\"\nimport MoveModal from \"./move\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport SplitModal from \"./split\"\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport class Permalink extends React.Component {\n onClick = () => {\n let permaUrl = window.location.protocol + \"//\"\n permaUrl += window.location.host\n permaUrl += this.props.post.url.index\n\n prompt(pgettext(\"post permalink\", \"Permament link to this post:\"), permaUrl)\n }\n\n render() {\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Edit extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"EDIT\",\n\n thread: this.props.thread,\n post: this.props.post,\n config: this.props.post.api.editor,\n submit: this.props.post.api.index,\n })\n }\n\n render() {\n if (!this.props.post.acl.can_edit) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n onClick = () => {\n moderation.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (post.id === thread.best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class UnmarkMarkBestAnswer extends React.Component {\n onClick = () => {\n moderation.unmarkBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id !== thread.best_answer) return null\n if (!thread.acl.can_unmark_best_answer) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class PostEdits extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isHidden =\n this.props.post.is_hidden && !this.props.post.acl.can_see_hidden\n const isUnedited = this.props.post.edits === 0\n if (isHidden || isUnedited) return null\n\n const message = npgettext(\n \"post edits\",\n \"This post was edited %(edits)s time.\",\n \"This post was edited %(edits)s times.\",\n this.props.post.edits\n )\n\n const title = interpolate(\n message,\n {\n edits: this.props.post.edits,\n },\n true\n )\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Approve extends React.Component {\n onClick = () => {\n moderation.approve(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_approve) return null\n if (!this.props.post.is_unapproved) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Move extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.post.acl.can_move) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Split extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.post.acl.can_move) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Protect extends React.Component {\n onClick = () => {\n moderation.protect(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_protect) return null\n if (this.props.post.is_protected) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unprotect extends React.Component {\n onClick = () => {\n moderation.unprotect(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_protect) return null\n if (!this.props.post.is_protected) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n moderation.hide(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id === thread.best_answer) return null\n if (!post.acl.can_hide) return null\n if (post.is_hidden) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n moderation.unhide(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_unhide) return null\n if (!this.props.post.is_hidden) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n moderation.remove(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id === thread.best_answer) return null\n if (!post.acl.can_delete) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport Dropdown from \"./dropdown\"\n\nexport default function (props) {\n return (\n
    \n \n expand_more\n \n \n
    \n )\n}\n","import React from \"react\"\nimport * as posts from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n onClick = () => {\n if (this.props.post.isSelected) {\n store.dispatch(posts.deselect(this.props.post))\n } else {\n store.dispatch(posts.select(this.props.post))\n }\n }\n\n render() {\n if (\n !(this.props.thread.acl.can_merge_posts || isVisible(this.props.post.acl))\n ) {\n return null\n }\n\n return (\n
    \n \n \n {this.props.post.isSelected\n ? \"check_box\"\n : \"check_box_outline_blank\"}\n \n \n
    \n )\n }\n}\n\nexport function isVisible(acl) {\n return (\n acl.can_approve ||\n acl.can_hide ||\n acl.can_protect ||\n acl.can_unhide ||\n acl.can_delete ||\n acl.can_move\n )\n}\n","import React from \"react\"\nimport Controls from \"./controls\"\nimport Select from \"./select\"\nimport {\n StatusIcon,\n getStatusClassName,\n getStatusDescription,\n} from \"misago/components/user-status\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport modal from \"misago/services/modal\"\n\nexport default function (props) {\n return (\n
    \n \n \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n {post.poster_name}\n\n \n {pgettext(\"post removed poster username\", \"Removed user\")}\n \n
    \n
    \n
    \n )\n}\n","export default function ({ title, rank }) {\n return rank.is_tab || !!title || !!rank.title\n}\n","import React from \"react\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n const message = npgettext(\n \"poster stats\",\n \"%(posts)s post\",\n \"%(posts)s posts\",\n poster.posts\n )\n\n let className = \"user-postcount\"\n if (hasVisibleTitle(poster)) {\n className += \" hidden-xs hidden-sm\"\n }\n\n return (\n \n {interpolate(\n message,\n {\n posts: poster.posts,\n },\n true\n )}\n \n )\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n let className = \"hidden-xs\"\n if (hasVisibleTitle(poster)) {\n className += \" hidden-sm\"\n }\n\n return (\n \n \n \n \n \n )\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title\n if (!userTitle && rank.is_tab) {\n userTitle = rank.name\n }\n\n if (!userTitle) return null\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n )\n }\n\n return
    {userTitle}
    \n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Controls from \"misago/components/posts-list/post/controls\"\nimport Select from \"misago/components/posts-list/post/select\"\nimport UserStatus, { StatusIcon } from \"misago/components/user-status\"\nimport UserPostcount from \"./user-postcount\"\nimport UserStatusLabel from \"./user-status\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ post, thread }) {\n const { poster } = post\n\n return (\n
    \n \n \n )\n}\n\nexport function PollSelect({ choices, onChange, value }) {\n if (!choices) return null\n\n return (\n \n \n {choices.map((choice) => {\n return (\n \n )\n })}\n \n \n )\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport MergeConflict from \"misago/components/merge-conflict\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(\n pgettext(\n \"thread merge form\",\n \"You have to enter link to the other thread.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n // freeze thread\n store.dispatch(thread.busy())\n\n return ajax.post(this.props.thread.api.merge, {\n other_thread: this.state.url,\n })\n }\n\n handleSuccess = (success) => {\n this.handleSuccessUnmounted(success)\n\n // keep form loading\n this.setState({\n isLoading: true,\n })\n }\n\n handleSuccessUnmounted = (success) => {\n snackbar.success(\n pgettext(\"thread merge form\", \"Thread has been merged with other one.\")\n )\n window.location = success.url\n }\n\n handleError = (rejection) => {\n store.dispatch(thread.release())\n\n if (rejection.status === 400) {\n if (rejection.best_answers || rejection.polls) {\n modal.show(\n \n )\n } else if (rejection.best_answer) {\n snackbar.error(rejection.best_answer[0])\n } else if (rejection.poll) {\n snackbar.error(rejection.poll[0])\n } else {\n snackbar.error(rejection.detail)\n }\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"thread merge form btn\", \"Cancel\")}\n \n \n {pgettext(\"thread merge form btn\", \"Merge thread\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"thread merge form title\", \"Merge thread\")}\n

    \n
    \n )\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport * as posts from \"misago/reducers/posts\"\nimport * as thread from \"misago/reducers/thread\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n isError: false,\n\n category: null,\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n let category = null\n\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n // pick first category that allows posting and if it may, override it with initial one\n if (item.post !== false && !category) {\n category = item.id\n }\n\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n })\n })\n\n this.setState({\n isReady: true,\n\n category,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n send() {\n // freeze thread\n store.dispatch(thread.busy())\n\n return ajax.patch(this.props.thread.api.index, [\n { op: \"replace\", path: \"category\", value: this.state.category },\n ])\n }\n\n handleSuccess() {\n // refresh thread and displayed posts\n ajax\n .get(this.props.thread.api.posts.index, { page: this.props.posts.page })\n .then(\n (data) => {\n store.dispatch(thread.replace(data))\n store.dispatch(posts.load(data.post_set))\n store.dispatch(thread.release())\n\n snackbar.success(\n pgettext(\"thread move form\", \"Thread has been moved.\")\n )\n modal.hide()\n },\n (rejection) => {\n store.dispatch(thread.release())\n snackbar.apiError(rejection)\n }\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (event) => {\n this.changeValue(\"category\", event.target.value)\n }\n\n render() {\n if (this.state.isReady) {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"thread move form btn\", \"Cancel\")}\n \n \n {pgettext(\"thread move form btn\", \"Move thread\")}\n \n
    \n
    \n
    \n
    \n )\n } else if (this.state.isError) {\n return \n } else {\n return \n }\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"thread move form title\", \"Move thread\")}\n

    \n
    \n )\n}\n\nexport function ModalLoading(props) {\n return (\n
    \n
    \n \n \n
    \n
    \n )\n}\n\nexport function ModalMessage(props) {\n return (\n
    \n
    \n \n
    \n info_outline\n
    \n
    \n

    \n {pgettext(\n \"thread move form\",\n \"You can't move this thread at the moment.\"\n )}\n

    \n

    {props.message}

    \n \n {pgettext(\"thread move form dismiss btn\", \"Ok\")}\n \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport ThreadChangeTitleModal from \"./ThreadChangeTitleModal\"\nimport MergeModal from \"./merge\"\nimport MoveModal from \"./move\"\n\nexport default class extends React.Component {\n callApi = (ops, successMessage) => {\n store.dispatch(thread.busy())\n\n // by the chance update thread acl too\n ops.push({ op: \"add\", path: \"acl\", value: true })\n\n ajax.patch(this.props.thread.api.index, ops).then(\n (data) => {\n store.dispatch(thread.update(data))\n store.dispatch(thread.release())\n snackbar.success(successMessage)\n },\n (rejection) => {\n store.dispatch(thread.release())\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n )\n }\n\n changeTitle = () => {\n modal.show()\n }\n\n pinGlobally = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"weight\",\n value: 2,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been pinned globally.\")\n )\n }\n\n pinLocally = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"weight\",\n value: 1,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been pinned in category.\")\n )\n }\n\n unpin = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"weight\",\n value: 0,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been unpinned.\")\n )\n }\n\n approve = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-unapproved\",\n value: false,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been approved.\")\n )\n }\n\n open = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-closed\",\n value: false,\n },\n ],\n gettext(\"Thread has been opened.\")\n )\n }\n\n close = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-closed\",\n value: true,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been closed.\")\n )\n }\n\n unhide = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-hidden\",\n value: false,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been made visible.\")\n )\n }\n\n hide = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-hidden\",\n value: true,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been made hidden.\")\n )\n }\n\n move = () => {\n modal.show(\n \n )\n }\n\n merge = () => {\n modal.show()\n }\n\n delete = () => {\n if (\n !window.confirm(\n pgettext(\n \"thread moderation\",\n \"Are you sure you want to delete this thread?\"\n )\n )\n ) {\n return\n }\n\n store.dispatch(thread.busy())\n\n ajax.delete(this.props.thread.api.index).then(\n (data) => {\n snackbar.success(\n pgettext(\"thread moderation\", \"Thread has been deleted.\")\n )\n window.location = this.props.thread.category.url.index\n },\n (rejection) => {\n store.dispatch(thread.release())\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n const { moderation } = this.props\n\n return (\n
      \n {!!moderation.edit && (\n
    • \n \n edit\n {pgettext(\"thread moderation btn\", \"Change title\")}\n \n
    • \n )}\n {!!moderation.pinGlobally && (\n
    • \n \n bookmark\n {pgettext(\"thread moderation btn\", \"Pin globally\")}\n \n
    • \n )}\n {!!moderation.pinLocally && (\n
    • \n \n bookmark_border\n {pgettext(\"thread moderation btn\", \"Pin in category\")}\n \n
    • \n )}\n {!!moderation.unpin && (\n
    • \n \n
    • \n )}\n {!!moderation.move && (\n
    • \n \n
    • \n )}\n {!!moderation.merge && (\n
    • \n \n
    • \n )}\n {!!moderation.approve && (\n
    • \n \n done\n {pgettext(\"thread moderation btn\", \"Approve\")}\n \n
    • \n )}\n {!!moderation.open && (\n
    • \n \n
    • \n )}\n {!!moderation.close && (\n
    • \n \n
    • \n )}\n {!!moderation.unhide && (\n
    • \n \n visibility\n {pgettext(\"thread moderation btn\", \"Unhide\")}\n \n
    • \n )}\n {!!moderation.hide && (\n
    • \n \n
    • \n )}\n {!!moderation.delete && (\n
    • \n \n clear\n {pgettext(\"thread moderation btn\", \"Delete\")}\n \n
    • \n )}\n
    \n )\n }\n}\n","import ThreadModerationOptions from \"./controls\"\n\nexport default ThreadModerationOptions\n","import React from \"react\"\nimport ThreadModerationOptions from \"./moderation/thread\"\n\nconst ThreadModeration = ({ thread, posts, moderation }) => (\n
    \n \n settings\n \n \n
    \n)\n\nexport default ThreadModeration\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport { update } from \"../../reducers/thread\"\nimport snackbar from \"../../services/snackbar\"\nimport { ApiMutation } from \"../Api\"\nimport { DropdownSubheader } from \"../Dropdown\"\n\nconst ThreadWatchButton = ({ dispatch, dropup, stickToBottom, thread }) => (\n \n {(mutate, { loading }) => {\n function setNotifications(notifications) {\n if (thread.notifications !== notifications) {\n dispatch(update({ notifications }))\n mutate({\n json: { notifications },\n onError: (error) => {\n snackbar.apiError(error)\n dispatch(update({ notifications: thread.notifications }))\n },\n })\n }\n }\n\n return (\n
    \n \n \n {getIcon(thread.notifications)}\n \n {getLabel(thread.notifications)}\n \n \n \n {pgettext(\"watch thread\", \"Notify about new replies\")}\n \n
  • \n setNotifications(2)}\n >\n mail\n {pgettext(\"watch thread\", \"On site and with e-mail\")}\n \n
  • \n
  • \n setNotifications(1)}\n >\n notifications_active\n {pgettext(\"watch thread\", \"On site only\")}\n \n
  • \n
  • \n setNotifications(0)}\n >\n notifications_none\n {pgettext(\"watch thread\", \"Don't notify\")}\n \n
  • \n \n
    \n )\n }}\n
    \n)\n\nfunction getIcon(notifications) {\n if (notifications === 2) return \"mail\"\n if (notifications === 1) return \"notifications_active\"\n\n return \"notifications_none\"\n}\n\nfunction getLabel(notifications) {\n if (notifications) {\n return pgettext(\"watch thread\", \"Watching\")\n }\n\n return pgettext(\"watch thread\", \"Watch\")\n}\n\nconst ThreadWatchButtonConnected = connect()(ThreadWatchButton)\n\nexport default ThreadWatchButtonConnected\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst Breadcrumbs = ({ children, className }) => (\n
      {children}
    \n)\n\nexport default Breadcrumbs\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst BreadcrumbsCategory = ({ category, className }) => (\n
  • \n \n \n label\n \n {!!category.short_name && (\n \n {category.short_name}\n \n )}\n {!!category.short_name && (\n {category.name}\n )}\n {!category.short_name && (\n {category.name}\n )}\n \n
  • \n)\n\nexport default BreadcrumbsCategory\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst BreadcrumbsRootCategory = ({ category, className }) => (\n
  • \n \n chevron_right\n \n {category.special_role === \"root_category\"\n ? pgettext(\"breadcrumb\", \"Threads\")\n : pgettext(\"breadcrumb\", \"Private threads\")}\n \n \n
  • \n)\n\nexport default BreadcrumbsRootCategory\n","import React from \"react\"\nimport {\n Breadcrumbs,\n BreadcrumbsCategory,\n BreadcrumbsRootCategory,\n} from \"../../Breadcrumbs\"\n\nconst ThreadHeaderBreadcrumbs = ({ breadcrumbs }) => (\n \n {breadcrumbs.map((category) =>\n category.special_role ? (\n \n ) : (\n \n )\n )}\n \n)\n\nexport default ThreadHeaderBreadcrumbs\n","import React from \"react\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../../FlexRow\"\nimport ThreadFlags from \"../../ThreadFlags\"\nimport ThreadReplies from \"../../ThreadReplies\"\nimport ThreadStarterCard from \"../../ThreadStarterCard\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n PageHeaderDetails,\n} from \"../../PageHeader\"\nimport ThreadModeration from \"../ThreadModeration\"\nimport ThreadWatchButton from \"../ThreadWatchButton\"\nimport ThreadHeaderBreadcrumbs from \"./ThreadHeaderBreadcrumbs\"\n\nconst ThreadHeader = ({ styleName, thread, posts, user, moderation }) => (\n \n \n \n \n

    {thread.title}

    \n
    \n \n \n \n \n \n \n \n {thread.replies > 0 && (\n \n \n \n )}\n {hasFlags(thread) && (\n \n \n \n )}\n \n {user.is_authenticated && (\n \n \n \n \n {moderation.enabled && (\n \n \n \n )}\n \n )}\n \n \n
    \n
    \n)\n\nconst hasFlags = (thread) => {\n return (\n thread.is_closed ||\n thread.is_hidden ||\n thread.is_unapproved ||\n thread.weight > 0 ||\n thread.best_answer ||\n thread.has_poll ||\n thread.has_unapproved_posts\n )\n}\n\nexport default ThreadHeader\n","import ThreadHeader from \"./ThreadHeader\"\n\nexport default ThreadHeader\n","import React from \"react\"\nimport { Link, withRouter } from \"react-router\"\nimport { Dropdown } from \"../Dropdown\"\n\nconst ThreadPaginator = ({ router, baseUrl, posts, scrollToTop }) => (\n
    \n {posts.isLoaded && posts.first ? (\n \n first_page\n \n ) : (\n \n first_page\n \n )}\n {posts.isLoaded && posts.previous ? (\n 1 ? posts.previous + \"/\" : \"\")}\n title={pgettext(\"paginator\", \"Go to previous page\")}\n onClick={scrollToTop ? resetScroll : null}\n >\n chevron_left\n \n ) : (\n \n chevron_left\n \n )}\n (\n \n {getLabel(posts.page, posts.pages)}\n \n )}\n onOpen={(dropdown) => {\n dropdown.querySelector(\"input\").focus()\n }}\n >\n {({ close }) => (\n {\n if (posts.isLoaded) {\n const formData = new FormData(event.target)\n const page = parseInt(formData.get(\"page\"))\n\n if (\n page &&\n page != posts.page &&\n page >= 1 &&\n page <= posts.pages\n ) {\n const url = page > 1 ? baseUrl + page + \"/\" : baseUrl\n router.push({ pathname: url })\n }\n }\n\n event.preventDefault()\n close()\n\n if (scrollToTop) {\n resetScroll()\n }\n }}\n >\n \n \n {pgettext(\"paginator\", \"Go\")}\n \n \n )}\n \n {posts.isLoaded && posts.next ? (\n \n chevron_right\n \n ) : (\n \n chevron_right\n \n )}\n {posts.isLoaded && posts.last ? (\n \n last_page\n \n ) : (\n \n last_page\n \n )}\n
    \n)\n\nfunction getLabel(page, pages) {\n return pgettext(\"paginator\", \"Page %(page)s of %(pages)s\")\n .replace(\"%(page)s\", page)\n .replace(\"%(pages)s\", pages)\n}\n\nfunction resetScroll() {\n window.scrollTo(0, 0)\n}\n\nconst ThreadPaginatorConnected = withRouter(ThreadPaginator)\n\nexport default ThreadPaginatorConnected\n","import React from \"react\"\n\nexport default function ({ errors, posts }) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"thread posts moderation modal title\", \"Moderation\")}\n

    \n
    \n
    \n

    \n {pgettext(\n \"thread posts moderation modal\",\n \"One or more posts could not be changed:\"\n )}\n

    \n\n
      \n {errors.map((post) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n )\n}\n\nexport function PostErrors({ errors, post }) {\n const heading = interpolate(\n pgettext(\"thread posts moderation modal\", \"%(username)s on %(posted_on)s\"),\n {\n posted_on: post.posted_on.format(\"LL, LT\"),\n username: post.poster_name,\n },\n true\n )\n\n return (\n
  • \n
    {heading}:
    \n {errors.map((error, i) => {\n return

    {error}

    \n })}\n
  • \n )\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport * as post from \"misago/reducers/post\"\nimport * as posts from \"misago/reducers/posts\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport ErrorsList from \"./errors-list\"\n\nexport function approve(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-unapproved\", value: false }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_unapproved: false,\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_unapproved: post.is_unapproved,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function protect(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: true }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: true,\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: post.is_protected,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function unprotect(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: false }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: false,\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: post.is_protected,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function hide(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: true }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(post.url, {\n hidden_by: props.user.url,\n }),\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: post.is_hidden,\n hidden_on: post.hidden_on,\n hidden_by_name: post.hidden_by_name,\n url: post.url,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function unhide(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: false }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: false,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(post.url, {\n hidden_by: props.user.url,\n }),\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: post.is_hidden,\n hidden_on: post.hidden_on,\n hidden_by_name: post.hidden_by_name,\n url: post.url,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function patch(props, ops, newState, previousState) {\n const { selection, thread } = props\n\n // patch selected items\n newState.forEach((item) => {\n post.patch(item, item)\n })\n\n // deselect all the things\n store.dispatch(posts.deselectAll())\n\n // call ajax\n const data = {\n ops,\n\n ids: selection.map((post) => {\n return post.id\n }),\n }\n\n ajax.patch(thread.api.posts.index, data).then(\n (data) => {\n data.forEach((item) => {\n store.dispatch(post.patch(item, item))\n })\n },\n (rejection) => {\n if (rejection.status !== 400) {\n // rollback all\n previousState.forEach((item) => {\n store.dispatch(post.patch(item, item))\n })\n return snackbar.apiError(rejection)\n }\n\n let errors = []\n let rollback = []\n\n rejection.forEach((item) => {\n if (item.detail) {\n errors.push(item)\n rollback.push(item.id)\n } else {\n store.dispatch(post.patch(item, item))\n }\n\n previousState.forEach((item) => {\n if (rollback.indexOf(item) !== -1) {\n store.dispatch(post.patch(item, item))\n }\n })\n })\n\n let posts = {}\n selection.forEach((item) => {\n posts[item.id] = item\n })\n\n modal.show()\n }\n )\n}\n\nexport function merge(props) {\n let confirmed = window.confirm(\n pgettext(\n \"merge posts\",\n \"Are you sure you want to merge selected posts? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n props.selection.slice(1).map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n ajax\n .post(props.thread.api.posts.merge, {\n posts: props.selection.map((post) => post.id),\n })\n .then(\n (data) => {\n store.dispatch(post.patch(data, post.hydrate(data)))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n props.selection.slice(1).map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: false,\n })\n )\n })\n }\n )\n\n store.dispatch(posts.deselectAll())\n}\n\nexport function remove(props) {\n let confirmed = window.confirm(\n pgettext(\n \"delete posts\",\n \"Are you sure you want to delete selected posts? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n props.selection.map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n const ids = props.selection.map((post) => {\n return post.id\n })\n\n ajax.delete(props.thread.api.posts.index, ids).then(\n () => {\n return\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n props.selection.map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: false,\n })\n )\n })\n }\n )\n\n store.dispatch(posts.deselectAll())\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(\n pgettext(\n \"thread posts moderation move\",\n \"You have to enter link to the other thread.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.move, {\n new_thread: this.state.url,\n posts: this.props.selection.map((post) => post.id),\n })\n }\n\n handleSuccess(success) {\n this.props.selection.forEach((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n modal.hide()\n\n snackbar.success(\n pgettext(\n \"thread posts moderation move\",\n \"Selected posts were moved to the other thread.\"\n )\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"thread posts moderation move btn\", \"Cancel\")}\n \n \n {pgettext(\"thread posts moderation move btn\", \"Move posts\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"thread posts moderation move title\", \"Move posts\")}\n

    \n
    \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport Select from \"misago/components/select\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\nimport ErrorsModal from \"./errors-list\"\n\nexport default function (props) {\n return \n}\n\nexport class PostingConfig extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isError: false,\n\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n post: item.post,\n })\n })\n\n this.setState({\n isLoaded: true,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.isError) {\n return \n } else if (this.state.isLoaded) {\n return (\n \n )\n } else {\n return \n }\n }\n}\n\nexport class ModerationForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n title: \"\",\n category: null,\n categories: props.categories,\n weight: 0,\n is_hidden: 0,\n is_closed: false,\n\n validators: {\n title: [validators.required()],\n },\n\n errors: {},\n }\n\n this.isHiddenChoices = [\n {\n value: 0,\n icon: \"visibility\",\n label: pgettext(\"thread hidden switch choice\", \"No\"),\n },\n {\n value: 1,\n icon: \"visibility_off\",\n label: pgettext(\"thread hidden switch choice\", \"Yes\"),\n },\n ]\n\n this.isClosedChoices = [\n {\n value: false,\n icon: \"lock_outline\",\n label: pgettext(\"thread closed switch choice\", \"No\"),\n },\n {\n value: true,\n icon: \"lock\",\n label: pgettext(\"thread closed switch choice\", \"Yes\"),\n },\n ]\n\n this.acl = {}\n this.props.categories.forEach((category) => {\n if (category.post) {\n if (!this.state.category) {\n this.state.category = category.id\n }\n\n this.acl[category.id] = {\n can_pin_threads: category.post.pin,\n can_close_threads: category.post.close,\n can_hide_threads: category.post.hide,\n }\n }\n })\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.split, {\n title: this.state.title,\n category: this.state.category,\n weight: this.state.weight,\n is_hidden: this.state.is_hidden,\n is_closed: this.state.is_closed,\n posts: this.props.selection.map((post) => post.id),\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.selection.forEach((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n modal.hide()\n\n snackbar.success(\n pgettext(\n \"posts moderation split\",\n \"Selected posts were split into new thread.\"\n )\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n snackbar.error(gettext(\"Form contains errors.\"))\n } else if (rejection.status === 403 && Array.isArray(rejection)) {\n modal.show()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (ev) => {\n const categoryId = ev.target.value\n const newState = {\n category: categoryId,\n }\n\n if (this.acl[categoryId].can_pin_threads < newState.weight) {\n newState.weight = 0\n }\n\n if (!this.acl[categoryId].can_hide_threads) {\n newState.is_hidden = 0\n }\n\n if (!this.acl[categoryId].can_close_threads) {\n newState.is_closed = false\n }\n\n this.setState(newState)\n }\n\n getWeightChoices() {\n const choices = [\n {\n value: 0,\n icon: \"remove\",\n label: pgettext(\"thread weight choice\", \"Not pinned\"),\n },\n {\n value: 1,\n icon: \"bookmark_border\",\n label: pgettext(\"thread weight choice\", \"Pinned in category\"),\n },\n ]\n\n if (this.acl[this.state.category].can_pin_threads == 2) {\n choices.push({\n value: 2,\n icon: \"bookmark\",\n label: pgettext(\"thread weight choice\", \"Pinned globally\"),\n })\n }\n\n return choices\n }\n\n renderWeightField() {\n if (this.acl[this.state.category].can_pin_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderHiddenField() {\n if (this.acl[this.state.category].can_hide_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderClosedField() {\n if (this.acl[this.state.category].can_close_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n \n \n
    \n\n \n \n \n
    \n\n {this.renderWeightField()}\n {this.renderHiddenField()}\n {this.renderClosedField()}\n
    \n
    \n \n {pgettext(\"posts moderation split btn\", \"Cancel\")}\n \n \n
    \n \n \n )\n }\n}\n\nexport function Loader() {\n return (\n \n \n \n )\n}\n\nexport function Error(props) {\n return (\n \n
    \n info_outline\n
    \n
    \n

    \n {pgettext(\n \"posts moderation split\",\n \"You can't move selected posts at the moment.\"\n )}\n

    \n

    {props.message}

    \n \n
    \n
    \n )\n}\n\nexport function Modal(props) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\n \"posts moderation split title\",\n \"Split posts into new thread\"\n )}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport modal from \"misago/services/modal\"\nimport * as moderation from \"./actions\"\nimport MoveModal from \"./move\"\nimport SplitModal from \"./split\"\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport class Approve extends React.Component {\n onClick = () => {\n moderation.approve(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_approve && post.is_unapproved\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Merge extends React.Component {\n onClick = () => {\n moderation.merge(this.props)\n }\n\n render() {\n const isVisible =\n this.props.selection.length > 1 &&\n this.props.selection.find((post) => {\n return post.acl.can_merge\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Move extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_move\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Split extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_move\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Protect extends React.Component {\n onClick = () => {\n moderation.protect(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return !post.is_protected && post.acl.can_protect\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unprotect extends React.Component {\n onClick = () => {\n moderation.unprotect(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.is_protected && post.acl.can_protect\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n moderation.hide(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_hide && !post.is_hidden\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n moderation.unhide(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_unhide && post.is_hidden\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n moderation.remove(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_delete\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport { ThreadPostsModerationOptions } from \"./moderation/posts\"\n\nconst ThreadPostsModeration = ({ thread, user, selection, dropup }) => (\n
    \n \n settings\n \n \n
    \n)\n\nexport default ThreadPostsModeration\n","import React from \"react\"\n\nconst ThreadReplyButton = ({ onClick }) => (\n \n chat\n {pgettext(\"thread reply btn\", \"Reply\")}\n \n)\n\nexport default ThreadReplyButton\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\nimport ThreadPaginator from \"./ThreadPaginator\"\nimport ThreadPostsModeration from \"./ThreadPostsModeration\"\nimport ThreadReplyButton from \"./ThreadReplyButton\"\nimport ThreadWatchButton from \"./ThreadWatchButton\"\n\nconst ThreadToolbarBottom = ({\n thread,\n posts,\n user,\n selection,\n moderation,\n onReply,\n}) => (\n \n {posts.pages > 1 && (\n \n \n \n \n \n )}\n \n {user.is_authenticated && (\n \n \n \n \n {thread.acl.can_reply && (\n \n \n \n )}\n {moderation.enabled && (\n \n \n \n )}\n \n )}\n {user.is_authenticated && (\n \n \n \n \n \n )}\n \n)\n\nexport default ThreadToolbarBottom\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\n\nconst ThreadToolbarThird = () => (\n \n \n \n \n window.scrollTo(0, 0)}\n >\n arrow_upward\n {pgettext(\"go up\", \"Go to top\")}\n \n \n \n \n)\n\nexport default ThreadToolbarThird\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ThreadPollButton = ({ compact, disabled, onClick }) => (\n \n poll\n {!compact && pgettext(\"thread poll btn\", \"Add poll\")}\n \n)\n\nexport default ThreadPollButton\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst ThreadShortcutsButton = ({ user, thread, posts }) => (\n
    \n \n bookmark\n \n \n
    \n)\n\nexport default ThreadShortcutsButton\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\nimport ThreadPaginator from \"./ThreadPaginator\"\nimport ThreadPollButton from \"./ThreadPollButton\"\nimport ThreadPostsModeration from \"./ThreadPostsModeration\"\nimport ThreadReplyButton from \"./ThreadReplyButton\"\nimport ThreadShortcutsButton from \"./ThreadShortcutsButton\"\n\nconst ThreadToolbarTop = ({\n thread,\n posts,\n user,\n pollDisabled,\n selection,\n moderation,\n onPoll,\n onReply,\n}) => (\n \n \n \n \n \n {posts.pages > 1 && (\n \n \n \n )}\n \n \n {thread.acl.can_start_poll && !thread.poll && (\n \n \n \n \n \n )}\n {thread.acl.can_reply ? (\n \n \n \n \n \n \n \n {thread.acl.can_start_poll && !thread.poll && (\n \n \n \n )}\n {moderation.enabled && (\n \n \n \n )}\n \n ) : (\n \n \n \n \n {thread.acl.can_start_poll && !thread.poll && (\n \n \n \n )}\n {moderation.enabled && (\n \n \n \n )}\n \n )}\n {posts.pages > 1 && (\n \n \n \n \n \n )}\n \n)\n\nexport default ThreadToolbarTop\n","import React from \"react\"\nimport Participants from \"misago/components/participants\"\nimport { Poll, PollForm } from \"misago/components/poll\"\nimport PostsList from \"misago/components/posts-list\"\nimport * as participants from \"misago/reducers/participants\"\nimport * as poll from \"misago/reducers/poll\"\nimport * as posts from \"misago/reducers/posts\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport polls from \"misago/services/polls\"\nimport snackbar from \"misago/services/snackbar\"\nimport posting from \"misago/services/posting\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { PostingQuoteSelection } from \"../posting\"\nimport PageContainer from \"../PageContainer\"\nimport ThreadHeader from \"./ThreadHeader\"\nimport ThreadToolbarBottom from \"./ThreadToolbarBottom\"\nimport ThreadToolbarThird from \"./ThreadToolbarThird\"\nimport ThreadToolbarTop from \"./ThreadToolbarTop\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n editPoll: false,\n }\n }\n\n componentDidMount() {\n if (this.shouldFetchData()) {\n this.fetchData()\n this.setPageTitle()\n }\n\n this.startPollingApi()\n }\n\n componentDidUpdate() {\n if (this.shouldFetchData()) {\n this.fetchData()\n this.startPollingApi()\n this.setPageTitle()\n }\n }\n\n componentWillUnmount() {\n this.stopPollingApi()\n }\n\n shouldFetchData() {\n if (this.props.posts.isLoaded) {\n const page = (this.props.params.page || 1) * 1\n return page != this.props.posts.page\n } else {\n return false\n }\n }\n\n fetchData() {\n store.dispatch(posts.unload())\n\n ajax\n .get(\n this.props.thread.api.posts.index,\n {\n page: this.props.params.page || 1,\n },\n \"posts\"\n )\n .then(\n (data) => {\n this.update(data)\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n startPollingApi() {\n polls.start({\n poll: \"thread-posts\",\n\n url: this.props.thread.api.posts.index,\n data: {\n page: this.props.params.page || 1,\n },\n update: this.update,\n\n frequency: 120 * 1000,\n delayed: true,\n })\n }\n\n stopPollingApi() {\n polls.stop(\"thread-posts\")\n }\n\n setPageTitle() {\n title.set({\n title: this.props.thread.title,\n parent: this.props.thread.category.name,\n page: (this.props.params.page || 1) * 1,\n })\n }\n\n update = (data) => {\n store.dispatch(thread.replace(data))\n store.dispatch(posts.load(data.post_set))\n\n if (data.participants) {\n store.dispatch(participants.replace(data.participants))\n }\n\n if (data.poll) {\n store.dispatch(poll.replace(data.poll))\n }\n\n this.setPageTitle()\n }\n\n openPollForm = () => {\n this.setState({ editPoll: true })\n }\n\n closePollForm = () => {\n this.setState({ editPoll: false })\n }\n\n openReplyForm = () => {\n posting.open({\n mode: \"REPLY\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n })\n }\n\n render() {\n const category = this.props.thread.category\n\n let className = \"page page-thread\"\n if (category.css_class) {\n className += \" page-thread-\" + category.css_class\n }\n\n const styleName =\n category.special_role === \"private_threads\"\n ? \"private-threads\"\n : category.css_class || \"category-threads\"\n\n const threadModeration = getThreadModeration(\n this.props.thread,\n this.props.user\n )\n\n const postsModeration = getPostsModeration(\n this.props.posts.results,\n this.props.user\n )\n const selection = this.props.posts.results.filter((post) => post.isSelected)\n\n return (\n
    \n \n \n \n \n {this.state.editPoll ? (\n \n ) : (\n \n )}\n {this.props.thread.acl.can_reply ? (\n \n \n \n ) : (\n \n )}\n \n \n \n
    \n )\n }\n}\n\nconst getThreadModeration = (thread, user) => {\n const moderation = {\n enabled: false,\n edit: false,\n approve: false,\n close: false,\n open: false,\n hide: false,\n unhide: false,\n move: false,\n merge: false,\n pinGlobally: false,\n pinLocally: false,\n unpin: false,\n delete: false,\n }\n\n if (!user.is_authenticated) return moderation\n\n moderation.edit = thread.acl.can_edit\n moderation.approve = thread.acl.can_approve && thread.is_unapproved\n moderation.close = thread.acl.can_close && !thread.is_closed\n moderation.open = thread.acl.can_close && thread.is_closed\n moderation.hide = thread.acl.can_hide && !thread.is_hidden\n moderation.unhide = thread.acl.can_unhide && thread.is_hidden\n moderation.move = thread.acl.can_move\n moderation.merge = thread.acl.can_merge\n moderation.pinGlobally = thread.acl.can_pin_globally && thread.weight < 2\n moderation.pinLocally = thread.acl.can_pin && thread.weight !== 1\n moderation.unpin =\n (thread.acl.can_pin && thread.weight === 1) ||\n (thread.acl.can_pin_globally && thread.weight === 2)\n moderation.delete = thread.acl.can_delete\n\n moderation.enabled =\n moderation.edit ||\n moderation.approve ||\n moderation.close ||\n moderation.open ||\n moderation.hide ||\n moderation.unhide ||\n moderation.move ||\n moderation.merge ||\n moderation.pinGlobally ||\n moderation.pinLocally ||\n moderation.unpin ||\n moderation.delete\n\n return moderation\n}\n\nconst getPostsModeration = (posts, user) => {\n const moderation = {\n enabled: false,\n approve: false,\n move: false,\n merge: false,\n protect: false,\n hide: false,\n delete: false,\n }\n\n if (!user.is_authenticated) return moderation\n\n posts.forEach((post) => {\n if (!post.is_event) {\n if (post.acl.can_approve && post.is_unapproved) {\n moderation.approve = true\n }\n if (post.acl.can_move) moderation.move = true\n if (post.acl.can_merge) moderation.merge = true\n if (post.acl.can_protect || post.acl.can_unprotect) {\n moderation.protect = true\n }\n if (post.acl.can_hide || post.acl.can_unhide) {\n moderation.hide = true\n }\n if (post.acl.can_delete) moderation.delete = true\n\n if (\n moderation.approve ||\n moderation.move ||\n moderation.merge ||\n moderation.protect ||\n moderation.hide ||\n moderation.delete\n ) {\n moderation.enabled = true\n }\n }\n })\n\n return moderation\n}\n","import { connect } from \"react-redux\"\nimport Route from \"misago/components/thread/route\"\nimport misago from \"misago/index\"\n\nexport function select(store) {\n return {\n participants: store.participants,\n poll: store.poll,\n posts: store.posts,\n thread: store.thread,\n tick: store.tick.tick,\n user: store.auth.user,\n }\n}\n\nexport function paths() {\n const thread = misago.get(\"THREAD\")\n const basePath = thread.url.index.replace(\n thread.slug + \"-\" + thread.pk,\n \":slug\"\n )\n return [\n {\n path: basePath,\n component: connect(select)(Route),\n },\n {\n path: basePath + \":page/\",\n component: connect(select)(Route),\n },\n ]\n}\n","import { paths } from \"misago/components/thread/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"THREAD\") && context.has(\"POSTS\")) {\n mount({\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:thread\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { UserNavOverlay } from \"../../components/UserNav\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"user-nav-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:user-nav-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst UsersNav = ({ baseUrl, page, pages }) => (\n
    \n
    \n \n menu\n {page.name}\n \n
      \n {pages.map((page) => {\n const url = getPageUrl(baseUrl, page)\n return (\n
    • \n {page.name}\n
    • \n )\n })}\n
    \n
    \n
      \n {pages.map((page) => {\n const url = getPageUrl(baseUrl, page)\n return (\n
    • \n {page.name}\n
    • \n )\n })}\n
    \n
    \n)\n\nconst getPageUrl = (baseUrl, page) => {\n let url = baseUrl\n if (page.component === \"rank\") {\n url += page.slug\n } else {\n url += page.component\n }\n return url + \"/\"\n}\n\nexport default UsersNav\n","import React from \"react\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n getEmptyMessage() {\n return interpolate(\n npgettext(\n \"top posters empty\",\n \"No users have posted any new messages during last %(days)s day.\",\n \"No users have posted any new messages during last %(days)s days.\",\n this.props.trackedPeriod\n ),\n { days: this.props.trackedPeriod },\n true\n )\n }\n\n render() {\n return (\n
    \n \n \n

    {this.getEmptyMessage()}

    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n getClassName() {\n if (this.props.hiddenOnMobile) {\n return \"list-group-item hidden-xs hidden-sm\"\n } else {\n return \"list-group-item\"\n }\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n\n
    \n
    \n \n \n  \n \n \n
    \n\n
    \n \n  \n \n  \n \n \n \n \n  \n \n \n \n \n  \n \n \n
    \n
    \n \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Rank\")}\n \n \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Ranked posts\")}\n \n
    \n
    \n\n
    \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Rank\")}\n
    \n\n
    \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Ranked posts\")}\n
    \n\n
    \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Total posts\")}\n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ItemPreview from \"misago/components/users/active-posters/list-item-preview\"\nimport * as random from \"misago/utils/random\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n \n \n

    \n \n  \n \n

    \n\n
    \n
      \n {[0, 1, 2].map((i) => {\n return 0} key={i} />\n })}\n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Avatar from \"misago/components/avatar\"\nimport Status, { StatusIcon, StatusLabel } from \"misago/components/user-status\"\nimport misago from \"misago/index\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.rank.css_class) {\n return \"list-group-item list-group-rank-\" + this.props.rank.css_class\n } else {\n return \"list-group-item\"\n }\n }\n\n getUserStatus() {\n if (this.props.user.status) {\n return (\n \n \n \n \n )\n }\n\n return (\n \n  \n \n  \n \n \n )\n }\n\n getRankName() {\n if (!this.props.rank.is_tab) {\n return (\n {this.props.rank.name}\n )\n }\n\n let rankUrl = misago.get(\"USERS_LIST_URL\") + this.props.rank.slug + \"/\"\n return (\n \n {this.props.rank.name}\n \n )\n }\n\n getUserTitle() {\n if (!this.props.user.title) return null\n\n return (\n \n {this.props.user.title}\n \n )\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n\n
    \n \n
    \n {this.getUserStatus()}\n {this.getRankName()}\n {this.getUserTitle()}\n
    \n
    \n \n #{this.props.counter}\n {pgettext(\"top posters list item\", \"Rank\")}\n \n\n \n {this.props.user.meta.score}\n {pgettext(\"top posters list item\", \"Ranked posts\")}\n \n
    \n
    \n\n
    \n #{this.props.counter}\n {pgettext(\"top posters list item\", \"Rank\")}\n
    \n\n
    \n {this.props.user.meta.score}\n {pgettext(\"top posters list item\", \"Ranked posts\")}\n
    \n\n
    \n {this.props.user.posts}\n {pgettext(\"top posters list item\", \"Total posts\")}\n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ListItem from \"misago/components/users/active-posters/list-item\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n getLeadMessage() {\n let message = npgettext(\n \"top posters list\",\n \"%(posters)s top poster from last %(days)s days.\",\n \"%(posters)s top posters from last %(days)s days.\",\n this.props.count\n )\n\n return interpolate(\n message,\n {\n posters: this.props.count,\n days: this.props.trackedPeriod,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n \n \n

    {this.getLeadMessage()}

    \n\n
    \n
      \n {this.props.users.map((user, i) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/users/active-posters/list-empty\"\nimport ListPreview from \"misago/components/users/active-posters/list-preview\"\nimport ListReady from \"misago/components/users/active-posters/list-ready\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"USERS\")) {\n this.initWithPreloadedData(misago.pop(\"USERS\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling()\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n\n trackedPeriod: data.tracked_period,\n count: data.count,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling() {\n polls.start({\n poll: \"active-posters\",\n url: misago.get(\"USERS_API\"),\n data: {\n list: \"active\",\n },\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data.results))\n\n this.setState({\n isLoaded: true,\n\n trackedPeriod: data.tracked_period,\n count: data.count,\n })\n }\n\n componentDidMount() {\n title.set({\n title: this.props.route.extra.name,\n parent: pgettext(\"users page title\", \"Users\"),\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"active-posters\")\n }\n\n render() {\n const page = { name: this.props.route.extra.name }\n\n if (this.state.isLoaded) {\n if (this.state.count > 0) {\n return (\n \n )\n } else {\n return (\n \n )\n }\n } else {\n return \n }\n }\n}\n","import React from \"react\"\nimport stringCount from \"misago/utils/string-count\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.copy && this.props.copy.length) {\n if (\n stringCount(this.props.copy, \"\n )\n } else {\n return null\n }\n }\n}\n","export default function (string, subString) {\n string = (string + \"\").toLowerCase()\n subString = (subString + \"\").toLowerCase()\n\n if (subString.length <= 0) return 0\n\n let n = 0\n let pos = 0\n let step = subString.length\n\n while (true) {\n pos = string.indexOf(subString, pos)\n if (pos >= 0) {\n n += 1\n pos += step\n } else {\n break\n }\n }\n\n return n\n}\n","import React from \"react\"\nimport UsersList from \"../../users-list\"\n\nconst RankUsersList = ({ users }) => (\n \n)\n\nexport default RankUsersList\n","import React from \"react\"\nimport UsersList from \"misago/components/users-list\"\n\nclass RankUsersListLoader extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render = () => \n}\n\nexport default RankUsersListLoader\n","import React from \"react\"\n\nconst RankUsersLeft = ({ users }) => {\n if (users.more) {\n return (\n

    \n {interpolate(\n npgettext(\n \"rank users list\",\n \"There is %(more)s more user with this rank.\",\n \"There are %(more)s more users with this rank.\",\n users.more\n ),\n { more: users.more },\n true\n )}\n

    \n )\n }\n\n return (\n

    \n {pgettext(\n \"rank users list empty\",\n \"There are no more users with this rank.\"\n )}\n

    \n )\n}\n\nexport default RankUsersLeft\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst RankUsersPagination = ({ baseUrl, users }) => (\n
    \n {users.isLoaded && users.first ? (\n \n first_page\n \n ) : (\n \n first_page\n \n )}\n {users.isLoaded && users.previous ? (\n 1 ? users.previous + \"/\" : \"\")}\n title={pgettext(\"rank users list paginator\", \"Go to previous page\")}\n >\n chevron_left\n \n ) : (\n \n chevron_left\n \n )}\n {users.isLoaded && users.next ? (\n \n chevron_right\n \n ) : (\n \n chevron_right\n \n )}\n {users.isLoaded && users.last ? (\n \n last_page\n \n ) : (\n \n last_page\n \n )}\n
    \n)\n\nexport default RankUsersPagination\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\nimport RankUsersLeft from \"./RankUsersLeft\"\nimport RankUsersPagination from \"./RankUsersPagination\"\n\nconst RankUsersToolbar = ({ baseUrl, users }) => (\n \n \n \n \n \n \n \n \n \n \n \n \n)\n\nexport default RankUsersToolbar\n","import React from \"react\"\nimport PageLead from \"misago/components/page-lead\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport PageContainer from \"../../PageContainer\"\nimport RankUsersList from \"./RankUsersList\"\nimport RankUsersListLoader from \"./RankUsersListLoader\"\nimport RankUsersToolbar from \"./RankUsersToolbar\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"USERS\")) {\n this.initWithPreloadedData(misago.pop(\"USERS\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling(props.params.page || 1)\n }\n\n initWithPreloadedData(data) {\n this.state = Object.assign(data, {\n isLoaded: true,\n })\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling(page) {\n polls.start({\n poll: \"rank-users\",\n url: misago.get(\"USERS_API\"),\n data: {\n rank: this.props.route.rank.id,\n page: page,\n },\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data.results))\n\n data.isLoaded = true\n this.setState(data)\n }\n\n componentDidMount() {\n title.set({\n title: this.props.route.rank.name,\n page: this.props.params.page || null,\n parent: pgettext(\"users page title\", \"Users\"),\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"rank-users\")\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.params.page !== nextProps.params.page) {\n title.set({\n title: this.props.route.rank.name,\n page: nextProps.params.page || null,\n parent: pgettext(\"users page title\", \"Users\"),\n })\n\n this.setState({\n isLoaded: false,\n })\n\n polls.stop(\"rank-users\")\n this.startPolling(nextProps.params.page)\n }\n }\n\n getClassName() {\n if (this.props.route.rank.css_class) {\n return \"rank-users-list rank-users-\" + this.props.route.rank.css_class\n } else {\n return \"rank-users-list\"\n }\n }\n\n getRankDescription() {\n if (this.props.route.rank.description) {\n return (\n
    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getComponent() {\n if (this.state.isLoaded) {\n if (this.state.count > 0) {\n return \n } else {\n return (\n

    \n {pgettext(\n \"rank users list\",\n \"There are no users with this rank at the moment.\"\n )}\n

    \n )\n }\n } else {\n return \n }\n }\n\n render() {\n return (\n
    \n \n \n {this.getRankDescription()}\n {this.getComponent()}\n \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport ActivePosters from \"misago/components/users/active-posters/root\"\nimport Rank from \"misago/components/users/rank/root\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago/index\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nexport default class extends WithDropdown {\n render() {\n return (\n
    \n \n \n \n

    {pgettext(\"users page title\", \"Users\")}

    \n
    \n
    \n
    \n {this.props.children}\n
    \n )\n }\n}\n\nexport function select(store) {\n return {\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n }\n}\n\nexport function paths() {\n let paths = []\n\n misago.get(\"USERS_LISTS\").forEach(function (item) {\n if (item.component === \"rank\") {\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/:page/\",\n component: connect(select)(Rank),\n rank: item,\n })\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/\",\n component: connect(select)(Rank),\n rank: item,\n })\n } else if (item.component === \"active-posters\") {\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.component + \"/\",\n component: connect(select)(ActivePosters),\n extra: {\n name: item.name,\n },\n })\n }\n })\n\n return paths\n}\n","import Users, { paths } from \"misago/components/users/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"USERS_LISTS\")) {\n mount({\n root: misago.get(\"USERS_LIST_URL\"),\n component: Users,\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:users\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\n\nexport default function initializer(context) {\n include.init(context.get(\"STATIC_URL\"))\n}\n\nmisago.addInitializer({\n name: \"include\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n storage.init(\"misago_\")\n}\n\nmisago.addInitializer({\n name: \"local-storage\",\n initializer: initializer,\n})\n","import mount from \"misago/utils/mount-component\"\n\nexport class MobileNavbarDropdown {\n init(element) {\n this._element = element\n this._component = null\n }\n\n show(component) {\n if (this._component === component) {\n this.hide()\n } else {\n this._component = component\n mount(component, this._element.id)\n $(this._element).addClass(\"open\")\n }\n }\n\n showConnected(name, component) {\n if (this._component === name) {\n this.hide()\n } else {\n this._component = name\n mount(component, this._element.id, true)\n $(this._element).addClass(\"open\")\n }\n }\n\n hide() {\n $(this._element).removeClass(\"open\")\n this._component = null\n }\n}\n\nexport default new MobileNavbarDropdown()\n","import misago from \"misago/index\"\nimport dropdown from \"misago/services/mobile-navbar-dropdown\"\n\nexport default function initializer() {\n let element = document.getElementById(\"mobile-navbar-dropdown-mount\")\n if (element) {\n dropdown.init(element)\n }\n}\n\nmisago.addInitializer({\n name: \"dropdown\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport modal from \"misago/services/modal\"\n\nexport default function initializer() {\n let element = document.getElementById(\"modal-mount\")\n if (element) {\n modal.init(element)\n }\n}\n\nmisago.addInitializer({\n name: \"modal\",\n initializer: initializer,\n before: \"store\",\n})\n","import moment from \"moment\"\nimport misago from \"misago/index\"\n\nexport default function initializer() {\n moment.locale($(\"html\").attr(\"lang\"))\n}\n\nmisago.addInitializer({\n name: \"moment\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport title from \"misago/services/page-title\"\n\nexport default function initializer(context) {\n title.init(\n context.get(\"SETTINGS\").forum_index_title,\n context.get(\"SETTINGS\").forum_name\n )\n}\n\nmisago.addInitializer({\n name: \"page-title\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport polls from \"misago/services/polls\"\n\nexport default function initializer() {\n polls.init(ajax, snackbar)\n}\n\nmisago.addInitializer({\n name: \"polls\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer() {\n posting.init(ajax, snackbar, document.getElementById(\"posting-mount\"))\n}\n\nmisago.addInitializer({\n name: \"posting\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/auth\"\nimport store from \"misago/services/store\"\n\nexport default function initializer(context) {\n store.addReducer(\n \"auth\",\n reducer,\n Object.assign(\n {\n isAuthenticated: context.get(\"isAuthenticated\"),\n isAnonymous: !context.get(\"isAuthenticated\"),\n\n user: context.get(\"user\"),\n },\n initialState\n )\n )\n}\n\nmisago.addInitializer({\n name: \"reducer:auth\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"../../reducers/overlay\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n store.addReducer(\"overlay\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:overlay\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/participants\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\")) {\n initialState = misago.get(\"THREAD\").participants\n }\n\n store.addReducer(\"participants\", reducer, initialState || [])\n}\n\nmisago.addInitializer({\n name: \"reducer:participants\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/poll\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\") && misago.get(\"THREAD\").poll) {\n initialState = hydrate(misago.get(\"THREAD\").poll)\n } else {\n initialState = {}\n }\n\n store.addReducer(\"poll\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:poll\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"POSTS\")) {\n initialState = hydrate(misago.get(\"POSTS\"))\n } else {\n initialState = {\n isLoaded: false,\n isBusy: false,\n }\n }\n\n store.addReducer(\"posts\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:posts\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile-details\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"PROFILE_DETAILS\")) {\n initialState = misago.get(\"PROFILE_DETAILS\")\n }\n\n store.addReducer(\"profile-details\", reducer, initialState || {})\n}\n\nmisago.addInitializer({\n name: \"reducer:profile-details\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n if (misago.has(\"PROFILE\")) {\n store.dispatch(hydrate(misago.get(\"PROFILE\")))\n }\n}\n\nmisago.addInitializer({\n name: \"reducer:profile-hydrate\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"profile\", reducer, {})\n}\n\nmisago.addInitializer({\n name: \"reducer:profile\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago\"\nimport reducer, { initialState } from \"misago/reducers/search\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\n \"search\",\n reducer,\n Object.assign({}, initialState, {\n providers: misago.get(\"SEARCH_PROVIDERS\") || [],\n query: misago.get(\"SEARCH_QUERY\") || \"\",\n })\n )\n}\n\nmisago.addInitializer({\n name: \"reducer:search\",\n initializer: initializer,\n before: \"store\",\n})\n","export function push(array, value) {\n if (array.indexOf(value) === -1) {\n let copy = array.slice()\n copy.push(value)\n return copy\n } else {\n return array\n }\n}\n\nexport function remove(array, value) {\n if (array.indexOf(value) >= 0) {\n return array.filter(function (i) {\n return i !== value\n })\n } else {\n return array\n }\n}\n\nexport function toggle(array, value) {\n if (array.indexOf(value) === -1) {\n let copy = array.slice()\n copy.push(value)\n return copy\n } else {\n return array.filter(function (i) {\n return i !== value\n })\n }\n}\n","import { toggle } from \"misago/utils/sets\"\n\nexport const SELECT_ALL = \"SELECT_ALL\"\nexport const SELECT_NONE = \"SELECT_NONE\"\nexport const SELECT_ITEM = \"SELECT_ITEM\"\n\nexport function all(itemsIds) {\n return {\n type: SELECT_ALL,\n items: itemsIds,\n }\n}\n\nexport function none() {\n return {\n type: SELECT_NONE,\n }\n}\n\nexport function item(itemId) {\n return {\n type: SELECT_ITEM,\n item: itemId,\n }\n}\n\nexport default function selection(state = [], action = null) {\n switch (action.type) {\n case SELECT_ALL:\n return action.items\n\n case SELECT_NONE:\n return []\n\n case SELECT_ITEM:\n return toggle(state, action.item)\n\n default:\n return state\n }\n}\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/selection\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"selection\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:selection\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"snackbar\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:snackbar\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/thread\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\")) {\n initialState = hydrate(misago.get(\"THREAD\"))\n } else {\n initialState = {\n isBusy: false,\n }\n }\n\n store.addReducer(\"thread\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:thread\",\n initializer: initializer,\n before: \"store\",\n})\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_THREADS = \"APPEND_THREADS\"\nexport const DELETE_THREAD = \"DELETE_THREAD\"\nexport const FILTER_THREADS = \"FILTER_THREADS\"\nexport const HYDRATE_THREADS = \"HYDRATE_THREADS\"\nexport const PATCH_THREAD = \"PATCH_THREAD\"\nexport const SORT_THREADS = \"SORT_THREADS\"\n\nexport const MODERATION_PERMISSIONS = [\n \"can_announce\",\n \"can_approve\",\n \"can_close\",\n \"can_hide\",\n \"can_move\",\n \"can_merge\",\n \"can_pin\",\n \"can_review\",\n]\n\nexport function append(items, sorting) {\n return {\n type: APPEND_THREADS,\n items,\n sorting,\n }\n}\n\nexport function deleteThread(thread) {\n return {\n type: DELETE_THREAD,\n thread,\n }\n}\n\nexport function filterThreads(category, categoriesMap) {\n return {\n type: FILTER_THREADS,\n category,\n categoriesMap,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_THREADS,\n items,\n }\n}\n\nexport function patch(thread, patch, sorting = null) {\n return {\n type: PATCH_THREAD,\n thread,\n patch,\n sorting,\n }\n}\n\nexport function sort(sorting) {\n return {\n type: SORT_THREADS,\n sorting,\n }\n}\n\nexport function getThreadModerationOptions(thread_acl) {\n let options = []\n MODERATION_PERMISSIONS.forEach(function (perm) {\n if (thread_acl[perm]) {\n options.push(perm)\n }\n })\n return options\n}\n\nexport function hydrateThread(thread) {\n return Object.assign({}, thread, {\n moderation: getThreadModerationOptions(thread.acl),\n })\n}\n\nexport default function thread(state = [], action = null) {\n switch (action.type) {\n case APPEND_THREADS:\n const mergedState = concatUnique(action.items.map(hydrateThread), state)\n return mergedState.sort(action.sorting)\n\n case DELETE_THREAD:\n return state.filter(function (item) {\n return item.id !== action.thread.id\n })\n\n case FILTER_THREADS:\n return state.filter(function (item) {\n const itemCategory = action.categoriesMap[item.category]\n if (\n itemCategory.lft >= action.category.lft &&\n itemCategory.rght <= action.category.rght\n ) {\n // same or sub category\n return true\n } else if (item.weight == 2) {\n // globally pinned\n return true\n } else {\n // thread moved outside displayed scope, hide it\n return false\n }\n })\n\n case HYDRATE_THREADS:\n return action.items.map(hydrateThread)\n\n case PATCH_THREAD:\n const patchedState = state.map(function (item) {\n if (item.id === action.thread.id) {\n return Object.assign({}, item, action.patch)\n } else {\n return item\n }\n })\n\n if (action.sorting) {\n return patchedState.sort(action.sorting)\n }\n return patchedState\n\n case SORT_THREADS:\n return state.sort(action.sorting)\n\n default:\n return state\n }\n}\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/threads\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"threads\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:threads\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"tick\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:tick\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/username-history\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"username-history\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:username-history\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/users\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"users\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:users\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n snackbar.init(store)\n}\n\nmisago.addInitializer({\n name: \"snackbar\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.init()\n}\n\nmisago.addInitializer({\n name: \"store\",\n initializer: initializer,\n before: \"_end\",\n})\n","import misago from \"misago/index\"\nimport { doTick } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nconst TICK_PERIOD = 50 * 1000 //do the tick every 50s\n\nexport default function initializer() {\n window.setInterval(function () {\n store.dispatch(doTick())\n }, TICK_PERIOD)\n}\n\nmisago.addInitializer({\n name: \"tick-start\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\nimport zxcvbn from \"misago/services/zxcvbn\"\n\nexport default function initializer() {\n zxcvbn.init(include)\n}\n\nmisago.addInitializer({\n name: \"zxcvbn\",\n initializer: initializer,\n})\n","import { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\n\nexport var initialState = {\n signedIn: false,\n signedOut: false,\n}\n\nexport const UPDATE_AUTHENTICATED_USER = \"UPDATE_AUTHENTICATED_USER\"\nexport const PATCH_USER = \"PATCH_USER\"\nexport const SIGN_IN = \"SIGN_IN\"\nexport const SIGN_OUT = \"SIGN_OUT\"\n\nexport function updateAuthenticatedUser(data) {\n return {\n type: UPDATE_AUTHENTICATED_USER,\n data,\n }\n}\n\nexport function patch(patch) {\n return {\n type: PATCH_USER,\n patch,\n }\n}\n\nexport function signIn(user) {\n return {\n type: SIGN_IN,\n user,\n }\n}\n\nexport function signOut(soft = false) {\n return {\n type: SIGN_OUT,\n soft,\n }\n}\n\nexport default function auth(state = initialState, action = null) {\n switch (action.type) {\n case PATCH_USER:\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, action.patch)\n return newState\n\n case UPDATE_AUTHENTICATED_USER:\n let updatedState = Object.assign({}, state)\n updatedState.user = Object.assign({}, state.user, action.data)\n return updatedState\n\n case SIGN_IN:\n return Object.assign({}, state, {\n signedIn: action.user,\n })\n\n case SIGN_OUT:\n return Object.assign({}, state, {\n isAuthenticated: false,\n isAnonymous: true,\n signedOut: !action.soft,\n })\n\n case UPDATE_AVATAR:\n if (state.isAuthenticated && state.user.id === action.userId) {\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, {\n avatars: action.avatars,\n })\n return newState\n }\n return state\n\n case UPDATE_USERNAME:\n if (state.isAuthenticated && state.user.id === action.userId) {\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, {\n username: action.username,\n slug: action.slug,\n })\n return newState\n }\n return state\n\n default:\n return state\n }\n}\n","export const OPEN_SITE_NAV = \"OPEN_SITE_NAV\"\nexport const OPEN_SEARCH = \"OPEN_SEARCH\"\nexport const OPEN_NOTIFICATIONS = \"OPEN_NOTIFICATIONS\"\nexport const OPEN_PRIVATE_THREADS = \"OPEN_PRIVATE_THREADS\"\nexport const OPEN_USER_NAV = \"OPEN_USER_NAV\"\nexport const CLOSE = \"CLOSE_OVERLAYS\"\n\nexport function openSiteNav() {\n return { type: OPEN_SITE_NAV }\n}\n\nexport function openSearch() {\n return { type: OPEN_SEARCH }\n}\n\nexport function openNotifications() {\n return { type: OPEN_NOTIFICATIONS }\n}\n\nexport function openPrivateThreads() {\n return { type: OPEN_PRIVATE_THREADS }\n}\n\nexport function openUserNav() {\n return { type: OPEN_USER_NAV }\n}\n\nexport function close() {\n return { type: CLOSE }\n}\n\nexport const initialState = {\n siteNav: false,\n search: false,\n notifications: false,\n privateThreads: false,\n userNav: false,\n}\n\nexport default function notifications(state = initialState, action = null) {\n switch (action.type) {\n case OPEN_SITE_NAV:\n return Object.assign({}, state, initialState, { siteNav: true })\n\n case OPEN_SEARCH:\n return Object.assign({}, state, initialState, { search: true })\n\n case OPEN_NOTIFICATIONS:\n return Object.assign({}, state, initialState, { notifications: true })\n\n case OPEN_PRIVATE_THREADS:\n return Object.assign({}, state, initialState, { privateThreads: true })\n\n case OPEN_USER_NAV:\n return Object.assign({}, state, initialState, { userNav: true })\n\n case CLOSE:\n return Object.assign({}, state, initialState)\n\n default:\n return state\n }\n}\n","export const REPLACE_PARTICIPANTS = \"REPLACE_PARTICIPANTS\"\n\nexport function replace(newState) {\n return {\n type: REPLACE_PARTICIPANTS,\n state: newState,\n }\n}\n\nexport default function participants(state = [], action = null) {\n switch (action.type) {\n case REPLACE_PARTICIPANTS:\n return action.state\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\n\nexport const BUSY_POLL = \"BUSY_POLL\"\nexport const RELEASE_POLL = \"RELEASE_POLL\"\nexport const REMOVE_POLL = \"REMOVE_POLL\"\nexport const REPLACE_POLL = \"REPLACE_POLL\"\nexport const UPDATE_POLL = \"UPDATE_POLL\"\n\nexport function hydrate(json) {\n let hasSelectedChoices = false\n for (const i in json.choices) {\n const choice = json.choices[i]\n if (choice.selected) {\n hasSelectedChoices = true\n break\n }\n }\n\n return Object.assign({}, json, {\n posted_on: moment(json.posted_on),\n\n hasSelectedChoices,\n endsOn: json.length\n ? moment(json.posted_on).add(json.length, \"days\")\n : null,\n\n isBusy: false,\n })\n}\n\nexport function busy() {\n return {\n type: BUSY_POLL,\n }\n}\n\nexport function release() {\n return {\n type: RELEASE_POLL,\n }\n}\n\nexport function replace(newState, hydrated = false) {\n return {\n type: REPLACE_POLL,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function update(data) {\n return {\n type: UPDATE_POLL,\n data,\n }\n}\n\nexport function remove() {\n return {\n type: REMOVE_POLL,\n }\n}\n\nexport default function poll(state = {}, action = null) {\n switch (action.type) {\n case BUSY_POLL:\n return Object.assign({}, state, { isBusy: true })\n\n case RELEASE_POLL:\n return Object.assign({}, state, { isBusy: false })\n\n case REMOVE_POLL:\n return {\n isBusy: false,\n }\n\n case REPLACE_POLL:\n return action.state\n\n case UPDATE_POLL:\n return Object.assign({}, state, action.data)\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport { hydrateUser } from \"./users\"\n\nexport const PATCH_POST = \"PATCH_POST\"\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n posted_on: moment(json.posted_on),\n updated_on: moment(json.updated_on),\n hidden_on: moment(json.hidden_on),\n\n attachments: json.attachments\n ? json.attachments.map(hydrateAttachment)\n : null,\n poster: json.poster ? hydrateUser(json.poster) : null,\n\n isSelected: false,\n isBusy: false,\n isDeleted: false,\n })\n}\n\nexport function hydrateAttachment(json) {\n return Object.assign({}, json, {\n uploaded_on: moment(json.uploaded_on),\n })\n}\n\nexport function patch(post, patch) {\n return {\n type: PATCH_POST,\n post,\n patch,\n }\n}\n\nexport default function post(state = {}, action = null) {\n switch (action.type) {\n case PATCH_POST:\n if (state.id == action.post.id) {\n return Object.assign({}, state, action.patch)\n }\n return state\n\n default:\n return state\n }\n}\n","import postReducer, {\n PATCH_POST,\n hydrate as hydratePost,\n} from \"misago/reducers/post\"\n\nexport const APPEND_POSTS = \"APPEND_POSTS\"\nexport const SELECT_POST = \"SELECT_POST\"\nexport const DESELECT_POST = \"DESELECT_POST\"\nexport const DESELECT_POSTS = \"DESELECT_POSTS\"\nexport const LOAD_POSTS = \"LOAD_POSTS\"\nexport const UNLOAD_POSTS = \"UNLOAD_POSTS\"\nexport const UPDATE_POSTS = \"UPDATE_POSTS\"\n\nexport function select(post) {\n return {\n type: SELECT_POST,\n post,\n }\n}\n\nexport function deselect(post) {\n return {\n type: DESELECT_POST,\n post,\n }\n}\n\nexport function deselectAll() {\n return {\n type: DESELECT_POSTS,\n }\n}\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n results: json.results.map(hydratePost),\n isLoaded: true,\n isBusy: false,\n isSelected: false,\n })\n}\n\nexport function load(newState, hydrated = false) {\n return {\n type: LOAD_POSTS,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function append(newState, hydrated = false) {\n return {\n type: APPEND_POSTS,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function unload() {\n return {\n type: UNLOAD_POSTS,\n }\n}\n\nexport function update(newState) {\n return {\n type: UPDATE_POSTS,\n update: newState,\n }\n}\n\nexport default function posts(state = {}, action = null) {\n switch (action.type) {\n case SELECT_POST:\n const selectedPosts = state.results.map((post) => {\n if (post.id == action.post.id) {\n return Object.assign({}, post, {\n isSelected: true,\n })\n } else {\n return post\n }\n })\n\n return Object.assign({}, state, {\n results: selectedPosts,\n })\n\n case DESELECT_POST:\n const deseletedPosts = state.results.map((post) => {\n if (post.id == action.post.id) {\n return Object.assign({}, post, {\n isSelected: false,\n })\n } else {\n return post\n }\n })\n\n return Object.assign({}, state, {\n results: deseletedPosts,\n })\n\n case DESELECT_POSTS:\n const deseletedAllPosts = state.results.map((post) => {\n return Object.assign({}, post, {\n isSelected: false,\n })\n })\n\n return Object.assign({}, state, {\n results: deseletedAllPosts,\n })\n\n case APPEND_POSTS:\n let results = state.results.slice()\n const resultsIds = state.results.map((post) => {\n return post.id\n })\n\n action.state.results.map((post) => {\n if (resultsIds.indexOf(post.id) === -1) {\n results.push(post)\n }\n })\n\n return Object.assign({}, action.state, {\n results,\n })\n\n case LOAD_POSTS:\n return action.state\n\n case UNLOAD_POSTS:\n return Object.assign({}, state, {\n isLoaded: false,\n })\n\n case UPDATE_POSTS:\n return Object.assign({}, state, action.update)\n\n case PATCH_POST:\n const reducedPosts = state.results.map((post) => {\n return postReducer(post, action)\n })\n\n return Object.assign({}, state, {\n results: reducedPosts,\n })\n\n default:\n return state\n }\n}\n","export const LOAD_DETAILS = \"LOAD_DETAILS\"\n\nexport function load(newState) {\n return {\n type: LOAD_DETAILS,\n\n newState,\n }\n}\n\nexport default function details(state = {}, action = null) {\n switch (action.type) {\n case LOAD_DETAILS:\n return action.newState\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport {\n UPDATE_AVATAR,\n UPDATE_USERNAME,\n hydrateStatus,\n} from \"misago/reducers/users\"\n\nexport const HYDRATE_PROFILE = \"HYDRATE_PROFILE\"\nexport const PATCH_PROFILE = \"PATCH_PROFILE\"\n\nexport function hydrate(profile) {\n return {\n type: HYDRATE_PROFILE,\n profile,\n }\n}\n\nexport function patch(patch) {\n return {\n type: PATCH_PROFILE,\n patch,\n }\n}\n\nexport default function auth(state = {}, action = null) {\n switch (action.type) {\n case HYDRATE_PROFILE:\n return Object.assign({}, action.profile, {\n joined_on: moment(action.profile.joined_on),\n status: hydrateStatus(action.profile.status),\n })\n\n case PATCH_PROFILE:\n return Object.assign({}, state, action.patch)\n\n case UPDATE_AVATAR:\n if (state.id === action.userId) {\n return Object.assign({}, state, {\n avatars: action.avatars,\n })\n }\n return state\n\n case UPDATE_USERNAME:\n if (state.id === action.userId) {\n return Object.assign({}, state, {\n username: action.username,\n slug: action.slug,\n })\n }\n return state\n\n default:\n return state\n }\n}\n","export const REPLACE_SEARCH = \"REPLACE_SEARCH\"\nexport const UPDATE_SEARCH = \"UPDATE_SEARCH\"\nexport const UPDATE_SEARCH_PROVIDER = \"UPDATE_SEARCH_PROVIDER\"\n\nexport const initialState = {\n isLoading: false,\n query: \"\",\n providers: [],\n}\n\nexport function replace(newState) {\n return {\n type: REPLACE_SEARCH,\n state: {\n isLoading: false,\n providers: newState,\n },\n }\n}\n\nexport function update(newState) {\n return {\n type: UPDATE_SEARCH,\n update: newState,\n }\n}\n\nexport function updateProvider(provider) {\n return {\n type: UPDATE_SEARCH_PROVIDER,\n provider: provider,\n }\n}\n\nexport default function participants(state = {}, action = null) {\n switch (action.type) {\n case REPLACE_SEARCH:\n return action.state\n\n case UPDATE_SEARCH:\n return Object.assign({}, state, action.update)\n\n case UPDATE_SEARCH_PROVIDER:\n return Object.assign({}, state, {\n providers: state.providers.map((provider) => {\n if (provider.id === action.provider.id) {\n return action.provider\n } else {\n return provider\n }\n }),\n })\n\n default:\n return state\n }\n}\n","export var initialState = {\n type: \"info\",\n message: \"\",\n isVisible: false,\n}\n\nexport const SHOW_SNACKBAR = \"SHOW_SNACKBAR\"\nexport const HIDE_SNACKBAR = \"HIDE_SNACKBAR\"\n\nexport function showSnackbar(message, type) {\n return {\n type: SHOW_SNACKBAR,\n message,\n messageType: type,\n }\n}\n\nexport function hideSnackbar() {\n return {\n type: HIDE_SNACKBAR,\n }\n}\n\nexport default function snackbar(state = initialState, action = null) {\n if (action.type === SHOW_SNACKBAR) {\n return {\n type: action.messageType,\n message: action.message,\n isVisible: true,\n }\n } else if (action.type === HIDE_SNACKBAR) {\n return Object.assign({}, state, {\n isVisible: false,\n })\n } else {\n return state\n }\n}\n","import moment from \"moment\"\nimport { REMOVE_POLL, REPLACE_POLL } from \"./poll\"\n\nexport const BUSY_THREAD = \"BUSY_THREAD\"\nexport const RELEASE_THREAD = \"RELEASE_THREAD\"\nexport const REPLACE_THREAD = \"REPLACE_THREAD\"\nexport const UPDATE_THREAD = \"UPDATE_THREAD\"\nexport const UPDATE_THREAD_ACL = \"UPDATE_THREAD_ACL\"\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n started_on: moment(json.started_on),\n last_post_on: moment(json.last_post_on),\n best_answer_marked_on: json.best_answer_marked_on\n ? moment(json.best_answer_marked_on)\n : null,\n\n isBusy: false,\n })\n}\n\nexport function busy() {\n return {\n type: BUSY_THREAD,\n }\n}\n\nexport function release() {\n return {\n type: RELEASE_THREAD,\n }\n}\n\nexport function replace(newState, hydrated = false) {\n return {\n type: REPLACE_THREAD,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function update(data) {\n return {\n type: UPDATE_THREAD,\n data,\n }\n}\n\nexport function updateAcl(data) {\n return {\n type: UPDATE_THREAD_ACL,\n data,\n }\n}\n\nexport default function thread(state = {}, action = null) {\n switch (action.type) {\n case BUSY_THREAD:\n return Object.assign({}, state, { isBusy: true })\n\n case RELEASE_THREAD:\n return Object.assign({}, state, { isBusy: false })\n\n case REMOVE_POLL:\n return Object.assign({}, state, { poll: null })\n\n case REPLACE_POLL:\n return Object.assign({}, state, { poll: action.state })\n\n case REPLACE_THREAD:\n return action.state\n\n case UPDATE_THREAD:\n return Object.assign({}, state, action.data)\n\n case UPDATE_THREAD_ACL:\n const acl = Object.assign({}, state.acl, action.data)\n return Object.assign({}, state, { acl })\n\n default:\n return state\n }\n}\n","export var initialState = {\n tick: 0,\n}\n\nexport const TICK = \"TICK\"\n\nexport function doTick() {\n return {\n type: TICK,\n }\n}\n\nexport default function tick(state = initialState, action = null) {\n if (action.type === TICK) {\n return Object.assign({}, state, {\n tick: state.tick + 1,\n })\n } else {\n return state\n }\n}\n","import moment from \"moment\"\nimport { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const ADD_NAME_CHANGE = \"ADD_NAME_CHANGE\"\nexport const APPEND_HISTORY = \"APPEND_HISTORY\"\nexport const HYDRATE_HISTORY = \"HYDRATE_HISTORY\"\n\nexport function addNameChange(change, user, changedBy) {\n return {\n type: ADD_NAME_CHANGE,\n change,\n user,\n changedBy,\n }\n}\n\nexport function append(items) {\n return {\n type: APPEND_HISTORY,\n items: items,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_HISTORY,\n items: items,\n }\n}\n\nexport function hydrateNamechange(namechange) {\n return Object.assign({}, namechange, {\n changed_on: moment(namechange.changed_on),\n })\n}\n\nexport default function username(state = [], action = null) {\n switch (action.type) {\n case ADD_NAME_CHANGE:\n let newState = state.slice()\n newState.unshift({\n id: Math.floor(Date.now() / 1000), // just small hax for getting id\n changed_by: action.changedBy,\n changed_by_username: action.changedBy.username,\n changed_on: moment(),\n new_username: action.change.username,\n old_username: action.user.username,\n })\n return newState\n\n case APPEND_HISTORY:\n return concatUnique(state, action.items.map(hydrateNamechange))\n\n case HYDRATE_HISTORY:\n return action.items.map(hydrateNamechange)\n\n case UPDATE_AVATAR:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.changed_by && item.changed_by.id === action.userId) {\n item.changed_by = Object.assign({}, item.changed_by, {\n avatars: action.avatars,\n })\n }\n\n return item\n })\n\n case UPDATE_USERNAME:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.changed_by && item.changed_by.id === action.userId) {\n item.changed_by = Object.assign({}, item.changed_by, {\n username: action.username,\n slug: action.slug,\n })\n }\n\n return Object.assign({}, item)\n })\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_USERS = \"APPEND_USERS\"\nexport const HYDRATE_USERS = \"HYDRATE_USERS\"\nexport const UPDATE_AVATAR = \"UPDATE_AVATAR\"\nexport const UPDATE_USERNAME = \"UPDATE_USERNAME\"\n\nexport function append(items) {\n return {\n type: APPEND_USERS,\n items,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_USERS,\n items,\n }\n}\n\nexport function hydrateStatus(status) {\n if (status) {\n return Object.assign({}, status, {\n last_click: status.last_click ? moment(status.last_click) : null,\n banned_until: status.banned_until ? moment(status.banned_until) : null,\n })\n } else {\n return null\n }\n}\n\nexport function hydrateUser(user) {\n return Object.assign({}, user, {\n joined_on: moment(user.joined_on),\n status: hydrateStatus(user.status),\n })\n}\n\nexport function updateAvatar(user, avatars) {\n return {\n type: UPDATE_AVATAR,\n userId: user.id,\n avatars,\n }\n}\n\nexport function updateUsername(user, username, slug) {\n return {\n type: UPDATE_USERNAME,\n userId: user.id,\n username,\n slug,\n }\n}\n\nexport default function user(state = [], action = null) {\n switch (action.type) {\n case APPEND_USERS:\n return concatUnique(state, action.items.map(hydrateUser))\n\n case HYDRATE_USERS:\n return action.items.map(hydrateUser)\n\n case UPDATE_AVATAR:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.id === action.userId) {\n item.avatars = action.avatars\n }\n\n return item\n })\n\n default:\n return state\n }\n}\n","export class Ajax {\n constructor() {\n this._cookieName = null\n this._csrfToken = null\n this._locks = {}\n }\n\n init(cookieName) {\n this._cookieName = cookieName\n }\n\n getCsrfToken() {\n if (document.cookie.indexOf(this._cookieName) !== -1) {\n let cookieRegex = new RegExp(this._cookieName + \"=([^;]*)\")\n let cookie = document.cookie.match(cookieRegex)[0]\n return cookie ? cookie.split(\"=\")[1] : null\n } else {\n return null\n }\n }\n\n request(method, url, data) {\n let self = this\n return new Promise(function (resolve, reject) {\n let xhr = {\n url: url,\n method: method,\n headers: {\n \"X-CSRFToken\": self.getCsrfToken(),\n },\n\n data: data ? JSON.stringify(data) : null,\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n\n success: function (data) {\n resolve(data)\n },\n\n error: function (jqXHR) {\n let rejection = jqXHR.responseJSON || {}\n\n rejection.status = jqXHR.status\n\n if (rejection.status === 0) {\n rejection.detail = pgettext(\n \"ajax client error\",\n \"Could not connect to the site.\"\n )\n }\n\n if (rejection.status === 404) {\n if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n rejection.detail = pgettext(\n \"ajax client error\",\n \"Action link is invalid.\"\n )\n }\n }\n\n if (rejection.status === 500 && !rejection.detail) {\n rejection.detail = pgettext(\n \"ajax client error\",\n \"Unknown error has occurred.\"\n )\n }\n\n rejection.statusText = jqXHR.statusText\n\n reject(rejection)\n },\n }\n\n $.ajax(xhr)\n })\n }\n\n get(url, params, lock) {\n if (params) {\n url += \"?\" + $.param(params)\n }\n\n if (lock) {\n let self = this\n\n // update url in existing lock?\n if (this._locks[lock]) {\n this._locks[lock].url = url\n }\n\n // immediately dereference promise handlers without doing anything\n // we are already waiting for existing response to resolve\n if (this._locks[lock] && this._locks[lock].waiter) {\n return {\n then: function () {\n return\n },\n }\n\n // return promise that will begin when original one resolves\n } else if (this._locks[lock] && this._locks[lock].wait) {\n this._locks[lock].waiter = true\n\n return new Promise(function (resolve, reject) {\n let wait = function (url) {\n // keep waiting on promise\n if (self._locks[lock].wait) {\n window.setTimeout(function () {\n wait(url)\n }, 300)\n\n // poll for new url\n } else if (self._locks[lock].url !== url) {\n wait(self._locks[lock].url)\n\n // ajax backend for response\n } else {\n self._locks[lock].waiter = false\n self.request(\"GET\", self._locks[lock].url).then(\n function (data) {\n if (self._locks[lock].url === url) {\n resolve(data)\n } else {\n self._locks[lock].waiter = true\n wait(self._locks[lock].url)\n }\n },\n function (rejection) {\n if (self._locks[lock].url === url) {\n reject(rejection)\n } else {\n self._locks[lock].waiter = true\n wait(self._locks[lock].url)\n }\n }\n )\n }\n }\n\n window.setTimeout(function () {\n wait(url)\n }, 300)\n })\n\n // setup new lock without waiter\n } else {\n this._locks[lock] = {\n url,\n wait: true,\n waiter: false,\n }\n\n return new Promise(function (resolve, reject) {\n self.request(\"GET\", url).then(\n function (data) {\n self._locks[lock].wait = false\n if (self._locks[lock].url === url) {\n resolve(data)\n }\n },\n function (rejection) {\n self._locks[lock].wait = false\n if (self._locks[lock].url === url) {\n reject(rejection)\n }\n }\n )\n })\n }\n } else {\n return this.request(\"GET\", url)\n }\n }\n\n post(url, data) {\n return this.request(\"POST\", url, data)\n }\n\n patch(url, data) {\n return this.request(\"PATCH\", url, data)\n }\n\n put(url, data) {\n return this.request(\"PUT\", url, data)\n }\n\n delete(url, data) {\n return this.request(\"DELETE\", url, data)\n }\n\n upload(url, data, progress) {\n let self = this\n return new Promise(function (resolve, reject) {\n let xhr = {\n url: url,\n method: \"POST\",\n headers: {\n \"X-CSRFToken\": self.getCsrfToken(),\n },\n\n data: data,\n contentType: false,\n processData: false,\n\n xhr: function () {\n let xhr = new window.XMLHttpRequest()\n xhr.upload.addEventListener(\n \"progress\",\n function (evt) {\n if (evt.lengthComputable) {\n progress(Math.round((evt.loaded / evt.total) * 100))\n }\n },\n false\n )\n return xhr\n },\n\n success: function (response) {\n resolve(response)\n },\n\n error: function (jqXHR) {\n let rejection = jqXHR.responseJSON || {}\n\n rejection.status = jqXHR.status\n\n if (rejection.status === 0) {\n rejection.detail = pgettext(\n \"api error\",\n \"Could not connect to the site.\"\n )\n }\n\n if (rejection.status === 413 && !rejection.detail) {\n rejection.detail = pgettext(\n \"api error\",\n \"Upload was rejected by the site as too large.\"\n )\n }\n\n if (rejection.status === 404) {\n if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n rejection.detail = pgettext(\n \"api error\",\n \"Action link is invalid.\"\n )\n }\n }\n\n if (rejection.status === 500 && !rejection.detail) {\n rejection.detail = pgettext(\n \"api error\",\n \"Unknown error has occurred.\"\n )\n }\n\n rejection.statusText = jqXHR.statusText\n\n reject(rejection)\n },\n }\n\n $.ajax(xhr)\n })\n }\n}\n\nexport default new Ajax()\n","import { signIn, signOut } from \"misago/reducers/auth\"\n\nexport class Auth {\n init(store, local, modal) {\n this._store = store\n this._local = local\n this._modal = modal\n\n // tell other tabs what auth state is because we are most current with it\n this.syncSession()\n\n // listen for other tabs to tell us that state changed\n this.watchState()\n }\n\n syncSession() {\n const state = this._store.getState().auth\n if (state.isAuthenticated) {\n this._local.set(\"auth\", {\n isAuthenticated: true,\n username: state.user.username,\n })\n } else {\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n }\n }\n\n watchState() {\n const state = this._store.getState().auth\n this._local.watch(\"auth\", (newState) => {\n if (newState.isAuthenticated) {\n this._store.dispatch(\n signIn({\n username: newState.username,\n })\n )\n } else if (state.isAuthenticated) {\n // check if we are authenticated in this tab\n // because some browser plugins prune local store\n // aggressively, forcing erroneous message to display here\n // tracking bug #955\n this._store.dispatch(signOut())\n }\n })\n this._modal.hide()\n }\n\n signIn(user) {\n this._store.dispatch(signIn(user))\n this._local.set(\"auth\", {\n isAuthenticated: true,\n username: user.username,\n })\n this._modal.hide()\n }\n\n signOut() {\n this._store.dispatch(signOut())\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n this._modal.hide()\n }\n\n softSignOut() {\n this._store.dispatch(signOut(true))\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n this._modal.hide()\n }\n}\n\nexport default new Auth()\n","/* global grecaptcha */\nimport React from \"react\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport class BaseCaptcha {\n init(context, ajax, include, snackbar) {\n this._context = context\n this._ajax = ajax\n this._include = include\n this._snackbar = snackbar\n }\n}\n\nexport class NoCaptcha extends BaseCaptcha {\n load() {\n return new Promise(function (resolve) {\n // immediately resolve as we don't have anything to validate\n resolve()\n })\n }\n\n validator() {\n return null\n }\n\n component() {\n return null\n }\n}\n\nexport class QACaptcha extends BaseCaptcha {\n load() {\n var self = this\n return new Promise((resolve, reject) => {\n self._ajax.get(self._context.get(\"CAPTCHA_API\")).then(\n function (data) {\n self.question = data.question\n self.helpText = data.help_text\n resolve()\n },\n function () {\n self._snackbar.error(\n pgettext(\"captcha field\", \"Failed to load CAPTCHA.\")\n )\n reject()\n }\n )\n })\n }\n\n validator() {\n return []\n }\n\n component(kwargs) {\n return (\n \n \n \n )\n }\n}\n\nexport class ReCaptchaComponent extends React.Component {\n componentDidMount() {\n grecaptcha.render(\"recaptcha\", {\n sitekey: this.props.siteKey,\n callback: (response) => {\n // fire fakey event to binding\n this.props.binding({\n target: {\n value: response,\n },\n })\n },\n })\n }\n\n render() {\n return
    \n }\n}\n\nexport class ReCaptcha extends BaseCaptcha {\n load() {\n this._include.include(\"https://www.google.com/recaptcha/api.js\", true)\n\n return new Promise(function (resolve) {\n var wait = function () {\n if (typeof grecaptcha === \"undefined\") {\n window.setTimeout(function () {\n wait()\n }, 200)\n } else {\n resolve()\n }\n }\n wait()\n })\n }\n\n validator() {\n return []\n }\n\n component(kwargs) {\n return (\n \n \n \n )\n }\n}\n\nexport class Captcha {\n init(context, ajax, include, snackbar) {\n switch (context.get(\"SETTINGS\").captcha_type) {\n case \"no\":\n this._captcha = new NoCaptcha()\n break\n\n case \"qa\":\n this._captcha = new QACaptcha()\n break\n\n case \"re\":\n this._captcha = new ReCaptcha()\n break\n }\n\n this._captcha.init(context, ajax, include, snackbar)\n }\n\n // accessors for underlying strategy\n\n load() {\n return this._captcha.load()\n }\n\n validator() {\n return this._captcha.validator()\n }\n\n component(kwargs) {\n return this._captcha.component(kwargs)\n }\n}\n\nexport default new Captcha()\n","export class Include {\n init(staticUrl) {\n this._staticUrl = staticUrl\n this._included = []\n }\n\n include(script, remote = false) {\n if (this._included.indexOf(script) === -1) {\n this._included.push(script)\n this._include(script, remote)\n }\n }\n\n _include(script, remote) {\n $.ajax({\n url: (!remote ? this._staticUrl : \"\") + script,\n cache: true,\n dataType: \"script\",\n })\n }\n}\n\nexport default new Include()\n","let storage = window.localStorage\n\nexport class LocalStorage {\n init(prefix) {\n this._prefix = prefix\n this._watchers = []\n\n window.addEventListener(\"storage\", (e) => {\n let newValueJson = JSON.parse(e.newValue)\n this._watchers.forEach(function (watcher) {\n if (watcher.key === e.key && e.oldValue !== e.newValue) {\n watcher.callback(newValueJson)\n }\n })\n })\n }\n\n set(key, value) {\n storage.setItem(this._prefix + key, JSON.stringify(value))\n }\n\n get(key) {\n let itemString = storage.getItem(this._prefix + key)\n if (itemString) {\n return JSON.parse(itemString)\n } else {\n return null\n }\n }\n\n watch(key, callback) {\n this._watchers.push({\n key: this._prefix + key,\n callback: callback,\n })\n }\n}\n\nexport default new LocalStorage()\n","import ReactDOM from \"react-dom\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Modal {\n init(element) {\n this._element = element\n\n this._modal = $(element).modal({ show: false })\n\n this._modal.on(\"hidden.bs.modal\", () => {\n ReactDOM.unmountComponentAtNode(this._element)\n })\n }\n\n show(component) {\n mount(component, this._element.id)\n this._modal.modal(\"show\")\n }\n\n hide() {\n this._modal.modal(\"hide\")\n }\n}\n\nexport default new Modal()\n","export class PageTitle {\n init(indexTitle, forumName) {\n this._indexTitle = indexTitle\n this._forumName = forumName\n }\n\n set(title) {\n if (!title) {\n document.title = this._indexTitle || this._forumName\n return\n }\n\n if (typeof title === \"string\") {\n title = { title: title }\n }\n\n let finalTitle = title.title\n\n if (title.page > 1) {\n const pageLabel = interpolate(\n pgettext(\"page title pagination\", \"page: %(page)s\"),\n {\n page: title.page,\n },\n true\n )\n\n finalTitle += \" (\" + pageLabel + \")\"\n }\n\n if (title.parent) {\n finalTitle += \" | \" + title.parent\n }\n\n document.title = finalTitle + \" | \" + this._forumName\n }\n}\n\nexport default new PageTitle()\n","export class Polls {\n init(ajax, snackbar) {\n this._ajax = ajax\n this._snackbar = snackbar\n\n this._polls = {}\n }\n\n start(kwargs) {\n this.stop(kwargs.poll)\n\n const poolServer = () => {\n this._polls[kwargs.poll] = kwargs\n\n this._ajax.get(kwargs.url, kwargs.data || null).then(\n (data) => {\n if (!this._polls[kwargs.poll]._stopped) {\n kwargs.update(data)\n\n this._polls[kwargs.poll].timeout = window.setTimeout(\n poolServer,\n kwargs.frequency\n )\n }\n },\n (rejection) => {\n if (!this._polls[kwargs.poll]._stopped) {\n if (kwargs.error) {\n kwargs.error(rejection)\n } else {\n this._snackbar.apiError(rejection)\n }\n }\n }\n )\n }\n\n if (kwargs.delayed) {\n this._polls[kwargs.poll] = {\n timeout: window.setTimeout(poolServer, kwargs.frequency),\n }\n } else {\n poolServer()\n }\n }\n\n stop(pollId) {\n if (this._polls[pollId]) {\n window.clearTimeout(this._polls[pollId].timeout)\n this._polls[pollId]._stopped = true\n }\n }\n}\n\nexport default new Polls()\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport PostingComponent from \"misago/components/posting\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Posting {\n init(ajax, snackbar, mount) {\n this._ajax = ajax\n this._snackbar = snackbar\n this._mount = mount\n\n this._mode = null\n this._spacer = document.getElementById(\"posting-spacer\")\n this._observer = new ResizeObserver((entries) => {\n this._spacer.style.height = entries[0].contentRect.height + \"px\"\n })\n\n this._isOpen = false\n this._isClosing = false\n\n this._beforeunloadSet = false\n this._props = null\n }\n\n isOpen() {\n return this._isOpen\n }\n\n setBeforeUnload() {\n if (!this._beforeunloadSet) {\n window.addEventListener(\"beforeunload\", this.beforeUnload, {\n capture: true,\n })\n this._beforeunloadSet = true\n }\n }\n\n unsetBeforeUnload() {\n window.removeEventListener(\"beforeunload\", this.beforeUnload, {\n capture: true,\n })\n this._beforeunloadSet = false\n }\n\n beforeUnload(event) {\n event.returnValue = \"true\"\n return \"true\"\n }\n\n open(props) {\n if (this._isOpen === false) {\n if (props.mode === \"QUOTE\") {\n this._mode = \"REPLY\"\n } else {\n this._mode = props.mode\n }\n\n this._isOpen = props.submit\n this._realOpen(Object.assign({}, props, { mode: this._mode }))\n } else if (props.mode === \"QUOTE\") {\n this._realOpen(\n Object.assign({}, this._props, {\n config: props.config,\n context: props.context,\n })\n )\n } else if (this._isOpen !== props.submit) {\n let message = gettext(\n \"You are already working on other message. Do you want to discard it?\"\n )\n\n const changeForm = window.confirm(message)\n if (changeForm) {\n this._mode = props.mode\n this._isOpen = props.submit\n this._realOpen(props)\n }\n } else if (this._mode == \"REPLY\" && props.mode == \"REPLY\") {\n this._realOpen(props)\n }\n }\n\n _realOpen(props) {\n mount(, this._mount.id)\n\n this._props = props\n this._mount.classList.add(\"show\")\n this._observer.observe(this._mount)\n this.setBeforeUnload()\n }\n\n close = () => {\n this.unsetBeforeUnload()\n this._props = null\n\n if (this._isOpen && !this._isClosing) {\n this._isClosing = true\n this._mount.classList.remove(\"show\")\n\n window.setTimeout(() => {\n ReactDOM.unmountComponentAtNode(this._mount)\n this._observer.unobserve(this._mount)\n this._spacer.style.height = \"0px;\"\n this._isClosing = false\n this._isOpen = false\n this._mode = null\n }, 300)\n }\n }\n}\n\nexport default new Posting()\n","import { showSnackbar, hideSnackbar } from \"misago/reducers/snackbar\"\n\nconst HIDE_ANIMATION_LENGTH = 300\nconst MESSAGE_SHOW_LENGTH = 5000\n\nexport class Snackbar {\n init(store) {\n this._store = store\n this._timeout = null\n }\n\n alert = (message, type) => {\n if (this._timeout) {\n window.clearTimeout(this._timeout)\n this._store.dispatch(hideSnackbar())\n\n this._timeout = window.setTimeout(() => {\n this._timeout = null\n this.alert(message, type)\n }, HIDE_ANIMATION_LENGTH)\n } else {\n this._store.dispatch(showSnackbar(message, type))\n this._timeout = window.setTimeout(() => {\n this._store.dispatch(hideSnackbar())\n this._timeout = null\n }, MESSAGE_SHOW_LENGTH)\n }\n }\n\n // shorthands for message types\n\n info = (message) => {\n this.alert(message, \"info\")\n }\n\n success = (message) => {\n this.alert(message, \"success\")\n }\n\n warning = (message) => {\n this.alert(message, \"warning\")\n }\n\n error = (message) => {\n this.alert(message, \"error\")\n }\n\n // shorthand for api errors\n\n apiError = (rejection) => {\n let message = rejection.data ? rejection.data.detail : rejection.detail\n\n if (!message) {\n if (rejection.status === 0) {\n message = pgettext(\"api error\", \"Could not connect to the site.\")\n } else if (rejection.status === 404) {\n message = pgettext(\"api error\", \"Action link is invalid.\")\n } else {\n message = pgettext(\"api error\", \"Unknown error has occurred.\")\n }\n }\n\n if (rejection.status === 403 && message === \"Permission denied\") {\n message = pgettext(\n \"api error\",\n \"You don't have permission to perform this action.\"\n )\n }\n\n this.error(message)\n }\n}\n\nexport default new Snackbar()\n","import { combineReducers, createStore } from \"redux\"\n\nexport class StoreWrapper {\n constructor() {\n this._store = null\n this._reducers = {}\n this._initialState = {}\n }\n\n addReducer(name, reducer, initialState) {\n this._reducers[name] = reducer\n this._initialState[name] = initialState\n }\n\n init() {\n this._store = createStore(\n combineReducers(this._reducers),\n this._initialState\n )\n }\n\n getStore() {\n return this._store\n }\n\n // Store API\n\n getState() {\n return this._store.getState()\n }\n\n dispatch(action) {\n return this._store.dispatch(action)\n }\n}\n\nexport default new StoreWrapper()\n","/* global zxcvbn */\nexport class Zxcvbn {\n init(include) {\n this._include = include\n this._isLoaded = false\n }\n\n scorePassword(password, inputs) {\n // 0-4 score, the more the stronger password\n if (this._isLoaded) {\n return zxcvbn(password, inputs).score\n }\n\n return 0\n }\n\n load() {\n if (!this._isLoaded) {\n this._include.include(\"misago/js/zxcvbn.js\")\n return this._loadingPromise()\n } else {\n return this._loadedPromise()\n }\n }\n\n _loadingPromise() {\n const self = this\n\n return new Promise(function (resolve, reject) {\n var wait = function (tries = 0) {\n tries += 1\n if (tries > 200) {\n reject()\n } else if (typeof zxcvbn === \"undefined\") {\n window.setTimeout(function () {\n wait(tries)\n }, 200)\n } else {\n self._isLoaded = true\n resolve()\n }\n }\n wait()\n })\n }\n\n _loadedPromise() {\n // we have already loaded zxcvbn.js, resolve away!\n return new Promise(function (resolve) {\n resolve()\n })\n }\n}\n\nexport default new Zxcvbn()\n","import moment from \"moment\"\nimport React from \"react\"\n\nexport default class extends React.Component {\n getReasonMessage() {\n if (this.props.message.html) {\n return (\n \n )\n } else {\n return

    {this.props.message.plain}

    \n }\n }\n\n getExpirationMessage() {\n if (this.props.expires) {\n if (this.props.expires.isAfter(moment())) {\n let title = interpolate(\n pgettext(\"banned page\", \"This ban expires on %(expires_on)s.\"),\n {\n expires_on: this.props.expires.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n pgettext(\"banned page\", \"This ban expires %(expires_on)s.\"),\n {\n expires_on: this.props.expires.fromNow(),\n },\n true\n )\n\n return {message}\n } else {\n return pgettext(\"banned page\", \"This ban has expired.\")\n }\n } else {\n return pgettext(\"banned page\", \"This ban is permanent.\")\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n highlight_off\n
    \n
    \n {this.getReasonMessage()}\n

    {this.getExpirationMessage()}

    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider, connect } from \"react-redux\"\nimport BannedPage from \"misago/components/banned-page\"\nimport misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nlet select = function (state) {\n return state.tick\n}\n\nlet RedrawedBannedPage = connect(select)(BannedPage)\n\nexport default function (ban, changeState) {\n ReactDOM.render(\n \n \n ,\n\n document.getElementById(\"page-mount\")\n )\n\n if (typeof changeState === \"undefined\" || changeState) {\n let forumName = misago.get(\"SETTINGS\").forum_name\n document.title =\n pgettext(\"banned error title\", \"You are banned\") + \" | \" + forumName\n window.history.pushState({}, \"\", misago.get(\"BANNED_URL\"))\n }\n}\n","export default function (list, rowWidth, padding = false) {\n let rows = []\n let row = []\n\n list.forEach(function (element) {\n row.push(element)\n if (row.length === rowWidth) {\n rows.push(row)\n row = []\n }\n })\n\n // pad row to required length?\n if (padding !== false && row.length > 0 && row.length < rowWidth) {\n for (let i = row.length; i < rowWidth; i++) {\n row.push(padding)\n }\n }\n\n if (row.length) {\n rows.push(row)\n }\n\n return rows\n}\n","export default function (a, b) {\n let ids = []\n return a.concat(b).filter(function (item) {\n if (ids.indexOf(item.id) === -1) {\n ids.push(item.id)\n return true\n } else {\n return false\n }\n })\n}\n","const map = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n}\n\nexport default function (text) {\n return text.replace(/[&<>\"']/g, function (m) {\n return map[m]\n })\n}\n","export default function (bytes) {\n if (bytes > 1024 * 1024 * 1024) {\n return roundSize(bytes / (1024 * 1024 * 1024)) + \" GB\"\n } else if (bytes > 1024 * 1024) {\n return roundSize(bytes / (1024 * 1024)) + \" MB\"\n } else if (bytes > 1024) {\n return roundSize(bytes / 1024) + \" KB\"\n } else {\n return roundSize(bytes) + \" B\"\n }\n}\n\nexport function roundSize(value) {\n return value.toFixed(1)\n}\n","export const ALPHA = \"12345678990abcdefghijklmnopqrstuvwxyz\"\nexport const ALPHA_LEN = ALPHA.length\n\nexport default function getRandomString(len) {\n const chars = []\n for (let i = 0; i < len; i++) {\n const index = Math.floor(Math.random() * ALPHA_LEN)\n chars.push(ALPHA[index])\n }\n return chars.join(\"\")\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport store from \"misago/services/store\"\n\nexport default function (Component, rootElementId, connected = true) {\n let rootElement = document.getElementById(rootElementId)\n\n let finalComponent = Component.props ? Component : \n\n if (rootElement) {\n if (connected) {\n ReactDOM.render(\n {finalComponent},\n\n rootElement\n )\n } else {\n ReactDOM.render(finalComponent, rootElement)\n }\n }\n}\n","export function int(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nexport function range(min, max) {\n let array = new Array(int(min, max))\n for (let i = 0; i < array.length; i++) {\n array[i] = i\n }\n\n return array\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { Router, browserHistory } from \"react-router\"\nimport store from \"misago/services/store\"\n\nconst rootElement = document.getElementById(\"page-mount\")\n\nexport default function (options) {\n let routes = {\n component: options.component || null,\n childRoutes: [],\n }\n\n if (options.root) {\n routes.childRoutes = [\n {\n path: options.root,\n onEnter: function (nextState, replaceState) {\n replaceState(null, options.paths[0].path)\n },\n },\n ].concat(options.paths)\n } else {\n routes.childRoutes = options.paths\n }\n\n ReactDOM.render(\n \n \n ,\n rootElement\n )\n}\n","const EMAIL =\n /^(([^<>()[\\]\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i\nconst USERNAME = new RegExp(\"^[0-9a-z_]+$\", \"i\")\nconst USERNAME_ALPHANUMERIC = new RegExp(\"[0-9a-z]\", \"i\")\n\nexport function required(message) {\n return function (value) {\n if (\n value === false ||\n value === null ||\n String(value).trim().length === 0\n ) {\n return message || gettext(\"This field is required.\")\n }\n }\n}\n\nexport function requiredTermsOfService(message) {\n const error = pgettext(\n \"agreement validator\",\n \"You have to accept the terms of service.\"\n )\n return required(message || error)\n}\n\nexport function requiredPrivacyPolicy(message) {\n const error = pgettext(\n \"agreement validator\",\n \"You have to accept the privacy policy.\"\n )\n return required(message || error)\n}\n\nexport function email(message) {\n return function (value) {\n if (!EMAIL.test(value)) {\n return (\n message || pgettext(\"email validator\", \"Enter a valid e-mail address.\")\n )\n }\n }\n}\n\nexport function minLength(limitValue, message) {\n return function (value) {\n var returnMessage = \"\"\n var length = value.trim().length\n\n if (length < limitValue) {\n if (message) {\n returnMessage = message(limitValue, length)\n } else {\n returnMessage = npgettext(\n \"value length validator\",\n \"Ensure this value has at least %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n }\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n\nexport function maxLength(limitValue, message) {\n return function (value) {\n var returnMessage = \"\"\n var length = value.trim().length\n\n if (length > limitValue) {\n if (message) {\n returnMessage = message(limitValue, length)\n } else {\n returnMessage = npgettext(\n \"value length validator\",\n \"Ensure this value has at most %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n }\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n\nexport function usernameMinLength(lengthMin) {\n var message = function (lengthMin) {\n return npgettext(\n \"username length validator\",\n \"Username must be at least %(limit_value)s character long.\",\n \"Username must be at least %(limit_value)s characters long.\",\n lengthMin\n )\n }\n return minLength(lengthMin, message)\n}\n\nexport function usernameMaxLength(lengthMax) {\n var message = function (lengthMax) {\n return npgettext(\n \"username length validator\",\n \"Username cannot be longer than %(limit_value)s character.\",\n \"Username cannot be longer than %(limit_value)s characters.\",\n lengthMax\n )\n }\n return maxLength(lengthMax, message)\n}\n\nexport function usernameContent() {\n return function (value) {\n const valueTrimmed = value.trim()\n if (!USERNAME.test(valueTrimmed)) {\n return pgettext(\n \"username validator\",\n \"Username can only contain Latin alphabet letters, digits, and an underscore sign.\"\n )\n }\n if (!USERNAME_ALPHANUMERIC.test(valueTrimmed)) {\n return pgettext(\n \"username validator\",\n \"Username must contain Latin alphabet letters or digits.\"\n )\n }\n }\n}\n\nexport function passwordMinLength(limitValue) {\n return function (value) {\n const length = value.length\n\n if (length < limitValue) {\n const returnMessage = npgettext(\n \"password length validator\",\n \"Valid password must be at least %(limit_value)s character long.\",\n \"Valid password must be at least %(limit_value)s characters long.\",\n limitValue\n )\n\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 30094,\n\t\"./hi.js\": 30094,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + \"hljs\" + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t174: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkmisago\"] = self[\"webpackChunkmisago\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(99170)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(58339)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(64109)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(46226)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(93240)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(75147)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(4894)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(29223)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(73806)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(27015)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(88097)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(46016)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(32488)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(11768)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(61323)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(64752)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(40949)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(78679)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(61814)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(95920)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(44095)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(63290)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(77031)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(97751)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(76093)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(87336)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(47549)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(22331)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(21513)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(98749)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(98251)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(6720)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(66806)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(10846)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(18255)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(14113)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(24444)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(1764)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(68351)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(81521)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(68585)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(41229)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(43589)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(62894)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(33934)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(85577)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(83526)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(43060)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(92292)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(33409)))\nvar __webpack_exports__ = __webpack_require__.O(undefined, [736], () => (__webpack_require__(31341)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","ApiFetch","props","url","cache","data","setState","loading","error","onData","fetch","method","credentials","signal","then","response","status","json","setCache","headers","get","rejection","request","mutation","state","controller","AbortController","this","disabled","prevProps","urlChanged","disabledChanged","abort","hasCache","getCache","children","Object","assign","refetch","update","React","ApiMutation","options","body","onSuccess","onError","mutate","csrfToken","JSON","stringify","cookieName","window","misago_csrf","document","cookie","indexOf","cookieRegex","RegExp","match","split","Dropdown","event","isOpen","root","contains","target","menu","closest","prevState","dropdown","addEventListener","handleClick","removeEventListener","onOpen","onClose","id","className","classnames","open","ref","element","toggle","aria","ariaProps","menuAlignRight","menuClassName","role","close","DropdownDivider","DropdownFooter","listItem","DropdownHeader","DropdownMenuItem","DropdownPills","DropdownSubheader","shrink","auto","ListGroup","ListGroupItem","ListGroupEmpty","icon","message","ListGroupError","detail","ListGroupLoading","ListGroupMessage","getApiUrl","filter","query","api","misago","after","before","connect","auth","user","unreadNotifications","dispatch","updateAuthenticatedUser","NotificationsListEmpty","emptyMessage","pgettext","NotificationsListGroup","NotificationsListItemActor","notification","actor","href","title","username","size","actor_name","NotificationsListItemMessage","isRead","dangerouslySetInnerHTML","__html","NotificationsListItemReadStatus","NotificationsListItemTimestamp","Timestamp","datetime","createdAt","NotificationsListItem","NotificationsList","items","length","map","NotificationsListError","gettext","NotificationsListLoading","BODY_CLASS","Overlay","scrollOrigin","pageYOffset","classList","add","remove","scrollTo","onClick","closeOnNavigation","type","styleName","header","STYLES","LABELS","_score","_password","_inputs","loaded","zxcvbn","password","inputs","cacheStale","value","i","trim","score","getScore","style","width","RegisterForm","handleToggleAgreement","agreement","errors","validator","validators","criteria","passwordMinLength","forEach","item","name","min_length","formValidators","max_length","email","captcha","termsOfService","privacyPolicy","isLoading","isValid","snackbar","validate","ajax","terms_of_service","privacy_policy","apiResponse","callback","__all__","ban","showBannedPage","modal","onSubmit","handleSubmit","display","StartSocialAuth","buttonClassName","buttonLabel","formLabel","label","for","validation","onChange","bindInput","extra","form","RegisterLegalFootnote","onPrivacyPolicyChange","handlePrivacyPolicyChange","onTermsOfServiceChange","handleTermsOfServiceChange","Form","RegisterComplete","activation","interpolate","getLead","getSubscript","complete","completeRegistration","account_activation","isLoaded","Promise","all","result","block","showRegisterForm","LegalAgreement","checked","agreementHtml","escapeHtml","termsOfServiceId","termsOfServiceUrl","privacyPolicyId","privacyPolicyUrl","SearchResultsList","SearchMessage","SearchResultPost","post","index","thread","headline","content","category","poster","poster_name","posted_on","SearchResultUser","rank","joined_on","SearchResults","results","threads","users","count","encodeURIComponent","npgettext","replace","SearchResultsEmpty","SearchResultsError","errorDetail","SearchResultsLoading","CACHE","SearchFetch","debounce","clearTimeout","setTimeout","Api","resultsCount","isResultEmpty","SearchInput","setQuery","placeholder","SearchQuery","SearchDropdown","overlay","search","querySelector","focus","settings","DELEGATE_AUTH","LOGIN_URL","preventDefault","SiteNavMenuConnected","isAnonymous","baseUrl","mainItems","extraItems","extraFooterItems","categories","authDelegated","enable_oauth2_client","topNav","push","footerNav","tosTitle","tosUrl","privacyTitle","privacyUrl","SignInButton","RegisterButton","forum_name","targetBlank","rel","is_vanilla","last","color","short_name","SiteNavDropdown","siteNav","FormHeader","text","labelClassName","socialAuth","pk","button_text","button_color","finalButtonLabel","site","tick","now","Date","diff","Math","ceil","abs","round","date","timeout","scheduleNextUpdate","displayed","narrow","dateRelativeShort","dateRelative","fullDateTime","callApi","avatarType","avatar","onComplete","showError","gravatar","setGravatar","crop_src","showCrop","upload","showUpload","galleries","showGallery","userPeview","avatars","getAvatarPreview","getGravatarButton","setGenerated","getCropButton","getUploadButton","getGalleryButton","cropit","$","deviceRatio","cropitOffset","crop","offset","x","y","zoom","crop_tmp","dataUrl","cropperWidth","getAvatarSize","initialWidth","height","exportZoom","imageState","src","getImagePath","onImageLoaded","zoomLevel","imageSize","offsetX","offsetY","cropAvatar","showIndex","getElementById","click","image","files","validationError","validateFile","preview","URL","createObjectURL","progress","FormData","append","uploaded","limit","filesize","fileSize","invalidTypeMsg","allowed_mime_types","extensionFound","loweredFilename","toLowerCase","allowed_extensions","extension","substr","extensions","join","pickFile","getUploadRequirements","getUploadProgressLabel","uploadFile","getUploadProgress","renderCrop","renderUpload","GalleryItem","select","selection","getClassName","Gallery","batch","images","row","save","ChangeAvatarError","reason","getErrorReason","component","AvatarIndex","AvatarUpload","AvatarCrop","AvatarGallery","store","updateAvatar","completeFlow","getBody","logout","submit","UserNavMenu","selectAvatar","ChangeAvatarModal","optionsMore","slice","adminUrl","showPrivateThreads","unreadPrivateThreads","changeAvatar","revealOptions","unread_private_threads","acl","can_use_private_threads","UserNavDropdown","userNav","size2x","alt","getSrc","srcSet","av","resolveAvatarForSize","Button","defaultProps","choices","repeat","level","isValidated","helpText","labelClass","htmlFor","controlClass","getFeedbackDescription","getFeedback","getHelpText","validateRequired","required","changeValue","newState","formErrors","validateField","clean","promise","send","success","handleSuccess","handleError","optional","validatedFields","hasOwnProperty","fieldErrors","field","requiredError","isControlled","isActive","path","location","pathname","activeClassName","ytRegExp","highlightCode","embedYoutubePlayers","_youtube","hljs","codeblocks","querySelectorAll","highlightElement","anchors","a","onlyChild","parentNode","childNodes","parseYoutubeUrl","youtubeMovie","swapYoutubePlayer","youtube","video","start","player","replaceWith","wrap","cleanedUrl","cleanUrl","getVideoIdFromUrl","timebit","bits","parseInt","onebox","documentNode","find","revealSpoiler","nextProps","nextState","markup","author","undefined","node","btn","parent","addClass","PanelMessage","Default","Invalid","tooltip","format","fromNow","userTitle","css_class","is_tab","random","isReady","posts","PostingQuoteSelection","range","getQuoteSelection","rect","getBoundingClientRect","posting","globalState","getGlobalState","quote","getQuoteMarkup","focusEditor","default","onMouseUp","selected","onTouchEnd","position","left","scrollX","top","bottom","scrollY","reply","textarea","selectionStart","selectionEnd","container","getSelection","rangeCount","getRangeAt","isRangeContained","isPostContained","isAnyTextSelected","cloneContents","commonAncestorContainer","p","nodeName","dataset","noquote","child","nodeType","Node","TEXT_NODE","textContent","metadata","getQuoteMetadata","convertNodesToMarkup","prefix","suffix","codeBlock","getQuoteCodeBlock","syntax","isNodeInlineCodeBlock","isNodeElementWithQuoteMetadata","getQuoteMetadataFromNode","ELEMENT_NODE","isNodeCodeBlock","getNodeCodeBlockMeta","nodes","stack","convertNodeToMarkup","SIMPLE_NODE_MAPPINGS","H1","H2","H3","H4","H5","H6","STRONG","EM","DEL","B","U","I","SUB","SUP","toUpperCase","code","innerText","misagoReply","setGlobalState","clearGlobalState","attachments","attachment","isRemoved","MarkupAttachmentModal","is_image","filename","filetype","formatFilesize","uploaded_on","uploader","uploader_name","wrapSelection","def","newValue","caret","setSelectionRange","replaceSelection","end","createRange","moveStart","substring","scroll","scrollTop","thumb","getAttachmentMarkup","confirm","key","canProtect","empty","isProtected","submitText","showPreview","closePreview","enableProtection","disableProtection","MarkupCodeModal","ev","LANGUAGES","rows","MarkupFormattingHelpModal","ExampleFormatting","ExampleFormattingSpoiler","reveal","URL_PATTERN","isUrl","str","test","textUrl","file","maxSize","max_attachment_size","getRandomString","concat","refreshState","moment","updateAttachments","actions","insertSpoiler","input","createElement","multiple","parsed","stopPropagation","dataTransfer","onAttachmentsChange","clipboardData","kind","getAsFile","focused","atwho","at","displayTpl","insertTpl","searchKey","callbacks","remoteFilter","getJSON","q","on","_storage","source","headPos","endPos","setMentions","onDrop","onFocus","onPaste","onBlur","post_length_min","CLASS_ACTIVE","CLASS_DEFAULT","CLASS_MINIMIZED","CLASS_FULLSCREEN","fullscreen","minimized","minimize","fullscreenEnter","fullscreenExit","PostingThreadOptions","isClosed","isHidden","isPinned","hide","unhide","pinGlobally","pinLocally","unpin","icons","closed","hidden","pinned","getIcons","pin","categoryOptions","getTitleValidators","getPostValidators","config","loadSuccess","loadError","non_field_errors","dialogProps","onCancel","PostingDialogStart","Toolbar","showOptions","onTitleChange","onCategoryChange","onHide","onUnhide","onPinGlobally","onPinLocally","onUnpin","onPostChange","usernames","removedBlanks","pos","to","cleanUsernames","PostingDialogStartPrivate","onToChange","quoteText","newPost","context","onQuote","newContext","appendData","PostingDialogReply","originalPost","protect","is_protected","can_protect","originalPostSameAsCurrentPost","noAttachementsAdded","PostingDialogEditReply","mode","minLength","thread_title_length_min","limitValue","limit_value","show_value","maxLength","thread_title_length_max","post_length_max","validatePostLengthMin","choice","getChoice","Icon","getIcon","getLabel","change","showActivation","val","getActivationButton","is_banned","is_hidden","is_online_hidden","is_offline_hidden","is_online","is_offline","getClass","StatusIcon","StatusLabel","banned_until","ban_expires","last_click","getHelp","showStatus","Status","JoinDate","Posts","Threads","Followers","getStatClassName","followers","stat","colClassName","cols","list","Array","apply","Number","call","iconOn","iconOff","labelOn","labelOff","locale","misago_locale","momentAgo","momentAgoShort","dayAt","soonAt","tomorrowAt","yesterdayAt","minutesShort","hoursShort","daysShort","thisYearShort","otherYearShort","relativeNumeric","Intl","RelativeTimeFormat","numeric","DateTimeFormat","dateStyle","timeStyle","thisYearDate","month","day","otherYearDate","year","short","weekday","shortTime","absDiff","sign","minutes","hours","isSameDay","yesterday","setDate","getDate","isYesterday","isTomorrow","formatDayAtTime","getFullYear","getMonth","days","parts","formatToParts","isOrdered","_items","order","values","values_only","_order","unordered","ordered","ordering","insertItem","insertAt","splice","iterations","useLoader","silent","getAttribute","requests","onRemoveSelection","onAction","moderation","htmx","swap","tagName","control","button","selector","registerEvents","registerActions","registerElementValidator","strip","csrf","setAttribute","setFormControlValidationState","callValidationUrl","clearFormControlValidationMessages","clearFormControlValidationState","setFormControlErrorValidationState","setFormControlSuccessValidationState","set","removeSnackbars","replaceChildren","renderSnackbars","SNACKBAR_TTL","appendChild","isEventVisible","requestConfig","verb","xhr","getResponseHeader","parse","getResponseErrorMessage","updateTimestamp","timestamp","hasAttribute","updateLiveTimestamps","setInterval","loader","AjaxLoader","_initializers","_context","initializer","OrderedList","orderedValues","fallback","has","snackbars","BulkModeration","show","patch","AUTH_SYNC_RATE","storage","include","AcceptAgreement","submiting","accept","reload","handleDecline","handleAccept","mount","signedIn","signedOut","getMessage","refresh","AuthMessage","NavbarBranding","logo","logoXs","NavbarExtraMenu","NotificationsDropdownBody","showAll","showUnread","unread","NotificationsDropdownBodyPill","active","NotificationsFetch","NavbarNotificationsToggle","badge","NavbarNotificationsDropdown","NavbarPrivateThreads","NavbarSearchToggle","NavbarSearchDropdown","Search","NavbarSiteNavToggle","NavbarSiteNavDropdown","SiteNav","NavbarUserNavToggle","NavbarUserNavDropdown","UserNav","branding","logo_small","logo_text","extraMenuItems","searchUrl","notificationsUrl","privateThreadsUrl","showSearch","can_search","addInitializer","ReactDOM","NotificationsOverlayBody","NotificationsOverlayBodyPill","NotificationsOverlay","notifications","NotificationsHeader","PageHeader","subtitle","PillsNav","PillsNavLink","link","NotificationsPills","basename","NotificationsPagination","NotificationsPaginationLink","hasPrevious","firstCursor","lastCursor","hasNext","NotificationsToolbar","markAllAsRead","getSubtitle","route","getBaseUrl","PageContainer","readAll","mutating","toolbarProps","history","replaceState","browserHistory","routes","NotificationsRoute","startsWith","expires_on","initWithPreloadedData","initWithoutPreloadedData","startPolling","profile","polls","poll","frequency","user_message","html","staff_message","isAfter","keys","getUserMessage","getStaffMessage","getExpirationMessage","getPanelBody","fieldname","fields","help_text","groups","group","f","initial","CancelButton","cancel","FormDisplay","isAuthenticated","SafeValue","onEdit","showEditButton","details","load","editing","newDetails","loadDetails","profileDetails","edit","edit_details","loadItems","next","Feed","loadMore","LoadMoreButton","isBusy","loadUsers","page","more","pages","setSpecialProps","PRELOADED_DATA_KEY","TITLE","API_FILTER","hydrate","apiUrl","getEmptyMessage","getMoreButton","getListBody","changed_by","changed_by_username","renderUserAvatar","renderUsername","old_username","new_username","changed_on","changes","hiddenOnMobile","loadChanges","is_followed","follow","action","canMessage","can_start_private_threads","isProfileOwner","is_avatar_locked","avatar_lock_user_message","avatar_lock_staff_message","moderate_avatar","avatar_hash","getFormBody","getModalBody","moderate_username","addNameChange","updateUsername","slug","countdown","isDeleted","with_content","getButtonLabel","getDeletedBody","getForm","AvatarControls","ChangeUsername","DeleteAccount","showAvatarDialog","rename","showRenameDialog","showDeleteDialog","is_active","ProfileModerationButton","FlexRow","available","getModeration","can_follow","WithDropdown","delete","is_anonymous","can_rename","can_moderate_avatar","can_delete","COMPONENTS","follows","Follows","Details","UsernameHistory","BanDetails","paths","Profile","RequestLinkForm","LinkSent","reset","RequestActivationLink","RequestResetForm","showInactivePage","AccountInactivePage","getActivateButton","RequestPasswordReset","ResetPasswordForm","PasswordChangedPage","SignInModal","showSignIn","updateSearch","urlQuery","pushState","providers","provider","updateUsers","updatePosts","onQueryChange","Badge","SearchTime","time","copy","LoadMore","appendPosts","updateProvider","Blankslate","components","TYPES_CLASSES","info","warning","Snackbar","snackbarClass","isVisible","getSnackbarClass","backendName","pageTitleTpl","pageTitle","backend","Register","emailProtected","onRegistrationComplete","step","stateUpdate","backend_name","emailHelpText","emailHelpTextTpl","SocialAuth","handleRegistrationComplete","op","updateAcl","participants","ModalHeader","onUsernameChange","can_add_participants","participant","confirmed","isUser","is_owner","can_change_owner","isModerator","can_moderate_private_threads","userIsOwner","UserStatus","isOwner","getUserIsOwner","utils","PollChoice","hash","proc","votes","getVotesLabel","ChoiceVotes","UserChoice","hydratedData","voters","voter","voted_on","ModalBody","ChoicesList","ChoiceDetails","VotesCount","VotesList","Voter","VoteDate","isPollOver","showVoting","is_public","can_edit","can_see_votes","can_vote","hasSelectedChoices","allow_revotes","controls","canVote","canChangeVote","ChangeVote","SeeVotes","Edit","Delete","newThreadAcl","DATE_ABBR","PollVotes","PollLength","PollIsPublic","PollCreation","getPoster","getPostedOn","absolute","relative","ends_on","getEndsOn","endsOn","question","PollChoicesLeft","choicesLeft","PollAllowRevote","ChoiceSelect","toggleChoice","getChoicesLeft","allowed_choices","getChoiceFromHash","deselectChoice","selectChoice","showResults","getIsPollOver","setChoices","canDelete","onDelete","onAdd","every","isEdit","PollPublicSwitch","ICON","changed_title","pinned_globally","pinned_locally","unpinned","moved","merged","approved","opened","unhid","hid","changed_owner","tookover","added_participant","owner_left","participant_left","removed_participant","event_type","can_hide","Hide","Unhide","hidden_on","hidden_by_name","hidden_by","USER_SPAN","USER_URL","Hidden","Poster","event_by","event_on","MESSAGE","ITEM_LINK","ITEM_SPAN","ChangedTitle","Moved","Merged","ChangedOwner","AddedParticipant","RemovedParticipant","msgstring","oldTitle","event_context","old_title","fromCategory","from_category","mergedThread","merged_thread","newOwner","is_read","initialized","observer","IntersectionObserver","entries","observe","entry","isIntersecting","primed","read","destroy","disconnect","ready","initialize","AttachmentPreview","AttachmentDetails","AttachmentThumbnail","AttachmentIcon","backgroundImage","can_see_hidden","Row","FlagBestAnswer","best_answer","best_answer_marked_by","marked_on","best_answer_marked_on","marked_by","best_answer_marked_by_name","FlagHidden","FlagUnapproved","is_unapproved","FlagProtected","approve","unprotect","like","lastLikes","last_likes","concatedLikes","finalLikes","is_liked","likes","unlike","previousState","ops","markAsBestAnswer","best_answer_is_protected","best_answer_marked_by_slug","patchThread","unmarkBestAnswer","hydrateLike","ModalDialog","LikesList","liked_on","likesCount","LikeDetails","liker_id","LikeDate","likedOn","can_reply","can_see_likes","can_like","MarkAsBestAnswer","MarkAsBestAnswerCompact","Like","Likes","LikesCompact","Reply","Quote","can_mark_best_answer","can_mark_as_best_answer","can_change_best_answer","hasLikes","getLikesMessage","u","hiddenLikes","otherUsers","lastUser","usernamesList","last_user","editor","move","new_thread","onUrlChange","DiffItem","revertEdit","canRevert","goToEdit","previous","GoBackBtn","goBack","GoForwardBtn","goForward","GoLastBtn","goLast","Label","RevertBtn","editor_name","edited_on","edited_by","hydrateEdit","edits","hydratedPost","PostingConfig","ModerationForm","isError","Error","Loader","categoryId","can_pin_threads","weight","can_hide_threads","can_close_threads","is_closed","isHiddenChoices","isClosedChoices","getWeightChoices","Modal","renderWeightField","renderHiddenField","renderClosedField","Permalink","UnmarkMarkBestAnswer","PostEdits","Approve","Move","Split","Protect","Unprotect","permaUrl","protocol","host","prompt","can_unmark_best_answer","isUnedited","can_approve","can_move","can_unhide","isSelected","can_merge_posts","UnreadLabel","UnreadCompact","PostedOn","PostedOnCompact","PostEditsCompacts","ProtectedLabel","postAuthor","hasAcl","hasVisibleTitle","ListItem","is_event","has_poll","has_unapproved_posts","replies","starter","starter_name","started_on","handleSuccessUnmounted","bestAnswer","BestAnswerSelect","bestAnswers","onBestAnswerChange","PollSelect","onPollChange","best_answers","merge","other_thread","post_set","ModalMessage","ModalLoading","successMessage","changeTitle","dropup","stickToBottom","watch","setNotifications","special_role","breadcrumbs","hasFlags","is_authenticated","enabled","resetScroll","ThreadPaginatorConnected","withRouter","router","scrollToTop","first","formData","min","max","PostErrors","heading","ids","rollback","isArray","Merge","can_merge","onReply","compact","is_new","new_post","unapproved_post","last_post","pollDisabled","onPoll","can_start_poll","setPageTitle","editPoll","shouldFetchData","fetchData","startPollingApi","stopPollingApi","params","delayed","threadModeration","getThreadModeration","postsModeration","getPostsModeration","openPollForm","openReplyForm","closePollForm","can_close","can_pin_globally","can_pin","can_unprotect","basePath","Route","getPageUrl","trackedPeriod","rankUrl","getUserStatus","getRankName","getUserTitle","counter","meta","posters","getLeadMessage","tracked_period","string","subString","n","stringCount","description","getRankDescription","getComponent","Rank","ActivePosters","Users","_element","_component","removeClass","attr","forum_index_title","reducer","initialState","array","SELECT_ALL","SELECT_NONE","SELECT_ITEM","APPEND_THREADS","DELETE_THREAD","FILTER_THREADS","HYDRATE_THREADS","PATCH_THREAD","SORT_THREADS","MODERATION_PERMISSIONS","hydrateThread","thread_acl","perm","mergedState","concatUnique","sort","sorting","itemCategory","categoriesMap","lft","rght","patchedState","doTick","UPDATE_AUTHENTICATED_USER","PATCH_USER","SIGN_IN","SIGN_OUT","signIn","signOut","soft","updatedState","UPDATE_AVATAR","userId","UPDATE_USERNAME","OPEN_SITE_NAV","OPEN_SEARCH","OPEN_NOTIFICATIONS","OPEN_PRIVATE_THREADS","OPEN_USER_NAV","CLOSE","openSiteNav","openSearch","openNotifications","openUserNav","privateThreads","REPLACE_PARTICIPANTS","BUSY_POLL","RELEASE_POLL","REMOVE_POLL","REPLACE_POLL","UPDATE_POLL","busy","release","hydrated","PATCH_POST","updated_on","hydrateAttachment","hydrateUser","APPEND_POSTS","SELECT_POST","DESELECT_POST","DESELECT_POSTS","LOAD_POSTS","UNLOAD_POSTS","UPDATE_POSTS","deselect","deselectAll","hydratePost","unload","selectedPosts","deseletedPosts","deseletedAllPosts","resultsIds","reducedPosts","postReducer","LOAD_DETAILS","HYDRATE_PROFILE","PATCH_PROFILE","hydrateStatus","REPLACE_SEARCH","UPDATE_SEARCH","UPDATE_SEARCH_PROVIDER","SHOW_SNACKBAR","HIDE_SNACKBAR","showSnackbar","messageType","hideSnackbar","BUSY_THREAD","RELEASE_THREAD","REPLACE_THREAD","UPDATE_THREAD","UPDATE_THREAD_ACL","last_post_on","TICK","ADD_NAME_CHANGE","APPEND_HISTORY","HYDRATE_HISTORY","changedBy","hydrateNamechange","namechange","unshift","floor","APPEND_USERS","HYDRATE_USERS","_cookieName","_csrfToken","_locks","self","resolve","reject","getCsrfToken","contentType","dataType","jqXHR","responseJSON","statusText","lock","param","waiter","wait","processData","XMLHttpRequest","evt","lengthComputable","total","local","_store","_local","_modal","syncSession","watchState","getState","BaseCaptcha","_ajax","_include","_snackbar","NoCaptcha","QACaptcha","kwargs","ReCaptchaComponent","grecaptcha","render","sitekey","siteKey","binding","ReCaptcha","recaptcha_site_key","captcha_type","_captcha","init","staticUrl","_staticUrl","_included","script","remote","localStorage","_prefix","_watchers","e","newValueJson","watcher","oldValue","setItem","itemString","getItem","indexTitle","forumName","_indexTitle","_forumName","finalTitle","_polls","stop","poolServer","_stopped","apiError","pollId","unsetBeforeUnload","_props","_isOpen","_isClosing","_mount","_observer","unobserve","_spacer","_mode","ResizeObserver","contentRect","_beforeunloadSet","beforeUnload","capture","returnValue","_realOpen","setBeforeUnload","_timeout","alert","_reducers","_initialState","createStore","combineReducers","_isLoaded","_loadedPromise","_loadingPromise","tries","plain","expires","getReasonMessage","RedrawedBannedPage","BannedPage","changeState","rowWidth","padding","b","m","bytes","roundSize","toFixed","ALPHA","ALPHA_LEN","len","chars","Component","rootElementId","connected","rootElement","finalComponent","int","childRoutes","onEnter","EMAIL","USERNAME","USERNAME_ALPHANUMERIC","String","requiredTermsOfService","requiredPrivacyPolicy","returnMessage","usernameMinLength","lengthMin","usernameMaxLength","lengthMax","usernameContent","valueTrimmed","webpackContext","req","webpackContextResolve","__webpack_require__","o","module","exports","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","r","getter","__esModule","d","definition","defineProperty","enumerable","chunkId","reduce","promises","miniCssF","g","globalThis","Function","hmd","create","obj","prop","prototype","l","done","needAttach","scripts","getElementsByTagName","s","charset","nc","onScriptComplete","prev","onerror","onload","doneFns","removeChild","bind","head","Symbol","toStringTag","nmd","scriptUrl","importScripts","currentScript","installedChunks","installedChunkData","errorType","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/misago/templates/misago/account/settings/email_form.html b/misago/templates/misago/account/settings/email_form.html index ab5ead23d5..8c107ed3e1 100644 --- a/misago/templates/misago/account/settings/email_form.html +++ b/misago/templates/misago/account/settings/email_form.html @@ -1,4 +1,4 @@ -{% load i18n misago_forms misago_capture %} +{% load i18n misago_forms %} {% if is_request_htmx %} {% include "misago/snackbars.html" %} {% endif %} diff --git a/misago/templates/misago/posting/start.html b/misago/templates/misago/posting/start.html new file mode 100644 index 0000000000..76e943f94d --- /dev/null +++ b/misago/templates/misago/posting/start.html @@ -0,0 +1,95 @@ +{% extends "misago/base.html" %} +{% load i18n misago_forms %} + + +{% block title %} + {% trans "Start new thread" context "start thread page" %} | {{ category }} | {{ block.super }} +{% endblock title %} + + +{% block content %} +
    +
    + + {% if preview %} +
    +
    +

    + {% trans "Message preview" context "start thread page" %} +

    +
    +
    +
    + {{ preview|safe }} +
    +
    +
    + {% endif %} + {% if search_document %} +
    +
    +

    + {% trans "Search document preview" context "start thread page" %} +

    +
    +
    +
    {{ search_document }}
    +
    +
    + {% endif %} + +
    + {% csrf_token %} +
    +
    +

    + {% trans "Start new thread" context "start thread page" %} +

    +
    +
    + {% with form.title as field %} +
    + + + {% for error in field.errors %} +

    {{ error }}

    + {% endfor %} +
    + {% endwith %} + {% with form.post as field %} +
    + + + {% for error in field.errors %} +

    {{ error }}

    + {% endfor %} +
    + {% endwith %} +
    + +
    +
    +
    +
    +{% endblock content %} diff --git a/misago/threads/search.py b/misago/threads/search.py index 6044e77532..ce06a677a7 100644 --- a/misago/threads/search.py +++ b/misago/threads/search.py @@ -1,4 +1,9 @@ -from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector +from django.contrib.postgres.search import ( + SearchHeadline, + SearchQuery, + SearchRank, + SearchVector, +) from django.utils.translation import pgettext_lazy from ..conf import settings @@ -94,6 +99,15 @@ def search_threads(request, query, visible_threads): return ( Post.objects.filter(id__in=queryset.values("id")) - .annotate(rank=SearchRank(search_vector, search_query)) + .annotate( + headline=SearchHeadline( + "search_document", + query, + max_words=20, + min_words=10, + max_fragments=5, + ), + rank=SearchRank(search_vector, search_query), + ) .order_by("-rank", "-id") ) diff --git a/misago/threads/serializers/feed.py b/misago/threads/serializers/feed.py index 5e0ec65af2..38264852a6 100644 --- a/misago/threads/serializers/feed.py +++ b/misago/threads/serializers/feed.py @@ -28,5 +28,10 @@ class Meta: def get_thread(self, obj): return {"title": obj.thread.title, "url": obj.thread.get_absolute_url()} + def to_representation(self, obj): + data = super().to_representation(obj) + data["headline"] = getattr(obj, "headline", None) + return data + FeedSerializer = FeedSerializer.exclude_fields("is_liked", "is_new", "is_read") diff --git a/misago/urls.py b/misago/urls.py index 0d20ced824..7928fcf8cb 100644 --- a/misago/urls.py +++ b/misago/urls.py @@ -15,6 +15,7 @@ path("", include("misago.users.urls")), path("account/", include("misago.account.urls")), path("", include("misago.categories.urls")), + path("", include("misago.posting.urls")), path("", include("misago.threads.urls")), path("", include("misago.notifications.urls")), path("", include("misago.search.urls")), From 4f0b07d0492e58207ba3514402f1d3d6ef1736db Mon Sep 17 00:00:00 2001 From: rafalp Date: Tue, 30 Jul 2024 21:04:24 +0200 Subject: [PATCH 04/24] Small refactor of thread start view --- misago/posting/views/start.py | 119 +++++++++++++++++++++------------- 1 file changed, 74 insertions(+), 45 deletions(-) diff --git a/misago/posting/views/start.py b/misago/posting/views/start.py index 70eb21fd31..029b647e1c 100644 --- a/misago/posting/views/start.py +++ b/misago/posting/views/start.py @@ -1,4 +1,5 @@ from django.db import models +from django.forms import Form from django.http import Http404, HttpRequest, HttpResponse from django.views import View from django.shortcuts import redirect, render @@ -8,7 +9,7 @@ from ...categories.enums import CategoryTree from ...categories.models import Category from ...core.utils import slugify -from ...parser.context import create_parser_context +from ...parser.context import ParserContext, create_parser_context from ...parser.enums import ContentType, PlainTextFormat from ...parser.factory import create_parser from ...parser.html import render_ast_to_html @@ -22,55 +23,93 @@ class StartView(View): template_name: str - - -class ThreadStartView(StartView): - template_name: str = "misago/posting/start.html" + form_class = ThreadStartForm def get(self, request: HttpRequest, **kwargs) -> HttpResponse: category = self.get_category(request, kwargs["id"]) form = ThreadStartForm() + return render( request, self.template_name, - {"category": category, "form": form}, + self.get_context(request, category, form), ) def post(self, request: HttpRequest, **kwargs) -> HttpResponse: category = self.get_category(request, kwargs["id"]) form = ThreadStartForm(request.POST, request.FILES) + if not form.is_valid(): return render( request, self.template_name, - {"category": category, "form": form}, + self.get_context(request, category, form), ) + if request.POST.get("preview"): + context = self.get_context(request, category, form) + context["preview"] = self.get_preview(request, form) + + return render(request, self.template_name, context) + + thread = self.create_thread(request, category, form) + thread_url = self.get_thread_url(request, thread) + return redirect(thread_url) + + def get_form(self, request: HttpRequest, category: Category) -> Form: + if request.method == "POST": + return self.form_class(request.POST, request.FILES) + + return self.form_class() + + def get_context(self, request: HttpRequest, category: Category, form: Form) -> dict: + return {"category": category, "form": form} + + def get_preview(self, request: HttpRequest, form: Form) -> str: + context, ast, metadata = self.parse_post(request, form) + return render_ast_to_html(context, ast, metadata) + + def create_thread( + self, request: HttpRequest, category: Category, form: Form + ) -> Thread: + raise NotImplementedError() + + def parse_post( + self, request: HttpRequest, form: Form + ) -> tuple[ParserContext, list[dict], dict]: context = create_parser_context(request, content_type=ContentType.POST) parser = create_parser(context) - ast = parser(form.cleaned_data["post"]) metadata = create_ast_metadata(context, ast) - html = render_ast_to_html(context, ast, metadata) - search_document = ( - form.cleaned_data["title"] - + " " - + render_ast_to_plaintext( - context, ast, metadata, PlainTextFormat.SEARCH_DOCUMENT + return context, ast, metadata + + def get_thread_url(self, request: HttpRequest, thread: Thread) -> str: + raise NotImplementedError() + + +class ThreadStartView(StartView): + template_name: str = "misago/posting/start.html" + + def get_category(self, request: HttpRequest, category_id: int) -> Category: + try: + category = Category.objects.get( + id=category_id, + tree_id=CategoryTree.THREADS, + level__gt=0, ) + except Category.DoesNotExist: + raise Http404() + + check_browse_category_permission( + request.user_permissions, category, can_delay=True ) - if request.POST.get("preview"): - return render( - request, - self.template_name, - { - "category": category, - "form": form, - "preview": html, - "search_document": search_document, - }, - ) + return category + + def create_thread( + self, request: HttpRequest, category: Category, form: Form + ) -> Thread: + context, ast, metadata = self.parse_post(request, form) now = timezone.now() @@ -88,6 +127,11 @@ def post(self, request: HttpRequest, **kwargs) -> HttpResponse: last_poster_slug=request.user.slug, ) + html = render_ast_to_html(context, ast, metadata) + search = render_ast_to_plaintext( + context, ast, metadata, text_format=PlainTextFormat.SEARCH_DOCUMENT + ) + post = Post.objects.create( category=category, thread=thread, @@ -95,7 +139,7 @@ def post(self, request: HttpRequest, **kwargs) -> HttpResponse: poster_name=request.user.username, original=form.cleaned_data["post"], parsed=html, - search_document=search_document, + search_document=search, posted_on=now, updated_on=now, ) @@ -113,29 +157,14 @@ def post(self, request: HttpRequest, **kwargs) -> HttpResponse: category.set_last_thread(thread) category.save() - thread_url = reverse( + return thread + + def get_thread_url(self, request: HttpRequest, thread: Thread) -> str: + return reverse( "misago:thread", kwargs={"pk": thread.id, "slug": thread.slug}, ) - return redirect(thread_url) - - def get_category(self, request: HttpRequest, category_id: int) -> Category: - try: - category = Category.objects.get( - id=category_id, - tree_id=CategoryTree.THREADS, - level__gt=0, - ) - except Category.DoesNotExist: - raise Http404() - - check_browse_category_permission( - request.user_permissions, category, can_delay=True - ) - - return category - class PrivateThreadStartView(StartView): pass From 04761e6870cc48e2399fb4ce70e7750bc27db042 Mon Sep 17 00:00:00 2001 From: rafalp Date: Tue, 30 Jul 2024 23:31:08 +0200 Subject: [PATCH 05/24] WIP select category to start thread at --- frontend/src/style/index.less | 1 + .../style/misago/select-category-list.less | 66 +++++++++++++++++++ misago/categories/categories.py | 1 + misago/permissions/threads/__init__.py | 6 ++ misago/permissions/threads/checks.py | 35 ++++++++++ misago/posting/urls.py | 11 +++- misago/posting/views/start.py | 57 +++++++++++++++- misago/static/misago/css/misago.css | 2 +- misago/static/misago/css/misago.css.map | 2 +- .../misago/posting/select_category.html | 32 +++++++++ .../misago/posting/select_category_modal.html | 13 ++++ .../misago/posting/select_category_page.html | 18 +++++ misago/templates/misago/threads/index.html | 1 + .../misago/threads/start_thread.html | 9 +++ misago/templates/misago/threads/toolbar.html | 35 ++++++++-- misago/threads/views/list.py | 21 ++++++ 16 files changed, 298 insertions(+), 12 deletions(-) create mode 100644 frontend/src/style/misago/select-category-list.less create mode 100644 misago/permissions/threads/checks.py create mode 100644 misago/templates/misago/posting/select_category.html create mode 100644 misago/templates/misago/posting/select_category_modal.html create mode 100644 misago/templates/misago/posting/select_category_page.html create mode 100644 misago/templates/misago/threads/start_thread.html diff --git a/frontend/src/style/index.less b/frontend/src/style/index.less index 8d0c77117e..5840a64202 100644 --- a/frontend/src/style/index.less +++ b/frontend/src/style/index.less @@ -125,6 +125,7 @@ @import "misago/post-changelog.less"; @import "misago/quote-control.less"; @import "misago/section-divider.less"; +@import "misago/select-category-list.less"; // Pages @import "misago/auth-pages.less"; diff --git a/frontend/src/style/misago/select-category-list.less b/frontend/src/style/misago/select-category-list.less new file mode 100644 index 0000000000..3ab87cc521 --- /dev/null +++ b/frontend/src/style/misago/select-category-list.less @@ -0,0 +1,66 @@ +.select-category-list { + margin: 0; + padding: 0; + list-style: none; + + a, span { + display: inline-block; + margin: 4px 0; + + font-weight: 500; + } + + a:link, + a:active, + a:visited, + a:hover, + a:focus { + color: @text-color; + } +} + +.select-category-list-header, +.select-category-list-item { + display: flex; + align-items: center; +} + +.select-category-list-header { + a, span { + font-weight: bold; + } + + span { + color: @gray; + } +} + +.select-category-list-item span { + color: @gray-light; +} + +.select-category-list-item-level { + width: 18px; +} + +.select-category-list-item-image { + margin-right: 8px; + width: 8px; + height: 8px; + + background-color: @gray-lighter; + border-radius: @border-radius-small; +} + +.select-category-list-item-color { + background-color: var(--color); +} + +.select-category-list-separator { + margin: floor(@line-height-computed / 2) 0; + border-top: 1px solid @gray-lighter; +} + +.select-category-list-separator:last-child { + display: none; +} \ No newline at end of file diff --git a/misago/categories/categories.py b/misago/categories/categories.py index 041b924f1f..6b133a72d2 100644 --- a/misago/categories/categories.py +++ b/misago/categories/categories.py @@ -96,6 +96,7 @@ def _get_category_data_action(result: dict[str, Any]) -> dict[str, Any]: "id": result["id"], "parent_id": result["parent_id"] if result["level"] > 1 else None, "name": result["name"], + "slug": result["slug"], "short_name": result["short_name"], "color": result["color"], "css_class": result["css_class"], diff --git a/misago/permissions/threads/__init__.py b/misago/permissions/threads/__init__.py index 28560bf570..2f7df7909c 100644 --- a/misago/permissions/threads/__init__.py +++ b/misago/permissions/threads/__init__.py @@ -1,3 +1,7 @@ +from .checks import ( + check_can_start_thread_in_category, + check_can_post_in_closed_category, +) from .querysets import ( CategoryThreadsQuerysetFilter, ThreadsQuerysetFilter, @@ -6,4 +10,6 @@ __all__ = [ "CategoryThreadsQuerysetFilter", "ThreadsQuerysetFilter", + "check_can_start_thread_in_category", + "check_can_post_in_closed_category", ] diff --git a/misago/permissions/threads/checks.py b/misago/permissions/threads/checks.py new file mode 100644 index 0000000000..55c2b94d5d --- /dev/null +++ b/misago/permissions/threads/checks.py @@ -0,0 +1,35 @@ +from django.core.exceptions import PermissionDenied +from django.utils.translation import pgettext + +from ...categories.models import Category +from ..enums import CategoryPermission +from ..proxy import UserPermissionsProxy + + +def check_can_post_in_closed_category( + permissions: UserPermissionsProxy, category: Category +): + if category.is_closed and not ( + permissions.is_global_moderator + or category.id in permissions.categories_moderator + ): + raise PermissionDenied( + pgettext( + "threads permission error", + "This category is closed.", + ) + ) + + +def check_can_start_thread_in_category( + permissions: UserPermissionsProxy, category: Category +): + if category.id not in permissions.categories[CategoryPermission.START]: + raise PermissionDenied( + pgettext( + "threads permission error", + "You can't start new threads in this category.", + ) + ) + + check_can_post_in_closed_category(permissions, category) diff --git a/misago/posting/urls.py b/misago/posting/urls.py index fb58e2af40..c436b3fb55 100644 --- a/misago/posting/urls.py +++ b/misago/posting/urls.py @@ -1,9 +1,18 @@ from django.urls import path -from .views.start import PrivateThreadStartView, ThreadStartView +from .views.start import ( + PrivateThreadStartView, + ThreadStartSelectCategoryView, + ThreadStartView, +) urlpatterns = [ + path( + "start-thread/", + ThreadStartSelectCategoryView.as_view(), + name="start-thread", + ), path( "c///start-thread/", ThreadStartView.as_view(), diff --git a/misago/posting/views/start.py b/misago/posting/views/start.py index 029b647e1c..b822318922 100644 --- a/misago/posting/views/start.py +++ b/misago/posting/views/start.py @@ -15,6 +15,7 @@ from ...parser.html import render_ast_to_html from ...parser.metadata import create_ast_metadata from ...parser.plaintext import render_ast_to_plaintext +from ...permissions.enums import CategoryPermission from ...permissions.categories import check_browse_category_permission from ...threads.checksums import update_post_checksum from ...threads.models import Post, Thread @@ -170,5 +171,57 @@ class PrivateThreadStartView(StartView): pass -def select_category(request: HttpRequest) -> HttpResponse: - pass +class ThreadStartSelectCategoryView(View): + template_name = "misago/posting/select_category_page.html" + template_name_htmx = "misago/posting/select_category_modal.html" + + def get(self, request: HttpRequest) -> HttpResponse: + context = self.get_context(request) + + if request.is_htmx: + template_name = self.template_name_htmx + else: + template_name = self.template_name + + return render(request, template_name, context) + + def get_context(self, request: HttpRequest) -> dict: + permissions = request.user_permissions.categories[CategoryPermission.START] + + choices: list[dict] = [] + for category in request.categories.categories_list: + choice = { + "id": category["id"], + "name": category["name"], + "slug": category["slug"], + "color": category["color"], + "level": "", + "is_vanilla": category["is_vanilla"], + "disabled": ( + category["is_vanilla"] or category["id"] not in permissions + ), + } + + if not category["level"]: + choice["children"] = [] + choices.append(choice) + else: + parent = choices[-1] + choice["level"] = "1" * (category["level"] - 1) + parent["children"].append(choice) + + # Remove branches where entire branch is disabled + clean_choices: list[dict] = [] + for category in choices: + clean_children: list[dict] = [] + for child in reversed(category["children"]): + if not child["disabled"] or ( + clean_children and clean_children[-1]["level"] > child["level"] + ): + clean_children.append(child) + + if not category["disabled"] or clean_children: + category["children"] = reversed(clean_children) + clean_choices.append(category) + + return {"start_thread_choices": clean_choices} diff --git a/misago/static/misago/css/misago.css b/misago/static/misago/css/misago.css index 0318ca0e0e..12add258ed 100644 --- a/misago/static/misago/css/misago.css +++ b/misago/static/misago/css/misago.css @@ -1,3 +1,3 @@ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-family:sans-serif}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:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.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:-.5em}sub{bottom:-.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 silver;margin:0 2px;padding:.35em .625em .75em}textarea{overflow:auto}optgroup{font-weight:700}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{*,:after,:before{background:transparent!important;box-shadow:none!important;color:#000!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:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}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}}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:10px}body{background-color:#fff;color:#172b4d;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#0065ff;text-decoration:none}a:focus,a:hover{color:#0747a6;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{background-color:#fff;border:1px solid #ddd;border-radius:4px;display:inline-block;height:auto;line-height:1.42857143;max-width:100%;padding:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{border:0;border-top:1px solid #ebecf0;margin-bottom:20px;margin-top:20px}.sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:inherit;font-weight:500;line-height:1.1}.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{color:#7a869a;font-weight:400;line-height:1}.h1,.h2,.h3,h1,h2,h3{margin-bottom:10px;margin-top:20px}.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-bottom:10px;margin-top: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{font-size:16px;font-weight:300;line-height:1.4;margin-bottom:20px}@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:#7a869a}.text-primary{color:#2563eb}a.text-primary:focus,a.text-primary:hover{color:#134cca}.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{background-color:#2563eb;color:#fff}a.bg-primary:focus,a.bg-primary:hover{background-color:#134cca}.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}.page-header{border-bottom:1px solid #ebecf0;margin:40px 0 20px;padding-bottom:9px}ol,ul{margin-bottom:10px;margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-inline,.list-unstyled{list-style:none;padding-left:0}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-bottom:20px;margin-top:0}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:700px){.dl-horizontal dt{clear:left;float:left;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap;width:160px}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{border-left:5px solid #ebecf0;font-size:17.5px;margin:0 0 20px;padding:10px 20px}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{color:#7a869a;display:block;font-size:80%;line-height:1.42857143}blockquote .small:before,blockquote footer:before,blockquote small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{border-left:0;border-right:5px solid #ebecf0;padding-left:0;padding-right:15px;text-align:right}.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{font-style:normal;line-height:1.42857143;margin-bottom:20px}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Courier New,monospace}code{background-color:#f9f2f4;border-radius:4px;color:#c7254e}code,kbd{font-size:90%;padding:2px 4px}kbd{background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);color:#fff}kbd kbd{box-shadow:none;font-size:100%;font-weight:700;padding:0}pre{word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px;color:#344563;display:block;font-size:13px;line-height:1.42857143;margin:0 0 10px;padding:9.5px;word-break:break-all}pre code{background-color:transparent;border-radius:0;color:inherit;font-size:inherit;padding:0;white-space:pre-wrap}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-left:auto;margin-right: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-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.row-no-gutters{margin-left:0;margin-right:0}.row-no-gutters [class*=col-]{padding-left:0;padding-right:0}.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{min-height:1px;padding-left:15px;padding-right:15px;position:relative}.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}}table{background-color:transparent}table col[class*=col-]{display:table-column;float:none;position:static}table td[class*=col-],table th[class*=col-]{display:table-cell;float:none;position:static}caption{color:#7a869a;padding-bottom:8px;padding-top:8px}caption,th{text-align:left}.table{margin-bottom:20px;max-width:100%;width:100%}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{border-top:1px solid #ddd;line-height:1.42857143;padding:8px;vertical-align:top}.table>thead>tr>th{border-bottom:2px solid #ddd;vertical-align:bottom}.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-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{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;margin-bottom:15px;overflow-y:hidden;width:100%}.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{margin:0;min-width:0}fieldset,legend{border:0;padding:0}legend{border-bottom:1px solid #e5e5e5;color:#344563;display:block;font-size:21px;line-height:inherit;margin-bottom:20px;width:100%}label{display:inline-block;font-weight:700;margin-bottom:5px;max-width:100%}input[type=search]{-webkit-appearance:none;appearance:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{line-height:normal;margin:4px 0 0;margin-top:1px\9}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}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{padding-top:7px}.form-control,output{color:#172b4d;display:block;font-size:14px;line-height:1.42857143}.form-control{background-color:#fff;background-image:none;border:1px solid #ced0da;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);height:34px;padding:6px 12px;-webkit-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-o-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}.form-control:focus{border-color:#66afe9;-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);outline:0}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#ebecf0;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=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{display:block;margin-bottom:10px;margin-top:10px;position:relative}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.checkbox label,.radio label{cursor:pointer;font-weight:400;margin-bottom:0;min-height:20px;padding-left:20px}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{margin-left:-20px;margin-top:4px\9;position:absolute}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{cursor:pointer;display:inline-block;font-weight:400;margin-bottom:0;padding-left:20px;position:relative;vertical-align:middle}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-left:10px;margin-top:0}.form-control-static{margin-bottom:0;min-height:34px;padding-bottom:7px;padding-top:7px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{border-radius:3px;font-size:12px;height:30px;line-height:1.5;padding:5px 10px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{border-radius:3px;font-size:12px;height:30px;line-height:1.5;padding:5px 10px}.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{font-size:12px;height:30px;line-height:1.5;min-height:32px;padding:6px 10px}.input-lg{border-radius:6px;font-size:18px;height:46px;line-height:1.3333333;padding:10px 16px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{border-radius:6px;font-size:18px;height:46px;line-height:1.3333333;padding:10px 16px}.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{font-size:18px;height:46px;line-height:1.3333333;min-height:38px;padding:11px 16px}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{display:block;height:34px;line-height:34px;pointer-events:none;position:absolute;right:0;text-align:center;top:0;width:34px;z-index:2}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{height:46px;line-height:46px;width:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{height:30px;line-height:30px;width:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.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}.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{background-color:#dff0d8;border-color:#3c763d;color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.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{background-color:#fcf8e3;border-color:#8a6d3b;color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.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{background-color:#f2dede;border-color:#a94442;color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{color:#3462af;display:block;margin-bottom:10px;margin-top:5px}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.form-inline .form-control-static{display:inline-block}.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 .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-bottom:0;margin-top: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]{margin-left:0;position:relative}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-bottom:0;margin-top:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{margin-bottom:0;padding-top:7px;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{font-size:18px;padding-top:11px}.form-horizontal .form-group-sm .control-label{font-size:12px;padding-top:6px}}.btn{background-image:none;border:1px solid transparent;border-radius:4px;cursor:pointer;display:inline-block;font-size:14px;font-weight:400;line-height:1.42857143;margin-bottom:0;padding:6px 12px;text-align:center;touch-action:manipulation;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#172b4d;text-decoration:none}.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125);outline:0}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{-webkit-box-shadow:none;box-shadow:none;cursor:not-allowed;filter:alpha(opacity=65);opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{background-color:#ebecf0;border-color:#ccc;color:#172b4d}.btn-default.focus,.btn-default:focus{background-color:#ced0da;border-color:#8c8c8c;color:#172b4d}.btn-default:hover{background-color:#ced0da;border-color:#adadad;color:#172b4d}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-color:#ced0da;background-image:none;border-color:#adadad;color:#172b4d}.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{background-color:#b9bdcb;border-color:#8c8c8c;color:#172b4d}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#ebecf0;border-color:#ccc}.btn-default .badge{background-color:#172b4d;color:#ebecf0}.btn-primary{background-color:#2563eb;border-color:#1555e2;color:#fff}.btn-primary.focus,.btn-primary:focus{background-color:#134cca;border-color:#0a296d;color:#fff}.btn-primary:hover{background-color:#134cca;border-color:#1040aa;color:#fff}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-color:#134cca;background-image:none;border-color:#1040aa;color:#fff}.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{background-color:#1040aa;border-color:#0a296d;color:#fff}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#2563eb;border-color:#1555e2}.btn-primary .badge{background-color:#fff;color:#2563eb}.btn-success{background-color:#22c55e;border-color:#1eaf54;color:#fff}.btn-success.focus,.btn-success:focus{background-color:#1a9a49;border-color:#0b4320;color:#fff}.btn-success:hover{background-color:#1a9a49;border-color:#157b3b;color:#fff}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-color:#1a9a49;background-image:none;border-color:#157b3b;color:#fff}.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{background-color:#157b3b;border-color:#0b4320;color:#fff}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#22c55e;border-color:#1eaf54}.btn-success .badge{background-color:#fff;color:#22c55e}.btn-info{background-color:#4f46e5;border-color:#3a30e2;color:#fff}.btn-info.focus,.btn-info:focus{background-color:#291fd9;border-color:#181280;color:#fff}.btn-info:hover{background-color:#291fd9;border-color:#231aba;color:#fff}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-color:#291fd9;background-image:none;border-color:#231aba;color:#fff}.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{background-color:#231aba;border-color:#181280;color:#fff}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#4f46e5;border-color:#3a30e2}.btn-info .badge{background-color:#fff;color:#4f46e5}.btn-warning{background-color:#ffab00;border-color:#e69a00;color:#fff}.btn-warning.focus,.btn-warning:focus{background-color:#cc8900;border-color:#640;color:#fff}.btn-warning:hover{background-color:#cc8900;border-color:#a87100;color:#fff}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-color:#cc8900;background-image:none;border-color:#a87100;color:#fff}.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{background-color:#a87100;border-color:#640;color:#fff}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#ffab00;border-color:#e69a00}.btn-warning .badge{background-color:#fff;color:#ffab00}.btn-danger{background-color:#ef5350;border-color:#ed3c39;color:#fff}.btn-danger.focus,.btn-danger:focus{background-color:#eb2521;border-color:#98110e;color:#fff}.btn-danger:hover{background-color:#eb2521;border-color:#d51713;color:#fff}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-color:#eb2521;background-image:none;border-color:#d51713;color:#fff}.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{background-color:#d51713;border-color:#98110e;color:#fff}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#ef5350;border-color:#ed3c39}.btn-danger .badge{background-color:#fff;color:#ef5350}.btn-link{border-radius:0;color:#0065ff;font-weight:400}.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{background-color:transparent;color:#0747a6;text-decoration:underline}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#7a869a;text-decoration:none}.btn-group-lg>.btn,.btn-lg{border-radius:6px;font-size:18px;line-height:1.3333333;padding:10px 16px}.btn-group-sm>.btn,.btn-sm{border-radius:3px;font-size:12px;line-height:1.5;padding:5px 10px}.btn-group-xs>.btn,.btn-xs{border-radius:3px;font-size:12px;line-height:1.5;padding:1px 5px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;position:relative;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px dashed;border-top:4px solid\9;display:inline-block;height:0;margin-left:2px;vertical-align:middle;width:0}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{background-clip:padding-box;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);display:none;float:left;font-size:14px;left:0;list-style:none;margin:2px 0 0;min-width:160px;padding:5px 0;position:absolute;text-align:left;top:100%;z-index:1000}.dropdown-menu.pull-right{left:auto;right:0}.dropdown-menu .divider{background-color:#ebecf0;height:1px;margin:9px 0;overflow:hidden}.dropdown-menu>li>a{clear:both;color:#172b4d;display:block;font-weight:400;line-height:1.42857143;padding:3px 20px;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#ebecf0;color:#172b4d;text-decoration:none}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#172b4d;color:#fff;outline:0;text-decoration:none}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#7a869a}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{background-color:transparent;background-image:none;cursor:not-allowed;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);text-decoration:none}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{color:#7a869a;display:block;font-size:12px;line-height:1.42857143;padding:3px 20px;white-space:nowrap}.dropdown-backdrop{bottom:0;left:0;position:fixed;right:0;top:0;z-index:990}.pull-right>.dropdown-menu{left:auto;right:0}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-bottom:4px dashed;border-bottom:4px solid\9;border-top:0;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{bottom:100%;margin-bottom:2px;top:auto}@media (min-width:700px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.nav{list-style:none;margin-bottom:0;padding-left:0}.nav>li,.nav>li>a{display:block;position:relative}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{background-color:#ebecf0;text-decoration:none}.nav>li.disabled>a{color:#7a869a}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{background-color:transparent;color:#7a869a;cursor:not-allowed;text-decoration:none}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#ebecf0;border-color:#0065ff}.nav .nav-divider{background-color:#e5e5e5;height:1px;margin:9px 0;overflow:hidden}.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{border:1px solid transparent;border-radius:4px 4px 0 0;line-height:1.42857143;margin-right:2px}.nav-tabs>li>a:hover{border-color:#ebecf0 #ebecf0 #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{background-color:#fff;border:1px solid;border-color:#ddd #ddd transparent;color:#5e6c84;cursor:default}.nav-tabs.nav-justified{border-bottom:0;width:100%}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{left:auto;top: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{border-radius:4px;margin-right:0}.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>a{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-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{background-color:#0065ff;color:#fff}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-left:0;margin-top:2px}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{left:auto;top: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{border-radius:4px;margin-right:0}.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-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{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.breadcrumb{background-color:#f5f5f5;border-radius:4px;list-style:none;margin-bottom:20px;padding:8px 15px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{color:#ccc;content:"/\00a0";padding:0 5px}.breadcrumb>.active{color:#7a869a}.alert{border:1px solid transparent;border-radius:0;margin-bottom:20px;padding:15px}.alert h4{color:inherit;margin-top:0}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{color:inherit;position:relative;right:-21px;top:-2px}.alert-success{background-color:#00875a;border-color:#00875a;color:#fff}.alert-success hr{border-top-color:#006e49}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#2563eb;border-color:#2563eb;color:#fff}.alert-info hr{border-top-color:#1555e2}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#ff8b00;border-color:#ff8b00;color:#fff}.alert-warning hr{border-top-color:#e67d00}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#de350b;border-color:#de350b;color:#fff}.alert-danger hr{border-top-color:#c62f0a}.alert-danger .alert-link{color:#e6e6e6}.label{border-radius:.25em;color:#fff;display:inline;font-size:75%;font-weight:700;line-height:1;padding:.2em .6em .3em;text-align:center;vertical-align:baseline;white-space:nowrap}a.label:focus,a.label:hover{color:#fff;cursor:pointer;text-decoration:none}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#7a869a}.label-default[href]:focus,.label-default[href]:hover{background-color:#616d80}.label-primary{background-color:#2563eb}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#134cca}.label-success{background-color:#36b37e}.label-success[href]:focus,.label-success[href]:hover{background-color:#2a8c62}.label-info{background-color:#4f46e5}.label-info[href]:focus,.label-info[href]:hover{background-color:#291fd9}.label-warning{background-color:#ffab00}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#cc8900}.label-danger{background-color:#ff5630}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#fc2e00}@-webkit-keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}.progress{background-color:#ebecf0;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);height:20px;margin-bottom:20px;overflow:hidden}.progress-bar{background-color:#2563eb;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);color:#fff;float:left;font-size:12px;height:100%;line-height:20px;text-align:center;-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease;width:0}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#36b37e}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-info{background-color:#4f46e5}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-warning{background-color:#ffab00}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-danger{background-color:#ff5630}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.btn-group,.btn-group-vertical{display:inline-block;position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{float:left;position:relative}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;max-width:100%;width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-left:0;margin-top:-1px}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:4px;border-top-right-radius:4px}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top-left-radius:0;border-top-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{border-collapse:separate;display:table;table-layout:fixed;width:100%}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.input-group{border-collapse:separate;display:table;position:relative}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{float:left;margin-bottom:0;position:relative;width:100%;z-index:2}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{border-radius:6px;font-size:18px;height:46px;line-height:1.3333333;padding:10px 16px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{border-radius:3px;font-size:12px;height:30px;line-height:1.5;padding:5px 10px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{vertical-align:middle;white-space:nowrap;width:1%}.input-group-addon{background-color:#ebecf0;border:1px solid #ced0da;border-radius:4px;color:#172b4d;font-size:14px;font-weight:400;line-height:1;padding:6px 12px;text-align:center}.input-group-addon.input-sm{border-radius:3px;font-size:12px;padding:5px 10px}.input-group-addon.input-lg{border-radius:6px;font-size:18px;padding:10px 16px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{font-size:0;white-space:nowrap}.input-group-btn,.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px;z-index:2}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-bottom:5px;margin-top:0}.media-list{list-style:none;padding-left:0}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{background-color:#fff;border:1px solid #ebecf0;display:block;margin-bottom:-1px;padding:10px 15px;position:relative}.list-group-item:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.list-group-item:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px;margin-bottom:0}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#ebecf0;color:#7a869a;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#7a869a}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{background-color:#fff;border-color:#ebecf0;color:#0065ff;z-index:2}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#fff}a.list-group-item,button.list-group-item{color:#7a869a}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{background-color:#fff;color:#172b4d;text-decoration:none}button.list-group-item{text-align:left;width:100%}.list-group-item-success{background-color:#dff0d8;color:#3c763d}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{background-color:#d0e9c6;color:#3c763d}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{background-color:#3c763d;border-color:#3c763d;color:#fff}.list-group-item-info{background-color:#d9edf7;color:#31708f}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{background-color:#c4e3f3;color:#31708f}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{background-color:#31708f;border-color:#31708f;color:#fff}.list-group-item-warning{background-color:#fcf8e3;color:#8a6d3b}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{background-color:#faf2cc;color:#8a6d3b}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{background-color:#8a6d3b;border-color:#8a6d3b;color:#fff}.list-group-item-danger{background-color:#f2dede;color:#a94442}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{background-color:#ebcccc;color:#a94442}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{background-color:#a94442;border-color:#a94442;color:#fff}.list-group-item-heading{margin-bottom:5px;margin-top:0}.list-group-item-text{line-height:1.3;margin-bottom:0}.panel{background-color:#fff;border:1px solid transparent;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05);margin-bottom:20px}.panel-body{padding:15px}.panel-heading{border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px;padding:14px 15px}.panel-heading>.dropdown .dropdown-toggle,.panel-title{color:inherit}.panel-title{font-size:16px;margin-bottom:0;margin-top:0}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{background-color:#fff;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-top:1px solid #ebecf0;padding:14px 15px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-radius:0;border-width:1px 0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{border-radius:4px;margin-bottom:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ebecf0}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ebecf0}.panel-default{border-color:#ddd}.panel-default>.panel-heading{background-color:#fff;border-color:#ddd;color:#344563}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{background-color:#344563;color:#fff}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#2563eb}.panel-primary>.panel-heading{background-color:#2563eb;border-color:#2563eb;color:#fff}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2563eb}.panel-primary>.panel-heading .badge{background-color:#fff;color:#2563eb}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2563eb}.panel-success{border-color:#36b37e}.panel-success>.panel-heading{background-color:#dff0d8;border-color:#36b37e;color:#3c763d}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#36b37e}.panel-success>.panel-heading .badge{background-color:#3c763d;color:#dff0d8}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#36b37e}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{background-color:#31708f;color:#d9edf7}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{background-color:#8a6d3b;color:#fcf8e3}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ff5630}.panel-danger>.panel-heading{background-color:#f2dede;border-color:#ff5630;color:#a94442}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ff5630}.panel-danger>.panel-heading .badge{background-color:#a94442;color:#f2dede}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ff5630}.pager{list-style:none;margin:20px 0;padding-left:0;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{background-color:#fff;border:1px solid #ddd;border-radius:15px;display:inline-block;padding:5px 14px}.pager li>a:focus,.pager li>a:hover{background-color:#ebecf0;text-decoration:none}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{background-color:#fff;color:#7a869a;cursor:not-allowed}.pagination{border-radius:4px;display:inline-block;margin:20px 0;padding-left:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{background-color:#fff;border:1px solid #ddd;color:#0065ff;float:left;line-height:1.42857143;margin-left:-1px;padding:6px 12px;position:relative;text-decoration:none}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{background-color:#ebecf0;border-color:#ddd;color:#0747a6;z-index:2}.pagination>li:first-child>a,.pagination>li:first-child>span{border-bottom-left-radius:4px;border-top-left-radius:4px;margin-left:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{background-color:#2563eb;border-color:#2563eb;color:#fff;cursor:default;z-index:3}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{background-color:#fff;border-color:#ddd;color:#7a869a;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{font-size:18px;line-height:1.3333333;padding:10px 16px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{font-size:12px;line-height:1.5;padding:5px 10px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.embed-responsive{display:block;height:0;overflow:hidden;padding:0;position:relative}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{border:0;bottom:0;height:100%;left:0;position:absolute;top:0;width:100%}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{background-color:#fff;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);margin-bottom:20px;min-height:20px;padding:19px}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{border-radius:6px;padding:24px}.well-sm{border-radius:3px;padding:9px}.close{color:#000;filter:alpha(opacity=20);float:right;font-size:21px;font-weight:700;line-height:1;opacity:.2;text-shadow:0 1px 0 #fff}.close:focus,.close:hover{color:#000;cursor:pointer;filter:alpha(opacity=50);opacity:.5;text-decoration:none}button.close{-webkit-appearance:none;appearance:none;background:transparent;border:0;cursor:pointer;padding:0}.badge{background-color:#7a869a;border-radius:10px;color:#fff;display:inline-block;font-size:12px;font-weight:700;line-height:1;min-width:10px;padding:3px 7px;text-align:center;vertical-align:middle;white-space:nowrap}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{padding:1px 5px;top:0}a.badge:focus,a.badge:hover{color:#fff;cursor:pointer;text-decoration:none}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{background-color:#fff;color:#0065ff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.modal,.modal-open{overflow:hidden}.modal{-webkit-overflow-scrolling:touch;bottom:0;display:none;left:0;outline:0;position:fixed;right:0;top:0;z-index:1050}.modal.fade .modal-dialog{-webkit-transform:translateY(-25%);-ms-transform:translateY(-25%);-o-transform:translateY(-25%);transform:translateY(-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0);-ms-transform:translate(0);-o-transform:translate(0);transform:translate(0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{margin:10px;position:relative;width:auto}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0;position:relative}.modal-backdrop{background-color:#091e42;bottom:0;left:0;position:fixed;right:0;top:0;z-index:1040}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{border-bottom:1px solid #ced0da;padding:15px}.modal-header .close{margin-top:-2px}.modal-title{line-height:1.42857143;margin:0}.modal-body{padding:15px;position:relative}.modal-footer{border-top:1px solid #ced0da;padding:15px;text-align:right}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media (min-width:768px){.modal-dialog{margin:30px auto;width:600px}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.agreement-footer:after,.agreement-footer:before,.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{content:" ";display:table}.agreement-footer:after,.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.pager:after,.panel-body: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}.invisible{visibility:hidden}.text-hide{background-color:transparent;border:0;color:transparent;font:0/0 a;text-shadow:none}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.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}@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}}@media screen and (min-width:992px){.md-margin-top-no{margin-top:0!important}}@media screen and (min-width:768px) and (max-width:991px){.sm-margin-top{margin-top:20px!important}.sm-margin-top-no{margin-top:0!important}.sm-margin-top-half{margin-top:6.6px!important}.sm-align-row-buttons{margin-top:5px!important}}@media screen and (max-width:767px){.xs-margin-top{margin-top:20px!important}.xs-margin-top-half{margin-top:6.6px!important}}.flex-row{display:block;margin:0 -15px}.flex-row-section{align-items:center;display:flex;flex:1}.flex-row-section+.flex-row-section{margin-top:20px}.flex-row-col{flex:1;padding:0 15px}@media screen and (min-width:768px){.flex-row{align-items:center;display:flex}.flex-row-section+.flex-row-section{margin:0}.flex-row-col,.flex-row-section{align-items:center;flex:0}.flex-row-section.flex-row-section-auto,.flex-row-section.flex-row-section-auto>.flex-row-col{flex:1}}.flex-row-col-shrink{flex:0!important}.d-none{display:none!important}@media screen and (max-width:767px){.w-100-xs{width:100%}.flex-order-first-xs{order:-9999}.flex-order-last-xs{order:9999}}.atwho-view ul li img{border-radius:3px;height:20px;margin-right:4.66666667px;width:20px}.auth-message{background-color:#ebecf0;left:0;padding:20px 0;position:fixed;top:-100%;transition:top .3s ease;width:100%;z-index:1070}.auth-message.show{bottom:auto;top:0}.auth-message p{color:#172b4d;padding:5px 0}@media screen and (max-width:991px){.auth-message{text-align:center}.auth-message .btn{font-size:18px;padding:10px 16px}}@keyframes misago-ajax-loader{0%{width:0}3%{width:50%}50%{width:75%}to{width:100%}}#misago-ajax-loader{position:fixed;width:100%;z-index:1080}#misago-ajax-loader div{background-color:#2563eb}#misago-ajax-loader.busy div{animation-duration:600s;animation-name:misago-ajax-loader;height:4px;width:0}#misago-ajax-loader.complete div{height:4px;opacity:0;transition:width 1s;transition:opacity 1s;width:100}.alert{font-size:18px;margin-bottom:0;text-align:center}#misago-snackbars:empty{display:none}#misago-snackbars{display:flex;justify-content:center;padding:0 24px;position:fixed;top:80px;width:100%;z-index:10000}.snackbar{background-color:#111;border-radius:4px;color:#fff;font-size:14px;opacity:0;padding:6px 12px;position:relative;top:-12px}@media screen and (min-width:720px){.snackbar{border-radius:4px;font-size:18px;padding:8px 16px}}.snackbar.snackbar-success{background-color:#16a34a;color:#fff}.snackbar.snackbar-warning{background-color:#fef08a;color:#000}.snackbar.snackbar-danger{background-color:#dc2626;color:#fff}.snackbar.in{opacity:1;top:0;transition:.3s ease}.snackbar.out{opacity:0;transition:.3s ease}.alerts-snackbar{font-size:18px;pointer-events:none;position:fixed;text-align:center;top:-100%;transition:top .3s ease;width:100%;z-index:1060}.alerts-snackbar.in{top:0;transition:top .2s ease}.alerts-snackbar p{border-radius:0 0 4px 4px;display:inline-block;margin:0;pointer-events:all}.agreement-overlay{background-color:rgba(9,30,66,.5);height:100%;left:0;overflow-x:scroll;position:fixed;top:0;width:100%;z-index:1060}.agreement-overlay .container{max-width:900px;padding:20px 30px}.agreement-content{background-clip:padding-box;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0;padding:10px 16px}.agreement-header{border-bottom:1px solid #ebecf0;padding:10px 0}.agreement-header h2{margin-top:0}.agreement-header p{margin:0;padding:0}.agreement-body{padding:20px 0}.agreement-body p.lead{margin:0;padding:0}.agreement-footer{border-top:1px solid #ced0da;padding:10px 0;text-align:right}.agreement-footer .btn+.btn{margin-bottom:0;margin-left:5px}.agreement-footer .btn-group .btn+.btn{margin-left:-1px}.agreement-footer .btn-block+.btn-block{margin-left:0}body.agreement-overlay-visible{overflow:hidden}.loader{height:49px;text-align:center;width:100%}.loader.loader-spaced{margin:40px 0}.loader-spinning-wheel{animation:cssload-spin 575ms linear infinite;-o-animation:cssload-spin 575ms linear infinite;-ms-animation:cssload-spin 575ms linear infinite;-webkit-animation:cssload-spin 575ms linear infinite;-moz-animation:cssload-spin 575ms linear infinite;border-color:#7a869a transparent;border-radius:50%;border-style:solid;border-width:3px;height:49px;margin:0 auto;width:49px}@keyframes cssload-spin{to{transform:rotate(1turn)}}@-o-keyframes cssload-spin{to{-o-transform:rotate(1turn);transform:rotate(1turn)}}@-ms-keyframes cssload-spin{to{-ms-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes cssload-spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-moz-keyframes cssload-spin{to{-moz-transform:rotate(1turn);transform:rotate(1turn)}}.navbar{background-color:#fff;border-bottom:1px solid #e5e7eb;color:#111827;height:60px;position:sticky;top:0;z-index:1030}.navbar-container,.navbar-right{align-items:center;display:flex;height:100%}.navbar-right{margin-left:auto}.navbar-branding{align-items:center;display:flex;margin-right:24px}.navbar-branding-text,.navbar-branding-text:active,.navbar-branding-text:focus,.navbar-branding-text:hover,.navbar-branding-text:link,.navbar-branding-text:visited{color:#374151;font-size:22px;text-decoration:none}.navbar-branding-logo img{height:40px}.navbar-branding-logo-xs{margin-right:12px}.navbar-branding-logo-xs img{height:34px;width:34px}.navbar-extra-menu{display:block;font-size:18px;margin:0;padding:0}.navbar-extra-menu>li,.navbar-extra-menu>li>a{display:inline-block}.navbar-extra-menu a,.navbar-extra-menu a:link,.navbar-extra-menu a:visited{border-radius:4px;color:#172b4d;padding:6px 12px}.navbar-extra-menu a:active,.navbar-extra-menu a:focus,.navbar-extra-menu a:hover{color:#172b4d;text-decoration:none}.navbar-extra-menu a:active{background-color:#e5e7eb}.btn.btn-navbar-icon{align-items:center;display:flex;height:34px;justify-content:center;margin-left:12px;padding:0;position:relative;width:34px}.btn.btn-navbar-icon .material-icon{font-size:24px;line-height:24px;margin:0}.btn.btn-navbar-icon,.btn.btn-navbar-icon:focus,.btn.btn-navbar-icon:hover,.btn.btn-navbar-icon:link,.btn.btn-navbar-icon:visited{background-color:transparent;border-color:transparent;box-shadow:none;color:#374151}.btn.btn-navbar-icon.active,.btn.btn-navbar-icon:active{background-color:#e5e7eb;border-color:#e5e7eb;box-shadow:none;color:#172b4d}.btn-navbar-image{display:inline-block;margin-left:12px;padding:0}.btn-navbar-image img{border-radius:3px;height:34px;width:34px}.navbar-item-badge{background-color:#dc2626;border-radius:4px;color:#fff;font-size:12px;padding:0 5px;position:absolute;right:-3px;top:-3px;z-index:2}.btn-navbar-register,.btn-navbar-sign-in{margin-left:12px}@media screen and (max-width:767px){#navbar-notifications-dropdown,#navbar-private-threads,#navbar-search-dropdown,#navbar-site-nav-dropdown,#navbar-user-nav-dropdown,.btn-navbar-register,.btn-navbar-sign-in,.navbar-extra-menu{display:none}}@media screen and (max-width:420px){#navbar-private-threads{display:none}}@media screen and (min-width:768px){#navbar-notifications-overlay,#navbar-search-overlay,#navbar-site-nav-overlay,#navbar-user-nav-overlay{display:none}}.nav-side>a>.material-icon{bottom:1px;font-size:24px;height:24px;line-height:24px;margin:-5px 10px -5px -5px;position:relative;width:24px}.nav-side>a .badge{position:relative;top:1px}.nav-pills>li>a{align-items:center;display:flex;padding:5px 10px}.nav-pills>li>a .material-icon{margin-right:3px}.nav-pills>li>a,.nav-pills>li>a:link,.nav-pills>li>a:visited{background-color:#ebecf0;color:#344563}.nav-pills>li>a:active,.nav-pills>li>a:focus,.nav-pills>li>a:hover{background-color:#dcdee5;color:#344563}.nav-pills>li.active>a,.nav-pills>li.active>a:active,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:link,.nav-pills>li.active>a:visited{background-color:#344563;color:#fff}.nav-container .btn-block{margin-bottom:20px}.nav-container .nav{margin-bottom:30px;margin-right:-10px}.nav-container .nav-pills,.nav-container li{margin-bottom:10px}.nav-container li{margin-right:10px}.breadcrumbs{display:block;margin-bottom:10px;padding:0}.breadcrumbs-item{display:inline-block;list-style:none;margin-bottom:10px;margin-right:15px;padding:0;white-space:nowrap}.breadcrumbs-item a{align-items:center;display:flex;flex-wrap:nowrap;text-decoration:none}.breadcrumbs-item a,.breadcrumbs-item a:visited{color:#5e6c84}.breadcrumbs-item a:focus,.breadcrumbs-item a:hover{color:#172b4d}.breadcrumbs-item a:focus .breadcrumbs-item-name,.breadcrumbs-item a:hover .breadcrumbs-item-name{text-decoration:underline}.breadcrumbs-item a:active{color:#172b4d}.breadcrumbs-item .material-icon{margin-right:4px}.toolbar-item .breadcrumbs{margin:0;white-space:nowrap;width:100%}.toolbar-item .breadcrumbs-item{margin-bottom:0}.breadcrumbs-compact{display:none}@media screen and (max-width:767px){.breadcrumbs{display:none}.breadcrumbs-compact{display:block}}@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{word-wrap:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga";direction:ltr;display:inline-block;font-family:Material Icons;font-style:normal;font-weight:400;height:1em;letter-spacing:normal;line-height:1;overflow-wrap:normal;text-align:center;text-rendering:optimizeLegibility;text-transform:none;vertical-align:middle;white-space:nowrap;width:1em}.modal-toolbar{background:#ebecf0;border-bottom:1px solid #ced0da;overflow:auto;padding:6px 12px}.modal-toolbar .pull-left{margin-right:8px}.modal-toolbar p{margin-bottom:0;padding:5px 0}@media screen and (max-width:991px){.modal-message{text-align:center}.modal-message .message-icon{margin:30px}.modal-message .message-icon .material-icon{font-size:160px}}@media screen and (min-width:992px){.modal-message .modal-body{padding-bottom:30px;padding-top:20px}.modal-message .message-icon{float:left;left:7px;position:relative}.modal-message .message-icon .material-icon{font-size:50px}.modal-message .message-body{margin-left:75px;margin-top:10px}.modal-message .message-body p{margin-top:20px}.modal-message .message-body .lead{margin-bottom:0;margin-top:0}}.modal-loader{padding:50px 0}.modal-loader .loader{height:80px;text-align:center;width:100%}.modal-loader .loader-spinning-wheel{height:80px;width:80px}.modal-body .form-group{min-height:34px}.list-item-errors{margin-bottom:20px}.list-errored-items li:last-child .list-item-errors{margin-bottom:0}.modal-post-likers .media-list{margin:0}.modal-post-likers .item-title{display:block}.has-feedback .material-icon.form-control-feedback{font-size:1.42857143;line-height:1.42857143;right:24px;top:6px}.well.well-form.well-done{font-size:18px;text-align:center}.well.well-form.well-done .message-icon{font-size:90px;line-height:90px;margin-bottom:10px}.well.well-form.well-done .message-body{margin-bottom:20px}.well.well-form.well-noscript{font-size:18px;text-align:center}.well.well-form.well-noscript .message-icon{font-size:90px;line-height:90px;margin-bottom:10px}.btn.btn-select,.btn.btn-yes-no{background:transparent;border:1px solid #ced0da}.btn.btn-select .material-icon,.btn.btn-yes-no .material-icon{bottom:1px;font-size:20px;height:20px;line-height:20px;margin:-4px 8px -4px 0;position:relative;width:20px}@media screen and (max-width:767px){.btn.btn-yes-no{overflow:auto;width:100%}.btn.btn-yes-no .material-icon{float:left;margin-top:1px}.btn.btn-yes-no .btn-text{display:block;margin-left:30px;text-align:left;white-space:normal}}input.hidden-file-upload{left:-9999px;position:absolute;top:-9999px}.form-search{position:relative}.form-search .form-control{padding-right:30px}.form-search .material-icon{color:#7a869a;font-size:24px;line-height:24px;pointer-events:none;position:absolute;right:5px;top:5px}.btn.btn-loading,.btn.btn-loading:active,.btn.btn-loading:focus,.btn.btn-loading:hover,.btn.btn-loading:link,.btn.btn-loading:visited{color:transparent}.btn.btn-loading .loader,.btn.btn-loading:active .loader,.btn.btn-loading:focus .loader,.btn.btn-loading:hover .loader,.btn.btn-loading:link .loader,.btn.btn-loading:visited .loader{height:20px;margin-top:-20px}.btn.btn-loading .loader>div,.btn.btn-loading:active .loader>div,.btn.btn-loading:focus .loader>div,.btn.btn-loading:hover .loader>div,.btn.btn-loading:link .loader>div,.btn.btn-loading:visited .loader>div{height:20px;width:20px}.btn.btn-loading.btn-default .loader>div{border-bottom-color:#172b4d;border-top-color:#172b4d}.btn.btn-loading.btn-danger .loader>div,.btn.btn-loading.btn-info .loader>div,.btn.btn-loading.btn-primary .loader>div,.btn.btn-loading.btn-success .loader>div,.btn.btn-loading.btn-warning .loader>div{border-bottom-color:#fff;border-top-color:#fff}.btn .material-icon{bottom:1px;margin-right:3px;position:relative}.btn-icon .material-icon{font-size:20px;height:20px;line-height:20px;margin:-1px -4px;width:20px}.btn-icon .btn-text{margin-left:10px}.btn-icon .btn-text-left{margin-right:10px}.btn-block.btn-icon{padding-left:0;padding-right:0}.btn-icons-family .material-icon+.material-icon{margin-left:10px}.btn-sign-in{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-sign-in.focus,.btn-sign-in:focus{background-color:#134cca;border-color:#0c3284;color:#fff}.btn-sign-in:hover{background-color:#134cca;border-color:#1249c1;color:#fff}.btn-sign-in.active,.btn-sign-in:active,.open>.dropdown-toggle.btn-sign-in{background-color:#134cca;background-image:none;border-color:#1249c1;color:#fff}.btn-sign-in.active.focus,.btn-sign-in.active:focus,.btn-sign-in.active:hover,.btn-sign-in:active.focus,.btn-sign-in:active:focus,.btn-sign-in:active:hover,.open>.dropdown-toggle.btn-sign-in.focus,.open>.dropdown-toggle.btn-sign-in:focus,.open>.dropdown-toggle.btn-sign-in:hover{background-color:#1040aa;border-color:#0c3284;color:#fff}.btn-sign-in.disabled.focus,.btn-sign-in.disabled:focus,.btn-sign-in.disabled:hover,.btn-sign-in[disabled].focus,.btn-sign-in[disabled]:focus,.btn-sign-in[disabled]:hover,fieldset[disabled] .btn-sign-in.focus,fieldset[disabled] .btn-sign-in:focus,fieldset[disabled] .btn-sign-in:hover{background-color:#2563eb;border-color:#2563eb}.btn-sign-in .badge{background-color:#fff;color:#2563eb}.btn-register{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-register.focus,.btn-register:focus{background-color:#134cca;border-color:#0c3284;color:#fff}.btn-register:hover{background-color:#134cca;border-color:#1249c1;color:#fff}.btn-register.active,.btn-register:active,.open>.dropdown-toggle.btn-register{background-color:#134cca;background-image:none;border-color:#1249c1;color:#fff}.btn-register.active.focus,.btn-register.active:focus,.btn-register.active:hover,.btn-register:active.focus,.btn-register:active:focus,.btn-register:active:hover,.open>.dropdown-toggle.btn-register.focus,.open>.dropdown-toggle.btn-register:focus,.open>.dropdown-toggle.btn-register:hover{background-color:#1040aa;border-color:#0c3284;color:#fff}.btn-register.disabled.focus,.btn-register.disabled:focus,.btn-register.disabled:hover,.btn-register[disabled].focus,.btn-register[disabled]:focus,.btn-register[disabled]:hover,fieldset[disabled] .btn-register.focus,fieldset[disabled] .btn-register:focus,fieldset[disabled] .btn-register:hover{background-color:#2563eb;border-color:#2563eb}.btn-register .badge{background-color:#fff;color:#2563eb}.btn-muted{border-radius:0;color:#7a869a}.btn-muted,.btn-muted.active,.btn-muted:active,.btn-muted[disabled],fieldset[disabled] .btn-muted{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-muted,.btn-muted:active,.btn-muted:focus,.btn-muted:hover{border-color:transparent}.btn-muted:focus,.btn-muted:hover{background-color:transparent;color:#172b4d}.btn-muted[disabled]:focus,.btn-muted[disabled]:hover,fieldset[disabled] .btn-muted:focus,fieldset[disabled] .btn-muted:hover{color:#7a869a;text-decoration:none}.btn-moderation{background-color:#111;border-color:#111;color:#fff}.btn-moderation.focus,.btn-moderation:focus,.btn-moderation:hover{background-color:#000;border-color:#000;color:#fff}.btn-moderation.active,.btn-moderation:active,.open>.dropdown-toggle.btn-moderation{background-color:#000;background-image:none;border-color:#000;color:#fff}.btn-moderation.active.focus,.btn-moderation.active:focus,.btn-moderation.active:hover,.btn-moderation:active.focus,.btn-moderation:active:focus,.btn-moderation:active:hover,.open>.dropdown-toggle.btn-moderation.focus,.open>.dropdown-toggle.btn-moderation:focus,.open>.dropdown-toggle.btn-moderation:hover{background-color:#000;border-color:#000;color:#fff}.btn-moderation.disabled.focus,.btn-moderation.disabled:focus,.btn-moderation.disabled:hover,.btn-moderation[disabled].focus,.btn-moderation[disabled]:focus,.btn-moderation[disabled]:hover,fieldset[disabled] .btn-moderation.focus,fieldset[disabled] .btn-moderation:focus,fieldset[disabled] .btn-moderation:hover{background-color:#111;border-color:#111}.btn-moderation .badge{background-color:#fff;color:#111}.btn-social-github{background-color:#333;border-color:#333;color:#fff}.btn-social-github.focus,.btn-social-github:focus{background-color:#1a1a1a;border-color:#000;color:#fff}.btn-social-github:hover{background-color:#1a1a1a;border-color:#141414;color:#fff}.btn-social-github.active,.btn-social-github:active,.open>.dropdown-toggle.btn-social-github{background-color:#1a1a1a;background-image:none;border-color:#141414;color:#fff}.btn-social-github.active.focus,.btn-social-github.active:focus,.btn-social-github.active:hover,.btn-social-github:active.focus,.btn-social-github:active:focus,.btn-social-github:active:hover,.open>.dropdown-toggle.btn-social-github.focus,.open>.dropdown-toggle.btn-social-github:focus,.open>.dropdown-toggle.btn-social-github:hover{background-color:#080808;border-color:#000;color:#fff}.btn-social-github.disabled.focus,.btn-social-github.disabled:focus,.btn-social-github.disabled:hover,.btn-social-github[disabled].focus,.btn-social-github[disabled]:focus,.btn-social-github[disabled]:hover,fieldset[disabled] .btn-social-github.focus,fieldset[disabled] .btn-social-github:focus,fieldset[disabled] .btn-social-github:hover{background-color:#333;border-color:#333}.btn-social-github .badge{background-color:#fff;color:#333}.btn-social-facebook{background-color:#4267b2;border-color:#4267b2;color:#fff}.btn-social-facebook.focus,.btn-social-facebook:focus{background-color:#34518d;border-color:#203155;color:#fff}.btn-social-facebook:hover{background-color:#34518d;border-color:#314d85;color:#fff}.btn-social-facebook.active,.btn-social-facebook:active,.open>.dropdown-toggle.btn-social-facebook{background-color:#34518d;background-image:none;border-color:#314d85;color:#fff}.btn-social-facebook.active.focus,.btn-social-facebook.active:focus,.btn-social-facebook.active:hover,.btn-social-facebook:active.focus,.btn-social-facebook:active:focus,.btn-social-facebook:active:hover,.open>.dropdown-toggle.btn-social-facebook.focus,.open>.dropdown-toggle.btn-social-facebook:focus,.open>.dropdown-toggle.btn-social-facebook:hover{background-color:#2b4273;border-color:#203155;color:#fff}.btn-social-facebook.disabled.focus,.btn-social-facebook.disabled:focus,.btn-social-facebook.disabled:hover,.btn-social-facebook[disabled].focus,.btn-social-facebook[disabled]:focus,.btn-social-facebook[disabled]:hover,fieldset[disabled] .btn-social-facebook.focus,fieldset[disabled] .btn-social-facebook:focus,fieldset[disabled] .btn-social-facebook:hover{background-color:#4267b2;border-color:#4267b2}.btn-social-facebook .badge{background-color:#fff;color:#4267b2}.btn-social-google-oauth2{background-color:#db4437;border-color:#db4437;color:#fff}.btn-social-google-oauth2.focus,.btn-social-google-oauth2:focus{background-color:#bd2e22;border-color:#7c1e16;color:#fff}.btn-social-google-oauth2:hover{background-color:#bd2e22;border-color:#b42c20;color:#fff}.btn-social-google-oauth2.active,.btn-social-google-oauth2:active,.open>.dropdown-toggle.btn-social-google-oauth2{background-color:#bd2e22;background-image:none;border-color:#b42c20;color:#fff}.btn-social-google-oauth2.active.focus,.btn-social-google-oauth2.active:focus,.btn-social-google-oauth2.active:hover,.btn-social-google-oauth2:active.focus,.btn-social-google-oauth2:active:focus,.btn-social-google-oauth2:active:hover,.open>.dropdown-toggle.btn-social-google-oauth2.focus,.open>.dropdown-toggle.btn-social-google-oauth2:focus,.open>.dropdown-toggle.btn-social-google-oauth2:hover{background-color:#9f271d;border-color:#7c1e16;color:#fff}.btn-social-google-oauth2.disabled.focus,.btn-social-google-oauth2.disabled:focus,.btn-social-google-oauth2.disabled:hover,.btn-social-google-oauth2[disabled].focus,.btn-social-google-oauth2[disabled]:focus,.btn-social-google-oauth2[disabled]:hover,fieldset[disabled] .btn-social-google-oauth2.focus,fieldset[disabled] .btn-social-google-oauth2:focus,fieldset[disabled] .btn-social-google-oauth2:hover{background-color:#db4437;border-color:#db4437}.btn-social-google-oauth2 .badge{background-color:#fff;color:#db4437}.btn-social-discord{background-color:#5865f2;border-color:#5865f2;color:#fff}.btn-social-discord.focus,.btn-social-discord:focus{background-color:#2939ee;border-color:#0f1dbc;color:#fff}.btn-social-discord:hover{background-color:#2939ee;border-color:#1f31ee;color:#fff}.btn-social-discord.active,.btn-social-discord:active,.open>.dropdown-toggle.btn-social-discord{background-color:#2939ee;background-image:none;border-color:#1f31ee;color:#fff}.btn-social-discord.active.focus,.btn-social-discord.active:focus,.btn-social-discord.active:hover,.btn-social-discord:active.focus,.btn-social-discord:active:focus,.btn-social-discord:active:hover,.open>.dropdown-toggle.btn-social-discord.focus,.open>.dropdown-toggle.btn-social-discord:focus,.open>.dropdown-toggle.btn-social-discord:hover{background-color:#1223e2;border-color:#0f1dbc;color:#fff}.btn-social-discord.disabled.focus,.btn-social-discord.disabled:focus,.btn-social-discord.disabled:hover,.btn-social-discord[disabled].focus,.btn-social-discord[disabled]:focus,.btn-social-discord[disabled]:hover,fieldset[disabled] .btn-social-discord.focus,fieldset[disabled] .btn-social-discord:focus,fieldset[disabled] .btn-social-discord:hover{background-color:#5865f2;border-color:#5865f2}.btn-social-discord .badge{background-color:#fff;color:#5865f2}.btn-social-twitter,.btn-social-twitter.focus,.btn-social-twitter:focus,.btn-social-twitter:hover{background-color:#000;border-color:#000;color:#fff}.btn-social-twitter.active,.btn-social-twitter:active,.open>.dropdown-toggle.btn-social-twitter{background-color:#000;background-image:none;border-color:#000;color:#fff}.btn-social-twitter.active.focus,.btn-social-twitter.active:focus,.btn-social-twitter.active:hover,.btn-social-twitter:active.focus,.btn-social-twitter:active:focus,.btn-social-twitter:active:hover,.open>.dropdown-toggle.btn-social-twitter.focus,.open>.dropdown-toggle.btn-social-twitter:focus,.open>.dropdown-toggle.btn-social-twitter:hover{background-color:#000;border-color:#000;color:#fff}.btn-social-twitter.disabled.focus,.btn-social-twitter.disabled:focus,.btn-social-twitter.disabled:hover,.btn-social-twitter[disabled].focus,.btn-social-twitter[disabled]:focus,.btn-social-twitter[disabled]:hover,fieldset[disabled] .btn-social-twitter.focus,fieldset[disabled] .btn-social-twitter:focus,fieldset[disabled] .btn-social-twitter:hover{background-color:#000;border-color:#000}.btn-social-twitter .badge{background-color:#fff;color:#000}.dropdown-header{color:#172b4d;font-size:18px}.dropdown-subheader{color:#172b4d;font-size:14px;font-weight:700;padding:6px 20px;width:100%}.dropdown-pills{border-bottom:1px solid #ebecf0;display:flex;padding:6px 10px}.dropdown-pills .btn{display:block;margin:0 10px;width:100%}.dropdown-menu-list{list-style:none;margin:0;padding:0}.dropdown-link>a,.dropdown-menu-item>.btn-link,.dropdown-menu-item>a,.dropdown-menu>li>.btn-link,.dropdown-menu>li>a,.modal-menu>li>.btn-link,.modal-menu>li>a{border:none;clear:both;color:#172b4d;display:block;float:none;font-weight:400;line-height:1.42857143;padding:6px 20px;text-align:left;white-space:nowrap;width:100%}.dropdown-link>a:active,.dropdown-link>a:focus,.dropdown-link>a:hover,.dropdown-menu-item>.btn-link:active,.dropdown-menu-item>.btn-link:focus,.dropdown-menu-item>.btn-link:hover,.dropdown-menu-item>a:active,.dropdown-menu-item>a:focus,.dropdown-menu-item>a:hover,.dropdown-menu>li>.btn-link:active,.dropdown-menu>li>.btn-link:focus,.dropdown-menu>li>.btn-link:hover,.dropdown-menu>li>a:active,.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover,.modal-menu>li>.btn-link:active,.modal-menu>li>.btn-link:focus,.modal-menu>li>.btn-link:hover,.modal-menu>li>a:active,.modal-menu>li>a:focus,.modal-menu>li>a:hover{background-color:#ebecf0;color:#172b4d;text-decoration:none}.dropdown-link>a:disabled,.dropdown-menu-item>.btn-link:disabled,.dropdown-menu-item>a:disabled,.dropdown-menu>li>.btn-link:disabled,.dropdown-menu>li>a:disabled,.modal-menu>li>.btn-link:disabled,.modal-menu>li>a:disabled{color:rgba(23,43,77,.5)}.dropdown-link>a .material-icon,.dropdown-menu-item>.btn-link .material-icon,.dropdown-menu-item>a .material-icon,.dropdown-menu>li>.btn-link .material-icon,.dropdown-menu>li>a .material-icon,.modal-menu>li>.btn-link .material-icon,.modal-menu>li>a .material-icon{bottom:1px;font-size:18px;margin:-2px 7px -2px 0;position:relative}.dropdown-link>a .badge,.dropdown-menu-item>.btn-link .badge,.dropdown-menu-item>a .badge,.dropdown-menu>li>.btn-link .badge,.dropdown-menu>li>a .badge,.modal-menu>li>.btn-link .badge,.modal-menu>li>a .badge{background-color:#dc2626;border-radius:4px;color:#fff;float:right;position:relative;top:1px}.dropdown-menu>li .dropdown-category .material-icon{color:#7a869a;font-size:12px;line-height:12px;margin-right:3px}.dropdown-menu>li .dropdown-category-color .material-icon{color:var(--color)}.dropdown-menu>li .dropdown-subcategory{padding-left:40px}.modal-menu{margin:20px 0;padding:0}.modal-menu>li{list-style:none;margin:6.66666667px 0;padding:0}.dropdown-menu{min-width:210px}.dropdown-footer{border-top:1px solid #ebecf0;margin-bottom:-5px;padding:6px 20px}.dropdown-menu-item+.dropdown-footer{margin-top:9px}.dropdown-menu .dropdown-buttons{padding:2px 20px 7px}.dropdown-menu .dropdown-buttons .btn{margin:4px 0}@media screen and (min-width:992px){.category-picker .dropdown-menu{width:300px}}.category-picker .dropdown-menu>li>.btn-link{overflow-wrap:break-word;white-space:normal}@media screen and (max-width:767px){.dropdown-menu.stick-to-bottom{border:none;border-radius:0;bottom:0;-webkit-box-shadow:0 0 30px #7a869a;box-shadow:0 0 30px #7a869a;clear:both;margin:0;max-height:400px;overflow-y:auto;padding:0 0 20px;position:fixed;top:auto;width:100%}.dropdown-menu.stick-to-bottom li{clear:both;float:none;margin:0}.dropdown-menu.stick-to-bottom li>.btn,.dropdown-menu.stick-to-bottom li>a{border-bottom:1px solid #ebecf0;padding-bottom:15px;padding-top:15px}}.noscript-collapsible>input{display:none}.noscript-collapsible .btn{display:block;width:100%}.noscript-collapsible-items{display:none}input:checked+.noscript-collapsible-items{display:block}.noscript-collapsible-items .btn{margin-top:10px}.overlay{background-color:#fff;display:none}body.has-overlay{overflow:hidden;position:fixed}.overlay-open{display:flex;flex-direction:column;height:100%;left:0;position:fixed;top:0;width:100%;z-index:1035}.overlay-header{align-items:center;display:flex;padding:12px;width:100%}.overlay-header-caption{color:#172b4d;font-size:18px;margin-right:12px}.btn-overlay-close{align-items:center;display:flex;height:32px;justify-content:center;margin-left:auto;padding:0;width:32px}.btn-overlay-close .material-icon{font-size:24px;line-height:24px;margin:0}.btn-overlay-close,.btn-overlay-close:focus,.btn-overlay-close:hover{background-color:transparent;border-color:transparent;color:#172b4d}.btn-overlay-close:active{background-color:#ebecf0;border-color:#ebecf0;box-shadow:none;color:#172b4d}.overlay .dropdown-pills{padding:0 12px 12px}.overlay .dropdown-pills .btn:first-child{margin-left:0}.overlay .dropdown-pills .btn:last-child{margin-right:0}.overlay .dropdown-footer{margin:0}.overlay-menu-list{list-style:none;margin:0;padding:0}.overlay-menu-list .dropdown-header,.overlay-menu-list .dropdown-menu-item>a,.overlay-menu-list .dropdown-menu-item>button,.overlay-menu-list .dropdown-subheader{padding:6px 12px}.overlay-menu-list .divider{background-color:#ebecf0;height:1px;margin:9px 0;overflow:hidden}.dropdown-menu .list-group,.overlay .list-group{margin:0}.dropdown-menu .list-group,.dropdown-menu .list-group-item,.overlay .list-group,.overlay .list-group-item{border-left:0;border-radius:0;border-right:0}.dropdown-menu .list-group-item:first-child,.overlay .list-group-item:first-child{border-top:none}.dropdown-menu .list-group-item:last-child,.overlay .list-group-item:last-child{border-bottom:none}.dropdown-menu .list-group-item{padding:10px 20px}.list-group-loading{padding:40px 20px}.list-group-loading-message{font-size:18px;text-align:center}.list-group-loading-progress{background-color:#ebecf0;border-radius:3px;margin:auto;max-width:300px;overflow:hidden}.list-group-loading-progress-bar{animation:infiniteProgress 1s linear infinite;background-color:#7a869a;height:8px;transform-origin:0 50%;width:100%}@keyframes infiniteProgress{0%{transform:translateX(0) scaleX(0)}40%{transform:translateX(0) scaleX(.4)}to{transform:translateX(100%) scaleX(.5)}}.dropdown-menu .list-group-loading,.overlay .list-group-lading{padding:20px 40px}.list-group-empty,.list-group-error,.list-group-message{color:#172b4d;padding:20px}.list-group-empty-icon,.list-group-error-icon,.list-group-message-icon{color:#7a869a;font-size:64px;line-height:64px;margin-bottom:20px;text-align:center}.list-group-empty-message,.list-group-error-message,.list-group-message-message{font-size:18px;margin:0;text-align:center}.list-group-error-detail,.list-group-message-detail{color:#5e6c84;font-size:18px;margin-top:10px;text-align:center}.category-label{border-radius:.25em;padding:.2em .6em .3em}.category-label-color,.category-label-color:active,.category-label-color:focus,.category-label-color:hover,.category-label-color:link,.category-label-color:visited{color:#fff}.category-label-no-color,.category-label-no-color:active,.category-label-no-color:focus,.category-label-no-color:hover,.category-label-no-color:link,.category-label-no-color:visited{background-color:#ebecf0;color:#344563}.thread-flags{margin:0;opacity:.8;padding:0}.thread-flags,.thread-flags li{align-items:center;display:flex}.thread-flags li{border-radius:3px;cursor:default;height:20px;justify-content:center;list-style-type:none;width:20px}.thread-flags li+li{margin-left:7.5px}.thread-flags .material-icon{font-size:16px;line-height:16px}.thread-flag-pinned-globally{background:#dbeafe;color:#2563eb}.thread-flag-pinned-locally{background:#dbeafe;color:#3b82f6}.thread-flag-pinned-locally-elsewhere{background:#e2e8f0;color:#64748b}.thread-flag-answered{background:#d9f99d;color:#4d7c0f}.thread-flag-poll{background:#f5d0fe;color:#c026d3}.thread-flag-unapproved{background:#ef4444;color:#fff}.thread-flag-closed{background:#fecaca;color:#dc2626}.thread-flag-hidden{background:#64748b;color:#fff}.threads-replies{align-items:center;color:#5e6c84;display:flex;font-size:16px;font-weight:700}.threads-replies .material-icon{font-size:16px;margin-right:7.5px;transform:matrix(-1,0,0,1,0,0)}@media screen and (max-width:767px){.threads-replies{font-size:13px}.threads-replies .material-icon{font-size:12px;margin-right:4px}}.thread-user-card{align-items:center;display:flex}.thread-user-card-media{flex:0;margin-right:15px}.thread-user-card-media img{border-radius:3px}.thread-user-card-body{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.thread-paginator{align-items:center;display:flex}.thread-paginator .btn+.btn{margin-left:6px}.thread-paginator .dropdown{margin:0 6px}.thread-paginator .dropdown-menu{min-width:150px;padding:4px}.thread-paginator .form-control{font-size:16px;margin-right:6px}.thread-paginator-form{display:flex}@media screen and (max-width:767px){.toolbar-item .thread-paginator{width:100%}.toolbar-item .thread-paginator .dropdown{min-width:0;width:100%}.toolbar-item .thread-paginator .btn-block{min-width:0;overflow:hidden;padding-left:0;padding-right:0;text-align:center;text-overflow:ellipsis;white-space:nowrap}}.search-dropdown{overflow:hidden;padding:0;width:450px}.search-dropdown .search-input{border-bottom:1px solid #ebecf0;padding:6px 20px}.search-dropdown .list-group{max-height:calc(100vh - 126px);overflow-y:auto}.search-overlay-body{display:flex;flex:1;flex-direction:column}.search-overlay-body .search-input{border-bottom:1px solid #ebecf0;padding:6px 12px}.search-dropdown .form-control-search,.search-overlay-body .form-control-search{font-size:16px}.search-overlay-body .search-results-container{flex:1;overflow-y:auto;position:relative;width:100%}.search-overlay-body .search-results-list{min-height:100%;position:absolute;width:100%}.search-result a{align-items:center;display:flex;width:100%}.search-result a:hover{cursor:pointer;text-decoration:none}.search-result a img{border-radius:3px;margin-right:12px}.search-result-card{width:100%}.search-result-name{color:#172b4d;font-weight:700;overflow-wrap:anywhere}.search-result-summary{color:#7a869a;font-size:12px;max-height:72px;overflow:hidden;overflow-wrap:anywhere}.search-result-details{color:#7a869a;font-size:12px;margin:0;padding:0}.search-result-details li{display:inline-block;list-style:none;margin-right:12px}.page-header{margin:10px 0 0}.page-header-banner-bg-overlay{padding:20px 0}.page-header h1{margin:0;overflow-wrap:anywhere}.page-container{padding-top:20px}@media screen and (max-width:991px){.panel-message-body{text-align:center}.panel-message-body .message-icon{margin:30px}.panel-message-body .message-icon .material-icon{font-size:160px}}@media screen and (min-width:992px){.panel-message-body{padding:20px 20px 30px}.panel-message-body .message-icon{float:left}.panel-message-body .message-icon .material-icon{font-size:50px}.panel-message-body .message-body{margin-left:65px;margin-top:10px}.panel-message-body .message-body .lead{margin-bottom:0}.panel-message-body .message-body .help-block{margin-top:13.2px}}.panel-body-loading{padding:0;text-align:center}.panel-footer-sticky{bottom:0;position:sticky}.misago-footer{margin-bottom:50px;margin-top:30px}.misago-footer .footer-content{padding-top:30px}.misago-footer .noscript-message .material-icon{bottom:1px;font-size:18px;position:relative}@keyframes fixed-moderation-fade-in{0%{opacity:0}to{opacity:1}}.fixed-moderation{bottom:20px;display:none;opacity:0;pointer-events:none;position:fixed;width:100%}.fixed-moderation.visible{animation-duration:.3s;animation-name:fixed-moderation-fade-in;display:block;opacity:1}.fixed-moderation .container{display:flex;flex-direction:row;justify-content:end;pointer-events:none}.fixed-moderation .dropup{pointer-events:all}@media screen and (max-width:767px){.fixed-moderation .container{display:block}.fixed-moderation .dropdown-menu{width:100%}.btn-moderation{display:block;width:100%}}.ui-preview{-webkit-animation:ui-preview-animation 1s linear infinite;-o-animation:ui-preview-animation 1s linear infinite;animation:ui-preview-animation 1s linear infinite;color:#ebecf0}@keyframes ui-preview-animation{0%{filter:alpha(opacity=100);opacity:1}50%{filter:alpha(opacity=10);opacity:.1}to{filter:alpha(opacity=100);opacity:1}}.ui-preview-text{background:#ebecf0;border-radius:100px;display:inline-block;height:14px;position:relative;top:3px}.ui-preview-paragraph .ui-preview-text{margin-right:6px}.ui-preview-paragraph .ui-preview-text:last-child{margin-right:0}.ui-preview-img{background:#ebecf0;border-radius:5px}.ui-preview input:disabled,.ui-preview textarea:disabled{background-color:#fff}.pager-undercontent{margin-top:-20px}.pager-more{text-align:center}@media screen and (min-width:992px){.pager-more .btn{padding-left:20px;padding-right:20px}}.misago-pagination{display:flex}.misago-pagination .btn{display:block;width:100%}.misago-pagination .btn+.btn{margin-left:15px}@media screen and (max-width:767px){.toolbar-item .misago-pagination{width:100%}}.panel-poll h2{margin-top:0}.poll-select-choice .btn,.poll-select-choice .btn:active,.poll-select-choice .btn:focus,.poll-select-choice .btn:hover{background:transparent;border:transparent;-webkit-box-shadow:none;box-shadow:none;margin:6px 0;outline:none;padding:0 0 0 6px;text-align:left}.poll-select-choice .btn .material-icon{line-heigh:28px;color:#ced0da;font-size:28px;height:28px;margin-right:6px;width:28px}.poll-select-choice .btn.btn-selected .material-icon{color:#2563eb}.poll-help{font-size:12px}.poll-chart-selected .material-icon{line-heigh:14px;bottom:1px;color:#36b37e;font-size:14px;height:14px;margin-right:4px;position:relative;width:14px}.poll-options{margin-bottom:0}@media screen and (max-width:767px){.poll-options{margin-top:-6px}.poll-options .btn{margin:6px 0}}.user-status.user-banned .status-icon{color:#ff5630}.user-status.user-online .status-icon{color:#36b37e}.user-status.user-offline .status-icon{color:#7a869a}@media screen and (min-width:768px){.user-card{text-align:center}}.user-card-small-avatar img{height:auto;width:100%}@media screen and (min-width:768px){.user-card-small-avatar{display:none}}@media screen and (max-width:767px){.user-card-avatar{display:none}}.toolbar{display:block;margin:0 -8px}.toolbar-over-footer{margin-bottom:-50px}.toolbar-section{display:flex;flex:1;justify-items:center;margin-bottom:20px}.toolbar-item{flex:1;padding:0 7px}.toolbar-item h3,.toolbar-item p{margin:0}.toolbar-item-shrink{flex:0!important;min-width:auto}.toolbar-spacer{display:none}@media screen and (min-width:768px){.toolbar{display:flex}.toolbar-item,.toolbar-section{align-items:center;flex:0}.toolbar-section.toolbar-section-auto,.toolbar-section.toolbar-section-auto .toolbar-item{flex:1}.toolbar-spacer{display:block;flex:1}.toolbar-item .form-search{width:250px}}@media screen and (max-width:767px){.toolbar{display:flex;flex-direction:column}.toolbar-item{min-width:0}.toolbar-item-shrink{min-width:auto}.toolbar-item p{text-align:center}}abbr{border:none!important}.item-title{text-decoration:none}.item-title,a.item-title:active,a.item-title:hover,a.item-title:link,a.item-title:visited{color:#172b4d;font-weight:700}a.item-title:hover{text-decoration:underline}.message-line{text-align:center}.message-line .material-icon{font-size:20px;height:20px;line-height:20px;margin-right:6.66666667px;width:20px}.text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.misago-markup,.misago-markup blockquote{font-size:16px}.misago-markup h1,.misago-markup h2,.misago-markup h3,.misago-markup h4,.misago-markup h5,.misago-markup h6,.misago-markup p{overflow-wrap:anywhere}.misago-markup h1,.misago-markup h2,.misago-markup h3,.misago-markup h4,.misago-markup h5,.misago-markup h6{margin-top:40px}.misago-markup blockquote>*,.misago-markup>*{margin:20px 0}.misago-markup blockquote>:first-child,.misago-markup>:first-child{margin-top:0}.misago-markup blockquote>:last-child,.misago-markup>:last-child{margin-bottom:0}.misago-markup img{max-height:500px;max-width:100%}.misago-markup .quote-block,.misago-markup blockquote{background-color:#f0f9ff;border-left:3px solid #0ea5e9;border-radius:3px;color:#0c4a6e;overflow:hidden}.misago-markup .quote-heading{font-size:14px;font-weight:700;padding:10px 16px}.misago-markup .quote-body{border:none;border-radius:0}.misago-markup blockquote{padding:10px 16px}.misago-markup blockquote:last-child{margin-bottom:0}.misago-markup .quote-body>.quote-block,.misago-markup .quote-body>blockquote,.misago-markup blockquote>.quote-block,.misago-markup blockquote>blockquote{border:1px solid #0ea5e9;border-left-width:3px}.misago-markup .spoiler-block{background:repeating-linear-gradient(45deg,rgba(235,236,240,.5),rgba(235,236,240,.5) 10px,#fff 0,#fff 20px);border:3px solid #ebecf0;border-radius:4px;font-size:14px;position:relative}.misago-markup .spoiler-body{background:#fff;border-width:0;margin:0;padding:20px}.misago-markup .spoiler-overlay{background:#fff}.misago-markup .spoiler-block.revealed .spoiler-overlay{display:none}.misago-markup ul,.misago-markup ul li{list-style-type:square}.misago-markup ol,.misago-markup ol li{list-style-type:decimal}.misago-markup pre{background:#eee;border:none;color:#000;overflow:hidden;padding:10px}.misago-markup pre code.hljs{margin:-10px;padding:9.5px}.misago-markup-example{align-items:center;display:flex}.formatting-help{padding-bottom:0}.formatting-help-item,.formatting-help-item pre,.formatting-help>h4{margin-bottom:20px}@media screen and (min-width:992px){.formatting-help-item{align-items:center;display:flex}.formatting-help-item-markup,.formatting-help-item-preview{width:50%}.formatting-help-item-markup{padding-right:15px}.formatting-help-item-markup pre{margin:0}.formatting-help-item-preview{padding-left:15px}}.scroll-target{bottom:80px;position:relative;width:1px}.site-nav-dropdown{max-height:calc(100vh - 80px);overflow-y:auto;width:320px}.site-nav-category-header a{color:#7a869a;font-weight:700}.site-nav-category a,.site-nav-category-header a{align-items:center;display:flex;justify-content:space-between;width:100%}.site-nav-category a span,.site-nav-category-header a span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.site-nav-category+.site-nav-category-header{margin-top:10px}.site-nav-category-last{margin-bottom:10px}.site-nav-category-last+.site-nav-category-header{margin-top:0}@media screen and (min-width:768px){.site-nav-sign-in-message,.site-nav-sign-in-options{display:none}}.site-nav-menu.overlay-menu-list{height:100%;overflow-y:auto;padding-bottom:20px}.user-nav-menu{min-width:300px}.user-nav-profile strong{display:block;font-size:18px}.user-nav-dropdown{max-height:calc(100vh - 80px);overflow-y:auto}.user-nav-menu.overlay-menu-list{height:100%;overflow-y:auto;padding-bottom:20px}.modal-change-avatar .modal-avatar-index .avatar-preview{border-radius:6px;height:200px;margin:0 auto;overflow:hidden;position:relative;width:200px}.modal-change-avatar .modal-avatar-index .avatar-preview .loader{display:none;height:100px;position:absolute;top:50px}.modal-change-avatar .modal-avatar-index .avatar-preview .loader .loader-spinning-wheel{border-color:#fff transparent;border-width:10px;height:100px;width:100px}.modal-change-avatar .modal-avatar-index .avatar-preview.preview-loading img{filter:alpha(opacity=33);opacity:.33}.modal-change-avatar .modal-avatar-index .avatar-preview.preview-loading .loader{display:block}@media (max-width:699px){.modal-change-avatar .modal-avatar-index .avatar-preview{height:150px;margin-bottom:20px;width:150px}.modal-change-avatar .modal-avatar-index .avatar-preview img{height:150px;width:150px}.modal-change-avatar .modal-avatar-index .avatar-preview .loader{height:100px;top:25px}.modal-change-avatar .modal-avatar-index .avatar-preview .loader .loader-spinning-wheel{height:100px;width:100px}}.modal-change-avatar .modal-avatar-index .btn{text-align:left}.modal-change-avatar .modal-avatar-upload{text-align:center}.modal-change-avatar .modal-avatar-upload .btn-pick-file{background:transparent;border:2px solid #ebecf0;border-radius:6px;-webkit-box-shadow:none;box-shadow:none;color:#7a869a;font-size:18px;padding:10px 24px;text-align:center}.modal-change-avatar .modal-avatar-upload .btn-pick-file>.material-icon{display:block;font-size:50px;height:50px;margin:0 auto 13.2px;width:50px}.modal-change-avatar .modal-avatar-upload .btn-pick-file:active,.modal-change-avatar .modal-avatar-upload .btn-pick-file:hover{border-color:#2563eb;color:#2563eb}.modal-change-avatar .modal-avatar-upload .text-muted{margin-top:13.2px}.modal-change-avatar .modal-avatar-upload .upload-progress img{border-radius:4px;margin-bottom:20px;max-height:80px;width:auto}.modal-change-avatar .modal-avatar-upload .upload-progress .progress{margin:0 auto;width:70%}.modal-avatar-crop .crop-form{margin:0 auto}.modal-avatar-crop .crop-form .cropit-image-zoom-input{-webkit-appearance:none;border:1px solid #fff;margin-top:10px;width:100%}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-webkit-slider-runnable-track{background:#ebecf0;border:none;border-radius:3px;height:8px;width:100%}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-webkit-slider-thumb{-webkit-appearance:none;background:#7a869a;border:none;border-radius:50%;height:20px;margin-top:-6px;width:20px}.modal-avatar-crop .crop-form .cropit-image-zoom-input:focus{outline:none}.modal-avatar-crop .crop-form .cropit-image-zoom-input:focus::-webkit-slider-runnable-track{background:#ebecf0}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-moz-range-track{background:#ebecf0;border:none;border-radius:4px;height:8px;width:100%}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-moz-range-thumb{background:#7a869a;border:none;border-radius:50%;height:20px;width:20px}.modal-avatar-crop .crop-form .cropit-image-zoom-input:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-ms-track{background:transparent;border-color:transparent;border-width:8px 0;color:transparent;height:8px;width:100%}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-ms-fill-lower,.modal-avatar-crop .crop-form .cropit-image-zoom-input::-ms-fill-upper{background:#ebecf0;border-radius:16px}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-ms-thumb{background:#7a869a;border:none;border-radius:50%;height:20px;width:20px}.modal-avatar-crop .crop-form .cropit-image-zoom-input:focus::-ms-fill-lower,.modal-avatar-crop .crop-form .cropit-image-zoom-input:focus::-ms-fill-upper{background:#ebecf0}.modal-change-avatar .modal-avatar-gallery{padding-bottom:0}.modal-change-avatar .modal-avatar-gallery .avatars-gallery{margin-bottom:20px}.modal-change-avatar .modal-avatar-gallery .avatars-gallery h3{margin-top:0}.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .row{margin-bottom:10px}.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn{background:none;border:2px solid #ebecf0;border-radius:6px;padding:2px;position:relative}.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn:focus,.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn:hover{border-color:#7a869a}.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn.avatar-selected,.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn:active{border-color:#0065ff}.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn img{border-radius:4px;height:auto;width:100%}.list-group-category-vanilla{background-color:transparent;color:#5e6c84}.list-group-category-vanilla .item-title,.list-group-category-vanilla .item-title:active,.list-group-category-vanilla .item-title:focus,.list-group-category-vanilla .item-title:hover,.list-group-category-vanilla .item-title:link,.list-group-category-vanilla .item-title:visited{color:#344563;font-weight:500}.list-group-category-vanilla .list-group-item-heading:last-child{margin:0}.list-group-category-vanilla .category-description :last-child{margin-bottom:0}.list-group-category-item{display:flex;padding-left:0}.list-group-category-item-read-status-col{align-items:center;display:flex;flex-shrink:0;justify-content:center;text-align:center;width:56px}.list-group-category-item-rest-col{align-items:center;display:flex;width:100%}.list-group-category-item-main-col{flex:1;padding-right:15px}.list-group-category-item-stats-col{flex-shrink:0;width:150px}.list-group-category-item-last-thread-col{align-items:center;display:flex;width:290px}.list-group-category-item-read-status-col .material-icon{font-size:24px;line-height:24px}.list-group-category-item-read-status-col .item-read{color:#dfe1e6}.list-group-category-item-read-status-col .item-new{color:#2563eb}.list-group-category-item-name,.list-group-category-item-name:link,.list-group-category-item-name:visited{color:#172b4d;font-size:18px;font-weight:500}.list-group-category-item-description{color:#5e6c84;margin-top:3px}.list-group-category-item-description :last-child{margin-bottom:0}.list-group-category-item-children{list-style:none;margin:0 -6px -6px;padding:0}.list-group-category-item-children-item{display:inline-block;padding:6px}.list-group-category-child-children-item-name{align-items:center;display:flex}.list-group-category-child-children-item-name,.list-group-category-child-children-item-name:active,.list-group-category-child-children-item-name:link,.list-group-category-child-children-item-name:visited{color:#5e6c84}.list-group-category-child-children-item-name:active,.list-group-category-child-children-item-name:focus,.list-group-category-child-children-item-name:hover{color:#172b4d}.list-group-category-child-children-item-status-new,.list-group-category-child-children-item-status-read{border-radius:2px;display:inline-block;height:8px;margin-right:6px;width:8px}.list-group-category-child-children-item-status-new{background-color:#2563eb}.list-group-category-child-children-item-status-read{background-color:#dfe1e6}.list-group-category-item-stats-col{color:#5e6c84;padding-right:15px}.list-group-category-item-stats-col .category-stat-value{color:#172b4d;font-weight:700}.list-group-category-item-last-poster-avatar-col{padding-right:15px}.list-group-category-item-last-poster-avatar{line-height:0}.list-group-category-item-last-poster-avatar img{border-radius:4px}.list-group-category-item-last-thread-details-col{color:#5e6c84;flex:1;min-width:0}.list-group-category-item-last-thread-title,.list-group-category-item-last-thread-title-muted{display:block;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.list-group-category-item-last-thread-title,.list-group-category-item-last-thread-title:active,.list-group-category-item-last-thread-title:focus,.list-group-category-item-last-thread-title:hover,.list-group-category-item-last-thread-title:link,.list-group-category-item-last-thread-title:visited{color:#172b4d}.list-group-category-item-last-thread-title-muted{color:#5e6c84}.list-group-category-item-last-posted-on,.list-group-category-item-last-poster,.list-group-category-item-last-separator{display:inline-block}.list-group-category-item-last-poster,.list-group-category-item-last-poster:active,.list-group-category-item-last-poster:focus,.list-group-category-item-last-poster:hover,.list-group-category-item-last-poster:link,.list-group-category-item-last-poster:visited{color:#172b4d}.list-group-category-item-last-separator{margin:0 2px}.list-group-category-item-last-posted-on,.list-group-category-item-last-posted-on-short,.list-group-category-item-last-posted-on-short:active,.list-group-category-item-last-posted-on-short:focus,.list-group-category-item-last-posted-on-short:hover,.list-group-category-item-last-posted-on-short:link,.list-group-category-item-last-posted-on-short:visited,.list-group-category-item-last-posted-on:active,.list-group-category-item-last-posted-on:focus,.list-group-category-item-last-posted-on:hover,.list-group-category-item-last-posted-on:link,.list-group-category-item-last-posted-on:visited{color:#5e6c84}.list-group-category-item-last-posted-on-short{display:none}.list-group-category-item-last-thread-text{align-items:center;color:#5e6c84;display:flex}.list-group-category-item-last-thread-text-icon{align-items:center;color:#7a869a;display:flex;height:32px;justify-content:center;margin-right:15px;width:32px}.list-group-category-item-last-thread-text-icon .material-icon{font-size:24px;line-height:24px}@media screen and (max-width:991px){.list-group-category-item-rest-col{align-items:start;flex-direction:column}.list-group-category-item-last-posted-on,.list-group-category-item-last-poster,.list-group-category-item-last-poster-avatar-col,.list-group-category-item-last-separator,.list-group-category-item-stats-col{display:none}.list-group-category-item-last-thread-col{display:flex;margin-top:10px;padding-right:15px}.list-group-category-item-last-thread-details-col{align-items:center;display:flex;width:auto}.list-group-category-item-last-thread-title,.list-group-category-item-last-thread-title-muted{display:block;font-weight:400}.list-group-category-item-last-posted-on-short{display:block;flex-shrink:1;padding-left:7px;white-space:nowrap}.list-group-category-item-last-thread-text-icon{display:none}}.participant-card .btn-user,.participant-card .dropdown.open .btn-user{margin-bottom:20px}.participant-card .btn-user,.participant-card .btn-user:focus,.participant-card .btn-user:focus:active,.participant-card .btn-user:hover,.participant-card .dropdown.open .btn-user,.participant-card .dropdown.open .btn-user:focus,.participant-card .dropdown.open .btn-user:focus:active,.participant-card .dropdown.open .btn-user:hover{overflow:hidden;padding:0;text-align:left}.participant-card .btn-user img,.participant-card .dropdown.open .btn-user img{background-color:#fff;height:34px;margin-right:8px;width:34px}.panel-participants p{margin:7px 0 0}.markup-editor{background:#fff;border:2px solid #ced0da;border-radius:4px;overflow:hidden}.markup-editor.markup-editor-focused{border:2px solid #2563eb}.markup-editor-toolbar{background:#fff;border-bottom:1px solid #ebecf0;padding:7px;position:relative}.markup-editor-toolbar-left{display:flex;flex-shrink:0;overflow-x:hidden}.markup-editor-toolbar-right{background:#fff;display:flex;flex-shrink:0;margin-right:10px;padding:7px 0 7px 7px;position:absolute;right:0;top:0}.btn-markup-editor{align-items:center;display:flex;flex-shrink:0;font-size:24px;height:34px;justify-content:center;line-height:24px;padding:0;width:34px}.btn-markup-editor,.btn-markup-editor:hover{background-color:transparent;border-color:transparent;color:#172b4d}.btn-markup-editor:active{background-color:#ebecf0;border-color:#ebecf0;color:#172b4d}.btn-markup-editor .material-icon{bottom:0;margin:0}.markup-editor-controls-dropdown{margin-right:10px}.markup-editor-footer{background:#fff;border-top:1px solid #ebecf0;display:flex;padding:15px}.markup-editor-spacer{flex:1}.markup-editor-footer .btn+.btn,.markup-editor-toolbar .btn+.btn{margin-left:10px}.markup-editor-textarea.form-control{border:0;border-radius:0;font-size:16px;height:200px;padding:15px;resize:none}.markup-editor-textarea.form-control,.markup-editor-textarea.form-control:focus{box-shadow:none}.markup-editor-preview{height:200px;overflow-y:auto;position:relative}.markup-editor-preview-contents{padding:15px;position:absolute}.markup-editor-preview-loading{padding:15px}.markup-editor-attachments{max-height:170px;overflow-y:auto}.markup-editor-attachments-container{overflow:auto;padding:7px}.markup-editor-attachments-item{padding:7px}.markup-editor-attachment{align-items:center;border:1px solid #ebecf0;border-radius:3px;display:flex;padding:7px}.markup-editor-attachment-details{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.markup-editor-attachment-details strong{display:block}.markup-editor-attachment-details .list-unstyled{margin-bottom:0}.btn-markup-editor-attachment{margin-left:7px}@media screen and (min-width:768px){.markup-editor-attachments-item{float:left;width:50%}}@media screen and (min-width:992px){.markup-editor-attachments-item{width:25%}}.markup-editor-attachment-modal-preview{margin:20px 0 40px;text-align:center}.markup-editor-attachment-modal-preview a{background:#fff;border:1px solid #ebecf0;display:inline-block;padding:12px}.markup-editor-attachment-modal-preview img{max-height:50vh;max-width:100%}.markup-editor-attachment-modal-filename{font-size:28px;font-weight:700;margin-bottom:20px}.markup-editor-attachment-modal-details{margin-bottom:20px}.posting-fullscreen .markup-editor{display:flex;flex-direction:column;height:100%}.posting-fullscreen .markup-editor .markup-editor-preview,.posting-fullscreen .markup-editor .markup-editor-textarea{flex:1;height:auto}@media screen and (max-width:991px){body.posting-default .markup-editor{display:flex;flex-direction:column;height:100%}body.posting-default .markup-editor .markup-editor-preview,body.posting-default .markup-editor .markup-editor-textarea{flex:1;height:100%}}@media screen and (max-width:767px){.markup-editor-attachments{max-height:120px}.markup-editor-footer .btn-auto{flex:1}.markup-editor-footer .btn-icon{margin-right:10px}.markup-editor-spacer{display:none}}@media screen and (min-width:992px){.markup-editor-controls-dropdown{display:none}}.poll-form{margin-bottom:20px}.poll-choices-control .list-group-item{padding:0}.poll-choices-control .list-group-item .btn{background:transparent;border:transparent;float:left;height:28px;margin:0 2px -29px;padding:0;position:relative;top:3px;width:28px}.poll-choices-control .list-group-item .btn .material-icon{font-size:28px;height:28px;line-height:28px;width:28px}.poll-choices-control input,.poll-choices-control input:active,.poll-choices-control input:focus{background:transparent;border:none;-webkit-box-shadow:none;box-shadow:none;margin-left:30px;outline:none;padding:6px 12px;width:100%}#posting-mount{bottom:0;display:none;left:0;position:fixed;width:100%;z-index:1035}#posting-mount.show{background-color:#fff;display:block}.posting-dialog{background:#fff;border:1px solid #ebecf0;border-bottom:0;border-radius:4px 4px 0 0;box-shadow:0 0 24px rgba(94,108,132,.25);margin:0 auto;max-width:1240px;overflow:hidden}.posting-dialog-header{align-items:center;border-bottom:1px solid #ebecf0;display:flex;padding:6px 12px}.posting-dialog-caption{color:#172b4d;flex:1;font-size:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-posting-dialog{align-items:center;display:flex;flex-shrink:0;font-size:24px;height:32px;justify-content:center;line-height:24px;margin-left:10px;padding:0;width:32px}.btn-posting-dialog,.btn-posting-dialog:hover{background-color:transparent;border:1px solid transparent;color:#172b4d}.btn-posting-dialog:active{background-color:#ebecf0;border:1px solid #ebecf0;color:#172b4d}.btn-posting-dialog .material-icon{bottom:0;margin:0;padding:0}.posting-dialog-body{padding:12px}@media screen and (min-width:992px){.posting-dialog-category-select,.posting-dialog-thread-recipients{max-width:400px}}.posting-dialog-minimized .posting-dialog-header{border-bottom:0}.posting-dialog-minimized .posting-dialog-body{display:none}body.posting-fullscreen{overflow:hidden}body.posting-fullscreen #posting-mount{height:100%}body.posting-fullscreen .posting-dialog{border:0;box-shadow:none;height:100%;max-width:auto;width:100%}body.posting-fullscreen .posting-dialog-container{display:flex;flex-direction:column;height:100%;margin:0 auto;max-width:1240px;padding:0 30px}body.posting-fullscreen .posting-dialog-body,body.posting-fullscreen .posting-dialog-header{padding:20px 0}body.posting-fullscreen .posting-dialog-body,body.posting-fullscreen .posting-loading{height:100%}body.posting-fullscreen .posting-dialog-form{display:flex;flex-direction:column;height:100%}body.posting-fullscreen #posting-spacer{display:none}@media screen and (max-width:1240px){body.posting-default .posting-dialog,body.posting-minimized .posting-dialog{border-left:0;border-radius:0;border-right:0}}@media screen and (max-width:991px){body.posting-default{overflow:hidden}body.posting-default #posting-mount{height:100%}body.posting-default .posting-dialog{border:0;box-shadow:none;height:100%;max-width:auto;width:100%}body.posting-default .posting-dialog-container{display:flex;flex-direction:column;height:100%;margin:0 auto;max-width:1240px;padding:0}body.posting-default .posting-dialog-body,body.posting-default .posting-dialog-header{padding:6px}body.posting-default .posting-dialog-body,body.posting-default .posting-loading{height:100%}body.posting-default .posting-dialog-form{display:flex;flex-direction:column;height:100%}body.posting-default .posting-dialog .toolbar-section{margin-bottom:6px}body.posting-default #posting-spacer{display:none}}.posting-dialog-error{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;padding:20px}.posting-dialog-error p{font-size:18px}.posting-dialog-error-icon{font-size:128px;margin-bottom:20px;opacity:.5}.posting-dialog-error-detail{text-align:center}.posts-list{clear:both;margin:0;padding:0}.posts-list li{list-style:none;margin:0;padding:0}@media screen and (min-width:992px){.panel-post .panel-body{display:flex}.post-side{flex-shrink:0;padding-right:15px;width:260px}.panel-content{flex:1 0}}.post-side{font-size:12px}.post-side .media{margin:0}.post-side .poster-avatar{height:36px;width:36px}@media screen and (min-width:992px){.post-side .poster-avatar{height:82px;margin-top:4px;width:82px}}.post-side .user-status{margin-right:4px}.post-side .media-heading{display:block;font-size:14px;margin:-1px 0 0}.post-side .media-heading .user-status{margin-left:2px;margin-right:0}.post-side .pull-right{margin-left:16px}@media screen and (min-width:992px){.post-side .media-heading{font-size:18px;margin-top:3px}.post-side .media-heading .user-status{display:none}.post-side .user-title{margin-bottom:5px;margin-top:4px}.post-side .user-postcount,.post-side .user-status{display:block}}.post-heading{height:36px}@media screen and (max-width:991px){.post-heading{margin-top:10px}}.post-heading .pull-right{margin-left:16px}.post-heading .label{font-size:14px;font-weight:400;margin-top:6px}.post-heading .label-unread{background-color:#36b37e;color:#fff}.post-heading .label-protected{background-color:#5e6c84;color:#fff}@media screen and (min-width:992px){.post-side .pull-right{display:none}}@media screen and (max-width:991px){.post-heading .pull-right{display:none}}.post-body{padding-bottom:30px;padding-top:20px}.post-status-message{overflow:auto}.post-status-message .material-icon{float:left;font-size:28px;line-height:28px}.post-status-message p{margin:4px 0 0 36px}.post-status-best-answer{background-color:#36b37e;color:#fff}.post-status-hidden{background-color:#ff5630;color:#fff}.post-status-unapproved{background-color:#2563eb;color:#fff}.post-status-protected{background-color:#5e6c84;color:#fff}.post-footer .pull-left{margin-right:16px}.post-footer .pull-right{margin-left:16px}.post-footer p{margin-bottom:0;padding-bottom:6px;padding-top:7px}.post-attachments{border-top:1px solid #ebecf0;padding:6px 16px}.post-attachments abbr{white-space:nowrap}.post-attachments .attachment-name{overflow-wrap:anywhere}.post-attachments .row>div{margin:10px 0}.post-attachments .post-attachment-preview{float:left;height:40px;text-align:center;width:40px}.post-attachments .post-attachment{margin-left:52px}.post-attachments .post-thumbnail{background-position:50%;background-size:cover;border-radius:3px;display:block;height:40px;width:40px}.post-attachments .material-icon{font-size:28px;height:28px;line-height:28px;position:relative;top:5px;width:28px}.post-attachments .material-icon:active,.post-attachments .material-icon:focus,.post-attachments .material-icon:hover,.post-attachments .material-icon:link,.post-attachments .material-icon:visited{color:#172b4d;text-decoration:none}.post-attachments .post-attachment-description{color:#7a869a;font-size:12px;margin:0;padding:0}.post-feed .post-side{padding-right:0;width:100%}.post-feed .post-side .media-heading{font-size:14px;margin:0}.post-feed .post-side .user-title{font-size:12px;margin:0}.post-feed .post-side .btn{display:inline-block}.post-feed .post-side img{height:36px;margin-top:0;width:36px}.post-feed .post-heading{height:auto;margin:10px 0}.post-feed .post-heading .btn{margin-right:16px;max-width:100%;overflow-wrap:anywhere;text-align:left;white-space:normal}.posts-list .event{color:#7a869a;margin-bottom:20px}.posts-list .event .event-body{align-items:flex-start;display:flex}.posts-list .event-label{margin-left:51px}.posts-list .event-label .label-unread{background-color:#36b37e;color:#fff}.posts-list .event .event-icon{padding-right:15px}.posts-list .event .event-icon .event-icon-bg{align-items:center;background:#ebecf0;border-radius:4px;color:#5e6c84;display:flex;height:36px;justify-content:center;width:36px}.posts-list .event .event-icon .material-icon{align-items:center;display:flex;font-size:28px;justify-content:center}.posts-list .event .event-content{flex:1 0}.posts-list .event .event-message{font-size:18px;margin-bottom:5px}.posts-list .event .event-info{font-size:12px;margin:0}.posts-list .event .event-info li{margin-right:12px}.posts-list .event .event-info li:last-child{margin-right:0}.posts-list .event .event-controls .btn-link{border:0;font-size:12px;margin:0 12px 0 0;padding:0}.posts-list .event .event-controls .btn-link:last-child{margin-right:0}@media screen and (max-width:767px){.posts-list .event .event-info{margin-top:5px}.posts-list .event .event-controls{clear:both;margin-top:5px}.posts-list .event .event-controls .btn-link{font-size:14px;margin-right:20px}.posts-list .event .event-controls .btn-link:last-child{margin-right:0}}@media screen and (min-width:992px){.posts-list .event .event-icon{display:flex;flex-shrink:0;justify-content:flex-end;width:275px}.event-content{flex:1 0}.posts-list .event-label{margin-left:275px}}.post-changelog-diff{margin:0;padding:0}.post-changelog-diff .list-unstyled{margin:5px 0;padding:0}.post-changelog-diff .diff-item{padding:5px 10px}.post-changelog-diff .diff-item-sub{color:#ff5630}.post-changelog-diff .diff-item-add{color:#36b37e}.post-changelog-toolbar .row{margin-left:-12px;margin-right:-12px}@media screen and (max-width:767px){.post-changelog-toolbar .post-change-label{text-align:center}}.quote-control-arrow{border-bottom:6px solid rgba(94,108,132,.75);border-left:6px solid transparent;border-right:6px solid transparent;height:0;left:6px;position:relative;width:0}.quote-control-inner{background:rgba(94,108,132,.75);border-radius:6px;padding:6px}.quote-control-btn{background:#fff;border-color:#fff;color:#172b4d}.section-divider{align-items:center;display:flex}.section-divider hr{border-radius:3px;border-width:3px;width:100%}.section-divider strong{padding:0 16px}.section-divider-primary{color:#2563eb}.section-divider-primary hr{border-color:#fff}.page-login-container{margin-bottom:-40px;padding:40px 15px}.panel-login-form{border:1px solid #ebecf0;border-radius:4px;margin:20px auto;max-width:400px}.panel-login-form-body{padding:30px}.panel-login-form-header{font-size:21px;font-weight:400;margin:0 0 30px;text-align:center}.panel-login-form-error{color:#ff5630;font-weight:700;margin-bottom:20px;margin-top:-10px;text-align:center}.panel-login-form .form-control{font-size:16px;margin-bottom:20px}@media screen and (max-width:991px){.page-login-container{padding:20px 15px}.panel-login-form-body{padding:15px}.panel-login-form-header{margin-bottom:15px}.panel-login-form-error{margin-bottom:10px;margin-top:0}}@media screen and (max-width:767px){.page-error .message-panel,.page-message .message-panel{text-align:center}.page-error .message-icon,.page-message .message-icon{font-size:80px;margin:30px}}@media screen and (min-width:768px){.page-error .message-panel,.page-message .message-panel{margin:60px auto;max-width:779.35px;overflow:auto}.page-error .message-icon,.page-message .message-icon{float:left}.page-error .message-icon .material-icon,.page-message .message-icon .material-icon{font-size:80px}.page-error .message-body,.page-message .message-body{font-size:18px;margin-left:100px;margin-top:16px}.page-error .message-body p.lead,.page-message .message-body p.lead{font-size:36px}}.threads-list{background-color:#fff;border:1px solid #ebecf0;border-radius:3px;margin-bottom:20px;overflow:hidden;padding:0}.threads-list-item{align-items:center;border-bottom:1px solid #ebecf0;display:flex;padding:10px 15px}.threads-list-item img{border-radius:3px}.threads-list-item:last-child{border-bottom:none}.threads-list-item-right-col{align-items:center;display:flex;width:100%}.threads-list-item-top-row{flex:1;flex-direction:column}.threads-list-item-bottom-left,.threads-list-item-bottom-right,.threads-list-item-bottom-row,.threads-list-item-top-row{align-items:center;display:flex;justify-content:center}@keyframes misago-threads-list-item-animate{0%{background-color:#b3d4ff}to{background-color:transparent}}.threads-list-item-animate{animation-duration:.5s;animation-iteration-count:1;animation-name:misago-threads-list-item-animate}.threads-list-item-col-read-status{line-height:0;padding-right:15px}.threads-list-read-icon{border:2px solid #ebecf0}.threads-list-read-icon,.threads-list-unread-icon{border-radius:100%;display:inline-block;height:14px;width:14px}.threads-list-unread-icon{background-color:#2563eb;font-size:0;line-height:0}.threads-list-item-row-title{flex:1;width:100%}.threads-list-item-title:active,.threads-list-item-title:focus,.threads-list-item-title:hover,.threads-list-item-title:link,.threads-list-item-title:visited{color:#172b4d;font-size:16px;overflow-wrap:anywhere}.threads-list-item-title-new:active,.threads-list-item-title-new:focus,.threads-list-item-title-new:hover,.threads-list-item-title-new:link,.threads-list-item-title-new:visited{color:#172b4d}.threads-list-item-col-categories,.threads-list-item-row-categories{display:flex;width:100%}.threads-list-category-link{align-items:center;display:flex}.threads-list-category-link .material-icon{margin-right:3px}.threads-list-category-link:active,.threads-list-category-link:focus,.threads-list-category-link:hover,.threads-list-category-link:link,.threads-list-category-link:visited{color:#172b4d;opacity:.75}.threads-list-category-link:focus,.threads-list-category-link:hover{color:#172b4d;opacity:1;text-decoration:none}.threads-list-category-link+.threads-list-category-link{margin-left:15px}.threads-list-category-link-color .material-icon{color:var(--color)}.threads-list-item-col-categories{display:none}.threads-list-item-goto-page{border-radius:3px;font-size:13px;font-weight:700;margin-left:12px;padding:3px 12px}.threads-list-item-goto-page:focus,.threads-list-item-goto-page:hover,.threads-list-item-goto-page:link,.threads-list-item-goto-page:visited{background-color:transparent;border:1px solid #ebecf0;color:#172b4d;text-decoration:none}.threads-list-item-goto-page:active{background-color:#ebecf0;border:1px solid #ebecf0;color:#172b4d}.threads-list-item-col-flags{padding-left:15px}.threads-list-item .thread-flags{opacity:.8}.threads-list-item:focus .thread-flags,.threads-list-item:hover .thread-flags{opacity:1}.threads-list-item-col-category-labels{padding-left:15px;white-space:nowrap}.threads-list-category-label{font-size:12px;font-weight:700;padding:3px 6px}.threads-list-category-label,.threads-list-category-label:active,.threads-list-category-label:focus,.threads-list-category-label:hover,.threads-list-category-label:link,.threads-list-category-label:visited{background:#ebecf0;color:#344563;text-decoration:none}.threads-list-category-label.threads-list-category-label-color,.threads-list-category-label.threads-list-category-label-color:active,.threads-list-category-label.threads-list-category-label-color:focus,.threads-list-category-label.threads-list-category-label-color:hover,.threads-list-category-label.threads-list-category-label-color:link,.threads-list-category-label.threads-list-category-label-color:visited{background:var(--label-color);color:#fff}.threads-list-category-label:first-child{border-bottom-left-radius:3px;border-top-left-radius:3px}.threads-list-category-label:last-child{border-bottom-right-radius:3px;border-top-right-radius:3px}.threads-list-category-label+.threads-list-category-label{margin-left:2px}.threads-list-item-col-replies{padding-left:15px;width:80px}.threads-list-item-col-posters{padding-left:15px;width:76px}.threads-list-item-col-posters a{display:inline-block;line-height:0}.threads-list-item-col-posters a:focus,.threads-list-item-col-posters a:hover{text-decoration:none}.threads-list-item-starter+.threads-list-item-last-poster{margin-left:7.5px}.threads-list-item-col-posters-sm{display:none;font-size:20px;line-height:1}.threads-list-item-col-posters-sm img{height:20px;width:20px}.threads-list-item-col-last-activity{overflow:hidden;padding-left:15px;text-overflow:ellipsis;white-space:nowrap;width:90px}.threads-list-item-col-last-activity a:active,.threads-list-item-col-last-activity a:focus,.threads-list-item-col-last-activity a:hover,.threads-list-item-col-last-activity a:link,.threads-list-item-col-last-activity a:visited{color:#344563;font-size:16px}@media screen and (max-width:991px){.threads-list-item{align-items:flex-start}.threads-list-item-right-col{display:block}.threads-list-item-top-row{align-items:start}.threads-list-item-bottom-row{flex:0;justify-content:space-between;margin-top:7.5px}.threads-list-item-col-posters,.threads-list-item-col-replies-zero,.threads-list-item-row-categories{display:none}.threads-list-item-col-read-status{padding-top:4px}.threads-list-item-col-category-labels,.threads-list-item-col-flags{padding-left:0}.threads-list-item-col-categories{align-items:center;display:flex}.threads-list-item-col-flags+.threads-list-item-col-categories,.threads-list-item-col-flags+.threads-list-item-col-category-labels{margin-left:15px}.threads-list-item-col-categories .threads-list-category-link,.threads-list-item-col-category-labels .threads-list-category-label{white-space:nowrap}.threads-list-item-col-last-activity,.threads-list-item-col-replies{width:auto}.threads-list-item-col-posters-sm{display:block;margin-left:15px}.threads-list-item-col-checkbox{margin-right:-10px;text-align:center;width:40px}}@media screen and (max-width:767px){.threads-list{border-radius:0;border-width:1px 0;margin-left:-15px;margin-right:-15px}.threads-list-item-bottom-row{margin-top:0}.threads-list-item-bottom-left,.threads-list-item-bottom-right{margin-top:7px;overflow:visible}.threads-list-item-bottom-row{display:block;overflow:auto}.threads-list-item-bottom-row .threads-list-item-bottom-left{float:left}.threads-list-item-bottom-row .threads-list-item-bottom-right{float:right}.threads-list-item-col-read-status{padding-right:7px;position:relative;right:4px}.threads-list-item-title{font-size:18px}.threads-list-item-starter{display:none}.threads-list-item-col-last-activity{padding-left:15px;padding-right:7px}.threads-list-item-col-last-activity a:active,.threads-list-item-col-last-activity a:focus,.threads-list-item-col-last-activity a:hover,.threads-list-item-col-last-activity a:link,.threads-list-item-col-last-activity a:visited{font-size:13px}.threads-list-item-col-checkbox{margin-right:0}.threads-list-item-col-checkbox input{left:10px;position:relative}}.threads-list-poll-new{list-style:none;padding:0}.btn-threads-list-poll{background-color:#fff;border:none;border-bottom:1px solid #ebecf0;border-radius:0;color:#2563eb;display:block;padding:10px 15px;width:100%}.threads-list-blankslate{padding:20px 30px}.threads-list-blankslate-message{font-size:18px;margin:0;text-align:center}.threads-list-blankslate-links{margin-top:20px;text-align:center}@media screen and (max-width:767px){.threads-list-blankslate{padding:10px 15px}.threads-list-blankslate-message{font-size:14px}}.notifications-list{margin-bottom:20px}.notifications-list-item{align-items:center;display:flex}.notifications-list-item-left-col,.notifications-list-item-right-col{align-items:center;display:flex;justify-content:center}.notifications-list-item-right-col{width:100%}.notifications-list-item-top-row{flex:1}.notifications-list-item-bottom-row,.notifications-list-item-top-row{align-items:center;display:flex;justify-content:center}.notifications-list-item-col-actor{padding-right:15px}.notifications-list-item-col-actor img{border-radius:3px;height:30px;width:30px}.notifications-list-item-col-read-icon{line-height:0;padding-right:15px}.notification-read-icon{border:2px solid #ebecf0}.notification-read-icon,.notification-unread-icon{border-radius:100%;display:inline-block;height:14px;width:14px}.notification-unread-icon{background-color:#2563eb;font-size:0;line-height:0}.notifications-list-item-col-message{overflow-wrap:anywhere;width:100%}.notification-message,.notification-message-unread,.notification-message-unread:active,.notification-message-unread:focus,.notification-message-unread:hover,.notification-message-unread:link,.notification-message-unread:visited,.notification-message:active,.notification-message:focus,.notification-message:hover,.notification-message:link,.notification-message:visited{color:#172b4d}.notifications-list-item-col-timestamp{align-items:center;display:flex;min-width:200px;padding-left:15px}.notifications-list-item-timestamp{color:#5e6c84;font-size:12px}@media screen and (max-width:991px){.notifications-list-item{align-items:flex-start;position:relative}.notifications-list-item-right-col{display:block}.notifications-list-item-col-read-icon{padding:0;position:absolute;right:15px;top:14px}.notifications-list-item-col-timestamp{margin-top:5px;padding:0}.notifications-list-item-unread{padding-right:40px}.notifications-list-item-read .notifications-list-item-col-read-icon{display:none}}@media screen and (max-width:767px){.notifications-list{margin-left:-15px;margin-right:-15px}.notifications-list .list-group,.notifications-list .list-group-item{border-left:0;border-radius:0;border-right:0}}.notifications-dropdown{width:375px}.notifications-dropdown .notifications-list{margin:0;max-height:calc(100vh - 210px);overflow-y:auto}.notifications-dropdown .notifications-list-item{align-items:flex-start;position:relative}.notifications-dropdown .notifications-list-item-right-col{display:block}.notifications-dropdown .notifications-list-item-col-read-icon{padding:0;position:absolute;right:15px;top:14px}.notifications-dropdown .notifications-list-item-col-timestamp{margin-top:5px;padding:0}.notifications-dropdown .notifications-list-item-unread{padding-right:40px}.notifications-dropdown .notifications-list-item-read .notifications-list-item-col-read-icon{display:none}.overlay .notifications-list{height:100%;margin:0;overflow-y:auto;position:relative;width:100%}.overlay .notifications-list-ready .list-group{position:absolute}.overlay .list-group,.overlay .list-group-item{border-left:0;border-radius:0;border-right:0;margin:0}.overlay .list-group-item:first-child{border-top:none}.overlay .list-group-item{border-bottom:none}.overlay .notifications-list-item{align-items:flex-start;padding:10px 20px;position:relative}.overlay .notifications-list-item-right-col{display:block}.overlay .notifications-list-item-col-read-icon{padding:0;position:absolute;right:15px;top:14px}.overlay .notifications-list-item-col-timestamp{margin-top:5px;padding:0}.overlay .notifications-list-item-unread{padding-right:40px}.overlay .notifications-list-item-read .notifications-list-item-col-read-icon{display:none}.overlay .notifications-list-pending,.overlay .notifications-list-pending .list-group{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.overlay .notifications-list-pending .list-group-item{width:100%}.active-posters li{display:block;overflow:auto}.active-posters .rank-user-avatar{float:left}@media screen and (max-width:991px){.active-posters .rank-user-avatar{height:42px}.active-posters .rank-user-avatar img{height:36px;position:relative;top:3px;width:36px}}.active-posters .rank-user{float:left;margin-top:3px}@media screen and (max-width:991px){.active-posters .rank-user{margin-left:13.2px;width:40%}}@media screen and (max-width:767px){.active-posters .rank-user{float:none;margin-left:50px;width:auto}}@media screen and (min-width:992px){.active-posters .rank-user{margin-left:16px;width:25%}.active-posters .rank-user .user-name{font-size:18px}}.active-posters .user-details{font-family:Sans-Serif;overflow:auto}.active-posters .user-details .rank-name,.active-posters .user-details .user-status,.active-posters .user-details .user-title{display:block;float:left;font-size:12px;margin-right:3px}@media screen and (min-width:992px){.active-posters .user-details .rank-name,.active-posters .user-details .user-status,.active-posters .user-details .user-title{margin-right:8px}}.active-posters .user-details .user-title{margin-right:0}@media screen and (min-width:992px){.active-posters .user-details{overflow:visible}.active-posters .user-details .rank-name,.active-posters .user-details .user-title{height:14px;overflow:hidden;position:relative;top:1px;vertical-align:baseline}}@media screen and (max-width:767px){.active-posters .user-details{margin-top:3px}.active-posters .user-details .rank-name,.active-posters .user-details .user-title{font-weight:400}}.active-posters .user-status{overflow:auto;position:relative;top:1px}.active-posters .user-status span{display:block;float:left}@media screen and (min-width:992px){.active-posters .user-status{height:14px;overflow:hidden}}.active-posters .user-status .status-icon{position:relative}@media screen and (max-width:991px){.active-posters .user-status .status-icon{font-size:12px;height:12px;line-height:12px;top:0;width:12px}}@media screen and (min-width:992px){.active-posters .user-status .status-icon{font-size:13px;height:13px;line-height:13px;margin-right:3px;top:1px;width:13px}}.active-posters .rank-name .ui-preview-text,.active-posters .status-label.ui-preview-text,.active-posters .user-title .ui-preview-text{font-size:11px;height:11px;line-height:11px;position:relative;top:2px}.active-posters .rank-name .ui-preview-text,.active-posters .user-title .ui-preview-text{position:static}.active-posters .rank-position small,.active-posters .rank-position strong,.active-posters .rank-posts-counted small,.active-posters .rank-posts-counted strong,.active-posters .rank-posts-total small,.active-posters .rank-posts-total strong{display:block}@media screen and (max-width:991px){.active-posters .rank-position,.active-posters .rank-posts-counted,.active-posters .rank-posts-total{overflow:auto}.active-posters .rank-position small,.active-posters .rank-position strong,.active-posters .rank-posts-counted small,.active-posters .rank-posts-counted strong,.active-posters .rank-posts-total small,.active-posters .rank-posts-total strong{float:left;font-size:10.5px}.active-posters .rank-position strong,.active-posters .rank-posts-counted strong,.active-posters .rank-posts-total strong{margin-right:3px;min-width:30px;text-align:right}.active-posters .rank-position .ui-preview-text,.active-posters .rank-posts-counted .ui-preview-text,.active-posters .rank-posts-total .ui-preview-text{font-size:8px;height:8px;line-height:8px;position:relative;top:-1px}}@media screen and (min-width:992px){.active-posters .rank-position,.active-posters .rank-posts-counted,.active-posters .rank-posts-total{float:left;font-size:18px;margin-top:3px;text-align:center;width:23%}.active-posters .rank-position small,.active-posters .rank-posts-counted small,.active-posters .rank-posts-total small{font-size:12px;font-weight:400}}.user-compact-stats .rank-position small,.user-compact-stats .rank-position strong,.user-compact-stats .rank-posts-counted small,.user-compact-stats .rank-posts-counted strong{display:inline-block;float:none}.user-compact-stats .rank-position strong,.user-compact-stats .rank-posts-counted strong{min-width:auto}.user-compact-stats .rank-position small,.user-compact-stats .rank-posts-counted small{margin-right:20px}@media screen and (min-width:768px) and (max-width:991px){.active-posters .rank-position{margin-top:6px}.active-posters .rank-posts-total{display:none}}.table-watching-preferences{margin-bottom:20px;max-width:100%;width:100%}.table-watching-preferences td,.table-watching-preferences th{border-bottom:1px solid #ddd;vertical-align:middle}.table-watching-label{padding:8px 8px 8px 0}.table-watching-option{padding:8px;text-align:center;width:100px}.table-watching-option label{margin:0;padding:5px;width:100%}.table-watching-option label,.table-watching-option label input{cursor:pointer}.table-watching-option label:hover{background-color:#ebecf0;border-radius:4px}.table-watching-option attr{cursor:help;display:block}.table-watching-option .material-icon{font-size:18px}.profile-page-header-avatar{margin:20px 0;text-align:center}.profile-page-header-avatar .user-avatar{border-radius:4px}.profile-data-list{display:block;font-size:12px;margin:0 -12px;padding:0}.profile-data-list li{display:inline-block;list-style:none;padding:5px 12px}.profile-data-list .status-icon{bottom:1px;margin-right:3px;position:relative}.profile-data-list .user-account-disabled{color:#ff5630;font-weight:700}@media screen and (min-width:768px){.profile-page-header{align-items:flex-end;display:flex}.profile-page-header-avatar{margin:0 30px 0 0}}@media screen and (min-width:992px){.profile-page-header-avatar{margin-top:-54px;position:relative;top:54px}.profile-page-header-details{padding-left:158px}.profile-data-list{font-size:14px}.username-history li{display:block;overflow:auto}}.username-history .change-avatar{float:left}.username-history .change-avatar a,.username-history .change-avatar span{margin-right:10px}.username-history .change-avatar a img,.username-history .change-avatar span img{height:42px;width:42px}@media screen and (min-width:992px){.username-history .change-avatar a img,.username-history .change-avatar span img{bottom:1px;height:18px;position:relative;width:18px}.username-history .change-author{float:left;width:30%}}.username-history .change{min-height:20px;overflow:auto}.username-history .change span{display:block;float:left}.username-history .change .material-icon{margin:0 7px;position:relative;top:4px}@media screen and (min-width:992px){.username-history .change{float:left;width:40%}.username-history .change-date{float:left;width:20%}}.search-footer p{color:#5e6c84;font-size:12px;margin-top:20px;text-align:center}@media screen and (min-width:768px){.page-search-form{padding-top:40px}}@media screen and (min-width:992px){.page-search-form{padding-bottom:40px}.page-search-form h1{position:relative;top:5px}.page-search-form .form-group{margin-bottom:0}}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.grow{flex-grow:1}.grow-0{flex-grow:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.content-center{align-content:center}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-between{align-content:space-between}.mx-0{margin:0}.mx-1{margin:5px 0}.mx-2{margin:10px 0}.mx-3{margin:20px 0}.mt-0{margin-top:0}.mt-1{margin-top:5px}.mt-2{margin-top:10px}.mt-3{margin-top:20px}.mb-0{margin-bottom:0}.mb-1{margin-bottom:5px}.mb-2{margin-bottom:10px}.mb-3{margin-bottom:20px}.text-sm{font-size:12px}.text-color,.text-gray-darker{color:#172b4d}.text-gray-dark{color:#344563}.text-gray{color:#5e6c84}.text-gray-light{color:#7a869a}.text-gray-lighter{color:#ebecf0}.link-gray-darker,.link-gray-darker:active .link-gray-darker:focus,.link-gray-darker:hover,.link-gray-darker:link,.link-gray-darker:visited,.link-text-color,.link-text-color:active .link-text-color:focus,.link-text-color:hover,.link-text-color:link,.link-text-color:visited{color:#172b4d}.link-gray-dark,.link-gray-dark:link,.link-gray-dark:visited{color:#344563}.link-gray-dark:active .link-gray-dark:focus,.link-gray-dark:hover{color:#172b4d}.link-gray,.link-gray:link,.link-gray:visited{color:#5e6c84}.link-gray:active .link-gray:focus,.link-gray:hover{color:#172b4d}.link-gray-light,.link-gray-light:link,.link-gray-light:visited{color:#7a869a}.link-gray-light:active .link-gray-light:focus,.link-gray-light:hover{color:#172b4d}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#fafafa;color:#383a42}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#a626a4}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#50a14f}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#986801}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#4078f2}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#c18401}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}.atwho-view{background:#fff;border:1px solid #ddd;border-radius:3px;box-shadow:0 0 5px rgba(0,0,0,.1);color:#000;display:none;left:0;margin-top:18px;min-width:120px;position:absolute;top:0;z-index:11110!important}.atwho-view .atwho-header{border-bottom:1px solid #eaeff1;color:#6f8092;cursor:pointer;font-size:11px;font-weight:700;margin:5px;padding:5px}.atwho-view .atwho-header .small{color:#6f8092;float:right;font-size:12px;font-weight:400;margin-right:-5px;padding-top:2px}.atwho-view .atwho-header:hover{cursor:default}.atwho-view .cur{background:#36f;color:#fff}.atwho-view .cur small{color:#fff}.atwho-view strong{color:#36f}.atwho-view .cur strong{color:#fff;font:700}.atwho-view ul{list-style:none;margin:auto;max-height:200px;overflow-y:auto;padding:0}.atwho-view ul li{border-bottom:1px solid #ddd;cursor:pointer;display:block;padding:5px 10px}.atwho-view small{color:#777;font-size:smaller;font-weight:400}abbr{outline:none;text-decoration:none}.shadow-2dp{box-shadow:0 2px 2px 0 rgba(0,0,0,.04),0 3px 1px -2px rgba(0,0,0,.06),0 1px 5px 0 rgba(0,0,0,.12)}.shadow-3dp{box-shadow:0 3px 4px 0 rgba(0,0,0,.04),0 3px 3px -2px rgba(0,0,0,.06),0 1px 8px 0 rgba(0,0,0,.12)}.shadow-4dp{box-shadow:0 4px 5px 0 rgba(0,0,0,.04),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-6dp{box-shadow:0 6px 10px 0 rgba(0,0,0,.04),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.06)}.shadow-8dp{box-shadow:0 8px 10px 1px rgba(0,0,0,.04),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.06)}.shadow-16dp{box-shadow:0 16px 24px 2px rgba(0,0,0,.04),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -5px rgba(0,0,0,.06)}.shadow-24dp{box-shadow:0 9px 46px 8px rgba(0,0,0,.04),0 11px 15px -7px rgba(0,0,0,.12),0 24px 38px 3px rgba(0,0,0,.06)}.btn-default,.btn-default.disabled,.btn-default.disabled:active,.btn-default.disabled:hover,.btn-default:disabled,.btn-default:disabled:hover{background:#ebecf0;border:1px solid #ebecf0;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.btn-default.disabled,.btn-default.disabled:active,.btn-default.disabled:hover,.btn-default:disabled,.btn-default:disabled:hover{filter:alpha(opacity=25);opacity:.25}.btn-default:focus,.btn-default:hover{background:#dfe1e6;border:1px solid #dfe1e6;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.btn-default:active,.btn-default:active:focus,.dropdown.open .dropdown-toggle .btn-default,.dropdown.open .dropdown-toggle .btn-default:active:focus,.dropdown.open .dropdown-toggle .btn-default:focus,.dropdown.open .dropdown-toggle .btn-default:hover{background:#c1c7d0;border:1px solid #c1c7d0;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.btn-default.btn-loading,.btn-default.btn-loading:active,.btn-default.btn-loading:active:focus,.btn-default.btn-loading:disabled,.btn-default.btn-loading:disabled:hover,.btn-default.btn-loading:focus,.btn-default.btn-loading:hover{color:transparent}.btn-primary,.btn-primary.disabled,.btn-primary.disabled:active,.btn-primary.disabled:hover,.btn-primary:disabled,.btn-primary:disabled:hover{background:#2563eb;border:1px solid #2563eb;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-primary.disabled,.btn-primary.disabled:active,.btn-primary.disabled:hover,.btn-primary:disabled,.btn-primary:disabled:hover{filter:alpha(opacity=25);opacity:.25}.btn-primary:focus,.btn-primary:hover{background:#3b82f6;border:1px solid #3b82f6;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-primary:active,.btn-primary:active:focus,.dropdown.open .dropdown-toggle .btn-primary,.dropdown.open .dropdown-toggle .btn-primary:active:focus,.dropdown.open .dropdown-toggle .btn-primary:focus,.dropdown.open .dropdown-toggle .btn-primary:hover{background:#1e40af;border:1px solid #1e40af;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-primary.btn-loading,.btn-primary.btn-loading:active,.btn-primary.btn-loading:active:focus,.btn-primary.btn-loading:disabled,.btn-primary.btn-loading:disabled:hover,.btn-primary.btn-loading:focus,.btn-primary.btn-loading:hover{color:transparent}.btn-success,.btn-success.disabled,.btn-success.disabled:active,.btn-success.disabled:hover,.btn-success:disabled,.btn-success:disabled:hover{background:#22c55e;border:1px solid #22c55e;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-success.disabled,.btn-success.disabled:active,.btn-success.disabled:hover,.btn-success:disabled,.btn-success:disabled:hover{filter:alpha(opacity=25);opacity:.25}.btn-success:focus,.btn-success:hover{background:#15803d;border:1px solid #15803d;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-success:active,.btn-success:active:focus,.dropdown.open .dropdown-toggle .btn-success,.dropdown.open .dropdown-toggle .btn-success:active:focus,.dropdown.open .dropdown-toggle .btn-success:focus,.dropdown.open .dropdown-toggle .btn-success:hover{background:#14532d;border:1px solid #14532d;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-success.btn-loading,.btn-success.btn-loading:active,.btn-success.btn-loading:active:focus,.btn-success.btn-loading:disabled,.btn-success.btn-loading:disabled:hover,.btn-success.btn-loading:focus,.btn-success.btn-loading:hover{color:transparent}.btn-danger,.btn-danger.disabled,.btn-danger.disabled:active,.btn-danger.disabled:hover,.btn-danger:disabled,.btn-danger:disabled:hover{background:#ef5350;border:1px solid #ef5350;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-danger.disabled,.btn-danger.disabled:active,.btn-danger.disabled:hover,.btn-danger:disabled,.btn-danger:disabled:hover{filter:alpha(opacity=25);opacity:.25}.btn-danger:focus,.btn-danger:hover{background:#ff8a80;border:1px solid #ff8a80;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-danger:active,.btn-danger:active:focus,.dropdown.open .dropdown-toggle .btn-danger,.dropdown.open .dropdown-toggle .btn-danger:active:focus,.dropdown.open .dropdown-toggle .btn-danger:focus,.dropdown.open .dropdown-toggle .btn-danger:hover{background:#d32f2f;border:1px solid #d32f2f;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-danger.btn-loading,.btn-danger.btn-loading:active,.btn-danger.btn-loading:active:focus,.btn-danger.btn-loading:disabled,.btn-danger.btn-loading:disabled:hover,.btn-danger.btn-loading:focus,.btn-danger.btn-loading:hover{color:transparent}.btn-default.btn-outline,.btn-default.btn-outline.disabled,.btn-default.btn-outline.disabled:active,.btn-default.btn-outline.disabled:hover,.btn-default.btn-outline:disabled,.btn-default.btn-outline:disabled:hover{background:#ebecf0;border:1px solid #ebecf0;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.btn-default.btn-outline.disabled,.btn-default.btn-outline.disabled:active,.btn-default.btn-outline.disabled:hover,.btn-default.btn-outline:disabled,.btn-default.btn-outline:disabled:hover{filter:alpha(opacity=25);opacity:.25}.btn-default.btn-outline:focus,.btn-default.btn-outline:hover{background:#dfe1e6;border:1px solid #dfe1e6;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.btn-default.btn-outline:active,.btn-default.btn-outline:active:focus,.dropdown.open .btn-default.btn-outline,.dropdown.open .btn-default.btn-outline:active:focus,.dropdown.open .btn-default.btn-outline:focus,.dropdown.open .btn-default.btn-outline:hover{background:#c1c7d0;border:1px solid #c1c7d0;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.btn-default.btn-outline.btn-loading,.btn-default.btn-outline.btn-loading:active,.btn-default.btn-outline.btn-loading:active:focus,.btn-default.btn-outline.btn-loading:disabled,.btn-default.btn-outline.btn-loading:disabled:hover,.btn-default.btn-outline.btn-loading:focus,.btn-default.btn-outline.btn-loading:hover{background:#ebecf0;border:1px solid #ebecf0;-webkit-box-shadow:none;box-shadow:none;color:transparent}.btn-primary.btn-outline,.btn-primary.btn-outline.disabled,.btn-primary.btn-outline.disabled:active,.btn-primary.btn-outline.disabled:hover,.btn-primary.btn-outline:disabled,.btn-primary.btn-outline:disabled:hover{background:#2563eb;border:1px solid #2563eb;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-primary.btn-outline.disabled,.btn-primary.btn-outline.disabled:active,.btn-primary.btn-outline.disabled:hover,.btn-primary.btn-outline:disabled,.btn-primary.btn-outline:disabled:hover{filter:alpha(opacity=25);opacity:.25}.btn-primary.btn-outline:focus,.btn-primary.btn-outline:hover{background:#3b82f6;border:1px solid #3b82f6;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-primary.btn-outline:active,.btn-primary.btn-outline:active:focus,.dropdown.open .btn-primary.btn-outline,.dropdown.open .btn-primary.btn-outline:active:focus,.dropdown.open .btn-primary.btn-outline:focus,.dropdown.open .btn-primary.btn-outline:hover{background:#1e40af;border:1px solid #1e40af;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-primary.btn-outline.btn-loading,.btn-primary.btn-outline.btn-loading:active,.btn-primary.btn-outline.btn-loading:active:focus,.btn-primary.btn-outline.btn-loading:disabled,.btn-primary.btn-outline.btn-loading:disabled:hover,.btn-primary.btn-outline.btn-loading:focus,.btn-primary.btn-outline.btn-loading:hover{background:#2563eb;border:1px solid #2563eb;-webkit-box-shadow:none;box-shadow:none;color:transparent}.form-social-auth .row{margin-bottom:-6px;margin-top:-6px}.form-social-auth .btn{margin:6px 0}input.form-control,textarea.form-control{border-color:#ced0da;box-shadow:inset 0 0 0 1px #ced0da}input.form-control:focus,textarea.form-control:focus{border-color:#66afe9;box-shadow:inset 0 0 0 1px #66afe9}.has-error input.form-control{border-color:#ff5630;box-shadow:inset 0 0 0 1px #ff5630}.has-error input.form-control:focus{border-color:#ffa996;box-shadow:inset 0 0 0 1px #ffa996}.has-success input.form-control{border-color:#36b37e;box-shadow:inset 0 0 0 1px #36b37e}.has-success input.form-control:focus{border-color:#79d6af;box-shadow:inset 0 0 0 1px #79d6af}.password-strength{margin-top:10px}.password-strength .text-small{color:#3462af;font-size:12px;margin-top:4px}.password-strength .progress{margin:0}.auth-message{background:#091e42;box-shadow:0 8px 10px 1px rgba(0,0,0,.04),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.06);padding:80px 0}.auth-message p{color:#fff}.auth-message .btn{background:#f4f5f7;border-color:#f4f5f7;color:#172b4d}.auth-message .btn:focus,.auth-message .btn:hover{background:#dfe1e6;border-color:#dfe1e6;color:#172b4d}.auth-message .btn:active{background:#b3bac5;border-color:#b3bac5;color:#172b4d}.dropdown-menu{border:none;box-shadow:0 4px 5px 0 rgba(0,0,0,.04),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.06)}.user-dropdown .dropdown-header strong{color:#172b4d;display:block;font-weight:700}.user-dropdown .dropdown-header .user-stats{font-size:12px;margin-top:10px}.user-dropdown .dropdown-header .user-stats .material-icon{bottom:1px;font-size:14px;height:14px;margin-right:3px;position:relative;width:14px}.user-dropdown .guest-preview{padding-bottom:10px}.user-dropdown .badge{background-color:#ff5630}.user-dropdown .btn-link:active .badge,.user-dropdown .btn-link:focus .badge,.user-dropdown .btn-link:hover .badge,.user-dropdown a:active .badge,.user-dropdown a:focus .badge,.user-dropdown a:hover .badge{background-color:#fff;color:#ff5630}.mobile-dropdown.open{margin:0}.misago-footer{margin-top:40px}.misago-footer .footer-content{border-top:1px solid #ebecf0;color:#a5adba;padding-top:20px}@media screen and (max-width:767px){.misago-footer .footer-content{text-align:center}.misago-footer .footer-content .site-footnote{clear:both;margin-bottom:15px}}.misago-footer .footer-content a,.misago-footer .footer-content a:link,.misago-footer .footer-content a:visited{color:#a5adba}.misago-footer .footer-content a:focus,.misago-footer .footer-content a:hover{color:#7a8699}.misago-footer .footer-content .misago-branding,.misago-footer .footer-content .misago-branding:link,.misago-footer .footer-content .misago-branding:visited{color:#a5adba}.misago-footer .footer-content .misago-branding:focus,.misago-footer .footer-content .misago-branding:hover{color:#7a8699}.list-group{border-radius:3px}.list-group .list-group-item{border-left-color:#ebecf0;border-right-color:#ebecf0}.list-group .list-group-item:first-child{border-top-color:#ebecf0}.list-group .list-group-item:last-child{border-bottom-color:#ebecf0}.list-group-item.empty-message{padding-bottom:20px;padding-top:20px;text-align:center}.list-group-item.empty-message p{margin:10px 0}.nav-side{-webkit-box-shadow:none;box-shadow:none}.nav-side>.list-group-item{border-left:none;border-right:none;margin-bottom:1px}.nav-side>.list-group-item:first-child{border-top:none}.nav-side>.list-group-item:last-child{border-bottom:none}.nav-side>.list-group-item,.nav-side>.list-group-item:link,.nav-side>.list-group-item:visited{background:#f4f5f7;border:none;color:#172b4d}.nav-side>.list-group-item:active,.nav-side>.list-group-item:focus,.nav-side>.list-group-item:hover{background:#ebecf0;color:#172b4d}.nav-side>.list-group-item.active,.nav-side>.list-group-item.active:active,.nav-side>.list-group-item.active:focus,.nav-side>.list-group-item.active:hover,.nav-side>.list-group-item.active:link,.nav-side>.list-group-item.active:visited{background:#091e42;color:#fff;font-weight:700}.nav-side>.list-group-item.active .badge,.nav-side>.list-group-item.active:active .badge,.nav-side>.list-group-item.active:focus .badge,.nav-side>.list-group-item.active:hover .badge,.nav-side>.list-group-item.active:link .badge,.nav-side>.list-group-item.active:visited .badge{background:#f4f5f7;color:#172b4d}.username-history .user-avatar{border-radius:4px}.panel{border:none;border-radius:4px}.panel .panel-footer,.panel .panel-heading{background:#fff}.panel .panel-title{color:#5e6c84}.panel .form-group+.form-group{margin-top:20px}.panel .panel-body>.form-group:first-child{margin-top:10px}.panel fieldset{margin-top:20px}.panel fieldset:first-child{margin-top:0}.panel fieldset legend{border:none;color:#5e6c84;font-weight:300}.panel-message-body .message-icon{color:#2563eb}.panel-form{border:1px solid #ebecf0;box-shadow:none}.panel-form .panel-footer,.panel-form .panel-heading{border-color:#ebecf0}.poll-form .panel{margin:0}.help-block,.help-block .text-small{color:#7a869a}.panel-participants{border:1px solid #ebecf0}.participant-card .btn-user{border:0!important}.participant-card .dropdown-header-owner{color:#2563eb}.participant-card .dropdown-header-owner .material-icon{font-size:14px;height:14px;line-height:14px;width:14px}.participant-card .dropdown-header-owner .icon-text{margin-left:4px;position:relative;top:2px}.panel-participants p{color:#7a869a}@media screen and (max-width:767px){.panel-participants p{margin-top:10px;text-align:center}}.panel-poll{border:1px solid #ebecf0}.panel-poll .poll-select-choices{margin-top:-10px}.panel-poll .poll-details{color:#7a869a;font-size:12px;margin-bottom:20px}.panel-poll .progress{margin-bottom:5px;margin-top:6.66666667px}.panel-poll .poll-chart{color:#7a869a;font-size:12px}.panel-poll .poll-options{margin-top:20px}#posting-placeholder{background-color:#fafbfc}.posting-message .material-icon{color:#2563eb}.posting-message .btn{margin-top:20px}.panel-post{background:#fff;border:1px solid #ddd}.post-side{color:#7a869a}.post-side .poster-avatar{border-radius:4px}.post-side .user-title,.post-side .user-title a,.post-side .user-title a:active,.post-side .user-title a:focus,.post-side .user-title a:hover,.post-side .user-title a:link,.post-side .user-title a:visited{color:#5e6c84}.post-heading .label-unread{background-color:#2563eb;margin-right:16px}.post-heading .label-protected{margin-left:24px;position:relative;top:1px}.post-heading .label-protected .material-icon{font-size:16px;line-height:16px;margin-right:2px;position:relative;top:-1px}.post-heading>.btn-link{padding-left:0;padding-right:0}.post-heading>.btn-link,.post-heading>.btn-link:link,.post-heading>.btn-link:visited{color:#7a869a}.post-heading>.btn-link:active,.post-heading>.btn-link:focus,.post-heading>.btn-link:focus:active,.post-heading>.btn-link:hover{color:#172b4d;text-decoration:none}.post-heading .btn-see-edits{margin-left:24px}.post-status-message{border-radius:4px;margin-top:10px;padding:6px 12px}@media screen and (max-width:767px){.post-status-message{font-size:12px}.post-status-message .material-icon{margin-top:3px}.post-status-message p{margin-top:0}}.post-body:last-child{padding-bottom:10px}.post-attachments{background-color:#ebecf0;border:none;border-radius:4px;margin-bottom:30px}.post-attachments:last-child{margin-bottom:10px}@media screen and (max-width:767px){.post-attachments{border-radius:0;margin:0 -15px 20px}}.post-footer>.btn-link{padding-left:0;padding-right:0}.post-footer>.btn-link,.post-footer>.btn-link:link,.post-footer>.btn-link:visited{color:#7a869a}.post-footer>.btn-link:active,.post-footer>.btn-link:focus,.post-footer>.btn-link:focus:active,.post-footer>.btn-link:hover{color:#172b4d;text-decoration:none}.post-footer p{color:#7a869a;font-size:12px}.post-body-hidden,.post-body-invalid{padding-bottom:10px;padding-top:10px}.post-body-hidden .lead,.post-body-invalid .lead{margin-bottom:10px}.post-body-hidden .text-muted,.post-body-invalid .text-muted{font-size:12px;margin-bottom:0}.post-hidden{filter:alpha(opacity=75);opacity:.75}.post-feed .panel-body{padding-bottom:0}.post-feed .post-body{max-height:300px;overflow-y:hidden;padding-bottom:20px;padding-top:0;position:relative}.post-feed .post-body:after{bottom:0;box-shadow:0 0 16px 16px #fff;color:transparent;content:"-";display:block;height:0;position:absolute;width:100%}.posts-list .event .event-label{margin-bottom:5px}.posts-list .event .label-unread{background-color:#2563eb;color:#fff}.posts-list .event-info .btn-link,.posts-list .event-info a,.posts-list .event-info a:link,.posts-list .event-info a:visited{color:#5e6c84}.posts-list .event-info .btn-link:active,.posts-list .event-info .btn-link:focus,.posts-list .event-info .btn-link:focus:active,.posts-list .event-info a:active,.posts-list .event-info a:focus,.posts-list .event-info a:focus:active{color:#172b4d}.posts-list .event-hidden{filter:alpha(opacity=33);opacity:.33}.user-card{background:#f4f5f7}.user-card-avatar img,.user-card-small-avatar img{border-radius:4px}.user-card-avatar{margin:20px 0}.user-card-avatar img{height:150px;width:150px}.user-card-username a,.user-card-username a:active,.user-card-username a:focus,.user-card-username a:hover,.user-card-username a:link,.user-card-username a:visited{color:#172b4d;font-size:18px;font-weight:700}.user-card-title a,.user-card-title a:link,.user-card-title a:visited,.user-card-title span{color:#5e6c84}.user-card-title a:active,.user-card-title a:focus,.user-card-title a:hover{color:#172b4d}@media screen and (min-width:768px){.user-card-stats{margin-top:20px}}.user-card-stats ul{margin:0}.user-card-stats li{color:#7a869a;display:inline-block;font-size:12px;margin-right:12px}@media screen and (min-width:768px){.user-card-stats li{margin:0 6px}}.user-card-stats li.user-stat-empty{display:none}@media screen and (min-width:768px){li.user-stat-divider{display:block;margin:0}}@media screen and (max-width:767px){li.user-stat-divider{display:none}}@media screen and (min-width:768px){.user-card-stats{min-height:60px}}@media screen and (max-width:767px){.user-card-left{padding-right:0}}.progress,.progress .progress-bar{-webkit-box-shadow:none;box-shadow:none;height:8px}.misago-markup img{border-radius:4px}.misago-markup .spoiler-body{background:transparent;color:#172b4d;-webkit-filter:blur(5px);-moz-filter:blur(5px);-o-filter:blur(5px);-ms-filter:blur(5px);filter:blur(5px)}.misago-markup .spoiler-block.revealed .spoiler-body{-webkit-filter:none;-moz-filter:none;-o-filter:none;-ms-filter:none;filter:none}.misago-markup .spoiler-overlay{align-items:center;background:hsla(0,0%,100%,.1);display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.misago-markup .spoiler-reveal{background-color:#ebecf0;border-color:#ccc;color:#172b4d}.misago-markup .spoiler-reveal.focus,.misago-markup .spoiler-reveal:focus{background-color:#ced0da;border-color:#8c8c8c;color:#172b4d}.misago-markup .spoiler-reveal:hover{background-color:#ced0da;border-color:#adadad;color:#172b4d}.misago-markup .spoiler-reveal.active,.misago-markup .spoiler-reveal:active,.open>.dropdown-toggle.misago-markup .spoiler-reveal{background-color:#ced0da;background-image:none;border-color:#adadad;color:#172b4d}.misago-markup .spoiler-reveal.active.focus,.misago-markup .spoiler-reveal.active:focus,.misago-markup .spoiler-reveal.active:hover,.misago-markup .spoiler-reveal:active.focus,.misago-markup .spoiler-reveal:active:focus,.misago-markup .spoiler-reveal:active:hover,.open>.dropdown-toggle.misago-markup .spoiler-reveal.focus,.open>.dropdown-toggle.misago-markup .spoiler-reveal:focus,.open>.dropdown-toggle.misago-markup .spoiler-reveal:hover{background-color:#b9bdcb;border-color:#8c8c8c;color:#172b4d}.misago-markup .spoiler-reveal.disabled.focus,.misago-markup .spoiler-reveal.disabled:focus,.misago-markup .spoiler-reveal.disabled:hover,.misago-markup .spoiler-reveal[disabled].focus,.misago-markup .spoiler-reveal[disabled]:focus,.misago-markup .spoiler-reveal[disabled]:hover,fieldset[disabled] .misago-markup .spoiler-reveal.focus,fieldset[disabled] .misago-markup .spoiler-reveal:focus,fieldset[disabled] .misago-markup .spoiler-reveal:hover{background-color:#ebecf0;border-color:#ccc}.misago-markup .spoiler-reveal .badge{background-color:#172b4d;color:#ebecf0}.misago-markup .spoiler-reveal,.misago-markup .spoiler-reveal.disabled,.misago-markup .spoiler-reveal.disabled:active,.misago-markup .spoiler-reveal.disabled:hover,.misago-markup .spoiler-reveal:disabled,.misago-markup .spoiler-reveal:disabled:hover{background:#ebecf0;border:1px solid #ebecf0;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.misago-markup .spoiler-reveal.disabled,.misago-markup .spoiler-reveal.disabled:active,.misago-markup .spoiler-reveal.disabled:hover,.misago-markup .spoiler-reveal:disabled,.misago-markup .spoiler-reveal:disabled:hover{filter:alpha(opacity=25);opacity:.25}.misago-markup .spoiler-reveal:focus,.misago-markup .spoiler-reveal:hover{background:#dfe1e6;border:1px solid #dfe1e6;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.dropdown.open .dropdown-toggle .misago-markup .spoiler-reveal,.dropdown.open .dropdown-toggle .misago-markup .spoiler-reveal:active:focus,.dropdown.open .dropdown-toggle .misago-markup .spoiler-reveal:focus,.dropdown.open .dropdown-toggle .misago-markup .spoiler-reveal:hover,.misago-markup .spoiler-reveal:active,.misago-markup .spoiler-reveal:active:focus{background:#c1c7d0;border:1px solid #c1c7d0;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.misago-markup .spoiler-reveal.btn-loading,.misago-markup .spoiler-reveal.btn-loading:active,.misago-markup .spoiler-reveal.btn-loading:active:focus,.misago-markup .spoiler-reveal.btn-loading:disabled,.misago-markup .spoiler-reveal.btn-loading:disabled:hover,.misago-markup .spoiler-reveal.btn-loading:focus,.misago-markup .spoiler-reveal.btn-loading:hover{color:transparent}.misago-markup .spoiler-reveal,.misago-markup .spoiler-reveal:active,.misago-markup .spoiler-reveal:hover{border-radius:4px;box-shadow:0 0 0 4px #fff;padding:6px 12px}.modal-header{background:#fff;border-bottom-color:#ced0da;border-radius:6px 6px 0 0;color:#172b4d}.modal-header .close{color:#172b4d;font-size:24px;line-height:24px;padding:0 6px;text-shadow:none}.modal-message .message-icon{color:#2563eb}.modal-body>.form-group{margin:20px 0}.modal-body>.form-group:first-child{margin-top:0}.modal-body>.form-group:last-child{margin-bottom:0}.modal-sign-in .modal-body{padding-bottom:0;padding-top:0}.modal-sign-in .modal-body>.form-group{margin:20px 0}.legal-footnote label{font-weight:700}.legal-footnote .help-block{color:#ff5630;margin-left:20px}.modal-avatar-index .avatar-preview{background:#fff;border-radius:6px}.modal-avatar-crop .cropit-preview{background:#fff;margin:20px 0}.modal-avatar-crop .cropit-image-zoom-input{margin-bottom:20px;margin-top:40px}.modal-post-likers .media{border-bottom:1px solid #ebecf0;padding-bottom:15px}.modal-post-likers .media img{border-radius:4px;height:40px;width:40px}.modal-post-likers .media:last-child{border:none;padding-bottom:0}.well{border:1px solid #ddd}.active-posters .rank-user-avatar img{border-radius:4px}.active-posters .user-details{color:#7a869a}.active-posters .user-details a.rank-name,.active-posters .user-details a.rank-name:link,.active-posters .user-details a.rank-name:visited{color:#5e6c84;font-weight:400}.active-posters .user-details a.rank-name:active,.active-posters .user-details a.rank-name:focus,.active-posters .user-details a.rank-name:hover{color:#172b4d}.active-posters .user-details span.rank-name{color:#5e6c84;font-weight:400}.active-posters small{color:#7a869a}.page-error .message-icon{color:#ef5350}.page-message .message-icon,.page-message-info .message-icon{color:#2563eb}.page-message-success .message-icon{color:#81c784}.page-account-settings .help-block a,.page-account-settings .help-block a:link,.page-account-settings .help-block a:visited{color:#5e6c84}.page-account-settings .help-block a:active,.page-account-settings .help-block a:focus,.page-account-settings .help-block a:focus:active,.page-account-settings .help-block a:hover{color:#172b4d}.panel-profile-details-group.panel{border:1px solid #ebecf0}.panel-profile-details-group.panel .form-group{margin:0}.panel-profile-details-group .form-control-static p:last-child{margin-bottom:0}.post-primary .panel-post{border-color:#a5b4fc}.post-primary .user-title,.post-primary .user-title a,.post-primary .user-title a:active,.post-primary .user-title a:focus,.post-primary .user-title a:hover,.post-primary .user-title a:link,.post-primary .user-title a:visited{color:#6366f1}.post-success .panel-post{border-color:#00c853}.post-success .user-title,.post-success .user-title a,.post-success .user-title a:active,.post-success .user-title a:focus,.post-success .user-title a:hover,.post-success .user-title a:link,.post-success .user-title a:visited{color:#388e3c}.post-warning .panel-post{border-color:#ffab40}.post-warning .user-title,.post-warning .user-title a,.post-warning .user-title a:active,.post-warning .user-title a:focus,.post-warning .user-title a:hover,.post-warning .user-title a:link,.post-warning .user-title a:visited{color:#ff6d00}.post-danger .panel-post{border-color:#ff8a80}.post-danger .user-title,.post-danger .user-title a,.post-danger .user-title a:active,.post-danger .user-title a:focus,.post-danger .user-title a:hover,.post-danger .user-title a:link,.post-danger .user-title a:visited{color:#d50000}.user-card-primary .panel-body{background:#fff;border:2px solid #a5b4fc;border-radius:4px;padding:13px}.user-card-primary .user-card-title,.user-card-primary .user-card-title a.user-title,.user-card-primary .user-card-title a.user-title:active,.user-card-primary .user-card-title a.user-title:focus,.user-card-primary .user-card-title a.user-title:hover,.user-card-primary .user-card-title a.user-title:link,.user-card-primary .user-card-title a.user-title:visited{color:#6366f1}.user-card-success .panel-body{background:#fff;border:2px solid #00c853;border-radius:4px;padding:13px}.user-card-success .user-card-title,.user-card-success .user-card-title a.user-title,.user-card-success .user-card-title a.user-title:active,.user-card-success .user-card-title a.user-title:focus,.user-card-success .user-card-title a.user-title:hover,.user-card-success .user-card-title a.user-title:link,.user-card-success .user-card-title a.user-title:visited{color:#388e3c}.user-card-warning .panel-body{background:#fff;border:2px solid #ffab40;border-radius:4px;padding:13px}.user-card-warning .user-card-title,.user-card-warning .user-card-title a.user-title,.user-card-warning .user-card-title a.user-title:active,.user-card-warning .user-card-title a.user-title:focus,.user-card-warning .user-card-title a.user-title:hover,.user-card-warning .user-card-title a.user-title:link,.user-card-warning .user-card-title a.user-title:visited{color:#ff6d00}.user-card-danger .panel-body{background:#fff;border:2px solid #ff8a80;border-radius:4px;padding:13px}.user-card-danger .user-card-title,.user-card-danger .user-card-title a.user-title,.user-card-danger .user-card-title a.user-title:active,.user-card-danger .user-card-title a.user-title:focus,.user-card-danger .user-card-title a.user-title:hover,.user-card-danger .user-card-title a.user-title:link,.user-card-danger .user-card-title a.user-title:visited{color:#d50000}.list-group .list-group-rank-primary{border-left:4px solid #a5b4fc;padding-left:11px}.list-group .list-group-rank-primary a.rank-name,.list-group .list-group-rank-primary a.rank-name:active,.list-group .list-group-rank-primary a.rank-name:focus,.list-group .list-group-rank-primary a.rank-name:hover,.list-group .list-group-rank-primary a.rank-name:link,.list-group .list-group-rank-primary a.rank-name:visited,.list-group .list-group-rank-primary span.rank-name{color:#6366f1}.list-group .list-group-rank-success{border-left:4px solid #9ccc65;padding-left:11px}.list-group .list-group-rank-success a.rank-name,.list-group .list-group-rank-success a.rank-name:active,.list-group .list-group-rank-success a.rank-name:focus,.list-group .list-group-rank-success a.rank-name:hover,.list-group .list-group-rank-success a.rank-name:link,.list-group .list-group-rank-success a.rank-name:visited,.list-group .list-group-rank-success span.rank-name{color:#388e3c}.list-group .list-group-rank-warning{border-left:4px solid #ff7043;padding-left:11px}.list-group .list-group-rank-warning a.rank-name,.list-group .list-group-rank-warning a.rank-name:active,.list-group .list-group-rank-warning a.rank-name:focus,.list-group .list-group-rank-warning a.rank-name:hover,.list-group .list-group-rank-warning a.rank-name:link,.list-group .list-group-rank-warning a.rank-name:visited,.list-group .list-group-rank-warning span.rank-name{color:#ff6d00}.list-group .list-group-rank-danger{border-left:4px solid #f44336;padding-left:11px}.list-group .list-group-rank-danger a.rank-name,.list-group .list-group-rank-danger a.rank-name:active,.list-group .list-group-rank-danger a.rank-name:focus,.list-group .list-group-rank-danger a.rank-name:hover,.list-group .list-group-rank-danger a.rank-name:link,.list-group .list-group-rank-danger a.rank-name:visited,.list-group .list-group-rank-danger span.rank-name{color:#d50000}.page-header-rank-primary .user-rank,.page-header-rank-primary .user-rank a,.page-header-rank-primary .user-rank a:active,.page-header-rank-primary .user-rank a:focus,.page-header-rank-primary .user-rank a:hover,.page-header-rank-primary .user-rank a:link,.page-header-rank-primary .user-rank a:visited{color:#6366f1}.page-header-rank-success .user-rank,.page-header-rank-success .user-rank a,.page-header-rank-success .user-rank a:active,.page-header-rank-success .user-rank a:focus,.page-header-rank-success .user-rank a:hover,.page-header-rank-success .user-rank a:link,.page-header-rank-success .user-rank a:visited{color:#388e3c}.page-header-rank-warning .user-rank,.page-header-rank-warning .user-rank a,.page-header-rank-warning .user-rank a:active,.page-header-rank-warning .user-rank a:focus,.page-header-rank-warning .user-rank a:hover,.page-header-rank-warning .user-rank a:link,.page-header-rank-warning .user-rank a:visited{color:#ff6d00}.page-header-rank-danger .user-rank,.page-header-rank-danger .user-rank a,.page-header-rank-danger .user-rank a:active,.page-header-rank-danger .user-rank a:focus,.page-header-rank-danger .user-rank a:hover,.page-header-rank-danger .user-rank a:link,.page-header-rank-danger .user-rank a:visited{color:#d50000}.d-js-block,.d-js-flex{display:none}.misago-javascript .d-js-block{display:block}.misago-javascript .d-js-flex{display:flex} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{background:transparent!important;box-shadow:none!important;color:#000!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:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}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}}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:10px}body{background-color:#fff;color:#172b4d;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#0065ff;text-decoration:none}a:focus,a:hover{color:#0747a6;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{background-color:#fff;border:1px solid #ddd;border-radius:4px;display:inline-block;height:auto;line-height:1.42857143;max-width:100%;padding:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{border:0;border-top:1px solid #ebecf0;margin-bottom:20px;margin-top:20px}.sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:inherit;font-weight:500;line-height:1.1}.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{color:#7a869a;font-weight:400;line-height:1}.h1,.h2,.h3,h1,h2,h3{margin-bottom:10px;margin-top:20px}.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-bottom:10px;margin-top: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{font-size:16px;font-weight:300;line-height:1.4;margin-bottom:20px}@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:#7a869a}.text-primary{color:#2563eb}a.text-primary:focus,a.text-primary:hover{color:#134cca}.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{background-color:#2563eb;color:#fff}a.bg-primary:focus,a.bg-primary:hover{background-color:#134cca}.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}.page-header{border-bottom:1px solid #ebecf0;margin:40px 0 20px;padding-bottom:9px}ol,ul{margin-bottom:10px;margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-inline,.list-unstyled{list-style:none;padding-left:0}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-bottom:20px;margin-top:0}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:700px){.dl-horizontal dt{clear:left;float:left;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap;width:160px}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{border-left:5px solid #ebecf0;font-size:17.5px;margin:0 0 20px;padding:10px 20px}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{color:#7a869a;display:block;font-size:80%;line-height:1.42857143}blockquote .small:before,blockquote footer:before,blockquote small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{border-left:0;border-right:5px solid #ebecf0;padding-left:0;padding-right:15px;text-align:right}.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{font-style:normal;line-height:1.42857143;margin-bottom:20px}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Courier New,monospace}code{background-color:#f9f2f4;border-radius:4px;color:#c7254e}code,kbd{font-size:90%;padding:2px 4px}kbd{background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);color:#fff}kbd kbd{box-shadow:none;font-size:100%;font-weight:700;padding:0}pre{word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px;color:#344563;display:block;font-size:13px;line-height:1.42857143;margin:0 0 10px;padding:9.5px;word-break:break-all}pre code{background-color:transparent;border-radius:0;color:inherit;font-size:inherit;padding:0;white-space:pre-wrap}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-left:auto;margin-right: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-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.row-no-gutters{margin-left:0;margin-right:0}.row-no-gutters [class*=col-]{padding-left:0;padding-right:0}.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{min-height:1px;padding-left:15px;padding-right:15px;position:relative}.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}}table{background-color:transparent}table col[class*=col-]{display:table-column;float:none;position:static}table td[class*=col-],table th[class*=col-]{display:table-cell;float:none;position:static}caption{color:#7a869a;padding-bottom:8px;padding-top:8px}caption,th{text-align:left}.table{margin-bottom:20px;max-width:100%;width:100%}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{border-top:1px solid #ddd;line-height:1.42857143;padding:8px;vertical-align:top}.table>thead>tr>th{border-bottom:2px solid #ddd;vertical-align:bottom}.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-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{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;margin-bottom:15px;overflow-y:hidden;width:100%}.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{margin:0;min-width:0}fieldset,legend{border:0;padding:0}legend{border-bottom:1px solid #e5e5e5;color:#344563;display:block;font-size:21px;line-height:inherit;margin-bottom:20px;width:100%}label{display:inline-block;font-weight:700;margin-bottom:5px;max-width:100%}input[type=search]{-webkit-appearance:none;appearance:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{line-height:normal;margin:4px 0 0;margin-top:1px\9}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}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{padding-top:7px}.form-control,output{color:#172b4d;display:block;font-size:14px;line-height:1.42857143}.form-control{background-color:#fff;background-image:none;border:1px solid #ced0da;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);height:34px;padding:6px 12px;-webkit-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-o-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}.form-control:focus{border-color:#66afe9;-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);outline:0}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#ebecf0;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=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{display:block;margin-bottom:10px;margin-top:10px;position:relative}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.checkbox label,.radio label{cursor:pointer;font-weight:400;margin-bottom:0;min-height:20px;padding-left:20px}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{margin-left:-20px;margin-top:4px\9;position:absolute}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{cursor:pointer;display:inline-block;font-weight:400;margin-bottom:0;padding-left:20px;position:relative;vertical-align:middle}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-left:10px;margin-top:0}.form-control-static{margin-bottom:0;min-height:34px;padding-bottom:7px;padding-top:7px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{border-radius:3px;font-size:12px;height:30px;line-height:1.5;padding:5px 10px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{border-radius:3px;font-size:12px;height:30px;line-height:1.5;padding:5px 10px}.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{font-size:12px;height:30px;line-height:1.5;min-height:32px;padding:6px 10px}.input-lg{border-radius:6px;font-size:18px;height:46px;line-height:1.3333333;padding:10px 16px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{border-radius:6px;font-size:18px;height:46px;line-height:1.3333333;padding:10px 16px}.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{font-size:18px;height:46px;line-height:1.3333333;min-height:38px;padding:11px 16px}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{display:block;height:34px;line-height:34px;pointer-events:none;position:absolute;right:0;text-align:center;top:0;width:34px;z-index:2}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{height:46px;line-height:46px;width:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{height:30px;line-height:30px;width:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.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}.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{background-color:#dff0d8;border-color:#3c763d;color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.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{background-color:#fcf8e3;border-color:#8a6d3b;color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.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{background-color:#f2dede;border-color:#a94442;color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{color:#3462af;display:block;margin-bottom:10px;margin-top:5px}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.form-inline .form-control-static{display:inline-block}.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 .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-bottom:0;margin-top: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]{margin-left:0;position:relative}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-bottom:0;margin-top:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{margin-bottom:0;padding-top:7px;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{font-size:18px;padding-top:11px}.form-horizontal .form-group-sm .control-label{font-size:12px;padding-top:6px}}.btn{background-image:none;border:1px solid transparent;border-radius:4px;cursor:pointer;display:inline-block;font-size:14px;font-weight:400;line-height:1.42857143;margin-bottom:0;padding:6px 12px;text-align:center;touch-action:manipulation;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#172b4d;text-decoration:none}.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125);outline:0}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{-webkit-box-shadow:none;box-shadow:none;cursor:not-allowed;filter:alpha(opacity=65);opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{background-color:#ebecf0;border-color:#ccc;color:#172b4d}.btn-default.focus,.btn-default:focus{background-color:#ced0da;border-color:#8c8c8c;color:#172b4d}.btn-default:hover{background-color:#ced0da;border-color:#adadad;color:#172b4d}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-color:#ced0da;background-image:none;border-color:#adadad;color:#172b4d}.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{background-color:#b9bdcb;border-color:#8c8c8c;color:#172b4d}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#ebecf0;border-color:#ccc}.btn-default .badge{background-color:#172b4d;color:#ebecf0}.btn-primary{background-color:#2563eb;border-color:#1555e2;color:#fff}.btn-primary.focus,.btn-primary:focus{background-color:#134cca;border-color:#0a296d;color:#fff}.btn-primary:hover{background-color:#134cca;border-color:#1040aa;color:#fff}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-color:#134cca;background-image:none;border-color:#1040aa;color:#fff}.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{background-color:#1040aa;border-color:#0a296d;color:#fff}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#2563eb;border-color:#1555e2}.btn-primary .badge{background-color:#fff;color:#2563eb}.btn-success{background-color:#22c55e;border-color:#1eaf54;color:#fff}.btn-success.focus,.btn-success:focus{background-color:#1a9a49;border-color:#0b4320;color:#fff}.btn-success:hover{background-color:#1a9a49;border-color:#157b3b;color:#fff}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-color:#1a9a49;background-image:none;border-color:#157b3b;color:#fff}.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{background-color:#157b3b;border-color:#0b4320;color:#fff}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#22c55e;border-color:#1eaf54}.btn-success .badge{background-color:#fff;color:#22c55e}.btn-info{background-color:#4f46e5;border-color:#3a30e2;color:#fff}.btn-info.focus,.btn-info:focus{background-color:#291fd9;border-color:#181280;color:#fff}.btn-info:hover{background-color:#291fd9;border-color:#231aba;color:#fff}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-color:#291fd9;background-image:none;border-color:#231aba;color:#fff}.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{background-color:#231aba;border-color:#181280;color:#fff}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#4f46e5;border-color:#3a30e2}.btn-info .badge{background-color:#fff;color:#4f46e5}.btn-warning{background-color:#ffab00;border-color:#e69a00;color:#fff}.btn-warning.focus,.btn-warning:focus{background-color:#cc8900;border-color:#640;color:#fff}.btn-warning:hover{background-color:#cc8900;border-color:#a87100;color:#fff}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-color:#cc8900;background-image:none;border-color:#a87100;color:#fff}.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{background-color:#a87100;border-color:#640;color:#fff}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#ffab00;border-color:#e69a00}.btn-warning .badge{background-color:#fff;color:#ffab00}.btn-danger{background-color:#ef5350;border-color:#ed3c39;color:#fff}.btn-danger.focus,.btn-danger:focus{background-color:#eb2521;border-color:#98110e;color:#fff}.btn-danger:hover{background-color:#eb2521;border-color:#d51713;color:#fff}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-color:#eb2521;background-image:none;border-color:#d51713;color:#fff}.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{background-color:#d51713;border-color:#98110e;color:#fff}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#ef5350;border-color:#ed3c39}.btn-danger .badge{background-color:#fff;color:#ef5350}.btn-link{border-radius:0;color:#0065ff;font-weight:400}.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{background-color:transparent;color:#0747a6;text-decoration:underline}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#7a869a;text-decoration:none}.btn-group-lg>.btn,.btn-lg{border-radius:6px;font-size:18px;line-height:1.3333333;padding:10px 16px}.btn-group-sm>.btn,.btn-sm{border-radius:3px;font-size:12px;line-height:1.5;padding:5px 10px}.btn-group-xs>.btn,.btn-xs{border-radius:3px;font-size:12px;line-height:1.5;padding:1px 5px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;position:relative;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px dashed;border-top:4px solid\9;display:inline-block;height:0;margin-left:2px;vertical-align:middle;width:0}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{background-clip:padding-box;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);display:none;float:left;font-size:14px;left:0;list-style:none;margin:2px 0 0;min-width:160px;padding:5px 0;position:absolute;text-align:left;top:100%;z-index:1000}.dropdown-menu.pull-right{left:auto;right:0}.dropdown-menu .divider{background-color:#ebecf0;height:1px;margin:9px 0;overflow:hidden}.dropdown-menu>li>a{clear:both;color:#172b4d;display:block;font-weight:400;line-height:1.42857143;padding:3px 20px;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#ebecf0;color:#172b4d;text-decoration:none}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#172b4d;color:#fff;outline:0;text-decoration:none}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#7a869a}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{background-color:transparent;background-image:none;cursor:not-allowed;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);text-decoration:none}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{color:#7a869a;display:block;font-size:12px;line-height:1.42857143;padding:3px 20px;white-space:nowrap}.dropdown-backdrop{bottom:0;left:0;position:fixed;right:0;top:0;z-index:990}.pull-right>.dropdown-menu{left:auto;right:0}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-bottom:4px dashed;border-bottom:4px solid\9;border-top:0;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{bottom:100%;margin-bottom:2px;top:auto}@media (min-width:700px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.nav{list-style:none;margin-bottom:0;padding-left:0}.nav>li,.nav>li>a{display:block;position:relative}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{background-color:#ebecf0;text-decoration:none}.nav>li.disabled>a{color:#7a869a}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{background-color:transparent;color:#7a869a;cursor:not-allowed;text-decoration:none}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#ebecf0;border-color:#0065ff}.nav .nav-divider{background-color:#e5e5e5;height:1px;margin:9px 0;overflow:hidden}.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{border:1px solid transparent;border-radius:4px 4px 0 0;line-height:1.42857143;margin-right:2px}.nav-tabs>li>a:hover{border-color:#ebecf0 #ebecf0 #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{background-color:#fff;border:1px solid;border-color:#ddd #ddd transparent;color:#5e6c84;cursor:default}.nav-tabs.nav-justified{border-bottom:0;width:100%}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{left:auto;top: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{border-radius:4px;margin-right:0}.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>a{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-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{background-color:#0065ff;color:#fff}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-left:0;margin-top:2px}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{left:auto;top: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{border-radius:4px;margin-right:0}.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-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{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.breadcrumb{background-color:#f5f5f5;border-radius:4px;list-style:none;margin-bottom:20px;padding:8px 15px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{color:#ccc;content:"/\00a0";padding:0 5px}.breadcrumb>.active{color:#7a869a}.alert{border:1px solid transparent;border-radius:0;margin-bottom:20px;padding:15px}.alert h4{color:inherit;margin-top:0}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{color:inherit;position:relative;right:-21px;top:-2px}.alert-success{background-color:#00875a;border-color:#00875a;color:#fff}.alert-success hr{border-top-color:#006e49}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#2563eb;border-color:#2563eb;color:#fff}.alert-info hr{border-top-color:#1555e2}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#ff8b00;border-color:#ff8b00;color:#fff}.alert-warning hr{border-top-color:#e67d00}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#de350b;border-color:#de350b;color:#fff}.alert-danger hr{border-top-color:#c62f0a}.alert-danger .alert-link{color:#e6e6e6}.label{border-radius:.25em;color:#fff;display:inline;font-size:75%;font-weight:700;line-height:1;padding:.2em .6em .3em;text-align:center;vertical-align:baseline;white-space:nowrap}a.label:focus,a.label:hover{color:#fff;cursor:pointer;text-decoration:none}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#7a869a}.label-default[href]:focus,.label-default[href]:hover{background-color:#616d80}.label-primary{background-color:#2563eb}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#134cca}.label-success{background-color:#36b37e}.label-success[href]:focus,.label-success[href]:hover{background-color:#2a8c62}.label-info{background-color:#4f46e5}.label-info[href]:focus,.label-info[href]:hover{background-color:#291fd9}.label-warning{background-color:#ffab00}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#cc8900}.label-danger{background-color:#ff5630}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#fc2e00}@-webkit-keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}.progress{background-color:#ebecf0;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);height:20px;margin-bottom:20px;overflow:hidden}.progress-bar{background-color:#2563eb;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);color:#fff;float:left;font-size:12px;height:100%;line-height:20px;text-align:center;-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease;width:0}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#36b37e}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-info{background-color:#4f46e5}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-warning{background-color:#ffab00}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.progress-bar-danger{background-color:#ff5630}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-image:-o-linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 25%,transparent 50%,hsla(0,0%,100%,.15) 50%,hsla(0,0%,100%,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}.btn-group,.btn-group-vertical{display:inline-block;position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{float:left;position:relative}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;max-width:100%;width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-left:0;margin-top:-1px}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:4px;border-top-right-radius:4px}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top-left-radius:0;border-top-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{border-collapse:separate;display:table;table-layout:fixed;width:100%}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.input-group{border-collapse:separate;display:table;position:relative}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{float:left;margin-bottom:0;position:relative;width:100%;z-index:2}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{border-radius:6px;font-size:18px;height:46px;line-height:1.3333333;padding:10px 16px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{border-radius:3px;font-size:12px;height:30px;line-height:1.5;padding:5px 10px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{vertical-align:middle;white-space:nowrap;width:1%}.input-group-addon{background-color:#ebecf0;border:1px solid #ced0da;border-radius:4px;color:#172b4d;font-size:14px;font-weight:400;line-height:1;padding:6px 12px;text-align:center}.input-group-addon.input-sm{border-radius:3px;font-size:12px;padding:5px 10px}.input-group-addon.input-lg{border-radius:6px;font-size:18px;padding:10px 16px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{font-size:0;white-space:nowrap}.input-group-btn,.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px;z-index:2}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-bottom:5px;margin-top:0}.media-list{list-style:none;padding-left:0}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{background-color:#fff;border:1px solid #ebecf0;display:block;margin-bottom:-1px;padding:10px 15px;position:relative}.list-group-item:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.list-group-item:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px;margin-bottom:0}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#ebecf0;color:#7a869a;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#7a869a}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{background-color:#fff;border-color:#ebecf0;color:#0065ff;z-index:2}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#fff}a.list-group-item,button.list-group-item{color:#7a869a}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{background-color:#fff;color:#172b4d;text-decoration:none}button.list-group-item{text-align:left;width:100%}.list-group-item-success{background-color:#dff0d8;color:#3c763d}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{background-color:#d0e9c6;color:#3c763d}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{background-color:#3c763d;border-color:#3c763d;color:#fff}.list-group-item-info{background-color:#d9edf7;color:#31708f}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{background-color:#c4e3f3;color:#31708f}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{background-color:#31708f;border-color:#31708f;color:#fff}.list-group-item-warning{background-color:#fcf8e3;color:#8a6d3b}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{background-color:#faf2cc;color:#8a6d3b}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{background-color:#8a6d3b;border-color:#8a6d3b;color:#fff}.list-group-item-danger{background-color:#f2dede;color:#a94442}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{background-color:#ebcccc;color:#a94442}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{background-color:#a94442;border-color:#a94442;color:#fff}.list-group-item-heading{margin-bottom:5px;margin-top:0}.list-group-item-text{line-height:1.3;margin-bottom:0}.panel{background-color:#fff;border:1px solid transparent;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05);margin-bottom:20px}.panel-body{padding:15px}.panel-heading{border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px;padding:14px 15px}.panel-heading>.dropdown .dropdown-toggle,.panel-title{color:inherit}.panel-title{font-size:16px;margin-bottom:0;margin-top:0}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{background-color:#fff;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-top:1px solid #ebecf0;padding:14px 15px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-radius:0;border-width:1px 0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{border-radius:4px;margin-bottom:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ebecf0}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ebecf0}.panel-default{border-color:#ddd}.panel-default>.panel-heading{background-color:#fff;border-color:#ddd;color:#344563}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{background-color:#344563;color:#fff}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#2563eb}.panel-primary>.panel-heading{background-color:#2563eb;border-color:#2563eb;color:#fff}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2563eb}.panel-primary>.panel-heading .badge{background-color:#fff;color:#2563eb}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2563eb}.panel-success{border-color:#36b37e}.panel-success>.panel-heading{background-color:#dff0d8;border-color:#36b37e;color:#3c763d}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#36b37e}.panel-success>.panel-heading .badge{background-color:#3c763d;color:#dff0d8}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#36b37e}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{background-color:#31708f;color:#d9edf7}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{background-color:#8a6d3b;color:#fcf8e3}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ff5630}.panel-danger>.panel-heading{background-color:#f2dede;border-color:#ff5630;color:#a94442}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ff5630}.panel-danger>.panel-heading .badge{background-color:#a94442;color:#f2dede}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ff5630}.pager{list-style:none;margin:20px 0;padding-left:0;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{background-color:#fff;border:1px solid #ddd;border-radius:15px;display:inline-block;padding:5px 14px}.pager li>a:focus,.pager li>a:hover{background-color:#ebecf0;text-decoration:none}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{background-color:#fff;color:#7a869a;cursor:not-allowed}.pagination{border-radius:4px;display:inline-block;margin:20px 0;padding-left:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{background-color:#fff;border:1px solid #ddd;color:#0065ff;float:left;line-height:1.42857143;margin-left:-1px;padding:6px 12px;position:relative;text-decoration:none}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{background-color:#ebecf0;border-color:#ddd;color:#0747a6;z-index:2}.pagination>li:first-child>a,.pagination>li:first-child>span{border-bottom-left-radius:4px;border-top-left-radius:4px;margin-left:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{background-color:#2563eb;border-color:#2563eb;color:#fff;cursor:default;z-index:3}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{background-color:#fff;border-color:#ddd;color:#7a869a;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{font-size:18px;line-height:1.3333333;padding:10px 16px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{font-size:12px;line-height:1.5;padding:5px 10px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.embed-responsive{display:block;height:0;overflow:hidden;padding:0;position:relative}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{border:0;bottom:0;height:100%;left:0;position:absolute;top:0;width:100%}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{background-color:#fff;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);margin-bottom:20px;min-height:20px;padding:19px}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{border-radius:6px;padding:24px}.well-sm{border-radius:3px;padding:9px}.close{color:#000;filter:alpha(opacity=20);float:right;font-size:21px;font-weight:700;line-height:1;opacity:.2;text-shadow:0 1px 0 #fff}.close:focus,.close:hover{color:#000;cursor:pointer;filter:alpha(opacity=50);opacity:.5;text-decoration:none}button.close{-webkit-appearance:none;appearance:none;background:transparent;border:0;cursor:pointer;padding:0}.badge{background-color:#7a869a;border-radius:10px;color:#fff;display:inline-block;font-size:12px;font-weight:700;line-height:1;min-width:10px;padding:3px 7px;text-align:center;vertical-align:middle;white-space:nowrap}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{padding:1px 5px;top:0}a.badge:focus,a.badge:hover{color:#fff;cursor:pointer;text-decoration:none}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{background-color:#fff;color:#0065ff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.modal,.modal-open{overflow:hidden}.modal{-webkit-overflow-scrolling:touch;bottom:0;display:none;left:0;outline:0;position:fixed;right:0;top:0;z-index:1050}.modal.fade .modal-dialog{-webkit-transform:translateY(-25%);-ms-transform:translateY(-25%);-o-transform:translateY(-25%);transform:translateY(-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0);-ms-transform:translate(0);-o-transform:translate(0);transform:translate(0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{margin:10px;position:relative;width:auto}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0;position:relative}.modal-backdrop{background-color:#091e42;bottom:0;left:0;position:fixed;right:0;top:0;z-index:1040}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{border-bottom:1px solid #ced0da;padding:15px}.modal-header .close{margin-top:-2px}.modal-title{line-height:1.42857143;margin:0}.modal-body{padding:15px;position:relative}.modal-footer{border-top:1px solid #ced0da;padding:15px;text-align:right}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media (min-width:768px){.modal-dialog{margin:30px auto;width:600px}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.agreement-footer:after,.agreement-footer:before,.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{content:" ";display:table}.agreement-footer:after,.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.pager:after,.panel-body: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}.invisible{visibility:hidden}.text-hide{background-color:transparent;border:0;color:transparent;font:0/0 a;text-shadow:none}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.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}@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}}@media screen and (min-width:992px){.md-margin-top-no{margin-top:0!important}}@media screen and (min-width:768px) and (max-width:991px){.sm-margin-top{margin-top:20px!important}.sm-margin-top-no{margin-top:0!important}.sm-margin-top-half{margin-top:6.6px!important}.sm-align-row-buttons{margin-top:5px!important}}@media screen and (max-width:767px){.xs-margin-top{margin-top:20px!important}.xs-margin-top-half{margin-top:6.6px!important}}.flex-row{display:block;margin:0 -15px}.flex-row-section{align-items:center;display:flex;flex:1}.flex-row-section+.flex-row-section{margin-top:20px}.flex-row-col{flex:1;padding:0 15px}@media screen and (min-width:768px){.flex-row{align-items:center;display:flex}.flex-row-section+.flex-row-section{margin:0}.flex-row-col,.flex-row-section{align-items:center;flex:0}.flex-row-section.flex-row-section-auto,.flex-row-section.flex-row-section-auto>.flex-row-col{flex:1}}.flex-row-col-shrink{flex:0!important}.d-none{display:none!important}@media screen and (max-width:767px){.w-100-xs{width:100%}.flex-order-first-xs{order:-9999}.flex-order-last-xs{order:9999}}.atwho-view ul li img{border-radius:3px;height:20px;margin-right:4.66666667px;width:20px}.auth-message{background-color:#ebecf0;left:0;padding:20px 0;position:fixed;top:-100%;transition:top .3s ease;width:100%;z-index:1070}.auth-message.show{bottom:auto;top:0}.auth-message p{color:#172b4d;padding:5px 0}@media screen and (max-width:991px){.auth-message{text-align:center}.auth-message .btn{font-size:18px;padding:10px 16px}}@keyframes misago-ajax-loader{0%{width:0}3%{width:50%}50%{width:75%}to{width:100%}}#misago-ajax-loader{position:fixed;width:100%;z-index:1080}#misago-ajax-loader div{background-color:#2563eb}#misago-ajax-loader.busy div{animation-duration:600s;animation-name:misago-ajax-loader;height:4px;width:0}#misago-ajax-loader.complete div{height:4px;opacity:0;transition:width 1s;transition:opacity 1s;width:100}.alert{font-size:18px;margin-bottom:0;text-align:center}#misago-snackbars:empty{display:none}#misago-snackbars{display:flex;justify-content:center;padding:0 24px;position:fixed;top:80px;width:100%;z-index:10000}.snackbar{background-color:#111;border-radius:4px;color:#fff;font-size:14px;opacity:0;padding:6px 12px;position:relative;top:-12px}@media screen and (min-width:720px){.snackbar{border-radius:4px;font-size:18px;padding:8px 16px}}.snackbar.snackbar-success{background-color:#16a34a;color:#fff}.snackbar.snackbar-warning{background-color:#fef08a;color:#000}.snackbar.snackbar-danger{background-color:#dc2626;color:#fff}.snackbar.in{opacity:1;top:0;transition:.3s ease}.snackbar.out{opacity:0;transition:.3s ease}.alerts-snackbar{font-size:18px;pointer-events:none;position:fixed;text-align:center;top:-100%;transition:top .3s ease;width:100%;z-index:1060}.alerts-snackbar.in{top:0;transition:top .2s ease}.alerts-snackbar p{border-radius:0 0 4px 4px;display:inline-block;margin:0;pointer-events:all}.agreement-overlay{background-color:rgba(9,30,66,.5);height:100%;left:0;overflow-x:scroll;position:fixed;top:0;width:100%;z-index:1060}.agreement-overlay .container{max-width:900px;padding:20px 30px}.agreement-content{background-clip:padding-box;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0;padding:10px 16px}.agreement-header{border-bottom:1px solid #ebecf0;padding:10px 0}.agreement-header h2{margin-top:0}.agreement-header p{margin:0;padding:0}.agreement-body{padding:20px 0}.agreement-body p.lead{margin:0;padding:0}.agreement-footer{border-top:1px solid #ced0da;padding:10px 0;text-align:right}.agreement-footer .btn+.btn{margin-bottom:0;margin-left:5px}.agreement-footer .btn-group .btn+.btn{margin-left:-1px}.agreement-footer .btn-block+.btn-block{margin-left:0}body.agreement-overlay-visible{overflow:hidden}.loader{height:49px;text-align:center;width:100%}.loader.loader-spaced{margin:40px 0}.loader-spinning-wheel{animation:cssload-spin 575ms linear infinite;-o-animation:cssload-spin 575ms linear infinite;-ms-animation:cssload-spin 575ms linear infinite;-webkit-animation:cssload-spin 575ms linear infinite;-moz-animation:cssload-spin 575ms linear infinite;border-color:#7a869a transparent;border-radius:50%;border-style:solid;border-width:3px;height:49px;margin:0 auto;width:49px}@keyframes cssload-spin{to{transform:rotate(1turn)}}@-o-keyframes cssload-spin{to{-o-transform:rotate(1turn);transform:rotate(1turn)}}@-ms-keyframes cssload-spin{to{-ms-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes cssload-spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-moz-keyframes cssload-spin{to{-moz-transform:rotate(1turn);transform:rotate(1turn)}}.navbar{background-color:#fff;border-bottom:1px solid #e5e7eb;color:#111827;height:60px;position:sticky;top:0;z-index:1030}.navbar-container,.navbar-right{align-items:center;display:flex;height:100%}.navbar-right{margin-left:auto}.navbar-branding{align-items:center;display:flex;margin-right:24px}.navbar-branding-text,.navbar-branding-text:active,.navbar-branding-text:focus,.navbar-branding-text:hover,.navbar-branding-text:link,.navbar-branding-text:visited{color:#374151;font-size:22px;text-decoration:none}.navbar-branding-logo img{height:40px}.navbar-branding-logo-xs{margin-right:12px}.navbar-branding-logo-xs img{height:34px;width:34px}.navbar-extra-menu{display:block;font-size:18px;margin:0;padding:0}.navbar-extra-menu>li,.navbar-extra-menu>li>a{display:inline-block}.navbar-extra-menu a,.navbar-extra-menu a:link,.navbar-extra-menu a:visited{border-radius:4px;color:#172b4d;padding:6px 12px}.navbar-extra-menu a:active,.navbar-extra-menu a:focus,.navbar-extra-menu a:hover{color:#172b4d;text-decoration:none}.navbar-extra-menu a:active{background-color:#e5e7eb}.btn.btn-navbar-icon{align-items:center;display:flex;height:34px;justify-content:center;margin-left:12px;padding:0;position:relative;width:34px}.btn.btn-navbar-icon .material-icon{font-size:24px;line-height:24px;margin:0}.btn.btn-navbar-icon,.btn.btn-navbar-icon:focus,.btn.btn-navbar-icon:hover,.btn.btn-navbar-icon:link,.btn.btn-navbar-icon:visited{background-color:transparent;border-color:transparent;box-shadow:none;color:#374151}.btn.btn-navbar-icon.active,.btn.btn-navbar-icon:active{background-color:#e5e7eb;border-color:#e5e7eb;box-shadow:none;color:#172b4d}.btn-navbar-image{display:inline-block;margin-left:12px;padding:0}.btn-navbar-image img{border-radius:3px;height:34px;width:34px}.navbar-item-badge{background-color:#dc2626;border-radius:4px;color:#fff;font-size:12px;padding:0 5px;position:absolute;right:-3px;top:-3px;z-index:2}.btn-navbar-register,.btn-navbar-sign-in{margin-left:12px}@media screen and (max-width:767px){#navbar-notifications-dropdown,#navbar-private-threads,#navbar-search-dropdown,#navbar-site-nav-dropdown,#navbar-user-nav-dropdown,.btn-navbar-register,.btn-navbar-sign-in,.navbar-extra-menu{display:none}}@media screen and (max-width:420px){#navbar-private-threads{display:none}}@media screen and (min-width:768px){#navbar-notifications-overlay,#navbar-search-overlay,#navbar-site-nav-overlay,#navbar-user-nav-overlay{display:none}}.nav-side>a>.material-icon{bottom:1px;font-size:24px;height:24px;line-height:24px;margin:-5px 10px -5px -5px;position:relative;width:24px}.nav-side>a .badge{position:relative;top:1px}.nav-pills>li>a{align-items:center;display:flex;padding:5px 10px}.nav-pills>li>a .material-icon{margin-right:3px}.nav-pills>li>a,.nav-pills>li>a:link,.nav-pills>li>a:visited{background-color:#ebecf0;color:#344563}.nav-pills>li>a:active,.nav-pills>li>a:focus,.nav-pills>li>a:hover{background-color:#dcdee5;color:#344563}.nav-pills>li.active>a,.nav-pills>li.active>a:active,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:link,.nav-pills>li.active>a:visited{background-color:#344563;color:#fff}.nav-container .btn-block{margin-bottom:20px}.nav-container .nav{margin-bottom:30px;margin-right:-10px}.nav-container .nav-pills,.nav-container li{margin-bottom:10px}.nav-container li{margin-right:10px}.breadcrumbs{display:block;margin-bottom:10px;padding:0}.breadcrumbs-item{display:inline-block;list-style:none;margin-bottom:10px;margin-right:15px;padding:0;white-space:nowrap}.breadcrumbs-item a{align-items:center;display:flex;flex-wrap:nowrap;text-decoration:none}.breadcrumbs-item a,.breadcrumbs-item a:visited{color:#5e6c84}.breadcrumbs-item a:focus,.breadcrumbs-item a:hover{color:#172b4d}.breadcrumbs-item a:focus .breadcrumbs-item-name,.breadcrumbs-item a:hover .breadcrumbs-item-name{text-decoration:underline}.breadcrumbs-item a:active{color:#172b4d}.breadcrumbs-item .material-icon{margin-right:4px}.toolbar-item .breadcrumbs{margin:0;white-space:nowrap;width:100%}.toolbar-item .breadcrumbs-item{margin-bottom:0}.breadcrumbs-compact{display:none}@media screen and (max-width:767px){.breadcrumbs{display:none}.breadcrumbs-compact{display:block}}@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{word-wrap:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga";direction:ltr;display:inline-block;font-family:Material Icons;font-style:normal;font-weight:400;height:1em;letter-spacing:normal;line-height:1;overflow-wrap:normal;text-align:center;text-rendering:optimizeLegibility;text-transform:none;vertical-align:middle;white-space:nowrap;width:1em}.modal-toolbar{background:#ebecf0;border-bottom:1px solid #ced0da;overflow:auto;padding:6px 12px}.modal-toolbar .pull-left{margin-right:8px}.modal-toolbar p{margin-bottom:0;padding:5px 0}@media screen and (max-width:991px){.modal-message{text-align:center}.modal-message .message-icon{margin:30px}.modal-message .message-icon .material-icon{font-size:160px}}@media screen and (min-width:992px){.modal-message .modal-body{padding-bottom:30px;padding-top:20px}.modal-message .message-icon{float:left;left:7px;position:relative}.modal-message .message-icon .material-icon{font-size:50px}.modal-message .message-body{margin-left:75px;margin-top:10px}.modal-message .message-body p{margin-top:20px}.modal-message .message-body .lead{margin-bottom:0;margin-top:0}}.modal-loader{padding:50px 0}.modal-loader .loader{height:80px;text-align:center;width:100%}.modal-loader .loader-spinning-wheel{height:80px;width:80px}.modal-body .form-group{min-height:34px}.list-item-errors{margin-bottom:20px}.list-errored-items li:last-child .list-item-errors{margin-bottom:0}.modal-post-likers .media-list{margin:0}.modal-post-likers .item-title{display:block}.has-feedback .material-icon.form-control-feedback{font-size:1.42857143;line-height:1.42857143;right:24px;top:6px}.well.well-form.well-done{font-size:18px;text-align:center}.well.well-form.well-done .message-icon{font-size:90px;line-height:90px;margin-bottom:10px}.well.well-form.well-done .message-body{margin-bottom:20px}.well.well-form.well-noscript{font-size:18px;text-align:center}.well.well-form.well-noscript .message-icon{font-size:90px;line-height:90px;margin-bottom:10px}.btn.btn-select,.btn.btn-yes-no{background:transparent;border:1px solid #ced0da}.btn.btn-select .material-icon,.btn.btn-yes-no .material-icon{bottom:1px;font-size:20px;height:20px;line-height:20px;margin:-4px 8px -4px 0;position:relative;width:20px}@media screen and (max-width:767px){.btn.btn-yes-no{overflow:auto;width:100%}.btn.btn-yes-no .material-icon{float:left;margin-top:1px}.btn.btn-yes-no .btn-text{display:block;margin-left:30px;text-align:left;white-space:normal}}input.hidden-file-upload{left:-9999px;position:absolute;top:-9999px}.form-search{position:relative}.form-search .form-control{padding-right:30px}.form-search .material-icon{color:#7a869a;font-size:24px;line-height:24px;pointer-events:none;position:absolute;right:5px;top:5px}.btn.btn-loading,.btn.btn-loading:active,.btn.btn-loading:focus,.btn.btn-loading:hover,.btn.btn-loading:link,.btn.btn-loading:visited{color:transparent}.btn.btn-loading .loader,.btn.btn-loading:active .loader,.btn.btn-loading:focus .loader,.btn.btn-loading:hover .loader,.btn.btn-loading:link .loader,.btn.btn-loading:visited .loader{height:20px;margin-top:-20px}.btn.btn-loading .loader>div,.btn.btn-loading:active .loader>div,.btn.btn-loading:focus .loader>div,.btn.btn-loading:hover .loader>div,.btn.btn-loading:link .loader>div,.btn.btn-loading:visited .loader>div{height:20px;width:20px}.btn.btn-loading.btn-default .loader>div{border-bottom-color:#172b4d;border-top-color:#172b4d}.btn.btn-loading.btn-danger .loader>div,.btn.btn-loading.btn-info .loader>div,.btn.btn-loading.btn-primary .loader>div,.btn.btn-loading.btn-success .loader>div,.btn.btn-loading.btn-warning .loader>div{border-bottom-color:#fff;border-top-color:#fff}.btn .material-icon{bottom:1px;margin-right:3px;position:relative}.btn-icon .material-icon{font-size:20px;height:20px;line-height:20px;margin:-1px -4px;width:20px}.btn-icon .btn-text{margin-left:10px}.btn-icon .btn-text-left{margin-right:10px}.btn-block.btn-icon{padding-left:0;padding-right:0}.btn-icons-family .material-icon+.material-icon{margin-left:10px}.btn-sign-in{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-sign-in.focus,.btn-sign-in:focus{background-color:#134cca;border-color:#0c3284;color:#fff}.btn-sign-in:hover{background-color:#134cca;border-color:#1249c1;color:#fff}.btn-sign-in.active,.btn-sign-in:active,.open>.dropdown-toggle.btn-sign-in{background-color:#134cca;background-image:none;border-color:#1249c1;color:#fff}.btn-sign-in.active.focus,.btn-sign-in.active:focus,.btn-sign-in.active:hover,.btn-sign-in:active.focus,.btn-sign-in:active:focus,.btn-sign-in:active:hover,.open>.dropdown-toggle.btn-sign-in.focus,.open>.dropdown-toggle.btn-sign-in:focus,.open>.dropdown-toggle.btn-sign-in:hover{background-color:#1040aa;border-color:#0c3284;color:#fff}.btn-sign-in.disabled.focus,.btn-sign-in.disabled:focus,.btn-sign-in.disabled:hover,.btn-sign-in[disabled].focus,.btn-sign-in[disabled]:focus,.btn-sign-in[disabled]:hover,fieldset[disabled] .btn-sign-in.focus,fieldset[disabled] .btn-sign-in:focus,fieldset[disabled] .btn-sign-in:hover{background-color:#2563eb;border-color:#2563eb}.btn-sign-in .badge{background-color:#fff;color:#2563eb}.btn-register{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-register.focus,.btn-register:focus{background-color:#134cca;border-color:#0c3284;color:#fff}.btn-register:hover{background-color:#134cca;border-color:#1249c1;color:#fff}.btn-register.active,.btn-register:active,.open>.dropdown-toggle.btn-register{background-color:#134cca;background-image:none;border-color:#1249c1;color:#fff}.btn-register.active.focus,.btn-register.active:focus,.btn-register.active:hover,.btn-register:active.focus,.btn-register:active:focus,.btn-register:active:hover,.open>.dropdown-toggle.btn-register.focus,.open>.dropdown-toggle.btn-register:focus,.open>.dropdown-toggle.btn-register:hover{background-color:#1040aa;border-color:#0c3284;color:#fff}.btn-register.disabled.focus,.btn-register.disabled:focus,.btn-register.disabled:hover,.btn-register[disabled].focus,.btn-register[disabled]:focus,.btn-register[disabled]:hover,fieldset[disabled] .btn-register.focus,fieldset[disabled] .btn-register:focus,fieldset[disabled] .btn-register:hover{background-color:#2563eb;border-color:#2563eb}.btn-register .badge{background-color:#fff;color:#2563eb}.btn-muted{border-radius:0;color:#7a869a}.btn-muted,.btn-muted.active,.btn-muted:active,.btn-muted[disabled],fieldset[disabled] .btn-muted{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-muted,.btn-muted:active,.btn-muted:focus,.btn-muted:hover{border-color:transparent}.btn-muted:focus,.btn-muted:hover{background-color:transparent;color:#172b4d}.btn-muted[disabled]:focus,.btn-muted[disabled]:hover,fieldset[disabled] .btn-muted:focus,fieldset[disabled] .btn-muted:hover{color:#7a869a;text-decoration:none}.btn-moderation{background-color:#111;border-color:#111;color:#fff}.btn-moderation.focus,.btn-moderation:focus,.btn-moderation:hover{background-color:#000;border-color:#000;color:#fff}.btn-moderation.active,.btn-moderation:active,.open>.dropdown-toggle.btn-moderation{background-color:#000;background-image:none;border-color:#000;color:#fff}.btn-moderation.active.focus,.btn-moderation.active:focus,.btn-moderation.active:hover,.btn-moderation:active.focus,.btn-moderation:active:focus,.btn-moderation:active:hover,.open>.dropdown-toggle.btn-moderation.focus,.open>.dropdown-toggle.btn-moderation:focus,.open>.dropdown-toggle.btn-moderation:hover{background-color:#000;border-color:#000;color:#fff}.btn-moderation.disabled.focus,.btn-moderation.disabled:focus,.btn-moderation.disabled:hover,.btn-moderation[disabled].focus,.btn-moderation[disabled]:focus,.btn-moderation[disabled]:hover,fieldset[disabled] .btn-moderation.focus,fieldset[disabled] .btn-moderation:focus,fieldset[disabled] .btn-moderation:hover{background-color:#111;border-color:#111}.btn-moderation .badge{background-color:#fff;color:#111}.btn-social-github{background-color:#333;border-color:#333;color:#fff}.btn-social-github.focus,.btn-social-github:focus{background-color:#1a1a1a;border-color:#000;color:#fff}.btn-social-github:hover{background-color:#1a1a1a;border-color:#141414;color:#fff}.btn-social-github.active,.btn-social-github:active,.open>.dropdown-toggle.btn-social-github{background-color:#1a1a1a;background-image:none;border-color:#141414;color:#fff}.btn-social-github.active.focus,.btn-social-github.active:focus,.btn-social-github.active:hover,.btn-social-github:active.focus,.btn-social-github:active:focus,.btn-social-github:active:hover,.open>.dropdown-toggle.btn-social-github.focus,.open>.dropdown-toggle.btn-social-github:focus,.open>.dropdown-toggle.btn-social-github:hover{background-color:#080808;border-color:#000;color:#fff}.btn-social-github.disabled.focus,.btn-social-github.disabled:focus,.btn-social-github.disabled:hover,.btn-social-github[disabled].focus,.btn-social-github[disabled]:focus,.btn-social-github[disabled]:hover,fieldset[disabled] .btn-social-github.focus,fieldset[disabled] .btn-social-github:focus,fieldset[disabled] .btn-social-github:hover{background-color:#333;border-color:#333}.btn-social-github .badge{background-color:#fff;color:#333}.btn-social-facebook{background-color:#4267b2;border-color:#4267b2;color:#fff}.btn-social-facebook.focus,.btn-social-facebook:focus{background-color:#34518d;border-color:#203155;color:#fff}.btn-social-facebook:hover{background-color:#34518d;border-color:#314d85;color:#fff}.btn-social-facebook.active,.btn-social-facebook:active,.open>.dropdown-toggle.btn-social-facebook{background-color:#34518d;background-image:none;border-color:#314d85;color:#fff}.btn-social-facebook.active.focus,.btn-social-facebook.active:focus,.btn-social-facebook.active:hover,.btn-social-facebook:active.focus,.btn-social-facebook:active:focus,.btn-social-facebook:active:hover,.open>.dropdown-toggle.btn-social-facebook.focus,.open>.dropdown-toggle.btn-social-facebook:focus,.open>.dropdown-toggle.btn-social-facebook:hover{background-color:#2b4273;border-color:#203155;color:#fff}.btn-social-facebook.disabled.focus,.btn-social-facebook.disabled:focus,.btn-social-facebook.disabled:hover,.btn-social-facebook[disabled].focus,.btn-social-facebook[disabled]:focus,.btn-social-facebook[disabled]:hover,fieldset[disabled] .btn-social-facebook.focus,fieldset[disabled] .btn-social-facebook:focus,fieldset[disabled] .btn-social-facebook:hover{background-color:#4267b2;border-color:#4267b2}.btn-social-facebook .badge{background-color:#fff;color:#4267b2}.btn-social-google-oauth2{background-color:#db4437;border-color:#db4437;color:#fff}.btn-social-google-oauth2.focus,.btn-social-google-oauth2:focus{background-color:#bd2e22;border-color:#7c1e16;color:#fff}.btn-social-google-oauth2:hover{background-color:#bd2e22;border-color:#b42c20;color:#fff}.btn-social-google-oauth2.active,.btn-social-google-oauth2:active,.open>.dropdown-toggle.btn-social-google-oauth2{background-color:#bd2e22;background-image:none;border-color:#b42c20;color:#fff}.btn-social-google-oauth2.active.focus,.btn-social-google-oauth2.active:focus,.btn-social-google-oauth2.active:hover,.btn-social-google-oauth2:active.focus,.btn-social-google-oauth2:active:focus,.btn-social-google-oauth2:active:hover,.open>.dropdown-toggle.btn-social-google-oauth2.focus,.open>.dropdown-toggle.btn-social-google-oauth2:focus,.open>.dropdown-toggle.btn-social-google-oauth2:hover{background-color:#9f271d;border-color:#7c1e16;color:#fff}.btn-social-google-oauth2.disabled.focus,.btn-social-google-oauth2.disabled:focus,.btn-social-google-oauth2.disabled:hover,.btn-social-google-oauth2[disabled].focus,.btn-social-google-oauth2[disabled]:focus,.btn-social-google-oauth2[disabled]:hover,fieldset[disabled] .btn-social-google-oauth2.focus,fieldset[disabled] .btn-social-google-oauth2:focus,fieldset[disabled] .btn-social-google-oauth2:hover{background-color:#db4437;border-color:#db4437}.btn-social-google-oauth2 .badge{background-color:#fff;color:#db4437}.btn-social-discord{background-color:#5865f2;border-color:#5865f2;color:#fff}.btn-social-discord.focus,.btn-social-discord:focus{background-color:#2939ee;border-color:#0f1dbc;color:#fff}.btn-social-discord:hover{background-color:#2939ee;border-color:#1f31ee;color:#fff}.btn-social-discord.active,.btn-social-discord:active,.open>.dropdown-toggle.btn-social-discord{background-color:#2939ee;background-image:none;border-color:#1f31ee;color:#fff}.btn-social-discord.active.focus,.btn-social-discord.active:focus,.btn-social-discord.active:hover,.btn-social-discord:active.focus,.btn-social-discord:active:focus,.btn-social-discord:active:hover,.open>.dropdown-toggle.btn-social-discord.focus,.open>.dropdown-toggle.btn-social-discord:focus,.open>.dropdown-toggle.btn-social-discord:hover{background-color:#1223e2;border-color:#0f1dbc;color:#fff}.btn-social-discord.disabled.focus,.btn-social-discord.disabled:focus,.btn-social-discord.disabled:hover,.btn-social-discord[disabled].focus,.btn-social-discord[disabled]:focus,.btn-social-discord[disabled]:hover,fieldset[disabled] .btn-social-discord.focus,fieldset[disabled] .btn-social-discord:focus,fieldset[disabled] .btn-social-discord:hover{background-color:#5865f2;border-color:#5865f2}.btn-social-discord .badge{background-color:#fff;color:#5865f2}.btn-social-twitter,.btn-social-twitter.focus,.btn-social-twitter:focus,.btn-social-twitter:hover{background-color:#000;border-color:#000;color:#fff}.btn-social-twitter.active,.btn-social-twitter:active,.open>.dropdown-toggle.btn-social-twitter{background-color:#000;background-image:none;border-color:#000;color:#fff}.btn-social-twitter.active.focus,.btn-social-twitter.active:focus,.btn-social-twitter.active:hover,.btn-social-twitter:active.focus,.btn-social-twitter:active:focus,.btn-social-twitter:active:hover,.open>.dropdown-toggle.btn-social-twitter.focus,.open>.dropdown-toggle.btn-social-twitter:focus,.open>.dropdown-toggle.btn-social-twitter:hover{background-color:#000;border-color:#000;color:#fff}.btn-social-twitter.disabled.focus,.btn-social-twitter.disabled:focus,.btn-social-twitter.disabled:hover,.btn-social-twitter[disabled].focus,.btn-social-twitter[disabled]:focus,.btn-social-twitter[disabled]:hover,fieldset[disabled] .btn-social-twitter.focus,fieldset[disabled] .btn-social-twitter:focus,fieldset[disabled] .btn-social-twitter:hover{background-color:#000;border-color:#000}.btn-social-twitter .badge{background-color:#fff;color:#000}.dropdown-header{color:#172b4d;font-size:18px}.dropdown-subheader{color:#172b4d;font-size:14px;font-weight:700;padding:6px 20px;width:100%}.dropdown-pills{border-bottom:1px solid #ebecf0;display:flex;padding:6px 10px}.dropdown-pills .btn{display:block;margin:0 10px;width:100%}.dropdown-menu-list{list-style:none;margin:0;padding:0}.dropdown-link>a,.dropdown-menu-item>.btn-link,.dropdown-menu-item>a,.dropdown-menu>li>.btn-link,.dropdown-menu>li>a,.modal-menu>li>.btn-link,.modal-menu>li>a{border:none;clear:both;color:#172b4d;display:block;float:none;font-weight:400;line-height:1.42857143;padding:6px 20px;text-align:left;white-space:nowrap;width:100%}.dropdown-link>a:active,.dropdown-link>a:focus,.dropdown-link>a:hover,.dropdown-menu-item>.btn-link:active,.dropdown-menu-item>.btn-link:focus,.dropdown-menu-item>.btn-link:hover,.dropdown-menu-item>a:active,.dropdown-menu-item>a:focus,.dropdown-menu-item>a:hover,.dropdown-menu>li>.btn-link:active,.dropdown-menu>li>.btn-link:focus,.dropdown-menu>li>.btn-link:hover,.dropdown-menu>li>a:active,.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover,.modal-menu>li>.btn-link:active,.modal-menu>li>.btn-link:focus,.modal-menu>li>.btn-link:hover,.modal-menu>li>a:active,.modal-menu>li>a:focus,.modal-menu>li>a:hover{background-color:#ebecf0;color:#172b4d;text-decoration:none}.dropdown-link>a:disabled,.dropdown-menu-item>.btn-link:disabled,.dropdown-menu-item>a:disabled,.dropdown-menu>li>.btn-link:disabled,.dropdown-menu>li>a:disabled,.modal-menu>li>.btn-link:disabled,.modal-menu>li>a:disabled{color:rgba(23,43,77,.5)}.dropdown-link>a .material-icon,.dropdown-menu-item>.btn-link .material-icon,.dropdown-menu-item>a .material-icon,.dropdown-menu>li>.btn-link .material-icon,.dropdown-menu>li>a .material-icon,.modal-menu>li>.btn-link .material-icon,.modal-menu>li>a .material-icon{bottom:1px;font-size:18px;margin:-2px 7px -2px 0;position:relative}.dropdown-link>a .badge,.dropdown-menu-item>.btn-link .badge,.dropdown-menu-item>a .badge,.dropdown-menu>li>.btn-link .badge,.dropdown-menu>li>a .badge,.modal-menu>li>.btn-link .badge,.modal-menu>li>a .badge{background-color:#dc2626;border-radius:4px;color:#fff;float:right;position:relative;top:1px}.dropdown-menu>li .dropdown-category .material-icon{color:#7a869a;font-size:12px;line-height:12px;margin-right:3px}.dropdown-menu>li .dropdown-category-color .material-icon{color:var(--color)}.dropdown-menu>li .dropdown-subcategory{padding-left:40px}.modal-menu{margin:20px 0;padding:0}.modal-menu>li{list-style:none;margin:6.66666667px 0;padding:0}.dropdown-menu{min-width:210px}.dropdown-footer{border-top:1px solid #ebecf0;margin-bottom:-5px;padding:6px 20px}.dropdown-menu-item+.dropdown-footer{margin-top:9px}.dropdown-menu .dropdown-buttons{padding:2px 20px 7px}.dropdown-menu .dropdown-buttons .btn{margin:4px 0}@media screen and (min-width:992px){.category-picker .dropdown-menu{width:300px}}.category-picker .dropdown-menu>li>.btn-link{overflow-wrap:break-word;white-space:normal}@media screen and (max-width:767px){.dropdown-menu.stick-to-bottom{border:none;border-radius:0;bottom:0;-webkit-box-shadow:0 0 30px #7a869a;box-shadow:0 0 30px #7a869a;clear:both;margin:0;max-height:400px;overflow-y:auto;padding:0 0 20px;position:fixed;top:auto;width:100%}.dropdown-menu.stick-to-bottom li{clear:both;float:none;margin:0}.dropdown-menu.stick-to-bottom li>.btn,.dropdown-menu.stick-to-bottom li>a{border-bottom:1px solid #ebecf0;padding-bottom:15px;padding-top:15px}}.noscript-collapsible>input{display:none}.noscript-collapsible .btn{display:block;width:100%}.noscript-collapsible-items{display:none}input:checked+.noscript-collapsible-items{display:block}.noscript-collapsible-items .btn{margin-top:10px}.overlay{background-color:#fff;display:none}body.has-overlay{overflow:hidden;position:fixed}.overlay-open{display:flex;flex-direction:column;height:100%;left:0;position:fixed;top:0;width:100%;z-index:1035}.overlay-header{align-items:center;display:flex;padding:12px;width:100%}.overlay-header-caption{color:#172b4d;font-size:18px;margin-right:12px}.btn-overlay-close{align-items:center;display:flex;height:32px;justify-content:center;margin-left:auto;padding:0;width:32px}.btn-overlay-close .material-icon{font-size:24px;line-height:24px;margin:0}.btn-overlay-close,.btn-overlay-close:focus,.btn-overlay-close:hover{background-color:transparent;border-color:transparent;color:#172b4d}.btn-overlay-close:active{background-color:#ebecf0;border-color:#ebecf0;box-shadow:none;color:#172b4d}.overlay .dropdown-pills{padding:0 12px 12px}.overlay .dropdown-pills .btn:first-child{margin-left:0}.overlay .dropdown-pills .btn:last-child{margin-right:0}.overlay .dropdown-footer{margin:0}.overlay-menu-list{list-style:none;margin:0;padding:0}.overlay-menu-list .dropdown-header,.overlay-menu-list .dropdown-menu-item>a,.overlay-menu-list .dropdown-menu-item>button,.overlay-menu-list .dropdown-subheader{padding:6px 12px}.overlay-menu-list .divider{background-color:#ebecf0;height:1px;margin:9px 0;overflow:hidden}.dropdown-menu .list-group,.overlay .list-group{margin:0}.dropdown-menu .list-group,.dropdown-menu .list-group-item,.overlay .list-group,.overlay .list-group-item{border-left:0;border-radius:0;border-right:0}.dropdown-menu .list-group-item:first-child,.overlay .list-group-item:first-child{border-top:none}.dropdown-menu .list-group-item:last-child,.overlay .list-group-item:last-child{border-bottom:none}.dropdown-menu .list-group-item{padding:10px 20px}.list-group-loading{padding:40px 20px}.list-group-loading-message{font-size:18px;text-align:center}.list-group-loading-progress{background-color:#ebecf0;border-radius:3px;margin:auto;max-width:300px;overflow:hidden}.list-group-loading-progress-bar{animation:infiniteProgress 1s linear infinite;background-color:#7a869a;height:8px;transform-origin:0 50%;width:100%}@keyframes infiniteProgress{0%{transform:translateX(0) scaleX(0)}40%{transform:translateX(0) scaleX(.4)}to{transform:translateX(100%) scaleX(.5)}}.dropdown-menu .list-group-loading,.overlay .list-group-lading{padding:20px 40px}.list-group-empty,.list-group-error,.list-group-message{color:#172b4d;padding:20px}.list-group-empty-icon,.list-group-error-icon,.list-group-message-icon{color:#7a869a;font-size:64px;line-height:64px;margin-bottom:20px;text-align:center}.list-group-empty-message,.list-group-error-message,.list-group-message-message{font-size:18px;margin:0;text-align:center}.list-group-error-detail,.list-group-message-detail{color:#5e6c84;font-size:18px;margin-top:10px;text-align:center}.category-label{border-radius:.25em;padding:.2em .6em .3em}.category-label-color,.category-label-color:active,.category-label-color:focus,.category-label-color:hover,.category-label-color:link,.category-label-color:visited{color:#fff}.category-label-no-color,.category-label-no-color:active,.category-label-no-color:focus,.category-label-no-color:hover,.category-label-no-color:link,.category-label-no-color:visited{background-color:#ebecf0;color:#344563}.thread-flags{margin:0;opacity:.8;padding:0}.thread-flags,.thread-flags li{align-items:center;display:flex}.thread-flags li{border-radius:3px;cursor:default;height:20px;justify-content:center;list-style-type:none;width:20px}.thread-flags li+li{margin-left:7.5px}.thread-flags .material-icon{font-size:16px;line-height:16px}.thread-flag-pinned-globally{background:#dbeafe;color:#2563eb}.thread-flag-pinned-locally{background:#dbeafe;color:#3b82f6}.thread-flag-pinned-locally-elsewhere{background:#e2e8f0;color:#64748b}.thread-flag-answered{background:#d9f99d;color:#4d7c0f}.thread-flag-poll{background:#f5d0fe;color:#c026d3}.thread-flag-unapproved{background:#ef4444;color:#fff}.thread-flag-closed{background:#fecaca;color:#dc2626}.thread-flag-hidden{background:#64748b;color:#fff}.threads-replies{align-items:center;color:#5e6c84;display:flex;font-size:16px;font-weight:700}.threads-replies .material-icon{font-size:16px;margin-right:7.5px;transform:matrix(-1,0,0,1,0,0)}@media screen and (max-width:767px){.threads-replies{font-size:13px}.threads-replies .material-icon{font-size:12px;margin-right:4px}}.thread-user-card{align-items:center;display:flex}.thread-user-card-media{flex:0;margin-right:15px}.thread-user-card-media img{border-radius:3px}.thread-user-card-body{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.thread-paginator{align-items:center;display:flex}.thread-paginator .btn+.btn{margin-left:6px}.thread-paginator .dropdown{margin:0 6px}.thread-paginator .dropdown-menu{min-width:150px;padding:4px}.thread-paginator .form-control{font-size:16px;margin-right:6px}.thread-paginator-form{display:flex}@media screen and (max-width:767px){.toolbar-item .thread-paginator{width:100%}.toolbar-item .thread-paginator .dropdown{min-width:0;width:100%}.toolbar-item .thread-paginator .btn-block{min-width:0;overflow:hidden;padding-left:0;padding-right:0;text-align:center;text-overflow:ellipsis;white-space:nowrap}}.search-dropdown{overflow:hidden;padding:0;width:450px}.search-dropdown .search-input{border-bottom:1px solid #ebecf0;padding:6px 20px}.search-dropdown .list-group{max-height:calc(100vh - 126px);overflow-y:auto}.search-overlay-body{display:flex;flex:1;flex-direction:column}.search-overlay-body .search-input{border-bottom:1px solid #ebecf0;padding:6px 12px}.search-dropdown .form-control-search,.search-overlay-body .form-control-search{font-size:16px}.search-overlay-body .search-results-container{flex:1;overflow-y:auto;position:relative;width:100%}.search-overlay-body .search-results-list{min-height:100%;position:absolute;width:100%}.search-result a{align-items:center;display:flex;width:100%}.search-result a:hover{cursor:pointer;text-decoration:none}.search-result a img{border-radius:3px;margin-right:12px}.search-result-card{width:100%}.search-result-name{color:#172b4d;font-weight:700;overflow-wrap:anywhere}.search-result-summary{color:#7a869a;font-size:12px;max-height:72px;overflow:hidden;overflow-wrap:anywhere}.search-result-details{color:#7a869a;font-size:12px;margin:0;padding:0}.search-result-details li{display:inline-block;list-style:none;margin-right:12px}.page-header{margin:10px 0 0}.page-header-banner-bg-overlay{padding:20px 0}.page-header h1{margin:0;overflow-wrap:anywhere}.page-container{padding-top:20px}@media screen and (max-width:991px){.panel-message-body{text-align:center}.panel-message-body .message-icon{margin:30px}.panel-message-body .message-icon .material-icon{font-size:160px}}@media screen and (min-width:992px){.panel-message-body{padding:20px 20px 30px}.panel-message-body .message-icon{float:left}.panel-message-body .message-icon .material-icon{font-size:50px}.panel-message-body .message-body{margin-left:65px;margin-top:10px}.panel-message-body .message-body .lead{margin-bottom:0}.panel-message-body .message-body .help-block{margin-top:13.2px}}.panel-body-loading{padding:0;text-align:center}.panel-footer-sticky{bottom:0;position:sticky}.misago-footer{margin-bottom:50px;margin-top:30px}.misago-footer .footer-content{padding-top:30px}.misago-footer .noscript-message .material-icon{bottom:1px;font-size:18px;position:relative}@keyframes fixed-moderation-fade-in{0%{opacity:0}to{opacity:1}}.fixed-moderation{bottom:20px;display:none;opacity:0;pointer-events:none;position:fixed;width:100%}.fixed-moderation.visible{animation-duration:.3s;animation-name:fixed-moderation-fade-in;display:block;opacity:1}.fixed-moderation .container{display:flex;flex-direction:row;justify-content:end;pointer-events:none}.fixed-moderation .dropup{pointer-events:all}@media screen and (max-width:767px){.fixed-moderation .container{display:block}.fixed-moderation .dropdown-menu{width:100%}.btn-moderation{display:block;width:100%}}.ui-preview{-webkit-animation:ui-preview-animation 1s linear infinite;-o-animation:ui-preview-animation 1s linear infinite;animation:ui-preview-animation 1s linear infinite;color:#ebecf0}@keyframes ui-preview-animation{0%{filter:alpha(opacity=100);opacity:1}50%{filter:alpha(opacity=10);opacity:.1}to{filter:alpha(opacity=100);opacity:1}}.ui-preview-text{background:#ebecf0;border-radius:100px;display:inline-block;height:14px;position:relative;top:3px}.ui-preview-paragraph .ui-preview-text{margin-right:6px}.ui-preview-paragraph .ui-preview-text:last-child{margin-right:0}.ui-preview-img{background:#ebecf0;border-radius:5px}.ui-preview input:disabled,.ui-preview textarea:disabled{background-color:#fff}.pager-undercontent{margin-top:-20px}.pager-more{text-align:center}@media screen and (min-width:992px){.pager-more .btn{padding-left:20px;padding-right:20px}}.misago-pagination{display:flex}.misago-pagination .btn{display:block;width:100%}.misago-pagination .btn+.btn{margin-left:15px}@media screen and (max-width:767px){.toolbar-item .misago-pagination{width:100%}}.panel-poll h2{margin-top:0}.poll-select-choice .btn,.poll-select-choice .btn:active,.poll-select-choice .btn:focus,.poll-select-choice .btn:hover{background:transparent;border:transparent;-webkit-box-shadow:none;box-shadow:none;margin:6px 0;outline:none;padding:0 0 0 6px;text-align:left}.poll-select-choice .btn .material-icon{line-heigh:28px;color:#ced0da;font-size:28px;height:28px;margin-right:6px;width:28px}.poll-select-choice .btn.btn-selected .material-icon{color:#2563eb}.poll-help{font-size:12px}.poll-chart-selected .material-icon{line-heigh:14px;bottom:1px;color:#36b37e;font-size:14px;height:14px;margin-right:4px;position:relative;width:14px}.poll-options{margin-bottom:0}@media screen and (max-width:767px){.poll-options{margin-top:-6px}.poll-options .btn{margin:6px 0}}.user-status.user-banned .status-icon{color:#ff5630}.user-status.user-online .status-icon{color:#36b37e}.user-status.user-offline .status-icon{color:#7a869a}@media screen and (min-width:768px){.user-card{text-align:center}}.user-card-small-avatar img{height:auto;width:100%}@media screen and (min-width:768px){.user-card-small-avatar{display:none}}@media screen and (max-width:767px){.user-card-avatar{display:none}}.toolbar{display:block;margin:0 -8px}.toolbar-over-footer{margin-bottom:-50px}.toolbar-section{display:flex;flex:1;justify-items:center;margin-bottom:20px}.toolbar-item{flex:1;padding:0 7px}.toolbar-item h3,.toolbar-item p{margin:0}.toolbar-item-shrink{flex:0!important;min-width:auto}.toolbar-spacer{display:none}@media screen and (min-width:768px){.toolbar{display:flex}.toolbar-item,.toolbar-section{align-items:center;flex:0}.toolbar-section.toolbar-section-auto,.toolbar-section.toolbar-section-auto .toolbar-item{flex:1}.toolbar-spacer{display:block;flex:1}.toolbar-item .form-search{width:250px}}@media screen and (max-width:767px){.toolbar{display:flex;flex-direction:column}.toolbar-item{min-width:0}.toolbar-item-shrink{min-width:auto}.toolbar-item p{text-align:center}}abbr{border:none!important}.item-title{text-decoration:none}.item-title,a.item-title:active,a.item-title:hover,a.item-title:link,a.item-title:visited{color:#172b4d;font-weight:700}a.item-title:hover{text-decoration:underline}.message-line{text-align:center}.message-line .material-icon{font-size:20px;height:20px;line-height:20px;margin-right:6.66666667px;width:20px}.text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.misago-markup,.misago-markup blockquote{font-size:16px}.misago-markup h1,.misago-markup h2,.misago-markup h3,.misago-markup h4,.misago-markup h5,.misago-markup h6,.misago-markup p{overflow-wrap:anywhere}.misago-markup h1,.misago-markup h2,.misago-markup h3,.misago-markup h4,.misago-markup h5,.misago-markup h6{margin-top:40px}.misago-markup blockquote>*,.misago-markup>*{margin:20px 0}.misago-markup blockquote>:first-child,.misago-markup>:first-child{margin-top:0}.misago-markup blockquote>:last-child,.misago-markup>:last-child{margin-bottom:0}.misago-markup img{max-height:500px;max-width:100%}.misago-markup .quote-block,.misago-markup blockquote{background-color:#f0f9ff;border-left:3px solid #0ea5e9;border-radius:3px;color:#0c4a6e;overflow:hidden}.misago-markup .quote-heading{font-size:14px;font-weight:700;padding:10px 16px}.misago-markup .quote-body{border:none;border-radius:0}.misago-markup blockquote{padding:10px 16px}.misago-markup blockquote:last-child{margin-bottom:0}.misago-markup .quote-body>.quote-block,.misago-markup .quote-body>blockquote,.misago-markup blockquote>.quote-block,.misago-markup blockquote>blockquote{border:1px solid #0ea5e9;border-left-width:3px}.misago-markup .spoiler-block{background:repeating-linear-gradient(45deg,rgba(235,236,240,.5),rgba(235,236,240,.5) 10px,#fff 0,#fff 20px);border:3px solid #ebecf0;border-radius:4px;font-size:14px;position:relative}.misago-markup .spoiler-body{background:#fff;border-width:0;margin:0;padding:20px}.misago-markup .spoiler-overlay{background:#fff}.misago-markup .spoiler-block.revealed .spoiler-overlay{display:none}.misago-markup ul,.misago-markup ul li{list-style-type:square}.misago-markup ol,.misago-markup ol li{list-style-type:decimal}.misago-markup pre{background:#eee;border:none;color:#000;overflow:hidden;padding:10px}.misago-markup pre code.hljs{margin:-10px;padding:9.5px}.misago-markup-example{align-items:center;display:flex}.formatting-help{padding-bottom:0}.formatting-help-item,.formatting-help-item pre,.formatting-help>h4{margin-bottom:20px}@media screen and (min-width:992px){.formatting-help-item{align-items:center;display:flex}.formatting-help-item-markup,.formatting-help-item-preview{width:50%}.formatting-help-item-markup{padding-right:15px}.formatting-help-item-markup pre{margin:0}.formatting-help-item-preview{padding-left:15px}}.scroll-target{bottom:80px;position:relative;width:1px}.site-nav-dropdown{max-height:calc(100vh - 80px);overflow-y:auto;width:320px}.site-nav-category-header a{color:#7a869a;font-weight:700}.site-nav-category a,.site-nav-category-header a{align-items:center;display:flex;justify-content:space-between;width:100%}.site-nav-category a span,.site-nav-category-header a span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.site-nav-category+.site-nav-category-header{margin-top:10px}.site-nav-category-last{margin-bottom:10px}.site-nav-category-last+.site-nav-category-header{margin-top:0}@media screen and (min-width:768px){.site-nav-sign-in-message,.site-nav-sign-in-options{display:none}}.site-nav-menu.overlay-menu-list{height:100%;overflow-y:auto;padding-bottom:20px}.user-nav-menu{min-width:300px}.user-nav-profile strong{display:block;font-size:18px}.user-nav-dropdown{max-height:calc(100vh - 80px);overflow-y:auto}.user-nav-menu.overlay-menu-list{height:100%;overflow-y:auto;padding-bottom:20px}.modal-change-avatar .modal-avatar-index .avatar-preview{border-radius:6px;height:200px;margin:0 auto;overflow:hidden;position:relative;width:200px}.modal-change-avatar .modal-avatar-index .avatar-preview .loader{display:none;height:100px;position:absolute;top:50px}.modal-change-avatar .modal-avatar-index .avatar-preview .loader .loader-spinning-wheel{border-color:#fff transparent;border-width:10px;height:100px;width:100px}.modal-change-avatar .modal-avatar-index .avatar-preview.preview-loading img{filter:alpha(opacity=33);opacity:.33}.modal-change-avatar .modal-avatar-index .avatar-preview.preview-loading .loader{display:block}@media (max-width:699px){.modal-change-avatar .modal-avatar-index .avatar-preview{height:150px;margin-bottom:20px;width:150px}.modal-change-avatar .modal-avatar-index .avatar-preview img{height:150px;width:150px}.modal-change-avatar .modal-avatar-index .avatar-preview .loader{height:100px;top:25px}.modal-change-avatar .modal-avatar-index .avatar-preview .loader .loader-spinning-wheel{height:100px;width:100px}}.modal-change-avatar .modal-avatar-index .btn{text-align:left}.modal-change-avatar .modal-avatar-upload{text-align:center}.modal-change-avatar .modal-avatar-upload .btn-pick-file{background:transparent;border:2px solid #ebecf0;border-radius:6px;-webkit-box-shadow:none;box-shadow:none;color:#7a869a;font-size:18px;padding:10px 24px;text-align:center}.modal-change-avatar .modal-avatar-upload .btn-pick-file>.material-icon{display:block;font-size:50px;height:50px;margin:0 auto 13.2px;width:50px}.modal-change-avatar .modal-avatar-upload .btn-pick-file:active,.modal-change-avatar .modal-avatar-upload .btn-pick-file:hover{border-color:#2563eb;color:#2563eb}.modal-change-avatar .modal-avatar-upload .text-muted{margin-top:13.2px}.modal-change-avatar .modal-avatar-upload .upload-progress img{border-radius:4px;margin-bottom:20px;max-height:80px;width:auto}.modal-change-avatar .modal-avatar-upload .upload-progress .progress{margin:0 auto;width:70%}.modal-avatar-crop .crop-form{margin:0 auto}.modal-avatar-crop .crop-form .cropit-image-zoom-input{-webkit-appearance:none;border:1px solid #fff;margin-top:10px;width:100%}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-webkit-slider-runnable-track{background:#ebecf0;border:none;border-radius:3px;height:8px;width:100%}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-webkit-slider-thumb{-webkit-appearance:none;background:#7a869a;border:none;border-radius:50%;height:20px;margin-top:-6px;width:20px}.modal-avatar-crop .crop-form .cropit-image-zoom-input:focus{outline:none}.modal-avatar-crop .crop-form .cropit-image-zoom-input:focus::-webkit-slider-runnable-track{background:#ebecf0}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-moz-range-track{background:#ebecf0;border:none;border-radius:4px;height:8px;width:100%}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-moz-range-thumb{background:#7a869a;border:none;border-radius:50%;height:20px;width:20px}.modal-avatar-crop .crop-form .cropit-image-zoom-input:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-ms-track{background:transparent;border-color:transparent;border-width:8px 0;color:transparent;height:8px;width:100%}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-ms-fill-lower,.modal-avatar-crop .crop-form .cropit-image-zoom-input::-ms-fill-upper{background:#ebecf0;border-radius:16px}.modal-avatar-crop .crop-form .cropit-image-zoom-input::-ms-thumb{background:#7a869a;border:none;border-radius:50%;height:20px;width:20px}.modal-avatar-crop .crop-form .cropit-image-zoom-input:focus::-ms-fill-lower,.modal-avatar-crop .crop-form .cropit-image-zoom-input:focus::-ms-fill-upper{background:#ebecf0}.modal-change-avatar .modal-avatar-gallery{padding-bottom:0}.modal-change-avatar .modal-avatar-gallery .avatars-gallery{margin-bottom:20px}.modal-change-avatar .modal-avatar-gallery .avatars-gallery h3{margin-top:0}.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .row{margin-bottom:10px}.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn{background:none;border:2px solid #ebecf0;border-radius:6px;padding:2px;position:relative}.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn:focus,.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn:hover{border-color:#7a869a}.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn.avatar-selected,.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn:active{border-color:#0065ff}.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn img{border-radius:4px;height:auto;width:100%}.list-group-category-vanilla{background-color:transparent;color:#5e6c84}.list-group-category-vanilla .item-title,.list-group-category-vanilla .item-title:active,.list-group-category-vanilla .item-title:focus,.list-group-category-vanilla .item-title:hover,.list-group-category-vanilla .item-title:link,.list-group-category-vanilla .item-title:visited{color:#344563;font-weight:500}.list-group-category-vanilla .list-group-item-heading:last-child{margin:0}.list-group-category-vanilla .category-description :last-child{margin-bottom:0}.list-group-category-item{display:flex;padding-left:0}.list-group-category-item-read-status-col{align-items:center;display:flex;flex-shrink:0;justify-content:center;text-align:center;width:56px}.list-group-category-item-rest-col{align-items:center;display:flex;width:100%}.list-group-category-item-main-col{flex:1;padding-right:15px}.list-group-category-item-stats-col{flex-shrink:0;width:150px}.list-group-category-item-last-thread-col{align-items:center;display:flex;width:290px}.list-group-category-item-read-status-col .material-icon{font-size:24px;line-height:24px}.list-group-category-item-read-status-col .item-read{color:#dfe1e6}.list-group-category-item-read-status-col .item-new{color:#2563eb}.list-group-category-item-name,.list-group-category-item-name:link,.list-group-category-item-name:visited{color:#172b4d;font-size:18px;font-weight:500}.list-group-category-item-description{color:#5e6c84;margin-top:3px}.list-group-category-item-description :last-child{margin-bottom:0}.list-group-category-item-children{list-style:none;margin:0 -6px -6px;padding:0}.list-group-category-item-children-item{display:inline-block;padding:6px}.list-group-category-child-children-item-name{align-items:center;display:flex}.list-group-category-child-children-item-name,.list-group-category-child-children-item-name:active,.list-group-category-child-children-item-name:link,.list-group-category-child-children-item-name:visited{color:#5e6c84}.list-group-category-child-children-item-name:active,.list-group-category-child-children-item-name:focus,.list-group-category-child-children-item-name:hover{color:#172b4d}.list-group-category-child-children-item-status-new,.list-group-category-child-children-item-status-read{border-radius:2px;display:inline-block;height:8px;margin-right:6px;width:8px}.list-group-category-child-children-item-status-new{background-color:#2563eb}.list-group-category-child-children-item-status-read{background-color:#dfe1e6}.list-group-category-item-stats-col{color:#5e6c84;padding-right:15px}.list-group-category-item-stats-col .category-stat-value{color:#172b4d;font-weight:700}.list-group-category-item-last-poster-avatar-col{padding-right:15px}.list-group-category-item-last-poster-avatar{line-height:0}.list-group-category-item-last-poster-avatar img{border-radius:4px}.list-group-category-item-last-thread-details-col{color:#5e6c84;flex:1;min-width:0}.list-group-category-item-last-thread-title,.list-group-category-item-last-thread-title-muted{display:block;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.list-group-category-item-last-thread-title,.list-group-category-item-last-thread-title:active,.list-group-category-item-last-thread-title:focus,.list-group-category-item-last-thread-title:hover,.list-group-category-item-last-thread-title:link,.list-group-category-item-last-thread-title:visited{color:#172b4d}.list-group-category-item-last-thread-title-muted{color:#5e6c84}.list-group-category-item-last-posted-on,.list-group-category-item-last-poster,.list-group-category-item-last-separator{display:inline-block}.list-group-category-item-last-poster,.list-group-category-item-last-poster:active,.list-group-category-item-last-poster:focus,.list-group-category-item-last-poster:hover,.list-group-category-item-last-poster:link,.list-group-category-item-last-poster:visited{color:#172b4d}.list-group-category-item-last-separator{margin:0 2px}.list-group-category-item-last-posted-on,.list-group-category-item-last-posted-on-short,.list-group-category-item-last-posted-on-short:active,.list-group-category-item-last-posted-on-short:focus,.list-group-category-item-last-posted-on-short:hover,.list-group-category-item-last-posted-on-short:link,.list-group-category-item-last-posted-on-short:visited,.list-group-category-item-last-posted-on:active,.list-group-category-item-last-posted-on:focus,.list-group-category-item-last-posted-on:hover,.list-group-category-item-last-posted-on:link,.list-group-category-item-last-posted-on:visited{color:#5e6c84}.list-group-category-item-last-posted-on-short{display:none}.list-group-category-item-last-thread-text{align-items:center;color:#5e6c84;display:flex}.list-group-category-item-last-thread-text-icon{align-items:center;color:#7a869a;display:flex;height:32px;justify-content:center;margin-right:15px;width:32px}.list-group-category-item-last-thread-text-icon .material-icon{font-size:24px;line-height:24px}@media screen and (max-width:991px){.list-group-category-item-rest-col{align-items:start;flex-direction:column}.list-group-category-item-last-posted-on,.list-group-category-item-last-poster,.list-group-category-item-last-poster-avatar-col,.list-group-category-item-last-separator,.list-group-category-item-stats-col{display:none}.list-group-category-item-last-thread-col{display:flex;margin-top:10px;padding-right:15px}.list-group-category-item-last-thread-details-col{align-items:center;display:flex;width:auto}.list-group-category-item-last-thread-title,.list-group-category-item-last-thread-title-muted{display:block;font-weight:400}.list-group-category-item-last-posted-on-short{display:block;flex-shrink:1;padding-left:7px;white-space:nowrap}.list-group-category-item-last-thread-text-icon{display:none}}.participant-card .btn-user,.participant-card .dropdown.open .btn-user{margin-bottom:20px}.participant-card .btn-user,.participant-card .btn-user:focus,.participant-card .btn-user:focus:active,.participant-card .btn-user:hover,.participant-card .dropdown.open .btn-user,.participant-card .dropdown.open .btn-user:focus,.participant-card .dropdown.open .btn-user:focus:active,.participant-card .dropdown.open .btn-user:hover{overflow:hidden;padding:0;text-align:left}.participant-card .btn-user img,.participant-card .dropdown.open .btn-user img{background-color:#fff;height:34px;margin-right:8px;width:34px}.panel-participants p{margin:7px 0 0}.markup-editor{background:#fff;border:2px solid #ced0da;border-radius:4px;overflow:hidden}.markup-editor.markup-editor-focused{border:2px solid #2563eb}.markup-editor-toolbar{background:#fff;border-bottom:1px solid #ebecf0;padding:7px;position:relative}.markup-editor-toolbar-left{display:flex;flex-shrink:0;overflow-x:hidden}.markup-editor-toolbar-right{background:#fff;display:flex;flex-shrink:0;margin-right:10px;padding:7px 0 7px 7px;position:absolute;right:0;top:0}.btn-markup-editor{align-items:center;display:flex;flex-shrink:0;font-size:24px;height:34px;justify-content:center;line-height:24px;padding:0;width:34px}.btn-markup-editor,.btn-markup-editor:hover{background-color:transparent;border-color:transparent;color:#172b4d}.btn-markup-editor:active{background-color:#ebecf0;border-color:#ebecf0;color:#172b4d}.btn-markup-editor .material-icon{bottom:0;margin:0}.markup-editor-controls-dropdown{margin-right:10px}.markup-editor-footer{background:#fff;border-top:1px solid #ebecf0;display:flex;padding:15px}.markup-editor-spacer{flex:1}.markup-editor-footer .btn+.btn,.markup-editor-toolbar .btn+.btn{margin-left:10px}.markup-editor-textarea.form-control{border:0;border-radius:0;font-size:16px;height:200px;padding:15px;resize:none}.markup-editor-textarea.form-control,.markup-editor-textarea.form-control:focus{box-shadow:none}.markup-editor-preview{height:200px;overflow-y:auto;position:relative}.markup-editor-preview-contents{padding:15px;position:absolute}.markup-editor-preview-loading{padding:15px}.markup-editor-attachments{max-height:170px;overflow-y:auto}.markup-editor-attachments-container{overflow:auto;padding:7px}.markup-editor-attachments-item{padding:7px}.markup-editor-attachment{align-items:center;border:1px solid #ebecf0;border-radius:3px;display:flex;padding:7px}.markup-editor-attachment-details{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.markup-editor-attachment-details strong{display:block}.markup-editor-attachment-details .list-unstyled{margin-bottom:0}.btn-markup-editor-attachment{margin-left:7px}@media screen and (min-width:768px){.markup-editor-attachments-item{float:left;width:50%}}@media screen and (min-width:992px){.markup-editor-attachments-item{width:25%}}.markup-editor-attachment-modal-preview{margin:20px 0 40px;text-align:center}.markup-editor-attachment-modal-preview a{background:#fff;border:1px solid #ebecf0;display:inline-block;padding:12px}.markup-editor-attachment-modal-preview img{max-height:50vh;max-width:100%}.markup-editor-attachment-modal-filename{font-size:28px;font-weight:700;margin-bottom:20px}.markup-editor-attachment-modal-details{margin-bottom:20px}.posting-fullscreen .markup-editor{display:flex;flex-direction:column;height:100%}.posting-fullscreen .markup-editor .markup-editor-preview,.posting-fullscreen .markup-editor .markup-editor-textarea{flex:1;height:auto}@media screen and (max-width:991px){body.posting-default .markup-editor{display:flex;flex-direction:column;height:100%}body.posting-default .markup-editor .markup-editor-preview,body.posting-default .markup-editor .markup-editor-textarea{flex:1;height:100%}}@media screen and (max-width:767px){.markup-editor-attachments{max-height:120px}.markup-editor-footer .btn-auto{flex:1}.markup-editor-footer .btn-icon{margin-right:10px}.markup-editor-spacer{display:none}}@media screen and (min-width:992px){.markup-editor-controls-dropdown{display:none}}.poll-form{margin-bottom:20px}.poll-choices-control .list-group-item{padding:0}.poll-choices-control .list-group-item .btn{background:transparent;border:transparent;float:left;height:28px;margin:0 2px -29px;padding:0;position:relative;top:3px;width:28px}.poll-choices-control .list-group-item .btn .material-icon{font-size:28px;height:28px;line-height:28px;width:28px}.poll-choices-control input,.poll-choices-control input:active,.poll-choices-control input:focus{background:transparent;border:none;-webkit-box-shadow:none;box-shadow:none;margin-left:30px;outline:none;padding:6px 12px;width:100%}#posting-mount{bottom:0;display:none;left:0;position:fixed;width:100%;z-index:1035}#posting-mount.show{background-color:#fff;display:block}.posting-dialog{background:#fff;border:1px solid #ebecf0;border-bottom:0;border-radius:4px 4px 0 0;box-shadow:0 0 24px rgba(94,108,132,.25);margin:0 auto;max-width:1240px;overflow:hidden}.posting-dialog-header{align-items:center;border-bottom:1px solid #ebecf0;display:flex;padding:6px 12px}.posting-dialog-caption{color:#172b4d;flex:1;font-size:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-posting-dialog{align-items:center;display:flex;flex-shrink:0;font-size:24px;height:32px;justify-content:center;line-height:24px;margin-left:10px;padding:0;width:32px}.btn-posting-dialog,.btn-posting-dialog:hover{background-color:transparent;border:1px solid transparent;color:#172b4d}.btn-posting-dialog:active{background-color:#ebecf0;border:1px solid #ebecf0;color:#172b4d}.btn-posting-dialog .material-icon{bottom:0;margin:0;padding:0}.posting-dialog-body{padding:12px}@media screen and (min-width:992px){.posting-dialog-category-select,.posting-dialog-thread-recipients{max-width:400px}}.posting-dialog-minimized .posting-dialog-header{border-bottom:0}.posting-dialog-minimized .posting-dialog-body{display:none}body.posting-fullscreen{overflow:hidden}body.posting-fullscreen #posting-mount{height:100%}body.posting-fullscreen .posting-dialog{border:0;box-shadow:none;height:100%;max-width:auto;width:100%}body.posting-fullscreen .posting-dialog-container{display:flex;flex-direction:column;height:100%;margin:0 auto;max-width:1240px;padding:0 30px}body.posting-fullscreen .posting-dialog-body,body.posting-fullscreen .posting-dialog-header{padding:20px 0}body.posting-fullscreen .posting-dialog-body,body.posting-fullscreen .posting-loading{height:100%}body.posting-fullscreen .posting-dialog-form{display:flex;flex-direction:column;height:100%}body.posting-fullscreen #posting-spacer{display:none}@media screen and (max-width:1240px){body.posting-default .posting-dialog,body.posting-minimized .posting-dialog{border-left:0;border-radius:0;border-right:0}}@media screen and (max-width:991px){body.posting-default{overflow:hidden}body.posting-default #posting-mount{height:100%}body.posting-default .posting-dialog{border:0;box-shadow:none;height:100%;max-width:auto;width:100%}body.posting-default .posting-dialog-container{display:flex;flex-direction:column;height:100%;margin:0 auto;max-width:1240px;padding:0}body.posting-default .posting-dialog-body,body.posting-default .posting-dialog-header{padding:6px}body.posting-default .posting-dialog-body,body.posting-default .posting-loading{height:100%}body.posting-default .posting-dialog-form{display:flex;flex-direction:column;height:100%}body.posting-default .posting-dialog .toolbar-section{margin-bottom:6px}body.posting-default #posting-spacer{display:none}}.posting-dialog-error{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;padding:20px}.posting-dialog-error p{font-size:18px}.posting-dialog-error-icon{font-size:128px;margin-bottom:20px;opacity:.5}.posting-dialog-error-detail{text-align:center}.posts-list{clear:both;margin:0;padding:0}.posts-list li{list-style:none;margin:0;padding:0}@media screen and (min-width:992px){.panel-post .panel-body{display:flex}.post-side{flex-shrink:0;padding-right:15px;width:260px}.panel-content{flex:1 0}}.post-side{font-size:12px}.post-side .media{margin:0}.post-side .poster-avatar{height:36px;width:36px}@media screen and (min-width:992px){.post-side .poster-avatar{height:82px;margin-top:4px;width:82px}}.post-side .user-status{margin-right:4px}.post-side .media-heading{display:block;font-size:14px;margin:-1px 0 0}.post-side .media-heading .user-status{margin-left:2px;margin-right:0}.post-side .pull-right{margin-left:16px}@media screen and (min-width:992px){.post-side .media-heading{font-size:18px;margin-top:3px}.post-side .media-heading .user-status{display:none}.post-side .user-title{margin-bottom:5px;margin-top:4px}.post-side .user-postcount,.post-side .user-status{display:block}}.post-heading{height:36px}@media screen and (max-width:991px){.post-heading{margin-top:10px}}.post-heading .pull-right{margin-left:16px}.post-heading .label{font-size:14px;font-weight:400;margin-top:6px}.post-heading .label-unread{background-color:#36b37e;color:#fff}.post-heading .label-protected{background-color:#5e6c84;color:#fff}@media screen and (min-width:992px){.post-side .pull-right{display:none}}@media screen and (max-width:991px){.post-heading .pull-right{display:none}}.post-body{padding-bottom:30px;padding-top:20px}.post-status-message{overflow:auto}.post-status-message .material-icon{float:left;font-size:28px;line-height:28px}.post-status-message p{margin:4px 0 0 36px}.post-status-best-answer{background-color:#36b37e;color:#fff}.post-status-hidden{background-color:#ff5630;color:#fff}.post-status-unapproved{background-color:#2563eb;color:#fff}.post-status-protected{background-color:#5e6c84;color:#fff}.post-footer .pull-left{margin-right:16px}.post-footer .pull-right{margin-left:16px}.post-footer p{margin-bottom:0;padding-bottom:6px;padding-top:7px}.post-attachments{border-top:1px solid #ebecf0;padding:6px 16px}.post-attachments abbr{white-space:nowrap}.post-attachments .attachment-name{overflow-wrap:anywhere}.post-attachments .row>div{margin:10px 0}.post-attachments .post-attachment-preview{float:left;height:40px;text-align:center;width:40px}.post-attachments .post-attachment{margin-left:52px}.post-attachments .post-thumbnail{background-position:50%;background-size:cover;border-radius:3px;display:block;height:40px;width:40px}.post-attachments .material-icon{font-size:28px;height:28px;line-height:28px;position:relative;top:5px;width:28px}.post-attachments .material-icon:active,.post-attachments .material-icon:focus,.post-attachments .material-icon:hover,.post-attachments .material-icon:link,.post-attachments .material-icon:visited{color:#172b4d;text-decoration:none}.post-attachments .post-attachment-description{color:#7a869a;font-size:12px;margin:0;padding:0}.post-feed .post-side{padding-right:0;width:100%}.post-feed .post-side .media-heading{font-size:14px;margin:0}.post-feed .post-side .user-title{font-size:12px;margin:0}.post-feed .post-side .btn{display:inline-block}.post-feed .post-side img{height:36px;margin-top:0;width:36px}.post-feed .post-heading{height:auto;margin:10px 0}.post-feed .post-heading .btn{margin-right:16px;max-width:100%;overflow-wrap:anywhere;text-align:left;white-space:normal}.posts-list .event{color:#7a869a;margin-bottom:20px}.posts-list .event .event-body{align-items:flex-start;display:flex}.posts-list .event-label{margin-left:51px}.posts-list .event-label .label-unread{background-color:#36b37e;color:#fff}.posts-list .event .event-icon{padding-right:15px}.posts-list .event .event-icon .event-icon-bg{align-items:center;background:#ebecf0;border-radius:4px;color:#5e6c84;display:flex;height:36px;justify-content:center;width:36px}.posts-list .event .event-icon .material-icon{align-items:center;display:flex;font-size:28px;justify-content:center}.posts-list .event .event-content{flex:1 0}.posts-list .event .event-message{font-size:18px;margin-bottom:5px}.posts-list .event .event-info{font-size:12px;margin:0}.posts-list .event .event-info li{margin-right:12px}.posts-list .event .event-info li:last-child{margin-right:0}.posts-list .event .event-controls .btn-link{border:0;font-size:12px;margin:0 12px 0 0;padding:0}.posts-list .event .event-controls .btn-link:last-child{margin-right:0}@media screen and (max-width:767px){.posts-list .event .event-info{margin-top:5px}.posts-list .event .event-controls{clear:both;margin-top:5px}.posts-list .event .event-controls .btn-link{font-size:14px;margin-right:20px}.posts-list .event .event-controls .btn-link:last-child{margin-right:0}}@media screen and (min-width:992px){.posts-list .event .event-icon{display:flex;flex-shrink:0;justify-content:flex-end;width:275px}.event-content{flex:1 0}.posts-list .event-label{margin-left:275px}}.post-changelog-diff{margin:0;padding:0}.post-changelog-diff .list-unstyled{margin:5px 0;padding:0}.post-changelog-diff .diff-item{padding:5px 10px}.post-changelog-diff .diff-item-sub{color:#ff5630}.post-changelog-diff .diff-item-add{color:#36b37e}.post-changelog-toolbar .row{margin-left:-12px;margin-right:-12px}@media screen and (max-width:767px){.post-changelog-toolbar .post-change-label{text-align:center}}.quote-control-arrow{border-bottom:6px solid rgba(94,108,132,.75);border-left:6px solid transparent;border-right:6px solid transparent;height:0;left:6px;position:relative;width:0}.quote-control-inner{background:rgba(94,108,132,.75);border-radius:6px;padding:6px}.quote-control-btn{background:#fff;border-color:#fff;color:#172b4d}.section-divider{align-items:center;display:flex}.section-divider hr{border-radius:3px;border-width:3px;width:100%}.section-divider strong{padding:0 16px}.section-divider-primary{color:#2563eb}.section-divider-primary hr{border-color:#fff}.select-category-list{list-style:none;margin:0;padding:0}.select-category-list a,.select-category-list span{display:inline-block;font-weight:500;margin:4px 0}.select-category-list a:active,.select-category-list a:focus,.select-category-list a:hover,.select-category-list a:link,.select-category-list a:visited{color:#172b4d}.select-category-list-header,.select-category-list-item{align-items:center;display:flex}.select-category-list-header a,.select-category-list-header span{font-weight:700}.select-category-list-header span{color:#5e6c84}.select-category-list-item span{color:#7a869a}.select-category-list-item-level{width:18px}.select-category-list-item-image{background-color:#ebecf0;border-radius:3px;height:8px;margin-right:8px;width:8px}.select-category-list-item-color{background-color:var(--color)}.select-category-list-separator{border-top:1px solid #ebecf0;margin:10px 0}.select-category-list-separator:last-child{display:none}.page-login-container{margin-bottom:-40px;padding:40px 15px}.panel-login-form{border:1px solid #ebecf0;border-radius:4px;margin:20px auto;max-width:400px}.panel-login-form-body{padding:30px}.panel-login-form-header{font-size:21px;font-weight:400;margin:0 0 30px;text-align:center}.panel-login-form-error{color:#ff5630;font-weight:700;margin-bottom:20px;margin-top:-10px;text-align:center}.panel-login-form .form-control{font-size:16px;margin-bottom:20px}@media screen and (max-width:991px){.page-login-container{padding:20px 15px}.panel-login-form-body{padding:15px}.panel-login-form-header{margin-bottom:15px}.panel-login-form-error{margin-bottom:10px;margin-top:0}}@media screen and (max-width:767px){.page-error .message-panel,.page-message .message-panel{text-align:center}.page-error .message-icon,.page-message .message-icon{font-size:80px;margin:30px}}@media screen and (min-width:768px){.page-error .message-panel,.page-message .message-panel{margin:60px auto;max-width:779.35px;overflow:auto}.page-error .message-icon,.page-message .message-icon{float:left}.page-error .message-icon .material-icon,.page-message .message-icon .material-icon{font-size:80px}.page-error .message-body,.page-message .message-body{font-size:18px;margin-left:100px;margin-top:16px}.page-error .message-body p.lead,.page-message .message-body p.lead{font-size:36px}}.threads-list{background-color:#fff;border:1px solid #ebecf0;border-radius:3px;margin-bottom:20px;overflow:hidden;padding:0}.threads-list-item{align-items:center;border-bottom:1px solid #ebecf0;display:flex;padding:10px 15px}.threads-list-item img{border-radius:3px}.threads-list-item:last-child{border-bottom:none}.threads-list-item-right-col{align-items:center;display:flex;width:100%}.threads-list-item-top-row{flex:1;flex-direction:column}.threads-list-item-bottom-left,.threads-list-item-bottom-right,.threads-list-item-bottom-row,.threads-list-item-top-row{align-items:center;display:flex;justify-content:center}@keyframes misago-threads-list-item-animate{0%{background-color:#b3d4ff}to{background-color:transparent}}.threads-list-item-animate{animation-duration:.5s;animation-iteration-count:1;animation-name:misago-threads-list-item-animate}.threads-list-item-col-read-status{line-height:0;padding-right:15px}.threads-list-read-icon{border:2px solid #ebecf0}.threads-list-read-icon,.threads-list-unread-icon{border-radius:100%;display:inline-block;height:14px;width:14px}.threads-list-unread-icon{background-color:#2563eb;font-size:0;line-height:0}.threads-list-item-row-title{flex:1;width:100%}.threads-list-item-title:active,.threads-list-item-title:focus,.threads-list-item-title:hover,.threads-list-item-title:link,.threads-list-item-title:visited{color:#172b4d;font-size:16px;overflow-wrap:anywhere}.threads-list-item-title-new:active,.threads-list-item-title-new:focus,.threads-list-item-title-new:hover,.threads-list-item-title-new:link,.threads-list-item-title-new:visited{color:#172b4d}.threads-list-item-col-categories,.threads-list-item-row-categories{display:flex;width:100%}.threads-list-category-link{align-items:center;display:flex}.threads-list-category-link .material-icon{margin-right:3px}.threads-list-category-link:active,.threads-list-category-link:focus,.threads-list-category-link:hover,.threads-list-category-link:link,.threads-list-category-link:visited{color:#172b4d;opacity:.75}.threads-list-category-link:focus,.threads-list-category-link:hover{color:#172b4d;opacity:1;text-decoration:none}.threads-list-category-link+.threads-list-category-link{margin-left:15px}.threads-list-category-link-color .material-icon{color:var(--color)}.threads-list-item-col-categories{display:none}.threads-list-item-goto-page{border-radius:3px;font-size:13px;font-weight:700;margin-left:12px;padding:3px 12px}.threads-list-item-goto-page:focus,.threads-list-item-goto-page:hover,.threads-list-item-goto-page:link,.threads-list-item-goto-page:visited{background-color:transparent;border:1px solid #ebecf0;color:#172b4d;text-decoration:none}.threads-list-item-goto-page:active{background-color:#ebecf0;border:1px solid #ebecf0;color:#172b4d}.threads-list-item-col-flags{padding-left:15px}.threads-list-item .thread-flags{opacity:.8}.threads-list-item:focus .thread-flags,.threads-list-item:hover .thread-flags{opacity:1}.threads-list-item-col-category-labels{padding-left:15px;white-space:nowrap}.threads-list-category-label{font-size:12px;font-weight:700;padding:3px 6px}.threads-list-category-label,.threads-list-category-label:active,.threads-list-category-label:focus,.threads-list-category-label:hover,.threads-list-category-label:link,.threads-list-category-label:visited{background:#ebecf0;color:#344563;text-decoration:none}.threads-list-category-label.threads-list-category-label-color,.threads-list-category-label.threads-list-category-label-color:active,.threads-list-category-label.threads-list-category-label-color:focus,.threads-list-category-label.threads-list-category-label-color:hover,.threads-list-category-label.threads-list-category-label-color:link,.threads-list-category-label.threads-list-category-label-color:visited{background:var(--label-color);color:#fff}.threads-list-category-label:first-child{border-bottom-left-radius:3px;border-top-left-radius:3px}.threads-list-category-label:last-child{border-bottom-right-radius:3px;border-top-right-radius:3px}.threads-list-category-label+.threads-list-category-label{margin-left:2px}.threads-list-item-col-replies{padding-left:15px;width:80px}.threads-list-item-col-posters{padding-left:15px;width:76px}.threads-list-item-col-posters a{display:inline-block;line-height:0}.threads-list-item-col-posters a:focus,.threads-list-item-col-posters a:hover{text-decoration:none}.threads-list-item-starter+.threads-list-item-last-poster{margin-left:7.5px}.threads-list-item-col-posters-sm{display:none;font-size:20px;line-height:1}.threads-list-item-col-posters-sm img{height:20px;width:20px}.threads-list-item-col-last-activity{overflow:hidden;padding-left:15px;text-overflow:ellipsis;white-space:nowrap;width:90px}.threads-list-item-col-last-activity a:active,.threads-list-item-col-last-activity a:focus,.threads-list-item-col-last-activity a:hover,.threads-list-item-col-last-activity a:link,.threads-list-item-col-last-activity a:visited{color:#344563;font-size:16px}@media screen and (max-width:991px){.threads-list-item{align-items:flex-start}.threads-list-item-right-col{display:block}.threads-list-item-top-row{align-items:start}.threads-list-item-bottom-row{flex:0;justify-content:space-between;margin-top:7.5px}.threads-list-item-col-posters,.threads-list-item-col-replies-zero,.threads-list-item-row-categories{display:none}.threads-list-item-col-read-status{padding-top:4px}.threads-list-item-col-category-labels,.threads-list-item-col-flags{padding-left:0}.threads-list-item-col-categories{align-items:center;display:flex}.threads-list-item-col-flags+.threads-list-item-col-categories,.threads-list-item-col-flags+.threads-list-item-col-category-labels{margin-left:15px}.threads-list-item-col-categories .threads-list-category-link,.threads-list-item-col-category-labels .threads-list-category-label{white-space:nowrap}.threads-list-item-col-last-activity,.threads-list-item-col-replies{width:auto}.threads-list-item-col-posters-sm{display:block;margin-left:15px}.threads-list-item-col-checkbox{margin-right:-10px;text-align:center;width:40px}}@media screen and (max-width:767px){.threads-list{border-radius:0;border-width:1px 0;margin-left:-15px;margin-right:-15px}.threads-list-item-bottom-row{margin-top:0}.threads-list-item-bottom-left,.threads-list-item-bottom-right{margin-top:7px;overflow:visible}.threads-list-item-bottom-row{display:block;overflow:auto}.threads-list-item-bottom-row .threads-list-item-bottom-left{float:left}.threads-list-item-bottom-row .threads-list-item-bottom-right{float:right}.threads-list-item-col-read-status{padding-right:7px;position:relative;right:4px}.threads-list-item-title{font-size:18px}.threads-list-item-starter{display:none}.threads-list-item-col-last-activity{padding-left:15px;padding-right:7px}.threads-list-item-col-last-activity a:active,.threads-list-item-col-last-activity a:focus,.threads-list-item-col-last-activity a:hover,.threads-list-item-col-last-activity a:link,.threads-list-item-col-last-activity a:visited{font-size:13px}.threads-list-item-col-checkbox{margin-right:0}.threads-list-item-col-checkbox input{left:10px;position:relative}}.threads-list-poll-new{list-style:none;padding:0}.btn-threads-list-poll{background-color:#fff;border:none;border-bottom:1px solid #ebecf0;border-radius:0;color:#2563eb;display:block;padding:10px 15px;width:100%}.threads-list-blankslate{padding:20px 30px}.threads-list-blankslate-message{font-size:18px;margin:0;text-align:center}.threads-list-blankslate-links{margin-top:20px;text-align:center}@media screen and (max-width:767px){.threads-list-blankslate{padding:10px 15px}.threads-list-blankslate-message{font-size:14px}}.notifications-list{margin-bottom:20px}.notifications-list-item{align-items:center;display:flex}.notifications-list-item-left-col,.notifications-list-item-right-col{align-items:center;display:flex;justify-content:center}.notifications-list-item-right-col{width:100%}.notifications-list-item-top-row{flex:1}.notifications-list-item-bottom-row,.notifications-list-item-top-row{align-items:center;display:flex;justify-content:center}.notifications-list-item-col-actor{padding-right:15px}.notifications-list-item-col-actor img{border-radius:3px;height:30px;width:30px}.notifications-list-item-col-read-icon{line-height:0;padding-right:15px}.notification-read-icon{border:2px solid #ebecf0}.notification-read-icon,.notification-unread-icon{border-radius:100%;display:inline-block;height:14px;width:14px}.notification-unread-icon{background-color:#2563eb;font-size:0;line-height:0}.notifications-list-item-col-message{overflow-wrap:anywhere;width:100%}.notification-message,.notification-message-unread,.notification-message-unread:active,.notification-message-unread:focus,.notification-message-unread:hover,.notification-message-unread:link,.notification-message-unread:visited,.notification-message:active,.notification-message:focus,.notification-message:hover,.notification-message:link,.notification-message:visited{color:#172b4d}.notifications-list-item-col-timestamp{align-items:center;display:flex;min-width:200px;padding-left:15px}.notifications-list-item-timestamp{color:#5e6c84;font-size:12px}@media screen and (max-width:991px){.notifications-list-item{align-items:flex-start;position:relative}.notifications-list-item-right-col{display:block}.notifications-list-item-col-read-icon{padding:0;position:absolute;right:15px;top:14px}.notifications-list-item-col-timestamp{margin-top:5px;padding:0}.notifications-list-item-unread{padding-right:40px}.notifications-list-item-read .notifications-list-item-col-read-icon{display:none}}@media screen and (max-width:767px){.notifications-list{margin-left:-15px;margin-right:-15px}.notifications-list .list-group,.notifications-list .list-group-item{border-left:0;border-radius:0;border-right:0}}.notifications-dropdown{width:375px}.notifications-dropdown .notifications-list{margin:0;max-height:calc(100vh - 210px);overflow-y:auto}.notifications-dropdown .notifications-list-item{align-items:flex-start;position:relative}.notifications-dropdown .notifications-list-item-right-col{display:block}.notifications-dropdown .notifications-list-item-col-read-icon{padding:0;position:absolute;right:15px;top:14px}.notifications-dropdown .notifications-list-item-col-timestamp{margin-top:5px;padding:0}.notifications-dropdown .notifications-list-item-unread{padding-right:40px}.notifications-dropdown .notifications-list-item-read .notifications-list-item-col-read-icon{display:none}.overlay .notifications-list{height:100%;margin:0;overflow-y:auto;position:relative;width:100%}.overlay .notifications-list-ready .list-group{position:absolute}.overlay .list-group,.overlay .list-group-item{border-left:0;border-radius:0;border-right:0;margin:0}.overlay .list-group-item:first-child{border-top:none}.overlay .list-group-item{border-bottom:none}.overlay .notifications-list-item{align-items:flex-start;padding:10px 20px;position:relative}.overlay .notifications-list-item-right-col{display:block}.overlay .notifications-list-item-col-read-icon{padding:0;position:absolute;right:15px;top:14px}.overlay .notifications-list-item-col-timestamp{margin-top:5px;padding:0}.overlay .notifications-list-item-unread{padding-right:40px}.overlay .notifications-list-item-read .notifications-list-item-col-read-icon{display:none}.overlay .notifications-list-pending,.overlay .notifications-list-pending .list-group{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.overlay .notifications-list-pending .list-group-item{width:100%}.active-posters li{display:block;overflow:auto}.active-posters .rank-user-avatar{float:left}@media screen and (max-width:991px){.active-posters .rank-user-avatar{height:42px}.active-posters .rank-user-avatar img{height:36px;position:relative;top:3px;width:36px}}.active-posters .rank-user{float:left;margin-top:3px}@media screen and (max-width:991px){.active-posters .rank-user{margin-left:13.2px;width:40%}}@media screen and (max-width:767px){.active-posters .rank-user{float:none;margin-left:50px;width:auto}}@media screen and (min-width:992px){.active-posters .rank-user{margin-left:16px;width:25%}.active-posters .rank-user .user-name{font-size:18px}}.active-posters .user-details{font-family:Sans-Serif;overflow:auto}.active-posters .user-details .rank-name,.active-posters .user-details .user-status,.active-posters .user-details .user-title{display:block;float:left;font-size:12px;margin-right:3px}@media screen and (min-width:992px){.active-posters .user-details .rank-name,.active-posters .user-details .user-status,.active-posters .user-details .user-title{margin-right:8px}}.active-posters .user-details .user-title{margin-right:0}@media screen and (min-width:992px){.active-posters .user-details{overflow:visible}.active-posters .user-details .rank-name,.active-posters .user-details .user-title{height:14px;overflow:hidden;position:relative;top:1px;vertical-align:baseline}}@media screen and (max-width:767px){.active-posters .user-details{margin-top:3px}.active-posters .user-details .rank-name,.active-posters .user-details .user-title{font-weight:400}}.active-posters .user-status{overflow:auto;position:relative;top:1px}.active-posters .user-status span{display:block;float:left}@media screen and (min-width:992px){.active-posters .user-status{height:14px;overflow:hidden}}.active-posters .user-status .status-icon{position:relative}@media screen and (max-width:991px){.active-posters .user-status .status-icon{font-size:12px;height:12px;line-height:12px;top:0;width:12px}}@media screen and (min-width:992px){.active-posters .user-status .status-icon{font-size:13px;height:13px;line-height:13px;margin-right:3px;top:1px;width:13px}}.active-posters .rank-name .ui-preview-text,.active-posters .status-label.ui-preview-text,.active-posters .user-title .ui-preview-text{font-size:11px;height:11px;line-height:11px;position:relative;top:2px}.active-posters .rank-name .ui-preview-text,.active-posters .user-title .ui-preview-text{position:static}.active-posters .rank-position small,.active-posters .rank-position strong,.active-posters .rank-posts-counted small,.active-posters .rank-posts-counted strong,.active-posters .rank-posts-total small,.active-posters .rank-posts-total strong{display:block}@media screen and (max-width:991px){.active-posters .rank-position,.active-posters .rank-posts-counted,.active-posters .rank-posts-total{overflow:auto}.active-posters .rank-position small,.active-posters .rank-position strong,.active-posters .rank-posts-counted small,.active-posters .rank-posts-counted strong,.active-posters .rank-posts-total small,.active-posters .rank-posts-total strong{float:left;font-size:10.5px}.active-posters .rank-position strong,.active-posters .rank-posts-counted strong,.active-posters .rank-posts-total strong{margin-right:3px;min-width:30px;text-align:right}.active-posters .rank-position .ui-preview-text,.active-posters .rank-posts-counted .ui-preview-text,.active-posters .rank-posts-total .ui-preview-text{font-size:8px;height:8px;line-height:8px;position:relative;top:-1px}}@media screen and (min-width:992px){.active-posters .rank-position,.active-posters .rank-posts-counted,.active-posters .rank-posts-total{float:left;font-size:18px;margin-top:3px;text-align:center;width:23%}.active-posters .rank-position small,.active-posters .rank-posts-counted small,.active-posters .rank-posts-total small{font-size:12px;font-weight:400}}.user-compact-stats .rank-position small,.user-compact-stats .rank-position strong,.user-compact-stats .rank-posts-counted small,.user-compact-stats .rank-posts-counted strong{display:inline-block;float:none}.user-compact-stats .rank-position strong,.user-compact-stats .rank-posts-counted strong{min-width:auto}.user-compact-stats .rank-position small,.user-compact-stats .rank-posts-counted small{margin-right:20px}@media screen and (min-width:768px) and (max-width:991px){.active-posters .rank-position{margin-top:6px}.active-posters .rank-posts-total{display:none}}.table-watching-preferences{margin-bottom:20px;max-width:100%;width:100%}.table-watching-preferences td,.table-watching-preferences th{border-bottom:1px solid #ddd;vertical-align:middle}.table-watching-label{padding:8px 8px 8px 0}.table-watching-option{padding:8px;text-align:center;width:100px}.table-watching-option label{margin:0;padding:5px;width:100%}.table-watching-option label,.table-watching-option label input{cursor:pointer}.table-watching-option label:hover{background-color:#ebecf0;border-radius:4px}.table-watching-option attr{cursor:help;display:block}.table-watching-option .material-icon{font-size:18px}.profile-page-header-avatar{margin:20px 0;text-align:center}.profile-page-header-avatar .user-avatar{border-radius:4px}.profile-data-list{display:block;font-size:12px;margin:0 -12px;padding:0}.profile-data-list li{display:inline-block;list-style:none;padding:5px 12px}.profile-data-list .status-icon{bottom:1px;margin-right:3px;position:relative}.profile-data-list .user-account-disabled{color:#ff5630;font-weight:700}@media screen and (min-width:768px){.profile-page-header{align-items:flex-end;display:flex}.profile-page-header-avatar{margin:0 30px 0 0}}@media screen and (min-width:992px){.profile-page-header-avatar{margin-top:-54px;position:relative;top:54px}.profile-page-header-details{padding-left:158px}.profile-data-list{font-size:14px}.username-history li{display:block;overflow:auto}}.username-history .change-avatar{float:left}.username-history .change-avatar a,.username-history .change-avatar span{margin-right:10px}.username-history .change-avatar a img,.username-history .change-avatar span img{height:42px;width:42px}@media screen and (min-width:992px){.username-history .change-avatar a img,.username-history .change-avatar span img{bottom:1px;height:18px;position:relative;width:18px}.username-history .change-author{float:left;width:30%}}.username-history .change{min-height:20px;overflow:auto}.username-history .change span{display:block;float:left}.username-history .change .material-icon{margin:0 7px;position:relative;top:4px}@media screen and (min-width:992px){.username-history .change{float:left;width:40%}.username-history .change-date{float:left;width:20%}}.search-footer p{color:#5e6c84;font-size:12px;margin-top:20px;text-align:center}@media screen and (min-width:768px){.page-search-form{padding-top:40px}}@media screen and (min-width:992px){.page-search-form{padding-bottom:40px}.page-search-form h1{position:relative;top:5px}.page-search-form .form-group{margin-bottom:0}}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.grow{flex-grow:1}.grow-0{flex-grow:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.content-center{align-content:center}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-between{align-content:space-between}.mx-0{margin:0}.mx-1{margin:5px 0}.mx-2{margin:10px 0}.mx-3{margin:20px 0}.mt-0{margin-top:0}.mt-1{margin-top:5px}.mt-2{margin-top:10px}.mt-3{margin-top:20px}.mb-0{margin-bottom:0}.mb-1{margin-bottom:5px}.mb-2{margin-bottom:10px}.mb-3{margin-bottom:20px}.text-sm{font-size:12px}.text-color,.text-gray-darker{color:#172b4d}.text-gray-dark{color:#344563}.text-gray{color:#5e6c84}.text-gray-light{color:#7a869a}.text-gray-lighter{color:#ebecf0}.link-gray-darker,.link-gray-darker:active .link-gray-darker:focus,.link-gray-darker:hover,.link-gray-darker:link,.link-gray-darker:visited,.link-text-color,.link-text-color:active .link-text-color:focus,.link-text-color:hover,.link-text-color:link,.link-text-color:visited{color:#172b4d}.link-gray-dark,.link-gray-dark:link,.link-gray-dark:visited{color:#344563}.link-gray-dark:active .link-gray-dark:focus,.link-gray-dark:hover{color:#172b4d}.link-gray,.link-gray:link,.link-gray:visited{color:#5e6c84}.link-gray:active .link-gray:focus,.link-gray:hover{color:#172b4d}.link-gray-light,.link-gray-light:link,.link-gray-light:visited{color:#7a869a}.link-gray-light:active .link-gray-light:focus,.link-gray-light:hover{color:#172b4d}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#fafafa;color:#383a42}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#a626a4}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#50a14f}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#986801}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#4078f2}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#c18401}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}.atwho-view{background:#fff;border:1px solid #ddd;border-radius:3px;box-shadow:0 0 5px rgba(0,0,0,.1);color:#000;display:none;left:0;margin-top:18px;min-width:120px;position:absolute;top:0;z-index:11110!important}.atwho-view .atwho-header{border-bottom:1px solid #eaeff1;color:#6f8092;cursor:pointer;font-size:11px;font-weight:700;margin:5px;padding:5px}.atwho-view .atwho-header .small{color:#6f8092;float:right;font-size:12px;font-weight:400;margin-right:-5px;padding-top:2px}.atwho-view .atwho-header:hover{cursor:default}.atwho-view .cur{background:#36f;color:#fff}.atwho-view .cur small{color:#fff}.atwho-view strong{color:#36f}.atwho-view .cur strong{color:#fff;font:700}.atwho-view ul{list-style:none;margin:auto;max-height:200px;overflow-y:auto;padding:0}.atwho-view ul li{border-bottom:1px solid #ddd;cursor:pointer;display:block;padding:5px 10px}.atwho-view small{color:#777;font-size:smaller;font-weight:400}abbr{outline:none;text-decoration:none}.shadow-2dp{box-shadow:0 2px 2px 0 rgba(0,0,0,.04),0 3px 1px -2px rgba(0,0,0,.06),0 1px 5px 0 rgba(0,0,0,.12)}.shadow-3dp{box-shadow:0 3px 4px 0 rgba(0,0,0,.04),0 3px 3px -2px rgba(0,0,0,.06),0 1px 8px 0 rgba(0,0,0,.12)}.shadow-4dp{box-shadow:0 4px 5px 0 rgba(0,0,0,.04),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-6dp{box-shadow:0 6px 10px 0 rgba(0,0,0,.04),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.06)}.shadow-8dp{box-shadow:0 8px 10px 1px rgba(0,0,0,.04),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.06)}.shadow-16dp{box-shadow:0 16px 24px 2px rgba(0,0,0,.04),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -5px rgba(0,0,0,.06)}.shadow-24dp{box-shadow:0 9px 46px 8px rgba(0,0,0,.04),0 11px 15px -7px rgba(0,0,0,.12),0 24px 38px 3px rgba(0,0,0,.06)}.btn-default,.btn-default.disabled,.btn-default.disabled:active,.btn-default.disabled:hover,.btn-default:disabled,.btn-default:disabled:hover{background:#ebecf0;border:1px solid #ebecf0;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.btn-default.disabled,.btn-default.disabled:active,.btn-default.disabled:hover,.btn-default:disabled,.btn-default:disabled:hover{filter:alpha(opacity=25);opacity:.25}.btn-default:focus,.btn-default:hover{background:#dfe1e6;border:1px solid #dfe1e6;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.btn-default:active,.btn-default:active:focus,.dropdown.open .dropdown-toggle .btn-default,.dropdown.open .dropdown-toggle .btn-default:active:focus,.dropdown.open .dropdown-toggle .btn-default:focus,.dropdown.open .dropdown-toggle .btn-default:hover{background:#c1c7d0;border:1px solid #c1c7d0;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.btn-default.btn-loading,.btn-default.btn-loading:active,.btn-default.btn-loading:active:focus,.btn-default.btn-loading:disabled,.btn-default.btn-loading:disabled:hover,.btn-default.btn-loading:focus,.btn-default.btn-loading:hover{color:transparent}.btn-primary,.btn-primary.disabled,.btn-primary.disabled:active,.btn-primary.disabled:hover,.btn-primary:disabled,.btn-primary:disabled:hover{background:#2563eb;border:1px solid #2563eb;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-primary.disabled,.btn-primary.disabled:active,.btn-primary.disabled:hover,.btn-primary:disabled,.btn-primary:disabled:hover{filter:alpha(opacity=25);opacity:.25}.btn-primary:focus,.btn-primary:hover{background:#3b82f6;border:1px solid #3b82f6;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-primary:active,.btn-primary:active:focus,.dropdown.open .dropdown-toggle .btn-primary,.dropdown.open .dropdown-toggle .btn-primary:active:focus,.dropdown.open .dropdown-toggle .btn-primary:focus,.dropdown.open .dropdown-toggle .btn-primary:hover{background:#1e40af;border:1px solid #1e40af;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-primary.btn-loading,.btn-primary.btn-loading:active,.btn-primary.btn-loading:active:focus,.btn-primary.btn-loading:disabled,.btn-primary.btn-loading:disabled:hover,.btn-primary.btn-loading:focus,.btn-primary.btn-loading:hover{color:transparent}.btn-success,.btn-success.disabled,.btn-success.disabled:active,.btn-success.disabled:hover,.btn-success:disabled,.btn-success:disabled:hover{background:#22c55e;border:1px solid #22c55e;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-success.disabled,.btn-success.disabled:active,.btn-success.disabled:hover,.btn-success:disabled,.btn-success:disabled:hover{filter:alpha(opacity=25);opacity:.25}.btn-success:focus,.btn-success:hover{background:#15803d;border:1px solid #15803d;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-success:active,.btn-success:active:focus,.dropdown.open .dropdown-toggle .btn-success,.dropdown.open .dropdown-toggle .btn-success:active:focus,.dropdown.open .dropdown-toggle .btn-success:focus,.dropdown.open .dropdown-toggle .btn-success:hover{background:#14532d;border:1px solid #14532d;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-success.btn-loading,.btn-success.btn-loading:active,.btn-success.btn-loading:active:focus,.btn-success.btn-loading:disabled,.btn-success.btn-loading:disabled:hover,.btn-success.btn-loading:focus,.btn-success.btn-loading:hover{color:transparent}.btn-danger,.btn-danger.disabled,.btn-danger.disabled:active,.btn-danger.disabled:hover,.btn-danger:disabled,.btn-danger:disabled:hover{background:#ef5350;border:1px solid #ef5350;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-danger.disabled,.btn-danger.disabled:active,.btn-danger.disabled:hover,.btn-danger:disabled,.btn-danger:disabled:hover{filter:alpha(opacity=25);opacity:.25}.btn-danger:focus,.btn-danger:hover{background:#ff8a80;border:1px solid #ff8a80;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-danger:active,.btn-danger:active:focus,.dropdown.open .dropdown-toggle .btn-danger,.dropdown.open .dropdown-toggle .btn-danger:active:focus,.dropdown.open .dropdown-toggle .btn-danger:focus,.dropdown.open .dropdown-toggle .btn-danger:hover{background:#d32f2f;border:1px solid #d32f2f;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-danger.btn-loading,.btn-danger.btn-loading:active,.btn-danger.btn-loading:active:focus,.btn-danger.btn-loading:disabled,.btn-danger.btn-loading:disabled:hover,.btn-danger.btn-loading:focus,.btn-danger.btn-loading:hover{color:transparent}.btn-default.btn-outline,.btn-default.btn-outline.disabled,.btn-default.btn-outline.disabled:active,.btn-default.btn-outline.disabled:hover,.btn-default.btn-outline:disabled,.btn-default.btn-outline:disabled:hover{background:#ebecf0;border:1px solid #ebecf0;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.btn-default.btn-outline.disabled,.btn-default.btn-outline.disabled:active,.btn-default.btn-outline.disabled:hover,.btn-default.btn-outline:disabled,.btn-default.btn-outline:disabled:hover{filter:alpha(opacity=25);opacity:.25}.btn-default.btn-outline:focus,.btn-default.btn-outline:hover{background:#dfe1e6;border:1px solid #dfe1e6;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.btn-default.btn-outline:active,.btn-default.btn-outline:active:focus,.dropdown.open .btn-default.btn-outline,.dropdown.open .btn-default.btn-outline:active:focus,.dropdown.open .btn-default.btn-outline:focus,.dropdown.open .btn-default.btn-outline:hover{background:#c1c7d0;border:1px solid #c1c7d0;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.btn-default.btn-outline.btn-loading,.btn-default.btn-outline.btn-loading:active,.btn-default.btn-outline.btn-loading:active:focus,.btn-default.btn-outline.btn-loading:disabled,.btn-default.btn-outline.btn-loading:disabled:hover,.btn-default.btn-outline.btn-loading:focus,.btn-default.btn-outline.btn-loading:hover{background:#ebecf0;border:1px solid #ebecf0;-webkit-box-shadow:none;box-shadow:none;color:transparent}.btn-primary.btn-outline,.btn-primary.btn-outline.disabled,.btn-primary.btn-outline.disabled:active,.btn-primary.btn-outline.disabled:hover,.btn-primary.btn-outline:disabled,.btn-primary.btn-outline:disabled:hover{background:#2563eb;border:1px solid #2563eb;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-primary.btn-outline.disabled,.btn-primary.btn-outline.disabled:active,.btn-primary.btn-outline.disabled:hover,.btn-primary.btn-outline:disabled,.btn-primary.btn-outline:disabled:hover{filter:alpha(opacity=25);opacity:.25}.btn-primary.btn-outline:focus,.btn-primary.btn-outline:hover{background:#3b82f6;border:1px solid #3b82f6;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-primary.btn-outline:active,.btn-primary.btn-outline:active:focus,.dropdown.open .btn-primary.btn-outline,.dropdown.open .btn-primary.btn-outline:active:focus,.dropdown.open .btn-primary.btn-outline:focus,.dropdown.open .btn-primary.btn-outline:hover{background:#1e40af;border:1px solid #1e40af;-webkit-box-shadow:none;box-shadow:none;color:#fff}.btn-primary.btn-outline.btn-loading,.btn-primary.btn-outline.btn-loading:active,.btn-primary.btn-outline.btn-loading:active:focus,.btn-primary.btn-outline.btn-loading:disabled,.btn-primary.btn-outline.btn-loading:disabled:hover,.btn-primary.btn-outline.btn-loading:focus,.btn-primary.btn-outline.btn-loading:hover{background:#2563eb;border:1px solid #2563eb;-webkit-box-shadow:none;box-shadow:none;color:transparent}.form-social-auth .row{margin-bottom:-6px;margin-top:-6px}.form-social-auth .btn{margin:6px 0}input.form-control,textarea.form-control{border-color:#ced0da;box-shadow:inset 0 0 0 1px #ced0da}input.form-control:focus,textarea.form-control:focus{border-color:#66afe9;box-shadow:inset 0 0 0 1px #66afe9}.has-error input.form-control{border-color:#ff5630;box-shadow:inset 0 0 0 1px #ff5630}.has-error input.form-control:focus{border-color:#ffa996;box-shadow:inset 0 0 0 1px #ffa996}.has-success input.form-control{border-color:#36b37e;box-shadow:inset 0 0 0 1px #36b37e}.has-success input.form-control:focus{border-color:#79d6af;box-shadow:inset 0 0 0 1px #79d6af}.password-strength{margin-top:10px}.password-strength .text-small{color:#3462af;font-size:12px;margin-top:4px}.password-strength .progress{margin:0}.auth-message{background:#091e42;box-shadow:0 8px 10px 1px rgba(0,0,0,.04),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.06);padding:80px 0}.auth-message p{color:#fff}.auth-message .btn{background:#f4f5f7;border-color:#f4f5f7;color:#172b4d}.auth-message .btn:focus,.auth-message .btn:hover{background:#dfe1e6;border-color:#dfe1e6;color:#172b4d}.auth-message .btn:active{background:#b3bac5;border-color:#b3bac5;color:#172b4d}.dropdown-menu{border:none;box-shadow:0 4px 5px 0 rgba(0,0,0,.04),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.06)}.user-dropdown .dropdown-header strong{color:#172b4d;display:block;font-weight:700}.user-dropdown .dropdown-header .user-stats{font-size:12px;margin-top:10px}.user-dropdown .dropdown-header .user-stats .material-icon{bottom:1px;font-size:14px;height:14px;margin-right:3px;position:relative;width:14px}.user-dropdown .guest-preview{padding-bottom:10px}.user-dropdown .badge{background-color:#ff5630}.user-dropdown .btn-link:active .badge,.user-dropdown .btn-link:focus .badge,.user-dropdown .btn-link:hover .badge,.user-dropdown a:active .badge,.user-dropdown a:focus .badge,.user-dropdown a:hover .badge{background-color:#fff;color:#ff5630}.mobile-dropdown.open{margin:0}.misago-footer{margin-top:40px}.misago-footer .footer-content{border-top:1px solid #ebecf0;color:#a5adba;padding-top:20px}@media screen and (max-width:767px){.misago-footer .footer-content{text-align:center}.misago-footer .footer-content .site-footnote{clear:both;margin-bottom:15px}}.misago-footer .footer-content a,.misago-footer .footer-content a:link,.misago-footer .footer-content a:visited{color:#a5adba}.misago-footer .footer-content a:focus,.misago-footer .footer-content a:hover{color:#7a8699}.misago-footer .footer-content .misago-branding,.misago-footer .footer-content .misago-branding:link,.misago-footer .footer-content .misago-branding:visited{color:#a5adba}.misago-footer .footer-content .misago-branding:focus,.misago-footer .footer-content .misago-branding:hover{color:#7a8699}.list-group{border-radius:3px}.list-group .list-group-item{border-left-color:#ebecf0;border-right-color:#ebecf0}.list-group .list-group-item:first-child{border-top-color:#ebecf0}.list-group .list-group-item:last-child{border-bottom-color:#ebecf0}.list-group-item.empty-message{padding-bottom:20px;padding-top:20px;text-align:center}.list-group-item.empty-message p{margin:10px 0}.nav-side{-webkit-box-shadow:none;box-shadow:none}.nav-side>.list-group-item{border-left:none;border-right:none;margin-bottom:1px}.nav-side>.list-group-item:first-child{border-top:none}.nav-side>.list-group-item:last-child{border-bottom:none}.nav-side>.list-group-item,.nav-side>.list-group-item:link,.nav-side>.list-group-item:visited{background:#f4f5f7;border:none;color:#172b4d}.nav-side>.list-group-item:active,.nav-side>.list-group-item:focus,.nav-side>.list-group-item:hover{background:#ebecf0;color:#172b4d}.nav-side>.list-group-item.active,.nav-side>.list-group-item.active:active,.nav-side>.list-group-item.active:focus,.nav-side>.list-group-item.active:hover,.nav-side>.list-group-item.active:link,.nav-side>.list-group-item.active:visited{background:#091e42;color:#fff;font-weight:700}.nav-side>.list-group-item.active .badge,.nav-side>.list-group-item.active:active .badge,.nav-side>.list-group-item.active:focus .badge,.nav-side>.list-group-item.active:hover .badge,.nav-side>.list-group-item.active:link .badge,.nav-side>.list-group-item.active:visited .badge{background:#f4f5f7;color:#172b4d}.username-history .user-avatar{border-radius:4px}.panel{border:none;border-radius:4px}.panel .panel-footer,.panel .panel-heading{background:#fff}.panel .panel-title{color:#5e6c84}.panel .form-group+.form-group{margin-top:20px}.panel .panel-body>.form-group:first-child{margin-top:10px}.panel fieldset{margin-top:20px}.panel fieldset:first-child{margin-top:0}.panel fieldset legend{border:none;color:#5e6c84;font-weight:300}.panel-message-body .message-icon{color:#2563eb}.panel-form{border:1px solid #ebecf0;box-shadow:none}.panel-form .panel-footer,.panel-form .panel-heading{border-color:#ebecf0}.poll-form .panel{margin:0}.help-block,.help-block .text-small{color:#7a869a}.panel-participants{border:1px solid #ebecf0}.participant-card .btn-user{border:0!important}.participant-card .dropdown-header-owner{color:#2563eb}.participant-card .dropdown-header-owner .material-icon{font-size:14px;height:14px;line-height:14px;width:14px}.participant-card .dropdown-header-owner .icon-text{margin-left:4px;position:relative;top:2px}.panel-participants p{color:#7a869a}@media screen and (max-width:767px){.panel-participants p{margin-top:10px;text-align:center}}.panel-poll{border:1px solid #ebecf0}.panel-poll .poll-select-choices{margin-top:-10px}.panel-poll .poll-details{color:#7a869a;font-size:12px;margin-bottom:20px}.panel-poll .progress{margin-bottom:5px;margin-top:6.66666667px}.panel-poll .poll-chart{color:#7a869a;font-size:12px}.panel-poll .poll-options{margin-top:20px}#posting-placeholder{background-color:#fafbfc}.posting-message .material-icon{color:#2563eb}.posting-message .btn{margin-top:20px}.panel-post{background:#fff;border:1px solid #ddd}.post-side{color:#7a869a}.post-side .poster-avatar{border-radius:4px}.post-side .user-title,.post-side .user-title a,.post-side .user-title a:active,.post-side .user-title a:focus,.post-side .user-title a:hover,.post-side .user-title a:link,.post-side .user-title a:visited{color:#5e6c84}.post-heading .label-unread{background-color:#2563eb;margin-right:16px}.post-heading .label-protected{margin-left:24px;position:relative;top:1px}.post-heading .label-protected .material-icon{font-size:16px;line-height:16px;margin-right:2px;position:relative;top:-1px}.post-heading>.btn-link{padding-left:0;padding-right:0}.post-heading>.btn-link,.post-heading>.btn-link:link,.post-heading>.btn-link:visited{color:#7a869a}.post-heading>.btn-link:active,.post-heading>.btn-link:focus,.post-heading>.btn-link:focus:active,.post-heading>.btn-link:hover{color:#172b4d;text-decoration:none}.post-heading .btn-see-edits{margin-left:24px}.post-status-message{border-radius:4px;margin-top:10px;padding:6px 12px}@media screen and (max-width:767px){.post-status-message{font-size:12px}.post-status-message .material-icon{margin-top:3px}.post-status-message p{margin-top:0}}.post-body:last-child{padding-bottom:10px}.post-attachments{background-color:#ebecf0;border:none;border-radius:4px;margin-bottom:30px}.post-attachments:last-child{margin-bottom:10px}@media screen and (max-width:767px){.post-attachments{border-radius:0;margin:0 -15px 20px}}.post-footer>.btn-link{padding-left:0;padding-right:0}.post-footer>.btn-link,.post-footer>.btn-link:link,.post-footer>.btn-link:visited{color:#7a869a}.post-footer>.btn-link:active,.post-footer>.btn-link:focus,.post-footer>.btn-link:focus:active,.post-footer>.btn-link:hover{color:#172b4d;text-decoration:none}.post-footer p{color:#7a869a;font-size:12px}.post-body-hidden,.post-body-invalid{padding-bottom:10px;padding-top:10px}.post-body-hidden .lead,.post-body-invalid .lead{margin-bottom:10px}.post-body-hidden .text-muted,.post-body-invalid .text-muted{font-size:12px;margin-bottom:0}.post-hidden{filter:alpha(opacity=75);opacity:.75}.post-feed .panel-body{padding-bottom:0}.post-feed .post-body{max-height:300px;overflow-y:hidden;padding-bottom:20px;padding-top:0;position:relative}.post-feed .post-body:after{bottom:0;box-shadow:0 0 16px 16px #fff;color:transparent;content:"-";display:block;height:0;position:absolute;width:100%}.posts-list .event .event-label{margin-bottom:5px}.posts-list .event .label-unread{background-color:#2563eb;color:#fff}.posts-list .event-info .btn-link,.posts-list .event-info a,.posts-list .event-info a:link,.posts-list .event-info a:visited{color:#5e6c84}.posts-list .event-info .btn-link:active,.posts-list .event-info .btn-link:focus,.posts-list .event-info .btn-link:focus:active,.posts-list .event-info a:active,.posts-list .event-info a:focus,.posts-list .event-info a:focus:active{color:#172b4d}.posts-list .event-hidden{filter:alpha(opacity=33);opacity:.33}.user-card{background:#f4f5f7}.user-card-avatar img,.user-card-small-avatar img{border-radius:4px}.user-card-avatar{margin:20px 0}.user-card-avatar img{height:150px;width:150px}.user-card-username a,.user-card-username a:active,.user-card-username a:focus,.user-card-username a:hover,.user-card-username a:link,.user-card-username a:visited{color:#172b4d;font-size:18px;font-weight:700}.user-card-title a,.user-card-title a:link,.user-card-title a:visited,.user-card-title span{color:#5e6c84}.user-card-title a:active,.user-card-title a:focus,.user-card-title a:hover{color:#172b4d}@media screen and (min-width:768px){.user-card-stats{margin-top:20px}}.user-card-stats ul{margin:0}.user-card-stats li{color:#7a869a;display:inline-block;font-size:12px;margin-right:12px}@media screen and (min-width:768px){.user-card-stats li{margin:0 6px}}.user-card-stats li.user-stat-empty{display:none}@media screen and (min-width:768px){li.user-stat-divider{display:block;margin:0}}@media screen and (max-width:767px){li.user-stat-divider{display:none}}@media screen and (min-width:768px){.user-card-stats{min-height:60px}}@media screen and (max-width:767px){.user-card-left{padding-right:0}}.progress,.progress .progress-bar{-webkit-box-shadow:none;box-shadow:none;height:8px}.misago-markup img{border-radius:4px}.misago-markup .spoiler-body{background:transparent;color:#172b4d;-webkit-filter:blur(5px);-moz-filter:blur(5px);-o-filter:blur(5px);-ms-filter:blur(5px);filter:blur(5px)}.misago-markup .spoiler-block.revealed .spoiler-body{-webkit-filter:none;-moz-filter:none;-o-filter:none;-ms-filter:none;filter:none}.misago-markup .spoiler-overlay{align-items:center;background:hsla(0,0%,100%,.1);display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.misago-markup .spoiler-reveal{background-color:#ebecf0;border-color:#ccc;color:#172b4d}.misago-markup .spoiler-reveal.focus,.misago-markup .spoiler-reveal:focus{background-color:#ced0da;border-color:#8c8c8c;color:#172b4d}.misago-markup .spoiler-reveal:hover{background-color:#ced0da;border-color:#adadad;color:#172b4d}.misago-markup .spoiler-reveal.active,.misago-markup .spoiler-reveal:active,.open>.dropdown-toggle.misago-markup .spoiler-reveal{background-color:#ced0da;background-image:none;border-color:#adadad;color:#172b4d}.misago-markup .spoiler-reveal.active.focus,.misago-markup .spoiler-reveal.active:focus,.misago-markup .spoiler-reveal.active:hover,.misago-markup .spoiler-reveal:active.focus,.misago-markup .spoiler-reveal:active:focus,.misago-markup .spoiler-reveal:active:hover,.open>.dropdown-toggle.misago-markup .spoiler-reveal.focus,.open>.dropdown-toggle.misago-markup .spoiler-reveal:focus,.open>.dropdown-toggle.misago-markup .spoiler-reveal:hover{background-color:#b9bdcb;border-color:#8c8c8c;color:#172b4d}.misago-markup .spoiler-reveal.disabled.focus,.misago-markup .spoiler-reveal.disabled:focus,.misago-markup .spoiler-reveal.disabled:hover,.misago-markup .spoiler-reveal[disabled].focus,.misago-markup .spoiler-reveal[disabled]:focus,.misago-markup .spoiler-reveal[disabled]:hover,fieldset[disabled] .misago-markup .spoiler-reveal.focus,fieldset[disabled] .misago-markup .spoiler-reveal:focus,fieldset[disabled] .misago-markup .spoiler-reveal:hover{background-color:#ebecf0;border-color:#ccc}.misago-markup .spoiler-reveal .badge{background-color:#172b4d;color:#ebecf0}.misago-markup .spoiler-reveal,.misago-markup .spoiler-reveal.disabled,.misago-markup .spoiler-reveal.disabled:active,.misago-markup .spoiler-reveal.disabled:hover,.misago-markup .spoiler-reveal:disabled,.misago-markup .spoiler-reveal:disabled:hover{background:#ebecf0;border:1px solid #ebecf0;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.misago-markup .spoiler-reveal.disabled,.misago-markup .spoiler-reveal.disabled:active,.misago-markup .spoiler-reveal.disabled:hover,.misago-markup .spoiler-reveal:disabled,.misago-markup .spoiler-reveal:disabled:hover{filter:alpha(opacity=25);opacity:.25}.misago-markup .spoiler-reveal:focus,.misago-markup .spoiler-reveal:hover{background:#dfe1e6;border:1px solid #dfe1e6;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.dropdown.open .dropdown-toggle .misago-markup .spoiler-reveal,.dropdown.open .dropdown-toggle .misago-markup .spoiler-reveal:active:focus,.dropdown.open .dropdown-toggle .misago-markup .spoiler-reveal:focus,.dropdown.open .dropdown-toggle .misago-markup .spoiler-reveal:hover,.misago-markup .spoiler-reveal:active,.misago-markup .spoiler-reveal:active:focus{background:#c1c7d0;border:1px solid #c1c7d0;-webkit-box-shadow:none;box-shadow:none;color:#172b4d}.misago-markup .spoiler-reveal.btn-loading,.misago-markup .spoiler-reveal.btn-loading:active,.misago-markup .spoiler-reveal.btn-loading:active:focus,.misago-markup .spoiler-reveal.btn-loading:disabled,.misago-markup .spoiler-reveal.btn-loading:disabled:hover,.misago-markup .spoiler-reveal.btn-loading:focus,.misago-markup .spoiler-reveal.btn-loading:hover{color:transparent}.misago-markup .spoiler-reveal,.misago-markup .spoiler-reveal:active,.misago-markup .spoiler-reveal:hover{border-radius:4px;box-shadow:0 0 0 4px #fff;padding:6px 12px}.modal-header{background:#fff;border-bottom-color:#ced0da;border-radius:6px 6px 0 0;color:#172b4d}.modal-header .close{color:#172b4d;font-size:24px;line-height:24px;padding:0 6px;text-shadow:none}.modal-message .message-icon{color:#2563eb}.modal-body>.form-group{margin:20px 0}.modal-body>.form-group:first-child{margin-top:0}.modal-body>.form-group:last-child{margin-bottom:0}.modal-sign-in .modal-body{padding-bottom:0;padding-top:0}.modal-sign-in .modal-body>.form-group{margin:20px 0}.legal-footnote label{font-weight:700}.legal-footnote .help-block{color:#ff5630;margin-left:20px}.modal-avatar-index .avatar-preview{background:#fff;border-radius:6px}.modal-avatar-crop .cropit-preview{background:#fff;margin:20px 0}.modal-avatar-crop .cropit-image-zoom-input{margin-bottom:20px;margin-top:40px}.modal-post-likers .media{border-bottom:1px solid #ebecf0;padding-bottom:15px}.modal-post-likers .media img{border-radius:4px;height:40px;width:40px}.modal-post-likers .media:last-child{border:none;padding-bottom:0}.well{border:1px solid #ddd}.active-posters .rank-user-avatar img{border-radius:4px}.active-posters .user-details{color:#7a869a}.active-posters .user-details a.rank-name,.active-posters .user-details a.rank-name:link,.active-posters .user-details a.rank-name:visited{color:#5e6c84;font-weight:400}.active-posters .user-details a.rank-name:active,.active-posters .user-details a.rank-name:focus,.active-posters .user-details a.rank-name:hover{color:#172b4d}.active-posters .user-details span.rank-name{color:#5e6c84;font-weight:400}.active-posters small{color:#7a869a}.page-error .message-icon{color:#ef5350}.page-message .message-icon,.page-message-info .message-icon{color:#2563eb}.page-message-success .message-icon{color:#81c784}.page-account-settings .help-block a,.page-account-settings .help-block a:link,.page-account-settings .help-block a:visited{color:#5e6c84}.page-account-settings .help-block a:active,.page-account-settings .help-block a:focus,.page-account-settings .help-block a:focus:active,.page-account-settings .help-block a:hover{color:#172b4d}.panel-profile-details-group.panel{border:1px solid #ebecf0}.panel-profile-details-group.panel .form-group{margin:0}.panel-profile-details-group .form-control-static p:last-child{margin-bottom:0}.post-primary .panel-post{border-color:#a5b4fc}.post-primary .user-title,.post-primary .user-title a,.post-primary .user-title a:active,.post-primary .user-title a:focus,.post-primary .user-title a:hover,.post-primary .user-title a:link,.post-primary .user-title a:visited{color:#6366f1}.post-success .panel-post{border-color:#00c853}.post-success .user-title,.post-success .user-title a,.post-success .user-title a:active,.post-success .user-title a:focus,.post-success .user-title a:hover,.post-success .user-title a:link,.post-success .user-title a:visited{color:#388e3c}.post-warning .panel-post{border-color:#ffab40}.post-warning .user-title,.post-warning .user-title a,.post-warning .user-title a:active,.post-warning .user-title a:focus,.post-warning .user-title a:hover,.post-warning .user-title a:link,.post-warning .user-title a:visited{color:#ff6d00}.post-danger .panel-post{border-color:#ff8a80}.post-danger .user-title,.post-danger .user-title a,.post-danger .user-title a:active,.post-danger .user-title a:focus,.post-danger .user-title a:hover,.post-danger .user-title a:link,.post-danger .user-title a:visited{color:#d50000}.user-card-primary .panel-body{background:#fff;border:2px solid #a5b4fc;border-radius:4px;padding:13px}.user-card-primary .user-card-title,.user-card-primary .user-card-title a.user-title,.user-card-primary .user-card-title a.user-title:active,.user-card-primary .user-card-title a.user-title:focus,.user-card-primary .user-card-title a.user-title:hover,.user-card-primary .user-card-title a.user-title:link,.user-card-primary .user-card-title a.user-title:visited{color:#6366f1}.user-card-success .panel-body{background:#fff;border:2px solid #00c853;border-radius:4px;padding:13px}.user-card-success .user-card-title,.user-card-success .user-card-title a.user-title,.user-card-success .user-card-title a.user-title:active,.user-card-success .user-card-title a.user-title:focus,.user-card-success .user-card-title a.user-title:hover,.user-card-success .user-card-title a.user-title:link,.user-card-success .user-card-title a.user-title:visited{color:#388e3c}.user-card-warning .panel-body{background:#fff;border:2px solid #ffab40;border-radius:4px;padding:13px}.user-card-warning .user-card-title,.user-card-warning .user-card-title a.user-title,.user-card-warning .user-card-title a.user-title:active,.user-card-warning .user-card-title a.user-title:focus,.user-card-warning .user-card-title a.user-title:hover,.user-card-warning .user-card-title a.user-title:link,.user-card-warning .user-card-title a.user-title:visited{color:#ff6d00}.user-card-danger .panel-body{background:#fff;border:2px solid #ff8a80;border-radius:4px;padding:13px}.user-card-danger .user-card-title,.user-card-danger .user-card-title a.user-title,.user-card-danger .user-card-title a.user-title:active,.user-card-danger .user-card-title a.user-title:focus,.user-card-danger .user-card-title a.user-title:hover,.user-card-danger .user-card-title a.user-title:link,.user-card-danger .user-card-title a.user-title:visited{color:#d50000}.list-group .list-group-rank-primary{border-left:4px solid #a5b4fc;padding-left:11px}.list-group .list-group-rank-primary a.rank-name,.list-group .list-group-rank-primary a.rank-name:active,.list-group .list-group-rank-primary a.rank-name:focus,.list-group .list-group-rank-primary a.rank-name:hover,.list-group .list-group-rank-primary a.rank-name:link,.list-group .list-group-rank-primary a.rank-name:visited,.list-group .list-group-rank-primary span.rank-name{color:#6366f1}.list-group .list-group-rank-success{border-left:4px solid #9ccc65;padding-left:11px}.list-group .list-group-rank-success a.rank-name,.list-group .list-group-rank-success a.rank-name:active,.list-group .list-group-rank-success a.rank-name:focus,.list-group .list-group-rank-success a.rank-name:hover,.list-group .list-group-rank-success a.rank-name:link,.list-group .list-group-rank-success a.rank-name:visited,.list-group .list-group-rank-success span.rank-name{color:#388e3c}.list-group .list-group-rank-warning{border-left:4px solid #ff7043;padding-left:11px}.list-group .list-group-rank-warning a.rank-name,.list-group .list-group-rank-warning a.rank-name:active,.list-group .list-group-rank-warning a.rank-name:focus,.list-group .list-group-rank-warning a.rank-name:hover,.list-group .list-group-rank-warning a.rank-name:link,.list-group .list-group-rank-warning a.rank-name:visited,.list-group .list-group-rank-warning span.rank-name{color:#ff6d00}.list-group .list-group-rank-danger{border-left:4px solid #f44336;padding-left:11px}.list-group .list-group-rank-danger a.rank-name,.list-group .list-group-rank-danger a.rank-name:active,.list-group .list-group-rank-danger a.rank-name:focus,.list-group .list-group-rank-danger a.rank-name:hover,.list-group .list-group-rank-danger a.rank-name:link,.list-group .list-group-rank-danger a.rank-name:visited,.list-group .list-group-rank-danger span.rank-name{color:#d50000}.page-header-rank-primary .user-rank,.page-header-rank-primary .user-rank a,.page-header-rank-primary .user-rank a:active,.page-header-rank-primary .user-rank a:focus,.page-header-rank-primary .user-rank a:hover,.page-header-rank-primary .user-rank a:link,.page-header-rank-primary .user-rank a:visited{color:#6366f1}.page-header-rank-success .user-rank,.page-header-rank-success .user-rank a,.page-header-rank-success .user-rank a:active,.page-header-rank-success .user-rank a:focus,.page-header-rank-success .user-rank a:hover,.page-header-rank-success .user-rank a:link,.page-header-rank-success .user-rank a:visited{color:#388e3c}.page-header-rank-warning .user-rank,.page-header-rank-warning .user-rank a,.page-header-rank-warning .user-rank a:active,.page-header-rank-warning .user-rank a:focus,.page-header-rank-warning .user-rank a:hover,.page-header-rank-warning .user-rank a:link,.page-header-rank-warning .user-rank a:visited{color:#ff6d00}.page-header-rank-danger .user-rank,.page-header-rank-danger .user-rank a,.page-header-rank-danger .user-rank a:active,.page-header-rank-danger .user-rank a:focus,.page-header-rank-danger .user-rank a:hover,.page-header-rank-danger .user-rank a:link,.page-header-rank-danger .user-rank a:visited{color:#d50000}.d-js-block,.d-js-flex{display:none}.misago-javascript .d-js-block{display:block}.misago-javascript .d-js-flex{display:flex} /*# sourceMappingURL=misago.css.map*/ \ No newline at end of file diff --git a/misago/static/misago/css/misago.css.map b/misago/static/misago/css/misago.css.map index 8253925dae..789f87d19c 100644 --- a/misago/static/misago/css/misago.css.map +++ b/misago/static/misago/css/misago.css.map @@ -1 +1 @@ -{"version":3,"file":"../css/misago.css","mappings":"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,COhZA,YAAuB,gBPmZvB,COlZA,aAAuB,iBPqZvB,COpZA,cAAuB,kBPuZvB,COtZA,aAAuB,kBPyZvB,COtZA,gBAAuB,wBPyZvB,COxZA,gBAAuB,wBP2ZvB,CO1ZA,iBAAuB,yBP6ZvB,CO1ZA,YACE,aP4ZF,CO1ZA,cCvGE,aRogBF,CQngBE,0CAEE,aRqgBJ,CO9ZA,cC1GE,aR2gBF,CQ1gBE,0CAEE,aR4gBJ,COlaA,WC7GE,aRkhBF,CQjhBE,oCAEE,aRmhBJ,COtaA,cChHE,aRyhBF,CQxhBE,0CAEE,aR0hBJ,CO1aA,aCnHE,aRgiBF,CQ/hBE,wCAEE,aRiiBJ,CO1aA,YE1HE,yBF6HA,UP2aF,CSviBE,sCAEE,wBTyiBJ,CO5aA,YEhIE,wBT+iBF,CS9iBE,sCAEE,wBTgjBJ,COhbA,SEnIE,wBTsjBF,CSrjBE,gCAEE,wBTujBJ,COpbA,YEtIE,wBT6jBF,CS5jBE,sCAEE,wBT8jBJ,COxbA,WEzIE,wBTokBF,CSnkBE,oCAEE,wBTqkBJ,COvbA,aAGE,gCADA,mBADA,kBP2bF,COjbA,MAGE,mBADA,YPobF,COtbA,wBAMI,ePsbJ,COzaA,4BAJE,eAAgB,CADhB,cPubF,COlbA,aAEE,gBPgbF,COlbA,gBAKI,oBAAqB,CAErB,gBAAiB,CADjB,iBPibJ,CO3aA,GAEE,mBADA,YP8aF,CO3aA,MAEE,sBP6aF,CO3aA,GACE,eP6aF,CO3aA,GACE,aP6aF,COhaE,2CAII,UAAW,CAFX,UAAW,CGrNf,eAAgB,CHwNZ,gBAAiB,CGvNrB,sBAAuB,CACvB,kBAAmB,CHoNf,WPuaJ,CO1aA,kBASI,iBPoaJ,CACF,CO1ZA,sCAEE,WP4ZF,COzZA,YACE,aAAc,CA9IO,wBP0iBvB,COvZA,WAIE,8BADA,iBADA,gBADA,iBP4ZF,COpZI,0EACE,ePwZN,COlaA,qDAsBI,cAHA,aAAc,CACd,aAAc,CACd,sBPqZJ,COlZI,0EACE,qBPsZN,CO9YA,0CAME,aAAc,CADd,+BAFA,cAAe,CADf,kBAAmB,CAEnB,gBPkZF,CO1YI,gNAAW,UPkZf,COjZI,0MACE,qBPwZN,COlZA,QAEE,iBAAkB,CAClB,uBAFA,kBPsZF,CW5rBA,kBAIE,uDX8rBF,CW1rBA,KAIE,yBACA,kBAFA,aX8rBF,CWxrBA,SAPE,aAAc,CADd,eXwsBF,CWhsBA,IAIE,sBACA,kBACA,0CAHA,UX6rBF,CWhsBA,QAYI,eAAgB,CAFhB,cAAe,CACf,eAAgB,CAFhB,SX6rBJ,CWrrBA,IAQE,oBAAqB,CACrB,yBACA,sBACA,kBALA,cALA,aAAc,CAGd,eACA,uBAFA,gBADA,cAKA,oBX2rBF,CWlsBA,SAmBI,4BAA6B,CAC7B,eAAgB,CAHhB,aAAc,CADd,iBAAkB,CADlB,SAAU,CAGV,oBXwrBJ,CWjrBA,gBACE,iBACA,iBXmrBF,CY7uBA,WCAE,gBAAiB,CADjB,iBAAkB,CADlB,kBADA,kBbsvBF,CYhvBE,oCACE,WZmvBF,CACF,CYlvBE,oCACE,WZqvBF,CACF,CYpvBE,qCACE,YZuvBF,CACF,CY9uBA,iBCpBE,gBAAiB,CADjB,iBAAkB,CADlB,kBADA,kBb2wBF,CY3uBA,KCtBE,kBADA,kBbswBF,CY3uBA,gBAEE,aAAc,CADd,cZ8uBF,CY/uBA,8BAMI,cAAe,CADf,eZ8uBJ,Cc7xBC,4eCmBK,cAAe,CAGf,kBADA,mBAJA,iBfi0BN,Ccl1BC,2HCuCK,UfyzBN,Cch2BC,WC+CG,UfozBJ,Ccn2BC,WC+CG,kBfuzBJ,Cct2BC,WC+CG,kBf0zBJ,Ccz2BC,UC+CG,Sf6zBJ,Cc52BC,UC+CG,kBfg0BJ,Cc/2BC,UC+CG,kBfm0BJ,Ccl3BC,UC+CG,Sfs0BJ,Ccr3BC,UC+CG,kBfy0BJ,Ccx3BC,UC+CG,kBf40BJ,Cc33BC,UC+CG,Sf+0BJ,Cc93BC,UC+CG,kBfk1BJ,Ccj4BC,UC+CG,iBfq1BJ,Ccp4BC,gBC8DG,Ufy0BJ,Ccv4BC,gBC8DG,kBf40BJ,Cc14BC,gBC8DG,kBf+0BJ,Cc74BC,eC8DG,Sfk1BJ,Cch5BC,eC8DG,kBfq1BJ,Ccn5BC,eC8DG,kBfw1BJ,Cct5BC,eC8DG,Sf21BJ,Ccz5BC,eC8DG,kBf81BJ,Cc55BC,eC8DG,kBfi2BJ,Cc/5BC,eC8DG,Sfo2BJ,Ccl6BC,eC8DG,kBfu2BJ,Ccr6BC,eC8DG,iBf02BJ,Ccx6BC,eCmEG,Ufw2BJ,Cc36BC,gBCoDG,Sf03BJ,Cc96BC,gBCoDG,iBf63BJ,Ccj7BC,gBCoDG,iBfg4BJ,Ccp7BC,eCoDG,Qfm4BJ,Ccv7BC,eCoDG,iBfs4BJ,Cc17BC,eCoDG,iBfy4BJ,Cc77BC,eCoDG,Qf44BJ,Cch8BC,eCoDG,iBf+4BJ,Ccn8BC,eCoDG,iBfk5BJ,Cct8BC,eCoDG,Qfq5BJ,Ccz8BC,eCoDG,iBfw5BJ,Cc58BC,eCoDG,gBf25BJ,Cc/8BC,eCyDG,Sfy5BJ,Ccl9BC,kBCwEG,gBf64BJ,Ccr9BC,kBCwEG,wBfg5BJ,Ccx9BC,kBCwEG,wBfm5BJ,Cc39BC,iBCwEG,efs5BJ,Cc99BC,iBCwEG,wBfy5BJ,Ccj+BC,iBCwEG,wBf45BJ,Ccp+BC,iBCwEG,ef+5BJ,Ccv+BC,iBCwEG,wBfk6BJ,Cc1+BC,iBCwEG,wBfq6BJ,Cc7+BC,iBCwEG,efw6BJ,Cch/BC,iBCwEG,wBf26BJ,Ccn/BC,iBCwEG,uBf86BJ,Cct/BC,iBCwEG,afi7BJ,CYh7BA,yBEzEC,2HCuCK,Ufi+BJ,CcxgCD,WC+CG,Uf49BF,Cc3gCD,WC+CG,kBf+9BF,Cc9gCD,WC+CG,kBfk+BF,CcjhCD,UC+CG,Sfq+BF,CcphCD,UC+CG,kBfw+BF,CcvhCD,UC+CG,kBf2+BF,Cc1hCD,UC+CG,Sf8+BF,Cc7hCD,UC+CG,kBfi/BF,CchiCD,UC+CG,kBfo/BF,CcniCD,UC+CG,Sfu/BF,CctiCD,UC+CG,kBf0/BF,CcziCD,UC+CG,iBf6/BF,Cc5iCD,gBC8DG,Ufi/BF,Cc/iCD,gBC8DG,kBfo/BF,CcljCD,gBC8DG,kBfu/BF,CcrjCD,eC8DG,Sf0/BF,CcxjCD,eC8DG,kBf6/BF,Cc3jCD,eC8DG,kBfggCF,Cc9jCD,eC8DG,SfmgCF,CcjkCD,eC8DG,kBfsgCF,CcpkCD,eC8DG,kBfygCF,CcvkCD,eC8DG,Sf4gCF,Cc1kCD,eC8DG,kBf+gCF,Cc7kCD,eC8DG,iBfkhCF,CchlCD,eCmEG,UfghCF,CcnlCD,gBCoDG,SfkiCF,CctlCD,gBCoDG,iBfqiCF,CczlCD,gBCoDG,iBfwiCF,Cc5lCD,eCoDG,Qf2iCF,Cc/lCD,eCoDG,iBf8iCF,CclmCD,eCoDG,iBfijCF,CcrmCD,eCoDG,QfojCF,CcxmCD,eCoDG,iBfujCF,Cc3mCD,eCoDG,iBf0jCF,Cc9mCD,eCoDG,Qf6jCF,CcjnCD,eCoDG,iBfgkCF,CcpnCD,eCoDG,gBfmkCF,CcvnCD,eCyDG,SfikCF,Cc1nCD,kBCwEG,gBfqjCF,Cc7nCD,kBCwEG,wBfwjCF,CchoCD,kBCwEG,wBf2jCF,CcnoCD,iBCwEG,ef8jCF,CctoCD,iBCwEG,wBfikCF,CczoCD,iBCwEG,wBfokCF,Cc5oCD,iBCwEG,efukCF,Cc/oCD,iBCwEG,wBf0kCF,CclpCD,iBCwEG,wBf6kCF,CcrpCD,iBCwEG,efglCF,CcxpCD,iBCwEG,wBfmlCF,Cc3pCD,iBCwEG,uBfslCF,Cc9pCD,iBCwEG,afylCF,CACF,CYhlCA,yBElFC,2HCuCK,Uf0oCJ,CcjrCD,WC+CG,UfqoCF,CcprCD,WC+CG,kBfwoCF,CcvrCD,WC+CG,kBf2oCF,Cc1rCD,UC+CG,Sf8oCF,Cc7rCD,UC+CG,kBfipCF,CchsCD,UC+CG,kBfopCF,CcnsCD,UC+CG,SfupCF,CctsCD,UC+CG,kBf0pCF,CczsCD,UC+CG,kBf6pCF,Cc5sCD,UC+CG,SfgqCF,Cc/sCD,UC+CG,kBfmqCF,CcltCD,UC+CG,iBfsqCF,CcrtCD,gBC8DG,Uf0pCF,CcxtCD,gBC8DG,kBf6pCF,Cc3tCD,gBC8DG,kBfgqCF,Cc9tCD,eC8DG,SfmqCF,CcjuCD,eC8DG,kBfsqCF,CcpuCD,eC8DG,kBfyqCF,CcvuCD,eC8DG,Sf4qCF,Cc1uCD,eC8DG,kBf+qCF,Cc7uCD,eC8DG,kBfkrCF,CchvCD,eC8DG,SfqrCF,CcnvCD,eC8DG,kBfwrCF,CctvCD,eC8DG,iBf2rCF,CczvCD,eCmEG,UfyrCF,Cc5vCD,gBCoDG,Sf2sCF,Cc/vCD,gBCoDG,iBf8sCF,CclwCD,gBCoDG,iBfitCF,CcrwCD,eCoDG,QfotCF,CcxwCD,eCoDG,iBfutCF,Cc3wCD,eCoDG,iBf0tCF,Cc9wCD,eCoDG,Qf6tCF,CcjxCD,eCoDG,iBfguCF,CcpxCD,eCoDG,iBfmuCF,CcvxCD,eCoDG,QfsuCF,Cc1xCD,eCoDG,iBfyuCF,Cc7xCD,eCoDG,gBf4uCF,CchyCD,eCyDG,Sf0uCF,CcnyCD,kBCwEG,gBf8tCF,CctyCD,kBCwEG,wBfiuCF,CczyCD,kBCwEG,wBfouCF,Cc5yCD,iBCwEG,efuuCF,Cc/yCD,iBCwEG,wBf0uCF,CclzCD,iBCwEG,wBf6uCF,CcrzCD,iBCwEG,efgvCF,CcxzCD,iBCwEG,wBfmvCF,Cc3zCD,iBCwEG,wBfsvCF,Cc9zCD,iBCwEG,efyvCF,Ccj0CD,iBCwEG,wBf4vCF,Ccp0CD,iBCwEG,uBf+vCF,Ccv0CD,iBCwEG,afkwCF,CACF,CYhvCA,0BE3FC,2HCuCK,UfmzCJ,Cc11CD,WC+CG,Uf8yCF,Cc71CD,WC+CG,kBfizCF,Cch2CD,WC+CG,kBfozCF,Ccn2CD,UC+CG,SfuzCF,Cct2CD,UC+CG,kBf0zCF,Ccz2CD,UC+CG,kBf6zCF,Cc52CD,UC+CG,Sfg0CF,Cc/2CD,UC+CG,kBfm0CF,Ccl3CD,UC+CG,kBfs0CF,Ccr3CD,UC+CG,Sfy0CF,Ccx3CD,UC+CG,kBf40CF,Cc33CD,UC+CG,iBf+0CF,Cc93CD,gBC8DG,Ufm0CF,Ccj4CD,gBC8DG,kBfs0CF,Ccp4CD,gBC8DG,kBfy0CF,Ccv4CD,eC8DG,Sf40CF,Cc14CD,eC8DG,kBf+0CF,Cc74CD,eC8DG,kBfk1CF,Cch5CD,eC8DG,Sfq1CF,Ccn5CD,eC8DG,kBfw1CF,Cct5CD,eC8DG,kBf21CF,Ccz5CD,eC8DG,Sf81CF,Cc55CD,eC8DG,kBfi2CF,Cc/5CD,eC8DG,iBfo2CF,Ccl6CD,eCmEG,Ufk2CF,Ccr6CD,gBCoDG,Sfo3CF,Ccx6CD,gBCoDG,iBfu3CF,Cc36CD,gBCoDG,iBf03CF,Cc96CD,eCoDG,Qf63CF,Ccj7CD,eCoDG,iBfg4CF,Ccp7CD,eCoDG,iBfm4CF,Ccv7CD,eCoDG,Qfs4CF,Cc17CD,eCoDG,iBfy4CF,Cc77CD,eCoDG,iBf44CF,Cch8CD,eCoDG,Qf+4CF,Ccn8CD,eCoDG,iBfk5CF,Cct8CD,eCoDG,gBfq5CF,Ccz8CD,eCyDG,Sfm5CF,Cc58CD,kBCwEG,gBfu4CF,Cc/8CD,kBCwEG,wBf04CF,Ccl9CD,kBCwEG,wBf64CF,Ccr9CD,iBCwEG,efg5CF,Ccx9CD,iBCwEG,wBfm5CF,Cc39CD,iBCwEG,wBfs5CF,Cc99CD,iBCwEG,efy5CF,Ccj+CD,iBCwEG,wBf45CF,Ccp+CD,iBCwEG,wBf+5CF,Ccv+CD,iBCwEG,efk6CF,Cc1+CD,iBCwEG,wBfq6CF,Cc7+CD,iBCwEG,uBfw6CF,Cch/CD,iBCwEG,af26CF,CACF,CgB7+CA,MACE,4BhB++CF,CgBh/CA,uBASI,oBAAqB,CACrB,UAAW,CAFX,ehB6+CJ,CgBt+CI,4CAEE,kBAAmB,CACnB,UAAW,CAFX,ehB2+CN,CgBp+CA,QAGE,cADA,mBADA,ehBy+CF,CgBn+CA,WAHE,ehBy+CF,CgB/9CA,OAGE,mBADA,cAAe,CADf,UhBm+CF,CgBp+CA,kHAcQ,0BAFA,uBADA,YAEA,kBhBk+CR,CgB/+CA,mBAqBI,6BADA,qBhB+9CJ,CgBn/CA,oPA8BQ,YhB69CR,CgB3/CA,mBAoCI,yBhB09CJ,CgB9/CA,cAyCI,qBhBw9CJ,CgBj9CA,8KAOQ,WhBk9CR,CgBv8CA,wLAQQ,qBhB08CR,CgBl9CA,wDAeM,uBhBu8CN,CgB77CA,yCAEI,wBhB87CJ,CiBlkDE,oVAOI,wBjB4kDN,CiBtkDE,4LAMI,wBjBukDN,CiB1lDE,oUAOI,wBjBimDN,CiB3lDE,iMAMI,wBjB4lDN,CiB/mDE,gSAOI,wBjBsnDN,CiBhnDE,kLAMI,wBjBinDN,CiBpoDE,oUAOI,wBjB2oDN,CiBroDE,iMAMI,wBjBsoDN,CiBzpDE,wTAOI,wBjBgqDN,CiB1pDE,4LAMI,wBjB2pDN,CgBvgDA,kBACE,gBACA,ehBygDF,CgBvgDE,sDAIE,2CAA4C,CAC5C,sBAHA,mBACA,iBAAkB,CAFlB,UhB8gDF,CgB/gDA,yBASI,ehBygDJ,CgBlhDA,8NAkBU,kBhBwgDV,CgB1hDA,kCA0BI,QhBmgDJ,CgB7hDA,4VAmCU,ahBkgDV,CgBriDA,sVAuCU,chBsgDV,CgB7iDA,oOAoDU,ehB+/CV,CACF,CkBztDA,SAME,QAAS,CAFT,WlB2tDF,CkBrtDA,gBAHE,QAAS,CAFT,SlBquDF,CkBhuDA,OASE,gCAFA,cANA,aAAc,CAId,eACA,mBAAoB,CAFpB,mBAFA,UlB8tDF,CkBptDA,MACE,oBAAqB,CAGrB,eAAgB,CADhB,iBAAkB,CADlB,clBwtDF,CkB5sDA,mBAUE,uBAAwB,CACxB,eAAgB,CdkBhB,8BACG,2BACK,qBJorDV,CkBpsDA,uCAIE,kBAAmB,CAFnB,cAAe,CACf,gBlBusDF,CkBhsDE,iMAGE,kBlBqsDJ,CkBjsDA,iBACE,alBmsDF,CkB/rDA,kBACE,aAAc,CACd,UlBisDF,CkB7rDA,8BAEE,WlB+rDF,CkB3rDA,0Eb1FE,yCAA0C,CAC1C,mBL0xDF,CkB1rDA,OAEE,elB+rDF,CkBlqDA,qBA1BE,cAJA,aAAc,CAEd,eACA,sBlB+sDF,CkBprDA,cAQE,sBACA,qBAAsB,CACtB,yBACA,kBd3EA,oDACQ,4CckER,YACA,iBdsDA,6EACK,wEACG,qEc1DR,UlBkrDF,CmBlwDE,oBACE,qBfaF,iFACQ,yEebN,SnBswDJ,CIxtDE,gCACE,WACA,SJ0tDJ,CIxtDE,oCAA0B,UJ2tD5B,CI1tDE,yCAAgC,UJ6tDlC,CkB9qDE,0BACE,4BAA6B,CAC7B,QlBgrDJ,CkBxqDE,iFAGE,yBACA,SlB0qDJ,CkBvqDE,yDAEE,kBlByqDJ,CkBrqDE,sBACE,WlBuqDJ,CkBzpDA,qDAKI,mIACE,gBlB0pDJ,CkBvpDE,kQAEE,gBlB+pDJ,CkB5pDE,kQAEE,gBlBoqDJ,CACF,CkB1pDA,YACE,kBlB4pDF,CkBppDA,iBAGE,aAAc,CAEd,kBAAmB,CADnB,eAAgB,CAFhB,iBlBypDF,CkBnpDE,kHAGI,kBlBspDN,CkBjqDA,6BAoBI,cAAe,CADf,eAAgB,CADhB,eAAgB,CAFhB,gBACA,iBlBwpDJ,CkBlpDA,8HAME,iBAAkB,CADlB,gBAAkB,CADlB,iBlBspDF,CkBjpDA,kCAEE,elBmpDF,CkB/oDA,+BAQE,cAAe,CALf,oBAAqB,CAGrB,eAAgB,CADhB,eAAgB,CADhB,iBAAkB,CAFlB,iBAAkB,CAKlB,qBlBkpDF,CkB9oDE,sHAEE,kBlBkpDJ,CkB/oDA,8DAGE,gBAAiB,CADjB,YlBkpDF,CkBxoDA,qBAME,eAAgB,CALhB,gBAGA,mBADA,elB2oDF,CkBtoDE,4DAGE,cAAe,CADf,elByoDJ,CkB3nDA,UCvPE,kBAFA,eAFA,YAGA,gBAFA,gBnB43DF,CmBv3DE,gBACE,YACA,gBnBy3DJ,CmBt3DE,4CAEE,WnBw3DJ,CkBvoDA,6BAMI,kBAFA,eAFA,YAGA,gBAFA,gBlB2oDJ,CkB9oDA,mCASI,YACA,gBlBwoDJ,CkBlpDA,kFAcI,WlBwoDJ,CkBtpDA,oCAoBI,eAHA,YAIA,gBAHA,gBACA,gBlB0oDJ,CkBpoDA,UCnRE,kBAFA,eAFA,YAGA,sBAFA,iBnBi6DF,CmB55DE,gBACE,YACA,gBnB85DJ,CmB35DE,4CAEE,WnB65DJ,CkBhpDA,6BAMI,kBAFA,eAFA,YAGA,sBAFA,iBlBopDJ,CkBvpDA,mCASI,YACA,gBlBipDJ,CkB3pDA,kFAcI,WlBipDJ,CkB/pDA,oCAoBI,eAHA,YAIA,sBAHA,gBACA,iBlBmpDJ,CkBxoDA,cAEE,iBlByoDF,CkB3oDA,4BAMI,oBlBwoDJ,CkBpoDA,uBAKE,aAAc,CAEd,YACA,iBAEA,mBAAoB,CATpB,iBAAkB,CAElB,OAAQ,CAMR,iBAAkB,CAPlB,KAAM,CAIN,WAFA,SlB4oDF,CkBpoDA,4HAIE,YACA,iBAFA,UlBwoDF,CkBpoDA,4HAIE,YACA,iBAFA,UlBwoDF,CkBloDA,iRClZI,anBgiEJ,CkB9oDA,2BC9YI,qBfiDF,oDACQ,2CJ++DV,CmB/hEI,iCACE,qBf8CJ,oEACQ,2DJo/DV,CkBxpDA,gCCnYI,yBACA,qBAFA,anBiiEJ,CkB7pDA,oCC9XI,anB8hEJ,CkB7pDA,iRCrZI,anB8jEJ,CkBzqDA,2BCjZI,qBfiDF,oDACQ,2CJ6gEV,CmB7jEI,iCACE,qBf8CJ,oEACQ,2DJkhEV,CkBnrDA,gCCtYI,yBACA,qBAFA,anB+jEJ,CkBxrDA,oCCjYI,anB4jEJ,CkBxrDA,6PCxZI,anB4lEJ,CkBpsDA,yBCpZI,qBfiDF,oDACQ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FE,wBAmFA,eAAgB,CA9BhB,U3B+uFF,C2BpyFE,2BAwDE,U3B+uFJ,C2BvyFE,6BA0DI,iBAAkB,CAClB,iB3BgvFN,C2B3yFE,iDAiEE,SAAU,CADV,Q3B+uFJ,C2B3uFE,oDAEI,kBAAmB,CACnB,Q3B6uFJ,C2BhvFA,6BAKM,e3B8uFN,CACF,C2BxzFE,6BAwFE,kBADA,c3BquFJ,C2B5zFE,kHA8FE,qB3BmuFJ,C2BhuFE,sDAEI,6BACA,yB3BkuFJ,C2BruFA,kHAQI,wB3BkuFJ,CACF,C2Bn0FA,cAEI,U3Bo0FJ,C2Bt0FA,gBAMM,iB3Bm0FN,C2Bz0FA,iBASM,e3Bm0FN,C2B9zFM,iFAIE,yBADA,U3Bi0FR,C2BxzFA,gBAEI,U3ByzFJ,C2B3zFA,mBAKM,aAAc,CADd,c3B2zFN,C2B9yFA,eACE,U3BgzFF,C2BjzFA,kBAII,U3BgzFJ,C2BpzFA,oBAMM,iBAAkB,CAClB,iB3BizFN,C2BxzFA,wCAaI,SAAU,CADV,Q3BgzFJ,C2B5yFE,2CAEI,kBAAmB,CACnB,Q3B8yFJ,C2BjzFA,oBAKM,e3B+yFN,CACF,C2BvyFA,oBACE,e3ByyFF,C2B1yFA,yBAMI,kBADA,c3ByyFJ,C2B9yFA,sGAYI,qB3BuyFJ,C2BpyFE,kDAEI,6BACA,yB3BsyFJ,C2BzyFA,sGAQI,wB3BsyFJ,CACF,C2B7xFA,uBAEI,Y3B8xFJ,C2BhyFA,qBAKI,a3B8xFJ,C2BrxFA,yBC3OE,yBACA,0BD4OA,e3BwxFF,C6BngGA,YAIE,yBACA,kBAFA,eAAgB,CADhB,mBADA,gB7BygGF,C6B1gGA,eAQI,oB7BqgGJ,C6B7gGA,yBAYM,WACA,iBAFA,a7BugGN,C6BlhGA,oBAkBI,a7BmgGJ,C8BlhGA,OAGE,4BAA6B,CAC7B,gBAFA,mBADA,Y9BuhGF,C8BxhGA,UASI,aAAc,CADd,Y9BohGJ,C8B5hGA,mBAcI,e9BihGJ,C8B/hGA,mBAoBI,e9B+gGJ,C8BniGA,WAwBI,c9B8gGJ,C8BrgGA,sCAEE,kB9BugGF,C8BzgGA,oDASI,aAAc,CAHd,iBAAkB,CAElB,WAAY,CADZ,Q9BygGJ,C8B//FA,eCtDE,yBACA,qBAFA,U/B2jGF,C8BpgGA,kBClDI,wB/ByjGJ,C8BvgGA,2BC9CI,a/BwjGJ,C8BtgGA,YC1DE,yBACA,qBAFA,U/BskGF,C8B3gGA,eCtDI,wB/BokGJ,C8B9gGA,wBClDI,a/BmkGJ,C8B7gGA,eC9DE,yBACA,qBAFA,U/BilGF,C8BlhGA,kBC1DI,wB/B+kGJ,C8BrhGA,2BCtDI,a/B8kGJ,C8BphGA,cClEE,yBACA,qBAFA,U/B4lGF,C8BzhGA,iBC9DI,wB/B0lGJ,C8B5hGA,0BC1DI,a/BylGJ,CgCjmGA,OAUE,oBAJA,WALA,cAAe,CAEf,aAAc,CACd,eAAgB,CAChB,aAAc,CAHd,uBAKA,iBAAkB,CAElB,uBAAwB,CADxB,kBhCqmGF,CgC/lGI,4BAEE,WAEA,cAAe,CADf,oBhCkmGN,CgC5lGE,aACE,YhC8lGJ,CgC1lGE,YACE,iBAAkB,CAClB,QhC4lGJ,CgCrlGA,eCtCE,wBjC8nGF,CiC3nGI,sDAEE,wBjC6nGN,CgCxlGA,eC1CE,wBjCqoGF,CiCloGI,sDAEE,wBjCooGN,CgC3lGA,eC9CE,wBjC4oGF,CiCzoGI,sDAEE,wBjC2oGN,CgC9lGA,YClDE,wBjCmpGF,CiChpGI,gDAEE,wBjCkpGN,CgCjmGA,eCtDE,wBjC0pGF,CiCvpGI,sDAEE,wBjCypGN,CgCpmGA,cC1DE,wBjCiqGF,CiC9pGI,oDAEE,wBjCgqGN,CkC7pGA,wCACE,GAAQ,0BlCgqGR,CkC/pGA,GAAQ,uBlCkqGR,CACF,CkC/pGA,gCACE,GAAQ,0BlCkqGR,CkCjqGA,GAAQ,uBlCoqGR,CACF,CkC7pGA,UAIE,yBACA,kB9BsCA,kDACQ,0C8B3CR,YACA,mBACA,elCmqGF,CkC5pGA,cAQE,yB9ByBA,kDACQ,0C8B5BR,WALA,UAAW,CAGX,eADA,WAAY,CAEZ,iBAEA,iBAAkB,C9BoJlB,kCACK,6BACG,0B8B3JR,OlCyqGF,CkCzpGA,sDCDI,8KACA,+KACA,sKDEF,yBlC6pGF,CkCtpGA,oD9B5CE,0DACK,qDACG,iDJssGV,CkCnpGA,sBEvEE,wBpC6tGF,CoC1tGE,wCDgDE,8KACA,+KACA,qKnC6qGJ,CkCvpGA,mBE3EE,wBpCquGF,CoCluGE,qCDgDE,8KACA,+KACA,qKnCqrGJ,CkC3pGA,sBE/EE,wBpC6uGF,CoC1uGE,wCDgDE,8KACA,+KACA,qKnC6rGJ,CkC/pGA,qBEnFE,wBpCqvGF,CoClvGE,uCDgDE,8KACA,+KACA,qKnCqsGJ,CqCtvGA,+BAGE,oBAAqB,CADrB,iBAAkB,CAElB,qBrCwvGF,CqC5vGA,yCAOI,UAAW,CADX,iBrC2vGJ,CqCxvGI,wNAIE,SrC8vGN,CqCxvGA,4GAKI,gBrCyvGJ,CqCpvGA,aACE,gBrCsvGF,CqCvvGA,oEAOI,UrCqvGJ,CqC5vGA,oEAYI,erCqvGJ,CqCjvGA,yEACE,erCmvGF,CqC/uGA,4BACE,arCivGF,CqChvGE,mETnDA,6BADA,yB5BwyGF,CqC/uGA,2FThDE,4BADA,wB5BqyGF,CqC9uGA,sBACE,UrCgvGF,CqC9uGA,8DACE,erCgvGF,CqC9uGA,uITpEE,6BADA,yB5BwzGF,CqC7uGA,oETlEE,4BADA,wB5BozGF,CqC5uGA,oEAEE,SrC8uGF,CqC7tGA,iCAEE,gBAAiB,CADjB,iBrCguGF,CqC7tGA,oCAEE,iBAAkB,CADlB,kBrCguGF,CqC1tGA,iCjC/CE,oDACQ,2CJ4wGV,CqC1tGE,0CjCnDA,wBACQ,eJgxGV,CqCvtGA,YACE,arCytGF,CqCttGA,eAEE,sBrCwtGF,CqCrtGA,uBACE,sBrCutGF,CqChtGA,4FAII,aAAc,CACd,UAAW,CAEX,cAAe,CADf,UrCktGJ,CqCxtGA,oCAcM,UrC6sGN,CqC3tGA,gJAuBI,aAAc,CADd,erC4sGJ,CqCtsGE,4DACE,erCwsGJ,CqCtsGE,sDTpKA,4BADA,6BARA,2BACA,2B5Bw3GF,CqCxsGE,sDTxKA,8BADA,+BARA,yBACA,yB5B83GF,CqCzsGA,uEACE,erC2sGF,CqCzsGA,yJThLE,4BADA,4B5B+3GF,CqCxsGA,6ET/LE,yBACA,yB5B04GF,CqCpsGA,qBAIE,wBAAyB,CAHzB,aAAc,CAEd,kBAAmB,CADnB,UrCwsGF,CqC1sGA,0DAOI,kBAAmB,CACnB,UAAW,CACX,QrCusGJ,CqChtGA,qCAYI,UrCusGJ,CqCntGA,+CAgBI,SrCssGJ,CqCrrGA,gNAMM,kBAAsB,CACtB,mBAAoB,CAFpB,iBrCwrGN,CsCh6GA,aAGE,wBAAyB,CADzB,aAAc,CADd,iBtCo6GF,CsC/5GE,0BACE,UAAW,CAEX,cAAe,CADf,etCk6GJ,CsC16GA,2BAqBI,UAAW,CAGX,eAAgB,CAThB,iBAAkB,CAQlB,UAAW,CAPX,StCi6GJ,CsCv5GI,iCACE,StCy5GN,CsC/4GA,uGnB4BE,kBAFA,eAFA,YAGA,sBAFA,iBnB+3GF,CmB13GE,yHACE,YACA,gBnB83GJ,CmB33GE,sRAEE,WnBi4GJ,CsCj6GA,uGnBuBE,kBAFA,eAFA,YAGA,gBAFA,gBnBs5GF,CmBj5GE,yHACE,YACA,gBnBq5GJ,CmBl5GE,sRAEE,WnBw5GJ,CsC/6GA,+DAGE,kBtCi7GF,CsC/6GE,wKACE,etCm7GJ,CsC/6GA,oCAIE,qBAAsB,CADtB,kBAAmB,CADnB,QtCm7GF,CsC56GA,mBAOE,yBACA,yBACA,kBAJA,cAHA,eACA,eAAgB,CAChB,aAAc,CAHd,iBAKA,iBtCi7GF,CsC36GE,4BAGE,kBADA,eADA,gBtC+6GJ,CsC36GE,4BAGE,kBADA,eADA,iBtC+6GJ,CsCj8GA,6EA0BI,YtC26GJ,CsCt6GA,wUVrGE,6BADA,yB5BshHF,CsCv6GA,+BACE,ctCy6GF,CsCv6GA,iTVzGE,4BADA,wB5B2hHF,CsCx6GA,8BACE,atC06GF,CsCr6GA,iBAIE,WAAY,CACZ,kBtCq6GF,CsC16GA,uCACE,iBtC46GF,CsC76GA,2BAYM,gBtCo6GN,CsCj6GI,qFAGE,StCm6GN,CsC95GE,0EAGI,iBtC+5GN,CsC55GE,wEAII,gBAAiB,CADjB,StC85GN,CuCtkHA,OAEE,evCukHF,CuCrkHE,mBACE,YvCukHJ,CuCnkHA,mBAGE,MAAO,CADP,evCskHF,CuClkHA,YACE,avCokHF,CuCjkHA,cACE,avCmkHF,CuChkHE,4BACE,cvCkkHJ,CuC9jHA,gCAEE,iBvCgkHF,CuC7jHA,8BAEE,kBvC+jHF,CuC5jHA,qCAGE,kBAAmB,CACnB,kBvC8jHF,CuC3jHA,cACE,qBvC6jHF,CuC1jHA,cACE,qBvC4jHF,CuCxjHA,eAEE,iBAAkB,CADlB,YvC2jHF,CuCpjHA,YAEE,eAAgB,CADhB,cvCujHF,CwC3mHA,YAGE,kBAAmB,CADnB,cxC6mHF,CwCpmHA,iBAME,sBACA,yBALA,aAAc,CAGd,kBAAmB,CAFnB,iBAAkB,CAFlB,iBxC2mHF,CwClmHE,6BZ7BA,2BACA,2B5BkoHF,CwCnmHE,4BZvBA,8BADA,+BYyBE,exCumHJ,CwClmHE,0FAKE,yBAFA,cACA,kBxCqmHJ,CwCzmHE,qKASI,axCqmHN,CwC9mHE,4JAYI,axCumHN,CwClmHE,oFAKE,sBACA,qBAFA,cADA,SxCumHJ,CwC1mHE,ogBAYI,axCymHN,CwCrnHE,sJAeI,UxC2mHN,CwChmHA,yCAEE,axCkmHF,CwCpmHA,2FAKI,UxCmmHJ,CwC/lHE,0GAIE,sBAFA,cACA,oBxComHJ,CwC/lHA,uBAEE,eAAgB,CADhB,UxCkmHF,CcxsHC,yB2BKG,yBADA,azCwsHJ,CyCrsHI,yDAEE,azCusHN,CyCzsHI,2GAKI,azCwsHR,CyCrsHM,0IAGE,yBADA,azC0sHR,CyCvsHM,6OAIE,yBACA,qBAFA,UzC8sHR,CcruHC,sB2BKG,yBADA,azCquHJ,CyCluHI,mDAEE,azCouHN,CyCtuHI,qGAKI,azCquHR,CyCluHM,8HAGE,yBADA,azCuuHR,CyCpuHM,2NAIE,yBACA,qBAFA,UzC2uHR,CclwHC,yB2BKG,yBADA,azCkwHJ,CyC/vHI,yDAEE,azCiwHN,CyCnwHI,2GAKI,azCkwHR,CyC/vHM,0IAGE,yBADA,azCowHR,CyCjwHM,6OAIE,yBACA,qBAFA,UzCwwHR,Cc/xHC,wB2BKG,yBADA,azC+xHJ,CyC5xHI,uDAEE,azC8xHN,CyChyHI,yGAKI,azC+xHR,CyC5xHM,sIAGE,yBADA,azCiyHR,CyC9xHM,uOAIE,yBACA,qBAFA,UzCqyHR,CwClsHA,yBAEE,iBAAkB,CADlB,YxCqsHF,CwClsHA,sBAEE,eAAgB,CADhB,exCqsHF,C0C5zHA,OAEE,sBACA,4BAA6B,CtC2D7B,6CACQ,qCsC9DR,kB1Cm0HF,C0C3zHA,YACE,Y1C6zHF,C0CxzHA,eAEE,mCAAoC,CdtBpC,2BACA,4BcoBA,iB1C6zHF,C0CnzHA,uDALI,a1Ci0HJ,C0C5zHA,aAGE,eADA,eAAgB,CADhB,Y1C2zHF,C0C5zHA,iGAWI,a1CwzHJ,C0CnzHA,cAEE,sBdxCA,8BADA,+Bc0CA,6BAFA,iB1CyzHF,C0C7yHA,sDAGI,e1C8yHJ,C0CjzHA,wFAOM,eAAgB,CADhB,kB1CgzHN,C0C3yHI,wIAEI,YAAa,CdzEnB,2BACA,2B5Bu3HF,C0CzyHI,oIAEI,eAAgB,CdxEtB,8BADA,8B5Bs3HF,C0Cl0HA,+Ed5DE,yBACA,yB5Bi4HF,C0ChyHA,kFACE,kB1CqyHF,C0C7xHA,4EAII,e1C8xHJ,C0ClyHA,oGAQM,kBADA,kB1CiyHN,C0CxyHA,0XAmBQ,2BACA,2B1CgyHR,C0CpzHA,wsBAwBU,0B1CsyHV,C0C9zHA,gsBA4BU,2B1C4yHV,C0Cx0HA,yWA0CQ,8BADA,8B1C2yHR,C0Cp1HA,4qBA8CU,6B1CgzHV,C0C91HA,oqBAkDU,8B1CszHV,C0Cx2HA,8HA2DI,yB1CmzHJ,C0C92HA,oGA+DI,Y1CmzHJ,C0Cl3HA,gEAmEI,Q1CmzHJ,C0Ct3HA,gqBA0EU,a1C0zHV,C0Cp4HA,opBA8EU,c1Co0HV,C0Cl5HA,w3BAgGU,e1Cs0HV,C0Ct6HA,yBAuGI,QAAS,CADT,e1Co0HJ,C0CzzHA,aACE,kB1C2zHF,C0C5zHA,oBAMI,kBADA,e1C2zHJ,C0Ch0HA,2BASM,c1C0zHN,C0Cn0HA,4BAcI,e1CwzHJ,C0Ct0HA,gHAkBM,4B1CwzHN,C0C10HA,2BAuBI,Y1CszHJ,C0C70HA,uDAyBM,+B1CuzHN,C0ChzHA,eC5PE,iB3C+iIF,C2C7iIE,8BAEE,sBACA,kBAFA,a3CijIJ,C2CljIE,0DAMI,qB3C+iIN,C2CrjIE,qCAUI,yBADA,U3CgjIN,C2C5iIE,yDAEI,wB3C6iIN,C0C/zHA,eC/PE,oB3CikIF,C2C/jIE,8BAEE,yBACA,qBAFA,U3CmkIJ,C2CpkIE,0DAMI,wB3CikIN,C2CvkIE,qCAUI,sBADA,a3CkkIN,C2C9jIE,yDAEI,2B3C+jIN,C0C90HA,eClQE,oB3CmlIF,C2CjlIE,8BAEE,yBACA,qBAFA,a3CqlIJ,C2CtlIE,0DAMI,wB3CmlIN,C2CzlIE,qCAUI,yBADA,a3ColIN,C2ChlIE,yDAEI,2B3CilIN,C0C71HA,YCrQE,oB3CqmIF,C2CnmIE,2BAEE,yBACA,qBAFA,a3CumIJ,C2CxmIE,uDAMI,wB3CqmIN,C2C3mIE,kCAUI,yBADA,a3CsmIN,C2ClmIE,sDAEI,2B3CmmIN,C0C52HA,eCxQE,oB3CunIF,C2CrnIE,8BAEE,yBACA,qBAFA,a3CynIJ,C2C1nIE,0DAMI,wB3CunIN,C2C7nIE,qCAUI,yBADA,a3CwnIN,C2CpnIE,yDAEI,2B3CqnIN,C0C33HA,cC3QE,oB3CyoIF,C2CvoIE,6BAEE,yBACA,qBAFA,a3C2oIJ,C2C5oIE,yDAMI,wB3CyoIN,C2C/oIE,oCAUI,yBADA,a3C0oIN,C2CtoIE,wDAEI,2B3CuoIN,C4CtpIA,OAIE,eAAgB,CAFhB,cADA,cAAe,CAEf,iB5CypIF,C4C5pIA,UAOI,c5CwpIJ,C4C/pIA,2BAYM,sBACA,sBACA,mBAJA,oBAAqB,CACrB,gB5C4pIN,C4CvqIA,oCAoBM,yBADA,oB5CypIN,C4C5qIA,iCA2BM,W5CqpIN,C4ChrIA,yCAkCM,U5CkpIN,C4CprIA,2FA6CM,sBAFA,cACA,kB5CgpIN,C6C9rIA,YAIE,kBAHA,oBAAqB,CAErB,cADA,c7CksIF,C6CpsIA,eAOI,c7CgsIJ,C6CvsIA,qCAiBM,sBACA,sBAHA,cAJA,UAAW,CAGX,uBADA,gBAAiB,CADjB,iBAFA,iBAAkB,CAMlB,oB7CmsIN,C6C/rIM,kGAIE,yBACA,kBAFA,cADA,S7CssIR,C6ChsII,6DjBfF,8BADA,2BiBmBM,a7CmsIR,C6C/rII,2DjB9BF,+BADA,2B5BmuIF,C6C1rII,qKAME,yBACA,qBAHA,WACA,cAAe,CAFf,S7CmsIN,C6CnvIA,iLAiEM,sBACA,kBAHA,cACA,kB7C8rIN,C6CnrIA,2CCvEM,eACA,sBAFA,iB9CiwIN,C8C7vII,mElBMF,8BADA,0B5B6vIF,C8C5vII,iElBRF,+BADA,2B5B0wIF,C6C9rIA,2CC5EM,eACA,gBAFA,gB9CixIN,C8C7wII,mElBMF,8BADA,0B5B6wIF,C8C5wII,iElBRF,+BADA,2B5B0xIF,C+C7xIA,kBAEE,aAAc,CACd,QAAS,CAET,eAAgB,CADhB,SAAU,CAHV,iB/CmyIF,C+CpyIA,2IAkBI,QAAS,CAJT,QAAS,CAGT,WAAY,CAFZ,MAAO,CAHP,iBAAkB,CAClB,KAAM,CAGN,U/CiyIJ,C+C1xIA,wBACE,qB/C4xIF,C+CxxIA,uBACE,kB/C0xIF,CgDrzIA,MAIE,sBAEA,kB5C0DA,mDACQ,2C4C9DR,kBAAmB,CAFnB,eAAgB,CAChB,YhD6zIF,CgD/zIA,iBASI,iBAAkB,CAClB,4BhDyzIJ,CgDpzIA,SAEE,kBADA,YhDuzIF,CgDpzIA,SAEE,kBADA,WhDuzIF,CiD10IA,OAKE,W3BRA,yB2BIA,WAAY,CACZ,eACA,gBACA,aAAc,C3BNd,W2BQA,wBjD80IF,CiD30IE,0BAEE,WAEA,cAAe,C3BhBjB,yBACA,W2BcE,oBjDg1IJ,CiDv0IE,aAKE,uBAAwB,CACxB,eAAgB,CAHhB,sBAAuB,CACvB,QAAS,CAFT,cAAe,CADf,SjD80IJ,CkDr2IA,OAWE,yBACA,mBALA,WANA,oBAAqB,CAGrB,eACA,gBACA,cAJA,cAAe,CACf,eAAgB,CAKhB,iBAAkB,CAElB,qBAAsB,CADtB,kBlD02IF,CkDp2IE,aACE,YlDs2IJ,CkDl2IE,YACE,iBAAkB,CAClB,QlDo2IJ,CkDj2IE,yCAGE,eAAgB,CADhB,KlDo2IJ,CkD91II,4BAEE,WAEA,cAAe,CADf,oBlDi2IN,CkD31IE,2DAGE,sBADA,alD81IJ,CkD11IE,wBACE,WlD41IJ,CkDz1IE,+BACE,gBlD21IJ,CkDx1IE,uBACE,elD01IJ,CmD14IA,mBAJE,enD65IF,CmDz5IA,OASE,gCAAiC,CALjC,QAAS,CAGT,YAAa,CAFb,MAAO,CAQP,SAAU,CAZV,cAAe,CAEf,OAAQ,CADR,KAAM,CAIN,YnDm5IF,CmDz4IE,0B/CiHA,mCACI,+BACC,8BACG,2BAkER,kDACG,4CACE,wCACG,iCJ0tIV,CmD/4IE,wB/C6GA,+BACI,2BACC,0BACG,sBJqyIV,CmDn5IA,mBACE,iBAAkB,CAClB,enDq5IF,CmDj5IA,cAGE,WAAY,CAFZ,iBAAkB,CAClB,UnDo5IF,CmD/4IA,eAGE,2BAA4B,CAD5B,sBAEA,sBACA,gCACA,kB/CcA,4CACQ,oC+CZR,SAAU,CARV,iBnDy5IF,CmD74IA,gBAOE,yBAHA,QAAS,CACT,MAAO,CAJP,cAAe,CAEf,OAAQ,CADR,KAAM,CAIN,YnDg5IF,CmD74IE,qB7BpEA,wBACA,StBo9IF,CmDh5IE,mB7BrEA,yBACA,UtBw9IF,CmD/4IA,cAEE,gCADA,YnDk5IF,CmD74IA,qBACE,enD+4IF,CmD34IA,aAEE,uBADA,QnD84IF,CmDx4IA,YAEE,aADA,iBnD24IF,CmDt4IA,cAGE,6BAFA,aACA,gBnDy4IF,CmD34IA,wBAQI,eAAgB,CAChB,enDs4IJ,CmD/4IA,mCAaI,gBnDq4IJ,CmDl5IA,oCAiBI,anDo4IJ,CmD/3IA,yBAIE,WAAY,CACZ,eAAgB,CAJhB,iBAAkB,CAClB,WAAY,CACZ,UnDm4IF,CmD73IA,yBAEE,cAEE,gBAAiB,CADjB,WnD+3IF,CmD53IA,e/CrEA,6CACQ,oCJo8IR,CmD33IA,UAAY,WnD83IZ,CACF,CmD53IA,yBACE,UAAY,WnD+3IZ,CACF,CoDvgJE,8kBAGE,WAAY,CADZ,apDoiJJ,CoDjiJE,gSACE,UpDgjJJ,CqDtjJA,cCVE,aAAc,CAEd,gBAAiB,CADjB,iBtDokJF,CqDxjJA,YACE,qBrD0jJF,CqDxjJA,WACE,oBrD0jJF,CqDljJA,MACE,sBrDojJF,CqDljJA,MACE,uBrDojJF,CqDljJA,WACE,iBrDojJF,CqDljJA,WEtBE,4BAA6B,CAC7B,QAAS,CAHT,iBAAkB,CADlB,WAEA,gBvDglJF,CqDhjJA,QACE,sBrDkjJF,CqD3iJA,OACE,crD6iJF,Cc9kJA,cACE,kBdglJF,CcnkJA,wSAYE,sBd2kJF,CcvkJE,qC0CjDA,uBxD4nJA,CwD3nJA,iBAAU,uBxD8nJV,CwD7nJA,cAAU,2BxDgoJV,CwD/nJA,4BACU,4BxDkoJV,CchlJA,kBACE,uBdolJF,CchlJA,mBACE,wBdolJF,CchlJA,yBACE,8BdolJF,CAdF,CcjkJE,2D0CtEA,uBxD0pJA,CwDzpJA,iBAAU,uBxD4pJV,CwD3pJA,cAAU,2BxD8pJV,CwD7pJA,4BACU,4BxDgqJV,CczlJA,kBACE,uBd6lJF,CczlJA,mBACE,wBd6lJF,CczlJA,yBACE,8Bd6lJF,CAdF,Cc1kJE,4D0C3FA,uBxDwrJA,CwDvrJA,iBAAU,uBxD0rJV,CwDzrJA,cAAU,2BxD4rJV,CwD3rJA,4BACU,4BxD8rJV,CclmJA,kBACE,uBdsmJF,CclmJA,mBACE,wBdsmJF,CclmJA,yBACE,8BdsmJF,CAdF,CcnlJE,sC0ChHA,uBxDstJA,CwDrtJA,iBAAU,uBxDwtJV,CwDvtJA,cAAU,2BxD0tJV,CwDztJA,4BACU,4BxD4tJV,Cc3mJA,kBACE,uBd+mJF,Cc3mJA,mBACE,wBd+mJF,Cc3mJA,yBACE,8Bd+mJF,CAdF,Cc5lJE,oC0C7HA,sBxD4uJA,CACF,Cc3mJE,0D0ClIA,sBxDivJA,CACF,Cc3mJE,2D0CvIA,sBxDsvJA,CACF,Cc3mJE,qC0C5IA,sBxD2vJA,CACF,CcrmJA,e0CvJE,sBxD+vJF,CcrmJE,4B0ClKA,uBxD2wJA,CwD1wJA,oBAAU,uBxD6wJV,CwD5wJA,iBAAU,2BxD+wJV,CwD9wJA,kCACU,4BxDixJV,CACF,CchnJA,qBACE,sBdknJF,CchnJE,kCACE,uBdmnJF,CACF,CcjnJA,sBACE,sBdmnJF,CcjnJE,mCACE,wBdonJF,CACF,CclnJA,4BACE,sBdonJF,CclnJE,yCACE,8BdqnJF,CchnJA,c0CrLA,sBxD0yJA,CAJF,CyD5yJA,oCACE,kBACE,sBzDmzJF,CACF,CyDhzJA,0DACE,eACE,yBzDkzJF,CyD/yJA,kBACE,sBzDizJF,CyD9yJA,oBACE,0BzDgzJF,CyD7yJA,sBACE,wBzD+yJF,CACF,CyD5yJA,oCACE,eACE,yBzD8yJF,CyD3yJA,oBACE,0BzD6yJF,CACF,C0D70JA,UACE,aAAc,CACd,c1D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q+SN,C8Hz9SA,iCACE,UAAW,CACX,S9H69SF,CALF,C8Hn9SA,0BACE,gBACA,a9H29SF,C8H79SA,+BAKI,aAAc,CACd,U9H29SJ,C8Hj+SA,yCAUI,aAEA,iBAAkB,CAClB,O9Hy9SJ,C8Ht9SE,8DACE,UAAW,CACX,S9Hy9SF,C8Hn9SA,+BACE,UAAW,CACX,S9Hu9SF,CALF,C+HzhTA,iBAGE,cACA,eAHA,gBAIA,iB/HgiTF,C+H5hTE,sDACE,gB/H+hTF,CACF,C+H7hTE,sDACE,mB/HgiTF,C+HjiTA,qBAII,iBAAkB,CAClB,O/HgiTJ,C+HriTA,8BASI,e/H+hTJ,CACF,CgI1jTA,OAAS,ahI6jTT,CgI5jTA,cAAgB,oBhI+jThB,CiIhkTA,MACE,YjIkkTF,CiI/jTA,QACE,WjIikTF,CiI9jTA,WACE,ajIgkTF,CiI7jTA,cACE,ajI+jTF,CiI5jTA,WACE,SjI8jTF,CiI3jTA,MACE,WjI6jTF,CiI1jTA,QACE,WjI4jTF,CiIzjTA,QACE,ajI2jTF,CiIxjTA,UACE,ajI0jTF,CiIvjTA,eACE,0BjIyjTF,CiItjTA,aACE,wBjIwjTF,CiIrjTA,gBACE,sBjIujTF,CiIpjTA,iBACE,6BjIsjTF,CiInjTA,gBACE,oBjIqjTF,CiIljTA,eACE,wBjIojTF,CiIjjTA,aACE,sBjImjTF,CiIhjTA,iBACE,2BjIkjTF,CkInnTA,MAAQ,QlIsnTR,CkIrnTA,MAAQ,YlIwnTR,CkIvnTA,MAAQ,alI0nTR,CkIznTA,MAAQ,alI4nTR,CkI1nTA,MAAQ,YlI6nTR,CkI5nTA,MAAQ,clI+nTR,CkI9nTA,MAAQ,elIioTR,CkIhoTA,MAAQ,elImoTR,CkIjoTA,MAAQ,elIooTR,CkInoTA,MAAQ,iBlIsoTR,CkIroTA,MAAQ,kBlIwoTR,CkIvoTA,MAAQ,kBlI0oTR,CmIvpTA,SACE,cnIypTF,CmIrpTA,8BAAoB,anI2pTpB,CmI1pTA,gBAAkB,anI6pTlB,CmI5pTA,WAAa,anI+pTb,CmI9pTA,iBAAmB,anIiqTnB,CmIhqTA,mBAAqB,anImqTrB,CmI/oTE,kRAGE,anI4pTJ,CmIvpTE,6DAGE,anIypTJ,CmItpTE,mEAGE,anIupTJ,CmIlpTE,8CAGE,anIopTJ,CmIjpTE,oDAGE,anIkpTJ,CmI7oTE,gEAGE,anI+oTJ,CmI5oTE,sEAGE,anI6oTJ,CoIvtTA,cAAc,cAAc,gBAAgB,WpI4tT5C,CoI5tTwD,UAAU,epI+tTlE,CoI/tTkF,MAAoB,mBAAd,apImuTxF,CoInuTyH,0BAA0B,cAAc,iBpIwuTjK,CoIxuTmL,yCAAyC,apI6uT5N,CoI7uT0O,uEAAuE,apIovTjT,CoIpvT+T,cAAc,apIuvT7U,CoIvvT2V,iFAAiF,apI8vT5a,CoI9vT0b,yIAAyI,apIwwTnkB,CoIxwTilB,8EAA8E,apIgxT/pB,CoIhxT6qB,0DAA0D,apIqxTvuB,CoIrxTqvB,eAAe,iBpIwxTpwB,CoIxxTsxB,aAAa,epI2xTnyB,CoI3xTmzB,WAAW,yBpI8xT9zB,CqI9xTA,YAMI,eAAiB,CAEjB,qBAAsB,CACtB,iBAAkB,CAClB,kCAHA,UAAY,CAHZ,YAAa,CADb,MAAO,CAEP,eAAgB,CAMhB,eAAgB,CAVhB,kBACA,KAAM,CAUN,uBrIgyTJ,CqI7xTA,0BAII,+BAAgC,CAChC,aAAc,CAFd,cAAe,CAGf,cAAe,CACf,eAAiB,CALjB,UAAW,CADX,WrIqyTJ,CqI5xTA,iCACI,aAAc,CACd,WAAY,CAGZ,cAAe,CACf,eAAmB,CAFnB,iBAAkB,CADlB,erIiyTJ,CqI3xTA,gCACI,crI6xTJ,CqI1xTA,iBACI,eAAmB,CACnB,UrI4xTJ,CqI1xTA,uBACI,UrI4xTJ,CqI1xTA,mBACI,UrI4xTJ,CqI1xTA,wBACI,UAAY,CACZ,QrI4xTJ,CqI1xTA,eAEI,gBAEA,YACA,gBAAiB,CACjB,eAAgB,CAHhB,SrI+xTJ,CqI1xTA,kBAGI,4BAA6B,CAC7B,cAAe,CAHf,aAAc,CACd,gBrI+xTJ,CqI1xTA,kBAEI,UAAW,CADX,iBAAkB,CAElB,erI4xTJ,CsI91TA,KACE,YAAa,CACb,oBtIg2TF,CuIl2TA,YACE,iGvIo2TF,CuI/1TA,YACE,iGvIi2TF,CuI51TA,YACE,kGvI81TF,CuIz1TA,YACE,mGvI21TF,CuIt1TA,YACE,uGvIw1TF,CuIn1TA,aACE,yGvIq1TF,CuIh1TA,aACE,0GvIk1TF,CwIr3TE,8IAME,mBACA,yBpIyDF,wBACQ,gBoIxDN,axIw3TJ,CwIn3TE,iIlHhBA,yBACA,WtB04TF,CwIn3TE,sCAEE,mBACA,yBpIuCF,wBACQ,gBoItCN,axIs3TJ,CwIj3TE,2PAME,mBACA,yBpIyBF,wBACQ,gBoIxBN,axIo3TJ,CwI92TI,uOAOE,iBxIg3TN,CwIt6TE,8IAME,mBACA,yBpIyDF,wBACQ,gBoIxDN,UxIy6TJ,CwIp6TE,iIlHhBA,yBACA,WtB27TF,CwIp6TE,sCAEE,mBACA,yBpIuCF,wBACQ,gBoItCN,UxIu6TJ,CwIl6TE,2PAME,mBACA,yBpIyBF,wBACQ,gBoIxBN,UxIq6TJ,CwI/5TI,uOAOE,iBxIi6TN,CwIv9TE,8IAME,mBACA,yBpIyDF,wBACQ,gBoIxDN,UxI09TJ,CwIr9TE,iIlHhBA,yBACA,WtB4+TF,CwIr9TE,sCAEE,mBACA,yBpIuCF,wBACQ,gBoItCN,UxIw9TJ,CwIn9TE,2PAME,mBACA,yBpIyBF,wBACQ,gBoIxBN,UxIs9TJ,CwIh9TI,uOAOE,iBxIk9TN,CwIxgUE,wIAME,mBACA,yBpIyDF,wBACQ,gBoIxDN,UxI2gUJ,CwItgUE,4HlHhBA,yBACA,WtB6hUF,CwItgUE,oCAEE,mBACA,yBpIuCF,wBACQ,gBoItCN,UxIygUJ,CwIpgUE,qPAME,mBACA,yBpIyBF,wBACQ,gBoIxBN,UxIugUJ,CwIjgUI,gOAOE,iBxImgUN,CwI3/TE,sNAME,mBACA,yBpILF,wBACQ,gBoIMN,axI8/TJ,CwIz/TE,6LlH9EA,yBACA,WtB8kUF,CwIz/TE,8DAEE,mBACA,yBpIvBF,wBACQ,gBoIwBN,axI4/TJ,CwIv/TE,+PAME,mBACA,yBpIrCF,wBACQ,gBoIsCN,axI0/TJ,CwIp/TI,2TAOE,mBACA,yBpIrDJ,wBACQ,gBoIsDJ,iBxIu/TN,CwIhjUE,sNAME,mBACA,yBpILF,wBACQ,gBoIMN,UxImjUJ,CwI9iUE,6LlH9EA,yBACA,WtBmoUF,CwI9iUE,8DAEE,mBACA,yBpIvBF,wBACQ,gBoIwBN,UxIijUJ,CwI5iUE,+PAME,mBACA,yBpIrCF,wBACQ,gBoIsCN,UxI+iUJ,CwIziUI,2TAOE,mBACA,yBpIrDJ,wBACQ,gBoIsDJ,iBxI4iUN,CyIzqUA,uBAGI,mBADA,ezI2qUJ,CyI7qUA,uBAOI,YzIyqUJ,C0I3qUA,yCAEE,qBACA,kC1I6qUF,C0I3qUE,qDACE,qBACA,kC1I8qUJ,C0I1qUA,8BACE,qBACA,kC1I4qUF,C0I1qUE,oCACE,qBACA,kC1I4qUJ,C0IxqUA,gCACE,qBACA,kC1I0qUF,C0IxqUE,sCACE,qBACA,kC1I0qUJ,C0IrqUA,mBACE,e1IuqUF,C0IxqUA,+BAMI,cACA,eAHA,c1IyqUJ,C0I7qUA,6BAWI,Q1IqqUJ,C2IjtUA,cACE,mBJwBA,wGIvBA,c3IotUF,C2IttUA,gBAOI,U3IktUJ,C2IztUA,mBAYM,mBACA,qBAEA,a3I+sUN,C2I5sUI,kDAEE,mBACA,qBAEA,a3I6sUN,C2I1sUI,0BACE,mBACA,qBAEA,a3I2sUN,C4IzuUA,eACE,WAAY,CLYZ,kGvIguUF,C4ItuUA,uCAII,cAFA,aAAc,CAGd,e5IsuUJ,C4I3uUA,4CAWI,eAFA,e5IsuUJ,C4I/uUA,2DAiBM,UAAW,CAKX,cAAe,CAFf,WAAY,CANZ,gBAAiB,CAEjB,iBAAkB,CAGlB,U5IouUN,C4I5tUA,8BACE,mB5I8tUF,C4I3tUA,sBACE,wB5I6tUF,C4I1tUA,8MAQM,qBAAsB,CAEtB,a5IytUN,C4IntUA,sBACE,Q5IqtUF,C6I/wUA,eACE,e7IixUF,C6IlxUA,+BAII,6BAGA,cAFA,gB7IkxUJ,C6I9wUI,mEACE,iB7IixUJ,C6IlxUE,8CAII,UAAW,CACX,kB7IixUN,CACF,C6IhyUA,gHAqBM,a7IgxUN,C6IryUA,8EA0BM,a7I+wUN,C6I3wUM,6JAGE,a7I6wUR,C6I1wUM,4GAEE,a7I4wUR,C8InzUA,YACE,iB9IqzUF,C8ItzUA,6BAII,0BACA,0B9IqzUJ,C8I1zUA,yCASI,wB9IozUJ,C8I7zUA,wCAaI,2B9ImzUJ,C8I/yUA,+BAEE,oBADA,iBAGA,iB9IgzUF,C8IpzUA,iCAOI,a9IgzUJ,C+Ix0UA,U3IkEE,wBACQ,eJywUV,C+Ix0UA,2BACE,gBAAiB,CACjB,iBAAkB,CAClB,iB/I00UF,C+Ix0UE,uCACE,e/I00UJ,C+Iv0UE,sCACE,kB/Iy0UJ,C+It0UE,8FAGE,mBACA,WAAY,CAEZ,a/Iu0UJ,C+Ip0UE,oGAGE,mBAEA,a/Iq0UJ,C+Ij0UI,4OAME,mBAEA,WACA,e/Ik0UN,C+I30UI,sRAYI,mBAEA,a/Is0UR,CgJv3UA,+BACE,iBhJy3UF,CiJ13UA,OACE,WAAY,CACZ,iBjJ43UF,CiJ93UA,2CAMI,ejJ43UJ,CiJl4UA,oBAUI,ajJ23UJ,CiJr4UA,+BAcI,ejJ03UJ,CiJx4UA,2CAkBI,ejJy3UJ,CiJ34UA,gBAsBI,ejJw3UJ,CiJt3UI,4BACE,YjJw3UN,CiJj5UA,uBA6BM,WAAY,CAEZ,cACA,ejJs3UN,CiJh3UA,kCACE,ajJk3UF,CkJz5UA,YACE,yBACA,elJ25UF,CkJx5UA,qDAEE,oBlJ05UF,CkJt5UA,kBACE,QlJw5UF,CkJp5UA,oCAEE,alJs5UF,CmJx6UA,oBACE,wBnJ06UF,CmJv6UA,4BACE,kBnJy6UF,CmJt6UA,yCACE,anJw6UF,CmJz6UA,wDAOI,cAAe,CAFf,WAAY,CAGZ,gBAAiB,CAJjB,UnJ26UJ,CmJ/6UA,oDAYI,eAAgB,CAEhB,iBAAkB,CAClB,OnJq6UJ,CmJj6UA,sBACE,anJm6UF,CmJj6UE,0DACE,gBAEA,iBnJm6UF,CACF,CoJr8UA,YACE,wBpJu8UF,CoJn8UA,iCACE,gBpJq8UF,CoJj8UA,0BAGE,cACA,eAHA,kBpJq8UF,CoJ/7UA,sBAEE,kBADA,uBpJk8UF,CoJ97UA,wBACE,cACA,cpJg8UF,CoJ77UA,0BACE,epJ+7UF,CqJ39UA,qBACE,wBrJ69UF,CqJ19UA,gCAEI,arJ29UJ,CqJ79UA,sBAMI,erJ09UJ,CsJn+UA,YACE,gBACA,qBtJq+UF,CsJj+UA,WACE,atJm+UF,CsJp+UA,0BAII,iBtJm+UJ,CsJv+UA,6MAgBM,atJk+UN,CsJ59UA,4BAEI,yBACA,iBtJ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VF,C4Jz2VA,wBACE,a5J22VF,C4Jz2VE,oCACE,Y5J22VJ,C4Jx2VE,mCACE,e5J02VJ,C4Jr2VA,2BAGI,gBAAmB,CADnB,a5Ju2VJ,C4Jp2VI,uCACE,a5Js2VN,C4Jh2VA,sBAEI,e5Ji2VJ,C4Jn2VA,4BAQI,cAFA,gB5Ji2VJ,C4J11VA,oCAEI,eAAgB,CAChB,iB5J21VJ,C4Jv1VA,mCAEI,eAAgB,CAChB,a5Jw1VJ,C4J31VA,4CAQI,mBADA,e5Jw1VJ,C4Jl1VA,0BAEI,gCACA,mB5Jm1VJ,C4Jt1VA,8BAMM,kBAGA,WAAY,CADZ,U5Jm1VN,C4J/0VI,qCACE,WAAY,CACZ,gB5Ji1VN,C6Jj7VA,MACE,qB7Jm7VF,C8Jp7VA,sCACE,iB9Js7VF,C8Jn7VA,8BACE,a9Jq7VF,C8Jl7VI,2IAGE,cACA,e9Jo7VN,C8Jj7VI,iJAGE,a9Jm7VN,C8Jj8VA,6CAmBI,cACA,e9Ji7VJ,C8J76VA,sBACE,a9J+6VF,C+J58VA,0BACE,a/J88VF,C+Jv8VA,6DACE,a/J48VF,C+Jz8VA,oCACE,a/J28VF,CgKx9VA,4HAII,ahKy9VJ,CgK79VA,oLAWI,ahKw9VJ,CiKn+VA,mCACE,wBjKq+VF,CiKl+VA,+CACE,QjKo+VF,CiKj+VA,+DAEI,ejKk+VJ,CkK75VA,0BA7EI,oBlK6+VJ,CkKh6VA,kOAjEM,alK4+VN,CkKv6VA,0BAjFI,oBlK2/VJ,CkK16VA,kOArEM,alK0/VN,CkKj7VA,0BArFI,oBlKygWJ,CkKp7VA,kOAzEM,alKwgWN,CkK37VA,yBAzFI,oBlKuhWJ,CkK97VA,2NA7EM,alKshWN,CkKp8VA,+BA3EI,gBACA,yBACA,kBACA,YlKkhWJ,CkK3gWM,0WAME,alKghWR,CkKj9VA,+BA/EI,gBACA,yBACA,kBACA,YlKmiWJ,CkK5hWM,0WAME,alKiiWR,CkK99VA,+BAnFI,gBACA,yBACA,kBACA,YlKojWJ,CkK7iWM,0WAME,alKkjWR,CkK3+VA,8BAvFI,gBACA,yBACA,kBACA,YlKqkWJ,CkK9jWM,mWAME,alKmkWR,CkKv/VA,qCArEE,8BACA,iBlK+jWF,CkKxjWI,0XAME,alK6jWN,CkKtgWA,qCArEE,8BACA,iBlK8kWF,CkKvkWI,0XAME,alK4kWN,CkKrhWA,qCArEE,8BACA,iBlK6lWF,CkKtlWI,0XAME,alK2lWN,CkKpiWA,oCArEE,8BACA,iBlK4mWF,CkKrmWI,mXAME,alK0mWN,CkKhiWA,+SA3DM,alKsmWN,CkKviWA,+SA/DM,alKinWN,CkK9iWA,+SAnEM,alK4nWN,CkKrjWA,wSAvEM,alKuoWN,CmKntWA,uBAEE,YnKqtWF,CmKltWA,+BAEI,anKmtWJ,CmKrtWA,8BAKI,YnKmtWJ","sources":["webpack://misago/./src/style/index.less","webpack://misago/./node_modules/bootstrap/less/normalize.less","webpack://misago/./node_modules/bootstrap/less/print.less","webpack://misago/./node_modules/bootstrap/less/scaffolding.less","webpack://misago/./node_modules/bootstrap/less/mixins/vendor-prefixes.less","webpack://misago/./node_modules/bootstrap/less/mixins/tab-focus.less","webpack://misago/./node_modules/bootstrap/less/mixins/image.less","webpack://misago/./node_modules/bootstrap/less/type.less","webpack://misago/./node_modules/bootstrap/less/mixins/text-emphasis.less","webpack://misago/./node_modules/bootstrap/less/mixins/background-variant.less","webpack://misago/./node_modules/bootstrap/less/mixins/text-overflow.less","webpack://misago/./node_modules/bootstrap/less/code.less","webpack://misago/./node_modules/bootstrap/less/grid.less","webpack://misago/./node_modules/bootstrap/less/mixins/grid.less","webpack://misago/./node_modules/bootstrap/less/responsive-utilities.less","webpack://misago/./node_modules/bootstrap/less/mixins/grid-framework.less","webpack://misago/./node_modules/bootstrap/less/tables.less","webpack://misago/./node_modules/bootstrap/less/mixins/table-row.less","webpack://misago/./node_modules/bootstrap/less/forms.less","webpack://misago/./node_modules/bootstrap/less/mixins/forms.less","webpack://misago/./node_modules/bootstrap/less/buttons.less","webpack://misago/./node_modules/bootstrap/less/mixins/buttons.less","webpack://misago/./node_modules/bootstrap/less/mixins/opacity.less","webpack://misago/./node_modules/bootstrap/less/component-animations.less","webpack://misago/./node_modules/bootstrap/less/dropdowns.less","webpack://misago/./node_modules/bootstrap/less/mixins/nav-divider.less","webpack://misago/./node_modules/bootstrap/less/mixins/reset-filter.less","webpack://misago/./node_modules/bootstrap/less/navs.less","webpack://misago/./node_modules/bootstrap/less/mixins/border-radius.less","webpack://misago/./node_modules/bootstrap/less/breadcrumbs.less","webpack://misago/./node_modules/bootstrap/less/alerts.less","webpack://misago/./node_modules/bootstrap/less/mixins/alerts.less","webpack://misago/./node_modules/bootstrap/less/labels.less","webpack://misago/./node_modules/bootstrap/less/mixins/labels.less","webpack://misago/./node_modules/bootstrap/less/progress-bars.less","webpack://misago/./node_modules/bootstrap/less/mixins/gradients.less","webpack://misago/./node_modules/bootstrap/less/mixins/progress-bar.less","webpack://misago/./node_modules/bootstrap/less/button-groups.less","webpack://misago/./node_modules/bootstrap/less/input-groups.less","webpack://misago/./node_modules/bootstrap/less/media.less","webpack://misago/./node_modules/bootstrap/less/list-group.less","webpack://misago/./node_modules/bootstrap/less/mixins/list-group.less","webpack://misago/./node_modules/bootstrap/less/panels.less","webpack://misago/./node_modules/bootstrap/less/mixins/panels.less","webpack://misago/./node_modules/bootstrap/less/pager.less","webpack://misago/./node_modules/bootstrap/less/pagination.less","webpack://misago/./node_modules/bootstrap/less/mixins/pagination.less","webpack://misago/./node_modules/bootstrap/less/responsive-embed.less","webpack://misago/./node_modules/bootstrap/less/wells.less","webpack://misago/./node_modules/bootstrap/less/close.less","webpack://misago/./node_modules/bootstrap/less/badges.less","webpack://misago/./node_modules/bootstrap/less/modals.less","webpack://misago/./node_modules/bootstrap/less/mixins/clearfix.less","webpack://misago/./node_modules/bootstrap/less/utilities.less","webpack://misago/./node_modules/bootstrap/less/mixins/center-block.less","webpack://misago/./node_modules/bootstrap/less/mixins/hide-text.less","webpack://misago/./node_modules/bootstrap/less/mixins/responsive-visibility.less","webpack://misago/./src/style/misago/scaffolding.less","webpack://misago/./src/style/misago/flex-row.less","webpack://misago/./src/style/misago/display.less","webpack://misago/./src/style/misago/responsive-utils.less","webpack://misago/./src/style/misago/at-who.less","webpack://misago/./src/style/misago/auth-message.less","webpack://misago/./src/style/misago/ajax-loader.less","webpack://misago/./src/style/misago/alerts.less","webpack://misago/./src/style/misago/alerts-snackbar.less","webpack://misago/./src/style/misago/agreement-overlay.less","webpack://misago/./src/style/misago/loaders.less","webpack://misago/./src/style/misago/navbar.less","webpack://misago/./src/style/misago/navs.less","webpack://misago/./src/style/misago/breadcrumbs.less","webpack://misago/./src/style/misago/material-icons.less","webpack://misago/./src/style/misago/modals.less","webpack://misago/./src/style/misago/forms.less","webpack://misago/./src/style/misago/inputs.less","webpack://misago/./src/style/misago/buttons.less","webpack://misago/./src/style/misago/dropdowns.less","webpack://misago/./src/style/misago/noscript-collapsible.less","webpack://misago/./src/style/misago/overlay.less","webpack://misago/./src/style/misago/list-groups.less","webpack://misago/./src/style/misago/category-label.less","webpack://misago/./src/style/misago/thread-flags.less","webpack://misago/./src/style/misago/thread-replies.less","webpack://misago/./src/style/misago/thread-user-card.less","webpack://misago/./src/style/misago/thread-paginator.less","webpack://misago/./src/style/misago/search-dropdown.less","webpack://misago/./src/style/misago/page-header.less","webpack://misago/./src/style/misago/page-container.less","webpack://misago/./src/style/misago/panels.less","webpack://misago/./src/style/misago/footer.less","webpack://misago/./src/style/misago/moderation.less","webpack://misago/./src/style/misago/ui-preview.less","webpack://misago/./src/style/misago/pager.less","webpack://misago/./src/style/misago/pagination.less","webpack://misago/./src/style/misago/poll.less","webpack://misago/./src/style/misago/user-status.less","webpack://misago/./src/style/misago/user-card.less","webpack://misago/./src/style/misago/toolbar.less","webpack://misago/./src/style/misago/type.less","webpack://misago/./src/style/misago/markup.less","webpack://misago/./src/style/misago/formatting-help.less","webpack://misago/./src/style/misago/scroll-target.less","webpack://misago/./src/style/misago/site-nav-menu.less","webpack://misago/./src/style/misago/user-nav-menu.less","webpack://misago/./src/style/misago/change-avatar.less","webpack://misago/./src/style/misago/categories-lists.less","webpack://misago/./src/style/misago/participants.less","webpack://misago/./src/style/misago/markup-editor.less","webpack://misago/./src/style/misago/poll-editor.less","webpack://misago/./src/style/misago/posting-dialog.less","webpack://misago/./src/style/misago/posts-list.less","webpack://misago/./src/style/misago/post.less","webpack://misago/./src/style/misago/post-feed.less","webpack://misago/./src/style/misago/event.less","webpack://misago/./src/style/misago/post-changelog.less","webpack://misago/./src/style/misago/quote-control.less","webpack://misago/./src/style/misago/section-divider.less","webpack://misago/./src/style/misago/auth-pages.less","webpack://misago/./src/style/misago/message-pages.less","webpack://misago/./src/style/misago/threads-lists.less","webpack://misago/./src/style/misago/notifications-list.less","webpack://misago/./src/style/misago/notifications-dropdown.less","webpack://misago/./src/style/misago/notifications-overlay.less","webpack://misago/./src/style/misago/active-posters.less","webpack://misago/./src/style/misago/account-settings.less","webpack://misago/./src/style/misago/user-profile.less","webpack://misago/./src/style/misago/username-history.less","webpack://misago/./src/style/misago/search.less","webpack://misago/./src/style/utilities/display.less","webpack://misago/./src/style/utilities/flexbox.less","webpack://misago/./src/style/utilities/margin.less","webpack://misago/./src/style/utilities/text.less","webpack://misago/./highlight/styles/atom-one-light.min.css","webpack://misago/./node_modules/at.js/dist/css/jquery.atwho.css","webpack://misago/./src/style/flavor/typo.less","webpack://misago/./src/style/flavor/shadows.less","webpack://misago/./src/style/flavor/buttons.less","webpack://misago/./src/style/flavor/social-buttons.less","webpack://misago/./src/style/flavor/inputs.less","webpack://misago/./src/style/flavor/auth-message.less","webpack://misago/./src/style/flavor/dropdowns.less","webpack://misago/./src/style/flavor/page-footer.less","webpack://misago/./src/style/flavor/list-group.less","webpack://misago/./src/style/flavor/navs.less","webpack://misago/./src/style/flavor/username-history.less","webpack://misago/./src/style/flavor/panels.less","webpack://misago/./src/style/flavor/form.less","webpack://misago/./src/style/flavor/participants.less","webpack://misago/./src/style/flavor/poll.less","webpack://misago/./src/style/flavor/posting.less","webpack://misago/./src/style/flavor/post.less","webpack://misago/./src/style/flavor/post-feed.less","webpack://misago/./src/style/flavor/event.less","webpack://misago/./src/style/flavor/user-card.less","webpack://misago/./src/style/flavor/progress-bars.less","webpack://misago/./src/style/flavor/markup.less","webpack://misago/./src/style/flavor/modals.less","webpack://misago/./src/style/flavor/wells.less","webpack://misago/./src/style/flavor/active-posters.less","webpack://misago/./src/style/flavor/message-pages.less","webpack://misago/./src/style/flavor/user-settings.less","webpack://misago/./src/style/flavor/profile-details.less","webpack://misago/./src/style/flavor/ranks-flavors.less","webpack://misago/./src/style/misago/javascript.less"],"sourcesContent":["/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: none;\n text-decoration: underline;\n text-decoration: underline dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #172b4d;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #0065ff;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #0747a6;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #ebecf0;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: 400;\n line-height: 1;\n color: #7a869a;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #7a869a;\n}\n.text-primary {\n color: #2563eb;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #134cca;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #2563eb;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #134cca;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #ebecf0;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 700px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #ebecf0;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #7a869a;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: \"\\2014 \\00A0\";\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #ebecf0;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: \"\";\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: \"\\00A0 \\2014\";\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #344563;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n.row-no-gutters [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1,\n .col-sm-2,\n .col-sm-3,\n .col-sm-4,\n .col-sm-5,\n .col-sm-6,\n .col-sm-7,\n .col-sm-8,\n .col-sm-9,\n .col-sm-10,\n .col-sm-11,\n .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1,\n .col-md-2,\n .col-md-3,\n .col-md-4,\n .col-md-5,\n .col-md-6,\n .col-md-7,\n .col-md-8,\n .col-md-9,\n .col-md-10,\n .col-md-11,\n .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1,\n .col-lg-2,\n .col-lg-3,\n .col-lg-4,\n .col-lg-5,\n .col-lg-6,\n .col-lg-7,\n .col-lg-8,\n .col-lg-9,\n .col-lg-10,\n .col-lg-11,\n .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #7a869a;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: 0.01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #344563;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: 700;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-appearance: none;\n appearance: none;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #172b4d;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #172b4d;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ced0da;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #ebecf0;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #3462af;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #172b4d;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n opacity: 0.65;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #172b4d;\n background-color: #ebecf0;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #172b4d;\n background-color: #ced0da;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #172b4d;\n background-color: #ced0da;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #172b4d;\n background-color: #ced0da;\n background-image: none;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #172b4d;\n background-color: #b9bdcb;\n border-color: #8c8c8c;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #ebecf0;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #ebecf0;\n background-color: #172b4d;\n}\n.btn-primary {\n color: #fff;\n background-color: #2563eb;\n border-color: #1555e2;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #134cca;\n border-color: #0a296d;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #134cca;\n border-color: #1040aa;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #134cca;\n background-image: none;\n border-color: #1040aa;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #1040aa;\n border-color: #0a296d;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #2563eb;\n border-color: #1555e2;\n}\n.btn-primary .badge {\n color: #2563eb;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #22c55e;\n border-color: #1eaf54;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #1a9a49;\n border-color: #0b4320;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #1a9a49;\n border-color: #157b3b;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #1a9a49;\n background-image: none;\n border-color: #157b3b;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #157b3b;\n border-color: #0b4320;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #22c55e;\n border-color: #1eaf54;\n}\n.btn-success .badge {\n color: #22c55e;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #4f46e5;\n border-color: #3a30e2;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #291fd9;\n border-color: #181280;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #291fd9;\n border-color: #231aba;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #291fd9;\n background-image: none;\n border-color: #231aba;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #231aba;\n border-color: #181280;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #4f46e5;\n border-color: #3a30e2;\n}\n.btn-info .badge {\n color: #4f46e5;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #ffab00;\n border-color: #e69a00;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #cc8900;\n border-color: #664400;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #cc8900;\n border-color: #a87100;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #cc8900;\n background-image: none;\n border-color: #a87100;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #a87100;\n border-color: #664400;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #ffab00;\n border-color: #e69a00;\n}\n.btn-warning .badge {\n color: #ffab00;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #ef5350;\n border-color: #ed3c39;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #eb2521;\n border-color: #98110e;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #eb2521;\n border-color: #d51713;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #eb2521;\n background-image: none;\n border-color: #d51713;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #d51713;\n border-color: #98110e;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #ef5350;\n border-color: #ed3c39;\n}\n.btn-danger .badge {\n color: #ef5350;\n background-color: #fff;\n}\n.btn-link {\n font-weight: 400;\n color: #0065ff;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #0747a6;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #7a869a;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #ebecf0;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: 400;\n line-height: 1.42857143;\n color: #172b4d;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #172b4d;\n text-decoration: none;\n background-color: #ebecf0;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #172b4d;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #7a869a;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #7a869a;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 700px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #ebecf0;\n}\n.nav > li.disabled > a {\n color: #7a869a;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #7a869a;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #ebecf0;\n border-color: #0065ff;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #ebecf0 #ebecf0 #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #5e6c84;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #0065ff;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #7a869a;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 0;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #fff;\n background-color: #00875a;\n border-color: #00875a;\n}\n.alert-success hr {\n border-top-color: #006e49;\n}\n.alert-success .alert-link {\n color: #e6e6e6;\n}\n.alert-info {\n color: #fff;\n background-color: #2563eb;\n border-color: #2563eb;\n}\n.alert-info hr {\n border-top-color: #1555e2;\n}\n.alert-info .alert-link {\n color: #e6e6e6;\n}\n.alert-warning {\n color: #fff;\n background-color: #ff8b00;\n border-color: #ff8b00;\n}\n.alert-warning hr {\n border-top-color: #e67d00;\n}\n.alert-warning .alert-link {\n color: #e6e6e6;\n}\n.alert-danger {\n color: #fff;\n background-color: #de350b;\n border-color: #de350b;\n}\n.alert-danger hr {\n border-top-color: #c62f0a;\n}\n.alert-danger .alert-link {\n color: #e6e6e6;\n}\n.label {\n display: inline;\n padding: 0.2em 0.6em 0.3em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #7a869a;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #616d80;\n}\n.label-primary {\n background-color: #2563eb;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #134cca;\n}\n.label-success {\n background-color: #36b37e;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #2a8c62;\n}\n.label-info {\n background-color: #4f46e5;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #291fd9;\n}\n.label-warning {\n background-color: #ffab00;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #cc8900;\n}\n.label-danger {\n background-color: #ff5630;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #fc2e00;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #ebecf0;\n border-radius: 3px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #2563eb;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #36b37e;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #4f46e5;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #ffab00;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #ff5630;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: 400;\n line-height: 1;\n color: #172b4d;\n text-align: center;\n background-color: #ebecf0;\n border: 1px solid #ced0da;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ebecf0;\n}\n.list-group-item:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #7a869a;\n cursor: not-allowed;\n background-color: #ebecf0;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #7a869a;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #0065ff;\n background-color: #fff;\n border-color: #ebecf0;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #ffffff;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #7a869a;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #172b4d;\n text-decoration: none;\n background-color: #fff;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 14px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 14px 15px;\n background-color: #fff;\n border-top: 1px solid #ebecf0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ebecf0;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ebecf0;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #344563;\n background-color: #fff;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #fff;\n background-color: #344563;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #2563eb;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #2563eb;\n border-color: #2563eb;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #2563eb;\n}\n.panel-primary > .panel-heading .badge {\n color: #2563eb;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #2563eb;\n}\n.panel-success {\n border-color: #36b37e;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #36b37e;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #36b37e;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #36b37e;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ff5630;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ff5630;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ff5630;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ff5630;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #ebecf0;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #7a869a;\n cursor: not-allowed;\n background-color: #fff;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #0065ff;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #0747a6;\n background-color: #ebecf0;\n border-color: #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #2563eb;\n border-color: #2563eb;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #7a869a;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: 0.2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n appearance: none;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #7a869a;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #0065ff;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #091e42;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #ced0da;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #ced0da;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.nav:before,\n.nav:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.panel-body:before,\n.panel-body:after,\n.pager:before,\n.pager:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after,\n.agreement-footer:before,\n.agreement-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.nav:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.panel-body:after,\n.pager:after,\n.modal-header:after,\n.modal-footer:after,\n.agreement-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n@media screen and (min-width: 992px) {\n .md-margin-top-no {\n margin-top: 0px !important;\n }\n}\n@media screen and (min-width: 768px) and (max-width: 991px) {\n .sm-margin-top {\n margin-top: 20px !important;\n }\n .sm-margin-top-no {\n margin-top: 0px !important;\n }\n .sm-margin-top-half {\n margin-top: 6.6px !important;\n }\n .sm-align-row-buttons {\n margin-top: 5px !important;\n }\n}\n@media screen and (max-width: 767px) {\n .xs-margin-top {\n margin-top: 20px !important;\n }\n .xs-margin-top-half {\n margin-top: 6.6px !important;\n }\n}\n.flex-row {\n display: block;\n margin: 0 -15px;\n}\n.flex-row-section {\n align-items: center;\n display: flex;\n flex: 1;\n}\n.flex-row-section + .flex-row-section {\n margin-top: 20px;\n}\n.flex-row-col {\n flex: 1;\n padding: 0 15px;\n}\n@media screen and (min-width: 768px) {\n .flex-row {\n display: flex;\n align-items: center;\n }\n .flex-row-section + .flex-row-section {\n margin: 0;\n }\n .flex-row-section,\n .flex-row-col {\n flex: 0;\n align-items: center;\n }\n .flex-row-section.flex-row-section-auto,\n .flex-row-section.flex-row-section-auto > .flex-row-col {\n flex: 1;\n }\n}\n.flex-row-col-shrink {\n flex: 0 !important;\n}\n.d-none {\n display: none !important;\n}\n@media screen and (max-width: 767px) {\n .w-100-xs {\n width: 100%;\n }\n .flex-order-first-xs {\n order: -9999;\n }\n .flex-order-last-xs {\n order: 9999;\n }\n}\n.atwho-view ul li img {\n border-radius: 3px;\n margin-right: 4.66666667px;\n width: 20px;\n height: 20px;\n}\n.auth-message {\n background-color: #ebecf0;\n padding: 20px 0px;\n width: 100%;\n position: fixed;\n top: -100%;\n left: 0px;\n z-index: 1070;\n transition: top 300ms ease;\n}\n.auth-message.show {\n top: 0px;\n bottom: auto;\n}\n.auth-message p {\n padding: 5px 0px;\n color: #172b4d;\n}\n@media screen and (max-width: 991px) {\n .auth-message {\n text-align: center;\n }\n .auth-message .btn {\n padding: 10px 16px;\n font-size: 18px;\n }\n}\n@keyframes misago-ajax-loader {\n 0% {\n width: 0;\n }\n 3% {\n width: 50%;\n }\n 50% {\n width: 75%;\n }\n 100% {\n width: 100%;\n }\n}\n#misago-ajax-loader {\n position: fixed;\n width: 100%;\n z-index: 1080;\n}\n#misago-ajax-loader div {\n background-color: #2563eb;\n}\n#misago-ajax-loader.busy div {\n width: 0;\n height: 4px;\n animation-name: misago-ajax-loader;\n animation-duration: 600s;\n}\n#misago-ajax-loader.complete div {\n width: 100;\n height: 4px;\n opacity: 0;\n transition: width 1s;\n transition: opacity 1s;\n}\n.alert {\n margin-bottom: 0;\n text-align: center;\n font-size: 18px;\n}\n#misago-snackbars:empty {\n display: none;\n}\n#misago-snackbars {\n position: fixed;\n top: 80px;\n padding: 0 24px;\n width: 100%;\n z-index: 10000;\n display: flex;\n justify-content: center;\n}\n.snackbar {\n padding: 6px 12px;\n background-color: #111;\n border-radius: 4px;\n position: relative;\n top: -12px;\n opacity: 0;\n color: #ffff;\n font-size: 14px;\n}\n@media screen and (min-width: 720px) {\n .snackbar {\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 18px;\n }\n}\n.snackbar.snackbar-success {\n background-color: #16a34a;\n color: #ffff;\n}\n.snackbar.snackbar-warning {\n background-color: #fef08a;\n color: #000;\n}\n.snackbar.snackbar-danger {\n background-color: #dc2626;\n color: #ffff;\n}\n.snackbar.in {\n top: 0;\n opacity: 1;\n transition: 300ms ease;\n}\n.snackbar.out {\n opacity: 0;\n transition: 300ms ease;\n}\n.alerts-snackbar {\n position: fixed;\n top: -100%;\n width: 100%;\n z-index: 1060;\n text-align: center;\n font-size: 18px;\n transition: top 300ms ease;\n pointer-events: none;\n}\n.alerts-snackbar.in {\n top: 0px;\n transition: top 200ms ease;\n}\n.alerts-snackbar p {\n display: inline-block;\n border-radius: 0px 0px 4px 4px;\n margin: 0px;\n pointer-events: all;\n}\n.agreement-overlay {\n position: fixed;\n width: 100%;\n height: 100%;\n top: 0px;\n left: 0px;\n z-index: 1060;\n background-color: rgba(9, 30, 66, 0.5);\n overflow-x: scroll;\n}\n.agreement-overlay .container {\n max-width: 900px;\n padding: 20px 30px;\n}\n.agreement-content {\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n padding: 10px 16px;\n}\n.agreement-header {\n padding: 10px 0;\n border-bottom: 1px solid #ebecf0;\n}\n.agreement-header h2 {\n margin-top: 0;\n}\n.agreement-header p {\n margin: 0;\n padding: 0;\n}\n.agreement-body {\n padding: 20px 0;\n}\n.agreement-body p.lead {\n margin: 0;\n padding: 0;\n}\n.agreement-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #ced0da;\n padding: 10px 0;\n}\n.agreement-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.agreement-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.agreement-footer .btn-block + .btn-block {\n margin-left: 0;\n}\nbody.agreement-overlay-visible {\n overflow: hidden;\n}\n.loader {\n width: 100%;\n height: 49px;\n text-align: center;\n}\n.loader.loader-spaced {\n margin: 40px 0px;\n}\n.loader-spinning-wheel {\n width: 49px;\n height: 49px;\n margin: 0 auto;\n border: 3px solid #7a869a;\n border-radius: 50%;\n border-left-color: transparent;\n border-right-color: transparent;\n animation: cssload-spin 575ms infinite linear;\n -o-animation: cssload-spin 575ms infinite linear;\n -ms-animation: cssload-spin 575ms infinite linear;\n -webkit-animation: cssload-spin 575ms infinite linear;\n -moz-animation: cssload-spin 575ms infinite linear;\n}\n@keyframes cssload-spin {\n 100% {\n transform: rotate(360deg);\n }\n}\n@-o-keyframes cssload-spin {\n 100% {\n -o-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-ms-keyframes cssload-spin {\n 100% {\n -ms-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes cssload-spin {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-moz-keyframes cssload-spin {\n 100% {\n -moz-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.navbar {\n position: sticky;\n top: 0;\n height: 60px;\n z-index: 1030;\n background-color: #fff;\n border-bottom: 1px solid #e5e7eb;\n color: #111827;\n}\n.navbar-container {\n display: flex;\n height: 100%;\n align-items: center;\n}\n.navbar-right {\n display: flex;\n height: 100%;\n align-items: center;\n margin-left: auto;\n}\n.navbar-branding {\n display: flex;\n align-items: center;\n margin-right: 24px;\n}\n.navbar-branding-text,\n.navbar-branding-text:link,\n.navbar-branding-text:visited,\n.navbar-branding-text:hover,\n.navbar-branding-text:focus,\n.navbar-branding-text:active {\n color: #374151;\n font-size: 22px;\n text-decoration: none;\n}\n.navbar-branding-logo img {\n height: 40px;\n}\n.navbar-branding-logo-xs {\n margin-right: 12px;\n}\n.navbar-branding-logo-xs img {\n height: 34px;\n width: 34px;\n}\n.navbar-extra-menu {\n display: block;\n margin: 0;\n padding: 0;\n font-size: 18px;\n}\n.navbar-extra-menu > li,\n.navbar-extra-menu > li > a {\n display: inline-block;\n}\n.navbar-extra-menu a,\n.navbar-extra-menu a:link,\n.navbar-extra-menu a:visited {\n padding: 6px 12px;\n border-radius: 4px;\n color: #172b4d;\n}\n.navbar-extra-menu a:hover,\n.navbar-extra-menu a:focus {\n color: #172b4d;\n text-decoration: none;\n}\n.navbar-extra-menu a:active {\n color: #172b4d;\n background-color: #e5e7eb;\n text-decoration: none;\n}\n.btn.btn-navbar-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n position: relative;\n margin-left: 12px;\n padding: 0;\n}\n.btn.btn-navbar-icon .material-icon {\n margin: 0;\n font-size: 24px;\n line-height: 24px;\n}\n.btn.btn-navbar-icon,\n.btn.btn-navbar-icon:link,\n.btn.btn-navbar-icon:visited,\n.btn.btn-navbar-icon:hover,\n.btn.btn-navbar-icon:focus {\n color: #374151;\n background-color: transparent;\n border-color: transparent;\n box-shadow: none;\n}\n.btn.btn-navbar-icon:active,\n.btn.btn-navbar-icon.active {\n color: #172b4d;\n background-color: #e5e7eb;\n border-color: #e5e7eb;\n box-shadow: none;\n}\n.btn-navbar-image {\n display: inline-block;\n padding: 0;\n margin-left: 12px;\n}\n.btn-navbar-image img {\n width: 34px;\n height: 34px;\n border-radius: 3px;\n}\n.navbar-item-badge {\n position: absolute;\n top: -3px;\n right: -3px;\n padding: 0 5px;\n background-color: #dc2626;\n border-radius: 4px;\n color: #fff;\n font-size: 12px;\n z-index: 2;\n}\n.btn-navbar-sign-in,\n.btn-navbar-register {\n margin-left: 12px;\n}\n@media screen and (max-width: 767px) {\n #navbar-notifications-dropdown,\n #navbar-private-threads,\n #navbar-search-dropdown,\n #navbar-site-nav-dropdown,\n #navbar-user-nav-dropdown,\n .navbar-extra-menu,\n .btn-navbar-sign-in,\n .btn-navbar-register {\n display: none;\n }\n}\n@media screen and (max-width: 420px) {\n #navbar-private-threads {\n display: none;\n }\n}\n@media screen and (min-width: 768px) {\n #navbar-notifications-overlay,\n #navbar-search-overlay,\n #navbar-site-nav-overlay,\n #navbar-user-nav-overlay {\n display: none;\n }\n}\n.nav-side > a > .material-icon {\n margin: -5px;\n margin-right: 10px;\n position: relative;\n bottom: 1px;\n width: 24px;\n height: 24px;\n font-size: 24px;\n line-height: 24px;\n}\n.nav-side > a .badge {\n position: relative;\n top: 1px;\n}\n.nav-pills > li > a {\n display: flex;\n align-items: center;\n padding: 5px 10px;\n}\n.nav-pills > li > a .material-icon {\n margin-right: 3px;\n}\n.nav-pills > li > a,\n.nav-pills > li > a:link,\n.nav-pills > li > a:visited {\n background-color: #ebecf0;\n color: #344563;\n}\n.nav-pills > li > a:focus,\n.nav-pills > li > a:hover,\n.nav-pills > li > a:active {\n background-color: #dcdee5;\n color: #344563;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:link,\n.nav-pills > li.active > a:visited,\n.nav-pills > li.active > a:focus,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:active {\n background-color: #344563;\n color: #fff;\n}\n.nav-container .btn-block {\n margin-bottom: 20px;\n}\n.nav-container .nav {\n margin-right: -10px;\n margin-bottom: 30px;\n}\n.nav-container .nav-pills {\n margin-bottom: 10px;\n}\n.nav-container li {\n margin-right: 10px;\n margin-bottom: 10px;\n}\n.breadcrumbs {\n display: block;\n padding: 0;\n margin-bottom: 10px;\n}\n.breadcrumbs-item {\n display: inline-block;\n margin-right: 15px;\n margin-bottom: 10px;\n padding: 0;\n list-style: none;\n white-space: nowrap;\n}\n.breadcrumbs-item a {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n text-decoration: none;\n}\n.breadcrumbs-item a,\n.breadcrumbs-item a:visited {\n color: #5e6c84;\n}\n.breadcrumbs-item a:hover,\n.breadcrumbs-item a:focus {\n color: #172b4d;\n}\n.breadcrumbs-item a:hover .breadcrumbs-item-name,\n.breadcrumbs-item a:focus .breadcrumbs-item-name {\n text-decoration: underline;\n}\n.breadcrumbs-item a:active {\n color: #172b4d;\n}\n.breadcrumbs-item .material-icon {\n margin-right: 4px;\n}\n.toolbar-item .breadcrumbs {\n width: 100%;\n white-space: nowrap;\n margin: 0;\n}\n.toolbar-item .breadcrumbs-item {\n margin-bottom: 0;\n}\n.breadcrumbs-compact {\n display: none;\n}\n@media screen and (max-width: 767px) {\n .breadcrumbs {\n display: none;\n }\n .breadcrumbs-compact {\n display: block;\n }\n}\n@font-face {\n font-family: \"Material Icons\";\n font-style: normal;\n font-weight: 400;\n src: url(./fonts/MaterialIcons-Regular.eot);\n /* For IE6-8 */\n 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\");\n}\n.material-icon {\n font-family: \"Material Icons\";\n font-weight: normal;\n font-style: normal;\n display: inline-block;\n width: 1em;\n height: 1em;\n line-height: 1;\n text-align: center;\n text-transform: none;\n letter-spacing: normal;\n vertical-align: middle;\n word-wrap: normal;\n overflow-wrap: normal;\n white-space: nowrap;\n direction: ltr;\n /* Support for all WebKit browsers. */\n -webkit-font-smoothing: antialiased;\n /* Support for Safari and Chrome. */\n text-rendering: optimizeLegibility;\n /* Support for Firefox. */\n -moz-osx-font-smoothing: grayscale;\n /* Support for IE. */\n font-feature-settings: \"liga\";\n}\n.modal-toolbar {\n background: #ebecf0;\n border-bottom: 1px solid #ced0da;\n overflow: auto;\n padding: 6px 12px;\n}\n.modal-toolbar .pull-left {\n margin-right: 8px;\n}\n.modal-toolbar p {\n padding: 5px 0px;\n margin-bottom: 0px;\n}\n@media screen and (max-width: 991px) {\n .modal-message {\n text-align: center;\n }\n .modal-message .message-icon {\n margin: 30px;\n }\n .modal-message .message-icon .material-icon {\n font-size: 160px;\n }\n}\n@media screen and (min-width: 992px) {\n .modal-message .modal-body {\n padding-top: 20px;\n padding-bottom: 30px;\n }\n .modal-message .message-icon {\n float: left;\n position: relative;\n left: 7px;\n }\n .modal-message .message-icon .material-icon {\n font-size: 50px;\n }\n .modal-message .message-body {\n margin-left: 75px;\n margin-top: 10px;\n }\n .modal-message .message-body p {\n margin-top: 20px;\n }\n .modal-message .message-body .lead {\n margin-top: 0px;\n margin-bottom: 0px;\n }\n}\n.modal-loader {\n padding: 50px 0px;\n}\n.modal-loader .loader {\n width: 100%;\n height: 80px;\n text-align: center;\n}\n.modal-loader .loader-spinning-wheel {\n width: 80px;\n height: 80px;\n}\n.modal-body .form-group {\n min-height: 34px;\n}\n.list-item-errors {\n margin-bottom: 20px;\n}\n.list-errored-items li:last-child .list-item-errors {\n margin-bottom: 0px;\n}\n.modal-post-likers .media-list {\n margin: 0px;\n}\n.modal-post-likers .item-title {\n display: block;\n}\n.has-feedback .material-icon.form-control-feedback {\n top: 6px;\n right: 24px;\n font-size: 1.42857143;\n line-height: 1.42857143;\n}\n.well.well-form.well-done {\n font-size: 18px;\n text-align: center;\n}\n.well.well-form.well-done .message-icon {\n margin-bottom: 10px;\n font-size: 90px;\n line-height: 90px;\n}\n.well.well-form.well-done .message-body {\n margin-bottom: 20px;\n}\n.well.well-form.well-noscript {\n font-size: 18px;\n text-align: center;\n}\n.well.well-form.well-noscript .message-icon {\n margin-bottom: 10px;\n font-size: 90px;\n line-height: 90px;\n}\n.btn.btn-yes-no,\n.btn.btn-select {\n background: transparent;\n border: 1px solid #ced0da;\n}\n.btn.btn-yes-no .material-icon,\n.btn.btn-select .material-icon {\n margin: -4px 0px;\n margin-right: 8px;\n position: relative;\n bottom: 1px;\n width: 20px;\n height: 20px;\n font-size: 20px;\n line-height: 20px;\n}\n@media screen and (max-width: 767px) {\n .btn.btn-yes-no {\n width: 100%;\n overflow: auto;\n }\n .btn.btn-yes-no .material-icon {\n float: left;\n margin-top: 1px;\n }\n .btn.btn-yes-no .btn-text {\n display: block;\n margin-left: 30px;\n text-align: left;\n white-space: normal;\n }\n}\ninput.hidden-file-upload {\n position: absolute;\n top: -9999px;\n left: -9999px;\n}\n.form-search {\n position: relative;\n}\n.form-search .form-control {\n padding-right: 30px;\n}\n.form-search .material-icon {\n position: absolute;\n top: 5px;\n right: 5px;\n color: #7a869a;\n font-size: 24px;\n line-height: 24px;\n pointer-events: none;\n}\n.btn.btn-loading,\n.btn.btn-loading:link,\n.btn.btn-loading:active,\n.btn.btn-loading:visited,\n.btn.btn-loading:hover,\n.btn.btn-loading:focus {\n color: transparent;\n}\n.btn.btn-loading .loader,\n.btn.btn-loading:link .loader,\n.btn.btn-loading:active .loader,\n.btn.btn-loading:visited .loader,\n.btn.btn-loading:hover .loader,\n.btn.btn-loading:focus .loader {\n height: 20px;\n margin-top: -20px;\n}\n.btn.btn-loading .loader > div,\n.btn.btn-loading:link .loader > div,\n.btn.btn-loading:active .loader > div,\n.btn.btn-loading:visited .loader > div,\n.btn.btn-loading:hover .loader > div,\n.btn.btn-loading:focus .loader > div {\n width: 20px;\n height: 20px;\n}\n.btn.btn-loading.btn-default .loader > div {\n border-top-color: #172b4d;\n border-bottom-color: #172b4d;\n}\n.btn.btn-loading.btn-primary .loader > div {\n border-top-color: #fff;\n border-bottom-color: #fff;\n}\n.btn.btn-loading.btn-success .loader > div {\n border-top-color: #fff;\n border-bottom-color: #fff;\n}\n.btn.btn-loading.btn-info .loader > div {\n border-top-color: #fff;\n border-bottom-color: #fff;\n}\n.btn.btn-loading.btn-warning .loader > div {\n border-top-color: #fff;\n border-bottom-color: #fff;\n}\n.btn.btn-loading.btn-danger .loader > div {\n border-top-color: #fff;\n border-bottom-color: #fff;\n}\n.btn .material-icon {\n margin-right: 3px;\n position: relative;\n bottom: 1px;\n}\n.btn-icon .material-icon {\n margin: -1px -4px;\n width: 20px;\n height: 20px;\n font-size: 20px;\n line-height: 20px;\n}\n.btn-icon .btn-text {\n margin-left: 10px;\n}\n.btn-icon .btn-text-left {\n margin-right: 10px;\n}\n.btn-block.btn-icon {\n padding-left: 0px;\n padding-right: 0px;\n}\n.btn-icons-family .material-icon + .material-icon {\n margin-left: 10px;\n}\n.btn-sign-in {\n color: #fff;\n background-color: #2563eb;\n border-color: #2563eb;\n}\n.btn-sign-in:focus,\n.btn-sign-in.focus {\n color: #fff;\n background-color: #134cca;\n border-color: #0c3284;\n}\n.btn-sign-in:hover {\n color: #fff;\n background-color: #134cca;\n border-color: #1249c1;\n}\n.btn-sign-in:active,\n.btn-sign-in.active,\n.open > .dropdown-toggle.btn-sign-in {\n color: #fff;\n background-color: #134cca;\n background-image: none;\n border-color: #1249c1;\n}\n.btn-sign-in:active:hover,\n.btn-sign-in.active:hover,\n.open > .dropdown-toggle.btn-sign-in:hover,\n.btn-sign-in:active:focus,\n.btn-sign-in.active:focus,\n.open > .dropdown-toggle.btn-sign-in:focus,\n.btn-sign-in:active.focus,\n.btn-sign-in.active.focus,\n.open > .dropdown-toggle.btn-sign-in.focus {\n color: #fff;\n background-color: #1040aa;\n border-color: #0c3284;\n}\n.btn-sign-in.disabled:hover,\n.btn-sign-in[disabled]:hover,\nfieldset[disabled] .btn-sign-in:hover,\n.btn-sign-in.disabled:focus,\n.btn-sign-in[disabled]:focus,\nfieldset[disabled] .btn-sign-in:focus,\n.btn-sign-in.disabled.focus,\n.btn-sign-in[disabled].focus,\nfieldset[disabled] .btn-sign-in.focus {\n background-color: #2563eb;\n border-color: #2563eb;\n}\n.btn-sign-in .badge {\n color: #2563eb;\n background-color: #fff;\n}\n.btn-register {\n color: #fff;\n background-color: #2563eb;\n border-color: #2563eb;\n}\n.btn-register:focus,\n.btn-register.focus {\n color: #fff;\n background-color: #134cca;\n border-color: #0c3284;\n}\n.btn-register:hover {\n color: #fff;\n background-color: #134cca;\n border-color: #1249c1;\n}\n.btn-register:active,\n.btn-register.active,\n.open > .dropdown-toggle.btn-register {\n color: #fff;\n background-color: #134cca;\n background-image: none;\n border-color: #1249c1;\n}\n.btn-register:active:hover,\n.btn-register.active:hover,\n.open > .dropdown-toggle.btn-register:hover,\n.btn-register:active:focus,\n.btn-register.active:focus,\n.open > .dropdown-toggle.btn-register:focus,\n.btn-register:active.focus,\n.btn-register.active.focus,\n.open > .dropdown-toggle.btn-register.focus {\n color: #fff;\n background-color: #1040aa;\n border-color: #0c3284;\n}\n.btn-register.disabled:hover,\n.btn-register[disabled]:hover,\nfieldset[disabled] .btn-register:hover,\n.btn-register.disabled:focus,\n.btn-register[disabled]:focus,\nfieldset[disabled] .btn-register:focus,\n.btn-register.disabled.focus,\n.btn-register[disabled].focus,\nfieldset[disabled] .btn-register.focus {\n background-color: #2563eb;\n border-color: #2563eb;\n}\n.btn-register .badge {\n color: #2563eb;\n background-color: #fff;\n}\n.btn-muted {\n color: #7a869a;\n border-radius: 0;\n}\n.btn-muted,\n.btn-muted:active,\n.btn-muted.active,\n.btn-muted[disabled],\nfieldset[disabled] .btn-muted {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-muted,\n.btn-muted:hover,\n.btn-muted:focus,\n.btn-muted:active {\n border-color: transparent;\n}\n.btn-muted:hover,\n.btn-muted:focus {\n color: #172b4d;\n background-color: transparent;\n}\n.btn-muted[disabled]:hover,\nfieldset[disabled] .btn-muted:hover,\n.btn-muted[disabled]:focus,\nfieldset[disabled] .btn-muted:focus {\n color: #7a869a;\n text-decoration: none;\n}\n.btn-moderation {\n color: #fff;\n background-color: #111;\n border-color: #111;\n}\n.btn-moderation:focus,\n.btn-moderation.focus {\n color: #fff;\n background-color: #000000;\n border-color: #000000;\n}\n.btn-moderation:hover {\n color: #fff;\n background-color: #000000;\n border-color: #000000;\n}\n.btn-moderation:active,\n.btn-moderation.active,\n.open > .dropdown-toggle.btn-moderation {\n color: #fff;\n background-color: #000000;\n background-image: none;\n border-color: #000000;\n}\n.btn-moderation:active:hover,\n.btn-moderation.active:hover,\n.open > .dropdown-toggle.btn-moderation:hover,\n.btn-moderation:active:focus,\n.btn-moderation.active:focus,\n.open > .dropdown-toggle.btn-moderation:focus,\n.btn-moderation:active.focus,\n.btn-moderation.active.focus,\n.open > .dropdown-toggle.btn-moderation.focus {\n color: #fff;\n background-color: #000000;\n border-color: #000000;\n}\n.btn-moderation.disabled:hover,\n.btn-moderation[disabled]:hover,\nfieldset[disabled] .btn-moderation:hover,\n.btn-moderation.disabled:focus,\n.btn-moderation[disabled]:focus,\nfieldset[disabled] .btn-moderation:focus,\n.btn-moderation.disabled.focus,\n.btn-moderation[disabled].focus,\nfieldset[disabled] .btn-moderation.focus {\n background-color: #111;\n border-color: #111;\n}\n.btn-moderation .badge {\n color: #111;\n background-color: #fff;\n}\n.btn-social-github {\n color: #fff;\n background-color: #333;\n border-color: #333;\n}\n.btn-social-github:focus,\n.btn-social-github.focus {\n color: #fff;\n background-color: #1a1a1a;\n border-color: #000000;\n}\n.btn-social-github:hover {\n color: #fff;\n background-color: #1a1a1a;\n border-color: #141414;\n}\n.btn-social-github:active,\n.btn-social-github.active,\n.open > .dropdown-toggle.btn-social-github {\n color: #fff;\n background-color: #1a1a1a;\n background-image: none;\n border-color: #141414;\n}\n.btn-social-github:active:hover,\n.btn-social-github.active:hover,\n.open > .dropdown-toggle.btn-social-github:hover,\n.btn-social-github:active:focus,\n.btn-social-github.active:focus,\n.open > .dropdown-toggle.btn-social-github:focus,\n.btn-social-github:active.focus,\n.btn-social-github.active.focus,\n.open > .dropdown-toggle.btn-social-github.focus {\n color: #fff;\n background-color: #080808;\n border-color: #000000;\n}\n.btn-social-github.disabled:hover,\n.btn-social-github[disabled]:hover,\nfieldset[disabled] .btn-social-github:hover,\n.btn-social-github.disabled:focus,\n.btn-social-github[disabled]:focus,\nfieldset[disabled] .btn-social-github:focus,\n.btn-social-github.disabled.focus,\n.btn-social-github[disabled].focus,\nfieldset[disabled] .btn-social-github.focus {\n background-color: #333;\n border-color: #333;\n}\n.btn-social-github .badge {\n color: #333;\n background-color: #fff;\n}\n.btn-social-facebook {\n color: #fff;\n background-color: #4267b2;\n border-color: #4267b2;\n}\n.btn-social-facebook:focus,\n.btn-social-facebook.focus {\n color: #fff;\n background-color: #34518d;\n border-color: #203155;\n}\n.btn-social-facebook:hover {\n color: #fff;\n background-color: #34518d;\n border-color: #314d85;\n}\n.btn-social-facebook:active,\n.btn-social-facebook.active,\n.open > .dropdown-toggle.btn-social-facebook {\n color: #fff;\n background-color: #34518d;\n background-image: none;\n border-color: #314d85;\n}\n.btn-social-facebook:active:hover,\n.btn-social-facebook.active:hover,\n.open > .dropdown-toggle.btn-social-facebook:hover,\n.btn-social-facebook:active:focus,\n.btn-social-facebook.active:focus,\n.open > .dropdown-toggle.btn-social-facebook:focus,\n.btn-social-facebook:active.focus,\n.btn-social-facebook.active.focus,\n.open > .dropdown-toggle.btn-social-facebook.focus {\n color: #fff;\n background-color: #2b4273;\n border-color: #203155;\n}\n.btn-social-facebook.disabled:hover,\n.btn-social-facebook[disabled]:hover,\nfieldset[disabled] .btn-social-facebook:hover,\n.btn-social-facebook.disabled:focus,\n.btn-social-facebook[disabled]:focus,\nfieldset[disabled] .btn-social-facebook:focus,\n.btn-social-facebook.disabled.focus,\n.btn-social-facebook[disabled].focus,\nfieldset[disabled] .btn-social-facebook.focus {\n background-color: #4267b2;\n border-color: #4267b2;\n}\n.btn-social-facebook .badge {\n color: #4267b2;\n background-color: #fff;\n}\n.btn-social-google-oauth2 {\n color: #fff;\n background-color: #db4437;\n border-color: #db4437;\n}\n.btn-social-google-oauth2:focus,\n.btn-social-google-oauth2.focus {\n color: #fff;\n background-color: #bd2e22;\n border-color: #7c1e16;\n}\n.btn-social-google-oauth2:hover {\n color: #fff;\n background-color: #bd2e22;\n border-color: #b42c20;\n}\n.btn-social-google-oauth2:active,\n.btn-social-google-oauth2.active,\n.open > .dropdown-toggle.btn-social-google-oauth2 {\n color: #fff;\n background-color: #bd2e22;\n background-image: none;\n border-color: #b42c20;\n}\n.btn-social-google-oauth2:active:hover,\n.btn-social-google-oauth2.active:hover,\n.open > .dropdown-toggle.btn-social-google-oauth2:hover,\n.btn-social-google-oauth2:active:focus,\n.btn-social-google-oauth2.active:focus,\n.open > .dropdown-toggle.btn-social-google-oauth2:focus,\n.btn-social-google-oauth2:active.focus,\n.btn-social-google-oauth2.active.focus,\n.open > .dropdown-toggle.btn-social-google-oauth2.focus {\n color: #fff;\n background-color: #9f271d;\n border-color: #7c1e16;\n}\n.btn-social-google-oauth2.disabled:hover,\n.btn-social-google-oauth2[disabled]:hover,\nfieldset[disabled] .btn-social-google-oauth2:hover,\n.btn-social-google-oauth2.disabled:focus,\n.btn-social-google-oauth2[disabled]:focus,\nfieldset[disabled] .btn-social-google-oauth2:focus,\n.btn-social-google-oauth2.disabled.focus,\n.btn-social-google-oauth2[disabled].focus,\nfieldset[disabled] .btn-social-google-oauth2.focus {\n background-color: #db4437;\n border-color: #db4437;\n}\n.btn-social-google-oauth2 .badge {\n color: #db4437;\n background-color: #fff;\n}\n.btn-social-discord {\n color: #fff;\n background-color: #5865f2;\n border-color: #5865f2;\n}\n.btn-social-discord:focus,\n.btn-social-discord.focus {\n color: #fff;\n background-color: #2939ee;\n border-color: #0f1dbc;\n}\n.btn-social-discord:hover {\n color: #fff;\n background-color: #2939ee;\n border-color: #1f31ee;\n}\n.btn-social-discord:active,\n.btn-social-discord.active,\n.open > .dropdown-toggle.btn-social-discord {\n color: #fff;\n background-color: #2939ee;\n background-image: none;\n border-color: #1f31ee;\n}\n.btn-social-discord:active:hover,\n.btn-social-discord.active:hover,\n.open > .dropdown-toggle.btn-social-discord:hover,\n.btn-social-discord:active:focus,\n.btn-social-discord.active:focus,\n.open > .dropdown-toggle.btn-social-discord:focus,\n.btn-social-discord:active.focus,\n.btn-social-discord.active.focus,\n.open > .dropdown-toggle.btn-social-discord.focus {\n color: #fff;\n background-color: #1223e2;\n border-color: #0f1dbc;\n}\n.btn-social-discord.disabled:hover,\n.btn-social-discord[disabled]:hover,\nfieldset[disabled] .btn-social-discord:hover,\n.btn-social-discord.disabled:focus,\n.btn-social-discord[disabled]:focus,\nfieldset[disabled] .btn-social-discord:focus,\n.btn-social-discord.disabled.focus,\n.btn-social-discord[disabled].focus,\nfieldset[disabled] .btn-social-discord.focus {\n background-color: #5865f2;\n border-color: #5865f2;\n}\n.btn-social-discord .badge {\n color: #5865f2;\n background-color: #fff;\n}\n.btn-social-twitter {\n color: #fff;\n background-color: #000000;\n border-color: #000000;\n}\n.btn-social-twitter:focus,\n.btn-social-twitter.focus {\n color: #fff;\n background-color: #000000;\n border-color: #000000;\n}\n.btn-social-twitter:hover {\n color: #fff;\n background-color: #000000;\n border-color: #000000;\n}\n.btn-social-twitter:active,\n.btn-social-twitter.active,\n.open > .dropdown-toggle.btn-social-twitter {\n color: #fff;\n background-color: #000000;\n background-image: none;\n border-color: #000000;\n}\n.btn-social-twitter:active:hover,\n.btn-social-twitter.active:hover,\n.open > .dropdown-toggle.btn-social-twitter:hover,\n.btn-social-twitter:active:focus,\n.btn-social-twitter.active:focus,\n.open > .dropdown-toggle.btn-social-twitter:focus,\n.btn-social-twitter:active.focus,\n.btn-social-twitter.active.focus,\n.open > .dropdown-toggle.btn-social-twitter.focus {\n color: #fff;\n background-color: #000000;\n border-color: #000000;\n}\n.btn-social-twitter.disabled:hover,\n.btn-social-twitter[disabled]:hover,\nfieldset[disabled] .btn-social-twitter:hover,\n.btn-social-twitter.disabled:focus,\n.btn-social-twitter[disabled]:focus,\nfieldset[disabled] .btn-social-twitter:focus,\n.btn-social-twitter.disabled.focus,\n.btn-social-twitter[disabled].focus,\nfieldset[disabled] .btn-social-twitter.focus {\n background-color: #000000;\n border-color: #000000;\n}\n.btn-social-twitter .badge {\n color: #000000;\n background-color: #fff;\n}\n.dropdown-header {\n color: #172b4d;\n font-size: 18px;\n}\n.dropdown-subheader {\n padding: 6px 20px;\n width: 100%;\n color: #172b4d;\n font-size: 14px;\n font-weight: bold;\n}\n.dropdown-pills {\n display: flex;\n padding: 6px 10px;\n border-bottom: 1px solid #ebecf0;\n}\n.dropdown-pills .btn {\n display: block;\n width: 100%;\n margin: 0px 10px;\n}\n.dropdown-menu-list {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.dropdown-menu-item > a,\n.dropdown-menu-item > .btn-link,\n.dropdown-link > a,\n.dropdown-menu > li > a,\n.dropdown-menu > li > .btn-link,\n.modal-menu > li > a,\n.modal-menu > li > .btn-link {\n display: block;\n border: none;\n clear: both;\n float: none;\n padding: 6px 20px;\n width: 100%;\n color: #172b4d;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n white-space: nowrap;\n}\n.dropdown-menu-item > a:hover,\n.dropdown-menu-item > .btn-link:hover,\n.dropdown-link > a:hover,\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > .btn-link:hover,\n.modal-menu > li > a:hover,\n.modal-menu > li > .btn-link:hover,\n.dropdown-menu-item > a:focus,\n.dropdown-menu-item > .btn-link:focus,\n.dropdown-link > a:focus,\n.dropdown-menu > li > a:focus,\n.dropdown-menu > li > .btn-link:focus,\n.modal-menu > li > a:focus,\n.modal-menu > li > .btn-link:focus {\n background-color: #ebecf0;\n color: #172b4d;\n text-decoration: none;\n}\n.dropdown-menu-item > a:active,\n.dropdown-menu-item > .btn-link:active,\n.dropdown-link > a:active,\n.dropdown-menu > li > a:active,\n.dropdown-menu > li > .btn-link:active,\n.modal-menu > li > a:active,\n.modal-menu > li > .btn-link:active {\n background-color: #ebecf0;\n color: #172b4d;\n text-decoration: none;\n}\n.dropdown-menu-item > a:disabled,\n.dropdown-menu-item > .btn-link:disabled,\n.dropdown-link > a:disabled,\n.dropdown-menu > li > a:disabled,\n.dropdown-menu > li > .btn-link:disabled,\n.modal-menu > li > a:disabled,\n.modal-menu > li > .btn-link:disabled {\n color: rgba(23, 43, 77, 0.5);\n}\n.dropdown-menu-item > a .material-icon,\n.dropdown-menu-item > .btn-link .material-icon,\n.dropdown-link > a .material-icon,\n.dropdown-menu > li > a .material-icon,\n.dropdown-menu > li > .btn-link .material-icon,\n.modal-menu > li > a .material-icon,\n.modal-menu > li > .btn-link .material-icon {\n margin: -2px 0px;\n margin-right: 7px;\n position: relative;\n bottom: 1px;\n font-size: 18px;\n}\n.dropdown-menu-item > a .badge,\n.dropdown-menu-item > .btn-link .badge,\n.dropdown-link > a .badge,\n.dropdown-menu > li > a .badge,\n.dropdown-menu > li > .btn-link .badge,\n.modal-menu > li > a .badge,\n.modal-menu > li > .btn-link .badge {\n float: right;\n position: relative;\n top: 1px;\n background-color: #dc2626;\n border-radius: 4px;\n color: #fff;\n}\n.dropdown-menu > li .dropdown-category .material-icon {\n margin-right: 3px;\n color: #7a869a;\n font-size: 12px;\n line-height: 12px;\n}\n.dropdown-menu > li .dropdown-category-color .material-icon {\n color: var(--color);\n}\n.dropdown-menu > li .dropdown-subcategory {\n padding-left: 40px;\n}\n.modal-menu {\n margin: 20px 0px;\n padding: 0px;\n}\n.modal-menu > li {\n margin: 6.66666667px 0px;\n padding: 0px;\n list-style: none;\n}\n.dropdown-menu {\n min-width: 210px;\n}\n.dropdown-footer {\n padding: 6px 20px;\n margin-bottom: -5px;\n border-top: 1px solid #ebecf0;\n}\n.dropdown-menu-item + .dropdown-footer {\n margin-top: 9px;\n}\n.dropdown-menu .dropdown-buttons {\n padding: 2px 20px;\n padding-bottom: 7px;\n}\n.dropdown-menu .dropdown-buttons .btn {\n margin: 4px 0px;\n}\n@media screen and (min-width: 992px) {\n .category-picker .dropdown-menu {\n width: 300px;\n }\n}\n.category-picker .dropdown-menu > li > .btn-link {\n white-space: normal;\n overflow-wrap: break-word;\n}\n@media screen and (max-width: 767px) {\n .dropdown-menu.stick-to-bottom {\n border-radius: 0px;\n border: none;\n max-height: 400px;\n overflow-y: auto;\n -webkit-box-shadow: 0px 0px 30px #7a869a;\n box-shadow: 0px 0px 30px #7a869a;\n clear: both;\n top: auto;\n width: 100%;\n position: fixed;\n bottom: 0px;\n margin: 0px;\n padding: 0px;\n padding-bottom: 20px;\n }\n .dropdown-menu.stick-to-bottom li {\n float: none;\n margin: 0px;\n clear: both;\n }\n .dropdown-menu.stick-to-bottom li > a,\n .dropdown-menu.stick-to-bottom li > .btn {\n padding-top: 15px;\n padding-bottom: 15px;\n border-bottom: 1px solid #ebecf0;\n }\n}\n.noscript-collapsible > input {\n display: none;\n}\n.noscript-collapsible .btn {\n display: block;\n width: 100%;\n}\n.noscript-collapsible-items {\n display: none;\n}\ninput:checked + .noscript-collapsible-items {\n display: block;\n}\n.noscript-collapsible-items .btn {\n margin-top: 10px;\n}\n.overlay {\n background-color: #fff;\n display: none;\n}\nbody.has-overlay {\n position: fixed;\n overflow: hidden;\n}\n.overlay-open {\n display: flex;\n flex-direction: column;\n position: fixed;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n z-index: 1035;\n}\n.overlay-header {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 12px 12px;\n}\n.overlay-header-caption {\n margin-right: 12px;\n color: #172b4d;\n font-size: 18px;\n}\n.btn-overlay-close {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n width: 32px;\n height: 32px;\n margin-left: auto;\n}\n.btn-overlay-close .material-icon {\n margin: 0;\n font-size: 24px;\n line-height: 24px;\n}\n.btn-overlay-close,\n.btn-overlay-close:focus,\n.btn-overlay-close:hover {\n background-color: transparent;\n border-color: transparent;\n color: #172b4d;\n}\n.btn-overlay-close:active {\n background-color: #ebecf0;\n border-color: #ebecf0;\n box-shadow: none;\n color: #172b4d;\n}\n.overlay .dropdown-pills {\n padding: 12px 12px;\n padding-top: 0;\n}\n.overlay .dropdown-pills .btn:first-child {\n margin-left: 0;\n}\n.overlay .dropdown-pills .btn:last-child {\n margin-right: 0;\n}\n.overlay .dropdown-footer {\n margin: 0;\n}\n.overlay-menu-list {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.overlay-menu-list .dropdown-header,\n.overlay-menu-list .dropdown-subheader,\n.overlay-menu-list .dropdown-menu-item > a,\n.overlay-menu-list .dropdown-menu-item > button {\n padding: 6px 12px;\n}\n.overlay-menu-list .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #ebecf0;\n}\n.dropdown-menu .list-group,\n.overlay .list-group {\n margin: 0;\n}\n.dropdown-menu .list-group,\n.overlay .list-group,\n.dropdown-menu .list-group-item,\n.overlay .list-group-item {\n border-radius: 0;\n border-left: 0;\n border-right: 0;\n}\n.dropdown-menu .list-group-item:first-child,\n.overlay .list-group-item:first-child {\n border-top: none;\n}\n.dropdown-menu .list-group-item:last-child,\n.overlay .list-group-item:last-child {\n border-bottom: none;\n}\n.dropdown-menu .list-group-item {\n padding: 10px 20px;\n}\n.list-group-loading {\n padding: 40px 20px;\n}\n.list-group-loading-message {\n font-size: 18px;\n text-align: center;\n}\n.list-group-loading-progress {\n max-width: 300px;\n margin: auto;\n background-color: #ebecf0;\n border-radius: 3px;\n overflow: hidden;\n}\n.list-group-loading-progress-bar {\n width: 100%;\n height: 8px;\n background-color: #7a869a;\n animation: infiniteProgress 1s infinite linear;\n transform-origin: 0% 50%;\n}\n@keyframes infiniteProgress {\n 0% {\n transform: translateX(0) scaleX(0);\n }\n 40% {\n transform: translateX(0) scaleX(0.4);\n }\n 100% {\n transform: translateX(100%) scaleX(0.5);\n }\n}\n.dropdown-menu .list-group-loading,\n.overlay .list-group-lading {\n padding: 20px 40px;\n}\n.list-group-error,\n.list-group-empty,\n.list-group-message {\n padding: 20px;\n color: #172b4d;\n}\n.list-group-error-icon,\n.list-group-empty-icon,\n.list-group-message-icon {\n margin-bottom: 20px;\n color: #7a869a;\n font-size: 64px;\n line-height: 64px;\n text-align: center;\n}\n.list-group-error-message,\n.list-group-empty-message,\n.list-group-message-message {\n margin: 0;\n font-size: 18px;\n text-align: center;\n}\n.list-group-error-detail,\n.list-group-message-detail {\n margin-top: 10px;\n color: #5e6c84;\n font-size: 18px;\n text-align: center;\n}\n.category-label {\n border-radius: 0.25em;\n padding: 0.2em 0.6em 0.3em;\n}\n.category-label-color,\n.category-label-color:link,\n.category-label-color:focus,\n.category-label-color:active,\n.category-label-color:visited,\n.category-label-color:hover {\n color: #fff;\n}\n.category-label-no-color,\n.category-label-no-color:link,\n.category-label-no-color:focus,\n.category-label-no-color:active,\n.category-label-no-color:visited,\n.category-label-no-color:hover {\n background-color: #ebecf0;\n color: #344563;\n}\n.thread-flags {\n display: flex;\n align-items: center;\n opacity: 0.8;\n margin: 0;\n padding: 0;\n}\n.thread-flags li {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 3px;\n list-style-type: none;\n cursor: default;\n}\n.thread-flags li + li {\n margin-left: 7.5px;\n}\n.thread-flags .material-icon {\n font-size: 16px;\n line-height: 16px;\n}\n.thread-flag-pinned-globally {\n color: #2563eb;\n background: #dbeafe;\n}\n.thread-flag-pinned-locally {\n color: #3b82f6;\n background: #dbeafe;\n}\n.thread-flag-pinned-locally-elsewhere {\n color: #64748b;\n background: #e2e8f0;\n}\n.thread-flag-answered {\n color: #4d7c0f;\n background: #d9f99d;\n}\n.thread-flag-poll {\n color: #c026d3;\n background: #f5d0fe;\n}\n.thread-flag-unapproved {\n color: #ffffff;\n background: #ef4444;\n}\n.thread-flag-closed {\n color: #dc2626;\n background: #fecaca;\n}\n.thread-flag-hidden {\n color: #ffffff;\n background: #64748b;\n}\n.threads-replies {\n display: flex;\n align-items: center;\n color: #5e6c84;\n font-size: 16px;\n font-weight: bold;\n}\n.threads-replies .material-icon {\n font-size: 16px;\n margin-right: 7.5px;\n transform: matrix(-1, 0, 0, 1, 0, 0);\n}\n@media screen and (max-width: 767px) {\n .threads-replies {\n font-size: 13px;\n }\n .threads-replies .material-icon {\n font-size: 12px;\n margin-right: 4px;\n }\n}\n.thread-user-card {\n display: flex;\n align-items: center;\n}\n.thread-user-card-media {\n flex: 0;\n margin-right: 15px;\n}\n.thread-user-card-media img {\n border-radius: 3px;\n}\n.thread-user-card-body {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.thread-paginator {\n display: flex;\n align-items: center;\n}\n.thread-paginator .btn + .btn {\n margin-left: 6px;\n}\n.thread-paginator .dropdown {\n margin: 0 6px;\n}\n.thread-paginator .dropdown-menu {\n padding: 4px;\n min-width: 150px;\n}\n.thread-paginator .form-control {\n margin-right: 6px;\n font-size: 16px;\n}\n.thread-paginator-form {\n display: flex;\n}\n@media screen and (max-width: 767px) {\n .toolbar-item .thread-paginator {\n width: 100%;\n }\n .toolbar-item .thread-paginator .dropdown {\n width: 100%;\n min-width: 0;\n }\n .toolbar-item .thread-paginator .btn-block {\n min-width: 0;\n padding-left: 0;\n padding-right: 0;\n text-align: center;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n}\n.search-dropdown {\n width: 450px;\n padding: 0;\n overflow: hidden;\n}\n.search-dropdown .search-input {\n padding: 6px 20px;\n border-bottom: 1px solid #ebecf0;\n}\n.search-dropdown .list-group {\n max-height: calc(100vh - 80px - 46px);\n overflow-y: auto;\n}\n.search-overlay-body {\n display: flex;\n flex-direction: column;\n flex: 1;\n}\n.search-overlay-body .search-input {\n padding: 6px 12px;\n border-bottom: 1px solid #ebecf0;\n}\n.search-dropdown .form-control-search,\n.search-overlay-body .form-control-search {\n font-size: 16px;\n}\n.search-overlay-body .search-results-container {\n flex: 1;\n overflow-y: auto;\n width: 100%;\n position: relative;\n}\n.search-overlay-body .search-results-list {\n position: absolute;\n width: 100%;\n min-height: 100%;\n}\n.search-result a {\n display: flex;\n align-items: center;\n width: 100%;\n}\n.search-result a:hover {\n cursor: pointer;\n text-decoration: none;\n}\n.search-result a img {\n border-radius: 3px;\n margin-right: 12px;\n}\n.search-result-card {\n width: 100%;\n}\n.search-result-name {\n color: #172b4d;\n font-weight: bold;\n overflow-wrap: anywhere;\n}\n.search-result-summary {\n max-height: 72px;\n overflow: hidden;\n overflow-wrap: anywhere;\n color: #7a869a;\n font-size: 12px;\n}\n.search-result-details {\n margin: 0;\n padding: 0;\n color: #7a869a;\n font-size: 12px;\n}\n.search-result-details li {\n display: inline-block;\n list-style: none;\n margin-right: 12px;\n}\n.page-header {\n margin: 0;\n margin-top: 10px;\n}\n.page-header-banner-bg-overlay {\n padding: 20px 0;\n}\n.page-header h1 {\n margin: 0;\n overflow-wrap: anywhere;\n}\n.page-container {\n padding-top: 20px;\n}\n@media screen and (max-width: 991px) {\n .panel-message-body {\n text-align: center;\n }\n .panel-message-body .message-icon {\n margin: 30px;\n }\n .panel-message-body .message-icon .material-icon {\n font-size: 160px;\n }\n}\n@media screen and (min-width: 992px) {\n .panel-message-body {\n padding: 20px;\n padding-bottom: 30px;\n }\n .panel-message-body .message-icon {\n float: left;\n }\n .panel-message-body .message-icon .material-icon {\n font-size: 50px;\n }\n .panel-message-body .message-body {\n margin-left: 65px;\n margin-top: 10px;\n }\n .panel-message-body .message-body .lead {\n margin-bottom: 0px;\n }\n .panel-message-body .message-body .help-block {\n margin-top: 13.2px;\n }\n}\n.panel-body-loading {\n padding: 0px;\n text-align: center;\n}\n.panel-footer-sticky {\n position: sticky;\n bottom: 0;\n}\n.misago-footer {\n margin-top: 30px;\n margin-bottom: 50px;\n}\n.misago-footer .footer-content {\n border-top: 1px solid #ebecf0;\n padding-top: 30px;\n}\n.misago-footer .noscript-message .material-icon {\n position: relative;\n bottom: 1px;\n font-size: 18px;\n}\n@keyframes fixed-moderation-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.fixed-moderation {\n display: none;\n width: 100%;\n position: fixed;\n bottom: 20px;\n opacity: 0;\n pointer-events: none;\n}\n.fixed-moderation.visible {\n display: block;\n opacity: 1;\n animation-name: fixed-moderation-fade-in;\n animation-duration: 300ms;\n}\n.fixed-moderation .container {\n display: flex;\n flex-direction: row;\n justify-content: end;\n pointer-events: none;\n}\n.fixed-moderation .dropup {\n pointer-events: all;\n}\n@media screen and (max-width: 767px) {\n .fixed-moderation .container {\n display: block;\n }\n .fixed-moderation .dropdown-menu {\n width: 100%;\n }\n .btn-moderation {\n display: block;\n width: 100%;\n }\n}\n.ui-preview {\n color: #ebecf0;\n -webkit-animation: ui-preview-animation 1s linear infinite;\n -o-animation: ui-preview-animation 1s linear infinite;\n animation: ui-preview-animation 1s linear infinite;\n}\n@keyframes ui-preview-animation {\n 0% {\n filter: alpha(opacity=100);\n opacity: 1;\n }\n 50% {\n filter: alpha(opacity=10);\n opacity: 0.1;\n }\n 100% {\n filter: alpha(opacity=100);\n opacity: 1;\n }\n}\n.ui-preview-text {\n background: #ebecf0;\n border-radius: 100px;\n display: inline-block;\n height: 14px;\n position: relative;\n top: 3px;\n}\n.ui-preview-paragraph .ui-preview-text {\n margin-right: 6px;\n}\n.ui-preview-paragraph .ui-preview-text:last-child {\n margin-right: 0px;\n}\n.ui-preview-img {\n background: #ebecf0;\n border-radius: 5px;\n}\n.ui-preview input:disabled,\n.ui-preview textarea:disabled {\n background-color: #fff;\n}\n.pager-undercontent {\n margin-top: -20px;\n}\n.pager-more {\n text-align: center;\n}\n@media screen and (min-width: 992px) {\n .pager-more .btn {\n padding-left: 20px;\n padding-right: 20px;\n }\n}\n.misago-pagination {\n display: flex;\n}\n.misago-pagination .btn {\n display: block;\n width: 100%;\n}\n.misago-pagination .btn + .btn {\n margin-left: 15px;\n}\n@media screen and (max-width: 767px) {\n .toolbar-item .misago-pagination {\n width: 100%;\n }\n}\n.panel-poll h2 {\n margin-top: 0px;\n}\n.poll-select-choice .btn,\n.poll-select-choice .btn:active,\n.poll-select-choice .btn:focus,\n.poll-select-choice .btn:hover {\n background: transparent;\n border: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n margin: 6px 0px;\n padding: 0px;\n padding-left: 6px;\n outline: none;\n text-align: left;\n}\n.poll-select-choice .btn .material-icon {\n margin-right: 6px;\n height: 28px;\n width: 28px;\n font-size: 28px;\n line-heigh: 28px;\n color: #ced0da;\n}\n.poll-select-choice .btn.btn-selected .material-icon {\n color: #2563eb;\n}\n.poll-help {\n font-size: 12px;\n}\n.poll-chart-selected .material-icon {\n margin-right: 4px;\n position: relative;\n bottom: 1px;\n height: 14px;\n width: 14px;\n color: #36b37e;\n font-size: 14px;\n line-heigh: 14px;\n}\n.poll-options {\n margin-bottom: 0px;\n}\n@media screen and (max-width: 767px) {\n .poll-options {\n margin-top: -6px;\n }\n .poll-options .btn {\n margin: 6px 0px;\n }\n}\n.user-status.user-banned .status-icon {\n color: #ff5630;\n}\n.user-status.user-online .status-icon {\n color: #36b37e;\n}\n.user-status.user-offline .status-icon {\n color: #7a869a;\n}\n@media screen and (min-width: 768px) {\n .user-card {\n text-align: center;\n }\n}\n.user-card-small-avatar img {\n width: 100%;\n height: auto;\n}\n@media screen and (min-width: 768px) {\n .user-card-small-avatar {\n display: none;\n }\n}\n@media screen and (max-width: 767px) {\n .user-card-avatar {\n display: none;\n }\n}\n.toolbar {\n display: block;\n margin: 0 -8px;\n}\n.toolbar-over-footer {\n margin-bottom: -50px;\n}\n.toolbar-section {\n justify-items: center;\n display: flex;\n flex: 1;\n margin-bottom: 20px;\n}\n.toolbar-item {\n flex: 1;\n padding: 0 7px;\n}\n.toolbar-item h3,\n.toolbar-item p {\n margin: 0;\n}\n.toolbar-item-shrink {\n flex: 0 !important;\n min-width: auto;\n}\n.toolbar-spacer {\n display: none;\n}\n@media screen and (min-width: 768px) {\n .toolbar {\n display: flex;\n }\n .toolbar-section,\n .toolbar-item {\n flex: 0;\n align-items: center;\n }\n .toolbar-section.toolbar-section-auto,\n .toolbar-section.toolbar-section-auto .toolbar-item {\n flex: 1;\n }\n .toolbar-spacer {\n display: block;\n flex: 1;\n }\n .toolbar-item .form-search {\n width: 250px;\n }\n}\n@media screen and (max-width: 767px) {\n .toolbar {\n display: flex;\n flex-direction: column;\n }\n .toolbar-item {\n min-width: 0;\n }\n .toolbar-item-shrink {\n min-width: auto;\n }\n .toolbar-item p {\n text-align: center;\n }\n}\nabbr {\n border: none !important;\n}\n.item-title {\n color: #172b4d;\n font-weight: bold;\n text-decoration: none;\n}\na.item-title:link,\na.item-title:active,\na.item-title:visited,\na.item-title:hover {\n color: #172b4d;\n font-weight: bold;\n}\na.item-title:hover {\n text-decoration: underline;\n}\n.message-line {\n text-align: center;\n}\n.message-line .material-icon {\n margin-right: 6.66666667px;\n font-size: 20px;\n line-height: 20px;\n height: 20px;\n width: 20px;\n}\n.text-ellipsis {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.misago-markup,\n.misago-markup blockquote {\n font-size: 16px;\n}\n.misago-markup h1,\n.misago-markup h2,\n.misago-markup h3,\n.misago-markup h4,\n.misago-markup h5,\n.misago-markup h6,\n.misago-markup p {\n overflow-wrap: anywhere;\n}\n.misago-markup h1,\n.misago-markup h2,\n.misago-markup h3,\n.misago-markup h4,\n.misago-markup h5,\n.misago-markup h6 {\n margin-top: 40px;\n}\n.misago-markup > *,\n.misago-markup blockquote > * {\n margin: 20px 0px;\n}\n.misago-markup > *:first-child,\n.misago-markup blockquote > *:first-child {\n margin-top: 0px;\n}\n.misago-markup > *:last-child,\n.misago-markup blockquote > *:last-child {\n margin-bottom: 0px;\n}\n.misago-markup img {\n max-width: 100%;\n max-height: 500px;\n}\n.misago-markup .quote-block,\n.misago-markup blockquote {\n background-color: #f0f9ff;\n border-left: 3px solid #0ea5e9;\n border-radius: 3px;\n overflow: hidden;\n color: #0c4a6e;\n}\n.misago-markup .quote-heading {\n padding: 10px 16px;\n font-size: 14px;\n font-weight: bold;\n}\n.misago-markup .quote-body {\n border: none;\n border-radius: 0;\n}\n.misago-markup blockquote {\n padding: 10px 16px;\n}\n.misago-markup blockquote:last-child {\n margin-bottom: 0;\n}\n.misago-markup .quote-body > blockquote,\n.misago-markup .quote-body > .quote-block,\n.misago-markup blockquote > blockquote,\n.misago-markup blockquote > .quote-block {\n border: 1px solid #0ea5e9;\n border-left: 3px solid #0ea5e9;\n}\n.misago-markup .spoiler-block {\n position: relative;\n background: repeating-linear-gradient(45deg, rgba(235, 236, 240, 0.5), rgba(235, 236, 240, 0.5) 10px, #fff 10px, #fff 20px);\n border: 3px solid #ebecf0;\n border-radius: 4px;\n font-size: 14px;\n}\n.misago-markup .spoiler-body {\n background: #fff;\n border-width: 0;\n margin: 0px;\n padding: 20px;\n}\n.misago-markup .spoiler-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #fff;\n}\n.misago-markup .spoiler-block.revealed .spoiler-overlay {\n display: none;\n}\n.misago-markup ul {\n list-style-type: square;\n}\n.misago-markup ul li {\n list-style-type: square;\n}\n.misago-markup ol {\n list-style-type: decimal;\n}\n.misago-markup ol li {\n list-style-type: decimal;\n}\n.misago-markup pre {\n background: #eee;\n border: none;\n padding: 10px;\n overflow: hidden;\n color: #000;\n}\n.misago-markup pre code.hljs {\n margin: -10px;\n padding: 9.5px;\n}\n.misago-markup-example {\n display: flex;\n align-items: center;\n}\n.formatting-help {\n padding-bottom: 0;\n}\n.formatting-help > h4 {\n margin-bottom: 20px;\n}\n.formatting-help-item,\n.formatting-help-item pre {\n margin-bottom: 20px;\n}\n@media screen and (min-width: 992px) {\n .formatting-help-item {\n display: flex;\n align-items: center;\n }\n .formatting-help-item-markup,\n .formatting-help-item-preview {\n width: 50%;\n }\n .formatting-help-item-markup {\n padding-right: 15px;\n }\n .formatting-help-item-markup pre {\n margin: 0;\n }\n .formatting-help-item-preview {\n padding-left: 15px;\n }\n}\n.scroll-target {\n width: 1px;\n position: relative;\n bottom: 80px;\n}\n.site-nav-dropdown {\n max-height: calc(100vh - 80px);\n overflow-y: auto;\n width: 320px;\n}\n.site-nav-category-header a {\n color: #7a869a;\n font-weight: bold;\n}\n.site-nav-category-header a,\n.site-nav-category a {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n}\n.site-nav-category-header a span,\n.site-nav-category a span {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.site-nav-category + .site-nav-category-header {\n margin-top: 10px;\n}\n.site-nav-category-last {\n margin-bottom: 10px;\n}\n.site-nav-category-last + .site-nav-category-header {\n margin-top: 0;\n}\n@media screen and (min-width: 768px) {\n .site-nav-sign-in-message,\n .site-nav-sign-in-options {\n display: none;\n }\n}\n.site-nav-menu.overlay-menu-list {\n height: 100%;\n overflow-y: auto;\n padding-bottom: 20px;\n}\n.user-nav-menu {\n min-width: 300px;\n}\n.user-nav-profile strong {\n display: block;\n font-size: 18px;\n}\n.user-nav-dropdown {\n max-height: calc(100vh - 80px);\n overflow-y: auto;\n}\n.user-nav-menu.overlay-menu-list {\n height: 100%;\n overflow-y: auto;\n padding-bottom: 20px;\n}\n.modal-change-avatar .modal-avatar-index .avatar-preview {\n border-radius: 6px;\n margin: 0px auto;\n overflow: hidden;\n position: relative;\n width: 200px;\n height: 200px;\n}\n.modal-change-avatar .modal-avatar-index .avatar-preview .loader {\n display: none;\n position: absolute;\n top: 50px;\n height: 100px;\n}\n.modal-change-avatar .modal-avatar-index .avatar-preview .loader .loader-spinning-wheel {\n border-width: 10px;\n border-color: #fff;\n border-left-color: transparent;\n border-right-color: transparent;\n width: 100px;\n height: 100px;\n}\n.modal-change-avatar .modal-avatar-index .avatar-preview.preview-loading img {\n filter: alpha(opacity=33);\n opacity: 0.33;\n}\n.modal-change-avatar .modal-avatar-index .avatar-preview.preview-loading .loader {\n display: block;\n}\n@media (max-width: 699px) {\n .modal-change-avatar .modal-avatar-index .avatar-preview {\n margin-bottom: 20px;\n width: 150px;\n height: 150px;\n }\n .modal-change-avatar .modal-avatar-index .avatar-preview img {\n width: 150px;\n height: 150px;\n }\n .modal-change-avatar .modal-avatar-index .avatar-preview .loader {\n top: 25px;\n height: 100px;\n }\n .modal-change-avatar .modal-avatar-index .avatar-preview .loader .loader-spinning-wheel {\n width: 100px;\n height: 100px;\n }\n}\n.modal-change-avatar .modal-avatar-index .btn {\n text-align: left;\n}\n.modal-change-avatar .modal-avatar-upload {\n text-align: center;\n}\n.modal-change-avatar .modal-avatar-upload .btn-pick-file {\n background: transparent;\n border: 2px solid #ebecf0;\n border-radius: 6px;\n padding: 10px 24px;\n -webkit-box-shadow: none;\n box-shadow: none;\n color: #7a869a;\n font-size: 18px;\n text-align: center;\n}\n.modal-change-avatar .modal-avatar-upload .btn-pick-file > .material-icon {\n display: block;\n margin: 0px auto;\n margin-bottom: 13.2px;\n font-size: 50px;\n width: 50px;\n height: 50px;\n}\n.modal-change-avatar .modal-avatar-upload .btn-pick-file:hover,\n.modal-change-avatar .modal-avatar-upload .btn-pick-file:active {\n border-color: #2563eb;\n color: #2563eb;\n}\n.modal-change-avatar .modal-avatar-upload .text-muted {\n margin-top: 13.2px;\n}\n.modal-change-avatar .modal-avatar-upload .upload-progress img {\n border-radius: 4px;\n margin-bottom: 20px;\n max-height: 80px;\n width: auto;\n}\n.modal-change-avatar .modal-avatar-upload .upload-progress .progress {\n width: 70%;\n margin: 0px auto;\n}\n.modal-avatar-crop .crop-form {\n margin: 0px auto;\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input {\n margin-top: 10px;\n -webkit-appearance: none;\n border: 1px solid white;\n width: 100%;\n /*hide the outline behind the border*/\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input::-webkit-slider-runnable-track {\n width: 100%;\n height: 8px;\n background: #ebecf0;\n border: none;\n border-radius: 3px;\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input::-webkit-slider-thumb {\n -webkit-appearance: none;\n border: none;\n height: 20px;\n width: 20px;\n border-radius: 50%;\n background: #7a869a;\n margin-top: -6px;\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input:focus {\n outline: none;\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input:focus::-webkit-slider-runnable-track {\n background: #ebecf0;\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input::-moz-range-track {\n width: 100%;\n height: 8px;\n background: #ebecf0;\n border: none;\n border-radius: 4px;\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input::-moz-range-thumb {\n border: none;\n height: 20px;\n width: 20px;\n border-radius: 50%;\n background: #7a869a;\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input:-moz-focusring {\n outline: 1px solid white;\n outline-offset: -1px;\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input::-ms-track {\n width: 100%;\n height: 8px;\n /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */\n background: transparent;\n /*leave room for the larger thumb to overflow with a transparent border */\n border-color: transparent;\n border-width: 8px 0;\n /*remove default tick marks*/\n color: transparent;\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input::-ms-fill-lower {\n background: #ebecf0;\n border-radius: 16px;\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input::-ms-fill-upper {\n background: #ebecf0;\n border-radius: 16px;\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input::-ms-thumb {\n border: none;\n height: 20px;\n width: 20px;\n border-radius: 50%;\n background: #7a869a;\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input:focus::-ms-fill-lower {\n background: #ebecf0;\n}\n.modal-avatar-crop .crop-form .cropit-image-zoom-input:focus::-ms-fill-upper {\n background: #ebecf0;\n}\n.modal-change-avatar .modal-avatar-gallery {\n padding-bottom: 0px;\n}\n.modal-change-avatar .modal-avatar-gallery .avatars-gallery {\n margin-bottom: 20px;\n}\n.modal-change-avatar .modal-avatar-gallery .avatars-gallery h3 {\n margin-top: 0px;\n}\n.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .row {\n margin-bottom: 10px;\n}\n.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn {\n border-radius: 6px;\n border: 2px solid #ebecf0;\n background: none;\n padding: 2px;\n position: relative;\n}\n.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn:hover,\n.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn:focus {\n border-color: #7a869a;\n}\n.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn.avatar-selected,\n.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn:active {\n border-color: #0065ff;\n}\n.modal-change-avatar .modal-avatar-gallery .avatars-gallery-images .btn img {\n border-radius: 4px;\n width: 100%;\n height: auto;\n}\n.list-group-category-vanilla {\n background-color: transparent;\n color: #5e6c84;\n}\n.list-group-category-vanilla .item-title,\n.list-group-category-vanilla .item-title:link,\n.list-group-category-vanilla .item-title:active,\n.list-group-category-vanilla .item-title:visited,\n.list-group-category-vanilla .item-title:hover,\n.list-group-category-vanilla .item-title:focus {\n color: #344563;\n font-weight: 500;\n}\n.list-group-category-vanilla .list-group-item-heading:last-child {\n margin: 0;\n}\n.list-group-category-vanilla .category-description *:last-child {\n margin-bottom: 0;\n}\n.list-group-category-item {\n display: flex;\n padding-left: 0;\n}\n.list-group-category-item-read-status-col {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 56px;\n text-align: center;\n}\n.list-group-category-item-rest-col {\n display: flex;\n align-items: center;\n width: 100%;\n}\n.list-group-category-item-main-col {\n flex: 1;\n padding-right: 15px;\n}\n.list-group-category-item-stats-col {\n flex-shrink: 0;\n width: 150px;\n}\n.list-group-category-item-last-thread-col {\n display: flex;\n align-items: center;\n width: 290px;\n}\n.list-group-category-item-read-status-col .material-icon {\n font-size: 24px;\n line-height: 24px;\n}\n.list-group-category-item-read-status-col .item-read {\n color: #dfe1e6;\n}\n.list-group-category-item-read-status-col .item-new {\n color: #2563eb;\n}\n.list-group-category-item-name,\n.list-group-category-item-name:link,\n.list-group-category-item-name:visited {\n color: #172b4d;\n font-size: 18px;\n font-weight: 500;\n}\n.list-group-category-item-description {\n margin-top: 3px;\n color: #5e6c84;\n}\n.list-group-category-item-description *:last-child {\n margin-bottom: 0;\n}\n.list-group-category-item-children {\n margin: -6px;\n margin-top: 0;\n padding: 0;\n list-style: none;\n}\n.list-group-category-item-children-item {\n padding: 6px;\n display: inline-block;\n}\n.list-group-category-child-children-item-name {\n display: flex;\n align-items: center;\n}\n.list-group-category-child-children-item-name,\n.list-group-category-child-children-item-name:link,\n.list-group-category-child-children-item-name:active,\n.list-group-category-child-children-item-name:visited {\n color: #5e6c84;\n}\n.list-group-category-child-children-item-name:active,\n.list-group-category-child-children-item-name:hover,\n.list-group-category-child-children-item-name:focus {\n color: #172b4d;\n}\n.list-group-category-child-children-item-status-new,\n.list-group-category-child-children-item-status-read {\n display: inline-block;\n margin-right: 6px;\n border-radius: 2px;\n height: 8px;\n width: 8px;\n}\n.list-group-category-child-children-item-status-new {\n background-color: #2563eb;\n}\n.list-group-category-child-children-item-status-read {\n background-color: #dfe1e6;\n}\n.list-group-category-item-stats-col {\n padding-right: 15px;\n color: #5e6c84;\n}\n.list-group-category-item-stats-col .category-stat-value {\n color: #172b4d;\n font-weight: bold;\n}\n.list-group-category-item-last-poster-avatar-col {\n padding-right: 15px;\n}\n.list-group-category-item-last-poster-avatar {\n line-height: 0;\n}\n.list-group-category-item-last-poster-avatar img {\n border-radius: 4px;\n}\n.list-group-category-item-last-thread-details-col {\n flex: 1;\n min-width: 0;\n color: #5e6c84;\n}\n.list-group-category-item-last-thread-title,\n.list-group-category-item-last-thread-title-muted {\n display: block;\n font-weight: bold;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.list-group-category-item-last-thread-title,\n.list-group-category-item-last-thread-title:link,\n.list-group-category-item-last-thread-title:active,\n.list-group-category-item-last-thread-title:visited,\n.list-group-category-item-last-thread-title:hover,\n.list-group-category-item-last-thread-title:focus {\n color: #172b4d;\n}\n.list-group-category-item-last-thread-title-muted {\n color: #5e6c84;\n}\n.list-group-category-item-last-poster,\n.list-group-category-item-last-separator,\n.list-group-category-item-last-posted-on {\n display: inline-block;\n}\n.list-group-category-item-last-poster,\n.list-group-category-item-last-poster:link,\n.list-group-category-item-last-poster:active,\n.list-group-category-item-last-poster:visited,\n.list-group-category-item-last-poster:hover,\n.list-group-category-item-last-poster:focus {\n color: #172b4d;\n}\n.list-group-category-item-last-separator {\n margin: 0 2px;\n}\n.list-group-category-item-last-posted-on,\n.list-group-category-item-last-posted-on-short,\n.list-group-category-item-last-posted-on:link,\n.list-group-category-item-last-posted-on-short:link,\n.list-group-category-item-last-posted-on:active,\n.list-group-category-item-last-posted-on-short:active,\n.list-group-category-item-last-posted-on:visited,\n.list-group-category-item-last-posted-on-short:visited,\n.list-group-category-item-last-posted-on:hover,\n.list-group-category-item-last-posted-on-short:hover,\n.list-group-category-item-last-posted-on:focus,\n.list-group-category-item-last-posted-on-short:focus {\n color: #5e6c84;\n}\n.list-group-category-item-last-posted-on-short {\n display: none;\n}\n.list-group-category-item-last-thread-text {\n display: flex;\n align-items: center;\n color: #5e6c84;\n}\n.list-group-category-item-last-thread-text-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 32px;\n width: 32px;\n margin-right: 15px;\n color: #7a869a;\n}\n.list-group-category-item-last-thread-text-icon .material-icon {\n font-size: 24px;\n line-height: 24px;\n}\n@media screen and (max-width: 991px) {\n .list-group-category-item-rest-col {\n flex-direction: column;\n align-items: start;\n }\n .list-group-category-item-stats-col,\n .list-group-category-item-last-poster-avatar-col,\n .list-group-category-item-last-poster,\n .list-group-category-item-last-separator,\n .list-group-category-item-last-posted-on {\n display: none;\n }\n .list-group-category-item-last-thread-col {\n display: flex;\n margin-top: 10px;\n padding-right: 15px;\n }\n .list-group-category-item-last-thread-details-col {\n display: flex;\n align-items: center;\n width: auto;\n }\n .list-group-category-item-last-thread-title,\n .list-group-category-item-last-thread-title-muted {\n display: block;\n font-weight: normal;\n }\n .list-group-category-item-last-posted-on-short {\n flex-shrink: 1;\n display: block;\n white-space: nowrap;\n padding-left: 7px;\n }\n .list-group-category-item-last-thread-text-icon {\n display: none;\n }\n}\n.participant-card .btn-user,\n.participant-card .dropdown.open .btn-user {\n margin-bottom: 20px;\n}\n.participant-card .btn-user,\n.participant-card .dropdown.open .btn-user,\n.participant-card .btn-user:hover,\n.participant-card .dropdown.open .btn-user:hover,\n.participant-card .btn-user:focus,\n.participant-card .dropdown.open .btn-user:focus,\n.participant-card .btn-user:focus:active,\n.participant-card .dropdown.open .btn-user:focus:active {\n padding: 0px;\n overflow: hidden;\n text-align: left;\n}\n.participant-card .btn-user img,\n.participant-card .dropdown.open .btn-user img {\n background-color: #fff;\n width: 34px;\n height: 34px;\n margin-right: 8px;\n}\n.panel-participants p {\n margin: 0px;\n margin-top: 7px;\n}\n.markup-editor {\n overflow: hidden;\n background: #fff;\n border: 2px solid #ced0da;\n border-radius: 4px;\n}\n.markup-editor.markup-editor-focused {\n border: 2px solid #2563eb;\n}\n.markup-editor-toolbar {\n position: relative;\n padding: 7px;\n background: #fff;\n border-bottom: 1px solid #ebecf0;\n}\n.markup-editor-toolbar-left {\n display: flex;\n flex-shrink: 0;\n overflow-x: hidden;\n}\n.markup-editor-toolbar-right {\n flex-shrink: 0;\n padding: 7px;\n padding-right: 0;\n margin-right: 10px;\n position: absolute;\n top: 0;\n right: 0;\n display: flex;\n background: #fff;\n}\n.btn-markup-editor {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n height: 34px;\n width: 34px;\n padding: 0;\n font-size: 24px;\n line-height: 24px;\n}\n.btn-markup-editor,\n.btn-markup-editor:hover {\n background-color: transparent;\n border-color: transparent;\n color: #172b4d;\n}\n.btn-markup-editor:active {\n background-color: #ebecf0;\n border-color: #ebecf0;\n color: #172b4d;\n}\n.btn-markup-editor .material-icon {\n margin: 0;\n bottom: 0;\n}\n.markup-editor-controls-dropdown {\n margin-right: 10px;\n}\n.markup-editor-footer {\n display: flex;\n padding: 15px;\n background: #fff;\n border-top: 1px solid #ebecf0;\n}\n.markup-editor-spacer {\n flex: 1;\n}\n.markup-editor-toolbar .btn + .btn,\n.markup-editor-footer .btn + .btn {\n margin-left: 10px;\n}\n.markup-editor-textarea.form-control {\n height: 200px;\n padding: 15px;\n resize: none;\n border: 0;\n border-radius: 0;\n font-size: 16px;\n}\n.markup-editor-textarea.form-control,\n.markup-editor-textarea.form-control:focus {\n box-shadow: none;\n}\n.markup-editor-preview {\n position: relative;\n height: 200px;\n overflow-y: auto;\n}\n.markup-editor-preview-contents {\n position: absolute;\n padding: 15px;\n}\n.markup-editor-preview-loading {\n padding: 15px;\n}\n.markup-editor-attachments {\n max-height: 170px;\n overflow-y: auto;\n}\n.markup-editor-attachments-container {\n padding: 7px;\n overflow: auto;\n}\n.markup-editor-attachments-item {\n padding: 7px;\n}\n.markup-editor-attachment {\n display: flex;\n align-items: center;\n padding: 7px;\n border: 1px solid #ebecf0;\n border-radius: 3px;\n}\n.markup-editor-attachment-details {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.markup-editor-attachment-details strong {\n display: block;\n}\n.markup-editor-attachment-details .list-unstyled {\n margin-bottom: 0;\n}\n.btn-markup-editor-attachment {\n margin-left: 7px;\n}\n@media screen and (min-width: 768px) {\n .markup-editor-attachments-item {\n width: 50%;\n float: left;\n }\n}\n@media screen and (min-width: 992px) {\n .markup-editor-attachments-item {\n width: 25%;\n }\n}\n.markup-editor-attachment-modal-preview {\n margin: 20px 0 40px 0;\n text-align: center;\n}\n.markup-editor-attachment-modal-preview a {\n display: inline-block;\n padding: 12px;\n background: #fff;\n border: 1px solid #ebecf0;\n}\n.markup-editor-attachment-modal-preview img {\n max-width: 100%;\n max-height: 50vh;\n}\n.markup-editor-attachment-modal-filename {\n font-size: 28px;\n font-weight: bold;\n margin-bottom: 20px;\n}\n.markup-editor-attachment-modal-details {\n margin-bottom: 20px;\n}\n.posting-fullscreen .markup-editor {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n.posting-fullscreen .markup-editor .markup-editor-textarea,\n.posting-fullscreen .markup-editor .markup-editor-preview {\n flex: 1;\n height: auto;\n}\n@media screen and (max-width: 991px) {\n body.posting-default .markup-editor {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n body.posting-default .markup-editor .markup-editor-textarea,\n body.posting-default .markup-editor .markup-editor-preview {\n flex: 1;\n height: 100%;\n }\n}\n@media screen and (max-width: 767px) {\n .markup-editor-attachments {\n max-height: 120px;\n }\n .markup-editor-footer .btn-auto {\n flex: 1;\n }\n .markup-editor-footer .btn-icon {\n margin-right: 10px;\n }\n .markup-editor-spacer {\n display: none;\n }\n}\n@media screen and (min-width: 992px) {\n .markup-editor-controls-dropdown {\n display: none;\n }\n}\n.poll-form {\n margin-bottom: 20px;\n}\n.poll-choices-control .list-group-item {\n padding: 0px;\n}\n.poll-choices-control .list-group-item .btn {\n background: transparent;\n border: transparent;\n float: left;\n margin: 0px 2px;\n margin-bottom: -29px;\n padding: 0px;\n width: 28px;\n height: 28px;\n position: relative;\n top: 3px;\n}\n.poll-choices-control .list-group-item .btn .material-icon {\n width: 28px;\n height: 28px;\n font-size: 28px;\n line-height: 28px;\n}\n.poll-choices-control input,\n.poll-choices-control input:focus,\n.poll-choices-control input:active {\n background: transparent;\n border: none;\n -webkit-box-shadow: none;\n box-shadow: none;\n outline: none;\n margin-left: 30px;\n padding: 6px 12px;\n width: 100%;\n}\n#posting-mount {\n display: none;\n position: fixed;\n bottom: 0;\n left: 0;\n width: 100%;\n z-index: 1035;\n}\n#posting-mount.show {\n display: block;\n background-color: #fff;\n}\n.posting-dialog {\n max-width: 1240px;\n margin: 0 auto;\n background: #fff;\n border: 1px solid #ebecf0;\n border-radius: 4px 4px 0 0;\n border-bottom: 0;\n box-shadow: 0 0 24px rgba(94, 108, 132, 0.25);\n overflow: hidden;\n}\n.posting-dialog-header {\n display: flex;\n align-items: center;\n padding: 6px 12px;\n border-bottom: 1px solid #ebecf0;\n}\n.posting-dialog-caption {\n flex: 1;\n color: #172b4d;\n font-size: 18px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.btn-posting-dialog {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n margin-left: 10px;\n padding: 0;\n font-size: 24px;\n line-height: 24px;\n}\n.btn-posting-dialog,\n.btn-posting-dialog:hover {\n background-color: transparent;\n border: 1px solid transparent;\n color: #172b4d;\n}\n.btn-posting-dialog:active {\n background-color: #ebecf0;\n border: 1px solid #ebecf0;\n color: #172b4d;\n}\n.btn-posting-dialog .material-icon {\n padding: 0;\n margin: 0;\n bottom: 0;\n}\n.posting-dialog-body {\n padding: 12px;\n}\n@media screen and (min-width: 992px) {\n .posting-dialog-thread-recipients,\n .posting-dialog-category-select {\n max-width: 400px;\n }\n}\n.posting-dialog-minimized .posting-dialog-header {\n border-bottom: 0;\n}\n.posting-dialog-minimized .posting-dialog-body {\n display: none;\n}\nbody.posting-fullscreen {\n overflow: hidden;\n}\nbody.posting-fullscreen #posting-mount {\n height: 100%;\n}\nbody.posting-fullscreen .posting-dialog {\n height: 100%;\n width: 100%;\n max-width: auto;\n border: 0;\n box-shadow: none;\n}\nbody.posting-fullscreen .posting-dialog-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n max-width: 1240px;\n margin: 0 auto;\n padding: 0 30px;\n}\nbody.posting-fullscreen .posting-dialog-header,\nbody.posting-fullscreen .posting-dialog-body {\n padding: 20px 0;\n}\nbody.posting-fullscreen .posting-dialog-body,\nbody.posting-fullscreen .posting-loading {\n height: 100%;\n}\nbody.posting-fullscreen .posting-dialog-form {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\nbody.posting-fullscreen #posting-spacer {\n display: none;\n}\n@media screen and (max-width: 1240px) {\n body.posting-default .posting-dialog,\n body.posting-minimized .posting-dialog {\n border-radius: 0;\n border-left: 0;\n border-right: 0;\n }\n}\n@media screen and (max-width: 991px) {\n body.posting-default {\n overflow: hidden;\n }\n body.posting-default #posting-mount {\n height: 100%;\n }\n body.posting-default .posting-dialog {\n height: 100%;\n width: 100%;\n max-width: auto;\n border: 0;\n box-shadow: none;\n }\n body.posting-default .posting-dialog-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n max-width: 1240px;\n margin: 0 auto;\n padding: 0;\n }\n body.posting-default .posting-dialog-header,\n body.posting-default .posting-dialog-body {\n padding: 6px;\n }\n body.posting-default .posting-dialog-body,\n body.posting-default .posting-loading {\n height: 100%;\n }\n body.posting-default .posting-dialog-form {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n body.posting-default .posting-dialog .toolbar-section {\n margin-bottom: 6px;\n }\n body.posting-default #posting-spacer {\n display: none;\n }\n}\n.posting-dialog-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 20px;\n}\n.posting-dialog-error p {\n font-size: 18px;\n}\n.posting-dialog-error-icon {\n margin-bottom: 20px;\n font-size: 128px;\n opacity: 0.5;\n}\n.posting-dialog-error-detail {\n text-align: center;\n}\n.posts-list {\n margin: 0px;\n padding: 0px;\n clear: both;\n}\n.posts-list li {\n list-style: none;\n margin: 0px;\n padding: 0px;\n}\n@media screen and (min-width: 992px) {\n .panel-post .panel-body {\n display: flex;\n }\n .post-side {\n flex-shrink: 0;\n width: 260px;\n padding-right: 15px;\n }\n .panel-content {\n flex: 1 0;\n }\n}\n.post-side {\n font-size: 12px;\n}\n.post-side .media {\n margin: 0px;\n}\n.post-side .poster-avatar {\n height: 36px;\n width: 36px;\n}\n@media screen and (min-width: 992px) {\n .post-side .poster-avatar {\n margin-top: 4px;\n height: 82px;\n width: 82px;\n }\n}\n.post-side .user-status {\n margin-right: 4px;\n}\n.post-side .media-heading {\n display: block;\n}\n.post-side .media-heading {\n margin: 0px;\n margin-top: -1px;\n font-size: 14px;\n}\n.post-side .media-heading .user-status {\n margin-right: 0;\n margin-left: 2px;\n}\n.post-side .pull-right {\n margin-left: 16px;\n}\n@media screen and (min-width: 992px) {\n .post-side .media-heading {\n margin-top: 3px;\n font-size: 18px;\n }\n .post-side .media-heading .user-status {\n display: none;\n }\n .post-side .user-title {\n margin-top: 4px;\n margin-bottom: 5px;\n }\n .post-side .user-postcount {\n display: block;\n }\n .post-side .user-status {\n display: block;\n }\n}\n.post-heading {\n height: 36px;\n}\n@media screen and (max-width: 991px) {\n .post-heading {\n margin-top: 10px;\n }\n}\n.post-heading .pull-right {\n margin-left: 16px;\n}\n.post-heading > .btn-link {\n padding-left: 0px;\n padding-right: 0px;\n}\n.post-heading .label {\n margin-top: 6px;\n font-size: 14px;\n font-weight: normal;\n}\n.post-heading .label-unread {\n background-color: #36b37e;\n color: #fff;\n}\n.post-heading .label-protected {\n background-color: #5e6c84;\n color: #fff;\n}\n@media screen and (min-width: 992px) {\n .post-side .pull-right {\n display: none;\n }\n}\n@media screen and (max-width: 991px) {\n .post-heading .pull-right {\n display: none;\n }\n}\n.post-body {\n padding-top: 20px;\n padding-bottom: 30px;\n}\n.post-status-message {\n overflow: auto;\n}\n.post-status-message .material-icon {\n float: left;\n font-size: 28px;\n line-height: 28px;\n}\n.post-status-message p {\n margin: 0px;\n margin-top: 4px;\n margin-left: 36px;\n}\n.post-status-best-answer {\n background-color: #36b37e;\n color: #fff;\n}\n.post-status-hidden {\n background-color: #ff5630;\n color: #fff;\n}\n.post-status-unapproved {\n background-color: #2563eb;\n color: #fff;\n}\n.post-status-protected {\n background-color: #5e6c84;\n color: #fff;\n}\n.post-footer .pull-left {\n margin-right: 16px;\n}\n.post-footer .pull-right {\n margin-left: 16px;\n}\n.post-footer p {\n padding-top: 7px;\n padding-bottom: 6px;\n margin-bottom: 0px;\n}\n.post-attachments {\n border-top: 1px solid #ebecf0;\n padding: 6px 16px;\n}\n.post-attachments abbr {\n white-space: nowrap;\n}\n.post-attachments .attachment-name {\n overflow-wrap: anywhere;\n}\n.post-attachments .row > div {\n margin: 10px 0px;\n}\n.post-attachments .post-attachment-preview {\n float: left;\n height: 40px;\n width: 40px;\n text-align: center;\n}\n.post-attachments .post-attachment {\n margin-left: 52px;\n}\n.post-attachments .post-thumbnail {\n display: block;\n background-size: cover;\n background-position: center;\n border-radius: 3px;\n width: 40px;\n height: 40px;\n}\n.post-attachments .material-icon {\n width: 28px;\n height: 28px;\n position: relative;\n top: 5px;\n font-size: 28px;\n line-height: 28px;\n}\n.post-attachments .material-icon:link,\n.post-attachments .material-icon:active,\n.post-attachments .material-icon:visited,\n.post-attachments .material-icon:hover,\n.post-attachments .material-icon:focus {\n color: #172b4d;\n text-decoration: none;\n}\n.post-attachments .post-attachment-description {\n margin: 0px;\n padding: 0px;\n color: #7a869a;\n font-size: 12px;\n}\n.post-feed .post-side {\n width: 100%;\n padding-right: 0;\n}\n.post-feed .post-side .media-heading {\n margin: 0px;\n font-size: 14px;\n}\n.post-feed .post-side .user-title {\n margin: 0px;\n font-size: 12px;\n}\n.post-feed .post-side .btn {\n display: inline-block;\n}\n.post-feed .post-side img {\n margin-top: 0px;\n width: 36px;\n height: 36px;\n}\n.post-feed .post-heading {\n height: auto;\n margin: 10px 0px;\n}\n.post-feed .post-heading .btn {\n margin-right: 16px;\n max-width: 100%;\n text-align: left;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n.posts-list .event {\n margin-bottom: 20px;\n color: #7a869a;\n}\n.posts-list .event .event-body {\n display: flex;\n align-items: flex-start;\n}\n.posts-list .event-label {\n margin-left: 51px;\n}\n.posts-list .event-label .label-unread {\n background-color: #36b37e;\n color: #fff;\n}\n.posts-list .event .event-icon {\n padding-right: 15px;\n}\n.posts-list .event .event-icon .event-icon-bg {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 36px;\n width: 36px;\n background: #ebecf0;\n border-radius: 4px;\n color: #5e6c84;\n}\n.posts-list .event .event-icon .material-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 28px;\n}\n.posts-list .event .event-content {\n flex: 1 0;\n}\n.posts-list .event .event-message {\n margin-bottom: 5px;\n font-size: 18px;\n}\n.posts-list .event .event-info {\n margin: 0px;\n font-size: 12px;\n}\n.posts-list .event .event-info li {\n margin-right: 12px;\n}\n.posts-list .event .event-info li:last-child {\n margin-right: 0px;\n}\n.posts-list .event .event-controls .btn-link {\n border: 0px;\n margin: 0px;\n margin-right: 12px;\n padding: 0px;\n font-size: 12px;\n}\n.posts-list .event .event-controls .btn-link:last-child {\n margin-right: 0px;\n}\n@media screen and (max-width: 767px) {\n .posts-list .event .event-info {\n margin-top: 5px;\n }\n .posts-list .event .event-controls {\n clear: both;\n margin-top: 5px;\n }\n .posts-list .event .event-controls .btn-link {\n margin-right: 20px;\n font-size: 14px;\n }\n .posts-list .event .event-controls .btn-link:last-child {\n margin-right: 0px;\n }\n}\n@media screen and (min-width: 992px) {\n .posts-list .event .event-icon {\n justify-content: flex-end;\n flex-shrink: 0;\n display: flex;\n width: 275px;\n }\n .event-content {\n flex: 1 0;\n }\n .posts-list .event-label {\n margin-left: 275px;\n }\n}\n.post-changelog-diff {\n padding: 0px;\n margin: 0px;\n}\n.post-changelog-diff .list-unstyled {\n padding: 0px;\n margin: 5px 0px;\n}\n.post-changelog-diff .diff-item {\n padding: 5px 10px;\n}\n.post-changelog-diff .diff-item-sub {\n color: #ff5630;\n}\n.post-changelog-diff .diff-item-add {\n color: #36b37e;\n}\n.post-changelog-toolbar .row {\n margin-left: -12px;\n margin-right: -12px;\n}\n@media screen and (max-width: 767px) {\n .post-changelog-toolbar .post-change-label {\n text-align: center;\n }\n}\n.quote-control-arrow {\n width: 0;\n height: 0;\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 6px solid rgba(94, 108, 132, 0.75);\n position: relative;\n left: 6px;\n}\n.quote-control-inner {\n padding: 6px;\n background: rgba(94, 108, 132, 0.75);\n border-radius: 6px;\n}\n.quote-control-btn {\n background: #fff;\n border-color: #fff;\n color: #172b4d;\n}\n.section-divider {\n display: flex;\n align-items: center;\n}\n.section-divider hr {\n width: 100%;\n border-width: 3px;\n border-radius: 3px;\n}\n.section-divider strong {\n padding: 0 16px;\n}\n.section-divider-primary {\n color: #2563eb;\n}\n.section-divider-primary hr {\n border-color: #ffffff;\n}\n.page-login-container {\n padding: 40px 15px;\n margin-bottom: -40px;\n}\n.panel-login-form {\n max-width: 400px;\n margin: 20px auto;\n border: 1px solid #ebecf0;\n border-radius: 4px;\n}\n.panel-login-form-body {\n padding: 30px;\n}\n.panel-login-form-header {\n margin: 0;\n margin-bottom: 30px;\n font-size: 21px;\n font-weight: normal;\n text-align: center;\n}\n.panel-login-form-error {\n margin-top: -10px;\n margin-bottom: 20px;\n color: #ff5630;\n font-weight: bold;\n text-align: center;\n}\n.panel-login-form .form-control {\n margin-bottom: 20px;\n font-size: 16px;\n}\n@media screen and (max-width: 991px) {\n .page-login-container {\n padding: 20px 15px;\n }\n .panel-login-form-body {\n padding: 15px;\n }\n .panel-login-form-header {\n margin-bottom: 15px;\n }\n .panel-login-form-error {\n margin-top: 0;\n margin-bottom: 10px;\n }\n}\n@media screen and (max-width: 767px) {\n .page-message .message-panel,\n .page-error .message-panel {\n text-align: center;\n }\n .page-message .message-icon,\n .page-error .message-icon {\n margin: 30px;\n font-size: 80px;\n }\n}\n@media screen and (min-width: 768px) {\n .page-message .message-panel,\n .page-error .message-panel {\n margin: 60px auto;\n max-width: 779.35px;\n overflow: auto;\n }\n .page-message .message-icon,\n .page-error .message-icon {\n float: left;\n }\n .page-message .message-icon .material-icon,\n .page-error .message-icon .material-icon {\n font-size: 80px;\n }\n .page-message .message-body,\n .page-error .message-body {\n margin-top: 16px;\n margin-left: 100px;\n font-size: 18px;\n }\n .page-message .message-body p.lead,\n .page-error .message-body p.lead {\n font-size: 36px;\n }\n}\n.threads-list {\n padding: 0;\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid #ebecf0;\n border-radius: 3px;\n overflow: hidden;\n}\n.threads-list-item {\n display: flex;\n align-items: center;\n padding: 10px 15px;\n border-bottom: 1px solid #ebecf0;\n}\n.threads-list-item img {\n border-radius: 3px;\n}\n.threads-list-item:last-child {\n border-bottom: none;\n}\n.threads-list-item-right-col {\n display: flex;\n align-items: center;\n width: 100%;\n}\n.threads-list-item-top-row {\n display: flex;\n flex-direction: column;\n flex: 1;\n align-items: center;\n justify-content: center;\n}\n.threads-list-item-bottom-row,\n.threads-list-item-bottom-left,\n.threads-list-item-bottom-right {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n@keyframes misago-threads-list-item-animate {\n 0% {\n background-color: #b3d4ff;\n }\n 100% {\n background-color: transparent;\n }\n}\n.threads-list-item-animate {\n animation-name: misago-threads-list-item-animate;\n animation-duration: 0.5s;\n animation-iteration-count: 1;\n}\n.threads-list-item-col-read-status {\n padding-right: 15px;\n line-height: 0;\n}\n.threads-list-read-icon {\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 2px solid #ebecf0;\n border-radius: 100%;\n}\n.threads-list-unread-icon {\n display: inline-block;\n width: 14px;\n height: 14px;\n font-size: 0;\n line-height: 0;\n background-color: #2563eb;\n border-radius: 100%;\n}\n.threads-list-item-row-title {\n flex: 1;\n width: 100%;\n}\n.threads-list-item-title:link,\n.threads-list-item-title:active,\n.threads-list-item-title:focus,\n.threads-list-item-title:hover,\n.threads-list-item-title:visited {\n font-size: 16px;\n color: #172b4d;\n overflow-wrap: anywhere;\n}\n.threads-list-item-title-new:link,\n.threads-list-item-title-new:active,\n.threads-list-item-title-new:focus,\n.threads-list-item-title-new:hover,\n.threads-list-item-title-new:visited {\n color: #172b4d;\n}\n.threads-list-item-row-categories,\n.threads-list-item-col-categories {\n display: flex;\n width: 100%;\n}\n.threads-list-category-link {\n display: flex;\n align-items: center;\n}\n.threads-list-category-link .material-icon {\n margin-right: 3px;\n}\n.threads-list-category-link:link,\n.threads-list-category-link:active,\n.threads-list-category-link:focus,\n.threads-list-category-link:hover,\n.threads-list-category-link:visited {\n color: #172b4d;\n opacity: 0.75;\n}\n.threads-list-category-link:focus,\n.threads-list-category-link:hover {\n color: #172b4d;\n text-decoration: none;\n opacity: 1;\n}\n.threads-list-category-link + .threads-list-category-link {\n margin-left: 15px;\n}\n.threads-list-category-link-color .material-icon {\n color: var(--color);\n}\n.threads-list-item-col-categories {\n display: none;\n}\n.threads-list-item-goto-page {\n margin-left: 12px;\n padding: 3px 12px;\n border-radius: 3px;\n font-size: 13px;\n font-weight: bold;\n}\n.threads-list-item-goto-page:focus,\n.threads-list-item-goto-page:hover,\n.threads-list-item-goto-page:link,\n.threads-list-item-goto-page:visited {\n color: #172b4d;\n background-color: transparent;\n border: 1px solid #ebecf0;\n text-decoration: none;\n}\n.threads-list-item-goto-page:active {\n color: #172b4d;\n background-color: #ebecf0;\n border: 1px solid #ebecf0;\n}\n.threads-list-item-col-flags {\n padding-left: 15px;\n}\n.threads-list-item .thread-flags {\n opacity: 0.8;\n}\n.threads-list-item:hover .thread-flags,\n.threads-list-item:focus .thread-flags {\n opacity: 1;\n}\n.threads-list-item-col-category-labels {\n padding-left: 15px;\n white-space: nowrap;\n}\n.threads-list-category-label {\n padding: 3px 6px;\n font-size: 12px;\n font-weight: bold;\n}\n.threads-list-category-label,\n.threads-list-category-label:link,\n.threads-list-category-label:active,\n.threads-list-category-label:hover,\n.threads-list-category-label:focus,\n.threads-list-category-label:visited {\n color: #344563;\n background: #ebecf0;\n text-decoration: none;\n}\n.threads-list-category-label.threads-list-category-label-color,\n.threads-list-category-label.threads-list-category-label-color:link,\n.threads-list-category-label.threads-list-category-label-color:active,\n.threads-list-category-label.threads-list-category-label-color:hover,\n.threads-list-category-label.threads-list-category-label-color:focus,\n.threads-list-category-label.threads-list-category-label-color:visited {\n color: #fff;\n background: var(--label-color);\n}\n.threads-list-category-label:first-child {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.threads-list-category-label:last-child {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.threads-list-category-label + .threads-list-category-label {\n margin-left: 2px;\n}\n.threads-list-item-col-replies {\n width: 80px;\n padding-left: 15px;\n}\n.threads-list-item-col-posters {\n padding-left: 15px;\n width: 76px;\n}\n.threads-list-item-col-posters a {\n display: inline-block;\n line-height: 0;\n}\n.threads-list-item-col-posters a:hover,\n.threads-list-item-col-posters a:focus {\n text-decoration: none;\n}\n.threads-list-item-starter + .threads-list-item-last-poster {\n margin-left: 7.5px;\n}\n.threads-list-item-col-posters-sm {\n display: none;\n font-size: 20px;\n line-height: 1;\n}\n.threads-list-item-col-posters-sm img {\n width: 20px;\n height: 20px;\n}\n.threads-list-item-col-last-activity {\n width: 90px;\n padding-left: 15px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.threads-list-item-col-last-activity a:link,\n.threads-list-item-col-last-activity a:hover,\n.threads-list-item-col-last-activity a:active,\n.threads-list-item-col-last-activity a:visited,\n.threads-list-item-col-last-activity a:focus {\n color: #344563;\n font-size: 16px;\n}\n@media screen and (max-width: 991px) {\n .threads-list-item {\n align-items: flex-start;\n }\n .threads-list-item-right-col {\n display: block;\n }\n .threads-list-item-top-row {\n align-items: start;\n }\n .threads-list-item-bottom-row {\n justify-content: space-between;\n flex: 0;\n margin-top: 7.5px;\n }\n .threads-list-item-row-categories,\n .threads-list-item-col-posters,\n .threads-list-item-col-replies-zero {\n display: none;\n }\n .threads-list-item-col-read-status {\n padding-top: 4px;\n }\n .threads-list-item-col-flags,\n .threads-list-item-col-category-labels {\n padding-left: 0;\n }\n .threads-list-item-col-categories {\n display: flex;\n align-items: center;\n }\n .threads-list-item-col-flags + .threads-list-item-col-categories,\n .threads-list-item-col-flags + .threads-list-item-col-category-labels {\n margin-left: 15px;\n }\n .threads-list-item-col-categories .threads-list-category-link,\n .threads-list-item-col-category-labels .threads-list-category-label {\n white-space: nowrap;\n }\n .threads-list-item-col-replies,\n .threads-list-item-col-last-activity {\n width: auto;\n }\n .threads-list-item-col-posters-sm {\n display: block;\n margin-left: 15px;\n }\n .threads-list-item-col-checkbox {\n width: 40px;\n margin-right: -10px;\n text-align: center;\n }\n}\n@media screen and (max-width: 767px) {\n .threads-list {\n margin-left: -15px;\n margin-right: -15px;\n border-radius: 0;\n border-width: 1px 0;\n }\n .threads-list-item-bottom-row {\n margin-top: 0;\n }\n .threads-list-item-bottom-left,\n .threads-list-item-bottom-right {\n margin-top: 7px;\n overflow: visible;\n }\n .threads-list-item-bottom-row {\n display: block;\n overflow: auto;\n }\n .threads-list-item-bottom-row .threads-list-item-bottom-left {\n float: left;\n }\n .threads-list-item-bottom-row .threads-list-item-bottom-right {\n float: right;\n }\n .threads-list-item-col-read-status {\n position: relative;\n right: 4px;\n padding-right: 7px;\n }\n .threads-list-item-title {\n font-size: 18px;\n }\n .threads-list-item-starter {\n display: none;\n }\n .threads-list-item-col-last-activity {\n padding-left: 15px;\n padding-right: 7px;\n }\n .threads-list-item-col-last-activity a:link,\n .threads-list-item-col-last-activity a:hover,\n .threads-list-item-col-last-activity a:active,\n .threads-list-item-col-last-activity a:visited,\n .threads-list-item-col-last-activity a:focus {\n font-size: 13px;\n }\n .threads-list-item-col-checkbox {\n margin-right: 0px;\n }\n .threads-list-item-col-checkbox input {\n position: relative;\n left: 10px;\n }\n}\n.threads-list-poll-new {\n padding: 0;\n list-style: none;\n}\n.btn-threads-list-poll {\n display: block;\n padding: 10px 15px;\n width: 100%;\n color: #2563eb;\n background-color: #fff;\n border: none;\n border-bottom: 1px solid #ebecf0;\n border-radius: 0;\n}\n.threads-list-blankslate {\n padding: 20px 30px;\n}\n.threads-list-blankslate-message {\n margin: 0;\n font-size: 18px;\n text-align: center;\n}\n.threads-list-blankslate-links {\n margin-top: 20px;\n text-align: center;\n}\n@media screen and (max-width: 767px) {\n .threads-list-blankslate {\n padding: 10px 15px;\n }\n .threads-list-blankslate-message {\n font-size: 14px;\n }\n}\n.notifications-list {\n margin-bottom: 20px;\n}\n.notifications-list-item {\n display: flex;\n align-items: center;\n}\n.notifications-list-item-left-col {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.notifications-list-item-right-col {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n}\n.notifications-list-item-top-row {\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n}\n.notifications-list-item-bottom-row {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.notifications-list-item-col-actor {\n padding-right: 15px;\n}\n.notifications-list-item-col-actor img {\n border-radius: 3px;\n height: 30px;\n width: 30px;\n}\n.notifications-list-item-col-read-icon {\n padding-right: 15px;\n line-height: 0;\n}\n.notification-read-icon {\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 2px solid #ebecf0;\n border-radius: 100%;\n}\n.notification-unread-icon {\n display: inline-block;\n width: 14px;\n height: 14px;\n font-size: 0;\n line-height: 0;\n background-color: #2563eb;\n border-radius: 100%;\n}\n.notifications-list-item-col-message {\n width: 100%;\n overflow-wrap: anywhere;\n}\n.notification-message,\n.notification-message:link,\n.notification-message:hover,\n.notification-message:focus,\n.notification-message:visited {\n color: #172b4d;\n}\n.notification-message:active {\n color: #172b4d;\n}\n.notification-message-unread,\n.notification-message-unread:link,\n.notification-message-unread:hover,\n.notification-message-unread:focus,\n.notification-message-unread:visited {\n color: #172b4d;\n}\n.notification-message-unread:active {\n color: #172b4d;\n}\n.notifications-list-item-col-timestamp {\n display: flex;\n align-items: center;\n padding-left: 15px;\n min-width: 200px;\n}\n.notifications-list-item-timestamp {\n color: #5e6c84;\n font-size: 12px;\n}\n@media screen and (max-width: 991px) {\n .notifications-list-item {\n align-items: flex-start;\n position: relative;\n }\n .notifications-list-item-right-col {\n display: block;\n }\n .notifications-list-item-col-read-icon {\n position: absolute;\n padding: 0;\n top: 14px;\n right: 15px;\n }\n .notifications-list-item-col-timestamp {\n margin-top: 5px;\n padding: 0;\n }\n .notifications-list-item-unread {\n padding-right: 40px;\n }\n .notifications-list-item-read .notifications-list-item-col-read-icon {\n display: none;\n }\n}\n@media screen and (max-width: 767px) {\n .notifications-list {\n margin-left: -15px;\n margin-right: -15px;\n }\n .notifications-list .list-group,\n .notifications-list .list-group-item {\n border-radius: 0;\n border-left: 0;\n border-right: 0;\n }\n}\n.notifications-dropdown {\n width: 375px;\n}\n.notifications-dropdown .notifications-list {\n margin: 0;\n max-height: calc(100vh - 80px - 130px);\n overflow-y: auto;\n}\n.notifications-dropdown .notifications-list-item {\n align-items: flex-start;\n position: relative;\n}\n.notifications-dropdown .notifications-list-item-right-col {\n display: block;\n}\n.notifications-dropdown .notifications-list-item-col-read-icon {\n position: absolute;\n padding: 0;\n top: 14px;\n right: 15px;\n}\n.notifications-dropdown .notifications-list-item-col-timestamp {\n margin-top: 5px;\n padding: 0;\n}\n.notifications-dropdown .notifications-list-item-unread {\n padding-right: 40px;\n}\n.notifications-dropdown .notifications-list-item-read .notifications-list-item-col-read-icon {\n display: none;\n}\n.overlay .notifications-list {\n margin: 0;\n width: 100%;\n height: 100%;\n overflow-y: auto;\n position: relative;\n}\n.overlay .notifications-list-ready .list-group {\n position: absolute;\n}\n.overlay .list-group,\n.overlay .list-group-item {\n margin: 0;\n border-radius: 0;\n border-left: 0;\n border-right: 0;\n}\n.overlay .list-group-item:first-child {\n border-top: none;\n}\n.overlay .list-group-item {\n border-bottom: none;\n}\n.overlay .notifications-list-item {\n align-items: flex-start;\n position: relative;\n padding: 10px 20px;\n}\n.overlay .notifications-list-item-right-col {\n display: block;\n}\n.overlay .notifications-list-item-col-read-icon {\n position: absolute;\n padding: 0;\n top: 14px;\n right: 15px;\n}\n.overlay .notifications-list-item-col-timestamp {\n margin-top: 5px;\n padding: 0;\n}\n.overlay .notifications-list-item-unread {\n padding-right: 40px;\n}\n.overlay .notifications-list-item-read .notifications-list-item-col-read-icon {\n display: none;\n}\n.overlay .notifications-list-pending,\n.overlay .notifications-list-pending .list-group {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n}\n.overlay .notifications-list-pending .list-group-item {\n width: 100%;\n}\n.active-posters li {\n display: block;\n overflow: auto;\n}\n.active-posters .rank-user-avatar {\n float: left;\n}\n@media screen and (max-width: 991px) {\n .active-posters .rank-user-avatar {\n height: 42px;\n }\n .active-posters .rank-user-avatar img {\n width: 36px;\n height: 36px;\n position: relative;\n top: 3px;\n }\n}\n.active-posters .rank-user {\n float: left;\n margin-top: 3px;\n}\n@media screen and (max-width: 991px) {\n .active-posters .rank-user {\n margin-left: 13.2px;\n width: 40%;\n }\n}\n@media screen and (max-width: 767px) {\n .active-posters .rank-user {\n float: none;\n margin-left: 50px;\n width: auto;\n }\n}\n@media screen and (min-width: 992px) {\n .active-posters .rank-user {\n margin-left: 16px;\n width: 25%;\n }\n .active-posters .rank-user .user-name {\n font-size: 18px;\n }\n}\n.active-posters .user-details {\n overflow: auto;\n font-family: Sans-Serif;\n}\n.active-posters .user-details .user-status,\n.active-posters .user-details .rank-name,\n.active-posters .user-details .user-title {\n display: block;\n float: left;\n margin-right: 3px;\n font-size: 12px;\n}\n@media screen and (min-width: 992px) {\n .active-posters .user-details .user-status,\n .active-posters .user-details .rank-name,\n .active-posters .user-details .user-title {\n margin-right: 8px;\n }\n}\n.active-posters .user-details .user-title {\n margin-right: 0px;\n}\n@media screen and (min-width: 992px) {\n .active-posters .user-details {\n overflow: visible;\n }\n .active-posters .user-details .rank-name,\n .active-posters .user-details .user-title {\n height: 14px;\n overflow: hidden;\n position: relative;\n top: 1px;\n vertical-align: baseline;\n }\n}\n@media screen and (max-width: 767px) {\n .active-posters .user-details {\n margin-top: 3px;\n }\n .active-posters .user-details .rank-name,\n .active-posters .user-details .user-title {\n font-weight: normal;\n }\n}\n.active-posters .user-status {\n overflow: auto;\n position: relative;\n top: 1px;\n}\n.active-posters .user-status span {\n display: block;\n float: left;\n}\n@media screen and (min-width: 992px) {\n .active-posters .user-status {\n height: 14px;\n overflow: hidden;\n }\n}\n.active-posters .user-status .status-icon {\n position: relative;\n}\n@media screen and (max-width: 991px) {\n .active-posters .user-status .status-icon {\n top: 0px;\n width: 12px;\n height: 12px;\n font-size: 12px;\n line-height: 12px;\n }\n}\n@media screen and (min-width: 992px) {\n .active-posters .user-status .status-icon {\n top: 1px;\n margin-right: 3px;\n width: 13px;\n height: 13px;\n font-size: 13px;\n line-height: 13px;\n }\n}\n.active-posters .status-label.ui-preview-text,\n.active-posters .rank-name .ui-preview-text,\n.active-posters .user-title .ui-preview-text {\n height: 11px;\n position: relative;\n top: 2px;\n font-size: 11px;\n line-height: 11px;\n}\n.active-posters .rank-name .ui-preview-text,\n.active-posters .user-title .ui-preview-text {\n position: static;\n}\n.active-posters .rank-position strong,\n.active-posters .rank-posts-counted strong,\n.active-posters .rank-posts-total strong,\n.active-posters .rank-position small,\n.active-posters .rank-posts-counted small,\n.active-posters .rank-posts-total small {\n display: block;\n}\n@media screen and (max-width: 991px) {\n .active-posters .rank-position,\n .active-posters .rank-posts-counted,\n .active-posters .rank-posts-total {\n overflow: auto;\n }\n .active-posters .rank-position strong,\n .active-posters .rank-posts-counted strong,\n .active-posters .rank-posts-total strong,\n .active-posters .rank-position small,\n .active-posters .rank-posts-counted small,\n .active-posters .rank-posts-total small {\n float: left;\n font-size: 10.5px;\n }\n .active-posters .rank-position strong,\n .active-posters .rank-posts-counted strong,\n .active-posters .rank-posts-total strong {\n min-width: 30px;\n margin-right: 3px;\n text-align: right;\n }\n .active-posters .rank-position .ui-preview-text,\n .active-posters .rank-posts-counted .ui-preview-text,\n .active-posters .rank-posts-total .ui-preview-text {\n height: 8px;\n position: relative;\n top: -1px;\n font-size: 8px;\n line-height: 8px;\n }\n}\n@media screen and (min-width: 992px) {\n .active-posters .rank-position,\n .active-posters .rank-posts-counted,\n .active-posters .rank-posts-total {\n float: left;\n margin-top: 3px;\n width: 23%;\n font-size: 18px;\n text-align: center;\n }\n .active-posters .rank-position small,\n .active-posters .rank-posts-counted small,\n .active-posters .rank-posts-total small {\n font-size: 12px;\n font-weight: normal;\n }\n}\n.user-compact-stats .rank-position strong,\n.user-compact-stats .rank-posts-counted strong,\n.user-compact-stats .rank-position small,\n.user-compact-stats .rank-posts-counted small {\n display: inline-block;\n float: none;\n}\n.user-compact-stats .rank-position strong,\n.user-compact-stats .rank-posts-counted strong {\n min-width: auto;\n}\n.user-compact-stats .rank-position small,\n.user-compact-stats .rank-posts-counted small {\n margin-right: 20px;\n}\n@media screen and (min-width: 768px) and (max-width: 991px) {\n .active-posters .rank-position {\n margin-top: 6px;\n }\n .active-posters .rank-posts-total {\n display: none;\n }\n}\n@media screen and (min-width: 768px) and (max-width: 991px) {\n .active-posters .rank-position {\n margin-top: 6px;\n }\n .active-posters .rank-posts-total {\n display: none;\n }\n}\n.table-watching-preferences {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table-watching-preferences th,\n.table-watching-preferences td {\n border-bottom: 1px solid #ddd;\n vertical-align: middle;\n}\n.table-watching-label {\n padding: 8px;\n padding-left: 0;\n}\n.table-watching-option {\n width: 100px;\n padding: 8px;\n text-align: center;\n}\n.table-watching-option label {\n margin: 0;\n padding: 5px;\n width: 100%;\n}\n.table-watching-option label,\n.table-watching-option label input {\n cursor: pointer;\n}\n.table-watching-option label:hover {\n background-color: #ebecf0;\n border-radius: 4px;\n}\n.table-watching-option attr {\n display: block;\n cursor: help;\n}\n.table-watching-option .material-icon {\n font-size: 18px;\n}\n.profile-page-header-avatar {\n text-align: center;\n margin: 20px 0;\n}\n.profile-page-header-avatar .user-avatar {\n border-radius: 4px;\n}\n.profile-data-list {\n display: block;\n padding: 0;\n margin: 0 -12px;\n font-size: 12px;\n}\n.profile-data-list li {\n display: inline-block;\n list-style: none;\n padding: 5px 12px;\n}\n.profile-data-list .status-icon {\n margin-right: 3px;\n position: relative;\n bottom: 1px;\n}\n.profile-data-list .user-account-disabled {\n color: #ff5630;\n font-weight: bold;\n}\n@media screen and (min-width: 768px) {\n .profile-page-header {\n display: flex;\n align-items: flex-end;\n }\n .profile-page-header-avatar {\n margin: 0;\n margin-right: 30px;\n }\n}\n@media screen and (min-width: 992px) {\n .profile-page-header-avatar {\n position: relative;\n top: 54px;\n margin-top: -54px;\n }\n .profile-page-header-details {\n padding-left: 158px;\n }\n .profile-data-list {\n font-size: 14px;\n }\n}\n@media screen and (min-width: 992px) {\n .username-history li {\n display: block;\n overflow: auto;\n }\n}\n.username-history .change-avatar {\n float: left;\n}\n.username-history .change-avatar a,\n.username-history .change-avatar span {\n margin-right: 10px;\n}\n.username-history .change-avatar a img,\n.username-history .change-avatar span img {\n width: 42px;\n height: 42px;\n}\n@media screen and (min-width: 992px) {\n .username-history .change-avatar a img,\n .username-history .change-avatar span img {\n width: 18px;\n height: 18px;\n position: relative;\n bottom: 1px;\n }\n}\n@media screen and (min-width: 992px) {\n .username-history .change-author {\n float: left;\n width: 30%;\n }\n}\n.username-history .change {\n min-height: 20px;\n overflow: auto;\n}\n.username-history .change span {\n display: block;\n float: left;\n}\n.username-history .change .material-icon {\n margin: 0px 7px;\n position: relative;\n top: 4px;\n}\n@media screen and (min-width: 992px) {\n .username-history .change {\n float: left;\n width: 40%;\n }\n}\n@media screen and (min-width: 992px) {\n .username-history .change-date {\n float: left;\n width: 20%;\n }\n}\n.search-footer p {\n margin-top: 20px;\n color: #5e6c84;\n font-size: 12px;\n text-align: center;\n}\n@media screen and (min-width: 768px) {\n .page-search-form {\n padding-top: 40px;\n }\n}\n@media screen and (min-width: 992px) {\n .page-search-form {\n padding-bottom: 40px;\n }\n .page-search-form h1 {\n position: relative;\n top: 5px;\n }\n .page-search-form .form-group {\n margin-bottom: 0px;\n }\n}\n.block {\n display: block;\n}\n.inline-block {\n display: inline-block;\n}\n.flex {\n display: flex;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-auto {\n flex: 1 1 auto;\n}\n.flex-initial {\n flex: 0 1 auto;\n}\n.flex-none {\n flex: none;\n}\n.grow {\n flex-grow: 1;\n}\n.grow-0 {\n flex-grow: 0;\n}\n.shrink {\n flex-shrink: 1;\n}\n.shrink-0 {\n flex-shrink: 0;\n}\n.justify-start {\n justify-content: flex-start;\n}\n.justify-end {\n justify-content: flex-end;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.content-center {\n align-content: center;\n}\n.content-start {\n align-content: flex-start;\n}\n.content-end {\n align-content: flex-end;\n}\n.content-between {\n align-content: space-between;\n}\n.mx-0 {\n margin: 0 0;\n}\n.mx-1 {\n margin: 5px 0;\n}\n.mx-2 {\n margin: 10px 0;\n}\n.mx-3 {\n margin: 20px 0;\n}\n.mt-0 {\n margin-top: 0;\n}\n.mt-1 {\n margin-top: 5px;\n}\n.mt-2 {\n margin-top: 10px;\n}\n.mt-3 {\n margin-top: 20px;\n}\n.mb-0 {\n margin-bottom: 0;\n}\n.mb-1 {\n margin-bottom: 5px;\n}\n.mb-2 {\n margin-bottom: 10px;\n}\n.mb-3 {\n margin-bottom: 20px;\n}\n.text-sm {\n font-size: 12px;\n}\n.text-color {\n color: #172b4d;\n}\n.text-gray-darker {\n color: #172b4d;\n}\n.text-gray-dark {\n color: #344563;\n}\n.text-gray {\n color: #5e6c84;\n}\n.text-gray-light {\n color: #7a869a;\n}\n.text-gray-lighter {\n color: #ebecf0;\n}\n.link-text-color,\n.link-text-color:active .link-text-color:focus,\n.link-text-color:hover,\n.link-text-color:link,\n.link-text-color:visited {\n color: #172b4d;\n}\n.link-gray-darker,\n.link-gray-darker:link,\n.link-gray-darker:visited {\n color: #172b4d;\n}\n.link-gray-darker:active .link-gray-darker:focus,\n.link-gray-darker:hover {\n color: #172b4d;\n}\n.link-gray-dark,\n.link-gray-dark:link,\n.link-gray-dark:visited {\n color: #344563;\n}\n.link-gray-dark:active .link-gray-dark:focus,\n.link-gray-dark:hover {\n color: #172b4d;\n}\n.link-gray,\n.link-gray:link,\n.link-gray:visited {\n color: #5e6c84;\n}\n.link-gray:active .link-gray:focus,\n.link-gray:hover {\n color: #172b4d;\n}\n.link-gray-light,\n.link-gray-light:link,\n.link-gray-light:visited {\n color: #7a869a;\n}\n.link-gray-light:active .link-gray-light:focus,\n.link-gray-light:hover {\n color: #172b4d;\n}\npre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em;\n}\ncode.hljs {\n padding: 3px 5px;\n}\n.hljs {\n color: #383a42;\n background: #fafafa;\n}\n.hljs-comment,\n.hljs-quote {\n color: #a0a1a7;\n font-style: italic;\n}\n.hljs-doctag,\n.hljs-formula,\n.hljs-keyword {\n color: #a626a4;\n}\n.hljs-deletion,\n.hljs-name,\n.hljs-section,\n.hljs-selector-tag,\n.hljs-subst {\n color: #e45649;\n}\n.hljs-literal {\n color: #0184bb;\n}\n.hljs-addition,\n.hljs-attribute,\n.hljs-meta .hljs-string,\n.hljs-regexp,\n.hljs-string {\n color: #50a14f;\n}\n.hljs-attr,\n.hljs-number,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-selector-pseudo,\n.hljs-template-variable,\n.hljs-type,\n.hljs-variable {\n color: #986801;\n}\n.hljs-bullet,\n.hljs-link,\n.hljs-meta,\n.hljs-selector-id,\n.hljs-symbol,\n.hljs-title {\n color: #4078f2;\n}\n.hljs-built_in,\n.hljs-class .hljs-title,\n.hljs-title.class_ {\n color: #c18401;\n}\n.hljs-emphasis {\n font-style: italic;\n}\n.hljs-strong {\n font-weight: 700;\n}\n.hljs-link {\n text-decoration: underline;\n}\n.atwho-view {\n position: absolute;\n top: 0;\n left: 0;\n display: none;\n margin-top: 18px;\n background: white;\n color: black;\n border: 1px solid #DDD;\n border-radius: 3px;\n box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);\n min-width: 120px;\n z-index: 11110 !important;\n}\n.atwho-view .atwho-header {\n padding: 5px;\n margin: 5px;\n cursor: pointer;\n border-bottom: solid 1px #eaeff1;\n color: #6f8092;\n font-size: 11px;\n font-weight: bold;\n}\n.atwho-view .atwho-header .small {\n color: #6f8092;\n float: right;\n padding-top: 2px;\n margin-right: -5px;\n font-size: 12px;\n font-weight: normal;\n}\n.atwho-view .atwho-header:hover {\n cursor: default;\n}\n.atwho-view .cur {\n background: #3366FF;\n color: white;\n}\n.atwho-view .cur small {\n color: white;\n}\n.atwho-view strong {\n color: #3366FF;\n}\n.atwho-view .cur strong {\n color: white;\n font: bold;\n}\n.atwho-view ul {\n /* width: 100px; */\n list-style: none;\n padding: 0;\n margin: auto;\n max-height: 200px;\n overflow-y: auto;\n}\n.atwho-view ul li {\n display: block;\n padding: 5px 10px;\n border-bottom: 1px solid #DDD;\n cursor: pointer;\n /* border-top: 1px solid #C8C8C8; */\n}\n.atwho-view small {\n font-size: smaller;\n color: #777;\n font-weight: normal;\n}\nabbr {\n outline: none;\n text-decoration: none;\n}\n.shadow-2dp {\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.04), 0 3px 1px -2px rgba(0, 0, 0, 0.06), 0 1px 5px 0 rgba(0, 0, 0, 0.12);\n}\n.shadow-3dp {\n box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.04), 0 3px 3px -2px rgba(0, 0, 0, 0.06), 0 1px 8px 0 rgba(0, 0, 0, 0.12);\n}\n.shadow-4dp {\n box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.04), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n}\n.shadow-6dp {\n box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.04), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.06);\n}\n.shadow-8dp {\n box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.04), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.06);\n}\n.shadow-16dp {\n box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.04), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.06);\n}\n.shadow-24dp {\n box-shadow: 0 9px 46px 8px rgba(0, 0, 0, 0.04), 0 11px 15px -7px rgba(0, 0, 0, 0.12), 0 24px 38px 3px rgba(0, 0, 0, 0.06);\n}\n.btn-default,\n.btn-default:disabled,\n.btn-default:disabled:hover,\n.btn-default.disabled,\n.btn-default.disabled:hover,\n.btn-default.disabled:active {\n background: #ebecf0;\n border: 1px solid #ebecf0;\n color: #172b4d;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default:disabled,\n.btn-default:disabled:hover,\n.btn-default.disabled,\n.btn-default.disabled:hover,\n.btn-default.disabled:active {\n filter: alpha(opacity=25);\n opacity: 0.25;\n}\n.btn-default:hover,\n.btn-default:focus {\n background: #dfe1e6;\n border: 1px solid #dfe1e6;\n color: #172b4d;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default:active:focus,\n.btn-default:active,\n.dropdown.open .dropdown-toggle .btn-default,\n.dropdown.open .dropdown-toggle .btn-default:focus,\n.dropdown.open .dropdown-toggle .btn-default:active:focus,\n.dropdown.open .dropdown-toggle .btn-default:hover {\n background: #c1c7d0;\n border: 1px solid #c1c7d0;\n color: #172b4d;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default.btn-loading,\n.btn-default.btn-loading:disabled,\n.btn-default.btn-loading:disabled:hover,\n.btn-default.btn-loading:hover,\n.btn-default.btn-loading:focus,\n.btn-default.btn-loading:active:focus,\n.btn-default.btn-loading:active {\n color: transparent;\n}\n.btn-primary,\n.btn-primary:disabled,\n.btn-primary:disabled:hover,\n.btn-primary.disabled,\n.btn-primary.disabled:hover,\n.btn-primary.disabled:active {\n background: #2563eb;\n border: 1px solid #2563eb;\n color: #fff;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-primary:disabled,\n.btn-primary:disabled:hover,\n.btn-primary.disabled,\n.btn-primary.disabled:hover,\n.btn-primary.disabled:active {\n filter: alpha(opacity=25);\n opacity: 0.25;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background: #3b82f6;\n border: 1px solid #3b82f6;\n color: #fff;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-primary:active:focus,\n.btn-primary:active,\n.dropdown.open .dropdown-toggle .btn-primary,\n.dropdown.open .dropdown-toggle .btn-primary:focus,\n.dropdown.open .dropdown-toggle .btn-primary:active:focus,\n.dropdown.open .dropdown-toggle .btn-primary:hover {\n background: #1e40af;\n border: 1px solid #1e40af;\n color: #fff;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-primary.btn-loading,\n.btn-primary.btn-loading:disabled,\n.btn-primary.btn-loading:disabled:hover,\n.btn-primary.btn-loading:hover,\n.btn-primary.btn-loading:focus,\n.btn-primary.btn-loading:active:focus,\n.btn-primary.btn-loading:active {\n color: transparent;\n}\n.btn-success,\n.btn-success:disabled,\n.btn-success:disabled:hover,\n.btn-success.disabled,\n.btn-success.disabled:hover,\n.btn-success.disabled:active {\n background: #22c55e;\n border: 1px solid #22c55e;\n color: #fff;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-success:disabled,\n.btn-success:disabled:hover,\n.btn-success.disabled,\n.btn-success.disabled:hover,\n.btn-success.disabled:active {\n filter: alpha(opacity=25);\n opacity: 0.25;\n}\n.btn-success:hover,\n.btn-success:focus {\n background: #15803d;\n border: 1px solid #15803d;\n color: #fff;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-success:active:focus,\n.btn-success:active,\n.dropdown.open .dropdown-toggle .btn-success,\n.dropdown.open .dropdown-toggle .btn-success:focus,\n.dropdown.open .dropdown-toggle .btn-success:active:focus,\n.dropdown.open .dropdown-toggle .btn-success:hover {\n background: #14532d;\n border: 1px solid #14532d;\n color: #fff;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-success.btn-loading,\n.btn-success.btn-loading:disabled,\n.btn-success.btn-loading:disabled:hover,\n.btn-success.btn-loading:hover,\n.btn-success.btn-loading:focus,\n.btn-success.btn-loading:active:focus,\n.btn-success.btn-loading:active {\n color: transparent;\n}\n.btn-danger,\n.btn-danger:disabled,\n.btn-danger:disabled:hover,\n.btn-danger.disabled,\n.btn-danger.disabled:hover,\n.btn-danger.disabled:active {\n background: #ef5350;\n border: 1px solid #ef5350;\n color: #fff;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-danger:disabled,\n.btn-danger:disabled:hover,\n.btn-danger.disabled,\n.btn-danger.disabled:hover,\n.btn-danger.disabled:active {\n filter: alpha(opacity=25);\n opacity: 0.25;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background: #ff8a80;\n border: 1px solid #ff8a80;\n color: #fff;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-danger:active:focus,\n.btn-danger:active,\n.dropdown.open .dropdown-toggle .btn-danger,\n.dropdown.open .dropdown-toggle .btn-danger:focus,\n.dropdown.open .dropdown-toggle .btn-danger:active:focus,\n.dropdown.open .dropdown-toggle .btn-danger:hover {\n background: #d32f2f;\n border: 1px solid #d32f2f;\n color: #fff;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-danger.btn-loading,\n.btn-danger.btn-loading:disabled,\n.btn-danger.btn-loading:disabled:hover,\n.btn-danger.btn-loading:hover,\n.btn-danger.btn-loading:focus,\n.btn-danger.btn-loading:active:focus,\n.btn-danger.btn-loading:active {\n color: transparent;\n}\n.btn-default.btn-outline,\n.btn-default.btn-outline:disabled,\n.btn-default.btn-outline:disabled:hover,\n.btn-default.btn-outline.disabled,\n.btn-default.btn-outline.disabled:hover,\n.btn-default.btn-outline.disabled:active {\n background: #ebecf0;\n border: 1px solid #ebecf0;\n color: #172b4d;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default.btn-outline:disabled,\n.btn-default.btn-outline:disabled:hover,\n.btn-default.btn-outline.disabled,\n.btn-default.btn-outline.disabled:hover,\n.btn-default.btn-outline.disabled:active {\n filter: alpha(opacity=25);\n opacity: 0.25;\n}\n.btn-default.btn-outline:hover,\n.btn-default.btn-outline:focus {\n background: #dfe1e6;\n border: 1px solid #dfe1e6;\n color: #172b4d;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default.btn-outline:active:focus,\n.btn-default.btn-outline:active,\n.dropdown.open .btn-default.btn-outline,\n.dropdown.open .btn-default.btn-outline:focus,\n.dropdown.open .btn-default.btn-outline:active:focus,\n.dropdown.open .btn-default.btn-outline:hover {\n background: #c1c7d0;\n border: 1px solid #c1c7d0;\n color: #172b4d;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default.btn-outline.btn-loading,\n.btn-default.btn-outline.btn-loading:disabled,\n.btn-default.btn-outline.btn-loading:disabled:hover,\n.btn-default.btn-outline.btn-loading:hover,\n.btn-default.btn-outline.btn-loading:focus,\n.btn-default.btn-outline.btn-loading:active:focus,\n.btn-default.btn-outline.btn-loading:active {\n background: #ebecf0;\n border: 1px solid #ebecf0;\n color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-primary.btn-outline,\n.btn-primary.btn-outline:disabled,\n.btn-primary.btn-outline:disabled:hover,\n.btn-primary.btn-outline.disabled,\n.btn-primary.btn-outline.disabled:hover,\n.btn-primary.btn-outline.disabled:active {\n background: #2563eb;\n border: 1px solid #2563eb;\n color: #fff;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-primary.btn-outline:disabled,\n.btn-primary.btn-outline:disabled:hover,\n.btn-primary.btn-outline.disabled,\n.btn-primary.btn-outline.disabled:hover,\n.btn-primary.btn-outline.disabled:active {\n filter: alpha(opacity=25);\n opacity: 0.25;\n}\n.btn-primary.btn-outline:hover,\n.btn-primary.btn-outline:focus {\n background: #3b82f6;\n border: 1px solid #3b82f6;\n color: #fff;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-primary.btn-outline:active:focus,\n.btn-primary.btn-outline:active,\n.dropdown.open .btn-primary.btn-outline,\n.dropdown.open .btn-primary.btn-outline:focus,\n.dropdown.open .btn-primary.btn-outline:active:focus,\n.dropdown.open .btn-primary.btn-outline:hover {\n background: #1e40af;\n border: 1px solid #1e40af;\n color: #fff;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-primary.btn-outline.btn-loading,\n.btn-primary.btn-outline.btn-loading:disabled,\n.btn-primary.btn-outline.btn-loading:disabled:hover,\n.btn-primary.btn-outline.btn-loading:hover,\n.btn-primary.btn-outline.btn-loading:focus,\n.btn-primary.btn-outline.btn-loading:active:focus,\n.btn-primary.btn-outline.btn-loading:active {\n background: #2563eb;\n border: 1px solid #2563eb;\n color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.form-social-auth .row {\n margin-top: -6px;\n margin-bottom: -6px;\n}\n.form-social-auth .btn {\n margin: 6px 0px;\n}\ninput.form-control,\ntextarea.form-control {\n border-color: #ced0da;\n box-shadow: inset 0px 0px 0px 1px #ced0da;\n}\ninput.form-control:focus,\ntextarea.form-control:focus {\n border-color: #66afe9;\n box-shadow: inset 0px 0px 0px 1px #66afe9;\n}\n.has-error input.form-control {\n border-color: #ff5630;\n box-shadow: inset 0px 0px 0px 1px #ff5630;\n}\n.has-error input.form-control:focus {\n border-color: #ffa996;\n box-shadow: inset 0px 0px 0px 1px #ffa996;\n}\n.has-success input.form-control {\n border-color: #36b37e;\n box-shadow: inset 0px 0px 0px 1px #36b37e;\n}\n.has-success input.form-control:focus {\n border-color: #79d6af;\n box-shadow: inset 0px 0px 0px 1px #79d6af;\n}\n.password-strength {\n margin-top: 10px;\n}\n.password-strength .text-small {\n margin-top: 4px;\n color: #3462af;\n font-size: 12px;\n}\n.password-strength .progress {\n margin: 0px;\n}\n.auth-message {\n background: #091e42;\n padding: 80px 0px;\n box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.04), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.06);\n}\n.auth-message p {\n color: #fff;\n}\n.auth-message .btn {\n background: #f4f5f7;\n border-color: #f4f5f7;\n color: #172b4d;\n}\n.auth-message .btn:hover,\n.auth-message .btn:focus {\n background: #dfe1e6;\n border-color: #dfe1e6;\n color: #172b4d;\n}\n.auth-message .btn:active {\n background: #b3bac5;\n border-color: #b3bac5;\n color: #172b4d;\n}\n.dropdown-menu {\n border: none;\n box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.04), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n}\n.user-dropdown .dropdown-header strong {\n display: block;\n color: #172b4d;\n font-weight: bold;\n}\n.user-dropdown .dropdown-header .user-stats {\n margin-top: 10px;\n font-size: 12px;\n}\n.user-dropdown .dropdown-header .user-stats .material-icon {\n margin-right: 3px;\n position: relative;\n bottom: 1px;\n width: 14px;\n height: 14px;\n font-size: 14px;\n}\n.user-dropdown .guest-preview {\n padding-bottom: 10px;\n}\n.user-dropdown .badge {\n background-color: #ff5630;\n}\n.user-dropdown a:hover .badge,\n.user-dropdown a:focus .badge,\n.user-dropdown a:active .badge,\n.user-dropdown .btn-link:hover .badge,\n.user-dropdown .btn-link:focus .badge,\n.user-dropdown .btn-link:active .badge {\n background-color: #fff;\n color: #ff5630;\n}\n.mobile-dropdown.open {\n margin: 0px;\n}\n.misago-footer {\n margin-top: 40px;\n}\n.misago-footer .footer-content {\n border-top: 1px solid #ebecf0;\n padding-top: 20px;\n color: #a5adba;\n}\n@media screen and (max-width: 767px) {\n .misago-footer .footer-content {\n text-align: center;\n }\n .misago-footer .footer-content .site-footnote {\n clear: both;\n margin-bottom: 15px;\n }\n}\n.misago-footer .footer-content a,\n.misago-footer .footer-content a:link,\n.misago-footer .footer-content a:visited {\n color: #a5adba;\n}\n.misago-footer .footer-content a:hover,\n.misago-footer .footer-content a:focus {\n color: #7a8699;\n}\n.misago-footer .footer-content .misago-branding,\n.misago-footer .footer-content .misago-branding:link,\n.misago-footer .footer-content .misago-branding:visited {\n color: #a5adba;\n}\n.misago-footer .footer-content .misago-branding:hover,\n.misago-footer .footer-content .misago-branding:focus {\n color: #7a8699;\n}\n.list-group {\n border-radius: 3px;\n}\n.list-group .list-group-item {\n border-left-color: #ebecf0;\n border-right-color: #ebecf0;\n}\n.list-group .list-group-item:first-child {\n border-top-color: #ebecf0;\n}\n.list-group .list-group-item:last-child {\n border-bottom-color: #ebecf0;\n}\n.list-group-item.empty-message {\n padding-top: 20px;\n padding-bottom: 20px;\n text-align: center;\n}\n.list-group-item.empty-message p {\n margin: 10px 0px;\n}\n.nav-side {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.nav-side > .list-group-item {\n border-left: none;\n border-right: none;\n margin-bottom: 1px;\n}\n.nav-side > .list-group-item:first-child {\n border-top: none;\n}\n.nav-side > .list-group-item:last-child {\n border-bottom: none;\n}\n.nav-side > .list-group-item,\n.nav-side > .list-group-item:link,\n.nav-side > .list-group-item:visited {\n background: #f4f5f7;\n border: none;\n color: #172b4d;\n}\n.nav-side > .list-group-item:hover,\n.nav-side > .list-group-item:focus,\n.nav-side > .list-group-item:active {\n background: #ebecf0;\n color: #172b4d;\n}\n.nav-side > .list-group-item.active,\n.nav-side > .list-group-item.active:link,\n.nav-side > .list-group-item.active:visited,\n.nav-side > .list-group-item.active:hover,\n.nav-side > .list-group-item.active:focus,\n.nav-side > .list-group-item.active:active {\n background: #091e42;\n color: #fff;\n font-weight: bold;\n}\n.nav-side > .list-group-item.active .badge,\n.nav-side > .list-group-item.active:link .badge,\n.nav-side > .list-group-item.active:visited .badge,\n.nav-side > .list-group-item.active:hover .badge,\n.nav-side > .list-group-item.active:focus .badge,\n.nav-side > .list-group-item.active:active .badge {\n background: #f4f5f7;\n color: #172b4d;\n}\n.username-history .user-avatar {\n border-radius: 4px;\n}\n.panel {\n border: none;\n border-radius: 4px;\n}\n.panel .panel-heading,\n.panel .panel-footer {\n background: #fff;\n}\n.panel .panel-title {\n color: #5e6c84;\n}\n.panel .form-group + .form-group {\n margin-top: 20px;\n}\n.panel .panel-body > .form-group:first-child {\n margin-top: 10px;\n}\n.panel fieldset {\n margin-top: 20px;\n}\n.panel fieldset:first-child {\n margin-top: 0px;\n}\n.panel fieldset legend {\n border: none;\n color: #5e6c84;\n font-weight: 300;\n}\n.panel-message-body .message-icon {\n color: #2563eb;\n}\n.panel-form {\n border: 1px solid #ebecf0;\n box-shadow: none;\n}\n.panel-form .panel-heading,\n.panel-form .panel-footer {\n border-color: #ebecf0;\n}\n.poll-form .panel {\n margin: 0px;\n}\n.help-block,\n.help-block .text-small {\n color: #7a869a;\n}\n.panel-participants {\n border: 1px solid #ebecf0;\n}\n.participant-card .btn-user {\n border: 0px !important;\n}\n.participant-card .dropdown-header-owner {\n color: #2563eb;\n}\n.participant-card .dropdown-header-owner .material-icon {\n width: 14px;\n height: 14px;\n font-size: 14px;\n line-height: 14px;\n}\n.participant-card .dropdown-header-owner .icon-text {\n margin-left: 4px;\n position: relative;\n top: 2px;\n}\n.panel-participants p {\n color: #7a869a;\n}\n@media screen and (max-width: 767px) {\n .panel-participants p {\n margin-top: 10px;\n text-align: center;\n }\n}\n.panel-poll {\n border: 1px solid #ebecf0;\n}\n.panel-poll .poll-select-choices {\n margin-top: -10px;\n}\n.panel-poll .poll-details {\n margin-bottom: 20px;\n color: #7a869a;\n font-size: 12px;\n}\n.panel-poll .progress {\n margin-top: 6.66666667px;\n margin-bottom: 5px;\n}\n.panel-poll .poll-chart {\n color: #7a869a;\n font-size: 12px;\n}\n.panel-poll .poll-options {\n margin-top: 20px;\n}\n#posting-placeholder {\n background-color: #fafbfc;\n}\n.posting-message .material-icon {\n color: #2563eb;\n}\n.posting-message .btn {\n margin-top: 20px;\n}\n.panel-post {\n background: #fff;\n border: 1px solid #ddd;\n}\n.post-side {\n color: #7a869a;\n}\n.post-side .poster-avatar {\n border-radius: 4px;\n}\n.post-side .user-title {\n color: #5e6c84;\n}\n.post-side .user-title a,\n.post-side .user-title a:link,\n.post-side .user-title a:visited,\n.post-side .user-title a:focus,\n.post-side .user-title a:hover,\n.post-side .user-title a:active {\n color: #5e6c84;\n}\n.post-heading .label-unread {\n background-color: #2563eb;\n margin-right: 16px;\n}\n.post-heading .label-protected {\n margin-left: 24px;\n position: relative;\n top: 1px;\n}\n.post-heading .label-protected .material-icon {\n margin-right: 2px;\n position: relative;\n top: -1px;\n font-size: 16px;\n line-height: 16px;\n}\n.post-heading > .btn-link {\n padding-left: 0px;\n padding-right: 0px;\n}\n.post-heading > .btn-link,\n.post-heading > .btn-link:link,\n.post-heading > .btn-link:visited {\n color: #7a869a;\n}\n.post-heading > .btn-link:hover,\n.post-heading > .btn-link:focus,\n.post-heading > .btn-link:focus:active,\n.post-heading > .btn-link:active {\n color: #172b4d;\n text-decoration: none;\n}\n.post-heading .btn-see-edits {\n margin-left: 24px;\n}\n.post-status-message {\n border-radius: 4px;\n margin-top: 10px;\n padding: 6px 12px;\n}\n@media screen and (max-width: 767px) {\n .post-status-message {\n font-size: 12px;\n }\n .post-status-message .material-icon {\n margin-top: 3px;\n }\n .post-status-message p {\n margin-top: 0px;\n }\n}\n.post-body:last-child {\n padding-bottom: 10px;\n}\n.post-attachments {\n background-color: #ebecf0;\n border: none;\n border-radius: 4px;\n margin-bottom: 30px;\n}\n.post-attachments:last-child {\n margin-bottom: 10px;\n}\n@media screen and (max-width: 767px) {\n .post-attachments {\n border-radius: 0px;\n margin: 0px -15px;\n margin-bottom: 20px;\n }\n}\n.post-footer > .btn-link {\n padding-left: 0px;\n padding-right: 0px;\n}\n.post-footer > .btn-link,\n.post-footer > .btn-link:link,\n.post-footer > .btn-link:visited {\n color: #7a869a;\n}\n.post-footer > .btn-link:hover,\n.post-footer > .btn-link:focus,\n.post-footer > .btn-link:focus:active,\n.post-footer > .btn-link:active {\n color: #172b4d;\n text-decoration: none;\n}\n.post-footer p {\n color: #7a869a;\n font-size: 12px;\n}\n.post-body-hidden,\n.post-body-invalid {\n padding-top: 10px;\n padding-bottom: 10px;\n}\n.post-body-hidden .lead,\n.post-body-invalid .lead {\n margin-bottom: 10px;\n}\n.post-body-hidden .text-muted,\n.post-body-invalid .text-muted {\n margin-bottom: 0px;\n font-size: 12px;\n}\n.post-hidden {\n filter: alpha(opacity=75);\n opacity: 0.75;\n}\n.post-feed .panel-body {\n padding-bottom: 0px;\n}\n.post-feed .post-body {\n position: relative;\n padding-top: 0px;\n padding-bottom: 20px;\n max-height: 300px;\n overflow-y: hidden;\n}\n.post-feed .post-body:after {\n box-shadow: 0px 0px 16px 16px #ffffff;\n display: block;\n position: absolute;\n bottom: 0px;\n height: 0px;\n width: 100%;\n content: \"-\";\n color: transparent;\n}\n.posts-list .event .event-label {\n margin-bottom: 5px;\n}\n.posts-list .event .label-unread {\n background-color: #2563eb;\n color: #fff;\n}\n.posts-list .event-info a,\n.posts-list .event-info a:link,\n.posts-list .event-info a:visited,\n.posts-list .event-info .btn-link {\n color: #5e6c84;\n}\n.posts-list .event-info a:focus,\n.posts-list .event-info a:active,\n.posts-list .event-info a:focus:active,\n.posts-list .event-info .btn-link:focus,\n.posts-list .event-info .btn-link:active,\n.posts-list .event-info .btn-link:focus:active {\n color: #172b4d;\n}\n.posts-list .event-hidden {\n filter: alpha(opacity=33);\n opacity: 0.33;\n}\n.user-card {\n background: #f4f5f7;\n}\n.user-card-small-avatar img,\n.user-card-avatar img {\n border-radius: 4px;\n}\n.user-card-avatar {\n margin: 20px 0px;\n}\n.user-card-avatar img {\n width: 150px;\n height: 150px;\n}\n.user-card-username a,\n.user-card-username a:link,\n.user-card-username a:visited,\n.user-card-username a:hover,\n.user-card-username a:focus,\n.user-card-username a:active {\n color: #172b4d;\n font-size: 18px;\n font-weight: bold;\n}\n.user-card-title span,\n.user-card-title a,\n.user-card-title a:link,\n.user-card-title a:visited {\n color: #5e6c84;\n}\n.user-card-title a:focus,\n.user-card-title a:hover,\n.user-card-title a:active {\n color: #172b4d;\n}\n@media screen and (min-width: 768px) {\n .user-card-stats {\n margin-top: 20px;\n }\n}\n.user-card-stats ul {\n margin: 0px;\n}\n.user-card-stats li {\n display: inline-block;\n margin-right: 12px;\n color: #7a869a;\n font-size: 12px;\n}\n@media screen and (min-width: 768px) {\n .user-card-stats li {\n margin: 0px 6px;\n }\n}\n.user-card-stats li.user-stat-empty {\n display: none;\n}\n@media screen and (min-width: 768px) {\n li.user-stat-divider {\n display: block;\n margin: 0px;\n }\n}\n@media screen and (max-width: 767px) {\n li.user-stat-divider {\n display: none;\n }\n}\n@media screen and (min-width: 768px) {\n .user-card-stats {\n min-height: 60px;\n }\n}\n@media screen and (max-width: 767px) {\n .user-card-left {\n padding-right: 0px;\n }\n}\n.progress,\n.progress .progress-bar {\n -webkit-box-shadow: none;\n box-shadow: none;\n height: 8px;\n}\n.misago-markup img {\n border-radius: 4px;\n}\n.misago-markup .spoiler-body {\n background: transparent;\n -webkit-filter: blur(5px);\n -moz-filter: blur(5px);\n -o-filter: blur(5px);\n -ms-filter: blur(5px);\n filter: blur(5px);\n color: #172b4d;\n}\n.misago-markup .spoiler-block.revealed .spoiler-body {\n -webkit-filter: none;\n -moz-filter: none;\n -o-filter: none;\n -ms-filter: none;\n filter: none;\n}\n.misago-markup .spoiler-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.1);\n}\n.misago-markup .spoiler-reveal {\n color: #172b4d;\n background-color: #ebecf0;\n border-color: #ccc;\n}\n.misago-markup .spoiler-reveal:focus,\n.misago-markup .spoiler-reveal.focus {\n color: #172b4d;\n background-color: #ced0da;\n border-color: #8c8c8c;\n}\n.misago-markup .spoiler-reveal:hover {\n color: #172b4d;\n background-color: #ced0da;\n border-color: #adadad;\n}\n.misago-markup .spoiler-reveal:active,\n.misago-markup .spoiler-reveal.active,\n.open > .dropdown-toggle.misago-markup .spoiler-reveal {\n color: #172b4d;\n background-color: #ced0da;\n background-image: none;\n border-color: #adadad;\n}\n.misago-markup .spoiler-reveal:active:hover,\n.misago-markup .spoiler-reveal.active:hover,\n.open > .dropdown-toggle.misago-markup .spoiler-reveal:hover,\n.misago-markup .spoiler-reveal:active:focus,\n.misago-markup .spoiler-reveal.active:focus,\n.open > .dropdown-toggle.misago-markup .spoiler-reveal:focus,\n.misago-markup .spoiler-reveal:active.focus,\n.misago-markup .spoiler-reveal.active.focus,\n.open > .dropdown-toggle.misago-markup .spoiler-reveal.focus {\n color: #172b4d;\n background-color: #b9bdcb;\n border-color: #8c8c8c;\n}\n.misago-markup .spoiler-reveal.disabled:hover,\n.misago-markup .spoiler-reveal[disabled]:hover,\nfieldset[disabled] .misago-markup .spoiler-reveal:hover,\n.misago-markup .spoiler-reveal.disabled:focus,\n.misago-markup .spoiler-reveal[disabled]:focus,\nfieldset[disabled] .misago-markup .spoiler-reveal:focus,\n.misago-markup .spoiler-reveal.disabled.focus,\n.misago-markup .spoiler-reveal[disabled].focus,\nfieldset[disabled] .misago-markup .spoiler-reveal.focus {\n background-color: #ebecf0;\n border-color: #ccc;\n}\n.misago-markup .spoiler-reveal .badge {\n color: #ebecf0;\n background-color: #172b4d;\n}\n.misago-markup .spoiler-reveal,\n.misago-markup .spoiler-reveal:disabled,\n.misago-markup .spoiler-reveal:disabled:hover,\n.misago-markup .spoiler-reveal.disabled,\n.misago-markup .spoiler-reveal.disabled:hover,\n.misago-markup .spoiler-reveal.disabled:active {\n background: #ebecf0;\n border: 1px solid #ebecf0;\n color: #172b4d;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.misago-markup .spoiler-reveal:disabled,\n.misago-markup .spoiler-reveal:disabled:hover,\n.misago-markup .spoiler-reveal.disabled,\n.misago-markup .spoiler-reveal.disabled:hover,\n.misago-markup .spoiler-reveal.disabled:active {\n filter: alpha(opacity=25);\n opacity: 0.25;\n}\n.misago-markup .spoiler-reveal:hover,\n.misago-markup .spoiler-reveal:focus {\n background: #dfe1e6;\n border: 1px solid #dfe1e6;\n color: #172b4d;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.misago-markup .spoiler-reveal:active:focus,\n.misago-markup .spoiler-reveal:active,\n.dropdown.open .dropdown-toggle .misago-markup .spoiler-reveal,\n.dropdown.open .dropdown-toggle .misago-markup .spoiler-reveal:focus,\n.dropdown.open .dropdown-toggle .misago-markup .spoiler-reveal:active:focus,\n.dropdown.open .dropdown-toggle .misago-markup .spoiler-reveal:hover {\n background: #c1c7d0;\n border: 1px solid #c1c7d0;\n color: #172b4d;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.misago-markup .spoiler-reveal.btn-loading,\n.misago-markup .spoiler-reveal.btn-loading:disabled,\n.misago-markup .spoiler-reveal.btn-loading:disabled:hover,\n.misago-markup .spoiler-reveal.btn-loading:hover,\n.misago-markup .spoiler-reveal.btn-loading:focus,\n.misago-markup .spoiler-reveal.btn-loading:active:focus,\n.misago-markup .spoiler-reveal.btn-loading:active {\n color: transparent;\n}\n.misago-markup .spoiler-reveal,\n.misago-markup .spoiler-reveal:active,\n.misago-markup .spoiler-reveal:hover {\n border-radius: 4px;\n box-shadow: 0px 0px 0px 4px #fff;\n padding: 6px 12px;\n}\n.modal-header {\n background: #fff;\n border-bottom-color: #ced0da;\n border-radius: 6px 6px 0px 0px;\n color: #172b4d;\n}\n.modal-header .close {\n padding: 0px 6px;\n color: #172b4d;\n font-size: 24px;\n line-height: 24px;\n text-shadow: none;\n}\n.modal-message .message-icon {\n color: #2563eb;\n}\n.modal-body > .form-group {\n margin: 20px 0px;\n}\n.modal-body > .form-group:first-child {\n margin-top: 0px;\n}\n.modal-body > .form-group:last-child {\n margin-bottom: 0px;\n}\n.modal-sign-in .modal-body {\n padding-top: 0px;\n padding-bottom: 0px;\n}\n.modal-sign-in .modal-body > .form-group {\n margin: 20px 0px;\n}\n.legal-footnote label {\n font-weight: bold;\n}\n.legal-footnote .help-block {\n margin-left: 20px;\n color: #ff5630;\n}\n.modal-avatar-index .avatar-preview {\n background: #fff;\n border-radius: 6px;\n}\n.modal-avatar-crop .cropit-preview {\n background: #fff;\n margin: 20px 0px;\n}\n.modal-avatar-crop .cropit-image-zoom-input {\n margin-top: 40px;\n margin-bottom: 20px;\n}\n.modal-post-likers .media {\n border-bottom: 1px solid #ebecf0;\n padding-bottom: 15px;\n}\n.modal-post-likers .media img {\n border-radius: 4px;\n width: 40px;\n height: 40px;\n}\n.modal-post-likers .media:last-child {\n border: none;\n padding-bottom: 0px;\n}\n.well {\n border: 1px solid #ddd;\n}\n.active-posters .rank-user-avatar img {\n border-radius: 4px;\n}\n.active-posters .user-details {\n color: #7a869a;\n}\n.active-posters .user-details a.rank-name,\n.active-posters .user-details a.rank-name:link,\n.active-posters .user-details a.rank-name:visited {\n color: #5e6c84;\n font-weight: normal;\n}\n.active-posters .user-details a.rank-name:focus,\n.active-posters .user-details a.rank-name:hover,\n.active-posters .user-details a.rank-name:active {\n color: #172b4d;\n}\n.active-posters .user-details span.rank-name {\n color: #5e6c84;\n font-weight: normal;\n}\n.active-posters small {\n color: #7a869a;\n}\n.page-error .message-icon {\n color: #ef5350;\n}\n.page-message .message-icon {\n color: #2563eb;\n}\n.page-message-info .message-icon {\n color: #2563eb;\n}\n.page-message-success .message-icon {\n color: #81c784;\n}\n.page-account-settings .help-block a,\n.page-account-settings .help-block a:link,\n.page-account-settings .help-block a:visited {\n color: #5e6c84;\n}\n.page-account-settings .help-block a:hover,\n.page-account-settings .help-block a:focus,\n.page-account-settings .help-block a:focus:active,\n.page-account-settings .help-block a:active {\n color: #172b4d;\n}\n.panel-profile-details-group.panel {\n border: 1px solid #ebecf0;\n}\n.panel-profile-details-group.panel .form-group {\n margin: 0px;\n}\n.panel-profile-details-group .form-control-static p:last-child {\n margin-bottom: 0px;\n}\n.post-primary .panel-post {\n border-color: #a5b4fc;\n}\n.post-primary .user-title {\n color: #6366f1;\n}\n.post-primary .user-title a,\n.post-primary .user-title a:link,\n.post-primary .user-title a:visited,\n.post-primary .user-title a:focus,\n.post-primary .user-title a:hover,\n.post-primary .user-title a:active {\n color: #6366f1;\n}\n.post-success .panel-post {\n border-color: #00c853;\n}\n.post-success .user-title {\n color: #388e3c;\n}\n.post-success .user-title a,\n.post-success .user-title a:link,\n.post-success .user-title a:visited,\n.post-success .user-title a:focus,\n.post-success .user-title a:hover,\n.post-success .user-title a:active {\n color: #388e3c;\n}\n.post-warning .panel-post {\n border-color: #ffab40;\n}\n.post-warning .user-title {\n color: #ff6d00;\n}\n.post-warning .user-title a,\n.post-warning .user-title a:link,\n.post-warning .user-title a:visited,\n.post-warning .user-title a:focus,\n.post-warning .user-title a:hover,\n.post-warning .user-title a:active {\n color: #ff6d00;\n}\n.post-danger .panel-post {\n border-color: #ff8a80;\n}\n.post-danger .user-title {\n color: #d50000;\n}\n.post-danger .user-title a,\n.post-danger .user-title a:link,\n.post-danger .user-title a:visited,\n.post-danger .user-title a:focus,\n.post-danger .user-title a:hover,\n.post-danger .user-title a:active {\n color: #d50000;\n}\n.user-card-primary .panel-body {\n background: #fff;\n border: 2px solid #a5b4fc;\n border-radius: 4px;\n padding: 13px;\n}\n.user-card-primary .user-card-title {\n color: #6366f1;\n}\n.user-card-primary .user-card-title a.user-title,\n.user-card-primary .user-card-title a.user-title:link,\n.user-card-primary .user-card-title a.user-title:visited,\n.user-card-primary .user-card-title a.user-title:focus,\n.user-card-primary .user-card-title a.user-title:hover,\n.user-card-primary .user-card-title a.user-title:active {\n color: #6366f1;\n}\n.user-card-success .panel-body {\n background: #fff;\n border: 2px solid #00c853;\n border-radius: 4px;\n padding: 13px;\n}\n.user-card-success .user-card-title {\n color: #388e3c;\n}\n.user-card-success .user-card-title a.user-title,\n.user-card-success .user-card-title a.user-title:link,\n.user-card-success .user-card-title a.user-title:visited,\n.user-card-success .user-card-title a.user-title:focus,\n.user-card-success .user-card-title a.user-title:hover,\n.user-card-success .user-card-title a.user-title:active {\n color: #388e3c;\n}\n.user-card-warning .panel-body {\n background: #fff;\n border: 2px solid #ffab40;\n border-radius: 4px;\n padding: 13px;\n}\n.user-card-warning .user-card-title {\n color: #ff6d00;\n}\n.user-card-warning .user-card-title a.user-title,\n.user-card-warning .user-card-title a.user-title:link,\n.user-card-warning .user-card-title a.user-title:visited,\n.user-card-warning .user-card-title a.user-title:focus,\n.user-card-warning .user-card-title a.user-title:hover,\n.user-card-warning .user-card-title a.user-title:active {\n color: #ff6d00;\n}\n.user-card-danger .panel-body {\n background: #fff;\n border: 2px solid #ff8a80;\n border-radius: 4px;\n padding: 13px;\n}\n.user-card-danger .user-card-title {\n color: #d50000;\n}\n.user-card-danger .user-card-title a.user-title,\n.user-card-danger .user-card-title a.user-title:link,\n.user-card-danger .user-card-title a.user-title:visited,\n.user-card-danger .user-card-title a.user-title:focus,\n.user-card-danger .user-card-title a.user-title:hover,\n.user-card-danger .user-card-title a.user-title:active {\n color: #d50000;\n}\n.list-group .list-group-rank-primary {\n border-left: 4px solid #a5b4fc;\n padding-left: 11px;\n}\n.list-group .list-group-rank-primary span.rank-name {\n color: #6366f1;\n}\n.list-group .list-group-rank-primary a.rank-name,\n.list-group .list-group-rank-primary a.rank-name:link,\n.list-group .list-group-rank-primary a.rank-name:visited,\n.list-group .list-group-rank-primary a.rank-name:focus,\n.list-group .list-group-rank-primary a.rank-name:hover,\n.list-group .list-group-rank-primary a.rank-name:active {\n color: #6366f1;\n}\n.list-group .list-group-rank-success {\n border-left: 4px solid #9ccc65;\n padding-left: 11px;\n}\n.list-group .list-group-rank-success span.rank-name {\n color: #388e3c;\n}\n.list-group .list-group-rank-success a.rank-name,\n.list-group .list-group-rank-success a.rank-name:link,\n.list-group .list-group-rank-success a.rank-name:visited,\n.list-group .list-group-rank-success a.rank-name:focus,\n.list-group .list-group-rank-success a.rank-name:hover,\n.list-group .list-group-rank-success a.rank-name:active {\n color: #388e3c;\n}\n.list-group .list-group-rank-warning {\n border-left: 4px solid #ff7043;\n padding-left: 11px;\n}\n.list-group .list-group-rank-warning span.rank-name {\n color: #ff6d00;\n}\n.list-group .list-group-rank-warning a.rank-name,\n.list-group .list-group-rank-warning a.rank-name:link,\n.list-group .list-group-rank-warning a.rank-name:visited,\n.list-group .list-group-rank-warning a.rank-name:focus,\n.list-group .list-group-rank-warning a.rank-name:hover,\n.list-group .list-group-rank-warning a.rank-name:active {\n color: #ff6d00;\n}\n.list-group .list-group-rank-danger {\n border-left: 4px solid #f44336;\n padding-left: 11px;\n}\n.list-group .list-group-rank-danger span.rank-name {\n color: #d50000;\n}\n.list-group .list-group-rank-danger a.rank-name,\n.list-group .list-group-rank-danger a.rank-name:link,\n.list-group .list-group-rank-danger a.rank-name:visited,\n.list-group .list-group-rank-danger a.rank-name:focus,\n.list-group .list-group-rank-danger a.rank-name:hover,\n.list-group .list-group-rank-danger a.rank-name:active {\n color: #d50000;\n}\n.page-header-rank-primary .user-rank {\n color: #6366f1;\n}\n.page-header-rank-primary .user-rank a,\n.page-header-rank-primary .user-rank a:link,\n.page-header-rank-primary .user-rank a:visited,\n.page-header-rank-primary .user-rank a:focus,\n.page-header-rank-primary .user-rank a:hover,\n.page-header-rank-primary .user-rank a:active {\n color: #6366f1;\n}\n.page-header-rank-success .user-rank {\n color: #388e3c;\n}\n.page-header-rank-success .user-rank a,\n.page-header-rank-success .user-rank a:link,\n.page-header-rank-success .user-rank a:visited,\n.page-header-rank-success .user-rank a:focus,\n.page-header-rank-success .user-rank a:hover,\n.page-header-rank-success .user-rank a:active {\n color: #388e3c;\n}\n.page-header-rank-warning .user-rank {\n color: #ff6d00;\n}\n.page-header-rank-warning .user-rank a,\n.page-header-rank-warning .user-rank a:link,\n.page-header-rank-warning .user-rank a:visited,\n.page-header-rank-warning .user-rank a:focus,\n.page-header-rank-warning .user-rank a:hover,\n.page-header-rank-warning .user-rank a:active {\n color: #ff6d00;\n}\n.page-header-rank-danger .user-rank {\n color: #d50000;\n}\n.page-header-rank-danger .user-rank a,\n.page-header-rank-danger .user-rank a:link,\n.page-header-rank-danger .user-rank a:visited,\n.page-header-rank-danger .user-rank a:focus,\n.page-header-rank-danger .user-rank a:hover,\n.page-header-rank-danger .user-rank a:active {\n color: #d50000;\n}\n.d-js-block,\n.d-js-flex {\n display: none;\n}\n.misago-javascript .d-js-block {\n display: block;\n}\n.misago-javascript .d-js-flex {\n display: flex;\n}\n","// stylelint-disable\n\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// 1. Remove the bottom border in Chrome 57- and Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n//\n\nabbr[title] {\n border-bottom: none; // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important; // Black prints faster: h5bp.com/s\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n}\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// https://getbootstrap.com/docs/3.4/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// stylelint-disable media-feature-name-no-vendor-prefix, media-feature-parentheses-space-inside, media-feature-name-no-unknown, indentation, at-rule-name-space-after\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","// stylelint-disable selector-list-comma-newline-after, selector-no-qualifying-type\n\n//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: 400;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n padding: .2em;\n background-color: @state-warning-bg;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: \"\\2014 \\00A0\"; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: \"\"; }\n &:after {\n content: \"\\00A0 \\2014\"; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n color: @pre-color;\n word-break: break-all;\n word-wrap: break-word;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n padding-right: ceil((@gutter / 2));\n padding-left: floor((@gutter / 2));\n margin-right: auto;\n margin-left: auto;\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-right: floor((@gutter / -2));\n margin-left: ceil((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// stylelint-disable declaration-no-important, at-rule-no-vendor-prefix\n\n//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: https://getbootstrap.com/docs/3.4/getting-started/#support-ie10-width\n// Source: https://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: https://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-right: floor((@grid-gutter-width / 2));\n padding-left: ceil((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","// stylelint-disable selector-max-type, selector-max-compound-selectors, selector-no-qualifying-type\n\n//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n\n // Table cell sizing\n //\n // Reset default table behavior\n\n col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-column;\n float: none;\n }\n\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-cell;\n float: none;\n }\n }\n}\n\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\n\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n min-height: .01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n overflow-x: auto;\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * .75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type, property-no-vendor-prefix, media-feature-name-no-vendor-prefix\n\n//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: 700;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\ninput[type=\"search\"] {\n // Override content-box in Normalize (* isn't specific enough)\n .box-sizing(border-box);\n\n // Search inputs in iOS\n //\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n -webkit-appearance: none;\n appearance: none;\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n\n // Apply same disabled cursor tweak as for inputs\n // Some special care is needed because
    \n )\n}\n\nfunction ExampleFormatting({ markup, result }) {\n return (\n
    \n
    \n
    \n          {markup}\n        
    \n
    \n
    \n
    {result}
    \n
    \n
    \n )\n}\n\nclass ExampleFormattingSpoiler extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n reveal: false,\n }\n }\n\n render() {\n return (\n \n
    \n

    {this.props.children}

    \n
    \n {!this.state.reveal && (\n
    \n {\n this.setState({ reveal: true })\n }}\n >\n {gettext(\"Reveal spoiler\")}\n \n
    \n )}\n \n )\n }\n}\n","const URL_PATTERN = new RegExp(\"^(((ftps?)|(https?))://)\", \"i\")\n\nexport default function isUrl(str) {\n return URL_PATTERN.test(str.trim())\n}\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport isUrl from \"./isUrl\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupImageModal extends React.Component {\n constructor(props) {\n super(props)\n\n const text = props.selection.text.trim()\n const textUrl = isUrl(text)\n\n this.state = {\n error: null,\n text: textUrl ? \"\" : text,\n url: textUrl ? text : \"\",\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const text = this.state.text.trim()\n const url = this.state.url.trim()\n\n if (url.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n if (text.length > 0) {\n replaceSelection(selection, update, \"![\" + text + \"](\" + url + \")\")\n } else {\n replaceSelection(selection, update, \"!(\" + url + \")\")\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Image\")}\n

    \n
    \n
    \n
    \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n \n \n this.setState({ url: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupImageModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport isUrl from \"./isUrl\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupLinkModal extends React.Component {\n constructor(props) {\n super(props)\n\n const text = props.selection.text.trim()\n const textUrl = isUrl(text)\n\n this.state = {\n error: null,\n text: textUrl ? \"\" : text,\n url: textUrl ? text : \"\",\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const text = this.state.text.trim()\n const url = this.state.url.trim()\n\n if (url.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n if (text.length > 0) {\n replaceSelection(selection, update, \"[\" + text + \"](\" + url + \")\")\n } else {\n replaceSelection(selection, update, \"<\" + url + \">\")\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {pgettext(\"markup editor\", \"Link\")}

    \n
    \n
    \n
    \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n \n \n this.setState({ url: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupLinkModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupQuoteModal extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: null,\n author: \"\",\n text: props.selection.text,\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const author = this.state.author.trim()\n const text = this.state.text.trim()\n\n if (text.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n if (author) {\n replaceSelection(\n selection,\n update,\n prefix + '[quote=\"' + author + '\"]\\n' + text + \"\\n[/quote]\\n\\n\"\n )\n } else {\n replaceSelection(\n selection,\n update,\n prefix + \"[quote]\\n\" + text + \"\\n[/quote]\\n\\n\"\n )\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Quote\")}\n

    \n
    \n
    \n
    \n \n \n this.setState({ author: event.target.value })\n }\n />\n \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupQuoteModal\n","import React from \"react\"\n\nconst MarkupEditorButton = ({ disabled, icon, title, onClick }) => (\n \n {icon}\n \n)\n\nexport default MarkupEditorButton\n","import moment from \"moment\"\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport formatFilesize from \"../../utils/file-size\"\nimport getRandomString from \"../../utils/getRandomString\"\n\nconst ID_LEN = 32\n\nconst uploadFile = (file, setState) => {\n const maxSize = misago.get(\"user\").acl.max_attachment_size * 1024\n\n if (file.size > maxSize) {\n snackbar.error(\n interpolate(\n pgettext(\n \"markup editor\",\n \"File %(filename)s is bigger than %(limit)s.\"\n ),\n { filename: file.name, limit: formatFilesize(maxSize) },\n true\n )\n )\n\n return\n }\n\n let upload = {\n id: null,\n key: getRandomString(ID_LEN),\n error: null,\n uploaded_on: null,\n progress: 0,\n filename: file.name,\n filetype: null,\n is_image: false,\n size: file.size,\n url: null,\n uploader_name: null,\n }\n\n setState(({ attachments }) => {\n return { attachments: [upload].concat(attachments) }\n })\n\n const refreshState = () => {\n setState(({ attachments }) => {\n return { attachments: attachments.concat() }\n })\n }\n\n const data = new FormData()\n data.append(\"upload\", file)\n\n ajax\n .upload(misago.get(\"ATTACHMENTS_API\"), data, (progress) => {\n upload.progress = progress\n refreshState()\n })\n .then(\n (data) => {\n Object.assign(upload, data, { uploaded_on: moment(data.uploaded_on) })\n refreshState()\n },\n (rejection) => {\n if (rejection.status === 400 || rejection.status === 413) {\n upload.error = rejection.detail\n snackbar.error(rejection.detail)\n refreshState()\n } else {\n snackbar.apiError(rejection)\n }\n }\n )\n}\n\nexport default uploadFile\n","import React from \"react\"\nimport misago from \"../../\"\nimport modal from \"../../services/modal\"\nimport MarkupCodeModal from \"./MarkupCodeModal\"\nimport MarkupFormattingHelpModal from \"./MarkupFormattingHelpModal\"\nimport MarkupImageModal from \"./MarkupImageModal\"\nimport MarkupLinkModal from \"./MarkupLinkModal\"\nimport MarkupQuoteModal from \"./MarkupQuoteModal\"\nimport MarkupEditorButton from \"./MarkupEditorButton\"\nimport { getSelection, replaceSelection, wrapSelection } from \"./operations\"\nimport uploadFile from \"./uploadFile\"\n\nconst MarkupEditorToolbar = ({\n disabled,\n element,\n update,\n updateAttachments,\n}) => {\n const actions = [\n {\n name: pgettext(\"markup editor\", \"Strong\"),\n icon: \"format_bold\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"**\",\n \"**\",\n pgettext(\"example markup\", \"Strong text\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Emphasis\"),\n icon: \"format_italic\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"*\",\n \"*\",\n pgettext(\"example markup\", \"Text with emphasis\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Strikethrough\"),\n icon: \"format_strikethrough\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"~~\",\n \"~~\",\n pgettext(\"example markup\", \"Text with strikethrough\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Horizontal ruler\"),\n icon: \"remove\",\n onClick: () => {\n replaceSelection(getSelection(element), update, \"\\n\\n- - -\\n\\n\")\n },\n },\n {\n name: pgettext(\"markup editor\", \"Link\"),\n icon: \"insert_link\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Image\"),\n icon: \"insert_photo\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Quote\"),\n icon: \"format_quote\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Spoiler\"),\n icon: \"visibility_off\",\n onClick: () => {\n insertSpoiler(element, update)\n },\n },\n {\n name: pgettext(\"markup editor\", \"Code\"),\n icon: \"code\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n ]\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n actions.push({\n name: pgettext(\"markup editor\", \"Upload file\"),\n icon: \"file_upload\",\n onClick: () => uploadFiles(updateAttachments),\n })\n }\n\n return (\n
    \n
    \n {actions.map(({ name, icon, onClick }) => (\n \n ))}\n
    \n
    \n
    \n \n more_vert\n \n
      \n {actions.map(({ name, icon, onClick }) => (\n
    • \n \n {icon}\n {name}\n \n
    • \n ))}\n
    \n
    \n {\n modal.show()\n }}\n />\n
    \n
    \n )\n}\n\nconst insertSpoiler = (element, update) => {\n const selection = getSelection(element)\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n wrapSelection(\n selection,\n update,\n prefix + \"[spoiler]\\n\",\n \"\\n[/spoiler]\\n\\n\",\n pgettext(\"markup editor\", \"Spoiler text\")\n )\n}\n\nconst uploadFiles = (setState) => {\n const input = document.createElement(\"input\")\n input.type = \"file\"\n input.multiple = \"multiple\"\n\n input.addEventListener(\"change\", function () {\n for (let i = 0; i < input.files.length; i++) {\n uploadFile(input.files[i], setState)\n }\n })\n\n input.click()\n}\n\nexport default MarkupEditorToolbar\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport MisagoMarkup from \"../misago-markup\"\nimport MarkupEditorAttachments from \"./MarkupEditorAttachments\"\nimport MarkupEditorFooter from \"./MarkupEditorFooter\"\nimport MarkupEditorToolbar from \"./MarkupEditorToolbar\"\nimport uploadFile from \"./uploadFile\"\n\nclass MarkupEditor extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n element: null,\n focused: false,\n loading: false,\n preview: false,\n parsed: null,\n }\n }\n\n showPreview = () => {\n if (this.state.loading) return\n\n this.setState({ loading: true, preview: true, element: null })\n\n ajax.post(misago.get(\"PARSE_MARKUP_API\"), { post: this.props.value }).then(\n (data) => {\n this.setState({ loading: false, parsed: data.parsed })\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n this.setState({ loading: false, preview: false })\n }\n )\n }\n\n closePreview = () => {\n this.setState({ loading: false, preview: false })\n }\n\n onDrop = (event) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!event.dataTransfer.files) return\n\n const { onAttachmentsChange: setState } = this.props\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n for (let i = 0; i < event.dataTransfer.files.length; i++) {\n const file = event.dataTransfer.files[i]\n uploadFile(file, setState)\n }\n }\n }\n\n onPaste = (event) => {\n const { onAttachmentsChange: setState } = this.props\n\n const files = []\n for (let i = 0; i < event.clipboardData.items.length; i++) {\n const item = event.clipboardData.items[i]\n if (item.kind === \"file\") {\n files.push(item.getAsFile())\n }\n }\n\n if (files.length) {\n event.preventDefault()\n event.stopPropagation()\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n for (let i = 0; i < files.length; i++) {\n uploadFile(files[i], setState)\n }\n }\n }\n }\n\n render = () => (\n \n this.props.onChange({ target: { value } })}\n updateAttachments={this.props.onAttachmentsChange}\n />\n {this.state.preview ? (\n
    \n {this.state.loading ? (\n
    \n
    \n \n
    \n
    \n ) : (\n \n )}\n
    \n ) : (\n {\n if (element && this.state.element !== element) {\n this.setState({ element })\n setMentions(this.props, element)\n }\n }}\n onChange={this.props.onChange}\n onDrop={this.onDrop}\n onFocus={() => this.setState({ focused: true })}\n onPaste={this.onPaste}\n onBlur={() => this.setState({ focused: false })}\n />\n )}\n {this.props.attachments.length > 0 && (\n this.props.onChange({ target: { value } })}\n />\n )}\n \n
    \n )\n}\n\nfunction setMentions(props, element) {\n $(element).atwho({\n at: \"@\",\n displayTpl: '
  • \"\"${username}
  • ',\n insertTpl: \"@${username}\",\n searchKey: \"username\",\n callbacks: {\n remoteFilter: function (query, callback) {\n $.getJSON(misago.get(\"MENTION_API\"), { q: query }, callback)\n },\n },\n })\n\n $(element).on(\"inserted.atwho\", (event, _storage, source, controller) => {\n const { query } = controller\n const username = source.target.innerText.trim()\n const prefix = event.target.value.substr(0, query.headPos)\n const suffix = event.target.value.substr(query.endPos)\n\n event.target.value = prefix + username + suffix\n props.onChange(event)\n\n const caret = query.headPos + username.length\n event.target.setSelectionRange(caret, caret)\n event.target.focus()\n })\n}\n\nexport default MarkupEditor\n","import MarkupEditor from \"./MarkupEditor\"\n\nexport default MarkupEditor\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nconst CLASS_ACTIVE = \"posting-active\"\nconst CLASS_DEFAULT = \"posting-default\"\nconst CLASS_MINIMIZED = \"posting-minimized\"\nconst CLASS_FULLSCREEN = \"posting-fullscreen\"\n\nclass PostingDialog extends React.Component {\n componentDidMount() {\n document.body.classList.add(CLASS_ACTIVE, CLASS_DEFAULT)\n }\n\n componentWillUnmount() {\n document.body.classList.remove(\n CLASS_ACTIVE,\n CLASS_DEFAULT,\n CLASS_MINIMIZED,\n CLASS_FULLSCREEN\n )\n }\n\n componentWillReceiveProps({ fullscreen, minimized }) {\n if (minimized) {\n document.body.classList.remove(CLASS_DEFAULT, CLASS_FULLSCREEN)\n document.body.classList.add(CLASS_MINIMIZED)\n } else {\n if (fullscreen) {\n document.body.classList.remove(CLASS_DEFAULT, CLASS_MINIMIZED)\n document.body.classList.add(CLASS_FULLSCREEN)\n } else {\n document.body.classList.remove(CLASS_FULLSCREEN, CLASS_MINIMIZED)\n document.body.classList.add(CLASS_DEFAULT)\n }\n }\n }\n\n render() {\n const { children, fullscreen, minimized } = this.props\n\n return (\n \n
    {children}
    \n
    \n )\n }\n}\n\nexport default PostingDialog\n","import React from \"react\"\n\nconst PostingDialogBody = ({ children }) => (\n
    {children}
    \n)\n\nexport default PostingDialogBody\n","import React from \"react\"\n\nconst PostingDialogError = ({ close, message }) => (\n
    \n
    \n error_outlined\n
    \n
    \n

    {message}

    \n \n
    \n
    \n)\n\nexport default PostingDialogError\n","import React from \"react\"\n\nconst PostingDialogHeader = ({\n children,\n close,\n fullscreen,\n minimize,\n minimized,\n fullscreenEnter,\n fullscreenExit,\n open,\n}) => (\n
    \n
    {children}
    \n {minimized ? (\n \n expand_less\n \n ) : (\n \n expand_more\n \n )}\n {fullscreen ? (\n \n fullscreen_exit\n \n ) : (\n \n fullscreen\n \n )}\n \n close\n \n
    \n)\n\nexport default PostingDialogHeader\n","import React from \"react\"\n\nexport default function PostingThreadOptions({\n isClosed,\n isHidden,\n isPinned,\n disabled,\n options,\n close,\n open,\n hide,\n unhide,\n pinGlobally,\n pinLocally,\n unpin,\n}) {\n const icons = getIcons(isClosed, isHidden, isPinned)\n\n return (\n
    \n \n {icons.length > 0 ? (\n \n {icons.map((icon) => (\n \n {icon}\n \n ))}\n \n ) : (\n more_horiz\n )}\n \n
      \n {options.pin === 2 && isPinned !== 2 && (\n
    • \n \n bookmark\n {pgettext(\"post thread\", \"Pinned globally\")}\n \n
    • \n )}\n {options.pin >= isPinned && isPinned !== 1 && (\n
    • \n \n bookmark_outline\n {pgettext(\"post thread\", \"Pinned in category\")}\n \n
    • \n )}\n {options.pin >= isPinned && isPinned !== 0 && (\n
    • \n \n radio_button_unchecked\n {pgettext(\"post thread\", \"Not pinned\")}\n \n
    • \n )}\n {options.close && !!isClosed && (\n
    • \n \n lock_outline\n {pgettext(\"post thread\", \"Open\")}\n \n
    • \n )}\n {options.close && !isClosed && (\n
    • \n \n lock\n {pgettext(\"post thread\", \"Closed\")}\n \n
    • \n )}\n {options.hide && !!isHidden && (\n
    • \n \n visibility\n {pgettext(\"post thread\", \"Visible\")}\n \n
    • \n )}\n {options.hide && !isHidden && (\n
    • \n \n visibility_off\n {pgettext(\"post thread\", \"Hidden\")}\n \n
    • \n )}\n
    \n
    \n )\n}\n\nfunction getIcons(closed, hidden, pinned) {\n const icons = []\n if (pinned === 2) icons.push(\"bookmark\")\n if (pinned === 1) icons.push(\"bookmark_outline\")\n if (closed) icons.push(\"lock\")\n if (hidden) icons.push(\"visibility_off\")\n return icons\n}\n","import React from \"react\"\nimport CategorySelect from \"misago/components/category-select\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport PostingThreadOptions from \"./PostingThreadOptions\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n options: null,\n\n title: \"\",\n category: props.category || null,\n categories: [],\n post: \"\",\n attachments: [],\n close: false,\n hide: false,\n pin: 0,\n\n validators: {\n title: getTitleValidators(),\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n }\n\n loadSuccess = (data) => {\n let category = null\n let options = null\n\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n // pick first category that allows posting and if it may, override it with initial one\n if (\n item.post !== false &&\n (!category || item.id == this.state.category)\n ) {\n category = item.id\n options = item.post\n }\n\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n })\n })\n\n this.setState({\n isReady: true,\n options,\n\n categories,\n category,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n onCancel = () => {\n const formEmpty = !!(\n this.state.post.length === 0 &&\n this.state.title.length === 0 &&\n this.state.attachments.length === 0\n )\n\n if (formEmpty) {\n this.minimize()\n return posting.close()\n }\n\n const cancel = window.confirm(\n pgettext(\"post thread\", \"Are you sure you want to discard thread?\")\n )\n if (cancel) {\n this.minimize()\n posting.close()\n }\n }\n\n onTitleChange = (event) => {\n this.changeValue(\"title\", event.target.value)\n }\n\n onCategoryChange = (event) => {\n const category = this.state.categories.find((item) => {\n return event.target.value == item.value\n })\n\n // if selected pin is greater than allowed, reduce it\n let pin = this.state.pin\n if (category.post.pin && category.post.pin < pin) {\n pin = category.post.pin\n }\n\n this.setState({\n category: category.id,\n categoryOptions: category.post,\n\n pin,\n })\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onClose = () => {\n this.changeValue(\"close\", true)\n }\n\n onOpen = () => {\n this.changeValue(\"close\", false)\n }\n\n onPinGlobally = () => {\n this.changeValue(\"pin\", 2)\n }\n\n onPinLocally = () => {\n this.changeValue(\"pin\", 1)\n }\n\n onUnpin = () => {\n this.changeValue(\"pin\", 0)\n }\n\n onHide = () => {\n this.changeValue(\"hide\", true)\n }\n\n onUnhide = () => {\n this.changeValue(\"hide\", false)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n clean() {\n if (!this.state.title.trim().length) {\n snackbar.error(\n pgettext(\"posting form\", \"You have to enter thread title.\")\n )\n return false\n }\n\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.title) {\n snackbar.error(errors.title[0])\n return false\n }\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.submit, {\n title: this.state.title,\n category: this.state.category,\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n close: this.state.close,\n hide: this.state.hide,\n pin: this.state.pin,\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n window.location = success.url\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.category || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n const dialogProps = {\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n const showOptions = !!(\n this.state.options.close ||\n this.state.options.hide ||\n this.state.options.pin\n )\n\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n {showOptions && (\n \n \n \n )}\n \n \n \n \n
    \n )\n }\n}\n\nconst PostingDialogStart = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n}) => (\n \n \n {pgettext(\"post thread\", \"Start new thread\")}\n \n {children}\n \n)\n","export default function (usernames) {\n const normalisedNames = usernames\n .split(\",\")\n .map((i) => i.trim().toLowerCase())\n const removedBlanks = normalisedNames.filter((i) => i.length > 0)\n const removedDuplicates = removedBlanks.filter((name, pos) => {\n return removedBlanks.indexOf(name) == pos\n })\n\n return removedDuplicates\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport cleanUsernames from \"./utils/usernames\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n const to = (props.to || []).map((user) => user.username).join(\", \")\n\n this.state = {\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n to: to,\n title: \"\",\n post: \"\",\n attachments: [],\n\n validators: {\n title: getTitleValidators(),\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n onCancel = () => {\n const formEmpty = !!(\n this.state.post.length === 0 &&\n this.state.title.length === 0 &&\n this.state.to.length === 0 &&\n this.state.attachments.length === 0\n )\n\n if (formEmpty) {\n return this.close()\n }\n\n const cancel = window.confirm(\n pgettext(\n \"post thread\",\n \"Are you sure you want to discard private thread?\"\n )\n )\n if (cancel) {\n this.close()\n }\n }\n\n onToChange = (event) => {\n this.changeValue(\"to\", event.target.value)\n }\n\n onTitleChange = (event) => {\n this.changeValue(\"title\", event.target.value)\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n clean() {\n if (!cleanUsernames(this.state.to).length) {\n snackbar.error(\n pgettext(\"posting form\", \"You have to enter at least one recipient.\")\n )\n return false\n }\n\n if (!this.state.title.trim().length) {\n snackbar.error(\n pgettext(\"posting form\", \"You have to enter thread title.\")\n )\n return false\n }\n\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.title) {\n snackbar.error(errors.title[0])\n return false\n }\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.submit, {\n to: cleanUsernames(this.state.to),\n title: this.state.title,\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n window.location = success.url\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.to || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n )\n }\n}\n\nconst PostingDialogStartPrivate = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n}) => (\n \n \n {pgettext(\"post thread\", \"Start private thread\")}\n \n {children}\n \n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n post: this.props.default || \"\",\n attachments: [],\n\n validators: {\n post: getPostValidators(),\n },\n errors: {},\n }\n\n this.quoteText = \"\"\n }\n\n componentDidMount() {\n ajax\n .get(this.props.config, this.props.context || null)\n .then(this.loadSuccess, this.loadError)\n\n setGlobalState(false, this.onQuote)\n }\n\n componentWillUnmount() {\n clearGlobalState()\n }\n\n componentWillReceiveProps(nextProps) {\n const context = this.props.context\n const newContext = nextProps.context\n\n // User clicked \"reply\" instead of \"quote\"\n if (context && newContext && !newContext.reply) return\n\n ajax\n .get(nextProps.config, nextProps.context || null)\n .then(this.appendData, snackbar.apiError)\n }\n\n loadSuccess = (data) => {\n this.setState({\n isReady: true,\n\n post: data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\"\n : this.state.post,\n })\n\n this.quoteText = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\"\n : this.state.post\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n appendData = (data) => {\n const newPost = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n : \"\"\n\n this.setState((prevState, props) => {\n if (prevState.post.length > 0) {\n return {\n post: prevState.post.trim() + \"\\n\\n\" + newPost,\n }\n }\n\n return {\n post: newPost,\n }\n })\n\n this.open()\n }\n\n onCancel = () => {\n // If only the quote text is on editor user didn't add anything\n // so no changes to discard\n const onlyQuoteTextInEditor = this.state.post === this.quoteText\n\n if (onlyQuoteTextInEditor && this.state.attachments.length === 0) {\n return this.close()\n }\n\n const cancel = window.confirm(\n pgettext(\"post reply\", \"Are you sure you want to discard your reply?\")\n )\n if (cancel) {\n this.close()\n }\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onQuote = (quote) => {\n this.setState(({ post }) => {\n if (post.length > 0) {\n return { post: post.trim() + \"\\n\\n\" + quote }\n }\n\n return { post: quote }\n })\n\n this.open()\n }\n\n clean() {\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n setGlobalState(true, this.onQuote)\n\n return ajax.post(this.props.submit, {\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n setGlobalState(false, this.onQuote)\n\n snackbar.success(pgettext(\"post reply\", \"Your reply has been posted.\"))\n window.location = success.url.index\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n setGlobalState(false, this.onQuote)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n thread: this.props.thread,\n\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n return (\n \n \n \n \n \n )\n }\n}\n\nconst PostingDialogReply = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n thread,\n}) => (\n \n \n {interpolate(\n pgettext(\"post reply\", \"Reply to: %(thread)s\"),\n { thread: thread.title },\n true\n )}\n \n {children}\n \n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: false,\n\n minimized: false,\n fullscreen: false,\n\n post: \"\",\n attachments: [],\n protect: false,\n\n canProtect: false,\n\n validators: {\n post: getPostValidators(),\n },\n errors: {},\n }\n\n this.originalPost = \"\"\n }\n\n componentDidMount() {\n ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n\n setGlobalState(false, this.onQuote)\n }\n\n componentWillUnmount() {\n clearGlobalState()\n }\n\n componentWillReceiveProps(nextProps) {\n const context = this.props.context\n const newContext = nextProps.context\n\n if (context && newContext && context.reply === newContext.reply) return\n\n ajax\n .get(nextProps.config, nextProps.context || null)\n .then(this.appendData, snackbar.apiError)\n }\n\n loadSuccess = (data) => {\n this.originalPost = data.post\n\n this.setState({\n isReady: true,\n\n post: data.post,\n attachments: attachments.hydrate(data.attachments),\n protect: data.is_protected,\n\n canProtect: data.can_protect,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n appendData = (data) => {\n const newPost = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n : \"\"\n\n this.setState((prevState, props) => {\n if (prevState.post.length > 0) {\n return {\n post: prevState.post.trim() + \"\\n\\n\" + newPost,\n }\n }\n\n return {\n post: newPost,\n }\n })\n\n this.open()\n }\n\n onCancel = () => {\n const originalPostSameAsCurrentPost =\n this.state.originalPost === this.state.post\n const noAttachementsAdded = this.state.attachments.length === 0\n\n if (originalPostSameAsCurrentPost && noAttachementsAdded) {\n return this.close()\n }\n\n const cancel = window.confirm(\n pgettext(\"edit reply\", \"Are you sure you want to discard changes?\")\n )\n if (cancel) {\n this.close()\n }\n }\n\n onProtect = () => {\n this.setState({\n protect: true,\n })\n }\n\n onUnprotect = () => {\n this.setState({\n protect: false,\n })\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onQuote = (quote) => {\n this.setState(({ post }) => {\n if (post.length > 0) {\n return { post: post.trim() + \"\\n\\n\" + quote }\n }\n\n return { post: quote }\n })\n\n this.open()\n }\n\n clean() {\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n setGlobalState(true, this.onQuote)\n\n return ajax.put(this.props.submit, {\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n protect: this.state.protect,\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n setGlobalState(false, this.onQuote)\n\n snackbar.success(pgettext(\"edit reply\", \"Reply has been edited.\"))\n window.location = success.url.index\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.category || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n setGlobalState(false, this.onQuote)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n post: this.props.post,\n\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n return (\n \n \n this.setState({ protect: true })}\n disableProtection={() => this.setState({ protect: false })}\n value={this.state.post}\n submitText={pgettext(\"edit reply submit\", \"Edit reply\")}\n disabled={this.state.isLoading}\n onAttachmentsChange={this.onAttachmentsChange}\n onChange={this.onPostChange}\n />\n \n \n )\n }\n}\n\nconst PostingDialogEditReply = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n post,\n}) => (\n \n \n {interpolate(\n pgettext(\"edit reply\", \"Edit reply by %(poster)s from %(date)s\"),\n {\n poster: post.poster ? post.poster.username : post.poster_name,\n date: post.posted_on.fromNow(),\n },\n true\n )}\n \n {children}\n \n)\n","import React from \"react\"\nimport PostingQuoteSelection from \"./PostingQuoteSelection\"\nimport getQuoteMarkup from \"./getQuoteMarkup\"\nimport { clearGlobalState, getGlobalState, setGlobalState } from \"./globalState\"\nimport Start from \"./start\"\nimport StartPrivate from \"./start-private\"\nimport Reply from \"./reply\"\nimport Edit from \"./edit\"\n\nexport default function (props) {\n switch (props.mode) {\n case \"START\":\n return \n\n case \"START_PRIVATE\":\n return \n\n case \"REPLY\":\n return \n\n case \"EDIT\":\n return \n\n default:\n return null\n }\n}\n\nexport {\n PostingQuoteSelection,\n clearGlobalState,\n getGlobalState,\n getQuoteMarkup,\n setGlobalState,\n}\n","import { maxLength, minLength } from \"misago/utils/validators\"\nimport misago from \"misago\"\n\nexport function getTitleValidators() {\n return [getTitleLengthMin(), getTitleLengthMax()]\n}\n\nexport function getPostValidators() {\n if (misago.get(\"SETTINGS\").post_length_max) {\n return [validatePostLengthMin(), validatePostLengthMax()]\n } else {\n return [validatePostLengthMin()]\n }\n}\n\nexport function getTitleLengthMin() {\n return minLength(\n misago.get(\"SETTINGS\").thread_title_length_min,\n (limitValue, length) => {\n const message = npgettext(\n \"thread title length validator\",\n \"Thread title should be at least %(limit_value)s character long (it has %(show_value)s).\",\n \"Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function getTitleLengthMax() {\n return maxLength(\n misago.get(\"SETTINGS\").thread_title_length_max,\n (limitValue, length) => {\n const message = npgettext(\n \"thread title length validator\",\n \"Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n \"Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function validatePostLengthMin() {\n return minLength(\n misago.get(\"SETTINGS\").post_length_min,\n (limitValue, length) => {\n const message = npgettext(\n \"post length validator\",\n \"Posted message should be at least %(limit_value)s character long (it has %(show_value)s).\",\n \"Posted message should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function validatePostLengthMax() {\n return maxLength(\n misago.get(\"SETTINGS\").post_length_max || 1000000,\n (limitValue, length) => {\n const message = npgettext(\n \"post length validator\",\n \"Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n \"Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getChoice() {\n let choice = null\n this.props.choices.map((item) => {\n if (item.value === this.props.value) {\n choice = item\n }\n })\n return choice\n }\n\n getIcon() {\n return this.getChoice().icon\n }\n\n getLabel() {\n return this.getChoice().label\n }\n\n change = (value) => {\n return () => {\n this.props.onChange({\n target: {\n value: value,\n },\n })\n }\n }\n\n render() {\n return (\n
    \n \n \n {this.getLabel()}\n \n
      \n {this.props.choices.map((item, i) => {\n return (\n
    • \n \n \n {item.label}\n \n
    • \n )\n })}\n
    \n
    \n )\n }\n}\n\nexport function Icon({ icon }) {\n if (!icon) return null\n\n return {icon}\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport StartSocialAuth from \"misago/components/StartSocialAuth\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n showActivation: false,\n\n username: \"\",\n password: \"\",\n\n validators: {\n username: [],\n password: [],\n },\n }\n }\n\n clean() {\n if (!this.isValid()) {\n snackbar.error(pgettext(\"sign in modal\", \"Fill out both fields.\"))\n return false\n } else {\n return true\n }\n }\n\n send() {\n return ajax.post(misago.get(\"AUTH_API\"), {\n username: this.state.username,\n password: this.state.password,\n })\n }\n\n handleSuccess() {\n let form = $(\"#hidden-login-form\")\n\n form.append('')\n form.append('')\n\n // fill out form with user credentials and submit it, this will tell\n // Misago to redirect user back to right page, and will trigger browser's\n // key ring feature\n form.find('input[type=\"hidden\"]').val(ajax.getCsrfToken())\n form.find('input[name=\"next\"]').val(window.location.pathname)\n form.find('input[name=\"username\"]').val(this.state.username)\n form.find('input[name=\"password\"]').val(this.state.password)\n form.submit()\n\n // keep form loading\n this.setState({\n isLoading: true,\n })\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.code === \"inactive_admin\") {\n snackbar.info(rejection.detail)\n } else if (rejection.code === \"inactive_user\") {\n snackbar.info(rejection.detail)\n this.setState({\n showActivation: true,\n })\n } else if (rejection.code === \"banned\") {\n showBannedPage(rejection.detail)\n modal.hide()\n } else {\n snackbar.error(rejection.detail)\n }\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n modal.hide()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n getActivationButton() {\n if (!this.state.showActivation) return null\n\n return (\n \n {pgettext(\"sign in modal btn\", \"Activate account\")}\n \n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"sign in modal title\", \"Sign in\")}\n

    \n
    \n
    \n
    \n \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    \n {this.getActivationButton()}\n \n {pgettext(\"sign in modal btn\", \"Sign in\")}\n \n \n {pgettext(\"sign in modal btn\", \"Forgot password?\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClass() {\n return getStatusClassName(this.props.status)\n }\n\n render() {\n return {this.props.children}\n }\n}\n\nexport class StatusIcon extends React.Component {\n getIcon() {\n if (this.props.status.is_banned) {\n return \"remove_circle_outline\"\n } else if (this.props.status.is_hidden) {\n return \"help_outline\"\n } else if (this.props.status.is_online_hidden) {\n return \"label\"\n } else if (this.props.status.is_offline_hidden) {\n return \"label_outline\"\n } else if (this.props.status.is_online) {\n return \"lens\"\n } else if (this.props.status.is_offline) {\n return \"panorama_fish_eye\"\n }\n }\n\n render() {\n return {this.getIcon()}\n }\n}\n\nexport class StatusLabel extends React.Component {\n getHelp() {\n return getStatusDescription(this.props.user, this.props.status)\n }\n\n getLabel() {\n if (this.props.status.is_banned) {\n return pgettext(\"user status\", \"Banned\")\n } else if (this.props.status.is_hidden) {\n return pgettext(\"user status\", \"Hidden\")\n } else if (this.props.status.is_online_hidden) {\n return pgettext(\"user status\", \"Online (hidden)\")\n } else if (this.props.status.is_offline_hidden) {\n return pgettext(\"user status\", \"Offline (hidden)\")\n } else if (this.props.status.is_online) {\n return pgettext(\"user status\", \"Online\")\n } else if (this.props.status.is_offline) {\n return pgettext(\"user status\", \"Offline\")\n }\n }\n\n render() {\n return (\n \n {this.getLabel()}\n \n )\n }\n}\n\nexport function getStatusClassName(status) {\n let className = \"\"\n if (status.is_banned) {\n className = \"banned\"\n } else if (status.is_hidden) {\n className = \"offline\"\n } else if (status.is_online_hidden) {\n className = \"online\"\n } else if (status.is_offline_hidden) {\n className = \"offline\"\n } else if (status.is_online) {\n className = \"online\"\n } else if (status.is_offline) {\n className = \"offline\"\n }\n\n return \"user-status user-\" + className\n}\n\nexport function getStatusDescription(user, status) {\n if (status.is_banned) {\n if (status.banned_until) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is banned until %(ban_expires)s\"),\n {\n username: user.username,\n ban_expires: status.banned_until.format(\"LL, LT\"),\n },\n true\n )\n } else {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is banned\"),\n {\n username: user.username,\n },\n true\n )\n }\n } else if (status.is_hidden) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is hiding presence\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_online_hidden) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is online (hidden)\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_offline_hidden) {\n return interpolate(\n pgettext(\n \"user status\",\n \"%(username)s was last seen %(last_click)s (hidden)\"\n ),\n {\n username: user.username,\n last_click: status.last_click.fromNow(),\n },\n true\n )\n } else if (status.is_online) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is online\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_offline) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s was last seen %(last_click)s\"),\n {\n username: user.username,\n last_click: status.last_click.fromNow(),\n },\n true\n )\n }\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\n\nexport default function ({ showStatus, user }) {\n return (\n
      \n \n \n
    • \n \n \n \n
    \n )\n}\n\nexport function Status({ showStatus, user }) {\n if (!showStatus) return null\n\n return (\n
  • \n \n \n \n
  • \n )\n}\n\nexport function JoinDate({ user }) {\n const { joined_on } = user\n\n let title = interpolate(\n pgettext(\"users list item\", \"Joined on %(joined_on)s\"),\n {\n joined_on: joined_on.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n pgettext(\"users list item\", \"Joined %(joined_on)s\"),\n {\n joined_on: joined_on.fromNow(),\n },\n true\n )\n\n return (\n
  • \n {message}\n
  • \n )\n}\n\nexport function Posts({ user }) {\n const className = getStatClassName(\"user-stat-posts\", user.posts)\n const message = npgettext(\n \"users list item\",\n \"%(posts)s post\",\n \"%(posts)s posts\",\n user.posts\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n posts: user.posts,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Threads({ user }) {\n const className = getStatClassName(\"user-stat-threads\", user.threads)\n const message = npgettext(\n \"users list item\",\n \"%(threads)s thread\",\n \"%(threads)s threads\",\n user.threads\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n threads: user.threads,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Followers({ user }) {\n const className = getStatClassName(\"user-stat-followers\", user.followers)\n const message = npgettext(\n \"users list item\",\n \"%(followers)s follower\",\n \"%(followers)s followers\",\n user.followers\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n followers: user.followers,\n },\n true\n )}\n
  • \n )\n}\n\nexport function getStatClassName(className, stat) {\n if (stat === 0) {\n return className + \" user-stat-empty\"\n }\n return className\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title || rank.name\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n {userTitle}\n \n )\n }\n\n return {userTitle}\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Stats from \"./stats\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ showStatus, user }) {\n const { rank } = user\n\n let className = \"panel user-card\"\n if (rank.css_class) {\n className += \" user-card-\" + rank.css_class\n }\n\n return (\n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n\n \n
    \n \n
    \n\n
    \n \n
    \n
    \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n\n
    \n \n  \n \n
    \n
    \n \n  \n \n
    \n\n
    \n
      \n
    • \n \n  \n \n
    • \n
    • \n \n  \n \n
    • \n
    • \n
    • \n \n  \n \n
    • \n
    • \n \n  \n \n
    • \n
    \n
    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ colClassName, cols }) {\n const list = Array.apply(null, { length: cols }).map(Number.call, Number)\n\n return (\n
    \n
    \n {list.map((i) => {\n let className = colClassName\n if (i !== 0) className += \" hidden-xs\"\n if (i === 3) className += \" hidden-sm\"\n\n return (\n
    \n \n
    \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport Card from \"./card\"\nimport Preview from \"./preview\"\n\nexport default function ({ cols, isReady, showStatus, users }) {\n let colClassName = \"col-xs-12 col-sm-4\"\n if (cols === 4) {\n colClassName += \" col-md-3\"\n }\n\n if (!isReady) {\n return \n }\n\n return (\n
    \n
    \n {users.map((user) => {\n return (\n
    \n \n
    \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n dropdown: false,\n }\n }\n\n toggleNav = () => {\n this.setState({\n dropdown: !this.state.dropdown,\n })\n }\n\n hideNav = () => {\n this.setState({\n dropdown: false,\n })\n }\n\n getCompactNavClassName() {\n if (this.state.dropdown) {\n return \"compact-nav open\"\n } else {\n return \"compact-nav\"\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.value) {\n return \"btn btn-yes-no btn-yes-no-on\"\n } else {\n return \"btn btn-yes-no btn-yes-no-off\"\n }\n }\n\n getIcon() {\n if (!!this.props.value) {\n return this.props.iconOn || \"check_box\"\n } else {\n return this.props.iconOff || \"check_box_outline_blank\"\n }\n }\n\n getLabel() {\n if (!!this.props.value) {\n return this.props.labelOn || pgettext(\"yesno switch choice\", \"yes\")\n } else {\n return this.props.labelOff || pgettext(\"yesno switch choice\", \"no\")\n }\n }\n\n toggle = () => {\n this.props.onChange({\n target: {\n value: !this.props.value,\n },\n })\n }\n\n render() {\n return (\n \n {this.getIcon()}\n {this.getLabel()}\n \n )\n }\n}\n","export const locale = window.misago_locale || \"en-us\"\n\nexport const momentAgo = pgettext(\"time ago\", \"moment ago\")\nexport const momentAgoShort = pgettext(\"time ago\", \"now\")\nexport const dayAt = pgettext(\"day at time\", \"%(day)s at %(time)s\")\nexport const soonAt = pgettext(\"day at time\", \"Today at %(time)s\")\nexport const tomorrowAt = pgettext(\"day at time\", \"Tomorrow at %(time)s\")\nexport const yesterdayAt = pgettext(\"day at time\", \"Yesterday at %(time)s\")\n\nexport const minutesShort = pgettext(\"short minutes\", \"%(time)sm\")\nexport const hoursShort = pgettext(\"short hours\", \"%(time)sh\")\nexport const daysShort = pgettext(\"short days\", \"%(time)sd\")\nexport const thisYearShort = pgettext(\"short month\", \"%(day)s %(month)s\")\nexport const otherYearShort = pgettext(\"short month\", \"%(month)s %(year)s\")\n\nexport const relativeNumeric = new Intl.RelativeTimeFormat(locale, {\n numeric: \"always\",\n style: \"long\",\n})\n\nexport const fullDateTime = new Intl.DateTimeFormat(locale, {\n dateStyle: \"full\",\n timeStyle: \"medium\",\n})\n\nexport const thisYearDate = new Intl.DateTimeFormat(locale, {\n month: \"long\",\n day: \"numeric\",\n})\n\nexport const otherYearDate = new Intl.DateTimeFormat(locale, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n})\n\nexport const short = new Intl.DateTimeFormat(locale, {\n year: \"2-digit\",\n month: \"short\",\n day: \"numeric\",\n})\n\nexport const weekday = new Intl.DateTimeFormat(locale, {\n weekday: \"long\",\n})\n\nexport const shortTime = new Intl.DateTimeFormat(locale, { timeStyle: \"short\" })\n\nexport function dateRelative(date) {\n const now = new Date()\n const diff = Math.round((date - now) / 1000)\n const absDiff = Math.abs(diff)\n const sign = diff < 1 ? -1 : 1\n\n if (absDiff < 90) {\n return momentAgo\n }\n\n if (absDiff < 60 * 47) {\n const minutes = Math.round(absDiff / 60) * sign\n return relativeNumeric.format(minutes, \"minute\")\n }\n\n if (absDiff < 3600 * 3) {\n const hours = Math.round(absDiff / 3600) * sign\n return relativeNumeric.format(hours, \"hour\")\n }\n\n if (isSameDay(now, date)) {\n if (diff > 0) {\n return soonAt.replace(\"%(time)s\", shortTime.format(date))\n }\n\n return shortTime.format(date)\n }\n\n if (isYesterday(date)) {\n return yesterdayAt.replace(\"%(time)s\", shortTime.format(date))\n }\n\n if (isTomorrow(date)) {\n return tomorrowAt.replace(\"%(time)s\", shortTime.format(date))\n }\n\n if (diff < 0 && absDiff < 3600 * 24 * 6) {\n const day = weekday.format(date)\n return formatDayAtTime(day, date)\n }\n\n if (now.getFullYear() == date.getFullYear()) {\n return thisYearDate.format(date)\n }\n\n return otherYearDate.format(date)\n}\n\nexport function isSameDay(now, date) {\n return (\n now.getFullYear() == date.getFullYear() &&\n now.getMonth() == date.getMonth() &&\n now.getDate() == date.getDate()\n )\n}\n\nexport function isYesterday(date) {\n const yesterday = new Date()\n yesterday.setDate(yesterday.getDate() - 1)\n return isSameDay(yesterday, date)\n}\n\nexport function isTomorrow(date) {\n const yesterday = new Date()\n yesterday.setDate(yesterday.getDate() + 1)\n return isSameDay(yesterday, date)\n}\n\nexport function formatDayAtTime(day, date) {\n return dayAt\n .replace(\"%(day)s\", day)\n .replace(\"%(time)s\", shortTime.format(date))\n}\n\nexport function dateRelativeShort(date) {\n const now = new Date()\n const absDiff = Math.abs(Math.round((date - now) / 1000))\n\n if (absDiff < 60) {\n return momentAgoShort\n }\n\n if (absDiff < 60 * 55) {\n const minutes = Math.round(absDiff / 60)\n return minutesShort.replace(\"%(time)s\", minutes)\n }\n\n if (absDiff < 3600 * 24) {\n const hours = Math.round(absDiff / 3600)\n return hoursShort.replace(\"%(time)s\", hours)\n }\n\n if (absDiff < 86400 * 7) {\n const days = Math.round(absDiff / 86400)\n return daysShort.replace(\"%(time)s\", days)\n }\n\n const parts = {}\n short.formatToParts(date).forEach(function ({ type, value }) {\n parts[type] = value\n })\n\n if (date.getFullYear() === now.getFullYear()) {\n return thisYearShort\n .replace(\"%(day)s\", parts.day)\n .replace(\"%(month)s\", parts.month)\n }\n\n return otherYearShort\n .replace(\"%(year)s\", parts.year)\n .replace(\"%(month)s\", parts.month)\n}\n","class OrderedList {\n constructor(items) {\n this.isOrdered = false\n this._items = items || []\n }\n\n add(key, item, order) {\n this._items.push({\n key: key,\n item: item,\n\n after: order ? order.after || null : null,\n before: order ? order.before || null : null,\n })\n }\n\n get(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 has(key) {\n return this.get(key) !== undefined\n }\n\n values() {\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 order(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 orderedValues() {\n return this.order(true)\n }\n\n _order(unordered) {\n // Index of unordered items\n var index = []\n unordered.forEach(function (item) {\n index.push(item.key)\n })\n\n // Ordered items\n var ordered = []\n var ordering = []\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item)\n ordering.push(item.key)\n }\n })\n\n // Second pass: register items that\n // specify their before to \"_end\"\n unordered.forEach(function (item) {\n if (item.before === \"_end\") {\n ordered.push(item)\n ordering.push(item.key)\n }\n })\n\n // Third pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after)\n if (insertAt !== -1) {\n insertAt += 1\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before)\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item)\n ordering.splice(insertAt, 0, item.key)\n }\n }\n }\n\n var iterations = 200\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1\n unordered.forEach(insertItem)\n }\n\n return ordered\n }\n}\n\nexport default OrderedList\n","class AjaxLoader {\n constructor() {\n this.element = document.getElementById(\"misago-ajax-loader\")\n this.requests = 0\n this.timeout = null\n }\n\n show = () => {\n this.requests += 1\n this.update()\n }\n\n hide = () => {\n if (this.requests) {\n this.requests -= 1\n this.update()\n }\n }\n\n update = () => {\n if (this.timeout) {\n window.clearTimeout(this.timeout)\n }\n\n if (this.requests) {\n this.element.classList.add(\"busy\")\n this.element.classList.remove(\"complete\")\n } else {\n this.element.classList.remove(\"busy\")\n this.element.classList.add(\"complete\")\n\n this.timeout = setTimeout(() => {\n this.element.classList.remove(\"complete\")\n }, 1500)\n }\n }\n}\n\nexport function useLoader(target) {\n const silent = target.closest(\"[hx-silent]\")\n if (silent) {\n return silent.getAttribute(\"hx-silent\") !== \"true\"\n }\n\n return true\n}\n\nexport default AjaxLoader\n","import htmx from \"htmx.org\"\n\nclass BulkModeration {\n constructor(options) {\n this.menu = options.menu ? document.querySelector(options.menu) : null\n this.form = options.form\n this.modal = options.modal\n this.actions = document.querySelectorAll(options.actions)\n this.selection = options.selection\n this.control = document.querySelector(options.button.selector)\n this.text = options.button.text\n\n this.update()\n this.registerEvents()\n this.registerActions()\n }\n\n registerActions = () => {\n this.actions.forEach((element) => {\n if (element.getAttribute(\"moderation-action\") === \"remove-selection\") {\n element.addEventListener(\"click\", this.onRemoveSelection)\n } else {\n element.addEventListener(\"click\", this.onAction)\n }\n })\n }\n\n onAction = (event) => {\n const form = document.querySelector(this.form)\n const data = {}\n\n new FormData(form).forEach((value, key) => {\n if (typeof data[key] === \"undefined\") {\n data[key] = []\n }\n data[key].push(value)\n })\n\n const target = event.target\n data.moderation = target.getAttribute(\"moderation-action\")\n\n if (target.getAttribute(\"moderation-multistage\") === \"true\") {\n htmx\n .ajax(\"POST\", document.location.href, {\n target: this.modal,\n swap: \"innerHTML\",\n values: data,\n })\n .then(() => {\n $(this.modal).modal(\"show\")\n })\n } else {\n htmx.ajax(\"POST\", document.location.href, {\n target: \"#misago-htmx-root\",\n swap: \"outerHTML\",\n values: data,\n })\n }\n }\n\n onRemoveSelection = (event) => {\n document.querySelectorAll(this.selection).forEach((element) => {\n element.checked = false\n })\n this.update()\n }\n\n registerEvents = () => {\n document.body.addEventListener(\"click\", ({ target }) => {\n if (target.tagName === \"INPUT\" && target.type === \"checkbox\") {\n this.update()\n }\n })\n\n htmx.onLoad(() => this.update())\n }\n\n update = () => {\n const selection = document.querySelectorAll(this.selection).length\n\n this.control.innerText = this.text.replace(\"%(number)s\", selection)\n this.control.disabled = !selection\n\n if (this.menu) {\n if (selection) {\n this.menu.classList.add(\"visible\")\n } else {\n this.menu.classList.remove(\"visible\")\n }\n }\n }\n}\n\nexport default BulkModeration\n","import htmx from \"htmx.org\"\n\nconst DEBOUNCE = 1000\n\nconst cache = {}\n\nexport function registerElementValidator(element) {\n const active = element.getAttribute(\"misago-validate-active\")\n if (active) {\n return\n }\n\n const url = element.getAttribute(\"misago-validate\")\n const user = element.getAttribute(\"misago-validate-user\")\n const strip =\n element.getAttribute(\"misago-validate-strip\") == \"false\" ? false : true\n const input = element.querySelector(\"input\")\n const csrf = input.closest(\"form\").querySelector(\"input[type=hidden]\")\n\n if (!url || !input) {\n return\n }\n\n if (!cache[url]) {\n cache[url] = {}\n }\n\n element.setAttribute(\"misago-validate-active\", \"true\")\n\n let timeout = null\n\n input.addEventListener(\"keyup\", (event) => {\n let value = event.target.value\n if (strip) {\n value = value.trim()\n }\n\n if (value.trim().length === 0) {\n clearFormControlValidationState(element)\n return\n }\n\n if (cache[url][value]) {\n setFormControlValidationState(element, input, cache[url][value])\n } else {\n if (timeout) {\n window.clearTimeout(timeout)\n }\n\n timeout = window.setTimeout(async () => {\n const { errors } = await callValidationUrl(url, csrf, value, user)\n cache[url][value] = errors\n setFormControlValidationState(element, input, errors)\n }, DEBOUNCE)\n }\n })\n}\n\nfunction setFormControlValidationState(element, input, errors) {\n if (errors.length) {\n setFormControlErrorValidationState(element, input, errors)\n } else {\n setFormControlSuccessValidationState(element)\n }\n}\n\nfunction setFormControlErrorValidationState(element, input, errors) {\n element.classList.remove(\"has-success\")\n element.classList.add(\"has-error\")\n\n clearFormControlValidationMessages(element)\n\n errors.forEach((error) => {\n const message = document.createElement(\"p\")\n message.className = \"help-block\"\n message.setAttribute(\"misago-dynamic-message\", \"true\")\n message.innerText = error\n input.after(message)\n })\n}\n\nfunction setFormControlSuccessValidationState(element) {\n element.classList.remove(\"has-error\")\n element.classList.add(\"has-success\")\n\n clearFormControlValidationMessages(element)\n}\n\nfunction clearFormControlValidationState(element) {\n element.classList.remove(\"has-error\")\n element.classList.remove(\"has-success\")\n\n clearFormControlValidationMessages(element)\n}\n\nfunction clearFormControlValidationMessages(element) {\n element\n .querySelectorAll(\"[misago-dynamic-message]\")\n .forEach((i) => i.remove())\n}\n\nasync function callValidationUrl(url, csrf, value, user) {\n const data = new FormData()\n data.set(csrf.name, csrf.value)\n data.set(\"value\", value)\n if (user) {\n data.set(\"user\", user)\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n mode: \"cors\",\n credentials: \"same-origin\",\n body: data,\n })\n return await response.json()\n}\n\nexport function registerValidators(element) {\n const target = element || document\n target.querySelectorAll(\"[misago-validate]\").forEach(registerElementValidator)\n}\n\nhtmx.onLoad(registerValidators)\n","import htmx from \"htmx.org\"\n\nconst SNACKBAR_TTL = 6\n\nconst container = document.getElementById(\"misago-snackbars\")\nlet timeout = null\n\nexport function removeSnackbars() {\n container.replaceChildren()\n}\n\nfunction renderSnackbars() {\n if (timeout) {\n window.clearTimeout(timeout)\n }\n\n container.querySelectorAll(\".snackbar\").forEach((element) => {\n element.classList.add(\"in\")\n })\n\n timeout = window.setTimeout(() => {\n container.querySelectorAll(\".snackbar\").forEach((element) => {\n element.classList.add(\"out\")\n timeout = window.setTimeout(removeSnackbars, 1000)\n })\n }, SNACKBAR_TTL * 1000)\n}\n\nexport function snackbar(type, message) {\n removeSnackbars()\n\n if (timeout) {\n window.clearTimeout(timeout)\n }\n\n const element = document.createElement(\"div\")\n element.classList.add(\"snackbar\")\n element.classList.add(\"snackbar-\" + type)\n element.innerText = message\n element.role = \"alert\"\n container.appendChild(element)\n\n timeout = window.setTimeout(renderSnackbars, 100)\n}\n\nexport function info(message) {\n snackbar(\"info\", message)\n}\n\nexport function success(message) {\n snackbar(\"success\", message)\n}\n\nexport function warning(message) {\n snackbar(\"warning\", message)\n}\n\nexport function error(message) {\n snackbar(\"danger\", message)\n}\n\nhtmx.onLoad(renderSnackbars)\n","import { error } from \"./snackbars\"\n\nfunction handleResponseError(event) {\n if (isEventVisible(event)) {\n const message = getResponseErrorMessage(event.detail.xhr)\n error(message)\n }\n}\n\nfunction getResponseErrorMessage(xhr) {\n if (xhr.getResponseHeader(\"content-type\") === \"application/json\") {\n const data = JSON.parse(xhr.response)\n if (data.error) {\n return data.error\n }\n }\n\n if (xhr.status === 404) {\n return pgettext(\"htmx response error\", \"Page not found\")\n }\n\n if (xhr.status === 403) {\n return pgettext(\"htmx response error\", \"Permission denied\")\n }\n\n return pgettext(\"htmx response error\", \"Unexpected error\")\n}\n\nfunction handleSendError(event) {\n if (isEventVisible(event)) {\n const message = pgettext(\"htmx response error\", \"Site could not be reached.\")\n error(message)\n }\n}\n\nfunction handleTimeoutError(event) {\n if (isEventVisible(event)) {\n const message = pgettext(\n \"htmx response error\",\n \"Site took too long to reply\"\n )\n error(message)\n }\n}\n\nfunction isEventVisible({ detail }) {\n const silent = getEventTargetSilentAttr(detail.target)\n return !(silent === \"true\" && detail.requestConfig.verb === \"get\")\n}\n\nfunction getEventTargetSilentAttr(target) {\n const element = target.closest(\"[hx-silent]\")\n if (element) {\n return element.getAttribute(\"hx-silent\")\n }\n return null\n}\n\nexport function setupHtmxErrors() {\n document.addEventListener(\"htmx:responseError\", handleResponseError)\n document.addEventListener(\"htmx:sendError\", handleSendError)\n document.addEventListener(\"htmx:timeout\", handleTimeoutError)\n}\n\nsetupHtmxErrors()\n","import htmx from \"htmx.org\"\n\nimport { dateRelative, dateRelativeShort, fullDateTime } from \"./formats\"\n\nconst cache = {}\n\nexport function updateTimestamp(element) {\n const timestamp = element.getAttribute(\"misago-timestamp\")\n if (!cache[timestamp]) {\n cache[timestamp] = new Date(timestamp)\n }\n\n if (!element.hasAttribute(\"misago-timestamp-title\")) {\n element.setAttribute(\"misago-timestamp-title\", \"true\")\n element.setAttribute(\"title\", fullDateTime.format(cache[timestamp]))\n }\n\n const format = element.getAttribute(\"misago-timestamp-format\")\n\n if (format == \"short\") {\n element.textContent = dateRelativeShort(cache[timestamp])\n } else {\n element.textContent = dateRelative(cache[timestamp])\n }\n}\n\nexport function startLiveTimestamps() {\n document.querySelectorAll(\"[misago-timestamp]\").forEach(updateTimestamp)\n\n updateLiveTimestamps()\n window.setInterval(updateLiveTimestamps, 1000 * 55)\n}\n\nexport function updateLiveTimestamps(element) {\n const target = element || document\n target.querySelectorAll(\"[misago-timestamp]\").forEach(updateTimestamp)\n}\n\nstartLiveTimestamps()\nhtmx.onLoad(updateLiveTimestamps)\n","import \"bootstrap/js/transition\"\nimport \"bootstrap/js/affix\"\nimport \"bootstrap/js/modal\"\nimport \"bootstrap/js/dropdown\"\nimport \"at-js\"\nimport \"cropit\"\nimport \"jquery-caret\"\nimport htmx from \"htmx.org\"\nimport OrderedList from \"misago/utils/ordered-list\"\nimport \"misago/style/index.less\"\nimport AjaxLoader, { useLoader } from \"./AjaxLoader\"\nimport BulkModeration from \"./BulkModeration\"\nimport \"./formValidators\"\nimport \"./htmxErrors\"\nimport \"./liveTimestamps\"\nimport * as snackbars from \"./snackbars\"\n\nconst loader = new AjaxLoader()\n\nexport class Misago {\n constructor() {\n this._initializers = []\n this._context = {}\n\n this.loader = loader\n }\n\n addInitializer(initializer) {\n this._initializers.push({\n key: initializer.name,\n\n item: initializer.initializer,\n\n after: initializer.after,\n before: initializer.before,\n })\n }\n\n init(context) {\n this._context = context\n\n var initOrder = new OrderedList(this._initializers).orderedValues()\n initOrder.forEach((initializer) => {\n initializer(this)\n })\n }\n\n // context accessors\n has(key) {\n return !!this._context[key]\n }\n\n get(key, fallback) {\n if (this.has(key)) {\n return this._context[key]\n } else {\n return fallback || undefined\n }\n }\n\n pop(key) {\n if (this.has(key)) {\n let value = this._context[key]\n this._context[key] = null\n return value\n } else {\n return undefined\n }\n }\n\n snackbar(type, message) {\n snackbars.snackbar(type, message)\n }\n\n snackbarInfo(message) {\n snackbars.info(message)\n }\n\n snackbarSuccess(message) {\n snackbars.success(message)\n }\n\n snackbarWarning(message) {\n snackbars.warning(message)\n }\n\n snackbarError(message) {\n snackbars.error(message)\n }\n\n bulkModeration(options) {\n return new BulkModeration(options)\n }\n}\n\n// create the singleton\nconst misago = new Misago()\n\n// expose it globally\nwindow.misago = misago\n\n// and export it for tests and stuff\nexport default misago\n\n// Register ajax loader events\ndocument.addEventListener(\"htmx:beforeRequest\", ({ target }) => {\n if (useLoader(target)) {\n loader.show()\n }\n})\n\ndocument.addEventListener(\"htmx:afterRequest\", ({ target }) => {\n if (useLoader(target)) {\n loader.hide()\n }\n})\n\n// Hide moderation modal after moderation action completes\ndocument.addEventListener(\"misago:afterModeration\", () => {\n $(\"#threads-moderation-modal\").modal(\"hide\")\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\n\nexport default function initializer() {\n ajax.init(misago.get(\"CSRF_COOKIE_NAME\"))\n}\n\nmisago.addInitializer({\n name: \"ajax\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport { patch } from \"misago/reducers/auth\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nconst AUTH_SYNC_RATE = 45 // sync user with backend every 45 seconds\n\nexport default function initializer(context) {\n if (context.get(\"isAuthenticated\")) {\n window.setInterval(function () {\n ajax.get(context.get(\"AUTH_API\")).then(\n function (data) {\n store.dispatch(patch(data))\n },\n function (rejection) {\n snackbar.apiError(rejection)\n }\n )\n }, AUTH_SYNC_RATE * 1000)\n }\n}\n\nmisago.addInitializer({\n name: \"auth-sync\",\n initializer: initializer,\n after: \"auth\",\n})\n","import misago from \"misago/index\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport store from \"misago/services/store\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n auth.init(store, storage, modal)\n}\n\nmisago.addInitializer({\n name: \"auth\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport captcha from \"misago/services/captcha\"\nimport include from \"misago/services/include\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer(context) {\n captcha.init(context, ajax, include, snackbar)\n}\n\nmisago.addInitializer({\n name: \"captcha\",\n initializer: initializer,\n})\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class AcceptAgreement extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = { submiting: false }\n }\n\n handleDecline = () => {\n if (this.state.submiting) return\n\n const confirmation = window.confirm(\n pgettext(\n \"accept agreement prompt\",\n \"Declining will result in immediate deactivation and deletion of your account. This action is not reversible.\"\n )\n )\n if (!confirmation) return\n\n this.setState({ submiting: true })\n\n ajax.post(this.props.api, { accept: false }).then(() => {\n window.location.reload(true)\n })\n }\n\n handleAccept = () => {\n if (this.state.submiting) return\n\n this.setState({ submiting: true })\n\n ajax.post(this.props.api, { accept: true }).then(() => {\n window.location.reload(true)\n })\n }\n\n render() {\n return (\n
    \n \n {pgettext(\"accept agreement choice\", \"Decline\")}\n \n \n {pgettext(\"accept agreement choice\", \"Accept and continue\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport AcceptAgreement from \"misago/components/accept-agreement\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n if (document.getElementById(\"required-agreement-mount\")) {\n mount(\n ,\n \"required-agreement-mount\",\n false\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:accept-agreement\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nexport default class extends React.Component {\n refresh() {\n window.location.reload()\n }\n\n getMessage() {\n if (this.props.signedIn) {\n return interpolate(\n pgettext(\n \"auth message\",\n \"You have signed in as %(username)s. Please refresh the page before continuing.\"\n ),\n { username: this.props.signedIn.username },\n true\n )\n } else if (this.props.signedOut) {\n return interpolate(\n pgettext(\n \"auth message\",\n \"%(username)s, you have been signed out. Please refresh the page before continuing.\"\n ),\n { username: this.props.user.username },\n true\n )\n }\n }\n\n render() {\n let className = \"auth-message\"\n if (this.props.signedIn || this.props.signedOut) {\n className += \" show\"\n }\n\n return (\n
    \n
    \n

    {this.getMessage()}

    \n

    \n \n {pgettext(\"auth message\", \"Reload page\")}\n \n \n {\" \" + pgettext(\"auth message\", \"or press F5 key.\")}\n \n

    \n
    \n
    \n )\n }\n}\n\nexport function select(state) {\n return {\n user: state.auth.user,\n signedIn: state.auth.signedIn,\n signedOut: state.auth.signedOut,\n }\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport AuthMessage, { select } from \"misago/components/auth-message\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(AuthMessage), \"auth-message-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:auth-message\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default function initializer(context) {\n if (context.has(\"BAN_MESSAGE\")) {\n showBannedPage(context.get(\"BAN_MESSAGE\"), false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:banmed-page\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport modal from \"../services/modal\"\nimport SignInModal from \"./sign-in\"\n\nclass SignInModalAutoOpen extends React.Component {\n componentDidMount() {\n const query = window.document.location.search\n if (query === \"?modal=login\") {\n window.setTimeout(() => modal.show(), 300)\n }\n }\n\n render() {\n return null\n }\n}\n\nexport default SignInModalAutoOpen\n","import React from \"react\"\n\nexport default function NavbarBranding({ logo, logoXs, text, url }) {\n if (logo) {\n return (\n
    \n \n {text}\n \n
    \n )\n }\n\n return (\n
    \n {!!logoXs && (\n \n {text}\n \n )}\n {!!text && (\n \n {text}\n \n )}\n
    \n )\n}\n","import React from \"react\"\n\nexport default function NavbarExtraMenu({ items }) {\n return (\n
      \n {items.map((item, index) => (\n
    • \n \n {item.title}\n \n
    • \n ))}\n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { DropdownFooter, DropdownHeader, DropdownPills } from \"../Dropdown\"\n\nexport default function NotificationsDropdownBody({\n children,\n showAll,\n showUnread,\n unread,\n}) {\n return (\n
    \n \n {pgettext(\"notifications title\", \"Notifications\")}\n \n \n \n {pgettext(\"notifications dropdown\", \"All\")}\n \n \n {pgettext(\"notifications dropdown\", \"Unread\")}\n \n \n {children}\n \n \n {pgettext(\"notifications\", \"See all notifications\")}\n \n \n
    \n )\n}\n\nfunction NotificationsDropdownBodyPill({ active, children, onClick }) {\n return (\n \n {children}\n \n )\n}\n","import NotificationsDropdown from \"./NotificationsDropdown\"\n\nexport default NotificationsDropdown\n","import React from \"react\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport {\n NotificationsList,\n NotificationsListError,\n NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsDropdownBody from \"./NotificationsDropdownBody\"\n\nexport default class NotificationsDropdown extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n unread: false,\n url: \"\",\n }\n }\n\n getApiUrl() {\n let url = misago.get(\"NOTIFICATIONS_API\") + \"?limit=20\"\n url += this.state.unread ? \"&filter=unread\" : \"\"\n return url\n }\n\n render = () => (\n this.setState({ unread: false })}\n showUnread={() => this.setState({ unread: true })}\n >\n \n {({ data, loading, error }) => {\n if (loading) {\n return \n }\n\n if (error) {\n return \n }\n\n return (\n \n )\n }}\n \n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarNotificationsToggle({\n id,\n className,\n badge,\n url,\n active,\n onClick,\n}) {\n const title = !!badge\n ? pgettext(\"navbar\", \"You have unread notifications!\")\n : pgettext(\"navbar\", \"Open notifications\")\n\n return (\n \n {!!badge && {badge}}\n \n {!!badge ? \"notifications_active\" : \"notifications_none\"}\n \n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NotificationsDropdown from \"../NotificationsDropdown\"\nimport NavbarNotificationsToggle from \"./NavbarNotificationsToggle\"\n\nexport default function NavbarNotificationsDropdown({\n id,\n className,\n badge,\n url,\n}) {\n return (\n (\n {\n event.preventDefault()\n toggle()\n }}\n />\n )}\n menuClassName=\"notifications-dropdown\"\n menuAlignRight\n >\n {({ isOpen }) => }\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarPrivateThreads({\n id,\n className,\n badge,\n url,\n active,\n onClick,\n}) {\n const title = !!badge\n ? pgettext(\"navbar\", \"You have unread private threads!\")\n : pgettext(\"navbar\", \"Open private threads\")\n\n return (\n \n {!!badge && {badge}}\n inbox\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarSearchToggle({\n id,\n className,\n url,\n active,\n onClick,\n}) {\n return (\n \n search\n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport { SearchDropdown } from \"../Search\"\nimport NavbarSearchToggle from \"./NavbarSearchToggle\"\n\nexport default function NavbarSearchDropdown({ id, className, url }) {\n return (\n (\n {\n event.preventDefault()\n toggle()\n\n window.setTimeout(() => {\n document\n .querySelector(\".search-dropdown .form-control-search\")\n .focus()\n }, 0)\n }}\n />\n )}\n menuClassName=\"search-dropdown\"\n menuAlignRight\n >\n {() => }\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarSiteNavToggle({\n id,\n className,\n active,\n onClick,\n}) {\n return (\n \n menu\n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NavbarSiteNavToggle from \"./NavbarSiteNavToggle\"\nimport { SiteNavDropdown } from \"../SiteNav\"\n\nexport default function NavbarSiteNavDropdown({ id, className }) {\n return (\n (\n \n )}\n menuClassName=\"site-nav-dropdown\"\n menuAlignRight\n >\n {({ isOpen, close }) => }\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport Avatar from \"../avatar\"\n\nexport default function NavbarUserNavToggle({\n id,\n className,\n user,\n active,\n onClick,\n}) {\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NavbarUserNavToggle from \"./NavbarUserNavToggle\"\nimport { UserNavDropdown } from \"../UserNav\"\n\nexport default function NavbarUserNavDropdown({ id, className, user }) {\n return (\n (\n {\n event.preventDefault()\n toggle()\n }}\n />\n )}\n menuClassName=\"user-nav-dropdown\"\n menuAlignRight\n >\n {({ isOpen, close }) => }\n \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport * as overlay from \"../../reducers/overlay\"\nimport RegisterButton from \"../RegisterButton\"\nimport SignInButton from \"../SignInButton\"\nimport SignInModalAutoOpen from \"../SignInModalAutoOpen\"\nimport NavbarBranding from \"./NavbarBranding\"\nimport NavbarExtraMenu from \"./NavbarExtraMenu\"\nimport NavbarNotificationsDropdown from \"./NavbarNotificationsDropdown\"\nimport NavbarNotificationsToggle from \"./NavbarNotificationsToggle\"\nimport NavbarPrivateThreads from \"./NavbarPrivateThreads\"\nimport NavbarSearchDropdown from \"./NavbarSearchDropdown\"\nimport NavbarSearchToggle from \"./NavbarSearchToggle\"\nimport NavbarSiteNavDropdown from \"./NavbarSiteNavDropdown\"\nimport NavbarSiteNavToggle from \"./NavbarSiteNavToggle\"\nimport NavbarUserNavDropdown from \"./NavbarUserNavDropdown\"\nimport NavbarUserNavToggle from \"./NavbarUserNavToggle\"\n\nexport function Navbar({\n dispatch,\n branding,\n extraMenuItems,\n authDelegated,\n user,\n searchUrl,\n notificationsUrl,\n privateThreadsUrl,\n showSearch,\n showPrivateThreads,\n}) {\n return (\n
    \n \n
    \n {extraMenuItems.length > 0 && (\n \n )}\n {!!showSearch && (\n \n )}\n {!!showSearch && (\n {\n dispatch(overlay.openSearch())\n event.preventDefault()\n }}\n />\n )}\n \n {\n dispatch(overlay.openSiteNav())\n }}\n />\n {!!showPrivateThreads && (\n \n )}\n {!!user && (\n \n )}\n {!!user && (\n {\n dispatch(overlay.openNotifications())\n event.preventDefault()\n }}\n />\n )}\n {!!user && (\n \n )}\n {!!user && (\n {\n dispatch(overlay.openUserNav())\n event.preventDefault()\n }}\n />\n )}\n {!user && }\n {!user && !authDelegated && (\n \n )}\n {!user && !authDelegated && }\n
    \n
    \n )\n}\n\nfunction select(state) {\n const settings = misago.get(\"SETTINGS\")\n const user = state.auth.user\n\n return {\n branding: {\n logo: settings.logo,\n logoXs: settings.logo_small,\n text: settings.logo_text,\n url: misago.get(\"MISAGO_PATH\"),\n },\n extraMenuItems: misago.get(\"extraMenuItems\"),\n\n user: !user.id\n ? null\n : {\n id: user.id,\n username: user.username,\n email: user.email,\n avatars: user.avatars,\n unreadNotifications: user.unreadNotifications,\n unreadPrivateThreads: user.unread_private_threads,\n url: user.url,\n },\n\n searchUrl: misago.get(\"SEARCH_URL\"),\n notificationsUrl: misago.get(\"NOTIFICATIONS_URL\"),\n privateThreadsUrl: misago.get(\"PRIVATE_THREADS_URL\"),\n\n authDelegated: settings.enable_oauth2_client,\n showSearch: !!user.acl.can_search,\n showPrivateThreads: !!user && !!user.acl.can_use_private_threads,\n }\n}\n\nconst NavbarConnected = connect(select)(Navbar)\n\nexport default NavbarConnected\n","import Navbar from \"./Navbar\"\n\nexport default Navbar\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport Navbar from \"../../components/Navbar\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"misago-navbar\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:navbar\",\n initializer: initializer,\n after: \"store\",\n})\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { DropdownFooter, DropdownPills } from \"../Dropdown\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\n\nexport default function NotificationsOverlayBody({\n children,\n open,\n showAll,\n showUnread,\n unread,\n}) {\n return (\n \n \n {pgettext(\"notifications title\", \"Notifications\")}\n \n \n \n {pgettext(\"notifications dropdown\", \"All\")}\n \n \n {pgettext(\"notifications dropdown\", \"Unread\")}\n \n \n {children}\n \n \n {pgettext(\"notifications\", \"See all notifications\")}\n \n \n \n )\n}\n\nfunction NotificationsOverlayBodyPill({ active, children, onClick }) {\n return (\n \n {children}\n \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport {\n NotificationsList,\n NotificationsListError,\n NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsOverlayBody from \"./NotificationsOverlayBody\"\n\nclass NotificationsOverlay extends React.Component {\n constructor(props) {\n super(props)\n\n this.body = document.body\n\n this.state = {\n unread: false,\n url: \"\",\n }\n }\n\n getApiUrl() {\n let url = misago.get(\"NOTIFICATIONS_API\") + \"?limit=20\"\n url += this.state.unread ? \"&filter=unread\" : \"\"\n return url\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.open !== this.props.open) {\n if (this.props.open) {\n this.body.classList.add(\"notifications-fullscreen\")\n } else {\n this.body.classList.remove(\"notifications-fullscreen\")\n }\n }\n }\n\n render = () => (\n this.setState({ unread: false })}\n showUnread={() => this.setState({ unread: true })}\n >\n \n {({ data, loading, error }) => {\n if (loading) {\n return \n }\n\n if (error) {\n return \n }\n\n return (\n \n )\n }}\n \n \n )\n}\n\nfunction select(state) {\n return { open: state.overlay.notifications }\n}\n\nconst NotificationsOverlayConnected = connect(select)(NotificationsOverlay)\n\nexport default NotificationsOverlayConnected\n","import NotificationsOverlay from \"./NotificationsOverlay\"\n\nexport default NotificationsOverlay\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport NotificationsOverlay from \"../../components/NotificationsOverlay\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n if (context.get(\"isAuthenticated\")) {\n const root = document.getElementById(\"notifications-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:notifications-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport { PageHeaderPlain } from \"../PageHeader\"\n\nexport default function NotificationsHeader() {\n return (\n \n )\n}\n","import PageTitle from \"./PageTitle\"\n\nexport default PageTitle\n","export default function PageTitle({ title, subtitle }) {\n const parts = []\n if (subtitle) {\n parts.push(subtitle)\n }\n if (title) {\n parts.push(title)\n }\n parts.push(misago.get(\"SETTINGS\").forum_name)\n\n document.title = parts.join(\" | \")\n return null\n}\n","import React from \"react\"\n\nexport default function PillsNav({ children }) {\n return
      {children}
    \n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function PillsNavLink({ active, link, icon, children }) {\n return (\n
  • \n \n {!!icon && {icon}}\n {children}\n \n
  • \n )\n}\n","import React from \"react\"\nimport { PillsNav, PillsNavLink } from \"../PillsNav\"\nimport { Toolbar, ToolbarSection, ToolbarItem } from \"../Toolbar\"\n\nexport default function NotificationsPills({ filter }) {\n const basename = misago.get(\"NOTIFICATIONS_URL\")\n\n return (\n \n \n \n \n \n {pgettext(\"notifications nav\", \"All\")}\n \n \n {pgettext(\"notifications nav\", \"Unread\")}\n \n \n {pgettext(\"notifications nav\", \"Read\")}\n \n \n \n \n \n )\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function NotificationsPagination({ baseUrl, data, disabled }) {\n return (\n
    \n \n {pgettext(\"notifications pagination\", \"Latest\")}\n \n \n {pgettext(\"notifications pagination\", \"Newer\")}\n \n \n {pgettext(\"notifications pagination\", \"Older\")}\n \n
    \n )\n}\n\nfunction NotificationsPaginationLink({ disabled, children, url }) {\n if (disabled) {\n return (\n \n )\n }\n\n return (\n \n {children}\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport Button from \"../button\"\nimport { Toolbar, ToolbarSection, ToolbarItem, ToolbarSpacer } from \"../Toolbar\"\nimport NotificationsPagination from \"./NotificationsPagination\"\n\nexport default function NotificationsToolbar({\n baseUrl,\n data,\n disabled,\n bottom,\n markAllAsRead,\n}) {\n return (\n \n \n \n \n \n \n \n \n \n \n done_all\n {pgettext(\"notifications\", \"Mark all as read\")}\n \n \n \n \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { updateAuthenticatedUser } from \"../../reducers/auth\"\nimport snackbar from \"../../services/snackbar\"\nimport { ApiMutation } from \"../Api\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport PageTitle from \"../PageTitle\"\nimport PageContainer from \"../PageContainer\"\nimport {\n NotificationsList,\n NotificationsListError,\n NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsPills from \"./NotificationsPills\"\nimport NotificationsToolbar from \"./NotificationsToolbar\"\n\nfunction NotificationsRoute({ dispatch, location, route }) {\n const { query } = location\n const { filter } = route.props\n\n const baseUrl = getBaseUrl(filter)\n\n return (\n \n \n\n \n\n \n {({ data, loading, error, refetch }) => (\n \n {(readAll, { loading: mutating }) => {\n const toolbarProps = {\n baseUrl,\n data,\n disabled:\n loading || mutating || !data || data.results.length === 0,\n markAllAsRead: async () => {\n const confirmed = window.confirm(\n pgettext(\"notifications\", \"Mark all notifications as read?\")\n )\n\n if (confirmed) {\n readAll({\n onSuccess: async () => {\n refetch()\n dispatch(\n updateAuthenticatedUser({ unreadNotifications: null })\n )\n snackbar.success(\n pgettext(\n \"notifications\",\n \"All notifications have been marked as read.\"\n )\n )\n },\n onError: snackbar.apiError,\n })\n }\n },\n }\n\n if (loading || mutating) {\n return (\n
    \n \n \n \n
    \n )\n }\n\n if (error) {\n return (\n
    \n \n \n \n
    \n )\n }\n\n if (data) {\n if (!data.hasPrevious && query) {\n window.history.replaceState({}, \"\", baseUrl)\n }\n\n return (\n
    \n \n \n \n
    \n )\n }\n\n return null\n }}\n
    \n )}\n
    \n
    \n )\n}\n\nfunction getSubtitle(filter) {\n if (filter === \"unread\") {\n return pgettext(\"notifications title\", \"Unread notifications\")\n } else if (filter === \"read\") {\n return pgettext(\"notifications title\", \"Read notifications\")\n } else {\n return null\n }\n}\n\nfunction getBaseUrl(filter) {\n let url = misago.get(\"NOTIFICATIONS_URL\")\n if (filter !== \"all\") {\n url += filter + \"/\"\n }\n return url\n}\n\nconst NotificationsRouteConnected = connect()(NotificationsRoute)\n\nexport default NotificationsRouteConnected\n","import Notifications from \"./Notifications\"\nimport NotificationsFetch from \"../NotificationsFetch/NotificationsFetch\"\n\nexport default Notifications\n\nexport { NotificationsFetch }\n","import React from \"react\"\nimport { Router, browserHistory } from \"react-router\"\nimport NotificationsHeader from \"./NotificationsHeader\"\nimport NotificationsRoute from \"./NotificationsRoute\"\n\nexport default function Notifications() {\n const basename = misago.get(\"NOTIFICATIONS_URL\")\n\n return (\n
    \n \n \n
    \n )\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport Notifications from \"../../components/Notifications\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const basename = misago.get(\"NOTIFICATIONS_URL\")\n if (\n document.location.pathname.startsWith(basename) &&\n !document.location.pathname.startsWith(basename + \"disable-email/\") &&\n context.get(\"isAuthenticated\")\n ) {\n const root = document.getElementById(\"page-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:notifications\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n \n
    \n )\n }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport PanelLoader from \"misago/components/panel-loader\"\nimport PanelMessage from \"misago/components/panel-message\"\nimport misago from \"misago/index\"\nimport polls from \"misago/services/polls\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"PROFILE_BAN\")) {\n this.initWithPreloadedData(misago.pop(\"PROFILE_BAN\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling(props.profile.api.ban)\n }\n\n initWithPreloadedData(ban) {\n if (ban.expires_on) {\n ban.expires_on = moment(ban.expires_on)\n }\n\n this.state = {\n isLoaded: true,\n ban,\n }\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling(api) {\n polls.start({\n poll: \"ban-details\",\n url: api,\n frequency: 90 * 1000,\n update: this.update,\n error: this.error,\n })\n }\n\n update = (ban) => {\n if (ban.expires_on) {\n ban.expires_on = moment(ban.expires_on)\n }\n\n this.setState({\n isLoaded: true,\n error: null,\n\n ban,\n })\n }\n\n error = (error) => {\n this.setState({\n isLoaded: true,\n error: error.detail,\n ban: null,\n })\n }\n\n componentDidMount() {\n title.set({\n title: pgettext(\"profile ban details title\", \"Ban details\"),\n parent: this.props.profile.username,\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"ban-details\")\n }\n\n getUserMessage() {\n if (this.state.ban.user_message) {\n return (\n
    \n

    {pgettext(\"profile ban details\", \"User-shown ban message\")}

    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getStaffMessage() {\n if (this.state.ban.staff_message) {\n return (\n
    \n

    {pgettext(\"profile ban details\", \"Team-shown ban message\")}

    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getExpirationMessage() {\n if (this.state.ban.expires_on) {\n if (this.state.ban.expires_on.isAfter(moment())) {\n let title = interpolate(\n pgettext(\n \"profile ban details\",\n \"This ban expires on %(expires_on)s.\"\n ),\n {\n expires_on: this.state.ban.expires_on.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n pgettext(\"profile ban details\", \"This ban expires %(expires_on)s.\"),\n {\n expires_on: this.state.ban.expires_on.fromNow(),\n },\n true\n )\n\n return {message}\n } else {\n return pgettext(\"profile ban details\", \"This ban has expired.\")\n }\n } else {\n return interpolate(\n pgettext(\"profile ban details\", \"%(username)s's ban is permanent.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getPanelBody() {\n if (this.state.ban) {\n if (Object.keys(this.state.ban).length) {\n return (\n
    \n {this.getUserMessage()}\n {this.getStaffMessage()}\n\n
    \n

    {pgettext(\"profile ban details\", \"Ban expiration\")}

    \n

    {this.getExpirationMessage()}

    \n
    \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n } else if (this.state.error) {\n return (\n
    \n \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n

    \n {pgettext(\"profile ban details title\", \"Ban details\")}\n

    \n
    \n\n {this.getPanelBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default function ({ display }) {\n if (!display) return null\n\n return (\n \n )\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({ display }) {\n if (!display) return null\n\n return (\n
    \n \n
    \n )\n}\n","import React from \"react\"\nimport Select from \"misago/components/select\"\n\nexport default class extends React.Component {\n onChange = (ev) => {\n const { field, onChange } = this.props\n onChange(field.fieldname, ev.target.value)\n }\n\n render() {\n const { disabled, field, value } = this.props\n const { input } = field\n\n if (input.type === \"select\") {\n return (\n \n )\n }\n\n if (input.type === \"textarea\") {\n return (\n \n )\n }\n\n if (input.type === \"text\") {\n return (\n \n )\n }\n\n return null\n }\n}\n","import React from \"react\"\nimport FieldInput from \"./field-input\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport default function ({ disabled, errors, fields, name, onChange, value }) {\n return (\n
    \n {name}\n {fields.map((field) => {\n return (\n \n \n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Fieldset from \"./fieldset\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n errors: {},\n }\n\n const groups = props.groups.length\n for (let i = 0; i < groups; i++) {\n const group = props.groups[i]\n const fields = group.fields.length\n for (let f = 0; f < fields; f++) {\n const fieldname = group.fields[f].fieldname\n const initial = group.fields[f].initial\n this.state[fieldname] = initial\n }\n }\n }\n\n send() {\n const data = Object.assign({}, this.state, {\n errors: null,\n isLoading: null,\n })\n\n return ajax.post(this.props.api, data)\n }\n\n handleSuccess(data) {\n this.props.onSuccess(data)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({ errors: rejection })\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onChange = (name, value) => {\n this.setState({\n [name]: value,\n })\n }\n\n render() {\n return (\n
    \n
    \n {this.props.groups.map((group, i) => {\n return (\n \n )\n })}\n
    \n
    \n {\" \"}\n \n
    \n
    \n )\n }\n}\n\nexport function CancelButton({ onCancel, disabled }) {\n if (!onCancel) return null\n\n return (\n \n {pgettext(\"user profile details form btn\", \"Cancel\")}\n \n )\n}\n","import React from \"react\"\nimport Blankslate from \"./blankslate\"\nimport Loader from \"./loader\"\nimport Form from \"./form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n loading: true,\n groups: null,\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.api).then(\n (groups) => {\n this.setState({\n loading: false,\n\n groups,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n if (this.props.cancel) {\n this.props.cancel()\n }\n }\n )\n }\n\n render() {\n const { groups, loading } = this.state\n\n return (\n
    \n
    \n

    \n {pgettext(\"user profile details form title\", \"Edit details\")}\n

    \n
    \n \n \n \n
    \n )\n }\n}\n\nexport function FormDisplay({ api, display, groups, onCancel, onSuccess }) {\n if (!display) return null\n\n return (\n
    \n )\n}\n","import React from \"react\"\nimport Form from \"misago/components/edit-details\"\n\nexport default function ({ api, display, onCancel, onSuccess }) {\n if (!display) return null\n\n return \n}\n","import React from \"react\"\n\nexport default function ({ isAuthenticated, profile }) {\n let message = null\n if (isAuthenticated) {\n message = pgettext(\n \"profile details empty\",\n \"You are not sharing any details with others.\"\n )\n } else {\n message = interpolate(\n pgettext(\n \"profile details empty\",\n \"%(username)s is not sharing any details with others.\"\n ),\n {\n username: profile.username,\n },\n true\n )\n }\n\n return (\n
    \n
    {message}
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ html, text, url }) {\n if (html) {\n return (\n \n )\n }\n\n return (\n
    \n \n
    \n )\n}\n\nexport function SafeValue({ text, url }) {\n if (url) {\n return (\n

    \n \n {text || url}\n \n

    \n )\n }\n\n if (text) {\n return

    {text}

    \n }\n\n return null\n}\n","import React from \"react\"\nimport FieldValue from \"./field-value\"\n\nexport default function (props) {\n return (\n
    \n {props.name}:\n \n
    \n )\n}\n","import React from \"react\"\nimport Field from \"./field\"\n\nexport default function ({ fields, name }) {\n return (\n
    \n
    \n

    {name}

    \n
    \n
    \n
    \n {fields.map(({ fieldname, html, name, text, url }) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport EmptyMessage from \"./empty-message\"\nimport Group from \"./group\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({\n display,\n groups,\n isAuthenticated,\n loading,\n profile,\n}) {\n if (!display) return null\n\n if (loading) {\n return \n }\n\n if (!groups.length) {\n return \n }\n\n return (\n
    \n {groups.map((group, i) => {\n return \n })}\n
    \n )\n}\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nconst ProfileDetailsHeader = ({ onEdit, showEditButton }) => (\n \n \n \n

    {pgettext(\"profile details title\", \"Details\")}

    \n
    \n
    \n {showEditButton && (\n \n \n \n {pgettext(\"profile details edit btn\", \"Edit\")}\n \n \n \n )}\n
    \n)\n\nexport default ProfileDetailsHeader\n","import React from \"react\"\nimport { load } from \"misago/reducers/profile-details\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n componentDidMount() {\n const { data, dispatch, user } = this.props\n if (data && data.id === user.id) return\n\n ajax.get(this.props.user.api.details).then(\n (data) => {\n dispatch(load(data))\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n return this.props.children\n }\n}\n","import React from \"react\"\nimport Form from \"./form\"\nimport GroupsList from \"./groups-list\"\nimport Header from \"./header\"\nimport ProfileDetailsData from \"misago/data/profile-details\"\nimport { load as loadDetails } from \"misago/reducers/profile-details\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n editing: false,\n }\n }\n\n componentDidMount() {\n title.set({\n title: pgettext(\"profile details title\", \"Details\"),\n parent: this.props.profile.username,\n })\n }\n\n onCancel = () => {\n this.setState({ editing: false })\n }\n\n onEdit = () => {\n this.setState({ editing: true })\n }\n\n onSuccess = (newDetails) => {\n const { dispatch, isAuthenticated, profile } = this.props\n\n let message = null\n if (isAuthenticated) {\n message = pgettext(\n \"profile details form\",\n \"Your details have been changed.\"\n )\n } else {\n message = interpolate(\n pgettext(\n \"profile details form\",\n \"%(username)s's details have been changed.\"\n ),\n {\n username: profile.username,\n },\n true\n )\n }\n\n snackbar.info(message)\n dispatch(loadDetails(newDetails))\n this.setState({ editing: false })\n }\n\n render() {\n const { dispatch, isAuthenticated, profile, profileDetails } = this.props\n const loading = profileDetails.id !== profile.id\n\n return (\n \n
    \n \n \n \n
    \n \n )\n }\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport * as posts from \"misago/reducers/posts\"\nimport title from \"misago/services/page-title\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n loadItems(start = 0) {\n ajax\n .get(this.props.api, {\n start: start || 0,\n })\n .then(\n (data) => {\n if (start === 0) {\n store.dispatch(posts.load(data))\n } else {\n store.dispatch(posts.append(data))\n }\n\n this.setState({\n isLoading: false,\n })\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.apiError(rejection)\n }\n )\n }\n\n loadMore = () => {\n this.setState({\n isLoading: true,\n })\n\n this.loadItems(this.props.posts.next)\n }\n\n componentDidMount() {\n title.set({\n title: this.props.title,\n parent: this.props.profile.username,\n })\n\n this.loadItems()\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.props.header}

    \n
    \n
    \n
    \n \n
    \n )\n }\n}\n\nexport function Feed(props) {\n if (props.posts.isLoaded && !props.posts.results.length) {\n return

    {props.emptyMessage}

    \n }\n\n return (\n
    \n \n \n
    \n )\n}\n\nexport function LoadMoreButton(props) {\n if (!props.next) return null\n\n return (\n
    \n \n {pgettext(\"profile load more btn\", \"Show older activity\")}\n \n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.className) {\n return \"form-search \" + this.props.className\n } else {\n return \"form-search\"\n }\n }\n\n render() {\n return (\n
    \n \n search\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsersList from \"misago/components/users-list\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.setSpecialProps()\n\n if (misago.has(this.PRELOADED_DATA_KEY)) {\n this.initWithPreloadedData(misago.pop(this.PRELOADED_DATA_KEY))\n } else {\n this.initWithoutPreloadedData()\n }\n }\n\n setSpecialProps() {\n this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWERS\"\n this.TITLE = pgettext(\"profile followers title\", \"Followers\")\n this.API_FILTER = \"followers\"\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n isBusy: false,\n\n search: \"\",\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n isBusy: false,\n\n search: \"\",\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n }\n\n this.loadUsers()\n }\n\n loadUsers(page = 1, search = null) {\n const apiUrl = this.props.profile.api[this.API_FILTER]\n\n ajax\n .get(\n apiUrl,\n {\n search: search,\n page: page || 1,\n },\n \"user-\" + this.API_FILTER\n )\n .then(\n (data) => {\n if (page === 1) {\n store.dispatch(hydrate(data.results))\n } else {\n store.dispatch(append(data.results))\n }\n\n this.setState({\n isLoaded: true,\n isBusy: false,\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n componentDidMount() {\n title.set({\n title: this.TITLE,\n parent: this.props.profile.username,\n })\n }\n\n loadMore = () => {\n this.setState({\n isBusy: true,\n })\n\n this.loadUsers(this.state.page + 1, this.state.search)\n }\n\n search = (ev) => {\n this.setState({\n isLoaded: false,\n isBusy: true,\n\n search: ev.target.value,\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n })\n\n this.loadUsers(1, ev.target.value)\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return pgettext(\"Loading...\")\n } else if (this.state.search) {\n let message = npgettext(\n \"profile followers\",\n \"Found %(users)s user.\",\n \"Found %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = npgettext(\n \"profile followers\",\n \"You have %(users)s follower.\",\n \"You have %(users)s followers.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else {\n let message = npgettext(\n \"profile followers\",\n \"%(username)s has %(users)s follower.\",\n \"%(username)s has %(users)s followers.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n users: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return pgettext(\n \"profile followers\",\n \"Search returned no users matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return pgettext(\"profile followers\", \"You have no followers.\")\n } else {\n return interpolate(\n pgettext(\"profile followers\", \"%(username)s has no followers.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getMoreButton() {\n if (!this.state.more) return null\n\n return (\n
    \n \n {interpolate(\n pgettext(\"profile followers\", \"Show more (%(more)s)\"),\n {\n more: this.state.more,\n },\n true\n )}\n \n
    \n )\n }\n\n getListBody() {\n if (this.state.isLoaded && this.state.count === 0) {\n return

    {this.getEmptyMessage()}

    \n }\n\n return (\n
    \n \n\n {this.getMoreButton()}\n
    \n )\n }\n\n getClassName() {\n return \"profile-\" + this.API_FILTER\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.getLabel()}

    \n
    \n
    \n \n \n \n \n \n
    \n\n {this.getListBody()}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Followers from \"misago/components/profile/followers\"\n\nexport default class extends Followers {\n setSpecialProps() {\n this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWS\"\n this.TITLE = pgettext(\"profile follows title\", \"Follows\")\n this.API_FILTER = \"follows\"\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return pgettext(\"profile follows\", \"Loading...\")\n } else if (this.state.search) {\n let message = npgettext(\n \"profile follows\",\n \"Found %(users)s user.\",\n \"Found %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = npgettext(\n \"profile follows\",\n \"You are following %(users)s user.\",\n \"You are following %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else {\n let message = npgettext(\n \"profile follows\",\n \"%(username)s is following %(users)s user.\",\n \"%(username)s is following %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n users: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return pgettext(\n \"profile follows\",\n \"Search returned no users matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return pgettext(\"profile follows\", \"You are not following any users.\")\n } else {\n return interpolate(\n pgettext(\"profile follows\", \"%(username)s is not following any users.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getEmptyMessage() {\n if (this.props.emptyMessage) {\n return this.props.emptyMessage\n } else {\n return pgettext(\n \"username history empty\",\n \"Your account has no history of name changes.\"\n )\n }\n }\n\n render() {\n return (\n
    \n
      \n
    • \n {this.getEmptyMessage()}\n
    • \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default class extends React.Component {\n renderUserAvatar() {\n if (this.props.change.changed_by) {\n return (\n \n \n \n )\n } else {\n return (\n \n \n \n )\n }\n }\n\n renderUsername() {\n if (this.props.change.changed_by) {\n return (\n \n {this.props.change.changed_by.username}\n \n )\n } else {\n return (\n \n {this.props.change.changed_by_username}\n \n )\n }\n }\n\n render() {\n return (\n
  • \n
    {this.renderUserAvatar()}
    \n
    {this.renderUsername()}
    \n
    \n {this.props.change.old_username}\n arrow_forward\n {this.props.change.new_username}\n
    \n
    \n \n {this.props.change.changed_on.fromNow()}\n \n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport Change from \"misago/components/username-history/change\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n
      \n {this.props.changes.map((change) => {\n return \n })}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n getClassName() {\n if (this.props.hiddenOnMobile) {\n return \"list-group-item hidden-xs hidden-sm\"\n } else {\n return \"list-group-item\"\n }\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n
    \n \n  \n \n
    \n
    \n \n  \n \n arrow_forward\n \n  \n \n
    \n
    \n \n  \n \n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ChangePreview from \"misago/components/username-history/change-preview\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n
      \n {[0, 1, 2].map((i) => {\n return 0} key={i} />\n })}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/username-history/list-empty\"\nimport ListReady from \"misago/components/username-history/list-ready\"\nimport ListPreview from \"misago/components/username-history/list-preview\"\n\nexport default class extends React.Component {\n render() {\n if (this.props.isLoaded) {\n if (this.props.changes.length) {\n return \n } else {\n return \n }\n } else {\n return \n }\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsernameHistory from \"misago/components/username-history/root\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/username-history\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"PROFILE_NAME_HISTORY\")) {\n this.initWithPreloadedData(misago.pop(\"PROFILE_NAME_HISTORY\"))\n } else {\n this.initWithoutPreloadedData()\n }\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n isBusy: false,\n\n search: \"\",\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n isBusy: false,\n\n search: \"\",\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n }\n\n this.loadChanges()\n }\n\n loadChanges(page = 1, search = null) {\n ajax\n .get(\n misago.get(\"USERNAME_CHANGES_API\"),\n {\n user: this.props.profile.id,\n search: search,\n page: page || 1,\n },\n \"search-username-history\"\n )\n .then(\n (data) => {\n if (page === 1) {\n store.dispatch(hydrate(data.results))\n } else {\n store.dispatch(append(data.results))\n }\n\n this.setState({\n isLoaded: true,\n isBusy: false,\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n componentDidMount() {\n title.set({\n title: pgettext(\"profile username history title\", \"Username history\"),\n parent: this.props.profile.username,\n })\n }\n\n loadMore = () => {\n this.setState({\n isBusy: true,\n })\n\n this.loadChanges(this.state.page + 1, this.state.search)\n }\n\n search = (ev) => {\n this.setState({\n isLoaded: false,\n isBusy: true,\n\n search: ev.target.value,\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n })\n\n this.loadChanges(1, ev.target.value)\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return pgettext(\"profile username history\", \"Loading...\")\n } else if (this.state.search) {\n let message = npgettext(\n \"profile username history\",\n \"Found %(changes)s username change.\",\n \"Found %(changes)s username changes.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n changes: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = npgettext(\n \"profile username history\",\n \"Your username was changed %(changes)s time.\",\n \"Your username was changed %(changes)s times.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n changes: this.state.count,\n },\n true\n )\n } else {\n let message = npgettext(\n \"profile username history\",\n \"%(username)s's username was changed %(changes)s time.\",\n \"%(username)s's username was changed %(changes)s times.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n changes: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return pgettext(\n \"profile username history\",\n \"Search returned no username changes matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return pgettext(\n \"username history empty\",\n \"Your account has no history of name changes.\"\n )\n } else {\n return interpolate(\n pgettext(\n \"profile username history\",\n \"%(username)s's username was never changed.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getMoreButton() {\n if (!this.state.more) return null\n\n return (\n
    \n \n {interpolate(\n pgettext(\"profile username history\", \"Show older (%(more)s)\"),\n {\n more: this.state.more,\n },\n true\n )}\n \n
    \n )\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.getLabel()}

    \n
    \n
    \n \n \n \n \n \n
    \n\n \n\n {this.getMoreButton()}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport { patch } from \"misago/reducers/profile\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n getClassName() {\n if (this.props.profile.is_followed) {\n return this.props.className + \" btn-default btn-following\"\n } else {\n return this.props.className + \" btn-default btn-follow\"\n }\n }\n\n getIcon() {\n if (this.props.profile.is_followed) {\n return \"favorite\"\n } else {\n return \"favorite_border\"\n }\n }\n\n getLabel() {\n if (this.props.profile.is_followed) {\n return pgettext(\"user profile follow btn\", \"Following\")\n } else {\n return pgettext(\"user profile follow btn\", \"Follow\")\n }\n }\n\n action = () => {\n this.setState({\n isLoading: true,\n })\n\n if (this.props.profile.is_followed) {\n store.dispatch(\n patch({\n is_followed: false,\n followers: this.props.profile.followers - 1,\n })\n )\n } else {\n store.dispatch(\n patch({\n is_followed: true,\n followers: this.props.profile.followers + 1,\n })\n )\n }\n\n ajax.post(this.props.profile.api.follow).then(\n (data) => {\n this.setState({\n isLoading: false,\n })\n\n store.dispatch(patch(data))\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n })\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n return (\n \n {this.getIcon()}\n {this.getLabel()}\n \n )\n }\n}\n","import React from \"react\"\nimport posting from \"misago/services/posting\"\nimport misago from \"misago\"\n\nexport default class extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"START_PRIVATE\",\n submit: misago.get(\"PRIVATE_THREADS_API\"),\n\n to: [this.props.profile],\n })\n }\n\n render() {\n const canMessage = this.props.user.acl.can_start_private_threads\n const isProfileOwner = this.props.user.id === this.props.profile.id\n\n if (!canMessage || isProfileOwner) return null\n\n return (\n \n comment\n {pgettext(\"profile message btn\", \"Message\")}\n \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { updateAvatar } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n error: null,\n\n is_avatar_locked: \"\",\n avatar_lock_user_message: \"\",\n avatar_lock_staff_message: \"\",\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.moderate_avatar).then(\n (options) => {\n this.setState({\n isLoaded: true,\n\n is_avatar_locked: options.is_avatar_locked,\n avatar_lock_user_message: options.avatar_lock_user_message || \"\",\n avatar_lock_staff_message: options.avatar_lock_staff_message || \"\",\n })\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(this.validate().username[0])\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.profile.api.moderate_avatar, {\n is_avatar_locked: this.state.is_avatar_locked,\n avatar_lock_user_message: this.state.avatar_lock_user_message,\n avatar_lock_staff_message: this.state.avatar_lock_staff_message,\n })\n }\n\n handleSuccess(apiResponse) {\n store.dispatch(updateAvatar(this.props.profile, apiResponse.avatar_hash))\n snackbar.success(\n pgettext(\n \"profile avatar moderation\",\n \"Avatar controls have been changed.\"\n )\n )\n }\n\n getFormBody() {\n return (\n \n
    \n \n \n \n\n \n \n \n\n \n \n \n
    \n
    \n \n {pgettext(\"profile avatar moderation btn\", \"Close\")}\n \n \n
    \n \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n return this.getFormBody()\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error) {\n return \"modal-dialog modal-message modal-avatar-controls\"\n } else {\n return \"modal-dialog modal-avatar-controls\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"profile avatar moderation title\", \"Avatar controls\")}\n

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { addNameChange } from \"misago/reducers/username-history\"\nimport { updateUsername } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n error: null,\n\n username: \"\",\n validators: {\n username: [validators.usernameContent()],\n },\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.moderate_username).then(\n () => {\n this.setState({\n isLoaded: true,\n })\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(this.validate().username[0])\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.profile.api.moderate_username, {\n username: this.state.username,\n })\n }\n\n handleSuccess(apiResponse) {\n this.setState({\n username: \"\",\n })\n\n store.dispatch(\n addNameChange(apiResponse, this.props.profile, this.props.user)\n )\n store.dispatch(\n updateUsername(this.props.profile, apiResponse.username, apiResponse.slug)\n )\n\n snackbar.success(\n pgettext(\"profile username moderation\", \"Username has been changed.\")\n )\n }\n\n getFormBody() {\n return (\n
    \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"profile username moderation btn\", \"Cancel\")}\n \n \n
    \n
    \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n return this.getFormBody()\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error) {\n return \"modal-dialog modal-message modal-rename-user\"\n } else {\n return \"modal-dialog modal-rename-user\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"profile username moderation title\", \"Change username\")}\n

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport polls from \"misago/services/polls\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n isDeleted: false,\n error: null,\n\n countdown: 5,\n confirm: false,\n\n with_content: false,\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.delete).then(\n () => {\n this.setState({\n isLoaded: true,\n })\n\n this.countdown()\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n countdown = () => {\n window.setTimeout(() => {\n if (this.state.countdown > 1) {\n this.setState({\n countdown: this.state.countdown - 1,\n })\n this.countdown()\n } else if (!this.state.confirm) {\n this.setState({\n confirm: true,\n })\n }\n }, 1000)\n }\n\n send() {\n return ajax.post(this.props.profile.api.delete, {\n with_content: this.state.with_content,\n })\n }\n\n handleSuccess() {\n polls.stop(\"user-profile\")\n\n if (this.state.with_content) {\n this.setState({\n isDeleted: interpolate(\n pgettext(\n \"profile delete\",\n \"%(username)s's account, threads, posts and other content has been deleted.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n ),\n })\n } else {\n this.setState({\n isDeleted: interpolate(\n pgettext(\n \"profile delete\",\n \"%(username)s's account has been deleted and other content has been hidden.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n ),\n })\n }\n }\n\n getButtonLabel() {\n if (this.state.confirm) {\n return interpolate(\n pgettext(\"profile delete btn\", \"Delete %(username)s\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n } else {\n return interpolate(\n pgettext(\"profile delete btn\", \"Please wait... (%(countdown)ss)\"),\n {\n countdown: this.state.countdown,\n },\n true\n )\n }\n }\n\n getForm() {\n return (\n
    \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"profile delete btn\", \"Cancel\")}\n \n\n \n {this.getButtonLabel()}\n \n
    \n
    \n )\n }\n\n getDeletedBody() {\n return (\n
    \n
    \n info_outline\n
    \n \n
    \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n if (this.state.isDeleted) {\n return this.getDeletedBody()\n } else {\n return this.getForm()\n }\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error || this.state.isDeleted) {\n return \"modal-dialog modal-message modal-delete-account\"\n } else {\n return \"modal-dialog modal-delete-account\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"profile delete title\", \"Delete user account\")}\n

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport AvatarControls from \"misago/components/profile/moderation/avatar-controls\"\nimport ChangeUsername from \"misago/components/profile/moderation/change-username\"\nimport DeleteAccount from \"misago/components/profile/moderation/delete-account\"\nimport modal from \"misago/services/modal\"\n\nlet select = function (store) {\n return {\n tick: store.tick,\n user: store.auth,\n profile: store.profile,\n }\n}\n\nexport default class extends React.Component {\n showAvatarDialog = () => {\n modal.show(connect(select)(AvatarControls))\n }\n\n showRenameDialog = () => {\n modal.show(connect(select)(ChangeUsername))\n }\n\n showDeleteDialog = () => {\n modal.show(connect(select)(DeleteAccount))\n }\n\n render() {\n const { moderation } = this.props\n\n return (\n
      \n {!!moderation.avatar && (\n
    • \n \n portrait\n {pgettext(\"profile moderation menu\", \"Avatar controls\")}\n \n
    • \n )}\n {!!moderation.rename && (\n
    • \n \n credit_card\n {pgettext(\"profile moderation menu\", \"Change username\")}\n \n
    • \n )}\n {!!moderation.delete && (\n
    • \n \n clear\n {pgettext(\"profile moderation menu\", \"Delete account\")}\n \n
    • \n )}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Status, { StatusIcon, StatusLabel } from \"../user-status\"\n\nconst ProfileDataList = ({ profile }) => (\n
      \n {profile.is_active === false && (\n
    • \n \n {pgettext(\"profile data list\", \"Account disabled\")}\n \n
    • \n )}\n
    • \n \n \n \n \n
    • \n {profile.rank.is_tab ? (\n
    • \n \n {profile.rank.name}\n \n
    • \n ) : (\n
    • \n {profile.rank.name}\n
    • \n )}\n {(profile.title || profile.rank.title) && (\n
    • {profile.title || profile.rank.title}
    • \n )}\n
    • \n \n {interpolate(\n pgettext(\"profile data list\", \"Joined %(joined_on)s\"),\n {\n joined_on: profile.joined_on.fromNow(),\n },\n true\n )}\n \n
    • \n {profile.email && (\n
    • \n \n {profile.email}\n \n
    • \n )}\n
    \n)\n\nexport default ProfileDataList\n","import React from \"react\"\nimport Avatar from \"../avatar\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n PageHeaderDetails,\n} from \"../PageHeader\"\nimport FollowButton from \"./follow-button\"\nimport MessageButton from \"./message-button\"\nimport ModerationOptions from \"./moderation/nav\"\nimport ProfileDataList from \"./ProfileDataList\"\n\nconst ProfileHeader = ({ profile, user, moderation, message, follow }) => (\n \n \n \n
    \n
    \n \n \n \n
    \n

    {profile.username}

    \n
    \n \n \n \n \n \n \n \n \n {message && (\n \n \n \n \n {moderation.available && !follow && (\n \n
    \n \n \n
    \n
    \n )}\n
    \n )}\n {follow && (\n \n \n \n \n {moderation.available && (\n \n
    \n \n \n
    \n
    \n )}\n
    \n )}\n {moderation.available && !follow && !message && (\n \n \n
    \n \n \n
    \n
    \n \n
    \n \n settings\n {pgettext(\"profile options btn\", \"Options\")}\n \n \n
    \n
    \n
    \n )}\n
    \n
    \n \n
    \n)\n\nconst ProfileModerationButton = () => (\n \n settings\n \n)\n\nexport default ProfileHeader\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst ProfileNav = ({ baseUrl, page, pages }) => (\n
    \n
    \n \n {page.icon}\n {page.name}\n \n
      \n {pages.map((page) => (\n
    • \n \n {page.icon}\n {page.name}\n \n
    • \n ))}\n
    \n
    \n
      \n {pages.map((page) => (\n
    • \n \n {page.icon}\n {page.name}\n \n
    • \n ))}\n
    \n
    \n)\n\nexport default ProfileNav\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport BanDetails from \"./ban-details\"\nimport Details from \"./details\"\nimport { Posts, Threads } from \"./feed\"\nimport Followers from \"./followers\"\nimport Follows from \"./follows\"\nimport UsernameHistory from \"./username-history\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport PageContainer from \"../PageContainer\"\nimport ProfileHeader from \"./ProfileHeader\"\nimport ProfileNav from \"./ProfileNav\"\n\nexport default class extends WithDropdown {\n constructor(props) {\n super(props)\n\n this.startPolling(props.profile.api.index)\n }\n\n startPolling(api) {\n polls.start({\n poll: \"user-profile\",\n url: api,\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data))\n }\n\n render() {\n const baseUrl = misago.get(\"PROFILE\").url\n const pages = misago.get(\"PROFILE_PAGES\")\n const page = pages.filter((page) => {\n const url = baseUrl + page.component + \"/\"\n return this.props.location.pathname === url\n })[0]\n const { profile, user } = this.props\n const moderation = getModeration(profile, user)\n const message =\n !!user.acl.can_start_private_threads && profile.id !== user.id\n const follow = !!profile.acl.can_follow && profile.id !== user.id\n\n return (\n
    \n \n \n \n\n {this.props.children}\n \n
    \n )\n }\n}\n\nconst getModeration = (profile, user) => {\n const moderation = {\n available: false,\n rename: false,\n avatar: false,\n delete: false,\n }\n\n if (user.is_anonymous) return moderation\n\n moderation.rename = profile.acl.can_rename\n moderation.avatar = profile.acl.can_moderate_avatar\n moderation.delete = profile.acl.can_delete\n moderation.available = !!(\n moderation.rename ||\n moderation.avatar ||\n moderation.delete\n )\n\n return moderation\n}\n\nexport function select(store) {\n return {\n isAuthenticated: store.auth.user.id === store.profile.id,\n\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n posts: store.posts,\n profile: store.profile,\n profileDetails: store[\"profile-details\"],\n \"username-history\": store[\"username-history\"],\n }\n}\n\nconst COMPONENTS = {\n posts: Posts,\n threads: Threads,\n followers: Followers,\n follows: Follows,\n details: Details,\n \"username-history\": UsernameHistory,\n \"ban-details\": BanDetails,\n}\n\nexport function paths() {\n let paths = []\n misago.get(\"PROFILE_PAGES\").forEach(function (item) {\n paths.push(\n Object.assign({}, item, {\n path: misago.get(\"PROFILE\").url + item.component + \"/\",\n component: connect(select)(COMPONENTS[item.component]),\n })\n )\n })\n\n return paths\n}\n","import React from \"react\"\nimport Route from \"./route\"\n\nexport function Threads(props) {\n let emptyMessage = null\n if (props.user.id === props.profile.id) {\n emptyMessage = pgettext(\n \"profile threads\",\n \"You haven't started any threads.\"\n )\n } else {\n emptyMessage = interpolate(\n pgettext(\"profile threads\", \"%(username)s hasn't started any threads\"),\n {\n username: props.profile.username,\n },\n true\n )\n }\n\n let header = null\n if (!props.posts.isLoaded) {\n header = pgettext(\"profile threads\", \"Loading...\")\n } else if (props.profile.id === props.user.id) {\n const message = npgettext(\n \"profile threads\",\n \"You have started %(threads)s thread.\",\n \"You have started %(threads)s threads.\",\n props.profile.threads\n )\n\n header = interpolate(\n message,\n {\n threads: props.profile.threads,\n },\n true\n )\n } else {\n const message = npgettext(\n \"profile threads\",\n \"%(username)s has started %(threads)s thread.\",\n \"%(username)s has started %(threads)s threads.\",\n props.profile.threads\n )\n\n header = interpolate(\n message,\n {\n username: props.profile.username,\n threads: props.profile.threads,\n },\n true\n )\n }\n\n return (\n \n )\n}\n\nexport function Posts(props) {\n let emptyMessage = null\n if (props.user.id === props.profile.id) {\n emptyMessage = pgettext(\"profile posts\", \"You have posted no messages.\")\n } else {\n emptyMessage = interpolate(\n pgettext(\"profile posts\", \"%(username)s posted no messages.\"),\n {\n username: props.profile.username,\n },\n true\n )\n }\n\n let header = null\n if (!props.posts.isLoaded) {\n header = pgettext(\"profile posts\", \"Loading...\")\n } else if (props.profile.id === props.user.id) {\n const message = npgettext(\n \"profile posts\",\n \"You have posted %(posts)s message.\",\n \"You have posted %(posts)s messages.\",\n props.profile.posts\n )\n\n header = interpolate(\n message,\n {\n posts: props.profile.posts,\n },\n true\n )\n } else {\n const message = npgettext(\n \"profile posts\",\n \"%(username)s has posted %(posts)s message.\",\n \"%(username)s has posted %(posts)s messages.\",\n props.profile.posts\n )\n\n header = interpolate(\n message,\n {\n username: props.profile.username,\n posts: props.profile.posts,\n },\n true\n )\n }\n\n return (\n \n )\n}\n","import { connect } from \"react-redux\"\nimport Profile, { paths, select } from \"misago/components/profile/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"PROFILE\") && context.has(\"PROFILE_PAGES\")) {\n mount({\n root: misago.get(\"PROFILE\").url,\n component: connect(select)(Profile),\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:profile\",\n initializer: initializer,\n after: \"reducer:profile-hydrate\",\n})\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestLinkForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n email: \"\",\n\n validators: {\n email: [validators.email()],\n },\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(\n pgettext(\n \"request activation link form\",\n \"Enter a valid e-mail address.\"\n )\n )\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"SEND_ACTIVATION_API\"), {\n email: this.state.email,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if ([\"already_active\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n snackbar.info(rejection.detail)\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {pgettext(\"request activation link form btn\", \"Send link\")}\n \n \n
    \n )\n }\n}\n\nexport class LinkSent extends React.Component {\n getMessage() {\n return interpolate(\n pgettext(\n \"request activation link form\",\n \"Activation link was sent to %(email)s\"\n ),\n {\n email: this.props.user.email,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n check\n
    \n
    \n

    {this.getMessage()}

    \n
    \n \n {pgettext(\n \"request activation link form btn\",\n \"Request another link\"\n )}\n \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n complete = (apiResponse) => {\n this.setState({\n complete: apiResponse,\n })\n }\n\n reset = () => {\n this.setState({\n complete: false,\n })\n }\n\n render() {\n if (this.state.complete) {\n return \n } else {\n return \n }\n }\n}\n","import misago from \"misago/index\"\nimport RequestActivationLink from \"misago/components/request-activation-link\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"request-activation-link-mount\")) {\n mount(RequestActivationLink, \"request-activation-link-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:request-activation-link\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestResetForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n email: \"\",\n\n validators: {\n email: [validators.email()],\n },\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(\n pgettext(\"request password reset form\", \"Enter a valid e-mail address.\")\n )\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"SEND_PASSWORD_RESET_API\"), {\n email: this.state.email,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if ([\"inactive_user\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n this.props.showInactivePage(rejection)\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {pgettext(\"request password reset form btn\", \"Send link\")}\n \n \n
    \n )\n }\n}\n\nexport class LinkSent extends React.Component {\n getMessage() {\n return interpolate(\n pgettext(\n \"request password reset form\",\n \"Reset password link was sent to %(email)s\"\n ),\n {\n email: this.props.user.email,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n check\n
    \n
    \n

    {this.getMessage()}

    \n
    \n \n {pgettext(\n \"request password reset form btn\",\n \"Request another link\"\n )}\n \n
    \n
    \n )\n }\n}\n\nexport class AccountInactivePage extends React.Component {\n getActivateButton() {\n if (this.props.activation === \"inactive_user\") {\n return (\n

    \n \n {pgettext(\n \"request password reset form error\",\n \"Activate your account.\"\n )}\n \n

    \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n info_outline\n
    \n\n
    \n

    \n {pgettext(\n \"request password reset form error\",\n \"Your account is inactive.\"\n )}\n

    \n

    {this.props.message}

    \n {this.getActivateButton()}\n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n complete = (apiResponse) => {\n this.setState({\n complete: apiResponse,\n })\n }\n\n reset = () => {\n this.setState({\n complete: false,\n })\n }\n\n showInactivePage(apiResponse) {\n ReactDOM.render(\n ,\n document.getElementById(\"page-mount\")\n )\n }\n\n render() {\n if (this.state.complete) {\n return \n }\n\n return (\n \n )\n }\n}\n","import misago from \"misago/index\"\nimport RequestPasswordReset from \"misago/components/request-password-reset\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"request-password-reset-mount\")) {\n mount(RequestPasswordReset, \"request-password-reset-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:request-password-reset\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport SignInModal from \"misago/components/sign-in.js\"\nimport ajax from \"misago/services/ajax\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class ResetPasswordForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n password: \"\",\n }\n }\n\n clean() {\n if (this.state.password.trim().length) {\n return true\n } else {\n snackbar.error(pgettext(\"password reset form\", \"Enter new password.\"))\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"CHANGE_PASSWORD_API\"), {\n password: this.state.password,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {pgettext(\"password reset form btn\", \"Change password\")}\n \n \n
    \n )\n }\n}\n\nexport class PasswordChangedPage extends React.Component {\n getMessage() {\n return interpolate(\n pgettext(\n \"password reset form\",\n \"%(username)s, your password has been changed.\"\n ),\n {\n username: this.props.user.username,\n },\n true\n )\n }\n\n showSignIn() {\n modal.show(SignInModal)\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n check\n
    \n\n
    \n

    {this.getMessage()}

    \n

    \n {pgettext(\n \"password reset form\",\n \"Sign in using new password to continue.\"\n )}\n

    \n

    \n \n {pgettext(\"password reset form btn\", \"Sign in\")}\n \n

    \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n complete = (apiResponse) => {\n auth.softSignOut()\n\n // nuke \"next\" field so we don't end\n // coming back to error page after sign in\n $('#hidden-login-form input[name=\"next\"]').remove()\n\n ReactDOM.render(\n ,\n document.getElementById(\"page-mount\")\n )\n }\n\n render() {\n return \n }\n}\n","import misago from \"misago\"\nimport ResetPasswordForm from \"misago/components/reset-password-form\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"reset-password-form-mount\")) {\n mount(ResetPasswordForm, \"reset-password-form-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:reset-password-form\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { SearchOverlay } from \"../../components/Search\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"search-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:search-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport misago from \"misago\"\nimport Form from \"misago/components/form\"\nimport { load as updatePosts } from \"misago/reducers/posts\"\nimport { update as updateSearch } from \"misago/reducers/search\"\nimport { hydrate as updateUsers } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n PageHeader,\n PageHeaderContainer,\n PageHeaderBanner,\n PageHeaderDetails,\n} from \"../PageHeader\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n query: props.search.query,\n }\n }\n\n componentDidMount() {\n if (this.state.query.length) {\n this.handleSubmit()\n }\n }\n\n onQueryChange = (event) => {\n this.changeValue(\"query\", event.target.value)\n }\n\n clean() {\n if (!this.state.query.trim().length) {\n snackbar.error(pgettext(\"search form\", \"You have to enter search query.\"))\n return false\n }\n\n return true\n }\n\n send() {\n store.dispatch(\n updateSearch({\n isLoading: true,\n })\n )\n\n const query = this.state.query.trim()\n\n let url = window.location.href\n const urlQuery = url.indexOf(\"?q=\")\n if (urlQuery > 0) {\n url = url.substring(0, urlQuery + 3)\n }\n window.history.pushState({}, \"\", url + encodeURIComponent(query))\n\n return ajax.get(misago.get(\"SEARCH_API\"), { q: query })\n }\n\n handleSuccess(providers) {\n store.dispatch(\n updateSearch({\n query: this.state.query.trim(),\n isLoading: false,\n providers,\n })\n )\n\n providers.forEach((provider) => {\n if (provider.id === \"users\") {\n store.dispatch(updateUsers(provider.results.results))\n } else if (provider.id === \"threads\") {\n store.dispatch(updatePosts(provider.results))\n }\n })\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n\n store.dispatch(\n updateSearch({\n isLoading: false,\n })\n )\n }\n\n render() {\n return (\n
    \n \n \n \n

    {pgettext(\"search form title\", \"Search\")}

    \n
    \n \n \n \n \n \n \n \n \n search\n \n \n \n \n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function (props) {\n return (\n
    \n {props.providers.map((provider) => {\n return (\n \n {provider.icon}\n {provider.name}\n \n \n )\n })}\n
    \n )\n}\n\nexport function Badge(props) {\n if (!props.results) return null\n\n let count = props.results.count\n if (count > 1000000) {\n count = Math.ceil(count / 1000000) + \"KK\"\n } else if (count > 1000) {\n count = Math.ceil(count / 1000) + \"K\"\n }\n\n return {count}\n}\n","import React from \"react\"\nimport PageContainer from \"../PageContainer\"\nimport SearchForm from \"./form\"\nimport SideNav from \"./sidenav\"\n\nexport default function (props) {\n return (\n
    \n \n \n
    \n
    \n \n
    \n
    \n {props.children}\n \n
    \n
    \n
    \n
    \n )\n}\n\nexport function SearchTime(props) {\n let time = null\n props.search.providers.forEach((p) => {\n if (p.id === props.provider.id) {\n time = p.time\n }\n })\n\n if (time === null) return null\n\n const copy = pgettext(\"search time\", \"Search took %(time)s s\")\n\n return (\n
    \n

    {interpolate(copy, { time }, true)}

    \n
    \n )\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport {\n update as updatePosts,\n append as appendPosts,\n} from \"misago/reducers/posts\"\nimport { updateProvider } from \"misago/reducers/search\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n return (\n
    \n \n \n
    \n )\n}\n\nexport class LoadMore extends React.Component {\n onClick = () => {\n store.dispatch(\n updatePosts({\n isBusy: true,\n })\n )\n\n ajax\n .get(this.props.provider.api, {\n q: this.props.query,\n page: this.props.next,\n })\n .then(\n (providers) => {\n providers.forEach((provider) => {\n if (provider.id !== \"threads\") return\n store.dispatch(appendPosts(provider.results))\n store.dispatch(updateProvider(provider))\n })\n\n store.dispatch(\n updatePosts({\n isBusy: false,\n })\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n store.dispatch(\n updatePosts({\n isBusy: false,\n })\n )\n }\n )\n }\n\n render() {\n if (!this.props.more) return null\n\n return (\n
    \n \n {pgettext(\"search threads btn\", \"Show more\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport Results from \"./results\"\n\nexport default function (props) {\n return (\n \n \n \n \n \n )\n}\n\nexport function Blankslate({ children, loading, posts, query }) {\n if (posts && posts.count) return children\n\n if (query.length) {\n return (\n

    \n {loading\n ? pgettext(\"search threads\", \"Loading results...\")\n : pgettext(\n \"search threads\",\n \"No threads matching search query have been found.\"\n )}\n

    \n )\n }\n\n return (\n

    \n {pgettext(\n \"search threads\",\n \"Enter at least two characters to search threads.\"\n )}\n

    \n )\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport UsersList from \"misago/components/users-list\"\n\nexport default function (props) {\n return (\n \n \n \n \n \n )\n}\n\nexport function Blankslate({ children, loading, query, users }) {\n if (users.length) return children\n\n if (query.length) {\n return (\n

    \n {loading\n ? pgettext(\"search users\", \"Loading results...\")\n : pgettext(\n \"search users\",\n \"No users matching search query have been found.\"\n )}\n

    \n )\n }\n\n return (\n

    \n {pgettext(\n \"search users\",\n \"Enter at least two characters to search users.\"\n )}\n

    \n )\n}\n","import { connect } from \"react-redux\"\nimport SearchThreads from \"./threads\"\nimport SearchUsers from \"./users\"\n\nconst components = {\n threads: SearchThreads,\n users: SearchUsers,\n}\n\nexport function select(store) {\n return {\n posts: store.posts,\n search: store.search,\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n }\n}\n\nexport default function (providers) {\n return providers.map((provider) => {\n return {\n path: provider.url,\n component: connect(select)(components[provider.id]),\n provider: provider,\n }\n })\n}\n","import paths from \"misago/components/search-route\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.get(\"CURRENT_LINK\") === \"misago:search\") {\n mount({\n paths: paths(misago.get(\"SEARCH_PROVIDERS\")),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:search\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { SiteNavOverlay } from \"../../components/SiteNav\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"site-nav-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:site-nav-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nconst TYPES_CLASSES = {\n info: \"alert-info\",\n success: \"alert-success\",\n warning: \"alert-warning\",\n error: \"alert-danger\",\n}\n\nexport class Snackbar extends React.Component {\n getSnackbarClass() {\n let snackbarClass = \"alerts-snackbar\"\n if (this.props.isVisible) {\n snackbarClass += \" in\"\n } else {\n snackbarClass += \" out\"\n }\n return snackbarClass\n }\n\n render() {\n return (\n
    \n

    \n {this.props.message}\n

    \n
    \n )\n }\n}\n\nexport function select(state) {\n return state.snackbar\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport { Snackbar, select } from \"misago/components/snackbar\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(Snackbar), \"snackbar-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:snackbar\",\n initializer: initializer,\n after: \"snackbar\",\n})\n","import React from \"react\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nconst Header = ({ backendName }) => {\n const pageTitleTpl = pgettext(\"social auth title\", \"Sign in with %(backend)s\")\n const pageTitle = interpolate(pageTitleTpl, { backend: backendName }, true)\n\n return (\n \n \n \n

    {pageTitle}

    \n
    \n
    \n
    \n )\n}\n\nexport default Header\n","import React from \"react\"\nimport misago from \"misago\"\nimport RegisterLegalFootnote from \"misago/components/RegisterLegalFootnote\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nexport default class Register extends Form {\n constructor(props) {\n super(props)\n\n const formValidators = {\n email: [validators.email()],\n username: [validators.usernameContent()],\n }\n\n if (!!misago.get(\"TERMS_OF_SERVICE_ID\")) {\n formValidators.termsOfService = [validators.requiredTermsOfService()]\n }\n\n if (!!misago.get(\"PRIVACY_POLICY_ID\")) {\n formValidators.privacyPolicy = [validators.requiredPrivacyPolicy()]\n }\n\n this.state = {\n email: props.email || \"\",\n emailProtected: !!props.email,\n username: props.username || \"\",\n\n termsOfService: null,\n privacyPolicy: null,\n\n validators: formValidators,\n errors: {},\n\n isLoading: false,\n }\n }\n\n clean() {\n let errors = this.validate()\n let lengths = [\n this.state.email.trim().length,\n this.state.username.trim().length,\n ]\n\n if (lengths.indexOf(0) !== -1) {\n snackbar.error(pgettext(\"social auth form\", \"Fill out all fields.\"))\n return false\n }\n\n const { validators } = this.state\n\n const checkTermsOfService = !!misago.get(\"TERMS_OF_SERVICE_ID\")\n if (checkTermsOfService && this.state.termsOfService === null) {\n snackbar.error(validators.termsOfService[0](null))\n return false\n }\n\n const checkPrivacyPolicy = !!misago.get(\"PRIVACY_POLICY_ID\")\n if (checkPrivacyPolicy && this.state.privacyPolicy === null) {\n snackbar.error(validators.privacyPolicy[0](null))\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.url, {\n email: this.state.email,\n username: this.state.username,\n terms_of_service: this.state.termsOfService,\n privacy_policy: this.state.privacyPolicy,\n })\n }\n\n handleSuccess(response) {\n const { onRegistrationComplete } = this.props\n onRegistrationComplete(response)\n }\n\n handleError(rejection) {\n if (rejection.status === 200) {\n // We've entered \"errored\" state because response is HTML instead of exptected JSON\n const { onRegistrationComplete } = this.props\n const { username } = this.state\n onRegistrationComplete({ activation: \"active\", step: \"done\", username })\n } else if (rejection.status === 400) {\n const stateUpdate = { errors: rejection }\n if (rejection.email) {\n stateUpdate.emailProtected = false\n }\n this.setState(stateUpdate)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n handlePrivacyPolicyChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"privacyPolicy\", value)\n }\n\n handleTermsOfServiceChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"termsOfService\", value)\n }\n\n handleToggleAgreement = (agreement, value) => {\n this.setState((prevState, props) => {\n if (prevState[agreement] === null) {\n const errors = { ...prevState.errors, [agreement]: null }\n return { errors, [agreement]: value }\n }\n\n const validator = this.state.validators[agreement][0]\n const errors = { ...prevState.errors, [agreement]: [validator(null)] }\n return { errors, [agreement]: null }\n })\n }\n\n render() {\n const { backend_name } = this.props\n const { email, emailProtected, username, isLoading } = this.state\n\n let emailHelpText = null\n if (emailProtected) {\n const emailHelpTextTpl = pgettext(\n \"social auth form\",\n \"Your e-mail address has been verified by %(backend)s.\"\n )\n emailHelpText = interpolate(\n emailHelpTextTpl,\n { backend: backend_name },\n true\n )\n }\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n {pgettext(\n \"social auth form title\",\n \"Complete your account\"\n )}\n

    \n
    \n
    \n \n \n \n \n \n \n \n
    \n
    \n \n {pgettext(\"social auth form btn\", \"Sign in\")}\n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nconst Complete = ({ activation, backend_name, username }) => {\n let icon = \"\"\n let message = \"\"\n if (activation === \"user\") {\n message = pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\"\n )\n } else if (activation === \"admin\") {\n message = pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but the site administrator will have to activate it before you will be able to sign in.\"\n )\n } else {\n message = pgettext(\n \"social auth complete\",\n \"%(username)s, your account has been created and you have been signed in to it.\"\n )\n }\n\n if (activation === \"active\") {\n icon = \"check\"\n } else {\n icon = \"info_outline\"\n }\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n
    \n

    \n {pgettext(\n \"social auth complete title\",\n \"Registration completed!\"\n )}\n

    \n
    \n
    \n
    \n {icon}\n
    \n
    \n

    \n {interpolate(message, { username }, true)}\n

    \n

    \n \n {pgettext(\n \"social auth complete link\",\n \"Return to forum index\"\n )}\n \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n )\n}\n\nexport default Complete\n","import React from \"react\"\nimport Register from \"./register\"\nimport Complete from \"./complete\"\n\nexport default class SocialAuth extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n step: props.step,\n\n activation: props.activation || \"\",\n email: props.email || \"\",\n username: props.username || \"\",\n }\n }\n\n handleRegistrationComplete = ({ activation, email, step, username }) => {\n this.setState({ activation, email, step, username })\n }\n\n render() {\n const { backend_name, url } = this.props\n const { activation, email, step, username } = this.state\n\n if (step === \"register\") {\n return (\n \n )\n }\n\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport SocialAuth from \"misago/components/social-auth\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n if (context.get(\"CURRENT_LINK\") === \"misago:social-complete\") {\n const props = context.get(\"SOCIAL_AUTH_FORM\")\n mount(, \"page-mount\")\n }\n}\n\nmisago.addInitializer({\n name: \"component:social-auth\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport Form from \"./form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n username: \"\",\n }\n }\n\n onUsernameChange = (event) => {\n this.changeValue(\"username\", event.target.value)\n }\n\n clean() {\n if (!this.state.username.trim().length) {\n snackbar.error(\n pgettext(\n \"add private thread participant\",\n \"You have to enter user name.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.patch(this.props.thread.api.index, [\n { op: \"add\", path: \"participants\", value: this.state.username },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n }\n\n handleSuccess(data) {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n snackbar.success(\n pgettext(\n \"add private thread participant\",\n \"New participant has been added to thread.\"\n )\n )\n\n modal.hide()\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\n \"add private thread participant btn\",\n \"Add participant\"\n )}\n \n \n {pgettext(\"add private thread participant btn\", \"Cancel\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\n \"add private thread participant modal title\",\n \"Add participant\"\n )}\n

    \n
    \n )\n}\n","import React from \"react\"\nimport AddParticipantModal from \"misago/components/add-participant\"\nimport modal from \"misago/services/modal\"\n\nexport default class extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.thread.acl.can_add_participants) return null\n\n return (\n
    \n \n person_add\n {pgettext(\"add participant btn\", \"Add participant\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport { changeOwner } from \"./actions\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.isUser = props.participant.id === props.user.id\n }\n\n onClick = () => {\n let confirmed = false\n if (this.isUser) {\n confirmed = window.confirm(\n pgettext(\n \"private thread owner change\",\n \"Are you sure you want to take over this thread?\"\n )\n )\n } else {\n const message = pgettext(\n \"private thread owner change\",\n \"Are you sure you want to change thread owner to %(user)s?\"\n )\n confirmed = window.confirm(\n interpolate(\n message,\n {\n user: this.props.participant.username,\n },\n true\n )\n )\n }\n\n if (!confirmed) return\n\n changeOwner(this.props.thread, this.props.participant)\n }\n\n render() {\n if (this.props.participant.is_owner) return null\n if (!this.props.thread.acl.can_change_owner) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function leave(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"remove\", path: \"participants\", value: participant.id },\n ])\n .then(\n () => {\n snackbar.success(\n pgettext(\"thread participants actions\", \"You have left this thread.\")\n )\n window.setTimeout(() => {\n window.location = misago.get(\"PRIVATE_THREADS_URL\")\n }, 3 * 1000)\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n\nexport function remove(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"remove\", path: \"participants\", value: participant.id },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n .then(\n (data) => {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n const message = pgettext(\n \"thread participants actions\",\n \"%(user)s has been removed from this thread.\"\n )\n snackbar.success(\n interpolate(\n message,\n {\n user: participant.username,\n },\n true\n )\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n\nexport function changeOwner(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"replace\", path: \"owner\", value: participant.id },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n .then(\n (data) => {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n const message = pgettext(\n \"thread participants actions\",\n \"%(user)s has been made new thread owner.\"\n )\n snackbar.success(\n interpolate(\n message,\n {\n user: participant.username,\n },\n true\n )\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n","import React from \"react\"\nimport { remove, leave } from \"./actions\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.isUser = props.participant.id === props.user.id\n }\n\n onClick = () => {\n let confirmed = false\n if (this.isUser) {\n confirmed = window.confirm(\n pgettext(\n \"private thread leave\",\n \"Are you sure you want to leave this thread?\"\n )\n )\n } else {\n const message = pgettext(\n \"private thread leave\",\n \"Are you sure you want to remove %(user)s from this thread?\"\n )\n confirmed = window.confirm(\n interpolate(\n message,\n {\n user: this.props.participant.username,\n },\n true\n )\n )\n }\n\n if (!confirmed) return\n\n if (this.isUser) {\n leave(this.props.thread, this.props.participant)\n } else {\n remove(this.props.thread, this.props.participant)\n }\n }\n\n render() {\n const isModerator = this.props.user.acl.can_moderate_private_threads\n\n if (!(this.props.userIsOwner || this.isUser || isModerator)) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport MakeOwner from \"./make-owner\"\nimport Remove from \"./remove\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default function (props) {\n const participant = props.participant\n\n let className = \"btn btn-default\"\n if (participant.is_owner) {\n className = \"btn btn-primary\"\n }\n className += \" btn-user btn-block\"\n\n return (\n
    \n
    \n \n \n {participant.username}\n \n \n
    \n
    \n )\n}\n\nexport function UserStatus({ isOwner }) {\n if (!isOwner) return null\n\n return (\n
  • \n start\n \n {pgettext(\"thread participants owner status\", \"Thread owner\")}\n \n
  • \n )\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ participants, thread, user, userIsOwner }) {\n return (\n
    \n
    \n {participants.map((participant) => {\n return (\n \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport AddParticipant from \"./add-participant\"\nimport CardsList from \"./cards-list\"\nimport * as utils from \"./utils\"\n\nexport default function (props) {\n if (!props.participants.length) return null\n\n return (\n
    \n
    \n \n
    \n \n
    \n

    {utils.getParticipantsCopy(props.participants)}

    \n
    \n
    \n
    \n
    \n )\n}\n\nexport function getUserIsOwner(user, participants) {\n return participants[0].id === user.id\n}\n","export function getParticipantsCopy(participants) {\n const count = participants.length\n const message = npgettext(\n \"thread participants stat\",\n \"This thread has %(users)s participant.\",\n \"This thread has %(users)s participants.\",\n count\n )\n\n return interpolate(\n message,\n {\n users: count,\n },\n true\n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n {props.poll.choices.map((choice) => {\n return (\n \n )\n })}\n
    \n )\n}\n\nexport function PollChoice(props) {\n let proc = 0\n if (props.choice.votes && props.poll.votes) {\n proc = Math.ceil((props.choice.votes * 100) / props.poll.votes)\n }\n\n return (\n
    \n
    {props.choice.label}
    \n
    \n
    \n \n \n {getVotesLabel(props.votes, props.proc)}\n \n
    \n
    \n
      \n \n \n
    \n \n \n )\n}\n\nexport function ChoiceVotes(props) {\n return (\n
  • \n {getVotesLabel(props.votes, props.proc)}\n
  • \n )\n}\n\nexport function getVotesLabel(votes, proc) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s vote, %(proc)s% of total.\",\n \"%(votes)s votes, %(proc)s% of total.\",\n votes\n )\n\n return interpolate(\n message,\n {\n votes: votes,\n proc: proc,\n },\n true\n )\n}\n\nexport function UserChoice(props) {\n if (!props.selected) return null\n\n return (\n
  • \n check_box\n {pgettext(\"thread poll\", \"You've voted on this choice.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: true,\n error: null,\n data: [],\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.poll.api.votes).then(\n (data) => {\n const hydratedData = data.map((choice) => {\n return Object.assign({}, choice, {\n voters: choice.voters.map((voter) => {\n return Object.assign({}, voter, {\n voted_on: moment(voter.voted_on),\n })\n }),\n })\n })\n\n this.setState({\n isLoading: false,\n data: hydratedData,\n })\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n error: rejection.detail,\n })\n }\n )\n }\n\n render() {\n return (\n \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"thread poll\", \"Poll votes\")}\n

    \n
    \n\n \n
    \n
    \n )\n }\n}\n\nexport function ModalBody(props) {\n if (props.isLoading) {\n return \n } else if (props.error) {\n return \n }\n\n return \n}\n\nexport function ChoicesList(props) {\n return (\n
    \n
      \n {props.data.map((choice) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function ChoiceDetails(props) {\n return (\n
  • \n

    {props.label}

    \n \n \n
    \n
  • \n )\n}\n\nexport function VotesCount(props) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s user has voted for this choice.\",\n \"%(votes)s users have voted for this choice.\",\n props.votes\n )\n\n const label = interpolate(\n message,\n {\n votes: props.votes,\n },\n true\n )\n\n return

    {label}

    \n}\n\nexport function VotesList(props) {\n if (!props.voters.length) return null\n\n return (\n
      \n {props.voters.map((user) => {\n return \n })}\n
    \n )\n}\n\nexport function Voter(props) {\n if (props.url) {\n return (\n
  • \n \n {props.username}\n {\" \"}\n \n
  • \n )\n }\n\n return (\n
  • \n {props.username} \n
  • \n )\n}\n\nexport function VoteDate(props) {\n return (\n \n {props.voted_on.fromNow()}\n \n )\n}\n","import React from \"react\"\nimport Modal from \"./modal\"\nimport * as poll from \"misago/reducers/poll\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n const { isPollOver, poll, showVoting, thread } = props\n\n if (!isVisible(isPollOver, poll.acl, poll)) return null\n\n const controls = []\n\n const canVote = poll.acl.can_vote\n const canChangeVote = !poll.hasSelectedChoices || poll.allow_revotes\n\n if (canVote && canChangeVote) controls.push(0)\n if (poll.is_public || poll.acl.can_see_votes) controls.push(1)\n if (poll.acl.can_edit) controls.push(2)\n if (poll.acl.can_delete) controls.push(3)\n\n return (\n
    \n \n \n \n \n
    \n )\n}\n\nexport function isVisible(isPollOver, acl, poll) {\n return (\n poll.is_public ||\n acl.can_delete ||\n acl.can_edit ||\n acl.can_see_votes ||\n (acl.can_vote &&\n !isPollOver &&\n (!poll.hasSelectedChoices || poll.allow_revotes))\n )\n}\n\nexport function getClassName(controls, control) {\n let className = \"col-xs-6\"\n\n if (controls.length === 1) {\n className = \"col-xs-12\"\n }\n\n if (controls.length === 3 && controls[0] === control) {\n className = \"col-xs-12\"\n }\n\n return className + \" col-sm-3 col-md-2\"\n}\n\nexport function ChangeVote(props) {\n const canVote = props.poll.acl.can_vote\n const canChangeVote =\n !props.poll.hasSelectedChoices || props.poll.allow_revotes\n\n if (!(canVote && canChangeVote)) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Vote\")}\n \n
    \n )\n}\n\nexport class SeeVotes extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const seeVotes =\n this.props.poll.is_public || this.props.poll.acl.can_see_votes\n if (!seeVotes) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"See votes\")}\n \n
    \n )\n }\n}\n\nexport function Edit(props) {\n if (!props.poll.acl.can_edit) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Edit\")}\n \n
    \n )\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n const deletePoll = window.confirm(\n pgettext(\n \"thread poll\",\n \"Are you sure you want to delete this poll? This action is not reversible.\"\n )\n )\n if (!deletePoll) return false\n\n store.dispatch(poll.busy())\n\n ajax\n .delete(this.props.poll.api.index)\n .then(this.handleSuccess, this.handleError)\n }\n\n handleSuccess = (newThreadAcl) => {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been deleted\"))\n store.dispatch(poll.remove())\n store.dispatch(thread.updateAcl(newThreadAcl))\n }\n\n handleError = (rejection) => {\n snackbar.apiError(rejection)\n store.dispatch(poll.release())\n }\n\n render() {\n if (!this.props.poll.acl.can_delete) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Delete\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n
    \n )\n}\n\nexport function PollCreation(props) {\n const message = interpolate(\n escapeHtml(pgettext(\"thread poll\", \"Started by %(poster)s %(posted_on)s.\")),\n {\n poster: getPoster(props.poll),\n posted_on: getPostedOn(props.poll),\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getPoster(poll) {\n if (poll.url.poster) {\n return interpolate(\n USER_URL,\n {\n url: escapeHtml(poll.url.poster),\n user: escapeHtml(poll.poster_name),\n },\n true\n )\n }\n\n return interpolate(\n USER_SPAN,\n {\n user: escapeHtml(poll.poster_name),\n },\n true\n )\n}\n\nexport function getPostedOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.posted_on.format(\"LLL\")),\n relative: escapeHtml(poll.posted_on.fromNow()),\n },\n true\n )\n}\n\nexport function PollLength(props) {\n if (!props.poll.length) {\n return null\n }\n\n const message = interpolate(\n escapeHtml(pgettext(\"thread poll\", \"Voting ends %(ends_on)s.\")),\n {\n ends_on: getEndsOn(props.poll),\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getEndsOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.endsOn.format(\"LLL\")),\n relative: escapeHtml(poll.endsOn.fromNow()),\n },\n true\n )\n}\n\nexport function PollVotes(props) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s vote.\",\n \"%(votes)s votes.\",\n props.votes\n )\n const label = interpolate(\n message,\n {\n votes: props.votes,\n },\n true\n )\n\n return
  • {label}
  • \n}\n\nexport function PollIsPublic(props) {\n if (!props.poll.is_public) {\n return null\n }\n\n return (\n
  • \n {pgettext(\"thread poll\", \"Voting is public.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport Chart from \"./chart\"\nimport Options from \"./options\"\nimport PollInfo from \"../info\"\n\nexport default function (props) {\n return (\n
    \n
    \n

    {props.poll.question}

    \n \n \n \n
    \n
    \n )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n
    \n )\n}\n\nexport function PollChoicesLeft({ choicesLeft }) {\n if (choicesLeft === 0) {\n return (\n
  • \n {pgettext(\"thread poll\", \"You can't select any more choices.\")}\n
  • \n )\n }\n\n const message = npgettext(\n \"thread poll\",\n \"You can select %(choices)s more choice.\",\n \"You can select %(choices)s more choices.\",\n choicesLeft\n )\n\n const label = interpolate(\n message,\n {\n choices: choicesLeft,\n },\n true\n )\n\n return
  • {label}
  • \n}\n\nexport function PollAllowRevote(props) {\n if (props.poll.allow_revotes) {\n return (\n
  • \n {pgettext(\"thread poll\", \"You can change your vote later.\")}\n
  • \n )\n }\n\n return (\n
  • \n {pgettext(\"thread poll\", \"Votes are final.\")}\n
  • \n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
      \n {props.choices.map((choice) => {\n return (\n \n )\n })}\n
    \n )\n}\n\nexport class ChoiceSelect extends React.Component {\n onClick = () => {\n this.props.toggleChoice(this.props.choice.hash)\n }\n\n render() {\n return (\n
  • \n \n \n {this.props.choice.selected\n ? \"check_box\"\n : \"check_box_outline_blank\"}\n \n {this.props.choice.label}\n \n
  • \n )\n }\n}\n","export function getChoiceFromHash(choices, hash) {\n for (const i in choices) {\n const choice = choices[i]\n if (choice.hash === hash) {\n return choice\n }\n }\n\n return null\n}\n\nexport function getChoicesLeft(poll, choices) {\n let selection = []\n for (const i in choices) {\n const choice = choices[i]\n if (choice.selected) {\n selection.push(choice)\n }\n }\n\n return poll.allowed_choices - selection.length\n}\n","import React from \"react\"\nimport ChoicesHelp from \"./help\"\nimport ChoicesSelect from \"./select\"\nimport { getChoicesLeft, getChoiceFromHash } from \"./utils\"\nimport PollInfo from \"../info\"\nimport { Delete, Edit, getClassName } from \"../results/options\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n choices: props.poll.choices,\n choicesLeft: getChoicesLeft(props.poll, props.poll.choices),\n }\n }\n\n toggleChoice = (hash) => {\n const choice = getChoiceFromHash(this.state.choices, hash)\n\n let choices = null\n if (!choice.selected) {\n choices = this.selectChoice(choice, hash)\n } else {\n choices = this.deselectChoice(choice, hash)\n }\n\n this.setState({\n choices,\n choicesLeft: getChoicesLeft(this.props.poll, choices),\n })\n }\n\n selectChoice = (choice, hash) => {\n const choicesLeft = getChoicesLeft(this.props.poll, this.state.choices)\n\n if (!choicesLeft) {\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected && item.hash != hash) {\n item.selected = false\n break\n }\n }\n }\n\n return this.state.choices.map((choice) => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? true : choice.selected,\n })\n })\n }\n\n deselectChoice = (choice, hash) => {\n return this.state.choices.map((choice) => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? false : choice.selected,\n })\n })\n }\n\n clean() {\n if (this.state.choicesLeft === this.props.poll.allowed_choices) {\n snackbar.error(\n pgettext(\"thread poll vote\", \"You need to select at least one choice.\")\n )\n return false\n }\n\n return true\n }\n\n send() {\n let data = []\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected) {\n data.push(item.hash)\n }\n }\n\n return ajax.post(this.props.poll.api.votes, data)\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n snackbar.success(pgettext(\"thread poll vote\", \"Your vote has been saved.\"))\n\n this.props.showResults()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n const controls = []\n\n if (this.props.poll.acl.can_vote) controls.push(0)\n if (this.props.poll.is_public || this.props.poll.acl.can_see_votes)\n controls.push(1)\n if (this.props.poll.acl.can_edit) controls.push(2)\n if (this.props.poll.acl.can_delete) controls.push(3)\n\n return (\n
    \n
    \n
    \n

    {this.props.poll.question}

    \n \n \n \n
    \n
    \n
    \n
    \n \n {pgettext(\"thread poll vote btn\", \"Save your vote\")}\n \n
    \n
    \n \n {pgettext(\"thread poll vote btn\", \"See results\")}\n \n
    \n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Results from \"./results\"\nimport Voting from \"./voting\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n let showResults = true\n if (props.user.id && !props.poll.hasSelectedChoices) {\n showResults = false\n }\n\n this.state = {\n showResults,\n }\n }\n\n showResults = () => {\n this.setState({\n showResults: true,\n })\n }\n\n showVoting = () => {\n this.setState({\n showResults: false,\n })\n }\n\n render() {\n if (!this.props.thread.poll) return null\n\n const isPollOver = getIsPollOver(this.props.poll)\n\n if (\n !isPollOver &&\n this.props.poll.acl.can_vote &&\n !this.state.showResults\n ) {\n return \n } else {\n return (\n \n )\n }\n }\n}\n\nexport function getIsPollOver(poll) {\n if (poll.length) {\n return moment().isAfter(poll.endsOn)\n }\n return false\n}\n","import React from \"react\"\nimport getRandomString from \"../../../utils/getRandomString\"\n\nconst HASH_LENGTH = 12\n\nexport default class extends React.Component {\n onAdd = () => {\n let choices = this.props.choices.slice()\n choices.push({\n hash: getRandomString(HASH_LENGTH),\n label: \"\",\n })\n\n this.props.setChoices(choices)\n }\n\n onChange = (hash, label) => {\n const choices = this.props.choices.map((choice) => {\n if (choice.hash === hash) {\n choice.label = label\n }\n\n return choice\n })\n this.props.setChoices(choices)\n }\n\n onDelete = (hash) => {\n const choices = this.props.choices.filter((choice) => {\n return choice.hash !== hash\n })\n this.props.setChoices(choices)\n }\n\n render() {\n return (\n
    \n
      \n {this.props.choices.map((choice) => {\n return (\n 2}\n choice={choice}\n disabled={this.props.disabled}\n key={choice.hash}\n onChange={this.onChange}\n onDelete={this.onDelete}\n />\n )\n })}\n
    \n \n {pgettext(\"thread poll\", \"Add choice\")}\n \n
    \n )\n }\n}\n\nexport class PollChoice extends React.Component {\n onChange = (event) => {\n this.props.onChange(this.props.choice.hash, event.target.value)\n }\n\n onDelete = () => {\n const deleteItem =\n this.props.choice.label.length === 0\n ? true\n : window.confirm(\n pgettext(\n \"thread poll\",\n \"Are you sure you want to remove this choice?\"\n )\n )\n if (deleteItem) {\n this.props.onDelete(this.props.choice.hash)\n }\n }\n\n render() {\n return (\n
  • \n \n close\n \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ChoicesControl from \"./choices-control\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n const poll = props.poll.id\n ? props.poll\n : {\n question: \"\",\n choices: [\n {\n hash: \"choice-10000\",\n label: \"\",\n },\n {\n hash: \"choice-20000\",\n label: \"\",\n },\n ],\n length: 0,\n allowed_choices: 1,\n allow_revotes: 0,\n is_public: 0,\n }\n\n this.state = {\n isLoading: false,\n isEdit: !!poll.id,\n\n question: poll.question,\n choices: poll.choices,\n length: poll.length,\n allowed_choices: poll.allowed_choices,\n allow_revotes: poll.allow_revotes,\n is_public: poll.is_public,\n\n validators: {\n question: [],\n choices: [],\n length: [],\n allowed_choices: [],\n },\n\n errors: {},\n }\n }\n\n setChoices = (choices) => {\n this.setState((state) => {\n return {\n choices,\n errors: Object.assign({}, state.errors, { choices: null }),\n }\n })\n }\n\n onCancel = () => {\n let cancel = false\n\n // Nothing added to the poll so no changes to discard\n const formEmpty = !!(\n this.state.question === \"\" &&\n this.state.choices &&\n this.state.choices.every((choice) => choice.label === \"\") &&\n this.state.length === 0 &&\n this.state.allowed_choices === 1\n )\n\n if (formEmpty) {\n return this.props.close()\n }\n\n if (!!this.props.poll) {\n cancel = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to discard changes?\")\n )\n } else {\n cancel = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to discard new poll?\")\n )\n }\n\n if (cancel) {\n this.props.close()\n }\n }\n\n send() {\n const data = {\n question: this.state.question,\n choices: this.state.choices,\n length: this.state.length,\n allowed_choices: this.state.allowed_choices,\n allow_revotes: this.state.allow_revotes,\n is_public: this.state.is_public,\n }\n\n if (this.state.isEdit) {\n return ajax.put(this.props.poll.api.index, data)\n }\n\n return ajax.post(this.props.thread.api.poll, data)\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n\n if (this.state.isEdit) {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been edited.\"))\n } else {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been posted.\"))\n }\n\n this.props.close()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.non_field_errors) {\n rejection.allowed_choices = rejection.non_field_errors\n }\n\n this.setState({\n errors: Object.assign({}, rejection),\n })\n\n snackbar.error(gettext(\"Form contains errors.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n

    \n {this.state.isEdit\n ? pgettext(\"thread poll\", \"Edit poll\")\n : pgettext(\"thread poll\", \"Add poll\")}\n

    \n
    \n
    \n
    \n \n {pgettext(\"thread poll\", \"Question and choices\")}\n \n\n \n \n \n\n \n \n \n
    \n\n
    \n {pgettext(\"thread poll\", \"Voting\")}\n\n
    \n
    \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n \n {pgettext(\"thread poll\", \"Cancel\")}\n {\" \"}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function PollPublicSwitch(props) {\n if (props.isEdit) return null\n\n return (\n
    \n \n \n \n
    \n )\n}\n","import React from \"react\"\n\nconst ICON = {\n changed_title: \"edit\",\n\n pinned_globally: \"bookmark\",\n pinned_locally: \"bookmark_border\",\n unpinned: \"panorama_fish_eye\",\n\n moved: \"arrow_forward\",\n merged: \"call_merge\",\n\n approved: \"done\",\n\n opened: \"lock_open\",\n closed: \"lock_outline\",\n\n unhid: \"visibility\",\n hid: \"visibility_off\",\n\n changed_owner: \"grade\",\n tookover: \"grade\",\n\n added_participant: \"person_add\",\n\n owner_left: \"person_outline\",\n participant_left: \"person_outline\",\n removed_participant: \"remove_circle_outline\",\n}\n\nconst EventIcon = (props) => (\n \n {ICON[props.post.event_type]}\n \n)\n\nexport default EventIcon\n","import React from \"react\"\nimport moment from \"moment\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n if (isVisible(props.post.acl)) {\n return (\n
  • \n \n \n \n
  • \n )\n } else {\n return null\n }\n}\n\nexport function isVisible(acl) {\n return acl.can_hide\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: this.props.user.username,\n url: Object.assign(this.props.post.url, {\n hidden_by: this.props.user.url,\n }),\n })\n )\n\n const op = { op: \"replace\", path: \"is-hidden\", value: true }\n\n ajax.patch(this.props.post.api.index, [op]).then(\n (patch) => {\n store.dispatch(post.patch(this.props.post, patch))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: false,\n })\n )\n }\n )\n }\n\n render() {\n if (!this.props.post.is_hidden) {\n return (\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: false,\n })\n )\n\n const op = { op: \"replace\", path: \"is-hidden\", value: false }\n\n ajax.patch(this.props.post.api.index, [op]).then(\n (patch) => {\n store.dispatch(post.patch(this.props.post, patch))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: true,\n })\n )\n }\n )\n }\n\n render() {\n if (this.props.post.is_hidden) {\n return (\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n const decision = window.confirm(\n pgettext(\n \"event delete\",\n \"Are you sure you wish to delete this event? This action is not reversible!\"\n )\n )\n if (decision) {\n this.delete()\n }\n }\n\n delete = () => {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n ajax.delete(this.props.post.api.index).then(\n () => {\n snackbar.success(pgettext(\"event delete\", \"Event has been deleted.\"))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: false,\n })\n )\n }\n )\n }\n\n render() {\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport Controls from \"./controls\"\n\nconst DATE_ABBR = '%(relative)s'\nconst DATE_URL = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n \n
    \n )\n}\n\nexport function Hidden(props) {\n if (props.post.is_hidden) {\n let user = null\n if (props.post.url.hidden_by) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.post.url.hidden_by),\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n relative: escapeHtml(props.post.hidden_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\"event info\", \"Hidden by %(event_by)s %(event_on)s.\")\n ),\n {\n event_by: user,\n event_on: date,\n },\n true\n )\n\n return (\n \n )\n } else {\n return null\n }\n}\n\nexport function Poster(props) {\n let user = null\n if (props.post.poster) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.post.poster.url),\n user: escapeHtml(props.post.poster_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.post.poster_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_URL,\n {\n url: escapeHtml(props.post.url.index),\n absolute: escapeHtml(props.post.posted_on.format(\"LLL\")),\n relative: escapeHtml(props.post.posted_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(pgettext(\"event info\", \"By %(event_by)s %(event_on)s.\")),\n {\n event_by: user,\n event_on: date,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst MESSAGE = {\n pinned_globally: pgettext(\n \"event message\",\n \"Thread has been pinned globally.\"\n ),\n pinned_locally: pgettext(\n \"event message\",\n \"Thread has been pinned in category.\"\n ),\n unpinned: pgettext(\"event message\", \"Thread has been unpinned.\"),\n\n approved: pgettext(\"event message\", \"Thread has been approved.\"),\n\n opened: pgettext(\"event message\", \"Thread has been opened.\"),\n closed: pgettext(\"event message\", \"Thread has been closed.\"),\n\n unhid: pgettext(\"event message\", \"Thread has been revealed.\"),\n hid: pgettext(\"event message\", \"Thread has been made hidden.\"),\n\n tookover: pgettext(\"event message\", \"Took thread over.\"),\n\n owner_left: pgettext(\n \"event message\",\n \"Owner has left thread. This thread is now closed.\"\n ),\n participant_left: pgettext(\"event message\", \"Participant has left thread.\"),\n}\n\nconst ITEM_LINK = '%(name)s'\nconst ITEM_SPAN = '%(name)s'\n\nexport default function (props) {\n if (MESSAGE[props.post.event_type]) {\n return

    {MESSAGE[props.post.event_type]}

    \n } else if (props.post.event_type === \"changed_title\") {\n return \n } else if (props.post.event_type === \"moved\") {\n return \n } else if (props.post.event_type === \"merged\") {\n return \n } else if (props.post.event_type === \"changed_owner\") {\n return \n } else if (props.post.event_type === \"added_participant\") {\n return \n } else if (props.post.event_type === \"removed_participant\") {\n return \n } else {\n return null\n }\n}\n\nexport function ChangedTitle(props) {\n const msgstring = escapeHtml(\n pgettext(\n \"event message\",\n \"Thread title has been changed from %(old_title)s.\"\n )\n )\n const oldTitle = interpolate(\n ITEM_SPAN,\n {\n name: escapeHtml(props.post.event_context.old_title),\n },\n true\n )\n const message = interpolate(\n msgstring,\n {\n old_title: oldTitle,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function Moved(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Thread has been moved from %(from_category)s.\")\n )\n const fromCategory = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.from_category.url),\n name: escapeHtml(props.post.event_context.from_category.name),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n from_category: fromCategory,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function Merged(props) {\n const msgstring = escapeHtml(\n pgettext(\n \"event message\",\n \"The %(merged_thread)s thread has been merged into this thread.\"\n )\n )\n const mergedThread = interpolate(\n ITEM_SPAN,\n {\n name: escapeHtml(props.post.event_context.merged_thread),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n merged_thread: mergedThread,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function ChangedOwner(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Changed thread owner to %(user)s.\")\n )\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function AddedParticipant(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Added %(user)s to thread.\")\n )\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function RemovedParticipant(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Removed %(user)s from thread.\")\n )\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n if (post.is_read) return null\n\n return (\n
    \n \n {pgettext(\"event unread label\", \"New event\")}\n \n
    \n )\n}\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.initialized = false\n this.primed = false\n this.observer = null\n }\n\n initialize = (element) => {\n this.initialized = true\n\n this.observer = new IntersectionObserver((entries) =>\n entries.forEach(this.callback)\n )\n this.observer.observe(element)\n }\n\n callback = (entry) => {\n if (!entry.isIntersecting || this.props.post.is_read || this.primed) {\n return\n }\n\n window.setTimeout(() => {\n ajax.post(this.props.post.api.read)\n }, 0)\n\n this.primed = true\n this.destroy()\n }\n\n destroy() {\n if (this.observer) {\n this.observer.disconnect()\n this.observer = null\n }\n }\n\n componentWillUnmount() {\n this.destroy()\n }\n\n render() {\n const ready = !this.initialized && !this.primed && !this.props.post.is_read\n\n return (\n {\n if (node && ready) {\n this.initialize(node)\n }\n }}\n >\n {this.props.children}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Icon from \"./icon\"\nimport Info from \"./info\"\nimport Message from \"./message\"\nimport UnreadLabel from \"./unread-label\"\nimport Waypoint from \"../waypoint\"\n\nexport default function (props) {\n let className = \"event\"\n if (props.post.isDeleted) {\n className = \"hide\"\n } else if (props.post.is_hidden) {\n className = \"event post-hidden\"\n }\n\n return (\n
  • \n \n
    \n
    \n \n
    \n \n \n \n \n
    \n
  • \n )\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport formatFilesize from \"misago/utils/file-size\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
    \n \n
    \n \n {props.attachment.filename}\n \n \n
    \n
    \n )\n}\n\nexport function AttachmentPreview(props) {\n if (props.attachment.is_image) {\n return (\n
    \n \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n}\n\nexport function AttachmentIcon(props) {\n return (\n \n insert_drive_file\n \n )\n}\n\nexport function AttachmentThumbnail(props) {\n const url = props.attachment.url.thumb || props.attachment.url.index\n return (\n \n )\n}\n\nexport function AttachmentDetails(props) {\n let user = null\n if (props.attachment.url.uploader) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.attachment.url.uploader),\n user: escapeHtml(props.attachment.uploader_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.attachment.uploader_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.attachment.uploaded_on.format(\"LLL\")),\n relative: escapeHtml(props.attachment.uploaded_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\n \"post attachment\",\n \"%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.\"\n )\n ),\n {\n filetype: props.attachment.filetype,\n size: formatFilesize(props.attachment.size),\n uploader: user,\n uploaded_on: date,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\nimport batch from \"misago/utils/batch\"\nimport Attachment from \"./attachment\"\n\nexport default function (props) {\n if (!isVisible(props.post)) {\n return null\n }\n\n return (\n
    \n {batch(props.post.attachments, 2).map((row) => {\n const key = row\n .map((a) => {\n return a ? a.id : 0\n })\n .join(\"_\")\n return \n })}\n
    \n )\n}\n\nexport function isVisible(post) {\n return (!post.is_hidden || post.acl.can_see_hidden) && post.attachments\n}\n\nexport function Row(props) {\n return (\n
    \n {props.row.map((attachment) => {\n return (\n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Waypoint from \"../waypoint\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst HIDDEN_BY_URL = '%(user)s'\nconst HIDDEN_BY_SPAN = '%(user)s'\nconst HIDDEN_ON =\n '%(relative)s'\n\nexport default function (props) {\n if (props.post.is_hidden && !props.post.acl.can_see_hidden) {\n return \n } else if (props.post.content) {\n return \n } else {\n return \n }\n}\n\nexport function Default({ post }) {\n const poster = \"@\" + (post.poster ? post.poster.username : post.poster_name)\n\n return (\n \n \n \n )\n}\n\nexport function Hidden(props) {\n let user = null\n if (props.post.hidden_by) {\n user = interpolate(\n HIDDEN_BY_URL,\n {\n url: escapeHtml(props.post.url.hidden_by),\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n } else {\n user = interpolate(\n HIDDEN_BY_SPAN,\n {\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n }\n\n const date = interpolate(\n HIDDEN_ON,\n {\n absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n relative: escapeHtml(props.post.hidden_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\"post body hidden\", \"Hidden by %(hidden_by)s %(hidden_on)s.\")\n ),\n {\n hidden_by: user,\n hidden_on: date,\n },\n true\n )\n\n return (\n \n

    \n {pgettext(\n \"post body hidden\",\n \"This post is hidden. You cannot see its contents.\"\n )}\n

    \n

    \n \n )\n}\n\nexport function Invalid(props) {\n return (\n \n

    \n {pgettext(\n \"post body invalid\",\n \"This post's contents cannot be displayed.\"\n )}\n

    \n

    \n {pgettext(\n \"post body invalid\",\n \"This error is caused by invalid post content manipulation.\"\n )}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport function FlagBestAnswer({ post, thread, user }) {\n if (!(isVisible(post) && post.id === thread.best_answer)) {\n return null\n }\n\n let message = null\n if (user.id && thread.best_answer_marked_by === user.id) {\n message = interpolate(\n pgettext(\n \"post best answer flag\",\n \"Marked as best answer by you %(marked_on)s.\"\n ),\n {\n marked_on: thread.best_answer_marked_on.fromNow(),\n },\n true\n )\n } else {\n message = interpolate(\n pgettext(\n \"post best answer flag\",\n \"Marked as best answer by %(marked_by)s %(marked_on)s.\"\n ),\n {\n marked_by: thread.best_answer_marked_by_name,\n marked_on: thread.best_answer_marked_on.fromNow(),\n },\n true\n )\n }\n\n return (\n
    \n check_box\n

    {message}

    \n
    \n )\n}\n\nexport function FlagHidden(props) {\n if (!(isVisible(props.post) && props.post.is_hidden)) {\n return null\n }\n\n return (\n
    \n visibility_off\n

    \n {pgettext(\n \"post hidden flag\",\n \"This post is hidden. Only users with permission may see its contents.\"\n )}\n

    \n
    \n )\n}\n\nexport function FlagUnapproved(props) {\n if (!(isVisible(props.post) && props.post.is_unapproved)) {\n return null\n }\n\n return (\n
    \n remove_circle_outline\n

    \n {pgettext(\n \"post unapproved flag\",\n \"This post is unapproved. Only users with permission to approve posts and its author may see its contents.\"\n )}\n

    \n
    \n )\n}\n\nexport function FlagProtected(props) {\n if (!(isVisible(props.post) && props.post.is_protected)) {\n return null\n }\n\n return (\n
    \n lock_outline\n

    \n {pgettext(\n \"post protected flag\",\n \"This post is protected. Only moderators may change it.\"\n )}\n

    \n
    \n )\n}\n\nexport function isVisible(post) {\n return !post.is_hidden || post.acl.can_see_hidden\n}\n","import moment from \"moment\"\nimport * as thread from \"misago/reducers/thread\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function approve(props) {\n store.dispatch(\n post.patch(props.post, {\n is_unapproved: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-unapproved\", value: false }]\n\n const previousState = {\n is_unapproved: props.post.is_unapproved,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function protect(props) {\n store.dispatch(\n post.patch(props.post, {\n is_protected: true,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: true }]\n\n const previousState = {\n is_protected: props.post.is_protected,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unprotect(props) {\n store.dispatch(\n post.patch(props.post, {\n is_protected: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: false }]\n\n const previousState = {\n is_protected: props.post.is_protected,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function hide(props) {\n store.dispatch(\n post.patch(props.post, {\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(props.post.url, {\n hidden_by: props.user.url,\n }),\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: true }]\n\n const previousState = {\n is_hidden: props.post.is_hidden,\n hidden_on: props.post.hidden_on,\n hidden_by_name: props.post.hidden_by_name,\n url: props.post.url,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unhide(props) {\n store.dispatch(\n post.patch(props.post, {\n is_hidden: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: false }]\n\n const previousState = {\n is_hidden: props.post.is_hidden,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function like(props) {\n const lastLikes = props.post.last_likes || []\n const concatedLikes = [props.user].concat(lastLikes)\n const finalLikes =\n concatedLikes.length > 3 ? concatedLikes.slice(0, -1) : concatedLikes\n\n store.dispatch(\n post.patch(props.post, {\n is_liked: true,\n likes: props.post.likes + 1,\n last_likes: finalLikes,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-liked\", value: true }]\n\n const previousState = {\n is_liked: props.post.is_liked,\n likes: props.post.likes,\n last_likes: props.post.last_likes,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unlike(props) {\n store.dispatch(\n post.patch(props.post, {\n is_liked: false,\n likes: props.post.likes - 1,\n last_likes: props.post.last_likes.filter((user) => {\n return !user.id || user.id !== props.user.id\n }),\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-liked\", value: false }]\n\n const previousState = {\n is_liked: props.post.is_liked,\n likes: props.post.likes,\n last_likes: props.post.last_likes,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function patch(props, ops, previousState) {\n ajax.patch(props.post.api.index, ops).then(\n (newState) => {\n store.dispatch(post.patch(props.post, newState))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(post.patch(props.post, previousState))\n }\n )\n}\n\nexport function remove(props) {\n let confirmed = window.confirm(\n pgettext(\n \"post delete\",\n \"Are you sure you want to delete this post? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n store.dispatch(\n post.patch(props.post, {\n isDeleted: true,\n })\n )\n\n ajax.delete(props.post.api.index).then(\n () => {\n snackbar.success(pgettext(\"post delete\", \"Post has been deleted.\"))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(props.post, {\n isDeleted: false,\n })\n )\n }\n )\n}\n\nexport function markAsBestAnswer(props) {\n const { post, user } = props\n\n store.dispatch(\n thread.update({\n best_answer: post.id,\n best_answer_is_protected: post.is_protected,\n best_answer_marked_on: moment(),\n best_answer_marked_by: user.id,\n best_answer_marked_by_name: user.username,\n best_answer_marked_by_slug: user.slug,\n })\n )\n\n const ops = [\n { op: \"replace\", path: \"best-answer\", value: post.id },\n { op: \"add\", path: \"acl\", value: true },\n ]\n\n const previousState = {\n best_answer: props.thread.best_answer,\n best_answer_is_protected: props.thread.best_answer_is_protected,\n best_answer_marked_on: props.thread.best_answer_marked_on,\n best_answer_marked_by: props.thread.best_answer_marked_by,\n best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n }\n\n patchThread(props, ops, previousState)\n}\n\nexport function unmarkBestAnswer(props) {\n const { post } = props\n\n store.dispatch(\n thread.update({\n best_answer: null,\n best_answer_is_protected: false,\n best_answer_marked_on: null,\n best_answer_marked_by: null,\n best_answer_marked_by_name: null,\n best_answer_marked_by_slug: null,\n })\n )\n\n const ops = [\n { op: \"remove\", path: \"best-answer\", value: post.id },\n { op: \"add\", path: \"acl\", value: true },\n ]\n\n const previousState = {\n best_answer: props.thread.best_answer,\n best_answer_is_protected: props.thread.best_answer_is_protected,\n best_answer_marked_on: props.thread.best_answer_marked_on,\n best_answer_marked_by: props.thread.best_answer_marked_by,\n best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n }\n\n patchThread(props, ops, previousState)\n}\n\nexport function patchThread(props, ops, previousState) {\n ajax.patch(props.thread.api.index, ops).then(\n (newState) => {\n if (newState.best_answer_marked_on) {\n newState.best_answer_marked_on = moment(newState.best_answer_marked_on)\n }\n store.dispatch(thread.update(newState))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(thread.update(previousState))\n }\n )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Avatar from \"misago/components/avatar\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n\n error: null,\n likes: [],\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.post.api.likes).then(\n (data) => {\n this.setState({\n isReady: true,\n likes: data.map(hydrateLike),\n })\n },\n (rejection) => {\n this.setState({\n isReady: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.error) {\n return (\n \n \n \n )\n } else if (this.state.isReady) {\n if (this.state.likes.length) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n}\n\nexport function hydrateLike(data) {\n return Object.assign({}, data, {\n liked_on: moment(data.liked_on),\n })\n}\n\nexport function ModalDialog({ className, children, likes }) {\n let title = pgettext(\"post likes modal title\", \"Post Likes\")\n if (likes) {\n const likesCount = likes.length\n const message = npgettext(\n \"post likes modal\",\n \"%(likes)s like\",\n \"%(likes)s likes\",\n likesCount\n )\n\n title = interpolate(message, { likes: likesCount }, true)\n }\n\n return (\n
    \n
    \n
    \n \n ×\n \n

    {title}

    \n
    \n {children}\n
    \n
    \n )\n}\n\nexport function LikesList(props) {\n return (\n
    \n
      \n {props.likes.map((like) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function LikeDetails(props) {\n if (props.url) {\n const user = {\n id: props.liker_id,\n avatars: props.avatars,\n }\n\n return (\n
  • \n
    \n \n \n \n
    \n
    \n \n {props.username}\n {\" \"}\n \n
    \n
  • \n )\n }\n\n return (\n
  • \n
    \n \n \n \n
    \n
    \n {props.username} \n
    \n
  • \n )\n}\n\nexport function LikeDate(props) {\n return (\n \n {props.likedOn.fromNow()}\n \n )\n}\n","import React from \"react\"\nimport * as actions from \"./controls/actions\"\nimport LikesModal from \"misago/components/post-likes\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\n\nexport default function (props) {\n if (!isVisible(props.post)) return null\n\n return (\n
    \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport function isVisible(post) {\n return (\n (!post.is_hidden || post.acl.can_see_hidden) &&\n (post.acl.can_reply ||\n post.acl.can_edit ||\n (post.acl.can_see_likes && (post.last_likes || []).length) ||\n post.acl.can_like)\n )\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n onClick = () => {\n actions.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n \n check_box\n {pgettext(\"post footer btn\", \"Best answer\")}\n \n )\n }\n}\n\nexport class MarkAsBestAnswerCompact extends React.Component {\n onClick = () => {\n actions.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n \n check_box\n \n )\n }\n}\n\nexport class Like extends React.Component {\n onClick = () => {\n if (this.props.post.is_liked) {\n actions.unlike(this.props)\n } else {\n actions.like(this.props)\n }\n }\n\n render() {\n if (!this.props.post.acl.can_like) return null\n\n let className = \"btn btn-default btn-sm pull-left\"\n if (this.props.post.is_liked) {\n className = \"btn btn-success btn-sm pull-left\"\n }\n\n return (\n \n {this.props.post.is_liked\n ? pgettext(\"post footer btn\", \"Liked\")\n : pgettext(\"post footer btn\", \"Like\")}\n \n )\n }\n}\n\nexport class Likes extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const hasLikes = (this.props.post.last_likes || []).length > 0\n if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n if (this.props.post.acl.can_see_likes === 2) {\n return (\n \n {getLikesMessage(this.props.likes, this.props.lastLikes)}\n \n )\n }\n\n return (\n

    \n {getLikesMessage(this.props.likes, this.props.lastLikes)}\n

    \n )\n }\n}\n\nexport class LikesCompact extends Likes {\n render() {\n const hasLikes = (this.props.post.last_likes || []).length > 0\n if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n if (this.props.post.acl.can_see_likes === 2) {\n return (\n \n favorite\n {this.props.likes}\n \n )\n }\n\n return (\n

    \n favorite\n {this.props.likes}\n

    \n )\n }\n}\n\nexport function getLikesMessage(likes, users) {\n const usernames = users.slice(0, 3).map((u) => u.username)\n\n if (usernames.length == 1) {\n return interpolate(\n pgettext(\"post likes\", \"%(user)s likes this.\"),\n {\n user: usernames[0],\n },\n true\n )\n }\n\n const hiddenLikes = likes - usernames.length\n\n const otherUsers = usernames.slice(0, -1).join(\", \")\n const lastUser = usernames.slice(-1)[0]\n\n const usernamesList = interpolate(\n pgettext(\"post likes\", \"%(users)s and %(last_user)s\"),\n {\n users: otherUsers,\n last_user: lastUser,\n },\n true\n )\n\n if (hiddenLikes === 0) {\n return interpolate(\n pgettext(\"post likes\", \"%(users)s like this.\"),\n {\n users: usernamesList,\n },\n true\n )\n }\n\n const message = npgettext(\n \"post likes\",\n \"%(users)s and %(likes)s other user like this.\",\n \"%(users)s and %(likes)s other users like this.\",\n hiddenLikes\n )\n\n return interpolate(\n message,\n {\n users: usernames.join(\", \"),\n likes: hiddenLikes,\n },\n true\n )\n}\n\nexport class Reply extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"REPLY\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n })\n }\n\n render() {\n if (this.props.post.acl.can_reply) {\n return (\n \n {pgettext(\"post footer btn\", \"Reply\")}\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Quote extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"QUOTE\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n\n context: {\n reply: this.props.post.id,\n },\n })\n }\n\n render() {\n if (this.props.post.acl.can_reply) {\n return (\n \n {pgettext(\"post footer btn\", \"Quote\")}\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Edit extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"EDIT\",\n\n thread: this.props.thread,\n post: this.props.post,\n config: this.props.post.api.editor,\n submit: this.props.post.api.index,\n })\n }\n\n render() {\n if (this.props.post.acl.can_edit) {\n return (\n \n {pgettext(\"post footer btn\", \"Edit\")}\n \n )\n } else {\n return null\n }\n }\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(\n pgettext(\n \"post move modal\",\n \"You have to enter link to the other thread.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.move, {\n new_thread: this.state.url,\n posts: [this.props.post.id],\n })\n }\n\n handleSuccess(success) {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n modal.hide()\n\n snackbar.success(\n pgettext(\n \"post move modal\",\n \"Selected post was moved to the other thread.\"\n )\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"post move modal btn\", \"Move post\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"post move modal title\", \"Move post\")}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n
      \n {props.diff.map((item, i) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function DiffItem(props) {\n if (props.item[0] === \"?\") return null\n\n return (\n
  • {cleanItem(props.item)}
  • \n )\n}\n\nexport function getItemClassName(item) {\n let className = \"diff-item\"\n if (item[0] === \"-\") {\n className += \" diff-item-sub\"\n } else if (item[0] === \"+\") {\n className += \" diff-item-add\"\n }\n return className\n}\n\nexport function cleanItem(item) {\n return item.substr(2)\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\n\nexport default class extends React.Component {\n onClick = () => {\n this.props.revertEdit(this.props.edit.id)\n }\n\n render() {\n if (!this.props.canRevert) return null\n\n return (\n
    \n \n {pgettext(\"post revert btn\", \"Revert\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default class extends React.Component {\n goLast = () => {\n this.props.goToEdit()\n }\n\n goForward = () => {\n this.props.goToEdit(this.props.edit.next)\n }\n\n goBack = () => {\n this.props.goToEdit(this.props.edit.previous)\n }\n\n revertEdit = () => {\n this.props.revertEdit(this.props.edit.id)\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n )\n }\n}\n\nexport function GoBackBtn(props) {\n return (\n \n chevron_left\n \n )\n}\n\nexport function GoForwardBtn(props) {\n return (\n \n chevron_right\n \n )\n}\n\nexport function GoLastBtn(props) {\n return (\n \n last_page\n \n )\n}\n\nexport function RevertBtn(props) {\n if (!props.canRevert) return null\n\n return (\n
    \n \n {pgettext(\"post revert btn\", \"Revert\")}\n \n
    \n )\n}\n\nexport function Label(props) {\n let user = null\n if (props.edit.url.editor) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.edit.url.editor),\n user: escapeHtml(props.edit.editor_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.edit.editor_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.edit.edited_on.format(\"LLL\")),\n relative: escapeHtml(props.edit.edited_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\"post history modal\", \"By %(edited_by)s %(edited_on)s.\")\n ),\n {\n edited_by: user,\n edited_on: date,\n },\n true\n )\n\n return

    \n}\n","import moment from \"moment\"\n\nexport function hydrateEdit(json) {\n return Object.assign({}, json, {\n edited_on: moment(json.edited_on),\n })\n}\n","import React from \"react\"\nimport Diff from \"./diff\"\nimport Footer from \"./footer\"\nimport Toolbar from \"./toolbar\"\nimport { hydrateEdit } from \"./utils\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isBusy: true,\n\n canRevert: props.post.acl.can_edit,\n\n error: null,\n edit: null,\n }\n }\n\n componentDidMount() {\n this.goToEdit()\n }\n\n goToEdit = (edit = null) => {\n this.setState({\n isBusy: true,\n })\n\n let url = this.props.post.api.edits\n if (edit !== null) {\n url += \"?edit=\" + edit\n }\n\n ajax.get(url).then(\n (data) => {\n this.setState({\n isReady: true,\n isBusy: false,\n edit: hydrateEdit(data),\n })\n },\n (rejection) => {\n this.setState({\n isReady: true,\n isBusy: false,\n error: rejection.detail,\n })\n }\n )\n }\n\n revertEdit = (edit) => {\n if (this.state.isBusy) return\n\n const confirmation = window.confirm(\n pgettext(\n \"post revert\",\n \"Are you sure you with to revert this post to the state from before this edit?\"\n )\n )\n if (!confirmation) return\n\n this.setState({\n isBusy: true,\n })\n\n const url = this.props.post.api.edits + \"?edit=\" + edit\n ajax.post(url).then(\n (data) => {\n const hydratedPost = post.hydrate(data)\n store.dispatch(post.patch(data, hydratedPost))\n\n snackbar.success(\n pgettext(\"post revert\", \"Post has been reverted to previous state.\")\n )\n modal.hide()\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n this.setState({\n isBusy: false,\n })\n }\n )\n }\n\n render() {\n if (this.state.error) {\n return (\n \n \n \n )\n } else if (this.state.isReady) {\n return (\n \n \n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n}\n\nexport function ModalDialog(props) {\n return (\n

    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"post history modal title\", \"Post edits history\")}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport Select from \"misago/components/select\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default function (props) {\n return \n}\n\nexport class PostingConfig extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isError: false,\n\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n post: item.post,\n })\n })\n\n this.setState({\n isLoaded: true,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.isError) {\n return \n } else if (this.state.isLoaded) {\n return (\n \n )\n } else {\n return \n }\n }\n}\n\nexport class ModerationForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n title: \"\",\n category: null,\n categories: props.categories,\n weight: 0,\n is_hidden: 0,\n is_closed: false,\n\n validators: {\n title: [validators.required()],\n },\n\n errors: {},\n }\n\n this.isHiddenChoices = [\n {\n value: 0,\n icon: \"visibility\",\n label: pgettext(\"thread hidden switch choice\", \"No\"),\n },\n {\n value: 1,\n icon: \"visibility_off\",\n label: pgettext(\"thread hidden switch choice\", \"Yes\"),\n },\n ]\n\n this.isClosedChoices = [\n {\n value: false,\n icon: \"lock_outline\",\n label: pgettext(\"thread closed switch choice\", \"No\"),\n },\n {\n value: true,\n icon: \"lock\",\n label: pgettext(\"thread closed switch choice\", \"Yes\"),\n },\n ]\n\n this.acl = {}\n this.props.categories.forEach((category) => {\n if (category.post) {\n if (!this.state.category) {\n this.state.category = category.id\n }\n\n this.acl[category.id] = {\n can_pin_threads: category.post.pin,\n can_close_threads: category.post.close,\n can_hide_threads: category.post.hide,\n }\n }\n })\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.split, {\n title: this.state.title,\n category: this.state.category,\n weight: this.state.weight,\n is_hidden: this.state.is_hidden,\n is_closed: this.state.is_closed,\n posts: [this.props.post.id],\n })\n }\n\n handleSuccess(apiResponse) {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n modal.hide()\n\n snackbar.success(\n pgettext(\"post split modal\", \"Selected post was split into new thread.\")\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n snackbar.error(gettext(\"Form contains errors.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (ev) => {\n const categoryId = ev.target.value\n const newState = {\n category: categoryId,\n }\n\n if (this.acl[categoryId].can_pin_threads < newState.weight) {\n newState.weight = 0\n }\n\n if (!this.acl[categoryId].can_hide_threads) {\n newState.is_hidden = 0\n }\n\n if (!this.acl[categoryId].can_close_threads) {\n newState.is_closed = false\n }\n\n this.setState(newState)\n }\n\n getWeightChoices() {\n const choices = [\n {\n value: 0,\n icon: \"remove\",\n label: pgettext(\"thread weight choice\", \"Not pinned\"),\n },\n {\n value: 1,\n icon: \"bookmark_border\",\n label: pgettext(\"thread weight choice\", \"Pinned in category\"),\n },\n ]\n\n if (this.acl[this.state.category].can_pin_threads == 2) {\n choices.push({\n value: 2,\n icon: \"bookmark\",\n label: pgettext(\"thread weight choice\", \"Pinned globally\"),\n })\n }\n\n return choices\n }\n\n renderWeightField() {\n if (this.acl[this.state.category].can_pin_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderHiddenField() {\n if (this.acl[this.state.category].can_hide_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderClosedField() {\n if (this.acl[this.state.category].can_close_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n \n \n
    \n\n \n \n \n
    \n\n {this.renderWeightField()}\n {this.renderHiddenField()}\n {this.renderClosedField()}\n
    \n
    \n \n
    \n \n \n )\n }\n}\n\nexport function Loader() {\n return (\n \n \n \n )\n}\n\nexport function Error(props) {\n return (\n \n
    \n info_outline\n
    \n
    \n

    \n {pgettext(\n \"post split modal\",\n \"You can't move this post at the moment.\"\n )}\n

    \n

    {props.message}

    \n
    \n
    \n )\n}\n\nexport function Modal(props) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"posts split modal title\", \"Split post into new thread\")}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport * as moderation from \"./actions\"\nimport MoveModal from \"./move\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport SplitModal from \"./split\"\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport class Permalink extends React.Component {\n onClick = () => {\n let permaUrl = window.location.protocol + \"//\"\n permaUrl += window.location.host\n permaUrl += this.props.post.url.index\n\n prompt(pgettext(\"post permalink\", \"Permament link to this post:\"), permaUrl)\n }\n\n render() {\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Edit extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"EDIT\",\n\n thread: this.props.thread,\n post: this.props.post,\n config: this.props.post.api.editor,\n submit: this.props.post.api.index,\n })\n }\n\n render() {\n if (!this.props.post.acl.can_edit) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n onClick = () => {\n moderation.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (post.id === thread.best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class UnmarkMarkBestAnswer extends React.Component {\n onClick = () => {\n moderation.unmarkBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id !== thread.best_answer) return null\n if (!thread.acl.can_unmark_best_answer) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class PostEdits extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isHidden =\n this.props.post.is_hidden && !this.props.post.acl.can_see_hidden\n const isUnedited = this.props.post.edits === 0\n if (isHidden || isUnedited) return null\n\n const message = npgettext(\n \"post edits\",\n \"This post was edited %(edits)s time.\",\n \"This post was edited %(edits)s times.\",\n this.props.post.edits\n )\n\n const title = interpolate(\n message,\n {\n edits: this.props.post.edits,\n },\n true\n )\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Approve extends React.Component {\n onClick = () => {\n moderation.approve(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_approve) return null\n if (!this.props.post.is_unapproved) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Move extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.post.acl.can_move) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Split extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.post.acl.can_move) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Protect extends React.Component {\n onClick = () => {\n moderation.protect(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_protect) return null\n if (this.props.post.is_protected) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unprotect extends React.Component {\n onClick = () => {\n moderation.unprotect(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_protect) return null\n if (!this.props.post.is_protected) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n moderation.hide(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id === thread.best_answer) return null\n if (!post.acl.can_hide) return null\n if (post.is_hidden) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n moderation.unhide(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_unhide) return null\n if (!this.props.post.is_hidden) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n moderation.remove(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id === thread.best_answer) return null\n if (!post.acl.can_delete) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport Dropdown from \"./dropdown\"\n\nexport default function (props) {\n return (\n
    \n \n expand_more\n \n \n
    \n )\n}\n","import React from \"react\"\nimport * as posts from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n onClick = () => {\n if (this.props.post.isSelected) {\n store.dispatch(posts.deselect(this.props.post))\n } else {\n store.dispatch(posts.select(this.props.post))\n }\n }\n\n render() {\n if (\n !(this.props.thread.acl.can_merge_posts || isVisible(this.props.post.acl))\n ) {\n return null\n }\n\n return (\n
    \n \n \n {this.props.post.isSelected\n ? \"check_box\"\n : \"check_box_outline_blank\"}\n \n \n
    \n )\n }\n}\n\nexport function isVisible(acl) {\n return (\n acl.can_approve ||\n acl.can_hide ||\n acl.can_protect ||\n acl.can_unhide ||\n acl.can_delete ||\n acl.can_move\n )\n}\n","import React from \"react\"\nimport Controls from \"./controls\"\nimport Select from \"./select\"\nimport {\n StatusIcon,\n getStatusClassName,\n getStatusDescription,\n} from \"misago/components/user-status\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport modal from \"misago/services/modal\"\n\nexport default function (props) {\n return (\n
    \n \n \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n {post.poster_name}\n\n \n {pgettext(\"post removed poster username\", \"Removed user\")}\n \n
    \n
    \n
    \n )\n}\n","export default function ({ title, rank }) {\n return rank.is_tab || !!title || !!rank.title\n}\n","import React from \"react\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n const message = npgettext(\n \"poster stats\",\n \"%(posts)s post\",\n \"%(posts)s posts\",\n poster.posts\n )\n\n let className = \"user-postcount\"\n if (hasVisibleTitle(poster)) {\n className += \" hidden-xs hidden-sm\"\n }\n\n return (\n \n {interpolate(\n message,\n {\n posts: poster.posts,\n },\n true\n )}\n \n )\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n let className = \"hidden-xs\"\n if (hasVisibleTitle(poster)) {\n className += \" hidden-sm\"\n }\n\n return (\n \n \n \n \n \n )\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title\n if (!userTitle && rank.is_tab) {\n userTitle = rank.name\n }\n\n if (!userTitle) return null\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n )\n }\n\n return
    {userTitle}
    \n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Controls from \"misago/components/posts-list/post/controls\"\nimport Select from \"misago/components/posts-list/post/select\"\nimport UserStatus, { StatusIcon } from \"misago/components/user-status\"\nimport UserPostcount from \"./user-postcount\"\nimport UserStatusLabel from \"./user-status\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ post, thread }) {\n const { poster } = post\n\n return (\n
    \n \n \n )\n}\n\nexport function PollSelect({ choices, onChange, value }) {\n if (!choices) return null\n\n return (\n \n \n {choices.map((choice) => {\n return (\n \n )\n })}\n \n \n )\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport MergeConflict from \"misago/components/merge-conflict\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(\n pgettext(\n \"thread merge form\",\n \"You have to enter link to the other thread.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n // freeze thread\n store.dispatch(thread.busy())\n\n return ajax.post(this.props.thread.api.merge, {\n other_thread: this.state.url,\n })\n }\n\n handleSuccess = (success) => {\n this.handleSuccessUnmounted(success)\n\n // keep form loading\n this.setState({\n isLoading: true,\n })\n }\n\n handleSuccessUnmounted = (success) => {\n snackbar.success(\n pgettext(\"thread merge form\", \"Thread has been merged with other one.\")\n )\n window.location = success.url\n }\n\n handleError = (rejection) => {\n store.dispatch(thread.release())\n\n if (rejection.status === 400) {\n if (rejection.best_answers || rejection.polls) {\n modal.show(\n \n )\n } else if (rejection.best_answer) {\n snackbar.error(rejection.best_answer[0])\n } else if (rejection.poll) {\n snackbar.error(rejection.poll[0])\n } else {\n snackbar.error(rejection.detail)\n }\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"thread merge form btn\", \"Cancel\")}\n \n \n {pgettext(\"thread merge form btn\", \"Merge thread\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"thread merge form title\", \"Merge thread\")}\n

    \n
    \n )\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport * as posts from \"misago/reducers/posts\"\nimport * as thread from \"misago/reducers/thread\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n isError: false,\n\n category: null,\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n let category = null\n\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n // pick first category that allows posting and if it may, override it with initial one\n if (item.post !== false && !category) {\n category = item.id\n }\n\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n })\n })\n\n this.setState({\n isReady: true,\n\n category,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n send() {\n // freeze thread\n store.dispatch(thread.busy())\n\n return ajax.patch(this.props.thread.api.index, [\n { op: \"replace\", path: \"category\", value: this.state.category },\n ])\n }\n\n handleSuccess() {\n // refresh thread and displayed posts\n ajax\n .get(this.props.thread.api.posts.index, { page: this.props.posts.page })\n .then(\n (data) => {\n store.dispatch(thread.replace(data))\n store.dispatch(posts.load(data.post_set))\n store.dispatch(thread.release())\n\n snackbar.success(\n pgettext(\"thread move form\", \"Thread has been moved.\")\n )\n modal.hide()\n },\n (rejection) => {\n store.dispatch(thread.release())\n snackbar.apiError(rejection)\n }\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (event) => {\n this.changeValue(\"category\", event.target.value)\n }\n\n render() {\n if (this.state.isReady) {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"thread move form btn\", \"Cancel\")}\n \n \n {pgettext(\"thread move form btn\", \"Move thread\")}\n \n
    \n
    \n
    \n
    \n )\n } else if (this.state.isError) {\n return \n } else {\n return \n }\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"thread move form title\", \"Move thread\")}\n

    \n
    \n )\n}\n\nexport function ModalLoading(props) {\n return (\n
    \n
    \n \n \n
    \n
    \n )\n}\n\nexport function ModalMessage(props) {\n return (\n
    \n
    \n \n
    \n info_outline\n
    \n
    \n

    \n {pgettext(\n \"thread move form\",\n \"You can't move this thread at the moment.\"\n )}\n

    \n

    {props.message}

    \n \n {pgettext(\"thread move form dismiss btn\", \"Ok\")}\n \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport ThreadChangeTitleModal from \"./ThreadChangeTitleModal\"\nimport MergeModal from \"./merge\"\nimport MoveModal from \"./move\"\n\nexport default class extends React.Component {\n callApi = (ops, successMessage) => {\n store.dispatch(thread.busy())\n\n // by the chance update thread acl too\n ops.push({ op: \"add\", path: \"acl\", value: true })\n\n ajax.patch(this.props.thread.api.index, ops).then(\n (data) => {\n store.dispatch(thread.update(data))\n store.dispatch(thread.release())\n snackbar.success(successMessage)\n },\n (rejection) => {\n store.dispatch(thread.release())\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n )\n }\n\n changeTitle = () => {\n modal.show()\n }\n\n pinGlobally = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"weight\",\n value: 2,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been pinned globally.\")\n )\n }\n\n pinLocally = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"weight\",\n value: 1,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been pinned in category.\")\n )\n }\n\n unpin = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"weight\",\n value: 0,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been unpinned.\")\n )\n }\n\n approve = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-unapproved\",\n value: false,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been approved.\")\n )\n }\n\n open = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-closed\",\n value: false,\n },\n ],\n gettext(\"Thread has been opened.\")\n )\n }\n\n close = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-closed\",\n value: true,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been closed.\")\n )\n }\n\n unhide = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-hidden\",\n value: false,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been made visible.\")\n )\n }\n\n hide = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-hidden\",\n value: true,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been made hidden.\")\n )\n }\n\n move = () => {\n modal.show(\n \n )\n }\n\n merge = () => {\n modal.show()\n }\n\n delete = () => {\n if (\n !window.confirm(\n pgettext(\n \"thread moderation\",\n \"Are you sure you want to delete this thread?\"\n )\n )\n ) {\n return\n }\n\n store.dispatch(thread.busy())\n\n ajax.delete(this.props.thread.api.index).then(\n (data) => {\n snackbar.success(\n pgettext(\"thread moderation\", \"Thread has been deleted.\")\n )\n window.location = this.props.thread.category.url.index\n },\n (rejection) => {\n store.dispatch(thread.release())\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n const { moderation } = this.props\n\n return (\n
      \n {!!moderation.edit && (\n
    • \n \n edit\n {pgettext(\"thread moderation btn\", \"Change title\")}\n \n
    • \n )}\n {!!moderation.pinGlobally && (\n
    • \n \n bookmark\n {pgettext(\"thread moderation btn\", \"Pin globally\")}\n \n
    • \n )}\n {!!moderation.pinLocally && (\n
    • \n \n bookmark_border\n {pgettext(\"thread moderation btn\", \"Pin in category\")}\n \n
    • \n )}\n {!!moderation.unpin && (\n
    • \n \n
    • \n )}\n {!!moderation.move && (\n
    • \n \n
    • \n )}\n {!!moderation.merge && (\n
    • \n \n
    • \n )}\n {!!moderation.approve && (\n
    • \n \n done\n {pgettext(\"thread moderation btn\", \"Approve\")}\n \n
    • \n )}\n {!!moderation.open && (\n
    • \n \n
    • \n )}\n {!!moderation.close && (\n
    • \n \n
    • \n )}\n {!!moderation.unhide && (\n
    • \n \n visibility\n {pgettext(\"thread moderation btn\", \"Unhide\")}\n \n
    • \n )}\n {!!moderation.hide && (\n
    • \n \n
    • \n )}\n {!!moderation.delete && (\n
    • \n \n clear\n {pgettext(\"thread moderation btn\", \"Delete\")}\n \n
    • \n )}\n
    \n )\n }\n}\n","import ThreadModerationOptions from \"./controls\"\n\nexport default ThreadModerationOptions\n","import React from \"react\"\nimport ThreadModerationOptions from \"./moderation/thread\"\n\nconst ThreadModeration = ({ thread, posts, moderation }) => (\n
    \n \n settings\n \n \n
    \n)\n\nexport default ThreadModeration\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport { update } from \"../../reducers/thread\"\nimport snackbar from \"../../services/snackbar\"\nimport { ApiMutation } from \"../Api\"\nimport { DropdownSubheader } from \"../Dropdown\"\n\nconst ThreadWatchButton = ({ dispatch, dropup, stickToBottom, thread }) => (\n \n {(mutate, { loading }) => {\n function setNotifications(notifications) {\n if (thread.notifications !== notifications) {\n dispatch(update({ notifications }))\n mutate({\n json: { notifications },\n onError: (error) => {\n snackbar.apiError(error)\n dispatch(update({ notifications: thread.notifications }))\n },\n })\n }\n }\n\n return (\n
    \n \n \n {getIcon(thread.notifications)}\n \n {getLabel(thread.notifications)}\n \n \n \n {pgettext(\"watch thread\", \"Notify about new replies\")}\n \n
  • \n setNotifications(2)}\n >\n mail\n {pgettext(\"watch thread\", \"On site and with e-mail\")}\n \n
  • \n
  • \n setNotifications(1)}\n >\n notifications_active\n {pgettext(\"watch thread\", \"On site only\")}\n \n
  • \n
  • \n setNotifications(0)}\n >\n notifications_none\n {pgettext(\"watch thread\", \"Don't notify\")}\n \n
  • \n \n
    \n )\n }}\n
    \n)\n\nfunction getIcon(notifications) {\n if (notifications === 2) return \"mail\"\n if (notifications === 1) return \"notifications_active\"\n\n return \"notifications_none\"\n}\n\nfunction getLabel(notifications) {\n if (notifications) {\n return pgettext(\"watch thread\", \"Watching\")\n }\n\n return pgettext(\"watch thread\", \"Watch\")\n}\n\nconst ThreadWatchButtonConnected = connect()(ThreadWatchButton)\n\nexport default ThreadWatchButtonConnected\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst Breadcrumbs = ({ children, className }) => (\n
      {children}
    \n)\n\nexport default Breadcrumbs\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst BreadcrumbsCategory = ({ category, className }) => (\n
  • \n \n \n label\n \n {!!category.short_name && (\n \n {category.short_name}\n \n )}\n {!!category.short_name && (\n {category.name}\n )}\n {!category.short_name && (\n {category.name}\n )}\n \n
  • \n)\n\nexport default BreadcrumbsCategory\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst BreadcrumbsRootCategory = ({ category, className }) => (\n
  • \n \n chevron_right\n \n {category.special_role === \"root_category\"\n ? pgettext(\"breadcrumb\", \"Threads\")\n : pgettext(\"breadcrumb\", \"Private threads\")}\n \n \n
  • \n)\n\nexport default BreadcrumbsRootCategory\n","import React from \"react\"\nimport {\n Breadcrumbs,\n BreadcrumbsCategory,\n BreadcrumbsRootCategory,\n} from \"../../Breadcrumbs\"\n\nconst ThreadHeaderBreadcrumbs = ({ breadcrumbs }) => (\n \n {breadcrumbs.map((category) =>\n category.special_role ? (\n \n ) : (\n \n )\n )}\n \n)\n\nexport default ThreadHeaderBreadcrumbs\n","import React from \"react\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../../FlexRow\"\nimport ThreadFlags from \"../../ThreadFlags\"\nimport ThreadReplies from \"../../ThreadReplies\"\nimport ThreadStarterCard from \"../../ThreadStarterCard\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n PageHeaderDetails,\n} from \"../../PageHeader\"\nimport ThreadModeration from \"../ThreadModeration\"\nimport ThreadWatchButton from \"../ThreadWatchButton\"\nimport ThreadHeaderBreadcrumbs from \"./ThreadHeaderBreadcrumbs\"\n\nconst ThreadHeader = ({ styleName, thread, posts, user, moderation }) => (\n \n \n \n \n

    {thread.title}

    \n
    \n \n \n \n \n \n \n \n {thread.replies > 0 && (\n \n \n \n )}\n {hasFlags(thread) && (\n \n \n \n )}\n \n {user.is_authenticated && (\n \n \n \n \n {moderation.enabled && (\n \n \n \n )}\n \n )}\n \n \n
    \n
    \n)\n\nconst hasFlags = (thread) => {\n return (\n thread.is_closed ||\n thread.is_hidden ||\n thread.is_unapproved ||\n thread.weight > 0 ||\n thread.best_answer ||\n thread.has_poll ||\n thread.has_unapproved_posts\n )\n}\n\nexport default ThreadHeader\n","import ThreadHeader from \"./ThreadHeader\"\n\nexport default ThreadHeader\n","import React from \"react\"\nimport { Link, withRouter } from \"react-router\"\nimport { Dropdown } from \"../Dropdown\"\n\nconst ThreadPaginator = ({ router, baseUrl, posts, scrollToTop }) => (\n
    \n {posts.isLoaded && posts.first ? (\n \n first_page\n \n ) : (\n \n first_page\n \n )}\n {posts.isLoaded && posts.previous ? (\n 1 ? posts.previous + \"/\" : \"\")}\n title={pgettext(\"paginator\", \"Go to previous page\")}\n onClick={scrollToTop ? resetScroll : null}\n >\n chevron_left\n \n ) : (\n \n chevron_left\n \n )}\n (\n \n {getLabel(posts.page, posts.pages)}\n \n )}\n onOpen={(dropdown) => {\n dropdown.querySelector(\"input\").focus()\n }}\n >\n {({ close }) => (\n {\n if (posts.isLoaded) {\n const formData = new FormData(event.target)\n const page = parseInt(formData.get(\"page\"))\n\n if (\n page &&\n page != posts.page &&\n page >= 1 &&\n page <= posts.pages\n ) {\n const url = page > 1 ? baseUrl + page + \"/\" : baseUrl\n router.push({ pathname: url })\n }\n }\n\n event.preventDefault()\n close()\n\n if (scrollToTop) {\n resetScroll()\n }\n }}\n >\n \n \n {pgettext(\"paginator\", \"Go\")}\n \n \n )}\n \n {posts.isLoaded && posts.next ? (\n \n chevron_right\n \n ) : (\n \n chevron_right\n \n )}\n {posts.isLoaded && posts.last ? (\n \n last_page\n \n ) : (\n \n last_page\n \n )}\n
    \n)\n\nfunction getLabel(page, pages) {\n return pgettext(\"paginator\", \"Page %(page)s of %(pages)s\")\n .replace(\"%(page)s\", page)\n .replace(\"%(pages)s\", pages)\n}\n\nfunction resetScroll() {\n window.scrollTo(0, 0)\n}\n\nconst ThreadPaginatorConnected = withRouter(ThreadPaginator)\n\nexport default ThreadPaginatorConnected\n","import React from \"react\"\n\nexport default function ({ errors, posts }) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"thread posts moderation modal title\", \"Moderation\")}\n

    \n
    \n
    \n

    \n {pgettext(\n \"thread posts moderation modal\",\n \"One or more posts could not be changed:\"\n )}\n

    \n\n
      \n {errors.map((post) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n )\n}\n\nexport function PostErrors({ errors, post }) {\n const heading = interpolate(\n pgettext(\"thread posts moderation modal\", \"%(username)s on %(posted_on)s\"),\n {\n posted_on: post.posted_on.format(\"LL, LT\"),\n username: post.poster_name,\n },\n true\n )\n\n return (\n
  • \n
    {heading}:
    \n {errors.map((error, i) => {\n return

    {error}

    \n })}\n
  • \n )\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport * as post from \"misago/reducers/post\"\nimport * as posts from \"misago/reducers/posts\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport ErrorsList from \"./errors-list\"\n\nexport function approve(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-unapproved\", value: false }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_unapproved: false,\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_unapproved: post.is_unapproved,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function protect(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: true }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: true,\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: post.is_protected,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function unprotect(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: false }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: false,\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: post.is_protected,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function hide(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: true }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(post.url, {\n hidden_by: props.user.url,\n }),\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: post.is_hidden,\n hidden_on: post.hidden_on,\n hidden_by_name: post.hidden_by_name,\n url: post.url,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function unhide(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: false }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: false,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(post.url, {\n hidden_by: props.user.url,\n }),\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: post.is_hidden,\n hidden_on: post.hidden_on,\n hidden_by_name: post.hidden_by_name,\n url: post.url,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function patch(props, ops, newState, previousState) {\n const { selection, thread } = props\n\n // patch selected items\n newState.forEach((item) => {\n post.patch(item, item)\n })\n\n // deselect all the things\n store.dispatch(posts.deselectAll())\n\n // call ajax\n const data = {\n ops,\n\n ids: selection.map((post) => {\n return post.id\n }),\n }\n\n ajax.patch(thread.api.posts.index, data).then(\n (data) => {\n data.forEach((item) => {\n store.dispatch(post.patch(item, item))\n })\n },\n (rejection) => {\n if (rejection.status !== 400) {\n // rollback all\n previousState.forEach((item) => {\n store.dispatch(post.patch(item, item))\n })\n return snackbar.apiError(rejection)\n }\n\n let errors = []\n let rollback = []\n\n rejection.forEach((item) => {\n if (item.detail) {\n errors.push(item)\n rollback.push(item.id)\n } else {\n store.dispatch(post.patch(item, item))\n }\n\n previousState.forEach((item) => {\n if (rollback.indexOf(item) !== -1) {\n store.dispatch(post.patch(item, item))\n }\n })\n })\n\n let posts = {}\n selection.forEach((item) => {\n posts[item.id] = item\n })\n\n modal.show()\n }\n )\n}\n\nexport function merge(props) {\n let confirmed = window.confirm(\n pgettext(\n \"merge posts\",\n \"Are you sure you want to merge selected posts? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n props.selection.slice(1).map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n ajax\n .post(props.thread.api.posts.merge, {\n posts: props.selection.map((post) => post.id),\n })\n .then(\n (data) => {\n store.dispatch(post.patch(data, post.hydrate(data)))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n props.selection.slice(1).map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: false,\n })\n )\n })\n }\n )\n\n store.dispatch(posts.deselectAll())\n}\n\nexport function remove(props) {\n let confirmed = window.confirm(\n pgettext(\n \"delete posts\",\n \"Are you sure you want to delete selected posts? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n props.selection.map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n const ids = props.selection.map((post) => {\n return post.id\n })\n\n ajax.delete(props.thread.api.posts.index, ids).then(\n () => {\n return\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n props.selection.map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: false,\n })\n )\n })\n }\n )\n\n store.dispatch(posts.deselectAll())\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(\n pgettext(\n \"thread posts moderation move\",\n \"You have to enter link to the other thread.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.move, {\n new_thread: this.state.url,\n posts: this.props.selection.map((post) => post.id),\n })\n }\n\n handleSuccess(success) {\n this.props.selection.forEach((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n modal.hide()\n\n snackbar.success(\n pgettext(\n \"thread posts moderation move\",\n \"Selected posts were moved to the other thread.\"\n )\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"thread posts moderation move btn\", \"Cancel\")}\n \n \n {pgettext(\"thread posts moderation move btn\", \"Move posts\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"thread posts moderation move title\", \"Move posts\")}\n

    \n
    \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport Select from \"misago/components/select\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\nimport ErrorsModal from \"./errors-list\"\n\nexport default function (props) {\n return \n}\n\nexport class PostingConfig extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isError: false,\n\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n post: item.post,\n })\n })\n\n this.setState({\n isLoaded: true,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.isError) {\n return \n } else if (this.state.isLoaded) {\n return (\n \n )\n } else {\n return \n }\n }\n}\n\nexport class ModerationForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n title: \"\",\n category: null,\n categories: props.categories,\n weight: 0,\n is_hidden: 0,\n is_closed: false,\n\n validators: {\n title: [validators.required()],\n },\n\n errors: {},\n }\n\n this.isHiddenChoices = [\n {\n value: 0,\n icon: \"visibility\",\n label: pgettext(\"thread hidden switch choice\", \"No\"),\n },\n {\n value: 1,\n icon: \"visibility_off\",\n label: pgettext(\"thread hidden switch choice\", \"Yes\"),\n },\n ]\n\n this.isClosedChoices = [\n {\n value: false,\n icon: \"lock_outline\",\n label: pgettext(\"thread closed switch choice\", \"No\"),\n },\n {\n value: true,\n icon: \"lock\",\n label: pgettext(\"thread closed switch choice\", \"Yes\"),\n },\n ]\n\n this.acl = {}\n this.props.categories.forEach((category) => {\n if (category.post) {\n if (!this.state.category) {\n this.state.category = category.id\n }\n\n this.acl[category.id] = {\n can_pin_threads: category.post.pin,\n can_close_threads: category.post.close,\n can_hide_threads: category.post.hide,\n }\n }\n })\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.split, {\n title: this.state.title,\n category: this.state.category,\n weight: this.state.weight,\n is_hidden: this.state.is_hidden,\n is_closed: this.state.is_closed,\n posts: this.props.selection.map((post) => post.id),\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.selection.forEach((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n modal.hide()\n\n snackbar.success(\n pgettext(\n \"posts moderation split\",\n \"Selected posts were split into new thread.\"\n )\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n snackbar.error(gettext(\"Form contains errors.\"))\n } else if (rejection.status === 403 && Array.isArray(rejection)) {\n modal.show()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (ev) => {\n const categoryId = ev.target.value\n const newState = {\n category: categoryId,\n }\n\n if (this.acl[categoryId].can_pin_threads < newState.weight) {\n newState.weight = 0\n }\n\n if (!this.acl[categoryId].can_hide_threads) {\n newState.is_hidden = 0\n }\n\n if (!this.acl[categoryId].can_close_threads) {\n newState.is_closed = false\n }\n\n this.setState(newState)\n }\n\n getWeightChoices() {\n const choices = [\n {\n value: 0,\n icon: \"remove\",\n label: pgettext(\"thread weight choice\", \"Not pinned\"),\n },\n {\n value: 1,\n icon: \"bookmark_border\",\n label: pgettext(\"thread weight choice\", \"Pinned in category\"),\n },\n ]\n\n if (this.acl[this.state.category].can_pin_threads == 2) {\n choices.push({\n value: 2,\n icon: \"bookmark\",\n label: pgettext(\"thread weight choice\", \"Pinned globally\"),\n })\n }\n\n return choices\n }\n\n renderWeightField() {\n if (this.acl[this.state.category].can_pin_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderHiddenField() {\n if (this.acl[this.state.category].can_hide_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderClosedField() {\n if (this.acl[this.state.category].can_close_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n \n \n
    \n\n \n \n \n
    \n\n {this.renderWeightField()}\n {this.renderHiddenField()}\n {this.renderClosedField()}\n
    \n
    \n \n {pgettext(\"posts moderation split btn\", \"Cancel\")}\n \n \n
    \n \n \n )\n }\n}\n\nexport function Loader() {\n return (\n \n \n \n )\n}\n\nexport function Error(props) {\n return (\n \n
    \n info_outline\n
    \n
    \n

    \n {pgettext(\n \"posts moderation split\",\n \"You can't move selected posts at the moment.\"\n )}\n

    \n

    {props.message}

    \n \n
    \n
    \n )\n}\n\nexport function Modal(props) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\n \"posts moderation split title\",\n \"Split posts into new thread\"\n )}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport modal from \"misago/services/modal\"\nimport * as moderation from \"./actions\"\nimport MoveModal from \"./move\"\nimport SplitModal from \"./split\"\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport class Approve extends React.Component {\n onClick = () => {\n moderation.approve(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_approve && post.is_unapproved\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Merge extends React.Component {\n onClick = () => {\n moderation.merge(this.props)\n }\n\n render() {\n const isVisible =\n this.props.selection.length > 1 &&\n this.props.selection.find((post) => {\n return post.acl.can_merge\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Move extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_move\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Split extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_move\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Protect extends React.Component {\n onClick = () => {\n moderation.protect(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return !post.is_protected && post.acl.can_protect\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unprotect extends React.Component {\n onClick = () => {\n moderation.unprotect(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.is_protected && post.acl.can_protect\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n moderation.hide(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_hide && !post.is_hidden\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n moderation.unhide(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_unhide && post.is_hidden\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n moderation.remove(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_delete\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport { ThreadPostsModerationOptions } from \"./moderation/posts\"\n\nconst ThreadPostsModeration = ({ thread, user, selection, dropup }) => (\n
    \n \n settings\n \n \n
    \n)\n\nexport default ThreadPostsModeration\n","import React from \"react\"\n\nconst ThreadReplyButton = ({ onClick }) => (\n \n chat\n {pgettext(\"thread reply btn\", \"Reply\")}\n \n)\n\nexport default ThreadReplyButton\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\nimport ThreadPaginator from \"./ThreadPaginator\"\nimport ThreadPostsModeration from \"./ThreadPostsModeration\"\nimport ThreadReplyButton from \"./ThreadReplyButton\"\nimport ThreadWatchButton from \"./ThreadWatchButton\"\n\nconst ThreadToolbarBottom = ({\n thread,\n posts,\n user,\n selection,\n moderation,\n onReply,\n}) => (\n \n {posts.pages > 1 && (\n \n \n \n \n \n )}\n \n {user.is_authenticated && (\n \n \n \n \n {thread.acl.can_reply && (\n \n \n \n )}\n {moderation.enabled && (\n \n \n \n )}\n \n )}\n {user.is_authenticated && (\n \n \n \n \n \n )}\n \n)\n\nexport default ThreadToolbarBottom\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\n\nconst ThreadToolbarThird = () => (\n \n \n \n \n window.scrollTo(0, 0)}\n >\n arrow_upward\n {pgettext(\"go up\", \"Go to top\")}\n \n \n \n \n)\n\nexport default ThreadToolbarThird\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ThreadPollButton = ({ compact, disabled, onClick }) => (\n \n poll\n {!compact && pgettext(\"thread poll btn\", \"Add poll\")}\n \n)\n\nexport default ThreadPollButton\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst ThreadShortcutsButton = ({ user, thread, posts }) => (\n
    \n \n bookmark\n \n \n
    \n)\n\nexport default ThreadShortcutsButton\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\nimport ThreadPaginator from \"./ThreadPaginator\"\nimport ThreadPollButton from \"./ThreadPollButton\"\nimport ThreadPostsModeration from \"./ThreadPostsModeration\"\nimport ThreadReplyButton from \"./ThreadReplyButton\"\nimport ThreadShortcutsButton from \"./ThreadShortcutsButton\"\n\nconst ThreadToolbarTop = ({\n thread,\n posts,\n user,\n pollDisabled,\n selection,\n moderation,\n onPoll,\n onReply,\n}) => (\n \n \n \n \n \n {posts.pages > 1 && (\n \n \n \n )}\n \n \n {thread.acl.can_start_poll && !thread.poll && (\n \n \n \n \n \n )}\n {thread.acl.can_reply ? (\n \n \n \n \n \n \n \n {thread.acl.can_start_poll && !thread.poll && (\n \n \n \n )}\n {moderation.enabled && (\n \n \n \n )}\n \n ) : (\n \n \n \n \n {thread.acl.can_start_poll && !thread.poll && (\n \n \n \n )}\n {moderation.enabled && (\n \n \n \n )}\n \n )}\n {posts.pages > 1 && (\n \n \n \n \n \n )}\n \n)\n\nexport default ThreadToolbarTop\n","import React from \"react\"\nimport Participants from \"misago/components/participants\"\nimport { Poll, PollForm } from \"misago/components/poll\"\nimport PostsList from \"misago/components/posts-list\"\nimport * as participants from \"misago/reducers/participants\"\nimport * as poll from \"misago/reducers/poll\"\nimport * as posts from \"misago/reducers/posts\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport polls from \"misago/services/polls\"\nimport snackbar from \"misago/services/snackbar\"\nimport posting from \"misago/services/posting\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { PostingQuoteSelection } from \"../posting\"\nimport PageContainer from \"../PageContainer\"\nimport ThreadHeader from \"./ThreadHeader\"\nimport ThreadToolbarBottom from \"./ThreadToolbarBottom\"\nimport ThreadToolbarThird from \"./ThreadToolbarThird\"\nimport ThreadToolbarTop from \"./ThreadToolbarTop\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n editPoll: false,\n }\n }\n\n componentDidMount() {\n if (this.shouldFetchData()) {\n this.fetchData()\n this.setPageTitle()\n }\n\n this.startPollingApi()\n }\n\n componentDidUpdate() {\n if (this.shouldFetchData()) {\n this.fetchData()\n this.startPollingApi()\n this.setPageTitle()\n }\n }\n\n componentWillUnmount() {\n this.stopPollingApi()\n }\n\n shouldFetchData() {\n if (this.props.posts.isLoaded) {\n const page = (this.props.params.page || 1) * 1\n return page != this.props.posts.page\n } else {\n return false\n }\n }\n\n fetchData() {\n store.dispatch(posts.unload())\n\n ajax\n .get(\n this.props.thread.api.posts.index,\n {\n page: this.props.params.page || 1,\n },\n \"posts\"\n )\n .then(\n (data) => {\n this.update(data)\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n startPollingApi() {\n polls.start({\n poll: \"thread-posts\",\n\n url: this.props.thread.api.posts.index,\n data: {\n page: this.props.params.page || 1,\n },\n update: this.update,\n\n frequency: 120 * 1000,\n delayed: true,\n })\n }\n\n stopPollingApi() {\n polls.stop(\"thread-posts\")\n }\n\n setPageTitle() {\n title.set({\n title: this.props.thread.title,\n parent: this.props.thread.category.name,\n page: (this.props.params.page || 1) * 1,\n })\n }\n\n update = (data) => {\n store.dispatch(thread.replace(data))\n store.dispatch(posts.load(data.post_set))\n\n if (data.participants) {\n store.dispatch(participants.replace(data.participants))\n }\n\n if (data.poll) {\n store.dispatch(poll.replace(data.poll))\n }\n\n this.setPageTitle()\n }\n\n openPollForm = () => {\n this.setState({ editPoll: true })\n }\n\n closePollForm = () => {\n this.setState({ editPoll: false })\n }\n\n openReplyForm = () => {\n posting.open({\n mode: \"REPLY\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n })\n }\n\n render() {\n const category = this.props.thread.category\n\n let className = \"page page-thread\"\n if (category.css_class) {\n className += \" page-thread-\" + category.css_class\n }\n\n const styleName =\n category.special_role === \"private_threads\"\n ? \"private-threads\"\n : category.css_class || \"category-threads\"\n\n const threadModeration = getThreadModeration(\n this.props.thread,\n this.props.user\n )\n\n const postsModeration = getPostsModeration(\n this.props.posts.results,\n this.props.user\n )\n const selection = this.props.posts.results.filter((post) => post.isSelected)\n\n return (\n
    \n \n \n \n \n {this.state.editPoll ? (\n \n ) : (\n \n )}\n {this.props.thread.acl.can_reply ? (\n \n \n \n ) : (\n \n )}\n \n \n \n
    \n )\n }\n}\n\nconst getThreadModeration = (thread, user) => {\n const moderation = {\n enabled: false,\n edit: false,\n approve: false,\n close: false,\n open: false,\n hide: false,\n unhide: false,\n move: false,\n merge: false,\n pinGlobally: false,\n pinLocally: false,\n unpin: false,\n delete: false,\n }\n\n if (!user.is_authenticated) return moderation\n\n moderation.edit = thread.acl.can_edit\n moderation.approve = thread.acl.can_approve && thread.is_unapproved\n moderation.close = thread.acl.can_close && !thread.is_closed\n moderation.open = thread.acl.can_close && thread.is_closed\n moderation.hide = thread.acl.can_hide && !thread.is_hidden\n moderation.unhide = thread.acl.can_unhide && thread.is_hidden\n moderation.move = thread.acl.can_move\n moderation.merge = thread.acl.can_merge\n moderation.pinGlobally = thread.acl.can_pin_globally && thread.weight < 2\n moderation.pinLocally = thread.acl.can_pin && thread.weight !== 1\n moderation.unpin =\n (thread.acl.can_pin && thread.weight === 1) ||\n (thread.acl.can_pin_globally && thread.weight === 2)\n moderation.delete = thread.acl.can_delete\n\n moderation.enabled =\n moderation.edit ||\n moderation.approve ||\n moderation.close ||\n moderation.open ||\n moderation.hide ||\n moderation.unhide ||\n moderation.move ||\n moderation.merge ||\n moderation.pinGlobally ||\n moderation.pinLocally ||\n moderation.unpin ||\n moderation.delete\n\n return moderation\n}\n\nconst getPostsModeration = (posts, user) => {\n const moderation = {\n enabled: false,\n approve: false,\n move: false,\n merge: false,\n protect: false,\n hide: false,\n delete: false,\n }\n\n if (!user.is_authenticated) return moderation\n\n posts.forEach((post) => {\n if (!post.is_event) {\n if (post.acl.can_approve && post.is_unapproved) {\n moderation.approve = true\n }\n if (post.acl.can_move) moderation.move = true\n if (post.acl.can_merge) moderation.merge = true\n if (post.acl.can_protect || post.acl.can_unprotect) {\n moderation.protect = true\n }\n if (post.acl.can_hide || post.acl.can_unhide) {\n moderation.hide = true\n }\n if (post.acl.can_delete) moderation.delete = true\n\n if (\n moderation.approve ||\n moderation.move ||\n moderation.merge ||\n moderation.protect ||\n moderation.hide ||\n moderation.delete\n ) {\n moderation.enabled = true\n }\n }\n })\n\n return moderation\n}\n","import { connect } from \"react-redux\"\nimport Route from \"misago/components/thread/route\"\nimport misago from \"misago/index\"\n\nexport function select(store) {\n return {\n participants: store.participants,\n poll: store.poll,\n posts: store.posts,\n thread: store.thread,\n tick: store.tick.tick,\n user: store.auth.user,\n }\n}\n\nexport function paths() {\n const thread = misago.get(\"THREAD\")\n const basePath = thread.url.index.replace(\n thread.slug + \"-\" + thread.pk,\n \":slug\"\n )\n return [\n {\n path: basePath,\n component: connect(select)(Route),\n },\n {\n path: basePath + \":page/\",\n component: connect(select)(Route),\n },\n ]\n}\n","import { paths } from \"misago/components/thread/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"THREAD\") && context.has(\"POSTS\")) {\n mount({\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:thread\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { UserNavOverlay } from \"../../components/UserNav\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"user-nav-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:user-nav-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst UsersNav = ({ baseUrl, page, pages }) => (\n
    \n
    \n \n menu\n {page.name}\n \n
      \n {pages.map((page) => {\n const url = getPageUrl(baseUrl, page)\n return (\n
    • \n {page.name}\n
    • \n )\n })}\n
    \n
    \n
      \n {pages.map((page) => {\n const url = getPageUrl(baseUrl, page)\n return (\n
    • \n {page.name}\n
    • \n )\n })}\n
    \n
    \n)\n\nconst getPageUrl = (baseUrl, page) => {\n let url = baseUrl\n if (page.component === \"rank\") {\n url += page.slug\n } else {\n url += page.component\n }\n return url + \"/\"\n}\n\nexport default UsersNav\n","import React from \"react\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n getEmptyMessage() {\n return interpolate(\n npgettext(\n \"top posters empty\",\n \"No users have posted any new messages during last %(days)s day.\",\n \"No users have posted any new messages during last %(days)s days.\",\n this.props.trackedPeriod\n ),\n { days: this.props.trackedPeriod },\n true\n )\n }\n\n render() {\n return (\n
    \n \n \n

    {this.getEmptyMessage()}

    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n getClassName() {\n if (this.props.hiddenOnMobile) {\n return \"list-group-item hidden-xs hidden-sm\"\n } else {\n return \"list-group-item\"\n }\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n\n
    \n
    \n \n \n  \n \n \n
    \n\n
    \n \n  \n \n  \n \n \n \n \n  \n \n \n \n \n  \n \n \n
    \n
    \n \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Rank\")}\n \n \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Ranked posts\")}\n \n
    \n
    \n\n
    \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Rank\")}\n
    \n\n
    \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Ranked posts\")}\n
    \n\n
    \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Total posts\")}\n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ItemPreview from \"misago/components/users/active-posters/list-item-preview\"\nimport * as random from \"misago/utils/random\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n \n \n

    \n \n  \n \n

    \n\n
    \n
      \n {[0, 1, 2].map((i) => {\n return 0} key={i} />\n })}\n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Avatar from \"misago/components/avatar\"\nimport Status, { StatusIcon, StatusLabel } from \"misago/components/user-status\"\nimport misago from \"misago/index\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.rank.css_class) {\n return \"list-group-item list-group-rank-\" + this.props.rank.css_class\n } else {\n return \"list-group-item\"\n }\n }\n\n getUserStatus() {\n if (this.props.user.status) {\n return (\n \n \n \n \n )\n }\n\n return (\n \n  \n \n  \n \n \n )\n }\n\n getRankName() {\n if (!this.props.rank.is_tab) {\n return (\n {this.props.rank.name}\n )\n }\n\n let rankUrl = misago.get(\"USERS_LIST_URL\") + this.props.rank.slug + \"/\"\n return (\n \n {this.props.rank.name}\n \n )\n }\n\n getUserTitle() {\n if (!this.props.user.title) return null\n\n return (\n \n {this.props.user.title}\n \n )\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n\n
    \n \n
    \n {this.getUserStatus()}\n {this.getRankName()}\n {this.getUserTitle()}\n
    \n
    \n \n #{this.props.counter}\n {pgettext(\"top posters list item\", \"Rank\")}\n \n\n \n {this.props.user.meta.score}\n {pgettext(\"top posters list item\", \"Ranked posts\")}\n \n
    \n
    \n\n
    \n #{this.props.counter}\n {pgettext(\"top posters list item\", \"Rank\")}\n
    \n\n
    \n {this.props.user.meta.score}\n {pgettext(\"top posters list item\", \"Ranked posts\")}\n
    \n\n
    \n {this.props.user.posts}\n {pgettext(\"top posters list item\", \"Total posts\")}\n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ListItem from \"misago/components/users/active-posters/list-item\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n getLeadMessage() {\n let message = npgettext(\n \"top posters list\",\n \"%(posters)s top poster from last %(days)s days.\",\n \"%(posters)s top posters from last %(days)s days.\",\n this.props.count\n )\n\n return interpolate(\n message,\n {\n posters: this.props.count,\n days: this.props.trackedPeriod,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n \n \n

    {this.getLeadMessage()}

    \n\n
    \n
      \n {this.props.users.map((user, i) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/users/active-posters/list-empty\"\nimport ListPreview from \"misago/components/users/active-posters/list-preview\"\nimport ListReady from \"misago/components/users/active-posters/list-ready\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"USERS\")) {\n this.initWithPreloadedData(misago.pop(\"USERS\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling()\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n\n trackedPeriod: data.tracked_period,\n count: data.count,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling() {\n polls.start({\n poll: \"active-posters\",\n url: misago.get(\"USERS_API\"),\n data: {\n list: \"active\",\n },\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data.results))\n\n this.setState({\n isLoaded: true,\n\n trackedPeriod: data.tracked_period,\n count: data.count,\n })\n }\n\n componentDidMount() {\n title.set({\n title: this.props.route.extra.name,\n parent: pgettext(\"users page title\", \"Users\"),\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"active-posters\")\n }\n\n render() {\n const page = { name: this.props.route.extra.name }\n\n if (this.state.isLoaded) {\n if (this.state.count > 0) {\n return (\n \n )\n } else {\n return (\n \n )\n }\n } else {\n return \n }\n }\n}\n","import React from \"react\"\nimport stringCount from \"misago/utils/string-count\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.copy && this.props.copy.length) {\n if (\n stringCount(this.props.copy, \"\n )\n } else {\n return null\n }\n }\n}\n","export default function (string, subString) {\n string = (string + \"\").toLowerCase()\n subString = (subString + \"\").toLowerCase()\n\n if (subString.length <= 0) return 0\n\n let n = 0\n let pos = 0\n let step = subString.length\n\n while (true) {\n pos = string.indexOf(subString, pos)\n if (pos >= 0) {\n n += 1\n pos += step\n } else {\n break\n }\n }\n\n return n\n}\n","import React from \"react\"\nimport UsersList from \"../../users-list\"\n\nconst RankUsersList = ({ users }) => (\n \n)\n\nexport default RankUsersList\n","import React from \"react\"\nimport UsersList from \"misago/components/users-list\"\n\nclass RankUsersListLoader extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render = () => \n}\n\nexport default RankUsersListLoader\n","import React from \"react\"\n\nconst RankUsersLeft = ({ users }) => {\n if (users.more) {\n return (\n

    \n {interpolate(\n npgettext(\n \"rank users list\",\n \"There is %(more)s more user with this rank.\",\n \"There are %(more)s more users with this rank.\",\n users.more\n ),\n { more: users.more },\n true\n )}\n

    \n )\n }\n\n return (\n

    \n {pgettext(\n \"rank users list empty\",\n \"There are no more users with this rank.\"\n )}\n

    \n )\n}\n\nexport default RankUsersLeft\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst RankUsersPagination = ({ baseUrl, users }) => (\n
    \n {users.isLoaded && users.first ? (\n \n first_page\n \n ) : (\n \n first_page\n \n )}\n {users.isLoaded && users.previous ? (\n 1 ? users.previous + \"/\" : \"\")}\n title={pgettext(\"rank users list paginator\", \"Go to previous page\")}\n >\n chevron_left\n \n ) : (\n \n chevron_left\n \n )}\n {users.isLoaded && users.next ? (\n \n chevron_right\n \n ) : (\n \n chevron_right\n \n )}\n {users.isLoaded && users.last ? (\n \n last_page\n \n ) : (\n \n last_page\n \n )}\n
    \n)\n\nexport default RankUsersPagination\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\nimport RankUsersLeft from \"./RankUsersLeft\"\nimport RankUsersPagination from \"./RankUsersPagination\"\n\nconst RankUsersToolbar = ({ baseUrl, users }) => (\n \n \n \n \n \n \n \n \n \n \n \n \n)\n\nexport default RankUsersToolbar\n","import React from \"react\"\nimport PageLead from \"misago/components/page-lead\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport PageContainer from \"../../PageContainer\"\nimport RankUsersList from \"./RankUsersList\"\nimport RankUsersListLoader from \"./RankUsersListLoader\"\nimport RankUsersToolbar from \"./RankUsersToolbar\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"USERS\")) {\n this.initWithPreloadedData(misago.pop(\"USERS\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling(props.params.page || 1)\n }\n\n initWithPreloadedData(data) {\n this.state = Object.assign(data, {\n isLoaded: true,\n })\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling(page) {\n polls.start({\n poll: \"rank-users\",\n url: misago.get(\"USERS_API\"),\n data: {\n rank: this.props.route.rank.id,\n page: page,\n },\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data.results))\n\n data.isLoaded = true\n this.setState(data)\n }\n\n componentDidMount() {\n title.set({\n title: this.props.route.rank.name,\n page: this.props.params.page || null,\n parent: pgettext(\"users page title\", \"Users\"),\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"rank-users\")\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.params.page !== nextProps.params.page) {\n title.set({\n title: this.props.route.rank.name,\n page: nextProps.params.page || null,\n parent: pgettext(\"users page title\", \"Users\"),\n })\n\n this.setState({\n isLoaded: false,\n })\n\n polls.stop(\"rank-users\")\n this.startPolling(nextProps.params.page)\n }\n }\n\n getClassName() {\n if (this.props.route.rank.css_class) {\n return \"rank-users-list rank-users-\" + this.props.route.rank.css_class\n } else {\n return \"rank-users-list\"\n }\n }\n\n getRankDescription() {\n if (this.props.route.rank.description) {\n return (\n
    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getComponent() {\n if (this.state.isLoaded) {\n if (this.state.count > 0) {\n return \n } else {\n return (\n

    \n {pgettext(\n \"rank users list\",\n \"There are no users with this rank at the moment.\"\n )}\n

    \n )\n }\n } else {\n return \n }\n }\n\n render() {\n return (\n
    \n \n \n {this.getRankDescription()}\n {this.getComponent()}\n \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport ActivePosters from \"misago/components/users/active-posters/root\"\nimport Rank from \"misago/components/users/rank/root\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago/index\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nexport default class extends WithDropdown {\n render() {\n return (\n
    \n \n \n \n

    {pgettext(\"users page title\", \"Users\")}

    \n
    \n
    \n
    \n {this.props.children}\n
    \n )\n }\n}\n\nexport function select(store) {\n return {\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n }\n}\n\nexport function paths() {\n let paths = []\n\n misago.get(\"USERS_LISTS\").forEach(function (item) {\n if (item.component === \"rank\") {\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/:page/\",\n component: connect(select)(Rank),\n rank: item,\n })\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/\",\n component: connect(select)(Rank),\n rank: item,\n })\n } else if (item.component === \"active-posters\") {\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.component + \"/\",\n component: connect(select)(ActivePosters),\n extra: {\n name: item.name,\n },\n })\n }\n })\n\n return paths\n}\n","import Users, { paths } from \"misago/components/users/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"USERS_LISTS\")) {\n mount({\n root: misago.get(\"USERS_LIST_URL\"),\n component: Users,\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:users\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\n\nexport default function initializer(context) {\n include.init(context.get(\"STATIC_URL\"))\n}\n\nmisago.addInitializer({\n name: \"include\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n storage.init(\"misago_\")\n}\n\nmisago.addInitializer({\n name: \"local-storage\",\n initializer: initializer,\n})\n","import mount from \"misago/utils/mount-component\"\n\nexport class MobileNavbarDropdown {\n init(element) {\n this._element = element\n this._component = null\n }\n\n show(component) {\n if (this._component === component) {\n this.hide()\n } else {\n this._component = component\n mount(component, this._element.id)\n $(this._element).addClass(\"open\")\n }\n }\n\n showConnected(name, component) {\n if (this._component === name) {\n this.hide()\n } else {\n this._component = name\n mount(component, this._element.id, true)\n $(this._element).addClass(\"open\")\n }\n }\n\n hide() {\n $(this._element).removeClass(\"open\")\n this._component = null\n }\n}\n\nexport default new MobileNavbarDropdown()\n","import misago from \"misago/index\"\nimport dropdown from \"misago/services/mobile-navbar-dropdown\"\n\nexport default function initializer() {\n let element = document.getElementById(\"mobile-navbar-dropdown-mount\")\n if (element) {\n dropdown.init(element)\n }\n}\n\nmisago.addInitializer({\n name: \"dropdown\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport modal from \"misago/services/modal\"\n\nexport default function initializer() {\n let element = document.getElementById(\"modal-mount\")\n if (element) {\n modal.init(element)\n }\n}\n\nmisago.addInitializer({\n name: \"modal\",\n initializer: initializer,\n before: \"store\",\n})\n","import moment from \"moment\"\nimport misago from \"misago/index\"\n\nexport default function initializer() {\n moment.locale($(\"html\").attr(\"lang\"))\n}\n\nmisago.addInitializer({\n name: \"moment\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport title from \"misago/services/page-title\"\n\nexport default function initializer(context) {\n title.init(\n context.get(\"SETTINGS\").forum_index_title,\n context.get(\"SETTINGS\").forum_name\n )\n}\n\nmisago.addInitializer({\n name: \"page-title\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport polls from \"misago/services/polls\"\n\nexport default function initializer() {\n polls.init(ajax, snackbar)\n}\n\nmisago.addInitializer({\n name: \"polls\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer() {\n posting.init(ajax, snackbar, document.getElementById(\"posting-mount\"))\n}\n\nmisago.addInitializer({\n name: \"posting\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/auth\"\nimport store from \"misago/services/store\"\n\nexport default function initializer(context) {\n store.addReducer(\n \"auth\",\n reducer,\n Object.assign(\n {\n isAuthenticated: context.get(\"isAuthenticated\"),\n isAnonymous: !context.get(\"isAuthenticated\"),\n\n user: context.get(\"user\"),\n },\n initialState\n )\n )\n}\n\nmisago.addInitializer({\n name: \"reducer:auth\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"../../reducers/overlay\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n store.addReducer(\"overlay\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:overlay\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/participants\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\")) {\n initialState = misago.get(\"THREAD\").participants\n }\n\n store.addReducer(\"participants\", reducer, initialState || [])\n}\n\nmisago.addInitializer({\n name: \"reducer:participants\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/poll\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\") && misago.get(\"THREAD\").poll) {\n initialState = hydrate(misago.get(\"THREAD\").poll)\n } else {\n initialState = {}\n }\n\n store.addReducer(\"poll\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:poll\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"POSTS\")) {\n initialState = hydrate(misago.get(\"POSTS\"))\n } else {\n initialState = {\n isLoaded: false,\n isBusy: false,\n }\n }\n\n store.addReducer(\"posts\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:posts\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile-details\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"PROFILE_DETAILS\")) {\n initialState = misago.get(\"PROFILE_DETAILS\")\n }\n\n store.addReducer(\"profile-details\", reducer, initialState || {})\n}\n\nmisago.addInitializer({\n name: \"reducer:profile-details\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n if (misago.has(\"PROFILE\")) {\n store.dispatch(hydrate(misago.get(\"PROFILE\")))\n }\n}\n\nmisago.addInitializer({\n name: \"reducer:profile-hydrate\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"profile\", reducer, {})\n}\n\nmisago.addInitializer({\n name: \"reducer:profile\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago\"\nimport reducer, { initialState } from \"misago/reducers/search\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\n \"search\",\n reducer,\n Object.assign({}, initialState, {\n providers: misago.get(\"SEARCH_PROVIDERS\") || [],\n query: misago.get(\"SEARCH_QUERY\") || \"\",\n })\n )\n}\n\nmisago.addInitializer({\n name: \"reducer:search\",\n initializer: initializer,\n before: \"store\",\n})\n","export function push(array, value) {\n if (array.indexOf(value) === -1) {\n let copy = array.slice()\n copy.push(value)\n return copy\n } else {\n return array\n }\n}\n\nexport function remove(array, value) {\n if (array.indexOf(value) >= 0) {\n return array.filter(function (i) {\n return i !== value\n })\n } else {\n return array\n }\n}\n\nexport function toggle(array, value) {\n if (array.indexOf(value) === -1) {\n let copy = array.slice()\n copy.push(value)\n return copy\n } else {\n return array.filter(function (i) {\n return i !== value\n })\n }\n}\n","import { toggle } from \"misago/utils/sets\"\n\nexport const SELECT_ALL = \"SELECT_ALL\"\nexport const SELECT_NONE = \"SELECT_NONE\"\nexport const SELECT_ITEM = \"SELECT_ITEM\"\n\nexport function all(itemsIds) {\n return {\n type: SELECT_ALL,\n items: itemsIds,\n }\n}\n\nexport function none() {\n return {\n type: SELECT_NONE,\n }\n}\n\nexport function item(itemId) {\n return {\n type: SELECT_ITEM,\n item: itemId,\n }\n}\n\nexport default function selection(state = [], action = null) {\n switch (action.type) {\n case SELECT_ALL:\n return action.items\n\n case SELECT_NONE:\n return []\n\n case SELECT_ITEM:\n return toggle(state, action.item)\n\n default:\n return state\n }\n}\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/selection\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"selection\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:selection\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"snackbar\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:snackbar\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/thread\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\")) {\n initialState = hydrate(misago.get(\"THREAD\"))\n } else {\n initialState = {\n isBusy: false,\n }\n }\n\n store.addReducer(\"thread\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:thread\",\n initializer: initializer,\n before: \"store\",\n})\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_THREADS = \"APPEND_THREADS\"\nexport const DELETE_THREAD = \"DELETE_THREAD\"\nexport const FILTER_THREADS = \"FILTER_THREADS\"\nexport const HYDRATE_THREADS = \"HYDRATE_THREADS\"\nexport const PATCH_THREAD = \"PATCH_THREAD\"\nexport const SORT_THREADS = \"SORT_THREADS\"\n\nexport const MODERATION_PERMISSIONS = [\n \"can_announce\",\n \"can_approve\",\n \"can_close\",\n \"can_hide\",\n \"can_move\",\n \"can_merge\",\n \"can_pin\",\n \"can_review\",\n]\n\nexport function append(items, sorting) {\n return {\n type: APPEND_THREADS,\n items,\n sorting,\n }\n}\n\nexport function deleteThread(thread) {\n return {\n type: DELETE_THREAD,\n thread,\n }\n}\n\nexport function filterThreads(category, categoriesMap) {\n return {\n type: FILTER_THREADS,\n category,\n categoriesMap,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_THREADS,\n items,\n }\n}\n\nexport function patch(thread, patch, sorting = null) {\n return {\n type: PATCH_THREAD,\n thread,\n patch,\n sorting,\n }\n}\n\nexport function sort(sorting) {\n return {\n type: SORT_THREADS,\n sorting,\n }\n}\n\nexport function getThreadModerationOptions(thread_acl) {\n let options = []\n MODERATION_PERMISSIONS.forEach(function (perm) {\n if (thread_acl[perm]) {\n options.push(perm)\n }\n })\n return options\n}\n\nexport function hydrateThread(thread) {\n return Object.assign({}, thread, {\n moderation: getThreadModerationOptions(thread.acl),\n })\n}\n\nexport default function thread(state = [], action = null) {\n switch (action.type) {\n case APPEND_THREADS:\n const mergedState = concatUnique(action.items.map(hydrateThread), state)\n return mergedState.sort(action.sorting)\n\n case DELETE_THREAD:\n return state.filter(function (item) {\n return item.id !== action.thread.id\n })\n\n case FILTER_THREADS:\n return state.filter(function (item) {\n const itemCategory = action.categoriesMap[item.category]\n if (\n itemCategory.lft >= action.category.lft &&\n itemCategory.rght <= action.category.rght\n ) {\n // same or sub category\n return true\n } else if (item.weight == 2) {\n // globally pinned\n return true\n } else {\n // thread moved outside displayed scope, hide it\n return false\n }\n })\n\n case HYDRATE_THREADS:\n return action.items.map(hydrateThread)\n\n case PATCH_THREAD:\n const patchedState = state.map(function (item) {\n if (item.id === action.thread.id) {\n return Object.assign({}, item, action.patch)\n } else {\n return item\n }\n })\n\n if (action.sorting) {\n return patchedState.sort(action.sorting)\n }\n return patchedState\n\n case SORT_THREADS:\n return state.sort(action.sorting)\n\n default:\n return state\n }\n}\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/threads\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"threads\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:threads\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"tick\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:tick\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/username-history\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"username-history\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:username-history\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/users\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"users\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:users\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n snackbar.init(store)\n}\n\nmisago.addInitializer({\n name: \"snackbar\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.init()\n}\n\nmisago.addInitializer({\n name: \"store\",\n initializer: initializer,\n before: \"_end\",\n})\n","import misago from \"misago/index\"\nimport { doTick } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nconst TICK_PERIOD = 50 * 1000 //do the tick every 50s\n\nexport default function initializer() {\n window.setInterval(function () {\n store.dispatch(doTick())\n }, TICK_PERIOD)\n}\n\nmisago.addInitializer({\n name: \"tick-start\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\nimport zxcvbn from \"misago/services/zxcvbn\"\n\nexport default function initializer() {\n zxcvbn.init(include)\n}\n\nmisago.addInitializer({\n name: \"zxcvbn\",\n initializer: initializer,\n})\n","import { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\n\nexport var initialState = {\n signedIn: false,\n signedOut: false,\n}\n\nexport const UPDATE_AUTHENTICATED_USER = \"UPDATE_AUTHENTICATED_USER\"\nexport const PATCH_USER = \"PATCH_USER\"\nexport const SIGN_IN = \"SIGN_IN\"\nexport const SIGN_OUT = \"SIGN_OUT\"\n\nexport function updateAuthenticatedUser(data) {\n return {\n type: UPDATE_AUTHENTICATED_USER,\n data,\n }\n}\n\nexport function patch(patch) {\n return {\n type: PATCH_USER,\n patch,\n }\n}\n\nexport function signIn(user) {\n return {\n type: SIGN_IN,\n user,\n }\n}\n\nexport function signOut(soft = false) {\n return {\n type: SIGN_OUT,\n soft,\n }\n}\n\nexport default function auth(state = initialState, action = null) {\n switch (action.type) {\n case PATCH_USER:\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, action.patch)\n return newState\n\n case UPDATE_AUTHENTICATED_USER:\n let updatedState = Object.assign({}, state)\n updatedState.user = Object.assign({}, state.user, action.data)\n return updatedState\n\n case SIGN_IN:\n return Object.assign({}, state, {\n signedIn: action.user,\n })\n\n case SIGN_OUT:\n return Object.assign({}, state, {\n isAuthenticated: false,\n isAnonymous: true,\n signedOut: !action.soft,\n })\n\n case UPDATE_AVATAR:\n if (state.isAuthenticated && state.user.id === action.userId) {\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, {\n avatars: action.avatars,\n })\n return newState\n }\n return state\n\n case UPDATE_USERNAME:\n if (state.isAuthenticated && state.user.id === action.userId) {\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, {\n username: action.username,\n slug: action.slug,\n })\n return newState\n }\n return state\n\n default:\n return state\n }\n}\n","export const OPEN_SITE_NAV = \"OPEN_SITE_NAV\"\nexport const OPEN_SEARCH = \"OPEN_SEARCH\"\nexport const OPEN_NOTIFICATIONS = \"OPEN_NOTIFICATIONS\"\nexport const OPEN_PRIVATE_THREADS = \"OPEN_PRIVATE_THREADS\"\nexport const OPEN_USER_NAV = \"OPEN_USER_NAV\"\nexport const CLOSE = \"CLOSE_OVERLAYS\"\n\nexport function openSiteNav() {\n return { type: OPEN_SITE_NAV }\n}\n\nexport function openSearch() {\n return { type: OPEN_SEARCH }\n}\n\nexport function openNotifications() {\n return { type: OPEN_NOTIFICATIONS }\n}\n\nexport function openPrivateThreads() {\n return { type: OPEN_PRIVATE_THREADS }\n}\n\nexport function openUserNav() {\n return { type: OPEN_USER_NAV }\n}\n\nexport function close() {\n return { type: CLOSE }\n}\n\nexport const initialState = {\n siteNav: false,\n search: false,\n notifications: false,\n privateThreads: false,\n userNav: false,\n}\n\nexport default function notifications(state = initialState, action = null) {\n switch (action.type) {\n case OPEN_SITE_NAV:\n return Object.assign({}, state, initialState, { siteNav: true })\n\n case OPEN_SEARCH:\n return Object.assign({}, state, initialState, { search: true })\n\n case OPEN_NOTIFICATIONS:\n return Object.assign({}, state, initialState, { notifications: true })\n\n case OPEN_PRIVATE_THREADS:\n return Object.assign({}, state, initialState, { privateThreads: true })\n\n case OPEN_USER_NAV:\n return Object.assign({}, state, initialState, { userNav: true })\n\n case CLOSE:\n return Object.assign({}, state, initialState)\n\n default:\n return state\n }\n}\n","export const REPLACE_PARTICIPANTS = \"REPLACE_PARTICIPANTS\"\n\nexport function replace(newState) {\n return {\n type: REPLACE_PARTICIPANTS,\n state: newState,\n }\n}\n\nexport default function participants(state = [], action = null) {\n switch (action.type) {\n case REPLACE_PARTICIPANTS:\n return action.state\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\n\nexport const BUSY_POLL = \"BUSY_POLL\"\nexport const RELEASE_POLL = \"RELEASE_POLL\"\nexport const REMOVE_POLL = \"REMOVE_POLL\"\nexport const REPLACE_POLL = \"REPLACE_POLL\"\nexport const UPDATE_POLL = \"UPDATE_POLL\"\n\nexport function hydrate(json) {\n let hasSelectedChoices = false\n for (const i in json.choices) {\n const choice = json.choices[i]\n if (choice.selected) {\n hasSelectedChoices = true\n break\n }\n }\n\n return Object.assign({}, json, {\n posted_on: moment(json.posted_on),\n\n hasSelectedChoices,\n endsOn: json.length\n ? moment(json.posted_on).add(json.length, \"days\")\n : null,\n\n isBusy: false,\n })\n}\n\nexport function busy() {\n return {\n type: BUSY_POLL,\n }\n}\n\nexport function release() {\n return {\n type: RELEASE_POLL,\n }\n}\n\nexport function replace(newState, hydrated = false) {\n return {\n type: REPLACE_POLL,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function update(data) {\n return {\n type: UPDATE_POLL,\n data,\n }\n}\n\nexport function remove() {\n return {\n type: REMOVE_POLL,\n }\n}\n\nexport default function poll(state = {}, action = null) {\n switch (action.type) {\n case BUSY_POLL:\n return Object.assign({}, state, { isBusy: true })\n\n case RELEASE_POLL:\n return Object.assign({}, state, { isBusy: false })\n\n case REMOVE_POLL:\n return {\n isBusy: false,\n }\n\n case REPLACE_POLL:\n return action.state\n\n case UPDATE_POLL:\n return Object.assign({}, state, action.data)\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport { hydrateUser } from \"./users\"\n\nexport const PATCH_POST = \"PATCH_POST\"\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n posted_on: moment(json.posted_on),\n updated_on: moment(json.updated_on),\n hidden_on: moment(json.hidden_on),\n\n attachments: json.attachments\n ? json.attachments.map(hydrateAttachment)\n : null,\n poster: json.poster ? hydrateUser(json.poster) : null,\n\n isSelected: false,\n isBusy: false,\n isDeleted: false,\n })\n}\n\nexport function hydrateAttachment(json) {\n return Object.assign({}, json, {\n uploaded_on: moment(json.uploaded_on),\n })\n}\n\nexport function patch(post, patch) {\n return {\n type: PATCH_POST,\n post,\n patch,\n }\n}\n\nexport default function post(state = {}, action = null) {\n switch (action.type) {\n case PATCH_POST:\n if (state.id == action.post.id) {\n return Object.assign({}, state, action.patch)\n }\n return state\n\n default:\n return state\n }\n}\n","import postReducer, {\n PATCH_POST,\n hydrate as hydratePost,\n} from \"misago/reducers/post\"\n\nexport const APPEND_POSTS = \"APPEND_POSTS\"\nexport const SELECT_POST = \"SELECT_POST\"\nexport const DESELECT_POST = \"DESELECT_POST\"\nexport const DESELECT_POSTS = \"DESELECT_POSTS\"\nexport const LOAD_POSTS = \"LOAD_POSTS\"\nexport const UNLOAD_POSTS = \"UNLOAD_POSTS\"\nexport const UPDATE_POSTS = \"UPDATE_POSTS\"\n\nexport function select(post) {\n return {\n type: SELECT_POST,\n post,\n }\n}\n\nexport function deselect(post) {\n return {\n type: DESELECT_POST,\n post,\n }\n}\n\nexport function deselectAll() {\n return {\n type: DESELECT_POSTS,\n }\n}\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n results: json.results.map(hydratePost),\n isLoaded: true,\n isBusy: false,\n isSelected: false,\n })\n}\n\nexport function load(newState, hydrated = false) {\n return {\n type: LOAD_POSTS,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function append(newState, hydrated = false) {\n return {\n type: APPEND_POSTS,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function unload() {\n return {\n type: UNLOAD_POSTS,\n }\n}\n\nexport function update(newState) {\n return {\n type: UPDATE_POSTS,\n update: newState,\n }\n}\n\nexport default function posts(state = {}, action = null) {\n switch (action.type) {\n case SELECT_POST:\n const selectedPosts = state.results.map((post) => {\n if (post.id == action.post.id) {\n return Object.assign({}, post, {\n isSelected: true,\n })\n } else {\n return post\n }\n })\n\n return Object.assign({}, state, {\n results: selectedPosts,\n })\n\n case DESELECT_POST:\n const deseletedPosts = state.results.map((post) => {\n if (post.id == action.post.id) {\n return Object.assign({}, post, {\n isSelected: false,\n })\n } else {\n return post\n }\n })\n\n return Object.assign({}, state, {\n results: deseletedPosts,\n })\n\n case DESELECT_POSTS:\n const deseletedAllPosts = state.results.map((post) => {\n return Object.assign({}, post, {\n isSelected: false,\n })\n })\n\n return Object.assign({}, state, {\n results: deseletedAllPosts,\n })\n\n case APPEND_POSTS:\n let results = state.results.slice()\n const resultsIds = state.results.map((post) => {\n return post.id\n })\n\n action.state.results.map((post) => {\n if (resultsIds.indexOf(post.id) === -1) {\n results.push(post)\n }\n })\n\n return Object.assign({}, action.state, {\n results,\n })\n\n case LOAD_POSTS:\n return action.state\n\n case UNLOAD_POSTS:\n return Object.assign({}, state, {\n isLoaded: false,\n })\n\n case UPDATE_POSTS:\n return Object.assign({}, state, action.update)\n\n case PATCH_POST:\n const reducedPosts = state.results.map((post) => {\n return postReducer(post, action)\n })\n\n return Object.assign({}, state, {\n results: reducedPosts,\n })\n\n default:\n return state\n }\n}\n","export const LOAD_DETAILS = \"LOAD_DETAILS\"\n\nexport function load(newState) {\n return {\n type: LOAD_DETAILS,\n\n newState,\n }\n}\n\nexport default function details(state = {}, action = null) {\n switch (action.type) {\n case LOAD_DETAILS:\n return action.newState\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport {\n UPDATE_AVATAR,\n UPDATE_USERNAME,\n hydrateStatus,\n} from \"misago/reducers/users\"\n\nexport const HYDRATE_PROFILE = \"HYDRATE_PROFILE\"\nexport const PATCH_PROFILE = \"PATCH_PROFILE\"\n\nexport function hydrate(profile) {\n return {\n type: HYDRATE_PROFILE,\n profile,\n }\n}\n\nexport function patch(patch) {\n return {\n type: PATCH_PROFILE,\n patch,\n }\n}\n\nexport default function auth(state = {}, action = null) {\n switch (action.type) {\n case HYDRATE_PROFILE:\n return Object.assign({}, action.profile, {\n joined_on: moment(action.profile.joined_on),\n status: hydrateStatus(action.profile.status),\n })\n\n case PATCH_PROFILE:\n return Object.assign({}, state, action.patch)\n\n case UPDATE_AVATAR:\n if (state.id === action.userId) {\n return Object.assign({}, state, {\n avatars: action.avatars,\n })\n }\n return state\n\n case UPDATE_USERNAME:\n if (state.id === action.userId) {\n return Object.assign({}, state, {\n username: action.username,\n slug: action.slug,\n })\n }\n return state\n\n default:\n return state\n }\n}\n","export const REPLACE_SEARCH = \"REPLACE_SEARCH\"\nexport const UPDATE_SEARCH = \"UPDATE_SEARCH\"\nexport const UPDATE_SEARCH_PROVIDER = \"UPDATE_SEARCH_PROVIDER\"\n\nexport const initialState = {\n isLoading: false,\n query: \"\",\n providers: [],\n}\n\nexport function replace(newState) {\n return {\n type: REPLACE_SEARCH,\n state: {\n isLoading: false,\n providers: newState,\n },\n }\n}\n\nexport function update(newState) {\n return {\n type: UPDATE_SEARCH,\n update: newState,\n }\n}\n\nexport function updateProvider(provider) {\n return {\n type: UPDATE_SEARCH_PROVIDER,\n provider: provider,\n }\n}\n\nexport default function participants(state = {}, action = null) {\n switch (action.type) {\n case REPLACE_SEARCH:\n return action.state\n\n case UPDATE_SEARCH:\n return Object.assign({}, state, action.update)\n\n case UPDATE_SEARCH_PROVIDER:\n return Object.assign({}, state, {\n providers: state.providers.map((provider) => {\n if (provider.id === action.provider.id) {\n return action.provider\n } else {\n return provider\n }\n }),\n })\n\n default:\n return state\n }\n}\n","export var initialState = {\n type: \"info\",\n message: \"\",\n isVisible: false,\n}\n\nexport const SHOW_SNACKBAR = \"SHOW_SNACKBAR\"\nexport const HIDE_SNACKBAR = \"HIDE_SNACKBAR\"\n\nexport function showSnackbar(message, type) {\n return {\n type: SHOW_SNACKBAR,\n message,\n messageType: type,\n }\n}\n\nexport function hideSnackbar() {\n return {\n type: HIDE_SNACKBAR,\n }\n}\n\nexport default function snackbar(state = initialState, action = null) {\n if (action.type === SHOW_SNACKBAR) {\n return {\n type: action.messageType,\n message: action.message,\n isVisible: true,\n }\n } else if (action.type === HIDE_SNACKBAR) {\n return Object.assign({}, state, {\n isVisible: false,\n })\n } else {\n return state\n }\n}\n","import moment from \"moment\"\nimport { REMOVE_POLL, REPLACE_POLL } from \"./poll\"\n\nexport const BUSY_THREAD = \"BUSY_THREAD\"\nexport const RELEASE_THREAD = \"RELEASE_THREAD\"\nexport const REPLACE_THREAD = \"REPLACE_THREAD\"\nexport const UPDATE_THREAD = \"UPDATE_THREAD\"\nexport const UPDATE_THREAD_ACL = \"UPDATE_THREAD_ACL\"\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n started_on: moment(json.started_on),\n last_post_on: moment(json.last_post_on),\n best_answer_marked_on: json.best_answer_marked_on\n ? moment(json.best_answer_marked_on)\n : null,\n\n isBusy: false,\n })\n}\n\nexport function busy() {\n return {\n type: BUSY_THREAD,\n }\n}\n\nexport function release() {\n return {\n type: RELEASE_THREAD,\n }\n}\n\nexport function replace(newState, hydrated = false) {\n return {\n type: REPLACE_THREAD,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function update(data) {\n return {\n type: UPDATE_THREAD,\n data,\n }\n}\n\nexport function updateAcl(data) {\n return {\n type: UPDATE_THREAD_ACL,\n data,\n }\n}\n\nexport default function thread(state = {}, action = null) {\n switch (action.type) {\n case BUSY_THREAD:\n return Object.assign({}, state, { isBusy: true })\n\n case RELEASE_THREAD:\n return Object.assign({}, state, { isBusy: false })\n\n case REMOVE_POLL:\n return Object.assign({}, state, { poll: null })\n\n case REPLACE_POLL:\n return Object.assign({}, state, { poll: action.state })\n\n case REPLACE_THREAD:\n return action.state\n\n case UPDATE_THREAD:\n return Object.assign({}, state, action.data)\n\n case UPDATE_THREAD_ACL:\n const acl = Object.assign({}, state.acl, action.data)\n return Object.assign({}, state, { acl })\n\n default:\n return state\n }\n}\n","export var initialState = {\n tick: 0,\n}\n\nexport const TICK = \"TICK\"\n\nexport function doTick() {\n return {\n type: TICK,\n }\n}\n\nexport default function tick(state = initialState, action = null) {\n if (action.type === TICK) {\n return Object.assign({}, state, {\n tick: state.tick + 1,\n })\n } else {\n return state\n }\n}\n","import moment from \"moment\"\nimport { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const ADD_NAME_CHANGE = \"ADD_NAME_CHANGE\"\nexport const APPEND_HISTORY = \"APPEND_HISTORY\"\nexport const HYDRATE_HISTORY = \"HYDRATE_HISTORY\"\n\nexport function addNameChange(change, user, changedBy) {\n return {\n type: ADD_NAME_CHANGE,\n change,\n user,\n changedBy,\n }\n}\n\nexport function append(items) {\n return {\n type: APPEND_HISTORY,\n items: items,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_HISTORY,\n items: items,\n }\n}\n\nexport function hydrateNamechange(namechange) {\n return Object.assign({}, namechange, {\n changed_on: moment(namechange.changed_on),\n })\n}\n\nexport default function username(state = [], action = null) {\n switch (action.type) {\n case ADD_NAME_CHANGE:\n let newState = state.slice()\n newState.unshift({\n id: Math.floor(Date.now() / 1000), // just small hax for getting id\n changed_by: action.changedBy,\n changed_by_username: action.changedBy.username,\n changed_on: moment(),\n new_username: action.change.username,\n old_username: action.user.username,\n })\n return newState\n\n case APPEND_HISTORY:\n return concatUnique(state, action.items.map(hydrateNamechange))\n\n case HYDRATE_HISTORY:\n return action.items.map(hydrateNamechange)\n\n case UPDATE_AVATAR:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.changed_by && item.changed_by.id === action.userId) {\n item.changed_by = Object.assign({}, item.changed_by, {\n avatars: action.avatars,\n })\n }\n\n return item\n })\n\n case UPDATE_USERNAME:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.changed_by && item.changed_by.id === action.userId) {\n item.changed_by = Object.assign({}, item.changed_by, {\n username: action.username,\n slug: action.slug,\n })\n }\n\n return Object.assign({}, item)\n })\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_USERS = \"APPEND_USERS\"\nexport const HYDRATE_USERS = \"HYDRATE_USERS\"\nexport const UPDATE_AVATAR = \"UPDATE_AVATAR\"\nexport const UPDATE_USERNAME = \"UPDATE_USERNAME\"\n\nexport function append(items) {\n return {\n type: APPEND_USERS,\n items,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_USERS,\n items,\n }\n}\n\nexport function hydrateStatus(status) {\n if (status) {\n return Object.assign({}, status, {\n last_click: status.last_click ? moment(status.last_click) : null,\n banned_until: status.banned_until ? moment(status.banned_until) : null,\n })\n } else {\n return null\n }\n}\n\nexport function hydrateUser(user) {\n return Object.assign({}, user, {\n joined_on: moment(user.joined_on),\n status: hydrateStatus(user.status),\n })\n}\n\nexport function updateAvatar(user, avatars) {\n return {\n type: UPDATE_AVATAR,\n userId: user.id,\n avatars,\n }\n}\n\nexport function updateUsername(user, username, slug) {\n return {\n type: UPDATE_USERNAME,\n userId: user.id,\n username,\n slug,\n }\n}\n\nexport default function user(state = [], action = null) {\n switch (action.type) {\n case APPEND_USERS:\n return concatUnique(state, action.items.map(hydrateUser))\n\n case HYDRATE_USERS:\n return action.items.map(hydrateUser)\n\n case UPDATE_AVATAR:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.id === action.userId) {\n item.avatars = action.avatars\n }\n\n return item\n })\n\n default:\n return state\n }\n}\n","export class Ajax {\n constructor() {\n this._cookieName = null\n this._csrfToken = null\n this._locks = {}\n }\n\n init(cookieName) {\n this._cookieName = cookieName\n }\n\n getCsrfToken() {\n if (document.cookie.indexOf(this._cookieName) !== -1) {\n let cookieRegex = new RegExp(this._cookieName + \"=([^;]*)\")\n let cookie = document.cookie.match(cookieRegex)[0]\n return cookie ? cookie.split(\"=\")[1] : null\n } else {\n return null\n }\n }\n\n request(method, url, data) {\n let self = this\n return new Promise(function (resolve, reject) {\n let xhr = {\n url: url,\n method: method,\n headers: {\n \"X-CSRFToken\": self.getCsrfToken(),\n },\n\n data: data ? JSON.stringify(data) : null,\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n\n success: function (data) {\n resolve(data)\n },\n\n error: function (jqXHR) {\n let rejection = jqXHR.responseJSON || {}\n\n rejection.status = jqXHR.status\n\n if (rejection.status === 0) {\n rejection.detail = pgettext(\n \"ajax client error\",\n \"Could not connect to the site.\"\n )\n }\n\n if (rejection.status === 404) {\n if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n rejection.detail = pgettext(\n \"ajax client error\",\n \"Action link is invalid.\"\n )\n }\n }\n\n if (rejection.status === 500 && !rejection.detail) {\n rejection.detail = pgettext(\n \"ajax client error\",\n \"Unknown error has occurred.\"\n )\n }\n\n rejection.statusText = jqXHR.statusText\n\n reject(rejection)\n },\n }\n\n $.ajax(xhr)\n })\n }\n\n get(url, params, lock) {\n if (params) {\n url += \"?\" + $.param(params)\n }\n\n if (lock) {\n let self = this\n\n // update url in existing lock?\n if (this._locks[lock]) {\n this._locks[lock].url = url\n }\n\n // immediately dereference promise handlers without doing anything\n // we are already waiting for existing response to resolve\n if (this._locks[lock] && this._locks[lock].waiter) {\n return {\n then: function () {\n return\n },\n }\n\n // return promise that will begin when original one resolves\n } else if (this._locks[lock] && this._locks[lock].wait) {\n this._locks[lock].waiter = true\n\n return new Promise(function (resolve, reject) {\n let wait = function (url) {\n // keep waiting on promise\n if (self._locks[lock].wait) {\n window.setTimeout(function () {\n wait(url)\n }, 300)\n\n // poll for new url\n } else if (self._locks[lock].url !== url) {\n wait(self._locks[lock].url)\n\n // ajax backend for response\n } else {\n self._locks[lock].waiter = false\n self.request(\"GET\", self._locks[lock].url).then(\n function (data) {\n if (self._locks[lock].url === url) {\n resolve(data)\n } else {\n self._locks[lock].waiter = true\n wait(self._locks[lock].url)\n }\n },\n function (rejection) {\n if (self._locks[lock].url === url) {\n reject(rejection)\n } else {\n self._locks[lock].waiter = true\n wait(self._locks[lock].url)\n }\n }\n )\n }\n }\n\n window.setTimeout(function () {\n wait(url)\n }, 300)\n })\n\n // setup new lock without waiter\n } else {\n this._locks[lock] = {\n url,\n wait: true,\n waiter: false,\n }\n\n return new Promise(function (resolve, reject) {\n self.request(\"GET\", url).then(\n function (data) {\n self._locks[lock].wait = false\n if (self._locks[lock].url === url) {\n resolve(data)\n }\n },\n function (rejection) {\n self._locks[lock].wait = false\n if (self._locks[lock].url === url) {\n reject(rejection)\n }\n }\n )\n })\n }\n } else {\n return this.request(\"GET\", url)\n }\n }\n\n post(url, data) {\n return this.request(\"POST\", url, data)\n }\n\n patch(url, data) {\n return this.request(\"PATCH\", url, data)\n }\n\n put(url, data) {\n return this.request(\"PUT\", url, data)\n }\n\n delete(url, data) {\n return this.request(\"DELETE\", url, data)\n }\n\n upload(url, data, progress) {\n let self = this\n return new Promise(function (resolve, reject) {\n let xhr = {\n url: url,\n method: \"POST\",\n headers: {\n \"X-CSRFToken\": self.getCsrfToken(),\n },\n\n data: data,\n contentType: false,\n processData: false,\n\n xhr: function () {\n let xhr = new window.XMLHttpRequest()\n xhr.upload.addEventListener(\n \"progress\",\n function (evt) {\n if (evt.lengthComputable) {\n progress(Math.round((evt.loaded / evt.total) * 100))\n }\n },\n false\n )\n return xhr\n },\n\n success: function (response) {\n resolve(response)\n },\n\n error: function (jqXHR) {\n let rejection = jqXHR.responseJSON || {}\n\n rejection.status = jqXHR.status\n\n if (rejection.status === 0) {\n rejection.detail = pgettext(\n \"api error\",\n \"Could not connect to the site.\"\n )\n }\n\n if (rejection.status === 413 && !rejection.detail) {\n rejection.detail = pgettext(\n \"api error\",\n \"Upload was rejected by the site as too large.\"\n )\n }\n\n if (rejection.status === 404) {\n if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n rejection.detail = pgettext(\n \"api error\",\n \"Action link is invalid.\"\n )\n }\n }\n\n if (rejection.status === 500 && !rejection.detail) {\n rejection.detail = pgettext(\n \"api error\",\n \"Unknown error has occurred.\"\n )\n }\n\n rejection.statusText = jqXHR.statusText\n\n reject(rejection)\n },\n }\n\n $.ajax(xhr)\n })\n }\n}\n\nexport default new Ajax()\n","import { signIn, signOut } from \"misago/reducers/auth\"\n\nexport class Auth {\n init(store, local, modal) {\n this._store = store\n this._local = local\n this._modal = modal\n\n // tell other tabs what auth state is because we are most current with it\n this.syncSession()\n\n // listen for other tabs to tell us that state changed\n this.watchState()\n }\n\n syncSession() {\n const state = this._store.getState().auth\n if (state.isAuthenticated) {\n this._local.set(\"auth\", {\n isAuthenticated: true,\n username: state.user.username,\n })\n } else {\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n }\n }\n\n watchState() {\n const state = this._store.getState().auth\n this._local.watch(\"auth\", (newState) => {\n if (newState.isAuthenticated) {\n this._store.dispatch(\n signIn({\n username: newState.username,\n })\n )\n } else if (state.isAuthenticated) {\n // check if we are authenticated in this tab\n // because some browser plugins prune local store\n // aggressively, forcing erroneous message to display here\n // tracking bug #955\n this._store.dispatch(signOut())\n }\n })\n this._modal.hide()\n }\n\n signIn(user) {\n this._store.dispatch(signIn(user))\n this._local.set(\"auth\", {\n isAuthenticated: true,\n username: user.username,\n })\n this._modal.hide()\n }\n\n signOut() {\n this._store.dispatch(signOut())\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n this._modal.hide()\n }\n\n softSignOut() {\n this._store.dispatch(signOut(true))\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n this._modal.hide()\n }\n}\n\nexport default new Auth()\n","/* global grecaptcha */\nimport React from \"react\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport class BaseCaptcha {\n init(context, ajax, include, snackbar) {\n this._context = context\n this._ajax = ajax\n this._include = include\n this._snackbar = snackbar\n }\n}\n\nexport class NoCaptcha extends BaseCaptcha {\n load() {\n return new Promise(function (resolve) {\n // immediately resolve as we don't have anything to validate\n resolve()\n })\n }\n\n validator() {\n return null\n }\n\n component() {\n return null\n }\n}\n\nexport class QACaptcha extends BaseCaptcha {\n load() {\n var self = this\n return new Promise((resolve, reject) => {\n self._ajax.get(self._context.get(\"CAPTCHA_API\")).then(\n function (data) {\n self.question = data.question\n self.helpText = data.help_text\n resolve()\n },\n function () {\n self._snackbar.error(\n pgettext(\"captcha field\", \"Failed to load CAPTCHA.\")\n )\n reject()\n }\n )\n })\n }\n\n validator() {\n return []\n }\n\n component(kwargs) {\n return (\n \n \n \n )\n }\n}\n\nexport class ReCaptchaComponent extends React.Component {\n componentDidMount() {\n grecaptcha.render(\"recaptcha\", {\n sitekey: this.props.siteKey,\n callback: (response) => {\n // fire fakey event to binding\n this.props.binding({\n target: {\n value: response,\n },\n })\n },\n })\n }\n\n render() {\n return
    \n }\n}\n\nexport class ReCaptcha extends BaseCaptcha {\n load() {\n this._include.include(\"https://www.google.com/recaptcha/api.js\", true)\n\n return new Promise(function (resolve) {\n var wait = function () {\n if (typeof grecaptcha === \"undefined\") {\n window.setTimeout(function () {\n wait()\n }, 200)\n } else {\n resolve()\n }\n }\n wait()\n })\n }\n\n validator() {\n return []\n }\n\n component(kwargs) {\n return (\n \n \n \n )\n }\n}\n\nexport class Captcha {\n init(context, ajax, include, snackbar) {\n switch (context.get(\"SETTINGS\").captcha_type) {\n case \"no\":\n this._captcha = new NoCaptcha()\n break\n\n case \"qa\":\n this._captcha = new QACaptcha()\n break\n\n case \"re\":\n this._captcha = new ReCaptcha()\n break\n }\n\n this._captcha.init(context, ajax, include, snackbar)\n }\n\n // accessors for underlying strategy\n\n load() {\n return this._captcha.load()\n }\n\n validator() {\n return this._captcha.validator()\n }\n\n component(kwargs) {\n return this._captcha.component(kwargs)\n }\n}\n\nexport default new Captcha()\n","export class Include {\n init(staticUrl) {\n this._staticUrl = staticUrl\n this._included = []\n }\n\n include(script, remote = false) {\n if (this._included.indexOf(script) === -1) {\n this._included.push(script)\n this._include(script, remote)\n }\n }\n\n _include(script, remote) {\n $.ajax({\n url: (!remote ? this._staticUrl : \"\") + script,\n cache: true,\n dataType: \"script\",\n })\n }\n}\n\nexport default new Include()\n","let storage = window.localStorage\n\nexport class LocalStorage {\n init(prefix) {\n this._prefix = prefix\n this._watchers = []\n\n window.addEventListener(\"storage\", (e) => {\n let newValueJson = JSON.parse(e.newValue)\n this._watchers.forEach(function (watcher) {\n if (watcher.key === e.key && e.oldValue !== e.newValue) {\n watcher.callback(newValueJson)\n }\n })\n })\n }\n\n set(key, value) {\n storage.setItem(this._prefix + key, JSON.stringify(value))\n }\n\n get(key) {\n let itemString = storage.getItem(this._prefix + key)\n if (itemString) {\n return JSON.parse(itemString)\n } else {\n return null\n }\n }\n\n watch(key, callback) {\n this._watchers.push({\n key: this._prefix + key,\n callback: callback,\n })\n }\n}\n\nexport default new LocalStorage()\n","import ReactDOM from \"react-dom\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Modal {\n init(element) {\n this._element = element\n\n this._modal = $(element).modal({ show: false })\n\n this._modal.on(\"hidden.bs.modal\", () => {\n ReactDOM.unmountComponentAtNode(this._element)\n })\n }\n\n show(component) {\n mount(component, this._element.id)\n this._modal.modal(\"show\")\n }\n\n hide() {\n this._modal.modal(\"hide\")\n }\n}\n\nexport default new Modal()\n","export class PageTitle {\n init(indexTitle, forumName) {\n this._indexTitle = indexTitle\n this._forumName = forumName\n }\n\n set(title) {\n if (!title) {\n document.title = this._indexTitle || this._forumName\n return\n }\n\n if (typeof title === \"string\") {\n title = { title: title }\n }\n\n let finalTitle = title.title\n\n if (title.page > 1) {\n const pageLabel = interpolate(\n pgettext(\"page title pagination\", \"page: %(page)s\"),\n {\n page: title.page,\n },\n true\n )\n\n finalTitle += \" (\" + pageLabel + \")\"\n }\n\n if (title.parent) {\n finalTitle += \" | \" + title.parent\n }\n\n document.title = finalTitle + \" | \" + this._forumName\n }\n}\n\nexport default new PageTitle()\n","export class Polls {\n init(ajax, snackbar) {\n this._ajax = ajax\n this._snackbar = snackbar\n\n this._polls = {}\n }\n\n start(kwargs) {\n this.stop(kwargs.poll)\n\n const poolServer = () => {\n this._polls[kwargs.poll] = kwargs\n\n this._ajax.get(kwargs.url, kwargs.data || null).then(\n (data) => {\n if (!this._polls[kwargs.poll]._stopped) {\n kwargs.update(data)\n\n this._polls[kwargs.poll].timeout = window.setTimeout(\n poolServer,\n kwargs.frequency\n )\n }\n },\n (rejection) => {\n if (!this._polls[kwargs.poll]._stopped) {\n if (kwargs.error) {\n kwargs.error(rejection)\n } else {\n this._snackbar.apiError(rejection)\n }\n }\n }\n )\n }\n\n if (kwargs.delayed) {\n this._polls[kwargs.poll] = {\n timeout: window.setTimeout(poolServer, kwargs.frequency),\n }\n } else {\n poolServer()\n }\n }\n\n stop(pollId) {\n if (this._polls[pollId]) {\n window.clearTimeout(this._polls[pollId].timeout)\n this._polls[pollId]._stopped = true\n }\n }\n}\n\nexport default new Polls()\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport PostingComponent from \"misago/components/posting\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Posting {\n init(ajax, snackbar, mount) {\n this._ajax = ajax\n this._snackbar = snackbar\n this._mount = mount\n\n this._mode = null\n this._spacer = document.getElementById(\"posting-spacer\")\n this._observer = new ResizeObserver((entries) => {\n this._spacer.style.height = entries[0].contentRect.height + \"px\"\n })\n\n this._isOpen = false\n this._isClosing = false\n\n this._beforeunloadSet = false\n this._props = null\n }\n\n isOpen() {\n return this._isOpen\n }\n\n setBeforeUnload() {\n if (!this._beforeunloadSet) {\n window.addEventListener(\"beforeunload\", this.beforeUnload, {\n capture: true,\n })\n this._beforeunloadSet = true\n }\n }\n\n unsetBeforeUnload() {\n window.removeEventListener(\"beforeunload\", this.beforeUnload, {\n capture: true,\n })\n this._beforeunloadSet = false\n }\n\n beforeUnload(event) {\n event.returnValue = \"true\"\n return \"true\"\n }\n\n open(props) {\n if (this._isOpen === false) {\n if (props.mode === \"QUOTE\") {\n this._mode = \"REPLY\"\n } else {\n this._mode = props.mode\n }\n\n this._isOpen = props.submit\n this._realOpen(Object.assign({}, props, { mode: this._mode }))\n } else if (props.mode === \"QUOTE\") {\n this._realOpen(\n Object.assign({}, this._props, {\n config: props.config,\n context: props.context,\n })\n )\n } else if (this._isOpen !== props.submit) {\n let message = gettext(\n \"You are already working on other message. Do you want to discard it?\"\n )\n\n const changeForm = window.confirm(message)\n if (changeForm) {\n this._mode = props.mode\n this._isOpen = props.submit\n this._realOpen(props)\n }\n } else if (this._mode == \"REPLY\" && props.mode == \"REPLY\") {\n this._realOpen(props)\n }\n }\n\n _realOpen(props) {\n mount(, this._mount.id)\n\n this._props = props\n this._mount.classList.add(\"show\")\n this._observer.observe(this._mount)\n this.setBeforeUnload()\n }\n\n close = () => {\n this.unsetBeforeUnload()\n this._props = null\n\n if (this._isOpen && !this._isClosing) {\n this._isClosing = true\n this._mount.classList.remove(\"show\")\n\n window.setTimeout(() => {\n ReactDOM.unmountComponentAtNode(this._mount)\n this._observer.unobserve(this._mount)\n this._spacer.style.height = \"0px;\"\n this._isClosing = false\n this._isOpen = false\n this._mode = null\n }, 300)\n }\n }\n}\n\nexport default new Posting()\n","import { showSnackbar, hideSnackbar } from \"misago/reducers/snackbar\"\n\nconst HIDE_ANIMATION_LENGTH = 300\nconst MESSAGE_SHOW_LENGTH = 5000\n\nexport class Snackbar {\n init(store) {\n this._store = store\n this._timeout = null\n }\n\n alert = (message, type) => {\n if (this._timeout) {\n window.clearTimeout(this._timeout)\n this._store.dispatch(hideSnackbar())\n\n this._timeout = window.setTimeout(() => {\n this._timeout = null\n this.alert(message, type)\n }, HIDE_ANIMATION_LENGTH)\n } else {\n this._store.dispatch(showSnackbar(message, type))\n this._timeout = window.setTimeout(() => {\n this._store.dispatch(hideSnackbar())\n this._timeout = null\n }, MESSAGE_SHOW_LENGTH)\n }\n }\n\n // shorthands for message types\n\n info = (message) => {\n this.alert(message, \"info\")\n }\n\n success = (message) => {\n this.alert(message, \"success\")\n }\n\n warning = (message) => {\n this.alert(message, \"warning\")\n }\n\n error = (message) => {\n this.alert(message, \"error\")\n }\n\n // shorthand for api errors\n\n apiError = (rejection) => {\n let message = rejection.data ? rejection.data.detail : rejection.detail\n\n if (!message) {\n if (rejection.status === 0) {\n message = pgettext(\"api error\", \"Could not connect to the site.\")\n } else if (rejection.status === 404) {\n message = pgettext(\"api error\", \"Action link is invalid.\")\n } else {\n message = pgettext(\"api error\", \"Unknown error has occurred.\")\n }\n }\n\n if (rejection.status === 403 && message === \"Permission denied\") {\n message = pgettext(\n \"api error\",\n \"You don't have permission to perform this action.\"\n )\n }\n\n this.error(message)\n }\n}\n\nexport default new Snackbar()\n","import { combineReducers, createStore } from \"redux\"\n\nexport class StoreWrapper {\n constructor() {\n this._store = null\n this._reducers = {}\n this._initialState = {}\n }\n\n addReducer(name, reducer, initialState) {\n this._reducers[name] = reducer\n this._initialState[name] = initialState\n }\n\n init() {\n this._store = createStore(\n combineReducers(this._reducers),\n this._initialState\n )\n }\n\n getStore() {\n return this._store\n }\n\n // Store API\n\n getState() {\n return this._store.getState()\n }\n\n dispatch(action) {\n return this._store.dispatch(action)\n }\n}\n\nexport default new StoreWrapper()\n","/* global zxcvbn */\nexport class Zxcvbn {\n init(include) {\n this._include = include\n this._isLoaded = false\n }\n\n scorePassword(password, inputs) {\n // 0-4 score, the more the stronger password\n if (this._isLoaded) {\n return zxcvbn(password, inputs).score\n }\n\n return 0\n }\n\n load() {\n if (!this._isLoaded) {\n this._include.include(\"misago/js/zxcvbn.js\")\n return this._loadingPromise()\n } else {\n return this._loadedPromise()\n }\n }\n\n _loadingPromise() {\n const self = this\n\n return new Promise(function (resolve, reject) {\n var wait = function (tries = 0) {\n tries += 1\n if (tries > 200) {\n reject()\n } else if (typeof zxcvbn === \"undefined\") {\n window.setTimeout(function () {\n wait(tries)\n }, 200)\n } else {\n self._isLoaded = true\n resolve()\n }\n }\n wait()\n })\n }\n\n _loadedPromise() {\n // we have already loaded zxcvbn.js, resolve away!\n return new Promise(function (resolve) {\n resolve()\n })\n }\n}\n\nexport default new Zxcvbn()\n","import moment from \"moment\"\nimport React from \"react\"\n\nexport default class extends React.Component {\n getReasonMessage() {\n if (this.props.message.html) {\n return (\n \n )\n } else {\n return

    {this.props.message.plain}

    \n }\n }\n\n getExpirationMessage() {\n if (this.props.expires) {\n if (this.props.expires.isAfter(moment())) {\n let title = interpolate(\n pgettext(\"banned page\", \"This ban expires on %(expires_on)s.\"),\n {\n expires_on: this.props.expires.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n pgettext(\"banned page\", \"This ban expires %(expires_on)s.\"),\n {\n expires_on: this.props.expires.fromNow(),\n },\n true\n )\n\n return {message}\n } else {\n return pgettext(\"banned page\", \"This ban has expired.\")\n }\n } else {\n return pgettext(\"banned page\", \"This ban is permanent.\")\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n highlight_off\n
    \n
    \n {this.getReasonMessage()}\n

    {this.getExpirationMessage()}

    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider, connect } from \"react-redux\"\nimport BannedPage from \"misago/components/banned-page\"\nimport misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nlet select = function (state) {\n return state.tick\n}\n\nlet RedrawedBannedPage = connect(select)(BannedPage)\n\nexport default function (ban, changeState) {\n ReactDOM.render(\n \n \n ,\n\n document.getElementById(\"page-mount\")\n )\n\n if (typeof changeState === \"undefined\" || changeState) {\n let forumName = misago.get(\"SETTINGS\").forum_name\n document.title =\n pgettext(\"banned error title\", \"You are banned\") + \" | \" + forumName\n window.history.pushState({}, \"\", misago.get(\"BANNED_URL\"))\n }\n}\n","export default function (list, rowWidth, padding = false) {\n let rows = []\n let row = []\n\n list.forEach(function (element) {\n row.push(element)\n if (row.length === rowWidth) {\n rows.push(row)\n row = []\n }\n })\n\n // pad row to required length?\n if (padding !== false && row.length > 0 && row.length < rowWidth) {\n for (let i = row.length; i < rowWidth; i++) {\n row.push(padding)\n }\n }\n\n if (row.length) {\n rows.push(row)\n }\n\n return rows\n}\n","export default function (a, b) {\n let ids = []\n return a.concat(b).filter(function (item) {\n if (ids.indexOf(item.id) === -1) {\n ids.push(item.id)\n return true\n } else {\n return false\n }\n })\n}\n","const map = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n}\n\nexport default function (text) {\n return text.replace(/[&<>\"']/g, function (m) {\n return map[m]\n })\n}\n","export default function (bytes) {\n if (bytes > 1024 * 1024 * 1024) {\n return roundSize(bytes / (1024 * 1024 * 1024)) + \" GB\"\n } else if (bytes > 1024 * 1024) {\n return roundSize(bytes / (1024 * 1024)) + \" MB\"\n } else if (bytes > 1024) {\n return roundSize(bytes / 1024) + \" KB\"\n } else {\n return roundSize(bytes) + \" B\"\n }\n}\n\nexport function roundSize(value) {\n return value.toFixed(1)\n}\n","export const ALPHA = \"12345678990abcdefghijklmnopqrstuvwxyz\"\nexport const ALPHA_LEN = ALPHA.length\n\nexport default function getRandomString(len) {\n const chars = []\n for (let i = 0; i < len; i++) {\n const index = Math.floor(Math.random() * ALPHA_LEN)\n chars.push(ALPHA[index])\n }\n return chars.join(\"\")\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport store from \"misago/services/store\"\n\nexport default function (Component, rootElementId, connected = true) {\n let rootElement = document.getElementById(rootElementId)\n\n let finalComponent = Component.props ? Component : \n\n if (rootElement) {\n if (connected) {\n ReactDOM.render(\n {finalComponent},\n\n rootElement\n )\n } else {\n ReactDOM.render(finalComponent, rootElement)\n }\n }\n}\n","export function int(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nexport function range(min, max) {\n let array = new Array(int(min, max))\n for (let i = 0; i < array.length; i++) {\n array[i] = i\n }\n\n return array\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { Router, browserHistory } from \"react-router\"\nimport store from \"misago/services/store\"\n\nconst rootElement = document.getElementById(\"page-mount\")\n\nexport default function (options) {\n let routes = {\n component: options.component || null,\n childRoutes: [],\n }\n\n if (options.root) {\n routes.childRoutes = [\n {\n path: options.root,\n onEnter: function (nextState, replaceState) {\n replaceState(null, options.paths[0].path)\n },\n },\n ].concat(options.paths)\n } else {\n routes.childRoutes = options.paths\n }\n\n ReactDOM.render(\n \n \n ,\n rootElement\n )\n}\n","const EMAIL =\n /^(([^<>()[\\]\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i\nconst USERNAME = new RegExp(\"^[0-9a-z_]+$\", \"i\")\nconst USERNAME_ALPHANUMERIC = new RegExp(\"[0-9a-z]\", \"i\")\n\nexport function required(message) {\n return function (value) {\n if (\n value === false ||\n value === null ||\n String(value).trim().length === 0\n ) {\n return message || gettext(\"This field is required.\")\n }\n }\n}\n\nexport function requiredTermsOfService(message) {\n const error = pgettext(\n \"agreement validator\",\n \"You have to accept the terms of service.\"\n )\n return required(message || error)\n}\n\nexport function requiredPrivacyPolicy(message) {\n const error = pgettext(\n \"agreement validator\",\n \"You have to accept the privacy policy.\"\n )\n return required(message || error)\n}\n\nexport function email(message) {\n return function (value) {\n if (!EMAIL.test(value)) {\n return (\n message || pgettext(\"email validator\", \"Enter a valid e-mail address.\")\n )\n }\n }\n}\n\nexport function minLength(limitValue, message) {\n return function (value) {\n var returnMessage = \"\"\n var length = value.trim().length\n\n if (length < limitValue) {\n if (message) {\n returnMessage = message(limitValue, length)\n } else {\n returnMessage = npgettext(\n \"value length validator\",\n \"Ensure this value has at least %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n }\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n\nexport function maxLength(limitValue, message) {\n return function (value) {\n var returnMessage = \"\"\n var length = value.trim().length\n\n if (length > limitValue) {\n if (message) {\n returnMessage = message(limitValue, length)\n } else {\n returnMessage = npgettext(\n \"value length validator\",\n \"Ensure this value has at most %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n }\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n\nexport function usernameMinLength(lengthMin) {\n var message = function (lengthMin) {\n return npgettext(\n \"username length validator\",\n \"Username must be at least %(limit_value)s character long.\",\n \"Username must be at least %(limit_value)s characters long.\",\n lengthMin\n )\n }\n return minLength(lengthMin, message)\n}\n\nexport function usernameMaxLength(lengthMax) {\n var message = function (lengthMax) {\n return npgettext(\n \"username length validator\",\n \"Username cannot be longer than %(limit_value)s character.\",\n \"Username cannot be longer than %(limit_value)s characters.\",\n lengthMax\n )\n }\n return maxLength(lengthMax, message)\n}\n\nexport function usernameContent() {\n return function (value) {\n const valueTrimmed = value.trim()\n if (!USERNAME.test(valueTrimmed)) {\n return pgettext(\n \"username validator\",\n \"Username can only contain Latin alphabet letters, digits, and an underscore sign.\"\n )\n }\n if (!USERNAME_ALPHANUMERIC.test(valueTrimmed)) {\n return pgettext(\n \"username validator\",\n \"Username must contain Latin alphabet letters or digits.\"\n )\n }\n }\n}\n\nexport function passwordMinLength(limitValue) {\n return function (value) {\n const length = value.length\n\n if (length < limitValue) {\n const returnMessage = npgettext(\n \"password length validator\",\n \"Valid password must be at least %(limit_value)s character long.\",\n \"Valid password must be at least %(limit_value)s characters long.\",\n limitValue\n )\n\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 30094,\n\t\"./hi.js\": 30094,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + \"hljs\" + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t174: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkmisago\"] = self[\"webpackChunkmisago\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(99170)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(58339)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(64109)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(46226)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(93240)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(75147)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(4894)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(29223)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(73806)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(27015)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(88097)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(46016)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(32488)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(11768)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(61323)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(64752)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(40949)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(78679)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(61814)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(95920)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(44095)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(63290)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(77031)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(97751)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(76093)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(87336)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(47549)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(22331)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(21513)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(98749)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(98251)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(6720)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(66806)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(10846)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(18255)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(14113)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(24444)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(1764)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(68351)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(81521)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(68585)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(41229)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(43589)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(62894)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(33934)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(85577)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(83526)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(43060)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(92292)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(33409)))\nvar __webpack_exports__ = __webpack_require__.O(undefined, [736], () => (__webpack_require__(31341)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","ApiFetch","props","url","cache","data","setState","loading","error","onData","fetch","method","credentials","signal","then","response","status","json","setCache","headers","get","rejection","request","mutation","state","controller","AbortController","this","disabled","prevProps","urlChanged","disabledChanged","abort","hasCache","getCache","children","Object","assign","refetch","update","React","ApiMutation","options","body","onSuccess","onError","mutate","csrfToken","JSON","stringify","cookieName","window","misago_csrf","document","cookie","indexOf","cookieRegex","RegExp","match","split","Dropdown","event","isOpen","root","contains","target","menu","closest","prevState","dropdown","addEventListener","handleClick","removeEventListener","onOpen","onClose","id","className","classnames","open","ref","element","toggle","aria","ariaProps","menuAlignRight","menuClassName","role","close","DropdownDivider","DropdownFooter","listItem","DropdownHeader","DropdownMenuItem","DropdownPills","DropdownSubheader","shrink","auto","ListGroup","ListGroupItem","ListGroupEmpty","icon","message","ListGroupError","detail","ListGroupLoading","ListGroupMessage","getApiUrl","filter","query","api","misago","after","before","connect","auth","user","unreadNotifications","dispatch","updateAuthenticatedUser","NotificationsListEmpty","emptyMessage","pgettext","NotificationsListGroup","NotificationsListItemActor","notification","actor","href","title","username","size","actor_name","NotificationsListItemMessage","isRead","dangerouslySetInnerHTML","__html","NotificationsListItemReadStatus","NotificationsListItemTimestamp","Timestamp","datetime","createdAt","NotificationsListItem","NotificationsList","items","length","map","NotificationsListError","gettext","NotificationsListLoading","BODY_CLASS","Overlay","scrollOrigin","pageYOffset","classList","add","remove","scrollTo","onClick","closeOnNavigation","type","styleName","header","STYLES","LABELS","_score","_password","_inputs","loaded","zxcvbn","password","inputs","cacheStale","value","i","trim","score","getScore","style","width","RegisterForm","handleToggleAgreement","agreement","errors","validator","validators","criteria","passwordMinLength","forEach","item","name","min_length","formValidators","max_length","email","captcha","termsOfService","privacyPolicy","isLoading","isValid","snackbar","validate","ajax","terms_of_service","privacy_policy","apiResponse","callback","__all__","ban","showBannedPage","modal","onSubmit","handleSubmit","display","StartSocialAuth","buttonClassName","buttonLabel","formLabel","label","for","validation","onChange","bindInput","extra","form","RegisterLegalFootnote","onPrivacyPolicyChange","handlePrivacyPolicyChange","onTermsOfServiceChange","handleTermsOfServiceChange","Form","RegisterComplete","activation","interpolate","getLead","getSubscript","complete","completeRegistration","account_activation","isLoaded","Promise","all","result","block","showRegisterForm","LegalAgreement","checked","agreementHtml","escapeHtml","termsOfServiceId","termsOfServiceUrl","privacyPolicyId","privacyPolicyUrl","SearchResultsList","SearchMessage","SearchResultPost","post","index","thread","headline","content","category","poster","poster_name","posted_on","SearchResultUser","rank","joined_on","SearchResults","results","threads","users","count","encodeURIComponent","npgettext","replace","SearchResultsEmpty","SearchResultsError","errorDetail","SearchResultsLoading","CACHE","SearchFetch","debounce","clearTimeout","setTimeout","Api","resultsCount","isResultEmpty","SearchInput","setQuery","placeholder","SearchQuery","SearchDropdown","overlay","search","querySelector","focus","settings","DELEGATE_AUTH","LOGIN_URL","preventDefault","SiteNavMenuConnected","isAnonymous","baseUrl","mainItems","extraItems","extraFooterItems","categories","authDelegated","enable_oauth2_client","topNav","push","footerNav","tosTitle","tosUrl","privacyTitle","privacyUrl","SignInButton","RegisterButton","forum_name","targetBlank","rel","is_vanilla","last","color","short_name","SiteNavDropdown","siteNav","FormHeader","text","labelClassName","socialAuth","pk","button_text","button_color","finalButtonLabel","site","tick","now","Date","diff","Math","ceil","abs","round","date","timeout","scheduleNextUpdate","displayed","narrow","dateRelativeShort","dateRelative","fullDateTime","callApi","avatarType","avatar","onComplete","showError","gravatar","setGravatar","crop_src","showCrop","upload","showUpload","galleries","showGallery","userPeview","avatars","getAvatarPreview","getGravatarButton","setGenerated","getCropButton","getUploadButton","getGalleryButton","cropit","$","deviceRatio","cropitOffset","crop","offset","x","y","zoom","crop_tmp","dataUrl","cropperWidth","getAvatarSize","initialWidth","height","exportZoom","imageState","src","getImagePath","onImageLoaded","zoomLevel","imageSize","offsetX","offsetY","cropAvatar","showIndex","getElementById","click","image","files","validationError","validateFile","preview","URL","createObjectURL","progress","FormData","append","uploaded","limit","filesize","fileSize","invalidTypeMsg","allowed_mime_types","extensionFound","loweredFilename","toLowerCase","allowed_extensions","extension","substr","extensions","join","pickFile","getUploadRequirements","getUploadProgressLabel","uploadFile","getUploadProgress","renderCrop","renderUpload","GalleryItem","select","selection","getClassName","Gallery","batch","images","row","save","ChangeAvatarError","reason","getErrorReason","component","AvatarIndex","AvatarUpload","AvatarCrop","AvatarGallery","store","updateAvatar","completeFlow","getBody","logout","submit","UserNavMenu","selectAvatar","ChangeAvatarModal","optionsMore","slice","adminUrl","showPrivateThreads","unreadPrivateThreads","changeAvatar","revealOptions","unread_private_threads","acl","can_use_private_threads","UserNavDropdown","userNav","size2x","alt","getSrc","srcSet","av","resolveAvatarForSize","Button","defaultProps","choices","repeat","level","isValidated","helpText","labelClass","htmlFor","controlClass","getFeedbackDescription","getFeedback","getHelpText","validateRequired","required","changeValue","newState","formErrors","validateField","clean","promise","send","success","handleSuccess","handleError","optional","validatedFields","hasOwnProperty","fieldErrors","field","requiredError","isControlled","isActive","path","location","pathname","activeClassName","ytRegExp","highlightCode","embedYoutubePlayers","_youtube","hljs","codeblocks","querySelectorAll","highlightElement","anchors","a","onlyChild","parentNode","childNodes","parseYoutubeUrl","youtubeMovie","swapYoutubePlayer","youtube","video","start","player","replaceWith","wrap","cleanedUrl","cleanUrl","getVideoIdFromUrl","timebit","bits","parseInt","onebox","documentNode","find","revealSpoiler","nextProps","nextState","markup","author","undefined","node","btn","parent","addClass","PanelMessage","Default","Invalid","tooltip","format","fromNow","userTitle","css_class","is_tab","random","isReady","posts","PostingQuoteSelection","range","getQuoteSelection","rect","getBoundingClientRect","posting","globalState","getGlobalState","quote","getQuoteMarkup","focusEditor","default","onMouseUp","selected","onTouchEnd","position","left","scrollX","top","bottom","scrollY","reply","textarea","selectionStart","selectionEnd","container","getSelection","rangeCount","getRangeAt","isRangeContained","isPostContained","isAnyTextSelected","cloneContents","commonAncestorContainer","p","nodeName","dataset","noquote","child","nodeType","Node","TEXT_NODE","textContent","metadata","getQuoteMetadata","convertNodesToMarkup","prefix","suffix","codeBlock","getQuoteCodeBlock","syntax","isNodeInlineCodeBlock","isNodeElementWithQuoteMetadata","getQuoteMetadataFromNode","ELEMENT_NODE","isNodeCodeBlock","getNodeCodeBlockMeta","nodes","stack","convertNodeToMarkup","SIMPLE_NODE_MAPPINGS","H1","H2","H3","H4","H5","H6","STRONG","EM","DEL","B","U","I","SUB","SUP","toUpperCase","code","innerText","misagoReply","setGlobalState","clearGlobalState","attachments","attachment","isRemoved","MarkupAttachmentModal","is_image","filename","filetype","formatFilesize","uploaded_on","uploader","uploader_name","wrapSelection","def","newValue","caret","setSelectionRange","replaceSelection","end","createRange","moveStart","substring","scroll","scrollTop","thumb","getAttachmentMarkup","confirm","key","canProtect","empty","isProtected","submitText","showPreview","closePreview","enableProtection","disableProtection","MarkupCodeModal","ev","LANGUAGES","rows","MarkupFormattingHelpModal","ExampleFormatting","ExampleFormattingSpoiler","reveal","URL_PATTERN","isUrl","str","test","textUrl","file","maxSize","max_attachment_size","getRandomString","concat","refreshState","moment","updateAttachments","actions","insertSpoiler","input","createElement","multiple","parsed","stopPropagation","dataTransfer","onAttachmentsChange","clipboardData","kind","getAsFile","focused","atwho","at","displayTpl","insertTpl","searchKey","callbacks","remoteFilter","getJSON","q","on","_storage","source","headPos","endPos","setMentions","onDrop","onFocus","onPaste","onBlur","post_length_min","CLASS_ACTIVE","CLASS_DEFAULT","CLASS_MINIMIZED","CLASS_FULLSCREEN","fullscreen","minimized","minimize","fullscreenEnter","fullscreenExit","PostingThreadOptions","isClosed","isHidden","isPinned","hide","unhide","pinGlobally","pinLocally","unpin","icons","closed","hidden","pinned","getIcons","pin","categoryOptions","getTitleValidators","getPostValidators","config","loadSuccess","loadError","non_field_errors","dialogProps","onCancel","PostingDialogStart","Toolbar","showOptions","onTitleChange","onCategoryChange","onHide","onUnhide","onPinGlobally","onPinLocally","onUnpin","onPostChange","usernames","removedBlanks","pos","to","cleanUsernames","PostingDialogStartPrivate","onToChange","quoteText","newPost","context","onQuote","newContext","appendData","PostingDialogReply","originalPost","protect","is_protected","can_protect","originalPostSameAsCurrentPost","noAttachementsAdded","PostingDialogEditReply","mode","minLength","thread_title_length_min","limitValue","limit_value","show_value","maxLength","thread_title_length_max","post_length_max","validatePostLengthMin","choice","getChoice","Icon","getIcon","getLabel","change","showActivation","val","getActivationButton","is_banned","is_hidden","is_online_hidden","is_offline_hidden","is_online","is_offline","getClass","StatusIcon","StatusLabel","banned_until","ban_expires","last_click","getHelp","showStatus","Status","JoinDate","Posts","Threads","Followers","getStatClassName","followers","stat","colClassName","cols","list","Array","apply","Number","call","iconOn","iconOff","labelOn","labelOff","locale","misago_locale","momentAgo","momentAgoShort","dayAt","soonAt","tomorrowAt","yesterdayAt","minutesShort","hoursShort","daysShort","thisYearShort","otherYearShort","relativeNumeric","Intl","RelativeTimeFormat","numeric","DateTimeFormat","dateStyle","timeStyle","thisYearDate","month","day","otherYearDate","year","short","weekday","shortTime","absDiff","sign","minutes","hours","isSameDay","yesterday","setDate","getDate","isYesterday","isTomorrow","formatDayAtTime","getFullYear","getMonth","days","parts","formatToParts","isOrdered","_items","order","values","values_only","_order","unordered","ordered","ordering","insertItem","insertAt","splice","iterations","useLoader","silent","getAttribute","requests","onRemoveSelection","onAction","moderation","htmx","swap","tagName","control","button","selector","registerEvents","registerActions","registerElementValidator","strip","csrf","setAttribute","setFormControlValidationState","callValidationUrl","clearFormControlValidationMessages","clearFormControlValidationState","setFormControlErrorValidationState","setFormControlSuccessValidationState","set","removeSnackbars","replaceChildren","renderSnackbars","SNACKBAR_TTL","appendChild","isEventVisible","requestConfig","verb","xhr","getResponseHeader","parse","getResponseErrorMessage","updateTimestamp","timestamp","hasAttribute","updateLiveTimestamps","setInterval","loader","AjaxLoader","_initializers","_context","initializer","OrderedList","orderedValues","fallback","has","snackbars","BulkModeration","show","patch","AUTH_SYNC_RATE","storage","include","AcceptAgreement","submiting","accept","reload","handleDecline","handleAccept","mount","signedIn","signedOut","getMessage","refresh","AuthMessage","NavbarBranding","logo","logoXs","NavbarExtraMenu","NotificationsDropdownBody","showAll","showUnread","unread","NotificationsDropdownBodyPill","active","NotificationsFetch","NavbarNotificationsToggle","badge","NavbarNotificationsDropdown","NavbarPrivateThreads","NavbarSearchToggle","NavbarSearchDropdown","Search","NavbarSiteNavToggle","NavbarSiteNavDropdown","SiteNav","NavbarUserNavToggle","NavbarUserNavDropdown","UserNav","branding","logo_small","logo_text","extraMenuItems","searchUrl","notificationsUrl","privateThreadsUrl","showSearch","can_search","addInitializer","ReactDOM","NotificationsOverlayBody","NotificationsOverlayBodyPill","NotificationsOverlay","notifications","NotificationsHeader","PageHeader","subtitle","PillsNav","PillsNavLink","link","NotificationsPills","basename","NotificationsPagination","NotificationsPaginationLink","hasPrevious","firstCursor","lastCursor","hasNext","NotificationsToolbar","markAllAsRead","getSubtitle","route","getBaseUrl","PageContainer","readAll","mutating","toolbarProps","history","replaceState","browserHistory","routes","NotificationsRoute","startsWith","expires_on","initWithPreloadedData","initWithoutPreloadedData","startPolling","profile","polls","poll","frequency","user_message","html","staff_message","isAfter","keys","getUserMessage","getStaffMessage","getExpirationMessage","getPanelBody","fieldname","fields","help_text","groups","group","f","initial","CancelButton","cancel","FormDisplay","isAuthenticated","SafeValue","onEdit","showEditButton","details","load","editing","newDetails","loadDetails","profileDetails","edit","edit_details","loadItems","next","Feed","loadMore","LoadMoreButton","isBusy","loadUsers","page","more","pages","setSpecialProps","PRELOADED_DATA_KEY","TITLE","API_FILTER","hydrate","apiUrl","getEmptyMessage","getMoreButton","getListBody","changed_by","changed_by_username","renderUserAvatar","renderUsername","old_username","new_username","changed_on","changes","hiddenOnMobile","loadChanges","is_followed","follow","action","canMessage","can_start_private_threads","isProfileOwner","is_avatar_locked","avatar_lock_user_message","avatar_lock_staff_message","moderate_avatar","avatar_hash","getFormBody","getModalBody","moderate_username","addNameChange","updateUsername","slug","countdown","isDeleted","with_content","getButtonLabel","getDeletedBody","getForm","AvatarControls","ChangeUsername","DeleteAccount","showAvatarDialog","rename","showRenameDialog","showDeleteDialog","is_active","ProfileModerationButton","FlexRow","available","getModeration","can_follow","WithDropdown","delete","is_anonymous","can_rename","can_moderate_avatar","can_delete","COMPONENTS","follows","Follows","Details","UsernameHistory","BanDetails","paths","Profile","RequestLinkForm","LinkSent","reset","RequestActivationLink","RequestResetForm","showInactivePage","AccountInactivePage","getActivateButton","RequestPasswordReset","ResetPasswordForm","PasswordChangedPage","SignInModal","showSignIn","updateSearch","urlQuery","pushState","providers","provider","updateUsers","updatePosts","onQueryChange","Badge","SearchTime","time","copy","LoadMore","appendPosts","updateProvider","Blankslate","components","TYPES_CLASSES","info","warning","Snackbar","snackbarClass","isVisible","getSnackbarClass","backendName","pageTitleTpl","pageTitle","backend","Register","emailProtected","onRegistrationComplete","step","stateUpdate","backend_name","emailHelpText","emailHelpTextTpl","SocialAuth","handleRegistrationComplete","op","updateAcl","participants","ModalHeader","onUsernameChange","can_add_participants","participant","confirmed","isUser","is_owner","can_change_owner","isModerator","can_moderate_private_threads","userIsOwner","UserStatus","isOwner","getUserIsOwner","utils","PollChoice","hash","proc","votes","getVotesLabel","ChoiceVotes","UserChoice","hydratedData","voters","voter","voted_on","ModalBody","ChoicesList","ChoiceDetails","VotesCount","VotesList","Voter","VoteDate","isPollOver","showVoting","is_public","can_edit","can_see_votes","can_vote","hasSelectedChoices","allow_revotes","controls","canVote","canChangeVote","ChangeVote","SeeVotes","Edit","Delete","newThreadAcl","DATE_ABBR","PollVotes","PollLength","PollIsPublic","PollCreation","getPoster","getPostedOn","absolute","relative","ends_on","getEndsOn","endsOn","question","PollChoicesLeft","choicesLeft","PollAllowRevote","ChoiceSelect","toggleChoice","getChoicesLeft","allowed_choices","getChoiceFromHash","deselectChoice","selectChoice","showResults","getIsPollOver","setChoices","canDelete","onDelete","onAdd","every","isEdit","PollPublicSwitch","ICON","changed_title","pinned_globally","pinned_locally","unpinned","moved","merged","approved","opened","unhid","hid","changed_owner","tookover","added_participant","owner_left","participant_left","removed_participant","event_type","can_hide","Hide","Unhide","hidden_on","hidden_by_name","hidden_by","USER_SPAN","USER_URL","Hidden","Poster","event_by","event_on","MESSAGE","ITEM_LINK","ITEM_SPAN","ChangedTitle","Moved","Merged","ChangedOwner","AddedParticipant","RemovedParticipant","msgstring","oldTitle","event_context","old_title","fromCategory","from_category","mergedThread","merged_thread","newOwner","is_read","initialized","observer","IntersectionObserver","entries","observe","entry","isIntersecting","primed","read","destroy","disconnect","ready","initialize","AttachmentPreview","AttachmentDetails","AttachmentThumbnail","AttachmentIcon","backgroundImage","can_see_hidden","Row","FlagBestAnswer","best_answer","best_answer_marked_by","marked_on","best_answer_marked_on","marked_by","best_answer_marked_by_name","FlagHidden","FlagUnapproved","is_unapproved","FlagProtected","approve","unprotect","like","lastLikes","last_likes","concatedLikes","finalLikes","is_liked","likes","unlike","previousState","ops","markAsBestAnswer","best_answer_is_protected","best_answer_marked_by_slug","patchThread","unmarkBestAnswer","hydrateLike","ModalDialog","LikesList","liked_on","likesCount","LikeDetails","liker_id","LikeDate","likedOn","can_reply","can_see_likes","can_like","MarkAsBestAnswer","MarkAsBestAnswerCompact","Like","Likes","LikesCompact","Reply","Quote","can_mark_best_answer","can_mark_as_best_answer","can_change_best_answer","hasLikes","getLikesMessage","u","hiddenLikes","otherUsers","lastUser","usernamesList","last_user","editor","move","new_thread","onUrlChange","DiffItem","revertEdit","canRevert","goToEdit","previous","GoBackBtn","goBack","GoForwardBtn","goForward","GoLastBtn","goLast","Label","RevertBtn","editor_name","edited_on","edited_by","hydrateEdit","edits","hydratedPost","PostingConfig","ModerationForm","isError","Error","Loader","categoryId","can_pin_threads","weight","can_hide_threads","can_close_threads","is_closed","isHiddenChoices","isClosedChoices","getWeightChoices","Modal","renderWeightField","renderHiddenField","renderClosedField","Permalink","UnmarkMarkBestAnswer","PostEdits","Approve","Move","Split","Protect","Unprotect","permaUrl","protocol","host","prompt","can_unmark_best_answer","isUnedited","can_approve","can_move","can_unhide","isSelected","can_merge_posts","UnreadLabel","UnreadCompact","PostedOn","PostedOnCompact","PostEditsCompacts","ProtectedLabel","postAuthor","hasAcl","hasVisibleTitle","ListItem","is_event","has_poll","has_unapproved_posts","replies","starter","starter_name","started_on","handleSuccessUnmounted","bestAnswer","BestAnswerSelect","bestAnswers","onBestAnswerChange","PollSelect","onPollChange","best_answers","merge","other_thread","post_set","ModalMessage","ModalLoading","successMessage","changeTitle","dropup","stickToBottom","watch","setNotifications","special_role","breadcrumbs","hasFlags","is_authenticated","enabled","resetScroll","ThreadPaginatorConnected","withRouter","router","scrollToTop","first","formData","min","max","PostErrors","heading","ids","rollback","isArray","Merge","can_merge","onReply","compact","is_new","new_post","unapproved_post","last_post","pollDisabled","onPoll","can_start_poll","setPageTitle","editPoll","shouldFetchData","fetchData","startPollingApi","stopPollingApi","params","delayed","threadModeration","getThreadModeration","postsModeration","getPostsModeration","openPollForm","openReplyForm","closePollForm","can_close","can_pin_globally","can_pin","can_unprotect","basePath","Route","getPageUrl","trackedPeriod","rankUrl","getUserStatus","getRankName","getUserTitle","counter","meta","posters","getLeadMessage","tracked_period","string","subString","n","stringCount","description","getRankDescription","getComponent","Rank","ActivePosters","Users","_element","_component","removeClass","attr","forum_index_title","reducer","initialState","array","SELECT_ALL","SELECT_NONE","SELECT_ITEM","APPEND_THREADS","DELETE_THREAD","FILTER_THREADS","HYDRATE_THREADS","PATCH_THREAD","SORT_THREADS","MODERATION_PERMISSIONS","hydrateThread","thread_acl","perm","mergedState","concatUnique","sort","sorting","itemCategory","categoriesMap","lft","rght","patchedState","doTick","UPDATE_AUTHENTICATED_USER","PATCH_USER","SIGN_IN","SIGN_OUT","signIn","signOut","soft","updatedState","UPDATE_AVATAR","userId","UPDATE_USERNAME","OPEN_SITE_NAV","OPEN_SEARCH","OPEN_NOTIFICATIONS","OPEN_PRIVATE_THREADS","OPEN_USER_NAV","CLOSE","openSiteNav","openSearch","openNotifications","openUserNav","privateThreads","REPLACE_PARTICIPANTS","BUSY_POLL","RELEASE_POLL","REMOVE_POLL","REPLACE_POLL","UPDATE_POLL","busy","release","hydrated","PATCH_POST","updated_on","hydrateAttachment","hydrateUser","APPEND_POSTS","SELECT_POST","DESELECT_POST","DESELECT_POSTS","LOAD_POSTS","UNLOAD_POSTS","UPDATE_POSTS","deselect","deselectAll","hydratePost","unload","selectedPosts","deseletedPosts","deseletedAllPosts","resultsIds","reducedPosts","postReducer","LOAD_DETAILS","HYDRATE_PROFILE","PATCH_PROFILE","hydrateStatus","REPLACE_SEARCH","UPDATE_SEARCH","UPDATE_SEARCH_PROVIDER","SHOW_SNACKBAR","HIDE_SNACKBAR","showSnackbar","messageType","hideSnackbar","BUSY_THREAD","RELEASE_THREAD","REPLACE_THREAD","UPDATE_THREAD","UPDATE_THREAD_ACL","last_post_on","TICK","ADD_NAME_CHANGE","APPEND_HISTORY","HYDRATE_HISTORY","changedBy","hydrateNamechange","namechange","unshift","floor","APPEND_USERS","HYDRATE_USERS","_cookieName","_csrfToken","_locks","self","resolve","reject","getCsrfToken","contentType","dataType","jqXHR","responseJSON","statusText","lock","param","waiter","wait","processData","XMLHttpRequest","evt","lengthComputable","total","local","_store","_local","_modal","syncSession","watchState","getState","BaseCaptcha","_ajax","_include","_snackbar","NoCaptcha","QACaptcha","kwargs","ReCaptchaComponent","grecaptcha","render","sitekey","siteKey","binding","ReCaptcha","recaptcha_site_key","captcha_type","_captcha","init","staticUrl","_staticUrl","_included","script","remote","localStorage","_prefix","_watchers","e","newValueJson","watcher","oldValue","setItem","itemString","getItem","indexTitle","forumName","_indexTitle","_forumName","finalTitle","_polls","stop","poolServer","_stopped","apiError","pollId","unsetBeforeUnload","_props","_isOpen","_isClosing","_mount","_observer","unobserve","_spacer","_mode","ResizeObserver","contentRect","_beforeunloadSet","beforeUnload","capture","returnValue","_realOpen","setBeforeUnload","_timeout","alert","_reducers","_initialState","createStore","combineReducers","_isLoaded","_loadedPromise","_loadingPromise","tries","plain","expires","getReasonMessage","RedrawedBannedPage","BannedPage","changeState","rowWidth","padding","b","m","bytes","roundSize","toFixed","ALPHA","ALPHA_LEN","len","chars","Component","rootElementId","connected","rootElement","finalComponent","int","childRoutes","onEnter","EMAIL","USERNAME","USERNAME_ALPHANUMERIC","String","requiredTermsOfService","requiredPrivacyPolicy","returnMessage","usernameMinLength","lengthMin","usernameMaxLength","lengthMax","usernameContent","valueTrimmed","webpackContext","req","webpackContextResolve","__webpack_require__","o","module","exports","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","r","getter","__esModule","d","definition","defineProperty","enumerable","chunkId","reduce","promises","miniCssF","g","globalThis","Function","hmd","create","obj","prop","prototype","l","done","needAttach","scripts","getElementsByTagName","s","charset","nc","onScriptComplete","prev","onerror","onload","doneFns","removeChild","bind","head","Symbol","toStringTag","nmd","scriptUrl","importScripts","currentScript","installedChunks","installedChunkData","errorType","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"misago.js","mappings":"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AM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,QACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,QACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,QACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnEA,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SACnE,IAAImE,EAAsBnE,EAAoBQ,OAAE5xC,EAAW,CAAC,MAAM,IAAOoxC,EAAoB,SAC7FmE,EAAsBnE,EAAoBQ,EAAE2D,E","sources":["webpack://misago/webpack/runtime/chunk loaded","webpack://misago/webpack/runtime/load script","webpack://misago/./src/components/Api/ApiFetch.jsx","webpack://misago/./src/components/Api/ApiMutation.jsx","webpack://misago/./src/components/Dropdown/Dropdown.jsx","webpack://misago/./src/components/Dropdown/DropdownDivider.jsx","webpack://misago/./src/components/Dropdown/DropdownFooter.jsx","webpack://misago/./src/components/Dropdown/DropdownHeader.jsx","webpack://misago/./src/components/Dropdown/DropdownMenuItem.jsx","webpack://misago/./src/components/Dropdown/DropdownPills.jsx","webpack://misago/./src/components/Dropdown/DropdownSubheader.jsx","webpack://misago/./src/components/FlexRow/FlexRow.jsx","webpack://misago/./src/components/FlexRow/FlexRowCol.jsx","webpack://misago/./src/components/FlexRow/FlexRowSection.jsx","webpack://misago/./src/components/ListGroup/ListGroup.jsx","webpack://misago/./src/components/ListGroup/ListGroupItem.jsx","webpack://misago/./src/components/ListGroup/ListGroupEmpty.jsx","webpack://misago/./src/components/ListGroup/ListGroupError.jsx","webpack://misago/./src/components/ListGroup/ListGroupLoading.jsx","webpack://misago/./src/components/ListGroup/ListGroupMessage.jsx","webpack://misago/./src/components/NotificationsFetch/NotificationsFetch.jsx","webpack://misago/./src/components/NotificationsFetch/index.js","webpack://misago/./src/components/NotificationsList/NotificationsListEmpty.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListGroup.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItemActor.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItemMessage.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItemReadStatus.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItemTimestamp.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItem.jsx","webpack://misago/./src/components/NotificationsList/NotificationsList.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListError.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListLoading.jsx","webpack://misago/./src/components/Overlay/Overlay.jsx","webpack://misago/./src/components/Overlay/OverlayHeader.jsx","webpack://misago/./src/components/PageContainer.jsx","webpack://misago/./src/components/PageHeader/PageHeader.jsx","webpack://misago/./src/components/PageHeader/PageHeaderBanner.jsx","webpack://misago/./src/components/PageHeader/PageHeaderContainer.jsx","webpack://misago/./src/components/PageHeader/PageHeaderDetails.jsx","webpack://misago/./src/components/PageHeader/PageHeaderPlain.jsx","webpack://misago/./src/components/password-strength.js","webpack://misago/./src/components/register.js","webpack://misago/./src/components/RegisterButton/index.js","webpack://misago/./src/components/RegisterButton/RegisterButton.jsx","webpack://misago/./src/components/RegisterLegalFootnote.js","webpack://misago/./src/components/Search/SearchResultsList.jsx","webpack://misago/./src/components/Search/SearchMessage.jsx","webpack://misago/./src/components/Search/SearchResultPost.jsx","webpack://misago/./src/components/Search/SearchResultUser.jsx","webpack://misago/./src/components/Search/SearchResults.jsx","webpack://misago/./src/components/Search/SearchResultsEmpty.jsx","webpack://misago/./src/components/Search/SearchResultsError.jsx","webpack://misago/./src/components/Search/SearchResultsLoading.jsx","webpack://misago/./src/components/Search/SearchFetch.jsx","webpack://misago/./src/components/Search/SearchInput.jsx","webpack://misago/./src/components/Search/SearchQuery.jsx","webpack://misago/./src/components/Search/SearchDropdown.jsx","webpack://misago/./src/components/Search/SearchOverlay.jsx","webpack://misago/./src/components/SignInButton/index.js","webpack://misago/./src/components/SignInButton/SignInButton.jsx","webpack://misago/./src/components/SiteNav/SiteNavMenu.jsx","webpack://misago/./src/components/SiteNav/SiteNavDropdown.jsx","webpack://misago/./src/components/SiteNav/SiteNavOverlay.jsx","webpack://misago/./src/components/StartSocialAuth.js","webpack://misago/./src/components/Timestamp/Timestamp.jsx","webpack://misago/./src/components/Timestamp/index.js","webpack://misago/./src/components/Toolbar/Toolbar.jsx","webpack://misago/./src/components/Toolbar/ToolbarItem.jsx","webpack://misago/./src/components/Toolbar/ToolbarSection.jsx","webpack://misago/./src/components/Toolbar/ToolbarSpacer.jsx","webpack://misago/./src/components/change-avatar/index.js","webpack://misago/./src/components/change-avatar/crop.js","webpack://misago/./src/components/change-avatar/upload.js","webpack://misago/./src/components/change-avatar/gallery.js","webpack://misago/./src/components/change-avatar/root.js","webpack://misago/./src/components/UserNav/logout.js","webpack://misago/./src/components/UserNav/UserNavMenu.jsx","webpack://misago/./src/components/UserNav/UserNavDropdown.jsx","webpack://misago/./src/components/UserNav/UserNavOverlay.jsx","webpack://misago/./src/components/avatar.js","webpack://misago/./src/components/button.js","webpack://misago/./src/components/category-select.js","webpack://misago/./src/components/form-group.js","webpack://misago/./src/components/form.js","webpack://misago/./src/components/li.js","webpack://misago/./src/components/loader.js","webpack://misago/./src/services/one-box.js","webpack://misago/./src/components/misago-markup.js","webpack://misago/./src/components/modal-loader.js","webpack://misago/./src/components/modal-message.js","webpack://misago/./src/components/panel-message.js","webpack://misago/./src/components/post-feed/post/body.js","webpack://misago/./src/components/post-feed/post/header.js","webpack://misago/./src/components/post-feed/post/post-side/button.js","webpack://misago/./src/components/post-feed/post/post-side/anonymous.js","webpack://misago/./src/components/post-feed/post/post-side/user-title.js","webpack://misago/./src/components/post-feed/post/post-side/registered.js","webpack://misago/./src/components/post-feed/post/post-side/index.js","webpack://misago/./src/components/post-feed/post/index.js","webpack://misago/./src/components/post-feed/preview.js","webpack://misago/./src/components/post-feed/index.js","webpack://misago/./src/components/posting/PostingQuoteSelection.jsx","webpack://misago/./src/components/posting/getQuoteMarkup.js","webpack://misago/./src/components/posting/globalState.js","webpack://misago/./src/components/posting/utils/attachments.js","webpack://misago/./src/components/MarkupEditor/MarkupAttachmentModal.jsx","webpack://misago/./src/components/MarkupEditor/operations.js","webpack://misago/./src/components/MarkupEditor/MarkupEditorAttachment.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditorAttachments.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditorFooter.jsx","webpack://misago/./src/components/MarkupEditor/MarkupCodeModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupFormattingHelpModal.jsx","webpack://misago/./src/components/MarkupEditor/isUrl.js","webpack://misago/./src/components/MarkupEditor/MarkupImageModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupLinkModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupQuoteModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditorButton.jsx","webpack://misago/./src/components/MarkupEditor/uploadFile.js","webpack://misago/./src/components/MarkupEditor/MarkupEditorToolbar.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditor.jsx","webpack://misago/./src/components/MarkupEditor/index.js","webpack://misago/./src/components/posting/PostingDialog.jsx","webpack://misago/./src/components/posting/PostingDialogBody.jsx","webpack://misago/./src/components/posting/PostingDialogError.jsx","webpack://misago/./src/components/posting/PostingDialogHeader.jsx","webpack://misago/./src/components/posting/PostingThreadOptions.jsx","webpack://misago/./src/components/posting/start.js","webpack://misago/./src/components/posting/utils/usernames.js","webpack://misago/./src/components/posting/start-private.js","webpack://misago/./src/components/posting/reply.js","webpack://misago/./src/components/posting/edit.js","webpack://misago/./src/components/posting/index.js","webpack://misago/./src/components/posting/utils/validators.js","webpack://misago/./src/components/select.js","webpack://misago/./src/components/sign-in.js","webpack://misago/./src/components/user-status.js","webpack://misago/./src/components/users-list/card/stats.js","webpack://misago/./src/components/users-list/card/user-title.js","webpack://misago/./src/components/users-list/card/index.js","webpack://misago/./src/components/users-list/preview/card.js","webpack://misago/./src/components/users-list/preview/index.js","webpack://misago/./src/components/users-list/index.js","webpack://misago/./src/components/with-dropdown.js","webpack://misago/./src/components/yes-no-switch.js","webpack://misago/./src/formats.js","webpack://misago/./src/utils/ordered-list.js","webpack://misago/./src/AjaxLoader.js","webpack://misago/./src/BulkModeration.js","webpack://misago/./src/formValidators.js","webpack://misago/./src/snackbars.js","webpack://misago/./src/htmxErrors.js","webpack://misago/./src/liveTimestamps.js","webpack://misago/./src/index.js","webpack://misago/./src/initializers/ajax.js","webpack://misago/./src/initializers/auth-sync.js","webpack://misago/./src/initializers/auth.js","webpack://misago/./src/initializers/captcha.js","webpack://misago/./src/components/accept-agreement.js","webpack://misago/./src/initializers/components/accept-agreement.js","webpack://misago/./src/components/auth-message.js","webpack://misago/./src/initializers/components/auth-message.js","webpack://misago/./src/initializers/components/banned-page.js","webpack://misago/./src/components/SignInModalAutoOpen.js","webpack://misago/./src/components/Navbar/NavbarBranding.jsx","webpack://misago/./src/components/Navbar/NavbarExtraMenu.jsx","webpack://misago/./src/components/NotificationsDropdown/NotificationsDropdownBody.jsx","webpack://misago/./src/components/NotificationsDropdown/index.js","webpack://misago/./src/components/NotificationsDropdown/NotificationsDropdown.jsx","webpack://misago/./src/components/Navbar/NavbarNotificationsToggle.jsx","webpack://misago/./src/components/Navbar/NavbarNotificationsDropdown.jsx","webpack://misago/./src/components/Navbar/NavbarPrivateThreads.jsx","webpack://misago/./src/components/Navbar/NavbarSearchToggle.jsx","webpack://misago/./src/components/Navbar/NavbarSearchDropdown.jsx","webpack://misago/./src/components/Navbar/NavbarSiteNavToggle.jsx","webpack://misago/./src/components/Navbar/NavbarSiteNavDropdown.jsx","webpack://misago/./src/components/Navbar/NavbarUserNavToggle.jsx","webpack://misago/./src/components/Navbar/NavbarUserNavDropdown.jsx","webpack://misago/./src/components/Navbar/Navbar.jsx","webpack://misago/./src/components/Navbar/index.js","webpack://misago/./src/initializers/components/navbar.js","webpack://misago/./src/components/NotificationsOverlay/NotificationsOverlayBody.jsx","webpack://misago/./src/components/NotificationsOverlay/NotificationsOverlay.jsx","webpack://misago/./src/components/NotificationsOverlay/index.js","webpack://misago/./src/initializers/components/notifications-overlay.js","webpack://misago/./src/components/Notifications/NotificationsHeader.jsx","webpack://misago/./src/components/PageTitle/index.js","webpack://misago/./src/components/PageTitle/PageTitle.jsx","webpack://misago/./src/components/PillsNav/PillsNav.jsx","webpack://misago/./src/components/PillsNav/PillsNavLink.jsx","webpack://misago/./src/components/Notifications/NotificationsPills.jsx","webpack://misago/./src/components/Notifications/NotificationsPagination.jsx","webpack://misago/./src/components/Notifications/NotificationsToolbar.jsx","webpack://misago/./src/components/Notifications/NotificationsRoute.jsx","webpack://misago/./src/components/Notifications/index.js","webpack://misago/./src/components/Notifications/Notifications.jsx","webpack://misago/./src/initializers/components/notifications.js","webpack://misago/./src/components/panel-loader.js","webpack://misago/./src/components/profile/ban-details.js","webpack://misago/./src/components/edit-details/blankslate.js","webpack://misago/./src/components/edit-details/loader.js","webpack://misago/./src/components/edit-details/field-input.js","webpack://misago/./src/components/edit-details/fieldset.js","webpack://misago/./src/components/edit-details/form.js","webpack://misago/./src/components/edit-details/index.js","webpack://misago/./src/components/profile/details/form.js","webpack://misago/./src/components/profile/details/empty-message.js","webpack://misago/./src/components/profile/details/field-value.js","webpack://misago/./src/components/profile/details/field.js","webpack://misago/./src/components/profile/details/group.js","webpack://misago/./src/components/profile/details/groups-list.js","webpack://misago/./src/components/profile/details/header.js","webpack://misago/./src/data/profile-details.js","webpack://misago/./src/components/profile/details/index.js","webpack://misago/./src/components/profile/feed/route.js","webpack://misago/./src/components/quick-search.js","webpack://misago/./src/components/profile/followers.js","webpack://misago/./src/components/profile/follows.js","webpack://misago/./src/components/username-history/list-empty.js","webpack://misago/./src/components/username-history/change.js","webpack://misago/./src/components/username-history/list-ready.js","webpack://misago/./src/components/username-history/change-preview.js","webpack://misago/./src/components/username-history/list-preview.js","webpack://misago/./src/components/username-history/root.js","webpack://misago/./src/components/profile/username-history.js","webpack://misago/./src/components/profile/follow-button.js","webpack://misago/./src/components/profile/message-button.js","webpack://misago/./src/components/profile/moderation/avatar-controls.js","webpack://misago/./src/components/profile/moderation/change-username.js","webpack://misago/./src/components/profile/moderation/delete-account.js","webpack://misago/./src/components/profile/moderation/nav.js","webpack://misago/./src/components/profile/ProfileDataList.jsx","webpack://misago/./src/components/profile/ProfileHeader.jsx","webpack://misago/./src/components/profile/ProfileNav.js","webpack://misago/./src/components/profile/root.js","webpack://misago/./src/components/profile/feed/index.js","webpack://misago/./src/initializers/components/profile.js","webpack://misago/./src/components/request-activation-link.js","webpack://misago/./src/initializers/components/request-activation-link.js","webpack://misago/./src/components/request-password-reset.js","webpack://misago/./src/initializers/components/request-password-reset.js","webpack://misago/./src/components/reset-password-form.js","webpack://misago/./src/initializers/components/reset-password-form.js","webpack://misago/./src/initializers/components/search-overlay.js","webpack://misago/./src/components/search-route/form.js","webpack://misago/./src/components/search-route/sidenav.js","webpack://misago/./src/components/search-route/page.js","webpack://misago/./src/components/search-route/threads/results.js","webpack://misago/./src/components/search-route/threads/index.js","webpack://misago/./src/components/search-route/users/index.js","webpack://misago/./src/components/search-route/index.js","webpack://misago/./src/initializers/components/search.js","webpack://misago/./src/initializers/components/site-nav-overlay.js","webpack://misago/./src/components/snackbar.js","webpack://misago/./src/initializers/components/snackbar.js","webpack://misago/./src/components/social-auth/header.js","webpack://misago/./src/components/social-auth/register.js","webpack://misago/./src/components/social-auth/complete.js","webpack://misago/./src/components/social-auth/index.js","webpack://misago/./src/initializers/components/social-auth.js","webpack://misago/./src/components/add-participant.js","webpack://misago/./src/components/participants/add-participant.js","webpack://misago/./src/components/participants/cards-list/make-owner.js","webpack://misago/./src/components/participants/cards-list/actions.js","webpack://misago/./src/components/participants/cards-list/remove.js","webpack://misago/./src/components/participants/cards-list/card.js","webpack://misago/./src/components/participants/cards-list/index.js","webpack://misago/./src/components/participants/index.js","webpack://misago/./src/components/participants/utils.js","webpack://misago/./src/components/poll/results/chart.js","webpack://misago/./src/components/poll/results/modal.js","webpack://misago/./src/components/poll/results/options.js","webpack://misago/./src/components/poll/info.js","webpack://misago/./src/components/poll/results/index.js","webpack://misago/./src/components/poll/voting/help.js","webpack://misago/./src/components/poll/voting/select.js","webpack://misago/./src/components/poll/voting/utils.js","webpack://misago/./src/components/poll/voting/index.js","webpack://misago/./src/components/poll/poll.js","webpack://misago/./src/components/poll/form/choices-control.js","webpack://misago/./src/components/poll/form/index.js","webpack://misago/./src/components/posts-list/event/icon.js","webpack://misago/./src/components/posts-list/event/controls.js","webpack://misago/./src/components/posts-list/event/info.js","webpack://misago/./src/components/posts-list/event/message.js","webpack://misago/./src/components/posts-list/event/unread-label.js","webpack://misago/./src/components/posts-list/waypoint.js","webpack://misago/./src/components/posts-list/event/index.js","webpack://misago/./src/components/posts-list/post/attachments/attachment.js","webpack://misago/./src/components/posts-list/post/attachments/index.js","webpack://misago/./src/components/posts-list/post/body.js","webpack://misago/./src/components/posts-list/post/flags.js","webpack://misago/./src/components/posts-list/post/controls/actions.js","webpack://misago/./src/components/post-likes.js","webpack://misago/./src/components/posts-list/post/footer.js","webpack://misago/./src/components/posts-list/post/controls/move.js","webpack://misago/./src/components/post-changelog/diff.js","webpack://misago/./src/components/post-changelog/footer.js","webpack://misago/./src/components/post-changelog/toolbar.js","webpack://misago/./src/components/post-changelog/utils.js","webpack://misago/./src/components/post-changelog/index.js","webpack://misago/./src/components/posts-list/post/controls/split.js","webpack://misago/./src/components/posts-list/post/controls/dropdown.js","webpack://misago/./src/components/posts-list/post/controls/index.js","webpack://misago/./src/components/posts-list/post/select.js","webpack://misago/./src/components/posts-list/post/header.js","webpack://misago/./src/components/posts-list/post/post-side/anonymous.js","webpack://misago/./src/components/posts-list/post/post-side/has-visible-title.js","webpack://misago/./src/components/posts-list/post/post-side/user-postcount.js","webpack://misago/./src/components/posts-list/post/post-side/user-status.js","webpack://misago/./src/components/posts-list/post/post-side/user-title.js","webpack://misago/./src/components/posts-list/post/post-side/registered.js","webpack://misago/./src/components/posts-list/post/post-side/index.js","webpack://misago/./src/components/posts-list/post/index.js","webpack://misago/./src/components/posts-list/post/preview.js","webpack://misago/./src/components/posts-list/index.js","webpack://misago/./src/components/ThreadFlags.jsx","webpack://misago/./src/components/ThreadReplies.jsx","webpack://misago/./src/components/ThreadStarterCard.jsx","webpack://misago/./src/components/thread/moderation/thread/ThreadChangeTitleModal.jsx","webpack://misago/./src/components/merge-conflict.js","webpack://misago/./src/components/thread/moderation/thread/merge.js","webpack://misago/./src/components/thread/moderation/thread/move.js","webpack://misago/./src/components/thread/moderation/thread/controls.js","webpack://misago/./src/components/thread/moderation/thread/index.js","webpack://misago/./src/components/thread/ThreadModeration.jsx","webpack://misago/./src/components/thread/ThreadWatchButton.jsx","webpack://misago/./src/components/Breadcrumbs/Breadcrumbs.jsx","webpack://misago/./src/components/Breadcrumbs/BreadcrumbsCategory.jsx","webpack://misago/./src/components/Breadcrumbs/BreadcrumbsRootCategory.jsx","webpack://misago/./src/components/thread/ThreadHeader/ThreadHeaderBreadcrumbs.jsx","webpack://misago/./src/components/thread/ThreadHeader/ThreadHeader.jsx","webpack://misago/./src/components/thread/ThreadHeader/index.js","webpack://misago/./src/components/thread/ThreadPaginator.jsx","webpack://misago/./src/components/thread/moderation/posts/errors-list.js","webpack://misago/./src/components/thread/moderation/posts/actions.js","webpack://misago/./src/components/thread/moderation/posts/move.js","webpack://misago/./src/components/thread/moderation/posts/split.js","webpack://misago/./src/components/thread/moderation/posts/dropdown.js","webpack://misago/./src/components/thread/ThreadPostsModeration.jsx","webpack://misago/./src/components/thread/ThreadReplyButton.jsx","webpack://misago/./src/components/thread/ThreadToolbarBottom.jsx","webpack://misago/./src/components/thread/ThreadToolbarThird.jsx","webpack://misago/./src/components/thread/ThreadPollButton.jsx","webpack://misago/./src/components/thread/ThreadShortcutsButton.jsx","webpack://misago/./src/components/thread/ThreadToolbarTop.jsx","webpack://misago/./src/components/thread/route.js","webpack://misago/./src/components/thread/root.js","webpack://misago/./src/initializers/components/thread.js","webpack://misago/./src/initializers/components/user-nav-overlay.js","webpack://misago/./src/components/users/UsersNav.js","webpack://misago/./src/components/users/active-posters/list-empty.js","webpack://misago/./src/components/users/active-posters/list-item-preview.js","webpack://misago/./src/components/users/active-posters/list-preview.js","webpack://misago/./src/components/users/active-posters/list-item.js","webpack://misago/./src/components/users/active-posters/list-ready.js","webpack://misago/./src/components/users/active-posters/root.js","webpack://misago/./src/components/page-lead.js","webpack://misago/./src/utils/string-count.js","webpack://misago/./src/components/users/rank/RankUsersList.js","webpack://misago/./src/components/users/rank/RankUsersListLoader.js","webpack://misago/./src/components/users/rank/RankUsersLeft.jsx","webpack://misago/./src/components/users/rank/RankUsersPagination.jsx","webpack://misago/./src/components/users/rank/RankUsersToolbar.jsx","webpack://misago/./src/components/users/rank/root.js","webpack://misago/./src/components/users/root.js","webpack://misago/./src/initializers/components/users.js","webpack://misago/./src/initializers/include.js","webpack://misago/./src/initializers/local-storage.js","webpack://misago/./src/services/mobile-navbar-dropdown.js","webpack://misago/./src/initializers/mobile-navbar-dropdown.js","webpack://misago/./src/initializers/modal.js","webpack://misago/./src/initializers/moment-locale.js","webpack://misago/./src/initializers/page-title.js","webpack://misago/./src/initializers/polls.js","webpack://misago/./src/initializers/posting.js","webpack://misago/./src/initializers/reducers/auth.js","webpack://misago/./src/initializers/reducers/overlay.js","webpack://misago/./src/initializers/reducers/participants.js","webpack://misago/./src/initializers/reducers/poll.js","webpack://misago/./src/initializers/reducers/posts.js","webpack://misago/./src/initializers/reducers/profile-details.js","webpack://misago/./src/initializers/reducers/profile-hydrate.js","webpack://misago/./src/initializers/reducers/profile.js","webpack://misago/./src/initializers/reducers/search.js","webpack://misago/./src/utils/sets.js","webpack://misago/./src/reducers/selection.js","webpack://misago/./src/initializers/reducers/selection.js","webpack://misago/./src/initializers/reducers/snackbar.js","webpack://misago/./src/initializers/reducers/thread.js","webpack://misago/./src/reducers/threads.js","webpack://misago/./src/initializers/reducers/threads.js","webpack://misago/./src/initializers/reducers/tick.js","webpack://misago/./src/initializers/reducers/username-history.js","webpack://misago/./src/initializers/reducers/users.js","webpack://misago/./src/initializers/snackbar.js","webpack://misago/./src/initializers/store.js","webpack://misago/./src/initializers/tick-start.js","webpack://misago/./src/initializers/zxcvbn.js","webpack://misago/./src/reducers/auth.js","webpack://misago/./src/reducers/overlay.js","webpack://misago/./src/reducers/participants.js","webpack://misago/./src/reducers/poll.js","webpack://misago/./src/reducers/post.js","webpack://misago/./src/reducers/posts.js","webpack://misago/./src/reducers/profile-details.js","webpack://misago/./src/reducers/profile.js","webpack://misago/./src/reducers/search.js","webpack://misago/./src/reducers/snackbar.js","webpack://misago/./src/reducers/thread.js","webpack://misago/./src/reducers/tick.js","webpack://misago/./src/reducers/username-history.js","webpack://misago/./src/reducers/users.js","webpack://misago/./src/services/ajax.js","webpack://misago/./src/services/auth.js","webpack://misago/./src/services/captcha.js","webpack://misago/./src/services/include.js","webpack://misago/./src/services/local-storage.js","webpack://misago/./src/services/modal.js","webpack://misago/./src/services/page-title.js","webpack://misago/./src/services/polls.js","webpack://misago/./src/services/posting.js","webpack://misago/./src/services/snackbar.js","webpack://misago/./src/services/store.js","webpack://misago/./src/services/zxcvbn.js","webpack://misago/./src/components/banned-page.js","webpack://misago/./src/utils/banned-page.js","webpack://misago/./src/utils/batch.js","webpack://misago/./src/utils/concat-unique.js","webpack://misago/./src/utils/escape-html.js","webpack://misago/./src/utils/file-size.js","webpack://misago/./src/utils/getRandomString.js","webpack://misago/./src/utils/mount-component.js","webpack://misago/./src/utils/random.js","webpack://misago/./src/utils/routed-component.js","webpack://misago/./src/utils/validators.js","webpack://misago/./node_modules/moment/locale/ sync ^\\.\\/.*$","webpack://misago/webpack/bootstrap","webpack://misago/webpack/runtime/compat get default export","webpack://misago/webpack/runtime/define property getters","webpack://misago/webpack/runtime/ensure chunk","webpack://misago/webpack/runtime/get javascript chunk filename","webpack://misago/webpack/runtime/get mini-css chunk filename","webpack://misago/webpack/runtime/global","webpack://misago/webpack/runtime/harmony module decorator","webpack://misago/webpack/runtime/hasOwnProperty shorthand","webpack://misago/webpack/runtime/make namespace object","webpack://misago/webpack/runtime/node module decorator","webpack://misago/webpack/runtime/publicPath","webpack://misago/webpack/runtime/jsonp chunk loading","webpack://misago/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"misago:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import React from \"react\"\n\nexport default class ApiFetch extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n data: null,\n loading: false,\n error: null,\n }\n\n this.controller = new AbortController()\n this.signal = this.controller.signal\n }\n\n componentDidMount() {\n if (this.props.url && !this.props.disabled) {\n this.request(this.props.url)\n }\n }\n\n componentDidUpdate(prevProps) {\n const url = this.props.url\n const urlChanged = url && url !== prevProps.url\n const disabledChanged = this.props.disabled != prevProps.disabled\n\n if (urlChanged || disabledChanged) {\n if (!this.props.disabled) {\n if (this.hasCache(url)) {\n this.getCache(url)\n } else {\n this.controller.abort()\n\n this.controller = new AbortController()\n this.signal = this.controller.signal\n this.request(url)\n }\n } else {\n this.controller.abort()\n }\n }\n }\n\n componentWillUnmount() {\n this.controller.abort()\n }\n\n hasCache = (url) => {\n return this.props.cache && this.props.cache[url]\n }\n\n getCache = async (url) => {\n const data = this.props.cache[url]\n this.setState({ loading: false, error: null, data })\n if (this.props.onData) {\n await this.props.onData(data)\n }\n }\n\n setCache = (url, data) => {\n if (this.props.cache) {\n this.props.cache[url] = data\n }\n }\n\n request = (url) => {\n this.setState({ loading: true })\n\n fetch(url, {\n method: \"GET\",\n credentials: \"include\",\n signal: this.signal,\n }).then(\n async (response) => {\n if (url === this.props.url) {\n if (response.status == 200) {\n const data = await response.json()\n this.setState({ loading: false, error: null, data })\n this.setCache(url, data)\n if (this.props.onData) {\n await this.props.onData(data)\n }\n } else {\n const error = { status: response.status }\n if (response.headers.get(\"Content-Type\") === \"application/json\") {\n error.data = await response.json()\n }\n this.setState({ loading: false, error })\n }\n }\n },\n (rejection) => {\n if (url === this.props.url) {\n this.setState({ loading: false, error: { status: 0, rejection } })\n }\n }\n )\n }\n\n refetch = () => {\n this.request(this.props.url)\n }\n\n update = (mutation) => {\n this.setState((state) => {\n return { data: mutation(state.data) }\n })\n }\n\n render() {\n return this.props.children(\n Object.assign({ refetch: this.refetch, update: this.update }, this.state)\n )\n }\n}\n","import React from \"react\"\n\nexport default class ApiMutation extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n data: null,\n loading: false,\n error: null,\n }\n }\n\n mutate = (options) => {\n this.setState({ loading: true })\n\n fetch(this.props.url, {\n method: this.props.method || \"POST\",\n credentials: \"include\",\n headers: headers(options),\n body: body(options),\n }).then(\n async (response) => {\n if (response.status == 200) {\n const data = await response.json()\n this.setState({ loading: false, data })\n if (options.onSuccess) {\n await options.onSuccess(data)\n }\n } else if (response.status == 204) {\n this.setState({ loading: false })\n if (options.onSuccess) {\n await options.onSuccess()\n }\n } else {\n const error = { status: response.status }\n if (response.headers.get(\"Content-Type\") === \"application/json\") {\n error.data = await response.json()\n }\n this.setState({ loading: false, error })\n if (options.onError) {\n await options.onError(error)\n }\n }\n },\n async (rejection) => {\n const error = { status: 0, rejection }\n this.setState({ loading: false, error })\n if (options.onError) {\n await options.onError(error)\n }\n }\n )\n }\n\n render() {\n return this.props.children(this.mutate, this.state)\n }\n}\n\nfunction headers(options) {\n if (!!options.json) {\n return {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-CSRFToken\": csrfToken(),\n }\n }\n\n return {\n \"X-CSRFToken\": csrfToken(),\n }\n}\n\nfunction body(options) {\n if (!!options.json) {\n return JSON.stringify(options.json)\n }\n\n return undefined\n}\n\nfunction csrfToken() {\n const cookieName = window.misago_csrf\n\n if (document.cookie.indexOf(cookieName) !== -1) {\n const cookieRegex = new RegExp(cookieName + \"=([^;]*)\")\n const cookie = document.cookie.match(cookieRegex)[0]\n return cookie ? cookie.split(\"=\")[1] : null\n } else {\n return null\n }\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default class Dropdown extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isOpen: false,\n }\n\n this.root = null\n this.dropdown = null\n }\n\n componentDidMount() {\n window.addEventListener(\"click\", this.handleClick)\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"click\", this.handleClick)\n }\n\n componentDidUpdate(prevProps, prevState) {\n const didUpdate = prevState.isOpen !== this.state.isOpen\n if (didUpdate) {\n if (this.state.isOpen && this.props.onOpen) {\n this.props.onOpen(this.root)\n }\n\n if (!this.state.isOpen && this.props.onClose) {\n this.props.onClose(this.root)\n }\n }\n }\n\n handleClick = (event) => {\n if (\n this.state.isOpen &&\n (!this.root.contains(event.target) ||\n (this.menu.contains(event.target) && event.target.closest(\"a\")))\n ) {\n this.setState({ isOpen: false })\n }\n }\n\n toggle = () => {\n this.setState((prevState) => {\n return { isOpen: !prevState.isOpen }\n })\n }\n\n close = () => {\n this.setState({ isOpen: false })\n }\n\n render() {\n const { isOpen } = this.state\n\n return (\n {\n if (element && !this.element) {\n this.root = element\n }\n }}\n >\n {this.props.toggle({\n isOpen,\n toggle: this.toggle,\n aria: ariaProps(isOpen),\n })}\n {\n if (element && !this.menu) {\n this.menu = element\n }\n }}\n role=\"menu\"\n >\n {this.props.children({ isOpen, close: this.close })}\n
    \n
    \n )\n }\n}\n\nfunction ariaProps(isOpen) {\n return {\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isOpen ? \"true\" : \"false\",\n }\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownDivider({ className }) {\n return
  • \n}\n","import React from \"react\"\n\nexport default function DropdownFooter({ children, listItem }) {\n if (listItem) {\n return
  • {children}
  • \n }\n\n return
    {children}
    \n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownHeader({ className, children }) {\n return (\n
    {children}
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownMenuItem({ className, children }) {\n return (\n
  • {children}
  • \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownPills({ className, children }) {\n return (\n
    {children}
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownSubheader({ className, children }) {\n return (\n
  • {children}
  • \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRow = ({ children, className }) => (\n
    {children}
    \n)\n\nexport default FlexRow\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRowCol = ({ children, className, shrink }) => (\n \n {children}\n
    \n)\n\nexport default FlexRowCol\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRowSection = ({ auto, children, className }) => (\n \n {children}\n
    \n)\n\nexport default FlexRowSection\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function ListGroup({ className, children }) {\n return
      {children}
    \n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function ListGroupItem({ className, children }) {\n return (\n
  • {children}
  • \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupEmpty({ className, icon, message }) {\n return (\n \n {!!icon && (\n
    \n {icon}\n
    \n )}\n

    {message}

    \n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupError({ className, icon, message, detail }) {\n return (\n \n {!!icon && (\n
    \n {icon}\n
    \n )}\n

    {message}

    \n {!!detail &&

    {detail}

    }\n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupLoading({ className, message }) {\n return (\n \n

    {message}

    \n
    \n
    \n
    \n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupMessage({ className, icon, message, detail }) {\n return (\n \n {!!icon && (\n
    \n {icon}\n
    \n )}\n

    {message}

    \n {!!detail &&

    {detail}

    }\n
    \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { updateAuthenticatedUser } from \"../../reducers/auth\"\nimport { ApiFetch } from \"../Api\"\n\nfunction NotificationsFetch({\n children,\n filter,\n query,\n dispatch,\n unreadNotifications,\n disabled,\n}) {\n return (\n {\n if (data.unreadNotifications != unreadNotifications) {\n dispatch(\n updateAuthenticatedUser({\n unreadNotifications: data.unreadNotifications,\n })\n )\n }\n }}\n >\n {({ data, loading, error, refetch }) => {\n return children({ data, loading, error, refetch })\n }}\n \n )\n}\n\nfunction getApiUrl(filter, query) {\n let api = misago.get(\"NOTIFICATIONS_API\") + \"?limit=30\"\n api += \"&filter=\" + filter\n\n if (query) {\n if (query.after) {\n api += \"&after=\" + query.after\n }\n if (query.before) {\n api += \"&before=\" + query.before\n }\n }\n\n return api\n}\n\nfunction selectState({ auth }) {\n if (!auth.user) {\n return { unreadNotifications: null }\n }\n\n return {\n unreadNotifications: auth.user.unreadNotifications,\n }\n}\n\nconst NotificationsFetchConnected = connect(selectState)(NotificationsFetch)\n\nexport default NotificationsFetchConnected\n","import NotificationsFetch from \"./NotificationsFetch\"\n\nexport default NotificationsFetch\n","import React from \"react\"\nimport { ListGroupEmpty } from \"../ListGroup\"\n\nexport default function NotificationsListEmpty({ filter }) {\n return (\n \n )\n}\n\nfunction emptyMessage(filter) {\n if (filter === \"read\") {\n return pgettext(\n \"notifications list\",\n \"You don't have any read notifications.\"\n )\n } else if (filter === \"unread\") {\n return pgettext(\n \"notifications list\",\n \"You don't have any unread notifications.\"\n )\n }\n\n return pgettext(\"notifications list\", \"You don't have any notifications.\")\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { ListGroup } from \"../ListGroup\"\n\nexport default function NotificationsListGroup({ className, children }) {\n return (\n
    \n {children}\n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"../avatar\"\n\nexport default function NotificationsListItemActor({ notification }) {\n if (!!notification.actor) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NotificationsListItemMessage({ notification }) {\n return (\n \n )\n}\n","import React from \"react\"\n\nexport default function NotificationsListItemReadStatus({ notification }) {\n if (notification.isRead) {\n return (\n \n \n
    \n )\n }\n\n return (\n \n \n
    \n )\n}\n","import React from \"react\"\nimport Timestamp from \"../Timestamp\"\n\nexport default function NotificationsListItemTimestamp({ notification }) {\n return (\n
    \n \n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport NotificationsListItemActor from \"./NotificationsListItemActor\"\nimport NotificationsListItemMessage from \"./NotificationsListItemMessage\"\nimport NotificationsListItemReadStatus from \"./NotificationsListItemReadStatus\"\nimport NotificationsListItemTimestamp from \"./NotificationsListItemTimestamp\"\n\nexport default function NotificationsListItem({ notification }) {\n return (\n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n )\n}\n","import React from \"react\"\nimport NotificationsListEmpty from \"./NotificationsListEmpty\"\nimport NotificationsListGroup from \"./NotificationsListGroup\"\nimport NotificationsListItem from \"./NotificationsListItem\"\n\nexport default function NotificationsList({ filter, items }) {\n return (\n 0\n ? \"notifications-list-ready\"\n : \"notifications-list-pending\"\n }\n >\n {items.length === 0 && }\n {items.map((notification) => (\n \n ))}\n \n )\n}\n","import React from \"react\"\nimport { ListGroupError } from \"../ListGroup\"\nimport NotificationsListGroup from \"./NotificationsListGroup\"\n\nexport default function NotificationsListError({ error }) {\n const detail = errorDetail(error)\n\n return (\n \n \n \n )\n}\n\nfunction errorDetail(error) {\n if (error.status === 0) {\n return gettext(\n \"Check your internet connection and try refreshing the site.\"\n )\n }\n\n if (error.data && error.data.detail) {\n return error.data.detail\n }\n}\n","import React from \"react\"\nimport { ListGroupLoading } from \"../ListGroup\"\nimport NotificationsListGroup from \"./NotificationsListGroup\"\n\nexport default function NotificationsListLoading() {\n return (\n \n \n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\n\nconst BODY_CLASS = \"has-overlay\"\n\nclass Overlay extends React.Component {\n constructor(props) {\n super(props)\n\n this.scrollOrigin = null\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.open !== this.props.open) {\n if (this.props.open) {\n this.scrollOrigin = window.pageYOffset\n document.body.classList.add(BODY_CLASS)\n if (this.props.onOpen) {\n this.props.onOpen()\n }\n } else {\n document.body.classList.remove(BODY_CLASS)\n window.scrollTo(0, this.scrollOrigin)\n this.scrollOrigin = null\n }\n }\n }\n\n closeOnNavigation = (event) => {\n if (event.target.closest(\"a\")) {\n this.props.dispatch(close())\n }\n }\n\n render() {\n return (\n \n {this.props.children}\n \n )\n }\n}\n\nconst OverlayConnected = connect()(Overlay)\n\nexport default OverlayConnected\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\n\nexport function OverlayHeader({ children, dispatch }) {\n return (\n
    \n
    {children}
    \n dispatch(close())}\n >\n close\n \n
    \n )\n}\n\nconst OverlayHeaderConnected = connect()(OverlayHeader)\n\nexport default OverlayHeaderConnected\n","import React from \"react\"\n\nconst PageContainer = ({ children }) => (\n
    {children}
    \n)\n\nexport default PageContainer\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeader = ({ children, className, styleName }) => (\n \n
    \n
    \n
    \n {children}\n
    \n
    \n
    \n)\n\nexport default PageHeader\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderBanner = ({ children, className, styleName }) => (\n \n
    \n
    {children}
    \n
    \n \n)\n\nexport default PageHeaderBanner\n","import React from \"react\"\n\nconst PageHeaderContainer = ({ children }) => (\n
    {children}
    \n)\n\nexport default PageHeaderContainer\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderDetails = ({ children, className }) => (\n
    {children}
    \n)\n\nexport default PageHeaderDetails\n","import React from \"react\"\nimport PageHeader from \"./PageHeader\"\nimport PageHeaderBanner from \"./PageHeaderBanner\"\nimport PageHeaderContainer from \"./PageHeaderContainer\"\nimport PageHeaderDetails from \"./PageHeaderDetails\"\n\nconst PageHeaderPlain = ({ styleName, header, message }) => (\n \n \n \n

    {header}

    \n
    \n {message && (\n {message}\n )}\n
    \n
    \n)\n\nexport default PageHeaderPlain\n","import React from \"react\"\nimport zxcvbn from \"misago/services/zxcvbn\"\n\nexport const STYLES = [\n \"progress-bar-danger\",\n \"progress-bar-warning\",\n \"progress-bar-warning\",\n \"progress-bar-primary\",\n \"progress-bar-success\",\n]\n\nexport const LABELS = [\n pgettext(\"password strength indicator\", \"Entered password is very weak.\"),\n pgettext(\"password strength indicator\", \"Entered password is weak.\"),\n pgettext(\"password strength indicator\", \"Entered password is average.\"),\n pgettext(\"password strength indicator\", \"Entered password is strong.\"),\n pgettext(\"password strength indicator\", \"Entered password is very strong.\"),\n]\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this._score = 0\n this._password = null\n this._inputs = []\n\n this.state = {\n loaded: false,\n }\n }\n\n componentDidMount() {\n zxcvbn.load().then(() => {\n this.setState({ loaded: true })\n })\n }\n\n getScore(password, inputs) {\n let cacheStale = false\n\n if (password !== this._password) {\n cacheStale = true\n }\n\n if (inputs.length !== this._inputs.length) {\n cacheStale = true\n } else {\n inputs.map((value, i) => {\n if (value.trim() !== this._inputs[i]) {\n cacheStale = true\n }\n })\n }\n\n if (cacheStale) {\n this._score = zxcvbn.scorePassword(password, inputs)\n this._password = password\n this._inputs = inputs.map(function (value) {\n return value.trim()\n })\n }\n\n return this._score\n }\n\n render() {\n if (!this.state.loaded) return null\n\n let score = this.getScore(this.props.password, this.props.inputs)\n\n return (\n
    \n
    \n \n {LABELS[score]}\n
    \n
    \n

    {LABELS[score]}

    \n \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport PasswordStrength from \"misago/components/password-strength\"\nimport RegisterLegalFootnote from \"misago/components/RegisterLegalFootnote\"\nimport StartSocialAuth from \"misago/components/StartSocialAuth\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport auth from \"misago/services/auth\"\nimport captcha from \"misago/services/captcha\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\nimport * as validators from \"misago/utils/validators\"\n\nexport class RegisterForm extends Form {\n constructor(props) {\n super(props)\n\n const { username, password } = this.props.criteria\n\n let passwordMinLength = 0\n password.forEach((item) => {\n if (item.name === \"MinimumLengthValidator\") {\n passwordMinLength = item.min_length\n }\n })\n\n const formValidators = {\n username: [\n validators.usernameContent(),\n validators.usernameMinLength(username.min_length),\n validators.usernameMaxLength(username.max_length),\n ],\n email: [validators.email()],\n password: [validators.passwordMinLength(passwordMinLength)],\n captcha: captcha.validator(),\n }\n\n if (!!misago.get(\"TERMS_OF_SERVICE_ID\")) {\n formValidators.termsOfService = [validators.requiredTermsOfService()]\n }\n\n if (!!misago.get(\"PRIVACY_POLICY_ID\")) {\n formValidators.privacyPolicy = [validators.requiredPrivacyPolicy()]\n }\n\n this.state = {\n isLoading: false,\n\n username: \"\",\n email: \"\",\n password: \"\",\n captcha: \"\",\n\n termsOfService: null,\n privacyPolicy: null,\n\n validators: formValidators,\n errors: {},\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"USERS_API\"), {\n username: this.state.username,\n email: this.state.email,\n password: this.state.password,\n captcha: this.state.captcha,\n terms_of_service: this.state.termsOfService,\n privacy_policy: this.state.privacyPolicy,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n\n if (rejection.__all__ && rejection.__all__.length > 0) {\n snackbar.error(rejection.__all__[0])\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n }\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n modal.hide()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n handlePrivacyPolicyChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"privacyPolicy\", value)\n }\n\n handleTermsOfServiceChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"termsOfService\", value)\n }\n\n handleToggleAgreement = (agreement, value) => {\n this.setState((prevState, props) => {\n if (prevState[agreement] === null) {\n const errors = { ...prevState.errors, [agreement]: null }\n return { errors, [agreement]: value }\n }\n\n const validator = this.state.validators[agreement][0]\n const errors = { ...prevState.errors, [agreement]: [validator(null)] }\n return { errors, [agreement]: null }\n })\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"register modal title\", \"Register\")}\n

    \n
    \n
    \n \n \n
    \n \n\n \n \n \n\n \n \n \n\n \n }\n >\n \n \n\n {captcha.component({\n form: this,\n })}\n\n \n
    \n
    \n \n {pgettext(\"register modal btn\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport class RegisterComplete extends React.Component {\n getLead() {\n if (this.props.activation === \"user\") {\n return pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\"\n )\n } else if (this.props.activation === \"admin\") {\n return pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but the site administrator will have to activate it before you will be able to sign in.\"\n )\n }\n }\n\n getSubscript() {\n if (this.props.activation === \"user\") {\n return pgettext(\n \"account activation required\",\n \"We have sent an e-mail to %(email)s with link that you have to click to activate your account.\"\n )\n } else if (this.props.activation === \"admin\") {\n return pgettext(\n \"account activation required\",\n \"We will send an e-mail to %(email)s when this takes place.\"\n )\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"register modal title\", \"Registration complete\")}\n

    \n
    \n
    \n
    \n info_outline\n
    \n
    \n

    \n {interpolate(\n this.getLead(),\n { username: this.props.username },\n true\n )}\n

    \n

    \n {interpolate(\n this.getSubscript(),\n { email: this.props.email },\n true\n )}\n

    \n \n {pgettext(\"register modal dismiss\", \"Ok\")}\n \n
    \n
    \n
    \n \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n completeRegistration = (apiResponse) => {\n if (apiResponse.activation === \"active\") {\n modal.hide()\n auth.signIn(apiResponse)\n } else {\n this.setState({\n complete: apiResponse,\n })\n }\n }\n\n render() {\n if (this.state.complete) {\n return (\n \n )\n }\n\n return \n }\n}\n","import RegisterButton from \"./RegisterButton\"\n\nexport default RegisterButton\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ajax from \"../../services/ajax\"\nimport captcha from \"../../services/captcha\"\nimport modal from \"../../services/modal\"\nimport snackbar from \"../../services/snackbar\"\nimport Loader from \"../loader\"\nimport RegisterForm from \"../register.js\"\n\nexport default class RegisterButton extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n isLoaded: false,\n\n criteria: null,\n }\n }\n\n showRegisterForm = () => {\n if (this.props.onClick) {\n this.props.onClick()\n }\n\n if (misago.get(\"SETTINGS\").account_activation === \"closed\") {\n snackbar.info(\n pgettext(\n \"register form\",\n \"Registration form is currently disabled by the site administrator.\"\n )\n )\n } else if (this.state.isLoaded) {\n modal.show()\n } else {\n this.setState({ isLoading: true })\n\n Promise.all([\n captcha.load(),\n ajax.get(misago.get(\"AUTH_CRITERIA_API\")),\n ]).then(\n (result) => {\n this.setState({\n isLoading: false,\n isLoaded: true,\n criteria: result[1],\n })\n\n modal.show()\n },\n () => {\n this.setState({ isLoading: false })\n\n snackbar.error(\n pgettext(\n \"register form\",\n \"Registration form is currently unavailable due to an error.\"\n )\n )\n }\n )\n }\n }\n\n render() {\n return (\n \n {pgettext(\"cta\", \"Register\")}\n {this.state.isLoading ? : null}\n \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst AGREEMENT_URL = '%(agreement)s'\n\nconst RegisterLegalFootnote = (props) => {\n const {\n errors,\n privacyPolicy,\n termsOfService,\n onPrivacyPolicyChange,\n onTermsOfServiceChange,\n } = props\n\n const termsOfServiceId = misago.get(\"TERMS_OF_SERVICE_ID\")\n const termsOfServiceUrl = misago.get(\"TERMS_OF_SERVICE_URL\")\n\n const privacyPolicyId = misago.get(\"PRIVACY_POLICY_ID\")\n const privacyPolicyUrl = misago.get(\"PRIVACY_POLICY_URL\")\n\n if (!termsOfServiceId && !privacyPolicyId) return null\n\n return (\n
    \n \n \n
    \n )\n}\n\nconst LegalAgreement = (props) => {\n const { agreement, checked, errors, url, value, onChange } = props\n\n if (!url) return null\n\n const agreementHtml = interpolate(\n AGREEMENT_URL,\n { agreement: escapeHtml(agreement), url: escapeHtml(url) },\n true\n )\n const label = interpolate(\n pgettext(\n \"register form agreement prompt\",\n \"I have read and accept %(agreement)s.\"\n ),\n { agreement: agreementHtml },\n true\n )\n\n return (\n
    \n \n {errors &&\n errors.map((error, i) => (\n
    \n {error}\n
    \n ))}\n
    \n )\n}\n\nexport default RegisterLegalFootnote\n","import React from \"react\"\nimport { ListGroup } from \"../ListGroup\"\n\nexport default function SearchResultsList({ children }) {\n return {children}\n}\n","import React from \"react\"\nimport { ListGroupMessage } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchMessage() {\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport Timestamp from \"../Timestamp\"\n\nexport default function SearchResultPost({ post }) {\n return (\n \n \n
    \n
    {post.thread.title}
    \n \n
      \n
    • \n {post.category.name}\n
    • \n
    • {post.poster ? post.poster.username : post.poster_name}
    • \n
    • \n \n
    • \n
    \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"../avatar\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport Timestamp from \"../Timestamp\"\n\nexport default function SearchResultUser({ user }) {\n const title = user.title || user.rank.title\n\n return (\n \n \n \n
    \n
    {user.username}
    \n
      \n {!!title && (\n
    • \n {title}\n
    • \n )}\n
    • {user.rank.name}
    • \n
    • \n \n
    • \n
    \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\nimport SearchResultPost from \"./SearchResultPost\"\nimport SearchResultUser from \"./SearchResultUser\"\n\nexport default function SearchResults({ query, results }) {\n const threads = results[0]\n const users = results[1]\n\n const { count } = threads.results\n\n return (\n \n {users.results.results.map((user) => (\n \n ))}\n {threads.results.results.map((post) => (\n \n ))}\n {count > 0 && (\n \n \n {npgettext(\n \"search results list\",\n \"See all %(count)s result.\",\n \"See all %(count)s results.\",\n threads.results.count\n ).replace(\"%(count)s\", threads.results.count)}\n \n \n )}\n \n )\n}\n","import React from \"react\"\nimport { ListGroupEmpty } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchResultsEmpty() {\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport { ListGroupError } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchResultsError({ error }) {\n return (\n \n \n \n )\n}\n\nfunction errorDetail(error) {\n if (error.status === 0) {\n return gettext(\n \"Check your internet connection and try refreshing the site.\"\n )\n }\n\n if (error.data && error.data.detail) {\n return error.data.detail\n }\n}\n","import React from \"react\"\nimport { ListGroupLoading } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchResultsLoading() {\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport { ApiFetch } from \"../Api\"\nimport SearchMessage from \"./SearchMessage\"\nimport SearchResults from \"./SearchResults\"\nimport SearchResultsEmpty from \"./SearchResultsEmpty\"\nimport SearchResultsError from \"./SearchResultsError\"\nimport SearchResultsLoading from \"./SearchResultsLoading\"\n\nconst DEBOUNCE = 750\nconst CACHE = {}\n\nexport default class SearchFetch extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n query: this.props.query.trim(),\n }\n\n this.debounce = null\n }\n\n componentDidUpdate() {\n const query = this.props.query.trim()\n\n if (this.state.query != query) {\n if (this.debounce) {\n window.clearTimeout(this.debounce)\n }\n\n this.debounce = window.setTimeout(() => {\n this.setState({ query })\n }, DEBOUNCE)\n }\n }\n\n componentWillUnmount() {\n if (this.debounce) {\n window.clearTimeout(this.debounce)\n }\n }\n\n render() {\n return (\n \n {({ data, loading, error }) => {\n if (this.state.query.length < 3) {\n return \n }\n\n if (loading) {\n return \n }\n\n if (error) {\n return \n }\n\n if (isResultEmpty(data)) {\n return \n }\n\n if (data !== null) {\n return \n }\n\n return null\n }}\n \n )\n }\n}\n\nfunction getSearchUrl(query) {\n return misago.get(\"SEARCH_API\") + \"?q=\" + encodeURIComponent(query)\n}\n\nfunction isResultEmpty(results) {\n if (results === null) {\n return true\n }\n\n let resultsCount = 0\n results.forEach((result) => {\n resultsCount += result.results.count\n })\n return resultsCount === 0\n}\n","import React from \"react\"\n\nexport default function SearchInput({ query, setQuery }) {\n return (\n
    \n setQuery(event.target.value)}\n />\n
    \n )\n}\n","import React from \"react\"\n\nexport default class SearchQuery extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n query: \"\",\n }\n }\n\n setQuery = (query) => {\n this.setState({ query })\n }\n\n render() {\n return this.props.children({\n query: this.state.query,\n setQuery: this.setQuery,\n })\n }\n}\n","import React from \"react\"\nimport SearchFetch from \"./SearchFetch\"\nimport SearchInput from \"./SearchInput\"\nimport SearchQuery from \"./SearchQuery\"\n\nexport default function SearchDropdown() {\n return (\n \n {({ query, setQuery }) => {\n return (\n
    \n \n \n
    \n )\n }}\n
    \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\nimport SearchFetch from \"./SearchFetch\"\nimport SearchInput from \"./SearchInput\"\nimport SearchQuery from \"./SearchQuery\"\n\nfunction SearchOverlay({ open }) {\n return (\n {\n window.setTimeout(() => {\n document.querySelector(\"#search-mount .form-control-search\").focus()\n }, 0)\n }}\n >\n {pgettext(\"cta\", \"Search\")}\n \n {({ query, setQuery }) => {\n return (\n
    \n \n
    \n \n
    \n
    \n )\n }}\n
    \n \n )\n}\n\nfunction select(state) {\n return { open: state.overlay.search }\n}\n\nconst SearchOverlayConnected = connect(select)(SearchOverlay)\n\nexport default SearchOverlayConnected\n","import SignInButton from \"./SignInButton\"\n\nexport default SignInButton\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport modal from \"../../services/modal\"\nimport SignInModal from \"../sign-in\"\n\nexport default function SignInButton({ block, className, onClick }) {\n const settings = misago.get(\"SETTINGS\")\n\n if (settings.DELEGATE_AUTH) {\n return (\n {\n if (onClick) {\n onClick()\n }\n }}\n >\n {pgettext(\"cta\", \"Sign in\")}\n \n )\n }\n\n return (\n {\n event.preventDefault()\n\n if (onClick) {\n onClick()\n }\n\n modal.show()\n }}\n >\n {pgettext(\"cta\", \"Sign in\")}\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport {\n DropdownDivider,\n DropdownHeader,\n DropdownMenuItem,\n DropdownPills,\n DropdownSubheader,\n} from \"../Dropdown\"\nimport RegisterButton from \"../RegisterButton\"\nimport SignInButton from \"../SignInButton\"\n\nfunction SiteNavMenu({ isAnonymous, close, dropdown, overlay }) {\n const baseUrl = misago.get(\"MISAGO_PATH\")\n const settings = misago.get(\"SETTINGS\")\n const mainItems = misago.get(\"main_menu\")\n const extraItems = misago.get(\"extraMenuItems\")\n const extraFooterItems = misago.get(\"extraFooterItems\")\n const categories = misago.get(\"categories_menu\")\n const users = misago.get(\"usersLists\")\n const authDelegated = settings.enable_oauth2_client\n\n const topNav = []\n mainItems.forEach((item) => {\n topNav.push({ title: item.label, url: item.url })\n })\n\n topNav.push({\n title: pgettext(\"site nav\", \"Search\"),\n url: baseUrl + \"search/\",\n })\n\n const footerNav = []\n\n const tosTitle = misago.get(\"TERMS_OF_SERVICE_TITLE\")\n const tosUrl = misago.get(\"TERMS_OF_SERVICE_URL\")\n if (tosTitle && tosUrl) {\n footerNav.push({\n title: tosTitle,\n url: tosUrl,\n })\n }\n\n const privacyTitle = misago.get(\"PRIVACY_POLICY_TITLE\")\n const privacyUrl = misago.get(\"PRIVACY_POLICY_URL\")\n if (privacyTitle && privacyUrl) {\n footerNav.push({\n title: privacyTitle,\n url: privacyUrl,\n })\n }\n\n return (\n \n {isAnonymous && (\n \n {pgettext(\"cta\", \"You are not signed in\")}\n \n )}\n {isAnonymous && (\n \n \n {!authDelegated && }\n \n )}\n {settings.forum_name}\n {topNav.map((item) => (\n \n {item.title}\n \n ))}\n {extraItems.map((item, index) => (\n \n \n {item.title}\n \n \n ))}\n {!!users.length && }\n {!!users.length && (\n \n {pgettext(\"site nav section\", \"Users\")}\n \n )}\n {users.map((item) => (\n \n {item.name}\n \n ))}\n \n \n {pgettext(\"site nav section\", \"Categories\")}\n \n {categories.map((category) =>\n category.is_vanilla ? (\n \n {category.name}\n \n ) : (\n \n \n {category.name}\n \n {category.short_name || category.name}\n \n \n \n )\n )}\n {(!!footerNav.length || !!extraFooterItems.length) && (\n \n )}\n {(!!footerNav.length || !!extraFooterItems.length) && (\n \n {pgettext(\"site nav section\", \"Footer\")}\n \n )}\n {extraFooterItems.map((item, index) => (\n \n \n {item.title}\n \n \n ))}\n {footerNav.map((item) => (\n \n {item.title}\n \n ))}\n \n )\n}\n\nfunction select(state) {\n return {\n isAnonymous: !state.auth.user.id,\n }\n}\n\nconst SiteNavMenuConnected = connect(select)(SiteNavMenu)\n\nexport default SiteNavMenuConnected\n","import React from \"react\"\nimport SiteNavMenu from \"./SiteNavMenu\"\n\nexport default function SiteNavDropdown({ close }) {\n return \n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\nimport SiteNavMenu from \"./SiteNavMenu\"\n\nexport function SiteNavOverlay({ dispatch, isOpen }) {\n return (\n \n {pgettext(\"site nav title\", \"Menu\")}\n dispatch(close())} overlay />\n \n )\n}\n\nfunction select(state) {\n return {\n isOpen: state.overlay.siteNav,\n }\n}\n\nconst SiteNavOverlayConnected = connect(select)(SiteNavOverlay)\n\nexport default SiteNavOverlayConnected\n","import React from \"react\"\nimport misago from \"misago\"\n\nconst StartSocialAuth = (props) => {\n const { buttonClassName, buttonLabel, formLabel, header, labelClassName } =\n props\n const socialAuth = misago.get(\"SOCIAL_AUTH\")\n\n if (socialAuth.length === 0) return null\n\n return (\n
    \n \n
    \n {socialAuth.map(({ pk, name, button_text, button_color, url }) => {\n const className = \"btn btn-block btn-default btn-social-\" + pk\n const style = button_color ? { color: button_color } : null\n const finalButtonLabel =\n button_text || interpolate(buttonLabel, { site: name }, true)\n\n return (\n \n )\n })}\n
    \n
    \n \n
    \n )\n}\n\nconst FormHeader = ({ className, text }) => {\n if (!text) return null\n return
    {text}
    \n}\n\nexport default StartSocialAuth\n","import React from \"react\"\nimport { dateRelative, dateRelativeShort, fullDateTime } from \"../../formats\"\n\nclass Timestamp extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = { tick: 0 }\n this.date = new Date(props.datetime)\n this.timeout = null\n }\n\n componentDidMount() {\n this.scheduleNextUpdate()\n }\n\n componentWillUnmount() {\n if (this.timeout) {\n window.clearTimeout(this.timeout)\n }\n }\n\n scheduleNextUpdate = () => {\n const now = new Date()\n const diff = Math.ceil(Math.abs(Math.round((this.date - now) / 1000)))\n\n if (diff < 3600) {\n this.timeout = window.setTimeout(\n () => {\n this.setState(tick)\n this.scheduleNextUpdate()\n },\n 50 * 1000 // Update every 50 seconds\n )\n } else if (diff < 3600 * 24) {\n this.timeout = window.setTimeout(\n () => {\n this.setState(tick)\n },\n 40 * 60 * 1000 // Update every 40 minutes\n )\n }\n }\n\n render() {\n const displayed = this.props.narrow\n ? dateRelativeShort(this.date)\n : dateRelative(this.date)\n\n return (\n \n {displayed}\n \n )\n }\n}\n\nfunction tick(state) {\n return { tick: state.tick + 1 }\n}\n\nexport default Timestamp\n","import Timestamp from \"./Timestamp\"\n\nexport default Timestamp\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst Toolbar = ({ children, className }) => (\n \n)\n\nexport default Toolbar\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarItem = ({ children, className, shrink }) => (\n \n {children}\n \n)\n\nexport default ToolbarItem\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarSection = ({ auto, children, className }) => (\n \n {children}\n \n)\n\nexport default ToolbarSection\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarSpacer = ({ className }) => (\n
    \n)\n\nexport default ToolbarSpacer\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport Loader from \"misago/components/loader\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n callApi(avatarType) {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: avatarType,\n })\n .then(\n (response) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.success(response.detail)\n this.props.onComplete(response)\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n setGravatar = () => {\n this.callApi(\"gravatar\")\n }\n\n setGenerated = () => {\n this.callApi(\"generated\")\n }\n\n getGravatarButton() {\n if (this.props.options.gravatar) {\n return (\n \n {pgettext(\"avatar modal btn\", \"Download my Gravatar\")}\n \n )\n } else {\n return null\n }\n }\n\n getCropButton() {\n if (!this.props.options.crop_src) return null\n\n return (\n \n {pgettext(\"avatar modal btn\", \"Re-crop uploaded image\")}\n \n )\n }\n\n getUploadButton() {\n if (!this.props.options.upload) return null\n\n return (\n \n {pgettext(\"avatar modal btn\", \"Upload new image\")}\n \n )\n }\n\n getGalleryButton() {\n if (!this.props.options.galleries) return null\n\n return (\n \n {pgettext(\"avatar modal btn\", \"Pick avatar from gallery\")}\n \n )\n }\n\n getAvatarPreview() {\n let userPeview = {\n id: this.props.user.id,\n avatars: this.props.options.avatars,\n }\n\n if (this.state.isLoading) {\n return (\n
    \n \n \n
    \n )\n }\n\n return (\n
    \n \n
    \n )\n }\n\n render() {\n return (\n
    \n
    \n
    {this.getAvatarPreview()}
    \n
    \n {this.getGravatarButton()}\n\n \n {pgettext(\"avatar modal btn\", \"Generate my individual avatar\")}\n \n\n {this.getCropButton()}\n {this.getUploadButton()}\n {this.getGalleryButton()}\n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n deviceRatio: 1,\n }\n }\n\n getAvatarSize() {\n if (this.props.upload) {\n return this.props.options.crop_tmp.size\n } else {\n return this.props.options.crop_src.size\n }\n }\n\n getImagePath() {\n if (this.props.upload) {\n return this.props.dataUrl\n } else {\n return this.props.options.crop_src.url\n }\n }\n\n componentDidMount() {\n let cropit = $(\".crop-form\")\n let cropperWidth = this.getAvatarSize()\n\n const initialWidth = cropit.width()\n while (initialWidth < cropperWidth) {\n cropperWidth = cropperWidth / 2\n }\n\n const deviceRatio = this.getAvatarSize() / cropperWidth\n\n cropit.width(cropperWidth)\n\n cropit.cropit({\n width: cropperWidth,\n height: cropperWidth,\n exportZoom: deviceRatio,\n imageState: {\n src: this.getImagePath(),\n },\n onImageLoaded: () => {\n if (this.props.upload) {\n // center uploaded image\n let zoomLevel = cropit.cropit(\"zoom\")\n let imageSize = cropit.cropit(\"imageSize\")\n\n // is it wider than taller?\n if (imageSize.width > imageSize.height) {\n let displayedWidth = imageSize.width * zoomLevel\n let offsetX = (displayedWidth - this.getAvatarSize()) / -2\n\n cropit.cropit(\"offset\", {\n x: offsetX,\n y: 0,\n })\n } else if (imageSize.width < imageSize.height) {\n let displayedHeight = imageSize.height * zoomLevel\n let offsetY = (displayedHeight - this.getAvatarSize()) / -2\n\n cropit.cropit(\"offset\", {\n x: 0,\n y: offsetY,\n })\n } else {\n cropit.cropit(\"offset\", {\n x: 0,\n y: 0,\n })\n }\n } else {\n // use preserved crop\n let crop = this.props.options.crop_src.crop\n\n if (crop) {\n cropit.cropit(\"zoom\", crop.zoom)\n cropit.cropit(\"offset\", {\n x: crop.x,\n y: crop.y,\n })\n }\n }\n },\n })\n }\n\n componentWillUnmount() {\n $(\".crop-form\").cropit(\"disable\")\n }\n\n cropAvatar = () => {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n let avatarType = this.props.upload ? \"crop_tmp\" : \"crop_src\"\n let cropit = $(\".crop-form\")\n\n const deviceRatio = cropit.cropit(\"exportZoom\")\n const cropitOffset = cropit.cropit(\"offset\")\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: avatarType,\n crop: {\n offset: {\n x: cropitOffset.x * deviceRatio,\n y: cropitOffset.y * deviceRatio,\n },\n zoom: cropit.cropit(\"zoom\") * deviceRatio,\n },\n })\n .then(\n (data) => {\n this.props.onComplete(data)\n snackbar.success(data.detail)\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n {this.props.upload\n ? pgettext(\"avatar crop modal btn\", \"Set avatar\")\n : pgettext(\"avatar crop modal btn\", \"Crop image\")}\n \n\n \n {pgettext(\"avatar crop modal btn\", \"Cancel\")}\n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport AvatarCrop from \"misago/components/change-avatar/crop\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport fileSize from \"misago/utils/file-size\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n image: null,\n preview: null,\n progress: 0,\n uploaded: null,\n dataUrl: null,\n }\n }\n\n validateFile(image) {\n if (image.size > this.props.options.upload.limit) {\n return interpolate(\n pgettext(\n \"avatar upload modal\",\n \"Selected file is too big. (%(filesize)s)\"\n ),\n {\n filesize: fileSize(image.size),\n },\n true\n )\n }\n\n let invalidTypeMsg = pgettext(\n \"avatar upload modal\",\n \"Selected file type is not supported.\"\n )\n if (\n this.props.options.upload.allowed_mime_types.indexOf(image.type) === -1\n ) {\n return invalidTypeMsg\n }\n\n let extensionFound = false\n let loweredFilename = image.name.toLowerCase()\n this.props.options.upload.allowed_extensions.map(function (extension) {\n if (loweredFilename.substr(extension.length * -1) === extension) {\n extensionFound = true\n }\n })\n\n if (!extensionFound) {\n return invalidTypeMsg\n }\n\n return false\n }\n\n pickFile = () => {\n document.getElementById(\"avatar-hidden-upload\").click()\n }\n\n uploadFile = () => {\n let image = document.getElementById(\"avatar-hidden-upload\").files[0]\n if (!image) return\n\n let validationError = this.validateFile(image)\n if (validationError) {\n snackbar.error(validationError)\n return\n }\n\n this.setState({\n image,\n preview: URL.createObjectURL(image),\n progress: 0,\n })\n\n let data = new FormData()\n data.append(\"avatar\", \"upload\")\n data.append(\"image\", image)\n\n ajax\n .upload(this.props.user.api.avatar, data, (progress) => {\n this.setState({\n progress,\n })\n })\n .then(\n (data) => {\n this.setState({\n options: data,\n uploaded: data.detail,\n })\n\n snackbar.info(\n pgettext(\n \"avatar upload modal\",\n \"Your image has been uploaded and you may now crop it.\"\n )\n )\n },\n (rejection) => {\n if (rejection.status === 400 || rejection.status === 413) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n image: null,\n progress: 0,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n getUploadRequirements(options) {\n let extensions = options.allowed_extensions.map(function (extension) {\n return extension.substr(1)\n })\n\n return interpolate(\n pgettext(\"avatar upload modal\", \"%(files)s files smaller than %(limit)s\"),\n {\n files: extensions.join(\", \"),\n limit: fileSize(options.limit),\n },\n true\n )\n }\n\n getUploadButton() {\n return (\n
    \n \n

    \n {this.getUploadRequirements(this.props.options.upload)}\n

    \n
    \n )\n }\n\n getUploadProgressLabel() {\n return interpolate(\n pgettext(\"avatar upload modal field\", \"%(progress)s % complete\"),\n {\n progress: this.state.progress,\n },\n true\n )\n }\n\n getUploadProgress() {\n return (\n
    \n
    \n \n\n
    \n \n {this.getUploadProgressLabel()}\n
    \n
    \n
    \n
    \n )\n }\n\n renderUpload() {\n return (\n
    \n \n {this.state.image ? this.getUploadProgress() : this.getUploadButton()}\n
    \n
    \n \n {pgettext(\"avatar upload modal btn\", \"Cancel\")}\n \n
    \n
    \n
    \n )\n }\n\n renderCrop() {\n return (\n \n )\n }\n\n render() {\n if (this.state.uploaded) return this.renderCrop()\n\n return this.renderUpload()\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport batch from \"misago/utils/batch\"\n\nexport class GalleryItem extends React.Component {\n select = () => {\n this.props.select(this.props.id)\n }\n\n getClassName() {\n if (this.props.selection === this.props.id) {\n if (this.props.disabled) {\n return \"btn btn-avatar btn-disabled avatar-selected\"\n } else {\n return \"btn btn-avatar avatar-selected\"\n }\n } else if (this.props.disabled) {\n return \"btn btn-avatar btn-disabled\"\n } else {\n return \"btn btn-avatar\"\n }\n }\n\n render() {\n return (\n \n \n \n )\n }\n}\n\nexport class Gallery extends React.Component {\n render() {\n return (\n
    \n

    {this.props.name}

    \n\n
    \n {batch(this.props.images, 4, null).map((row, i) => {\n return (\n
    \n {row.map((item, i) => {\n return (\n
    \n {item ? (\n \n ) : (\n
    \n )}\n
    \n )\n })}\n
    \n )\n })}\n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n selection: null,\n isLoading: false,\n }\n }\n\n select = (image) => {\n this.setState({\n selection: image,\n })\n }\n\n save = () => {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: \"galleries\",\n image: this.state.selection,\n })\n .then(\n (response) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.success(response.detail)\n this.props.onComplete(response)\n this.props.showIndex()\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n {this.props.options.galleries.map((item, i) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n \n {this.state.selection\n ? pgettext(\"avatar gallery modal btn\", \"Save choice\")\n : pgettext(\"avatar gallery modal btn\", \"Select avatar\")}\n \n\n \n {pgettext(\"avatar gallery modal btn\", \"Cancel\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport AvatarIndex from \"misago/components/change-avatar/index\"\nimport AvatarCrop from \"misago/components/change-avatar/crop\"\nimport AvatarUpload from \"misago/components/change-avatar/upload\"\nimport AvatarGallery from \"misago/components/change-avatar/gallery\"\nimport Loader from \"misago/components/modal-loader\"\nimport { updateAvatar } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport store from \"misago/services/store\"\n\nexport class ChangeAvatarError extends React.Component {\n getErrorReason() {\n if (this.props.reason) {\n return

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n

    \n
    \n remove_circle_outline\n
    \n
    \n

    {this.props.message}

    \n {this.getErrorReason()}\n \n {pgettext(\"avatar modal dismiss\", \"Ok\")}\n \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n componentDidMount() {\n ajax.get(this.props.user.api.avatar).then(\n (options) => {\n this.setState({\n component: AvatarIndex,\n options: options,\n error: null,\n })\n },\n (rejection) => {\n this.showError(rejection)\n }\n )\n }\n\n showError = (error) => {\n this.setState({\n error,\n })\n }\n\n showIndex = () => {\n this.setState({\n component: AvatarIndex,\n })\n }\n\n showUpload = () => {\n this.setState({\n component: AvatarUpload,\n })\n }\n\n showCrop = () => {\n this.setState({\n component: AvatarCrop,\n })\n }\n\n showGallery = () => {\n this.setState({\n component: AvatarGallery,\n })\n }\n\n completeFlow = (options) => {\n store.dispatch(updateAvatar(this.props.user, options.avatars))\n\n this.setState({\n component: AvatarIndex,\n options,\n })\n }\n\n getBody() {\n if (this.state) {\n if (this.state.error) {\n return (\n \n )\n } else {\n return (\n \n )\n }\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state && this.state.error) {\n return \"modal-dialog modal-message modal-change-avatar\"\n } else {\n return \"modal-dialog modal-change-avatar\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"avatar modal title\", \"Change your avatar\")}\n

    \n
    \n\n {this.getBody()}\n
    \n
    \n )\n }\n}\n\nexport function select(state) {\n return {\n user: state.auth.user,\n }\n}\n","export default function logout() {\n document.getElementById(\"hidden-logout-form\").submit()\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport modal from \"../../services/modal\"\nimport ChangeAvatarModal, {\n select as selectAvatar,\n} from \"../change-avatar/root\"\nimport {\n DropdownDivider,\n DropdownFooter,\n DropdownMenuItem,\n DropdownSubheader,\n} from \"../Dropdown\"\nimport logout from \"./logout\"\n\nclass UserNavMenu extends React.Component {\n constructor(props) {\n super(props)\n\n if (props.dropdown) {\n // Collapse options on dropdown\n this.state = {\n options: props.options.slice(0, 2),\n optionsMore: props.options.length > 2,\n }\n } else {\n // Reveal all options on mobile overlay\n this.state = {\n options: props.options,\n optionsMore: false,\n }\n }\n }\n\n changeAvatar = () => {\n this.props.close()\n modal.show(connect(selectAvatar)(ChangeAvatarModal))\n }\n\n revealOptions = () => {\n this.setState({\n options: this.props.options,\n optionsMore: false,\n })\n }\n\n render() {\n const { user, close, dropdown, overlay } = this.props\n\n if (!user) {\n return null\n }\n\n const adminUrl = misago.get(\"ADMIN_URL\")\n\n return (\n \n
  • \n \n {user.username}\n {pgettext(\"user nav\", \"Go to your profile\")}\n \n
  • \n \n \n \n \n {user.unreadNotifications\n ? \"notifications_active\"\n : \"notifications_none\"}\n \n {pgettext(\"user nav\", \"Notifications\")}\n {!!user.unreadNotifications && (\n {user.unreadNotifications}\n )}\n \n \n {!!user.showPrivateThreads && (\n \n \n inbox\n {pgettext(\"user nav\", \"Private threads\")}\n {!!user.unreadPrivateThreads && (\n {user.unreadPrivateThreads}\n )}\n \n \n )}\n {!!adminUrl && (\n \n \n security\n {pgettext(\"user nav\", \"Admin control panel\")}\n \n \n )}\n \n \n {pgettext(\"user nav section\", \"Account settings\")}\n \n \n \n portrait\n {pgettext(\"user nav\", \"Change avatar\")}\n \n \n {this.state.options.map((item) => (\n \n \n {item.icon}\n {item.name}\n \n \n ))}\n \n \n more_vertical\n {pgettext(\"user nav\", \"See more\")}\n \n \n {!!dropdown && (\n \n {\n logout()\n close()\n }}\n type=\"button\"\n >\n {pgettext(\"user nav\", \"Log out\")}\n \n \n )}\n \n )\n }\n}\n\nfunction select(state) {\n const user = state.auth.user\n if (!user.id) {\n return { user: null }\n }\n\n return {\n user: {\n username: user.username,\n unreadNotifications: user.unreadNotifications,\n unreadPrivateThreads: user.unread_private_threads,\n showPrivateThreads: user.acl.can_use_private_threads,\n url: user.url,\n },\n options: [...misago.get(\"userOptions\")],\n }\n}\n\nconst UserNavMenuConnected = connect(select)(UserNavMenu)\n\nexport default UserNavMenuConnected\n","import React from \"react\"\nimport UserNavMenu from \"./UserNavMenu\"\n\nexport default function UserNavDropdown({ close }) {\n return \n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\nimport { DropdownFooter } from \"../Dropdown\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\nimport UserNavMenu from \"./UserNavMenu\"\nimport logout from \"./logout\"\n\nexport function UserNavOverlay({ dispatch, isOpen }) {\n return (\n \n \n {pgettext(\"user nav title\", \"Your options\")}\n \n dispatch(close())} overlay />\n \n {\n logout()\n dispatch(close())\n }}\n type=\"button\"\n >\n {pgettext(\"user nav\", \"Log out\")}\n \n \n \n )\n}\n\nfunction select(state) {\n return {\n isOpen: state.overlay.userNav,\n }\n}\n\nconst UserNavOverlayConnected = connect(select)(UserNavOverlay)\n\nexport default UserNavOverlayConnected\n","import React from \"react\"\nimport misago from \"misago\"\n\nexport default function (props) {\n const size = props.size || 100\n const size2x = props.size2x || size * 2\n\n return (\n \n )\n}\n\nexport function getSrc(user, size) {\n if (user && user.id) {\n // just avatar hash, size and user id\n return resolveAvatarForSize(user.avatars, size).url\n } else {\n // just append avatar size to file to produce no-avatar placeholder\n return misago.get(\"BLANK_AVATAR_URL\")\n }\n}\n\nexport function resolveAvatarForSize(avatars, size) {\n let avatar = avatars[0]\n avatars.forEach((av) => {\n if (av.size >= size) {\n avatar = av\n }\n })\n return avatar\n}\n","import React from \"react\"\nimport Loader from \"./loader\"\n\nexport default class Button extends React.Component {\n render() {\n let className = \"btn \" + this.props.className\n let disabled = this.props.disabled\n\n if (this.props.loading) {\n className += \" btn-loading\"\n disabled = true\n }\n\n return (\n \n {this.props.children}\n {this.props.loading ? : null}\n \n )\n }\n}\n\nButton.defaultProps = {\n className: \"btn-default\",\n\n type: \"submit\",\n\n loading: false,\n disabled: false,\n\n onClick: null,\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n \n {props.choices.map((item) => {\n return (\n \n {\"- - \".repeat(item.level) + item.label}\n \n )\n })}\n \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n isValidated() {\n return typeof this.props.validation !== \"undefined\"\n }\n\n getClassName() {\n let className = \"form-group\"\n if (this.isValidated()) {\n className += \" has-feedback\"\n if (this.props.validation === null) {\n className += \" has-success\"\n } else {\n className += \" has-error\"\n }\n }\n return className\n }\n\n getFeedback() {\n if (this.props.validation) {\n return (\n
    \n {this.props.validation.map((error, i) => {\n return

    {error}

    \n })}\n
    \n )\n } else {\n return null\n }\n }\n\n getFeedbackDescription() {\n if (this.isValidated()) {\n return (\n \n {this.props.validation\n ? pgettext(\"field validation status\", \"(error)\")\n : pgettext(\"field validation status\", \"(success)\")}\n \n )\n } else {\n return null\n }\n }\n\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n \n {this.props.label + \":\"}\n \n
    \n {this.props.children}\n {this.getFeedbackDescription()}\n {this.getFeedback()}\n {this.getHelpText()}\n {this.props.extra || null}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { required } from \"../utils/validators\"\nimport snackbar from \"../services/snackbar\"\n\nlet validateRequired = required()\n\nexport default class extends React.Component {\n validate() {\n let errors = {}\n if (!this.state.validators) {\n return errors\n }\n\n let validators = {\n required: this.state.validators.required || this.state.validators,\n optional: this.state.validators.optional || {},\n }\n\n let validatedFields = []\n\n // add required fields to validation\n for (let name in validators.required) {\n if (\n validators.required.hasOwnProperty(name) &&\n validators.required[name]\n ) {\n validatedFields.push(name)\n }\n }\n\n // add optional fields to validation\n for (let name in validators.optional) {\n if (\n validators.optional.hasOwnProperty(name) &&\n validators.optional[name]\n ) {\n validatedFields.push(name)\n }\n }\n\n // validate fields values\n for (let i in validatedFields) {\n let name = validatedFields[i]\n let fieldErrors = this.validateField(name, this.state[name])\n\n if (fieldErrors === null) {\n errors[name] = null\n } else if (fieldErrors) {\n errors[name] = fieldErrors\n }\n }\n\n return errors\n }\n\n isValid() {\n let errors = this.validate()\n for (let field in errors) {\n if (errors.hasOwnProperty(field)) {\n if (errors[field] !== null) {\n return false\n }\n }\n }\n\n return true\n }\n\n validateField(name, value) {\n let errors = []\n if (!this.state.validators) {\n return errors\n }\n\n let validators = {\n required: (this.state.validators.required || this.state.validators)[name],\n optional: (this.state.validators.optional || {})[name],\n }\n\n let requiredError = validateRequired(value) || false\n\n if (validators.required) {\n if (requiredError) {\n errors = [requiredError]\n } else {\n for (let i in validators.required) {\n let validationError = validators.required[i](value)\n if (validationError) {\n errors.push(validationError)\n }\n }\n }\n\n return errors.length ? errors : null\n } else if (requiredError === false && validators.optional) {\n for (let i in validators.optional) {\n let validationError = validators.optional[i](value)\n if (validationError) {\n errors.push(validationError)\n }\n }\n\n return errors.length ? errors : null\n }\n\n return false // false === field wasn't validated\n }\n\n bindInput = (name) => {\n return (event) => {\n this.changeValue(name, event.target.value)\n }\n }\n\n changeValue = (name, value) => {\n let newState = {\n [name]: value,\n }\n\n const formErrors = this.state.errors || {}\n formErrors[name] = this.validateField(name, newState[name])\n newState.errors = formErrors\n\n this.setState(newState)\n }\n\n clean() {\n return true\n }\n\n send() {\n return null\n }\n\n handleSuccess(success) {\n return\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n }\n\n handleSubmit = (event) => {\n // we don't reload page on submissions\n if (event) {\n event.preventDefault()\n }\n\n if (this.state.isLoading) {\n return\n }\n\n if (this.clean()) {\n this.setState({ isLoading: true })\n let promise = this.send()\n\n if (promise) {\n promise.then(\n (success) => {\n this.setState({ isLoading: false })\n this.handleSuccess(success)\n },\n (rejection) => {\n this.setState({ isLoading: false })\n this.handleError(rejection)\n }\n )\n } else {\n this.setState({ isLoading: false })\n }\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n isActive() {\n if (this.props.isControlled) {\n return this.props.isActive\n } else {\n if (this.props.path) {\n return document.location.pathname.indexOf(this.props.path) === 0\n } else {\n return false\n }\n }\n }\n\n getClassName() {\n if (this.isActive()) {\n return (\n (this.props.className || \"\") +\n \" \" +\n (this.props.activeClassName || \"active\")\n )\n } else {\n return this.props.className || \"\"\n }\n }\n\n render() {\n return
  • {this.props.children}
  • \n }\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n
    \n
    \n )\n}\n","const ytRegExp = new RegExp(\n \"^.*(?:(?:youtu.be/|v/|vi/|u/w/|embed/)|(?:(?:watch)??v(?:i)?=|&v(?:i)?=))([^#&?]*).*\"\n)\n\nexport class OneBox {\n constructor() {\n this._youtube = {}\n }\n\n render = (element) => {\n if (!element) return\n this.highlightCode(element)\n this.embedYoutubePlayers(element)\n }\n\n highlightCode(element) {\n import(\"highlight\").then(({ default: hljs }) => {\n const codeblocks = element.querySelectorAll(\"pre>code\")\n for (let i = 0; i < codeblocks.length; i++) {\n hljs.highlightElement(codeblocks[i])\n }\n })\n }\n\n embedYoutubePlayers(element) {\n const anchors = element.querySelectorAll(\"p>a\")\n for (let i = 0; i < anchors.length; i++) {\n const a = anchors[i]\n const p = a.parentNode\n const onlyChild = p.childNodes.length === 1\n\n if (!this._youtube[a.href]) {\n this._youtube[a.href] = parseYoutubeUrl(a.href)\n }\n\n const youtubeMovie = this._youtube[a.href]\n if (onlyChild && !!youtubeMovie && youtubeMovie.data !== false) {\n this.swapYoutubePlayer(a, youtubeMovie)\n }\n }\n }\n\n swapYoutubePlayer(element, youtube) {\n let url = \"https://www.youtube.com/embed/\"\n url += youtube.video\n url += \"?feature=oembed\"\n if (youtube.start) {\n url += \"&start=\" + youtube.start\n }\n\n const player = $(\n '\"\n )\n $(element).replaceWith(player)\n player.wrap('
    ')\n }\n}\n\nexport default new OneBox()\n\nexport function parseYoutubeUrl(url) {\n const cleanedUrl = cleanUrl(url)\n const video = getVideoIdFromUrl(cleanedUrl)\n\n if (!video) return null\n\n let start = 0\n if (cleanedUrl.indexOf(\"?\") > 0) {\n const query = cleanedUrl.substr(cleanedUrl.indexOf(\"?\") + 1)\n const timebit = query.split(\"&\").filter((i) => {\n return i.substr(0, 2) === \"t=\"\n })[0]\n\n if (timebit) {\n const bits = timebit.substr(2).split(\"m\")\n if (bits[0].substr(-1) === \"s\") {\n start += parseInt(bits[0].substr(0, bits[0].length - 1))\n } else {\n start += parseInt(bits[0]) * 60\n if (!!bits[1] && bits[1].substr(-1) === \"s\") {\n start += parseInt(bits[1].substr(0, bits[1].length - 1))\n }\n }\n }\n }\n\n return {\n start,\n video,\n }\n}\n\nexport function cleanUrl(url) {\n let clean = url\n\n if (url.substr(0, 8) === \"https://\") {\n clean = clean.substr(8)\n } else if (url.substr(0, 7) === \"http://\") {\n clean = clean.substr(7)\n }\n\n if (clean.substr(0, 4) === \"www.\") {\n clean = clean.substr(4)\n }\n\n return clean\n}\n\nexport function getVideoIdFromUrl(url) {\n if (url.indexOf(\"youtu\") === -1) return null\n\n const video = url.match(ytRegExp)\n if (video) {\n return video[1]\n }\n return null\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport onebox from \"misago/services/one-box\"\n\nexport default class extends React.Component {\n componentDidMount() {\n onebox.render(this.documentNode)\n $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n }\n\n componentDidUpdate(prevProps, prevState) {\n onebox.render(this.documentNode)\n $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n return nextProps.markup !== this.props.markup\n }\n\n render() {\n return (\n {\n this.documentNode = node\n }}\n />\n )\n }\n}\n\nfunction revealSpoiler(event) {\n var btn = event.target\n $(btn).parent().parent().addClass(\"revealed\")\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default class extends PanelMessage {\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n \n {this.props.icon || \"info_outline\"}\n \n
    \n
    \n

    {this.props.message}

    \n {this.getHelpText()}\n \n {pgettext(\"modal message dismiss btn\", \"Ok\")}\n \n
    \n
    \n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n \n {this.props.icon || \"info_outline\"}\n \n
    \n
    \n

    {this.props.message}

    \n {this.getHelpText()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\n\nexport default function (props) {\n if (props.post.content) {\n return \n } else {\n return \n }\n}\n\nexport function Default(props) {\n return (\n
    \n \n
    \n )\n}\n\nexport function Invalid(props) {\n return (\n
    \n

    \n {pgettext(\n \"post body invalid\",\n \"This post's contents cannot be displayed.\"\n )}\n

    \n

    \n {pgettext(\n \"post body invalid\",\n \"This error is caused by invalid post content manipulation.\"\n )}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n const { category, thread } = post\n\n const tooltip = interpolate(\n pgettext(\"posts feed item header\", \"posted %(posted_on)s\"),\n {\n posted_on: post.posted_on.format(\"LL, LT\"),\n },\n true\n )\n\n return (\n
    \n \n {thread.title}\n \n \n {category.name}\n \n \n {post.posted_on.fromNow()}\n \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n return (\n \n \n {pgettext(\"go to post link\", \"See post\")}\n \n chevron_right\n \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\n\nexport default function ({ post }) {\n return (\n
    \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n {post.poster_name}\n
    \n \n {pgettext(\"post removed poster username\", \"Removed user\")}\n \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title || rank.name\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n {userTitle}\n \n )\n }\n\n return {userTitle}\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ post, poster }) {\n return (\n
    \n \n
    \n
    \n \n \n \n
    \n \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Anonymous from \"./anonymous\"\nimport Registered from \"./registered\"\n\nexport default function ({ post, poster }) {\n if (poster && poster.id) {\n return \n }\n\n return \n}\n","import React from \"react\"\nimport Body from \"./body\"\nimport Header from \"./header\"\nimport PostSide from \"./post-side\"\n\nexport default function ({ post, poster }) {\n const user = poster || post.poster\n\n let className = \"post\"\n if (user && user.rank.css_class) {\n className += \" post-\" + user.rank.css_class\n }\n\n return (\n
  • \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
  • \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default function () {\n return (\n
      \n
    • \n
      \n
      \n
      \n
      \n
      \n
      \n \n \n \n
      \n
      \n
      \n \n \n  \n \n \n
      \n \n \n  \n \n \n
      \n
      \n
      \n
      \n \n  \n \n
      \n
      \n
      \n

      \n \n  \n \n  \n \n  \n \n  \n \n  \n \n

      \n
      \n
      \n
      \n
      \n
      \n
    • \n
    \n )\n}\n","import React from \"react\"\nimport Post from \"./post\"\nimport Preview from \"./preview\"\n\nexport default function ({ isReady, posts, poster }) {\n if (!isReady) {\n return \n }\n\n return (\n
      \n {posts.map((post) => {\n return \n })}\n
    \n )\n}\n","import React from \"react\"\nimport posting from \"../../services/posting\"\nimport { getGlobalState, getQuoteMarkup } from \"../posting\"\n\nexport default class PostingQuoteSelection extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n range: null,\n rect: null,\n }\n\n this.element = null\n }\n\n selected = () => {\n if (this.element) {\n const range = getQuoteSelection(this.element) || null\n const rect = range ? range.getBoundingClientRect() : null\n\n this.setState({ range, rect })\n }\n }\n\n reply = () => {\n if (!posting.isOpen()) {\n const content = getQuoteMarkup(this.state.range)\n posting.open(Object.assign({}, this.props.posting, { default: content }))\n\n this.setState({ range: null, rect: null })\n\n window.setTimeout(focusEditor, 1000)\n } else {\n const globalState = getGlobalState()\n if (globalState && !globalState.disabled) {\n globalState.quote(getQuoteMarkup(this.state.range))\n this.setState({ range: null, rect: null })\n focusEditor()\n }\n }\n }\n\n render = () => (\n
    \n {\n if (element) {\n this.element = element\n }\n }}\n onMouseUp={this.selected}\n onTouchEnd={this.selected}\n >\n {this.props.children}\n
    \n {!!this.state.rect && (\n \n
    \n
    \n \n {pgettext(\"post reply\", \"Quote\")}\n \n
    \n
    \n )}\n
    \n )\n}\n\nfunction focusEditor() {\n const textarea = document.querySelector(\"#posting-mount textarea\")\n textarea.focus()\n textarea.selectionStart = textarea.selectionEnd = textarea.value.length\n}\n\nconst getQuoteSelection = (container) => {\n if (typeof window.getSelection === \"undefined\") return\n\n // Validate that selection is of valid type and has one range\n const selection = window.getSelection()\n if (!selection) return\n if (selection.type !== \"Range\") return\n if (selection.rangeCount !== 1) return\n\n // Validate that selection is within the container and post's article\n const range = selection.getRangeAt(0)\n if (!isRangeContained(range, container)) return\n if (!isPostContained(range)) return\n if (!isAnyTextSelected(range.cloneContents())) return\n\n return range\n}\n\nconst isRangeContained = (range, container) => {\n const node = range.commonAncestorContainer\n if (node === container) return true\n\n let p = node.parentNode\n while (p) {\n if (p === container) return true\n p = p.parentNode\n }\n\n return false\n}\n\nconst isPostContained = (range) => {\n const element = range.commonAncestorContainer\n if (element.nodeName === \"ARTICLE\") return true\n if (element.dataset && element.dataset.noquote === \"1\") return false\n let p = element.parentNode\n while (p) {\n if (p.dataset && p.dataset.noquote === \"1\") return false\n if (p.nodeName === \"ARTICLE\") return true\n p = p.parentNode\n }\n return false\n}\n\nconst isAnyTextSelected = (node) => {\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i]\n if (child.nodeType === Node.TEXT_NODE) {\n if (child.textContent && child.textContent.trim().length > 0) return true\n }\n if (child.nodeName === \"IMG\") return true\n if (isAnyTextSelected(child)) return true\n }\n\n return false\n}\n","const getQuoteMarkup = (range) => {\n const metadata = getQuoteMetadata(range)\n let markup = convertNodesToMarkup(range.cloneContents().childNodes, [])\n let prefix = metadata ? `[quote=\"${metadata}\"]\\n` : \"[quote]\\n\"\n let suffix = \"\\n[/quote]\\n\\n\"\n\n const codeBlock = getQuoteCodeBlock(range)\n if (codeBlock) {\n prefix += codeBlock.syntax ? `[code=${codeBlock.syntax}]\\n` : \"[code]\\n\"\n suffix = \"\\n[/code]\" + suffix\n } else if (isNodeInlineCodeBlock(range)) {\n markup = markup.trim()\n prefix += \"`\"\n suffix = \"`\" + suffix\n } else {\n markup = markup.trim()\n }\n\n return prefix + markup + suffix\n}\n\nexport default getQuoteMarkup\n\nconst getQuoteMetadata = (range) => {\n const node = range.commonAncestorContainer\n if (isNodeElementWithQuoteMetadata(node)) {\n return getQuoteMetadataFromNode(node)\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeElementWithQuoteMetadata(p)) {\n return getQuoteMetadataFromNode(p)\n }\n p = p.parentNode\n }\n\n return \"\"\n}\n\nconst isNodeElementWithQuoteMetadata = (node) => {\n if (node.nodeType !== Node.ELEMENT_NODE) return false\n if (node.nodeName === \"ARTICLE\") return true\n if (node.nodeName === \"BLOCKQUOTE\") {\n return node.dataset && node.dataset.block === \"quote\"\n }\n\n return false\n}\n\nconst getQuoteMetadataFromNode = (element) => {\n if (element.dataset) {\n return element.dataset.author || null\n }\n return null\n}\n\nconst getQuoteCodeBlock = (range) => {\n const node = range.commonAncestorContainer\n if (isNodeCodeBlock(node)) {\n return getNodeCodeBlockMeta(node)\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeCodeBlock(p)) {\n return getNodeCodeBlockMeta(p)\n }\n p = p.parentNode\n }\n\n return null\n}\n\nconst isNodeCodeBlock = (node) => {\n return node.nodeName === \"PRE\"\n}\n\nconst isNodeInlineCodeBlock = (range) => {\n const node = range.commonAncestorContainer\n if (node.nodeName === \"CODE\") {\n return true\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeElementWithQuoteMetadata(p)) {\n return false\n }\n\n if (p.nodeName === \"CODE\") {\n return true\n }\n\n p = p.parentNode\n }\n\n return false\n}\n\nconst getNodeCodeBlockMeta = (node) => {\n if (!node.dataset) {\n return { syntax: null }\n }\n\n return { syntax: node.dataset.syntax || null }\n}\n\nconst convertNodesToMarkup = (nodes, stack) => {\n let markup = \"\"\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n markup += convertNodeToMarkup(node, stack)\n }\n return markup\n}\n\nconst SIMPLE_NODE_MAPPINGS = {\n H1: [\"\\n\\n# \", \"\"],\n H2: [\"\\n\\n## \", \"\"],\n H3: [\"\\n\\n### \", \"\"],\n H4: [\"\\n\\n#### \", \"\"],\n H5: [\"\\n\\n##### \", \"\"],\n H6: [\"\\n\\n###### \", \"\"],\n STRONG: [\"**\", \"**\"],\n EM: [\"*\", \"*\"],\n DEL: [\"~~\", \"~~\"],\n B: [\"[b]\", \"[/b]\"],\n U: [\"[u]\", \"[/u]\"],\n I: [\"[i]\", \"[/i]\"],\n SUB: [\"[sub]\", \"[/sub]\"],\n SUP: [\"[sup]\", \"[/sup]\"],\n}\n\nconst convertNodeToMarkup = (node, stack) => {\n const dataset = node.dataset || {}\n\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent || \"\"\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n if (dataset.quote) {\n return dataset.quote || \"\"\n }\n if (dataset.noquote === \"1\") return \"\"\n }\n\n if (\n node.nodeType === Node.ELEMENT_NODE &&\n dataset.quote &&\n dataset.quote.trim()\n ) {\n return \"\"\n }\n\n if (node.nodeName === \"HR\") {\n return \"\\n\\n- - -\"\n }\n\n if (SIMPLE_NODE_MAPPINGS[node.nodeName]) {\n const [prefix, suffix] = SIMPLE_NODE_MAPPINGS[node.nodeName]\n return (\n prefix +\n convertNodesToMarkup(node.childNodes, [...stack, node.nodeName]) +\n suffix\n )\n }\n\n if (node.nodeName === \"A\") {\n const href = node.href\n const text = convertNodesToMarkup(node.childNodes, [\n ...stack,\n node.nodeName,\n ])\n if (text) {\n return `[${text}](${href})`\n } else {\n return `!(${href})`\n }\n }\n\n if (node.nodeName === \"IMG\") {\n const src = node.src\n const alt = node.alt\n if (alt) {\n return `![${alt}](${src})`\n } else {\n return `!(${src})`\n }\n }\n\n if (node.nodeName === \"DIV\" || node.nodeName === \"ASIDE\") {\n const block = dataset.block && dataset.block.toUpperCase()\n if (block && SIMPLE_NODE_MAPPINGS[block]) {\n const [prefix, suffix] = SIMPLE_NODE_MAPPINGS[block]\n return (\n prefix +\n convertNodesToMarkup(node.childNodes, [...stack, block]) +\n suffix\n )\n } else {\n return convertNodesToMarkup(node.childNodes, stack)\n }\n }\n\n if (node.nodeName === \"BLOCKQUOTE\") {\n if (dataset.block === \"spoiler\") {\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n \"SPOILER\",\n ]).trim()\n\n if (!content) return \"\"\n\n let markup = \"\\n[spoiler]\\n\"\n markup += content\n markup += \"\\n[/spoiler]\"\n return markup\n }\n\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n \"QUOTE\",\n ]).trim()\n\n if (!content) return \"\"\n\n const metadata = getQuoteMetadataFromNode(node)\n let markup = metadata ? `\\n[quote=${metadata}]\\n` : \"\\n\\n[quote]\\n\"\n markup += content\n markup += \"\\n[/quote]\"\n return markup\n }\n\n if (node.nodeName === \"PRE\") {\n const syntax = dataset.syntax || null\n const code = node.querySelector(\"code\")\n const content = code ? code.innerText || \"\" : \"\"\n\n if (!content.trim()) return \"\"\n\n return \"\\n[code\" + (syntax ? \"=\" + syntax : \"\") + \"]\" + content + \"[/code]\"\n }\n\n if (node.nodeName === \"CODE\") {\n return \"`\" + node.innerText + \"`\"\n }\n\n if (node.nodeName === \"P\") {\n return (\n \"\\n\" + convertNodesToMarkup(node.childNodes, [...stack, node.nodeName])\n )\n }\n\n if (node.nodeName === \"UL\" || node.nodeName === \"OL\") {\n const level = stack.filter((item) => item === \"OL\" || item === \"UL\").length\n const prefix = level === 0 ? \"\\n\" : \"\"\n return (\n prefix + convertNodesToMarkup(node.childNodes, [...stack, node.nodeName])\n )\n }\n\n if (node.nodeName === \"LI\") {\n let prefix = \"\"\n const level = stack.filter((item) => item === \"OL\" || item === \"UL\").length\n for (let i = 1; i < level; i++) {\n prefix += \" \"\n }\n\n const ordered = stack[stack.length - 1] === \"OL\"\n if (ordered) {\n prefix += dataset.index ? dataset.index + \". \" : \"1. \"\n } else {\n prefix += \"- \"\n }\n\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n node.nodeName,\n ])\n if (!content.trim()) return \"\"\n\n return \"\\n\" + prefix + content\n }\n\n if (node.nodeName === \"SPAN\") {\n return convertNodesToMarkup(node.childNodes, stack)\n }\n\n return \"\"\n}\n","export function getGlobalState() {\n return window.misagoReply\n}\n\nexport function setGlobalState(disabled, quote) {\n window.misagoReply = { disabled, quote }\n}\n\nexport function clearGlobalState() {\n window.misagoReply = null\n}\n","import moment from \"moment\"\n\nexport function clean(attachments) {\n return attachments\n .filter((attachment) => {\n return attachment.id && !attachment.isRemoved\n })\n .map((a) => {\n return a.id\n })\n}\n\nexport function hydrate(attachments) {\n return attachments.map((attachment) => {\n return Object.assign({}, attachment, {\n uploaded_on: moment(attachment.uploaded_on),\n })\n })\n}\n","import React from \"react\"\nimport formatFilesize from \"../../utils/file-size\"\n\nexport default function MarkupAttachmentModal({ attachment }) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Attachment details\")}\n

    \n
    \n
    \n {!!attachment.is_image && (\n
    \n \n \"\"\n \n
    \n )}\n
    \n {attachment.filename}\n
    \n
    \n
    \n \n {attachment.filetype + \", \" + formatFilesize(attachment.size)}\n \n
    \n {pgettext(\"markup editor\", \"Type and size\")}\n
    \n
    \n
    \n \n \n {attachment.uploaded_on.fromNow()}\n \n \n
    \n {pgettext(\"markup editor\", \"Uploaded at\")}\n
    \n
    \n
    \n {attachment.url.uploader ? (\n \n {attachment.uploader_name}\n \n ) : (\n {attachment.uploader_name}\n )}\n
    \n {pgettext(\"markup editor\", \"Uploader\")}\n
    \n
    \n
    \n
    \n
    \n \n {pgettext(\"modal\", \"Close\")}\n \n
    \n
    \n
    \n )\n}\n","const wrapSelection = (selection, update, prefix, suffix, def) => {\n const text = selection.text || def || \"\"\n let newValue = selection.prefix\n newValue += prefix + text + suffix\n newValue += selection.suffix\n update(newValue)\n\n window.setTimeout(() => {\n focus(selection.textarea)\n\n const caret = selection.start + prefix.length\n selection.textarea.setSelectionRange(caret, caret + text.length)\n }, 250)\n}\n\nconst replaceSelection = (selection, update, text) => {\n let newValue = selection.prefix\n newValue += text\n newValue += selection.suffix\n update(newValue)\n\n window.setTimeout(() => {\n focus(selection.textarea)\n\n const caret = selection.end + text.length\n selection.textarea.setSelectionRange(caret, caret)\n }, 250)\n}\n\nconst getSelection = (textarea) => {\n if (document.selection) {\n textarea.focus()\n const range = document.selection.createRange()\n const length = range.text.length\n range.moveStart(\"character\", -textarea.value.length)\n return createRange(textarea, range.text.length - length, range.text.length)\n }\n\n if (textarea.selectionStart || textarea.selectionStart == \"0\") {\n return createRange(textarea, textarea.selectionStart, textarea.selectionEnd)\n }\n}\n\nconst createRange = (textarea, start, end) => {\n return {\n textarea: textarea,\n start: start,\n end: end,\n text: textarea.value.substring(start, end),\n prefix: textarea.value.substring(0, start),\n suffix: textarea.value.substring(end),\n }\n}\n\nexport function focus(textarea) {\n const scroll = textarea.scrollTop\n textarea.focus()\n textarea.scrollTop = scroll\n}\n\nexport { getSelection, replaceSelection, wrapSelection }\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport snackbar from \"../../services/snackbar\"\nimport formatFilesize from \"../../utils/file-size\"\nimport MarkupAttachmentModal from \"./MarkupAttachmentModal\"\nimport { getSelection, replaceSelection } from \"./operations\"\n\nconst MarkupEditorAttachment = ({\n attachment,\n disabled,\n element,\n setState,\n update,\n}) => (\n
    \n
    \n
    \n {attachment.id ? (\n {\n event.preventDefault()\n modal.show()\n }}\n >\n {attachment.filename}\n \n ) : (\n {attachment.filename}\n )}\n
    \n
      \n {!attachment.id &&
    • {attachment.progress + \"%\"}
    • }\n {!!attachment.filetype &&
    • {attachment.filetype}
    • }\n {attachment.size > 0 &&
    • {formatFilesize(attachment.size)}
    • }\n
    \n
    \n
    \n {!!attachment.id && (\n
    \n {\n const markup = getAttachmentMarkup(attachment)\n const selection = getSelection(element)\n replaceSelection(selection, update, markup)\n }}\n >\n flip_to_front\n \n {\n setState(({ attachments }) => {\n const confirm = window.confirm(\n pgettext(\"markup editor\", \"Remove this attachment?\")\n )\n\n if (confirm) {\n return {\n attachments: attachments.filter(\n ({ id }) => id !== attachment.id\n ),\n }\n }\n })\n }}\n >\n close\n \n
    \n )}\n {!attachment.id && !!attachment.key && (\n
    \n {attachment.error && (\n {\n snackbar.error(\n interpolate(\n pgettext(\"markup editor\", \"%(filename)s: %(error)s\"),\n { filename: attachment.filename, error: attachment.error },\n true\n )\n )\n }}\n >\n warning\n \n )}\n {\n setState(({ attachments }) => {\n return {\n attachments: attachments.filter(\n ({ key }) => key !== attachment.key\n ),\n }\n })\n }}\n >\n close\n \n
    \n )}\n
    \n
    \n)\n\nexport default MarkupEditorAttachment\n\nfunction getAttachmentMarkup(attachment) {\n let markup = \"[\"\n\n if (attachment.is_image) {\n markup += \"![\" + attachment.filename + \"]\"\n markup += \"(\" + (attachment.url.thumb || attachment.url.index) + \"?shva=1)\"\n } else {\n markup += attachment.filename\n }\n\n markup += \"](\" + attachment.url.index + \"?shva=1)\"\n return markup\n}\n","import React from \"react\"\nimport MarkupEditorAttachment from \"./MarkupEditorAttachment\"\n\nconst MarkupEditorAttachments = ({\n attachments,\n disabled,\n element,\n setState,\n update,\n}) => (\n
    \n
    \n {attachments.map((attachment) => (\n \n ))}\n
    \n
    \n)\n\nexport default MarkupEditorAttachments\n","import React from \"react\"\nimport Button from \"../button\"\n\nconst MarkupEditorFooter = ({\n canProtect,\n disabled,\n empty,\n preview,\n isProtected,\n submitText,\n showPreview,\n closePreview,\n enableProtection,\n disableProtection,\n}) => (\n
    \n {!!canProtect && (\n {\n if (isProtected) {\n disableProtection()\n } else {\n enableProtection()\n }\n }}\n >\n \n {isProtected ? \"lock\" : \"lock_open\"}\n \n \n )}\n {!!canProtect && (\n
    \n {\n if (isProtected) {\n disableProtection()\n } else {\n enableProtection()\n }\n }}\n >\n \n {isProtected ? \"lock\" : \"lock_open\"}\n \n {isProtected\n ? pgettext(\"markup editor\", \"Protected\")\n : pgettext(\"markup editor\", \"Protect\")}\n \n
    \n )}\n
    \n {preview ? (\n \n {pgettext(\"markup editor\", \"Edit\")}\n \n ) : (\n \n {pgettext(\"markup editor\", \"Preview\")}\n \n )}\n \n
    \n)\n\nexport default MarkupEditorFooter\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupCodeModal extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: null,\n syntax: \"\",\n text: props.selection.text,\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const syntax = this.state.syntax.trim()\n const text = this.state.text.trim()\n\n if (text.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n replaceSelection(\n Object.assign({}, selection, { text }),\n update,\n prefix + \"```\" + syntax + \"\\n\" + text + \"\\n```\\n\\n\"\n )\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {pgettext(\"markup editor\", \"Code\")}

    \n
    \n
    \n
    \n \n \n this.setState({ syntax: event.target.value })\n }\n >\n \n {LANGUAGES.map(({ value, name }) => (\n \n ))}\n \n \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nconst LANGUAGES = [\n { value: \"bash\", name: \"Bash\" },\n { value: \"c\", name: \"C\" },\n { value: \"c#\", name: \"C#\" },\n { value: \"c++\", name: \"C++\" },\n { value: \"css\", name: \"CSS\" },\n { value: \"diff\", name: \"Diff\" },\n { value: \"go\", name: \"Go\" },\n { value: \"graphql\", name: \"GraphQL\" },\n { value: \"html,\", name: \"HTML\" },\n { value: \"xml\", name: \"XML\" },\n { value: \"json\", name: \"JSON\" },\n { value: \"java\", name: \"Java\" },\n { value: \"javascript\", name: \"JavaScript\" },\n { value: \"kotlin\", name: \"Kotlin\" },\n { value: \"less\", name: \"Less\" },\n { value: \"lua\", name: \"Lua\" },\n { value: \"makefile\", name: \"Makefile\" },\n { value: \"markdown\", name: \"Markdown\" },\n { value: \"objective-C\", name: \"Objective-C\" },\n { value: \"php\", name: \"PHP\" },\n { value: \"perl\", name: \"Perl\" },\n { value: \"plain\", name: \"Plain\" },\n { value: \"text\", name: \"text\" },\n { value: \"python\", name: \"Python\" },\n { value: \"repl\", name: \"REPL\" },\n { value: \"r\", name: \"R\" },\n { value: \"ruby\", name: \"Ruby\" },\n { value: \"rust\", name: \"Rust\" },\n { value: \"scss\", name: \"SCSS\" },\n { value: \"sql\", name: \"SQL\" },\n { value: \"shell\", name: \"Shell Session\" },\n { value: \"swift\", name: \"Swift\" },\n { value: \"toml\", name: \"TOML\" },\n { value: \"ini\", name: \"INI\" },\n { value: \"typescript\", name: \"TypeScript\" },\n { value: \"visualbasic\", name: \"Visual Basic .NET\" },\n { value: \"webassembly\", name: \"WebAssembly\" },\n { value: \"yaml\", name: \"YAML\" },\n]\n\nexport default MarkupCodeModal\n","import React from \"react\"\nimport formatFilesize from \"../../utils/file-size\"\n\nexport default function MarkupFormattingHelpModal() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup help\", \"Formatting help\")}\n

    \n
    \n
    \n

    {pgettext(\"markup help\", \"Emphasis text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will have emphasis\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Bold text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will be bold\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Removed text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will be removed\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Bold text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be bold\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Underlined text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be underlined\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Italics text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be in italics\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link\")}

    \n \"\n result={\n

    \n example.com\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link with text\")}

    \n \n {pgettext(\"markup help\", \"Link text\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link (BBCode)\")}

    \n \n example.com\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link with text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"Link text\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image\")}

    \n \n \"\"\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image with alternate text\")}

    \n \n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image (BBCode)\")}

    \n \n \"\"\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Mention user by their name\")}

    \n \n @username\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 1\")}

    \n {pgettext(\"markup help\", \"First level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 2\")}

    \n {pgettext(\"markup help\", \"Second level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 3\")}

    \n {pgettext(\"markup help\", \"Third level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 4\")}

    \n {pgettext(\"markup help\", \"Fourth level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 5\")}

    \n {pgettext(\"markup help\", \"Fifth level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Unordered list\")}

    \n \n
  • Lorem ipsum
  • \n
  • Dolor met
  • \n
  • Vulputate lectus
  • \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Ordered list\")}

    \n \n
  • Lorem ipsum
  • \n
  • Dolor met
  • \n
  • Vulputate lectus
  • \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text\")}

    \n \" + pgettext(\"markup help\", \"Quoted text\")}\n result={\n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text (BBCode)\")}

    \n \n
    \n {gettext(\"Quoted message:\")}\n
    \n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text with author (BBCode)\")}

    \n \n
    \n {pgettext(\"markup help\", \"Quote author has written:\")}\n
    \n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Spoiler\")}

    \n \n {pgettext(\"markup help\", \"Secret text\")}\n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Inline code\")}

    \n \n {pgettext(\"markup help\", \"Inline code\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Code block\")}

    \n \n alert(\"Hello world!\");\n \n }\n />\n\n
    \n\n

    \n {pgettext(\"markup help\", \"Code block with syntax highlighting\")}\n

    \n \n \n print(\"Hello world!\");\n \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Code block (BBCode)\")}

    \n \n alert(\"Hello world!\");\n \n }\n />\n\n
    \n\n

    \n {pgettext(\n \"markup help\",\n \"Code block with syntax highlighting (BBCode)\"\n )}\n

    \n \n \n print(\"Hello world!\");\n \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Horizontal rule\")}

    \n \n

    Lorem ipsum

    \n
    \n

    Dolor met

    \n
    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Horizontal rule (BBCode)\")}

    \n \n

    Lorem ipsum

    \n
    \n

    Dolor met

    \n
    \n }\n />\n
    \n
    \n \n {pgettext(\"modal\", \"Close\")}\n \n
    \n
    \n
    \n )\n}\n\nfunction ExampleFormatting({ markup, result }) {\n return (\n
    \n
    \n
    \n          {markup}\n        
    \n
    \n
    \n
    {result}
    \n
    \n
    \n )\n}\n\nclass ExampleFormattingSpoiler extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n reveal: false,\n }\n }\n\n render() {\n return (\n \n
    \n

    {this.props.children}

    \n
    \n {!this.state.reveal && (\n
    \n {\n this.setState({ reveal: true })\n }}\n >\n {gettext(\"Reveal spoiler\")}\n \n
    \n )}\n \n )\n }\n}\n","const URL_PATTERN = new RegExp(\"^(((ftps?)|(https?))://)\", \"i\")\n\nexport default function isUrl(str) {\n return URL_PATTERN.test(str.trim())\n}\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport isUrl from \"./isUrl\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupImageModal extends React.Component {\n constructor(props) {\n super(props)\n\n const text = props.selection.text.trim()\n const textUrl = isUrl(text)\n\n this.state = {\n error: null,\n text: textUrl ? \"\" : text,\n url: textUrl ? text : \"\",\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const text = this.state.text.trim()\n const url = this.state.url.trim()\n\n if (url.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n if (text.length > 0) {\n replaceSelection(selection, update, \"![\" + text + \"](\" + url + \")\")\n } else {\n replaceSelection(selection, update, \"!(\" + url + \")\")\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Image\")}\n

    \n
    \n
    \n
    \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n \n \n this.setState({ url: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupImageModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport isUrl from \"./isUrl\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupLinkModal extends React.Component {\n constructor(props) {\n super(props)\n\n const text = props.selection.text.trim()\n const textUrl = isUrl(text)\n\n this.state = {\n error: null,\n text: textUrl ? \"\" : text,\n url: textUrl ? text : \"\",\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const text = this.state.text.trim()\n const url = this.state.url.trim()\n\n if (url.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n if (text.length > 0) {\n replaceSelection(selection, update, \"[\" + text + \"](\" + url + \")\")\n } else {\n replaceSelection(selection, update, \"<\" + url + \">\")\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {pgettext(\"markup editor\", \"Link\")}

    \n
    \n
    \n
    \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n \n \n this.setState({ url: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupLinkModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupQuoteModal extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: null,\n author: \"\",\n text: props.selection.text,\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const author = this.state.author.trim()\n const text = this.state.text.trim()\n\n if (text.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n if (author) {\n replaceSelection(\n selection,\n update,\n prefix + '[quote=\"' + author + '\"]\\n' + text + \"\\n[/quote]\\n\\n\"\n )\n } else {\n replaceSelection(\n selection,\n update,\n prefix + \"[quote]\\n\" + text + \"\\n[/quote]\\n\\n\"\n )\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Quote\")}\n

    \n
    \n
    \n
    \n \n \n this.setState({ author: event.target.value })\n }\n />\n \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n
    \n
    \n \n {pgettext(\"markup editor\", \"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupQuoteModal\n","import React from \"react\"\n\nconst MarkupEditorButton = ({ disabled, icon, title, onClick }) => (\n \n {icon}\n \n)\n\nexport default MarkupEditorButton\n","import moment from \"moment\"\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport formatFilesize from \"../../utils/file-size\"\nimport getRandomString from \"../../utils/getRandomString\"\n\nconst ID_LEN = 32\n\nconst uploadFile = (file, setState) => {\n const maxSize = misago.get(\"user\").acl.max_attachment_size * 1024\n\n if (file.size > maxSize) {\n snackbar.error(\n interpolate(\n pgettext(\n \"markup editor\",\n \"File %(filename)s is bigger than %(limit)s.\"\n ),\n { filename: file.name, limit: formatFilesize(maxSize) },\n true\n )\n )\n\n return\n }\n\n let upload = {\n id: null,\n key: getRandomString(ID_LEN),\n error: null,\n uploaded_on: null,\n progress: 0,\n filename: file.name,\n filetype: null,\n is_image: false,\n size: file.size,\n url: null,\n uploader_name: null,\n }\n\n setState(({ attachments }) => {\n return { attachments: [upload].concat(attachments) }\n })\n\n const refreshState = () => {\n setState(({ attachments }) => {\n return { attachments: attachments.concat() }\n })\n }\n\n const data = new FormData()\n data.append(\"upload\", file)\n\n ajax\n .upload(misago.get(\"ATTACHMENTS_API\"), data, (progress) => {\n upload.progress = progress\n refreshState()\n })\n .then(\n (data) => {\n Object.assign(upload, data, { uploaded_on: moment(data.uploaded_on) })\n refreshState()\n },\n (rejection) => {\n if (rejection.status === 400 || rejection.status === 413) {\n upload.error = rejection.detail\n snackbar.error(rejection.detail)\n refreshState()\n } else {\n snackbar.apiError(rejection)\n }\n }\n )\n}\n\nexport default uploadFile\n","import React from \"react\"\nimport misago from \"../../\"\nimport modal from \"../../services/modal\"\nimport MarkupCodeModal from \"./MarkupCodeModal\"\nimport MarkupFormattingHelpModal from \"./MarkupFormattingHelpModal\"\nimport MarkupImageModal from \"./MarkupImageModal\"\nimport MarkupLinkModal from \"./MarkupLinkModal\"\nimport MarkupQuoteModal from \"./MarkupQuoteModal\"\nimport MarkupEditorButton from \"./MarkupEditorButton\"\nimport { getSelection, replaceSelection, wrapSelection } from \"./operations\"\nimport uploadFile from \"./uploadFile\"\n\nconst MarkupEditorToolbar = ({\n disabled,\n element,\n update,\n updateAttachments,\n}) => {\n const actions = [\n {\n name: pgettext(\"markup editor\", \"Strong\"),\n icon: \"format_bold\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"**\",\n \"**\",\n pgettext(\"example markup\", \"Strong text\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Emphasis\"),\n icon: \"format_italic\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"*\",\n \"*\",\n pgettext(\"example markup\", \"Text with emphasis\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Strikethrough\"),\n icon: \"format_strikethrough\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"~~\",\n \"~~\",\n pgettext(\"example markup\", \"Text with strikethrough\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Horizontal ruler\"),\n icon: \"remove\",\n onClick: () => {\n replaceSelection(getSelection(element), update, \"\\n\\n- - -\\n\\n\")\n },\n },\n {\n name: pgettext(\"markup editor\", \"Link\"),\n icon: \"insert_link\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Image\"),\n icon: \"insert_photo\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Quote\"),\n icon: \"format_quote\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Spoiler\"),\n icon: \"visibility_off\",\n onClick: () => {\n insertSpoiler(element, update)\n },\n },\n {\n name: pgettext(\"markup editor\", \"Code\"),\n icon: \"code\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n ]\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n actions.push({\n name: pgettext(\"markup editor\", \"Upload file\"),\n icon: \"file_upload\",\n onClick: () => uploadFiles(updateAttachments),\n })\n }\n\n return (\n
    \n
    \n {actions.map(({ name, icon, onClick }) => (\n \n ))}\n
    \n
    \n
    \n \n more_vert\n \n
      \n {actions.map(({ name, icon, onClick }) => (\n
    • \n \n {icon}\n {name}\n \n
    • \n ))}\n
    \n
    \n {\n modal.show()\n }}\n />\n
    \n
    \n )\n}\n\nconst insertSpoiler = (element, update) => {\n const selection = getSelection(element)\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n wrapSelection(\n selection,\n update,\n prefix + \"[spoiler]\\n\",\n \"\\n[/spoiler]\\n\\n\",\n pgettext(\"markup editor\", \"Spoiler text\")\n )\n}\n\nconst uploadFiles = (setState) => {\n const input = document.createElement(\"input\")\n input.type = \"file\"\n input.multiple = \"multiple\"\n\n input.addEventListener(\"change\", function () {\n for (let i = 0; i < input.files.length; i++) {\n uploadFile(input.files[i], setState)\n }\n })\n\n input.click()\n}\n\nexport default MarkupEditorToolbar\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport MisagoMarkup from \"../misago-markup\"\nimport MarkupEditorAttachments from \"./MarkupEditorAttachments\"\nimport MarkupEditorFooter from \"./MarkupEditorFooter\"\nimport MarkupEditorToolbar from \"./MarkupEditorToolbar\"\nimport uploadFile from \"./uploadFile\"\n\nclass MarkupEditor extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n element: null,\n focused: false,\n loading: false,\n preview: false,\n parsed: null,\n }\n }\n\n showPreview = () => {\n if (this.state.loading) return\n\n this.setState({ loading: true, preview: true, element: null })\n\n ajax.post(misago.get(\"PARSE_MARKUP_API\"), { post: this.props.value }).then(\n (data) => {\n this.setState({ loading: false, parsed: data.parsed })\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n this.setState({ loading: false, preview: false })\n }\n )\n }\n\n closePreview = () => {\n this.setState({ loading: false, preview: false })\n }\n\n onDrop = (event) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!event.dataTransfer.files) return\n\n const { onAttachmentsChange: setState } = this.props\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n for (let i = 0; i < event.dataTransfer.files.length; i++) {\n const file = event.dataTransfer.files[i]\n uploadFile(file, setState)\n }\n }\n }\n\n onPaste = (event) => {\n const { onAttachmentsChange: setState } = this.props\n\n const files = []\n for (let i = 0; i < event.clipboardData.items.length; i++) {\n const item = event.clipboardData.items[i]\n if (item.kind === \"file\") {\n files.push(item.getAsFile())\n }\n }\n\n if (files.length) {\n event.preventDefault()\n event.stopPropagation()\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n for (let i = 0; i < files.length; i++) {\n uploadFile(files[i], setState)\n }\n }\n }\n }\n\n render = () => (\n \n this.props.onChange({ target: { value } })}\n updateAttachments={this.props.onAttachmentsChange}\n />\n {this.state.preview ? (\n
    \n {this.state.loading ? (\n
    \n
    \n \n
    \n
    \n ) : (\n \n )}\n
    \n ) : (\n {\n if (element && this.state.element !== element) {\n this.setState({ element })\n setMentions(this.props, element)\n }\n }}\n onChange={this.props.onChange}\n onDrop={this.onDrop}\n onFocus={() => this.setState({ focused: true })}\n onPaste={this.onPaste}\n onBlur={() => this.setState({ focused: false })}\n />\n )}\n {this.props.attachments.length > 0 && (\n this.props.onChange({ target: { value } })}\n />\n )}\n \n
    \n )\n}\n\nfunction setMentions(props, element) {\n $(element).atwho({\n at: \"@\",\n displayTpl: '
  • \"\"${username}
  • ',\n insertTpl: \"@${username}\",\n searchKey: \"username\",\n callbacks: {\n remoteFilter: function (query, callback) {\n $.getJSON(misago.get(\"MENTION_API\"), { q: query }, callback)\n },\n },\n })\n\n $(element).on(\"inserted.atwho\", (event, _storage, source, controller) => {\n const { query } = controller\n const username = source.target.innerText.trim()\n const prefix = event.target.value.substr(0, query.headPos)\n const suffix = event.target.value.substr(query.endPos)\n\n event.target.value = prefix + username + suffix\n props.onChange(event)\n\n const caret = query.headPos + username.length\n event.target.setSelectionRange(caret, caret)\n event.target.focus()\n })\n}\n\nexport default MarkupEditor\n","import MarkupEditor from \"./MarkupEditor\"\n\nexport default MarkupEditor\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nconst CLASS_ACTIVE = \"posting-active\"\nconst CLASS_DEFAULT = \"posting-default\"\nconst CLASS_MINIMIZED = \"posting-minimized\"\nconst CLASS_FULLSCREEN = \"posting-fullscreen\"\n\nclass PostingDialog extends React.Component {\n componentDidMount() {\n document.body.classList.add(CLASS_ACTIVE, CLASS_DEFAULT)\n }\n\n componentWillUnmount() {\n document.body.classList.remove(\n CLASS_ACTIVE,\n CLASS_DEFAULT,\n CLASS_MINIMIZED,\n CLASS_FULLSCREEN\n )\n }\n\n componentWillReceiveProps({ fullscreen, minimized }) {\n if (minimized) {\n document.body.classList.remove(CLASS_DEFAULT, CLASS_FULLSCREEN)\n document.body.classList.add(CLASS_MINIMIZED)\n } else {\n if (fullscreen) {\n document.body.classList.remove(CLASS_DEFAULT, CLASS_MINIMIZED)\n document.body.classList.add(CLASS_FULLSCREEN)\n } else {\n document.body.classList.remove(CLASS_FULLSCREEN, CLASS_MINIMIZED)\n document.body.classList.add(CLASS_DEFAULT)\n }\n }\n }\n\n render() {\n const { children, fullscreen, minimized } = this.props\n\n return (\n \n
    {children}
    \n \n )\n }\n}\n\nexport default PostingDialog\n","import React from \"react\"\n\nconst PostingDialogBody = ({ children }) => (\n
    {children}
    \n)\n\nexport default PostingDialogBody\n","import React from \"react\"\n\nconst PostingDialogError = ({ close, message }) => (\n
    \n
    \n error_outlined\n
    \n
    \n

    {message}

    \n \n
    \n
    \n)\n\nexport default PostingDialogError\n","import React from \"react\"\n\nconst PostingDialogHeader = ({\n children,\n close,\n fullscreen,\n minimize,\n minimized,\n fullscreenEnter,\n fullscreenExit,\n open,\n}) => (\n
    \n
    {children}
    \n {minimized ? (\n \n expand_less\n \n ) : (\n \n expand_more\n \n )}\n {fullscreen ? (\n \n fullscreen_exit\n \n ) : (\n \n fullscreen\n \n )}\n \n close\n \n
    \n)\n\nexport default PostingDialogHeader\n","import React from \"react\"\n\nexport default function PostingThreadOptions({\n isClosed,\n isHidden,\n isPinned,\n disabled,\n options,\n close,\n open,\n hide,\n unhide,\n pinGlobally,\n pinLocally,\n unpin,\n}) {\n const icons = getIcons(isClosed, isHidden, isPinned)\n\n return (\n
    \n \n {icons.length > 0 ? (\n \n {icons.map((icon) => (\n \n {icon}\n \n ))}\n \n ) : (\n more_horiz\n )}\n \n
      \n {options.pin === 2 && isPinned !== 2 && (\n
    • \n \n bookmark\n {pgettext(\"post thread\", \"Pinned globally\")}\n \n
    • \n )}\n {options.pin >= isPinned && isPinned !== 1 && (\n
    • \n \n bookmark_outline\n {pgettext(\"post thread\", \"Pinned in category\")}\n \n
    • \n )}\n {options.pin >= isPinned && isPinned !== 0 && (\n
    • \n \n radio_button_unchecked\n {pgettext(\"post thread\", \"Not pinned\")}\n \n
    • \n )}\n {options.close && !!isClosed && (\n
    • \n \n lock_outline\n {pgettext(\"post thread\", \"Open\")}\n \n
    • \n )}\n {options.close && !isClosed && (\n
    • \n \n lock\n {pgettext(\"post thread\", \"Closed\")}\n \n
    • \n )}\n {options.hide && !!isHidden && (\n
    • \n \n visibility\n {pgettext(\"post thread\", \"Visible\")}\n \n
    • \n )}\n {options.hide && !isHidden && (\n
    • \n \n visibility_off\n {pgettext(\"post thread\", \"Hidden\")}\n \n
    • \n )}\n
    \n
    \n )\n}\n\nfunction getIcons(closed, hidden, pinned) {\n const icons = []\n if (pinned === 2) icons.push(\"bookmark\")\n if (pinned === 1) icons.push(\"bookmark_outline\")\n if (closed) icons.push(\"lock\")\n if (hidden) icons.push(\"visibility_off\")\n return icons\n}\n","import React from \"react\"\nimport CategorySelect from \"misago/components/category-select\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport PostingThreadOptions from \"./PostingThreadOptions\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n options: null,\n\n title: \"\",\n category: props.category || null,\n categories: [],\n post: \"\",\n attachments: [],\n close: false,\n hide: false,\n pin: 0,\n\n validators: {\n title: getTitleValidators(),\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n }\n\n loadSuccess = (data) => {\n let category = null\n let options = null\n\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n // pick first category that allows posting and if it may, override it with initial one\n if (\n item.post !== false &&\n (!category || item.id == this.state.category)\n ) {\n category = item.id\n options = item.post\n }\n\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n })\n })\n\n this.setState({\n isReady: true,\n options,\n\n categories,\n category,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n onCancel = () => {\n const formEmpty = !!(\n this.state.post.length === 0 &&\n this.state.title.length === 0 &&\n this.state.attachments.length === 0\n )\n\n if (formEmpty) {\n this.minimize()\n return posting.close()\n }\n\n const cancel = window.confirm(\n pgettext(\"post thread\", \"Are you sure you want to discard thread?\")\n )\n if (cancel) {\n this.minimize()\n posting.close()\n }\n }\n\n onTitleChange = (event) => {\n this.changeValue(\"title\", event.target.value)\n }\n\n onCategoryChange = (event) => {\n const category = this.state.categories.find((item) => {\n return event.target.value == item.value\n })\n\n // if selected pin is greater than allowed, reduce it\n let pin = this.state.pin\n if (category.post.pin && category.post.pin < pin) {\n pin = category.post.pin\n }\n\n this.setState({\n category: category.id,\n categoryOptions: category.post,\n\n pin,\n })\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onClose = () => {\n this.changeValue(\"close\", true)\n }\n\n onOpen = () => {\n this.changeValue(\"close\", false)\n }\n\n onPinGlobally = () => {\n this.changeValue(\"pin\", 2)\n }\n\n onPinLocally = () => {\n this.changeValue(\"pin\", 1)\n }\n\n onUnpin = () => {\n this.changeValue(\"pin\", 0)\n }\n\n onHide = () => {\n this.changeValue(\"hide\", true)\n }\n\n onUnhide = () => {\n this.changeValue(\"hide\", false)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n clean() {\n if (!this.state.title.trim().length) {\n snackbar.error(\n pgettext(\"posting form\", \"You have to enter thread title.\")\n )\n return false\n }\n\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.title) {\n snackbar.error(errors.title[0])\n return false\n }\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.submit, {\n title: this.state.title,\n category: this.state.category,\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n close: this.state.close,\n hide: this.state.hide,\n pin: this.state.pin,\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n window.location = success.url\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.category || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n const dialogProps = {\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n const showOptions = !!(\n this.state.options.close ||\n this.state.options.hide ||\n this.state.options.pin\n )\n\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n {showOptions && (\n \n \n \n )}\n \n \n \n \n
    \n )\n }\n}\n\nconst PostingDialogStart = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n}) => (\n \n \n {pgettext(\"post thread\", \"Start new thread\")}\n \n {children}\n \n)\n","export default function (usernames) {\n const normalisedNames = usernames\n .split(\",\")\n .map((i) => i.trim().toLowerCase())\n const removedBlanks = normalisedNames.filter((i) => i.length > 0)\n const removedDuplicates = removedBlanks.filter((name, pos) => {\n return removedBlanks.indexOf(name) == pos\n })\n\n return removedDuplicates\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport cleanUsernames from \"./utils/usernames\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n const to = (props.to || []).map((user) => user.username).join(\", \")\n\n this.state = {\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n to: to,\n title: \"\",\n post: \"\",\n attachments: [],\n\n validators: {\n title: getTitleValidators(),\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n onCancel = () => {\n const formEmpty = !!(\n this.state.post.length === 0 &&\n this.state.title.length === 0 &&\n this.state.to.length === 0 &&\n this.state.attachments.length === 0\n )\n\n if (formEmpty) {\n return this.close()\n }\n\n const cancel = window.confirm(\n pgettext(\n \"post thread\",\n \"Are you sure you want to discard private thread?\"\n )\n )\n if (cancel) {\n this.close()\n }\n }\n\n onToChange = (event) => {\n this.changeValue(\"to\", event.target.value)\n }\n\n onTitleChange = (event) => {\n this.changeValue(\"title\", event.target.value)\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n clean() {\n if (!cleanUsernames(this.state.to).length) {\n snackbar.error(\n pgettext(\"posting form\", \"You have to enter at least one recipient.\")\n )\n return false\n }\n\n if (!this.state.title.trim().length) {\n snackbar.error(\n pgettext(\"posting form\", \"You have to enter thread title.\")\n )\n return false\n }\n\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.title) {\n snackbar.error(errors.title[0])\n return false\n }\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.submit, {\n to: cleanUsernames(this.state.to),\n title: this.state.title,\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n window.location = success.url\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.to || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n )\n }\n}\n\nconst PostingDialogStartPrivate = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n}) => (\n \n \n {pgettext(\"post thread\", \"Start private thread\")}\n \n {children}\n \n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n post: this.props.default || \"\",\n attachments: [],\n\n validators: {\n post: getPostValidators(),\n },\n errors: {},\n }\n\n this.quoteText = \"\"\n }\n\n componentDidMount() {\n ajax\n .get(this.props.config, this.props.context || null)\n .then(this.loadSuccess, this.loadError)\n\n setGlobalState(false, this.onQuote)\n }\n\n componentWillUnmount() {\n clearGlobalState()\n }\n\n componentWillReceiveProps(nextProps) {\n const context = this.props.context\n const newContext = nextProps.context\n\n // User clicked \"reply\" instead of \"quote\"\n if (context && newContext && !newContext.reply) return\n\n ajax\n .get(nextProps.config, nextProps.context || null)\n .then(this.appendData, snackbar.apiError)\n }\n\n loadSuccess = (data) => {\n this.setState({\n isReady: true,\n\n post: data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\"\n : this.state.post,\n })\n\n this.quoteText = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\"\n : this.state.post\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n appendData = (data) => {\n const newPost = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n : \"\"\n\n this.setState((prevState, props) => {\n if (prevState.post.length > 0) {\n return {\n post: prevState.post.trim() + \"\\n\\n\" + newPost,\n }\n }\n\n return {\n post: newPost,\n }\n })\n\n this.open()\n }\n\n onCancel = () => {\n // If only the quote text is on editor user didn't add anything\n // so no changes to discard\n const onlyQuoteTextInEditor = this.state.post === this.quoteText\n\n if (onlyQuoteTextInEditor && this.state.attachments.length === 0) {\n return this.close()\n }\n\n const cancel = window.confirm(\n pgettext(\"post reply\", \"Are you sure you want to discard your reply?\")\n )\n if (cancel) {\n this.close()\n }\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onQuote = (quote) => {\n this.setState(({ post }) => {\n if (post.length > 0) {\n return { post: post.trim() + \"\\n\\n\" + quote }\n }\n\n return { post: quote }\n })\n\n this.open()\n }\n\n clean() {\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n setGlobalState(true, this.onQuote)\n\n return ajax.post(this.props.submit, {\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n setGlobalState(false, this.onQuote)\n\n snackbar.success(pgettext(\"post reply\", \"Your reply has been posted.\"))\n window.location = success.url.index\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n setGlobalState(false, this.onQuote)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n thread: this.props.thread,\n\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n return (\n \n \n \n \n \n )\n }\n}\n\nconst PostingDialogReply = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n thread,\n}) => (\n \n \n {interpolate(\n pgettext(\"post reply\", \"Reply to: %(thread)s\"),\n { thread: thread.title },\n true\n )}\n \n {children}\n \n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: false,\n\n minimized: false,\n fullscreen: false,\n\n post: \"\",\n attachments: [],\n protect: false,\n\n canProtect: false,\n\n validators: {\n post: getPostValidators(),\n },\n errors: {},\n }\n\n this.originalPost = \"\"\n }\n\n componentDidMount() {\n ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n\n setGlobalState(false, this.onQuote)\n }\n\n componentWillUnmount() {\n clearGlobalState()\n }\n\n componentWillReceiveProps(nextProps) {\n const context = this.props.context\n const newContext = nextProps.context\n\n if (context && newContext && context.reply === newContext.reply) return\n\n ajax\n .get(nextProps.config, nextProps.context || null)\n .then(this.appendData, snackbar.apiError)\n }\n\n loadSuccess = (data) => {\n this.originalPost = data.post\n\n this.setState({\n isReady: true,\n\n post: data.post,\n attachments: attachments.hydrate(data.attachments),\n protect: data.is_protected,\n\n canProtect: data.can_protect,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n appendData = (data) => {\n const newPost = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n : \"\"\n\n this.setState((prevState, props) => {\n if (prevState.post.length > 0) {\n return {\n post: prevState.post.trim() + \"\\n\\n\" + newPost,\n }\n }\n\n return {\n post: newPost,\n }\n })\n\n this.open()\n }\n\n onCancel = () => {\n const originalPostSameAsCurrentPost =\n this.state.originalPost === this.state.post\n const noAttachementsAdded = this.state.attachments.length === 0\n\n if (originalPostSameAsCurrentPost && noAttachementsAdded) {\n return this.close()\n }\n\n const cancel = window.confirm(\n pgettext(\"edit reply\", \"Are you sure you want to discard changes?\")\n )\n if (cancel) {\n this.close()\n }\n }\n\n onProtect = () => {\n this.setState({\n protect: true,\n })\n }\n\n onUnprotect = () => {\n this.setState({\n protect: false,\n })\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onQuote = (quote) => {\n this.setState(({ post }) => {\n if (post.length > 0) {\n return { post: post.trim() + \"\\n\\n\" + quote }\n }\n\n return { post: quote }\n })\n\n this.open()\n }\n\n clean() {\n if (!this.state.post.trim().length) {\n snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n setGlobalState(true, this.onQuote)\n\n return ajax.put(this.props.submit, {\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n protect: this.state.protect,\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n setGlobalState(false, this.onQuote)\n\n snackbar.success(pgettext(\"edit reply\", \"Reply has been edited.\"))\n window.location = success.url.index\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.category || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n setGlobalState(false, this.onQuote)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n post: this.props.post,\n\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n return (\n \n \n this.setState({ protect: true })}\n disableProtection={() => this.setState({ protect: false })}\n value={this.state.post}\n submitText={pgettext(\"edit reply submit\", \"Edit reply\")}\n disabled={this.state.isLoading}\n onAttachmentsChange={this.onAttachmentsChange}\n onChange={this.onPostChange}\n />\n \n \n )\n }\n}\n\nconst PostingDialogEditReply = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n post,\n}) => (\n \n \n {interpolate(\n pgettext(\"edit reply\", \"Edit reply by %(poster)s from %(date)s\"),\n {\n poster: post.poster ? post.poster.username : post.poster_name,\n date: post.posted_on.fromNow(),\n },\n true\n )}\n \n {children}\n \n)\n","import React from \"react\"\nimport PostingQuoteSelection from \"./PostingQuoteSelection\"\nimport getQuoteMarkup from \"./getQuoteMarkup\"\nimport { clearGlobalState, getGlobalState, setGlobalState } from \"./globalState\"\nimport Start from \"./start\"\nimport StartPrivate from \"./start-private\"\nimport Reply from \"./reply\"\nimport Edit from \"./edit\"\n\nexport default function (props) {\n switch (props.mode) {\n case \"START\":\n return \n\n case \"START_PRIVATE\":\n return \n\n case \"REPLY\":\n return \n\n case \"EDIT\":\n return \n\n default:\n return null\n }\n}\n\nexport {\n PostingQuoteSelection,\n clearGlobalState,\n getGlobalState,\n getQuoteMarkup,\n setGlobalState,\n}\n","import { maxLength, minLength } from \"misago/utils/validators\"\nimport misago from \"misago\"\n\nexport function getTitleValidators() {\n return [getTitleLengthMin(), getTitleLengthMax()]\n}\n\nexport function getPostValidators() {\n if (misago.get(\"SETTINGS\").post_length_max) {\n return [validatePostLengthMin(), validatePostLengthMax()]\n } else {\n return [validatePostLengthMin()]\n }\n}\n\nexport function getTitleLengthMin() {\n return minLength(\n misago.get(\"SETTINGS\").thread_title_length_min,\n (limitValue, length) => {\n const message = npgettext(\n \"thread title length validator\",\n \"Thread title should be at least %(limit_value)s character long (it has %(show_value)s).\",\n \"Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function getTitleLengthMax() {\n return maxLength(\n misago.get(\"SETTINGS\").thread_title_length_max,\n (limitValue, length) => {\n const message = npgettext(\n \"thread title length validator\",\n \"Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n \"Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function validatePostLengthMin() {\n return minLength(\n misago.get(\"SETTINGS\").post_length_min,\n (limitValue, length) => {\n const message = npgettext(\n \"post length validator\",\n \"Posted message should be at least %(limit_value)s character long (it has %(show_value)s).\",\n \"Posted message should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function validatePostLengthMax() {\n return maxLength(\n misago.get(\"SETTINGS\").post_length_max || 1000000,\n (limitValue, length) => {\n const message = npgettext(\n \"post length validator\",\n \"Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n \"Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getChoice() {\n let choice = null\n this.props.choices.map((item) => {\n if (item.value === this.props.value) {\n choice = item\n }\n })\n return choice\n }\n\n getIcon() {\n return this.getChoice().icon\n }\n\n getLabel() {\n return this.getChoice().label\n }\n\n change = (value) => {\n return () => {\n this.props.onChange({\n target: {\n value: value,\n },\n })\n }\n }\n\n render() {\n return (\n
    \n \n \n {this.getLabel()}\n \n
      \n {this.props.choices.map((item, i) => {\n return (\n
    • \n \n \n {item.label}\n \n
    • \n )\n })}\n
    \n
    \n )\n }\n}\n\nexport function Icon({ icon }) {\n if (!icon) return null\n\n return {icon}\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport StartSocialAuth from \"misago/components/StartSocialAuth\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n showActivation: false,\n\n username: \"\",\n password: \"\",\n\n validators: {\n username: [],\n password: [],\n },\n }\n }\n\n clean() {\n if (!this.isValid()) {\n snackbar.error(pgettext(\"sign in modal\", \"Fill out both fields.\"))\n return false\n } else {\n return true\n }\n }\n\n send() {\n return ajax.post(misago.get(\"AUTH_API\"), {\n username: this.state.username,\n password: this.state.password,\n })\n }\n\n handleSuccess() {\n let form = $(\"#hidden-login-form\")\n\n form.append('')\n form.append('')\n\n // fill out form with user credentials and submit it, this will tell\n // Misago to redirect user back to right page, and will trigger browser's\n // key ring feature\n form.find('input[type=\"hidden\"]').val(ajax.getCsrfToken())\n form.find('input[name=\"next\"]').val(window.location.pathname)\n form.find('input[name=\"username\"]').val(this.state.username)\n form.find('input[name=\"password\"]').val(this.state.password)\n form.submit()\n\n // keep form loading\n this.setState({\n isLoading: true,\n })\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.code === \"inactive_admin\") {\n snackbar.info(rejection.detail)\n } else if (rejection.code === \"inactive_user\") {\n snackbar.info(rejection.detail)\n this.setState({\n showActivation: true,\n })\n } else if (rejection.code === \"banned\") {\n showBannedPage(rejection.detail)\n modal.hide()\n } else {\n snackbar.error(rejection.detail)\n }\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n modal.hide()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n getActivationButton() {\n if (!this.state.showActivation) return null\n\n return (\n \n {pgettext(\"sign in modal btn\", \"Activate account\")}\n \n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"sign in modal title\", \"Sign in\")}\n

    \n
    \n
    \n
    \n \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    \n {this.getActivationButton()}\n \n {pgettext(\"sign in modal btn\", \"Sign in\")}\n \n \n {pgettext(\"sign in modal btn\", \"Forgot password?\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClass() {\n return getStatusClassName(this.props.status)\n }\n\n render() {\n return {this.props.children}\n }\n}\n\nexport class StatusIcon extends React.Component {\n getIcon() {\n if (this.props.status.is_banned) {\n return \"remove_circle_outline\"\n } else if (this.props.status.is_hidden) {\n return \"help_outline\"\n } else if (this.props.status.is_online_hidden) {\n return \"label\"\n } else if (this.props.status.is_offline_hidden) {\n return \"label_outline\"\n } else if (this.props.status.is_online) {\n return \"lens\"\n } else if (this.props.status.is_offline) {\n return \"panorama_fish_eye\"\n }\n }\n\n render() {\n return {this.getIcon()}\n }\n}\n\nexport class StatusLabel extends React.Component {\n getHelp() {\n return getStatusDescription(this.props.user, this.props.status)\n }\n\n getLabel() {\n if (this.props.status.is_banned) {\n return pgettext(\"user status\", \"Banned\")\n } else if (this.props.status.is_hidden) {\n return pgettext(\"user status\", \"Hidden\")\n } else if (this.props.status.is_online_hidden) {\n return pgettext(\"user status\", \"Online (hidden)\")\n } else if (this.props.status.is_offline_hidden) {\n return pgettext(\"user status\", \"Offline (hidden)\")\n } else if (this.props.status.is_online) {\n return pgettext(\"user status\", \"Online\")\n } else if (this.props.status.is_offline) {\n return pgettext(\"user status\", \"Offline\")\n }\n }\n\n render() {\n return (\n \n {this.getLabel()}\n \n )\n }\n}\n\nexport function getStatusClassName(status) {\n let className = \"\"\n if (status.is_banned) {\n className = \"banned\"\n } else if (status.is_hidden) {\n className = \"offline\"\n } else if (status.is_online_hidden) {\n className = \"online\"\n } else if (status.is_offline_hidden) {\n className = \"offline\"\n } else if (status.is_online) {\n className = \"online\"\n } else if (status.is_offline) {\n className = \"offline\"\n }\n\n return \"user-status user-\" + className\n}\n\nexport function getStatusDescription(user, status) {\n if (status.is_banned) {\n if (status.banned_until) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is banned until %(ban_expires)s\"),\n {\n username: user.username,\n ban_expires: status.banned_until.format(\"LL, LT\"),\n },\n true\n )\n } else {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is banned\"),\n {\n username: user.username,\n },\n true\n )\n }\n } else if (status.is_hidden) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is hiding presence\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_online_hidden) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is online (hidden)\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_offline_hidden) {\n return interpolate(\n pgettext(\n \"user status\",\n \"%(username)s was last seen %(last_click)s (hidden)\"\n ),\n {\n username: user.username,\n last_click: status.last_click.fromNow(),\n },\n true\n )\n } else if (status.is_online) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s is online\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_offline) {\n return interpolate(\n pgettext(\"user status\", \"%(username)s was last seen %(last_click)s\"),\n {\n username: user.username,\n last_click: status.last_click.fromNow(),\n },\n true\n )\n }\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\n\nexport default function ({ showStatus, user }) {\n return (\n
      \n \n \n
    • \n \n \n \n
    \n )\n}\n\nexport function Status({ showStatus, user }) {\n if (!showStatus) return null\n\n return (\n
  • \n \n \n \n
  • \n )\n}\n\nexport function JoinDate({ user }) {\n const { joined_on } = user\n\n let title = interpolate(\n pgettext(\"users list item\", \"Joined on %(joined_on)s\"),\n {\n joined_on: joined_on.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n pgettext(\"users list item\", \"Joined %(joined_on)s\"),\n {\n joined_on: joined_on.fromNow(),\n },\n true\n )\n\n return (\n
  • \n {message}\n
  • \n )\n}\n\nexport function Posts({ user }) {\n const className = getStatClassName(\"user-stat-posts\", user.posts)\n const message = npgettext(\n \"users list item\",\n \"%(posts)s post\",\n \"%(posts)s posts\",\n user.posts\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n posts: user.posts,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Threads({ user }) {\n const className = getStatClassName(\"user-stat-threads\", user.threads)\n const message = npgettext(\n \"users list item\",\n \"%(threads)s thread\",\n \"%(threads)s threads\",\n user.threads\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n threads: user.threads,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Followers({ user }) {\n const className = getStatClassName(\"user-stat-followers\", user.followers)\n const message = npgettext(\n \"users list item\",\n \"%(followers)s follower\",\n \"%(followers)s followers\",\n user.followers\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n followers: user.followers,\n },\n true\n )}\n
  • \n )\n}\n\nexport function getStatClassName(className, stat) {\n if (stat === 0) {\n return className + \" user-stat-empty\"\n }\n return className\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title || rank.name\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n {userTitle}\n \n )\n }\n\n return {userTitle}\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Stats from \"./stats\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ showStatus, user }) {\n const { rank } = user\n\n let className = \"panel user-card\"\n if (rank.css_class) {\n className += \" user-card-\" + rank.css_class\n }\n\n return (\n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n\n \n
    \n \n
    \n\n
    \n \n
    \n
    \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n\n
    \n \n  \n \n
    \n
    \n \n  \n \n
    \n\n
    \n
      \n
    • \n \n  \n \n
    • \n
    • \n \n  \n \n
    • \n
    • \n
    • \n \n  \n \n
    • \n
    • \n \n  \n \n
    • \n
    \n
    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ colClassName, cols }) {\n const list = Array.apply(null, { length: cols }).map(Number.call, Number)\n\n return (\n
    \n
    \n {list.map((i) => {\n let className = colClassName\n if (i !== 0) className += \" hidden-xs\"\n if (i === 3) className += \" hidden-sm\"\n\n return (\n
    \n \n
    \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport Card from \"./card\"\nimport Preview from \"./preview\"\n\nexport default function ({ cols, isReady, showStatus, users }) {\n let colClassName = \"col-xs-12 col-sm-4\"\n if (cols === 4) {\n colClassName += \" col-md-3\"\n }\n\n if (!isReady) {\n return \n }\n\n return (\n
    \n
    \n {users.map((user) => {\n return (\n
    \n \n
    \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n dropdown: false,\n }\n }\n\n toggleNav = () => {\n this.setState({\n dropdown: !this.state.dropdown,\n })\n }\n\n hideNav = () => {\n this.setState({\n dropdown: false,\n })\n }\n\n getCompactNavClassName() {\n if (this.state.dropdown) {\n return \"compact-nav open\"\n } else {\n return \"compact-nav\"\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.value) {\n return \"btn btn-yes-no btn-yes-no-on\"\n } else {\n return \"btn btn-yes-no btn-yes-no-off\"\n }\n }\n\n getIcon() {\n if (!!this.props.value) {\n return this.props.iconOn || \"check_box\"\n } else {\n return this.props.iconOff || \"check_box_outline_blank\"\n }\n }\n\n getLabel() {\n if (!!this.props.value) {\n return this.props.labelOn || pgettext(\"yesno switch choice\", \"yes\")\n } else {\n return this.props.labelOff || pgettext(\"yesno switch choice\", \"no\")\n }\n }\n\n toggle = () => {\n this.props.onChange({\n target: {\n value: !this.props.value,\n },\n })\n }\n\n render() {\n return (\n \n {this.getIcon()}\n {this.getLabel()}\n \n )\n }\n}\n","export const locale = window.misago_locale || \"en-us\"\n\nexport const momentAgo = pgettext(\"time ago\", \"moment ago\")\nexport const momentAgoShort = pgettext(\"time ago\", \"now\")\nexport const dayAt = pgettext(\"day at time\", \"%(day)s at %(time)s\")\nexport const soonAt = pgettext(\"day at time\", \"Today at %(time)s\")\nexport const tomorrowAt = pgettext(\"day at time\", \"Tomorrow at %(time)s\")\nexport const yesterdayAt = pgettext(\"day at time\", \"Yesterday at %(time)s\")\n\nexport const minutesShort = pgettext(\"short minutes\", \"%(time)sm\")\nexport const hoursShort = pgettext(\"short hours\", \"%(time)sh\")\nexport const daysShort = pgettext(\"short days\", \"%(time)sd\")\nexport const thisYearShort = pgettext(\"short month\", \"%(day)s %(month)s\")\nexport const otherYearShort = pgettext(\"short month\", \"%(month)s %(year)s\")\n\nexport const relativeNumeric = new Intl.RelativeTimeFormat(locale, {\n numeric: \"always\",\n style: \"long\",\n})\n\nexport const fullDateTime = new Intl.DateTimeFormat(locale, {\n dateStyle: \"full\",\n timeStyle: \"medium\",\n})\n\nexport const thisYearDate = new Intl.DateTimeFormat(locale, {\n month: \"long\",\n day: \"numeric\",\n})\n\nexport const otherYearDate = new Intl.DateTimeFormat(locale, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n})\n\nexport const short = new Intl.DateTimeFormat(locale, {\n year: \"2-digit\",\n month: \"short\",\n day: \"numeric\",\n})\n\nexport const weekday = new Intl.DateTimeFormat(locale, {\n weekday: \"long\",\n})\n\nexport const shortTime = new Intl.DateTimeFormat(locale, { timeStyle: \"short\" })\n\nexport function dateRelative(date) {\n const now = new Date()\n const diff = Math.round((date - now) / 1000)\n const absDiff = Math.abs(diff)\n const sign = diff < 1 ? -1 : 1\n\n if (absDiff < 90) {\n return momentAgo\n }\n\n if (absDiff < 60 * 47) {\n const minutes = Math.round(absDiff / 60) * sign\n return relativeNumeric.format(minutes, \"minute\")\n }\n\n if (absDiff < 3600 * 3) {\n const hours = Math.round(absDiff / 3600) * sign\n return relativeNumeric.format(hours, \"hour\")\n }\n\n if (isSameDay(now, date)) {\n if (diff > 0) {\n return soonAt.replace(\"%(time)s\", shortTime.format(date))\n }\n\n return shortTime.format(date)\n }\n\n if (isYesterday(date)) {\n return yesterdayAt.replace(\"%(time)s\", shortTime.format(date))\n }\n\n if (isTomorrow(date)) {\n return tomorrowAt.replace(\"%(time)s\", shortTime.format(date))\n }\n\n if (diff < 0 && absDiff < 3600 * 24 * 6) {\n const day = weekday.format(date)\n return formatDayAtTime(day, date)\n }\n\n if (now.getFullYear() == date.getFullYear()) {\n return thisYearDate.format(date)\n }\n\n return otherYearDate.format(date)\n}\n\nexport function isSameDay(now, date) {\n return (\n now.getFullYear() == date.getFullYear() &&\n now.getMonth() == date.getMonth() &&\n now.getDate() == date.getDate()\n )\n}\n\nexport function isYesterday(date) {\n const yesterday = new Date()\n yesterday.setDate(yesterday.getDate() - 1)\n return isSameDay(yesterday, date)\n}\n\nexport function isTomorrow(date) {\n const yesterday = new Date()\n yesterday.setDate(yesterday.getDate() + 1)\n return isSameDay(yesterday, date)\n}\n\nexport function formatDayAtTime(day, date) {\n return dayAt\n .replace(\"%(day)s\", day)\n .replace(\"%(time)s\", shortTime.format(date))\n}\n\nexport function dateRelativeShort(date) {\n const now = new Date()\n const absDiff = Math.abs(Math.round((date - now) / 1000))\n\n if (absDiff < 60) {\n return momentAgoShort\n }\n\n if (absDiff < 60 * 55) {\n const minutes = Math.round(absDiff / 60)\n return minutesShort.replace(\"%(time)s\", minutes)\n }\n\n if (absDiff < 3600 * 24) {\n const hours = Math.round(absDiff / 3600)\n return hoursShort.replace(\"%(time)s\", hours)\n }\n\n if (absDiff < 86400 * 7) {\n const days = Math.round(absDiff / 86400)\n return daysShort.replace(\"%(time)s\", days)\n }\n\n const parts = {}\n short.formatToParts(date).forEach(function ({ type, value }) {\n parts[type] = value\n })\n\n if (date.getFullYear() === now.getFullYear()) {\n return thisYearShort\n .replace(\"%(day)s\", parts.day)\n .replace(\"%(month)s\", parts.month)\n }\n\n return otherYearShort\n .replace(\"%(year)s\", parts.year)\n .replace(\"%(month)s\", parts.month)\n}\n","class OrderedList {\n constructor(items) {\n this.isOrdered = false\n this._items = items || []\n }\n\n add(key, item, order) {\n this._items.push({\n key: key,\n item: item,\n\n after: order ? order.after || null : null,\n before: order ? order.before || null : null,\n })\n }\n\n get(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 has(key) {\n return this.get(key) !== undefined\n }\n\n values() {\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 order(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 orderedValues() {\n return this.order(true)\n }\n\n _order(unordered) {\n // Index of unordered items\n var index = []\n unordered.forEach(function (item) {\n index.push(item.key)\n })\n\n // Ordered items\n var ordered = []\n var ordering = []\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item)\n ordering.push(item.key)\n }\n })\n\n // Second pass: register items that\n // specify their before to \"_end\"\n unordered.forEach(function (item) {\n if (item.before === \"_end\") {\n ordered.push(item)\n ordering.push(item.key)\n }\n })\n\n // Third pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after)\n if (insertAt !== -1) {\n insertAt += 1\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before)\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item)\n ordering.splice(insertAt, 0, item.key)\n }\n }\n }\n\n var iterations = 200\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1\n unordered.forEach(insertItem)\n }\n\n return ordered\n }\n}\n\nexport default OrderedList\n","class AjaxLoader {\n constructor() {\n this.element = document.getElementById(\"misago-ajax-loader\")\n this.requests = 0\n this.timeout = null\n }\n\n show = () => {\n this.requests += 1\n this.update()\n }\n\n hide = () => {\n if (this.requests) {\n this.requests -= 1\n this.update()\n }\n }\n\n update = () => {\n if (this.timeout) {\n window.clearTimeout(this.timeout)\n }\n\n if (this.requests) {\n this.element.classList.add(\"busy\")\n this.element.classList.remove(\"complete\")\n } else {\n this.element.classList.remove(\"busy\")\n this.element.classList.add(\"complete\")\n\n this.timeout = setTimeout(() => {\n this.element.classList.remove(\"complete\")\n }, 1500)\n }\n }\n}\n\nexport function useLoader(target) {\n const silent = target.closest(\"[hx-silent]\")\n if (silent) {\n return silent.getAttribute(\"hx-silent\") !== \"true\"\n }\n\n return true\n}\n\nexport default AjaxLoader\n","import htmx from \"htmx.org\"\n\nclass BulkModeration {\n constructor(options) {\n this.menu = options.menu ? document.querySelector(options.menu) : null\n this.form = options.form\n this.modal = options.modal\n this.actions = document.querySelectorAll(options.actions)\n this.selection = options.selection\n this.control = document.querySelector(options.button.selector)\n this.text = options.button.text\n\n this.update()\n this.registerEvents()\n this.registerActions()\n }\n\n registerActions = () => {\n this.actions.forEach((element) => {\n if (element.getAttribute(\"moderation-action\") === \"remove-selection\") {\n element.addEventListener(\"click\", this.onRemoveSelection)\n } else {\n element.addEventListener(\"click\", this.onAction)\n }\n })\n }\n\n onAction = (event) => {\n const form = document.querySelector(this.form)\n const data = {}\n\n new FormData(form).forEach((value, key) => {\n if (typeof data[key] === \"undefined\") {\n data[key] = []\n }\n data[key].push(value)\n })\n\n const target = event.target\n data.moderation = target.getAttribute(\"moderation-action\")\n\n if (target.getAttribute(\"moderation-multistage\") === \"true\") {\n htmx\n .ajax(\"POST\", document.location.href, {\n target: this.modal,\n swap: \"innerHTML\",\n values: data,\n })\n .then(() => {\n $(this.modal).modal(\"show\")\n })\n } else {\n htmx.ajax(\"POST\", document.location.href, {\n target: \"#misago-htmx-root\",\n swap: \"outerHTML\",\n values: data,\n })\n }\n }\n\n onRemoveSelection = (event) => {\n document.querySelectorAll(this.selection).forEach((element) => {\n element.checked = false\n })\n this.update()\n }\n\n registerEvents = () => {\n document.body.addEventListener(\"click\", ({ target }) => {\n if (target.tagName === \"INPUT\" && target.type === \"checkbox\") {\n this.update()\n }\n })\n\n htmx.onLoad(() => this.update())\n }\n\n update = () => {\n const selection = document.querySelectorAll(this.selection).length\n\n this.control.innerText = this.text.replace(\"%(number)s\", selection)\n this.control.disabled = !selection\n\n if (this.menu) {\n if (selection) {\n this.menu.classList.add(\"visible\")\n } else {\n this.menu.classList.remove(\"visible\")\n }\n }\n }\n}\n\nexport default BulkModeration\n","import htmx from \"htmx.org\"\n\nconst DEBOUNCE = 1000\n\nconst cache = {}\n\nexport function registerElementValidator(element) {\n const active = element.getAttribute(\"misago-validate-active\")\n if (active) {\n return\n }\n\n const url = element.getAttribute(\"misago-validate\")\n const user = element.getAttribute(\"misago-validate-user\")\n const strip =\n element.getAttribute(\"misago-validate-strip\") == \"false\" ? false : true\n const input = element.querySelector(\"input\")\n const csrf = input.closest(\"form\").querySelector(\"input[type=hidden]\")\n\n if (!url || !input) {\n return\n }\n\n if (!cache[url]) {\n cache[url] = {}\n }\n\n element.setAttribute(\"misago-validate-active\", \"true\")\n\n let timeout = null\n\n input.addEventListener(\"keyup\", (event) => {\n let value = event.target.value\n if (strip) {\n value = value.trim()\n }\n\n if (value.trim().length === 0) {\n clearFormControlValidationState(element)\n return\n }\n\n if (cache[url][value]) {\n setFormControlValidationState(element, input, cache[url][value])\n } else {\n if (timeout) {\n window.clearTimeout(timeout)\n }\n\n timeout = window.setTimeout(async () => {\n const { errors } = await callValidationUrl(url, csrf, value, user)\n cache[url][value] = errors\n setFormControlValidationState(element, input, errors)\n }, DEBOUNCE)\n }\n })\n}\n\nfunction setFormControlValidationState(element, input, errors) {\n if (errors.length) {\n setFormControlErrorValidationState(element, input, errors)\n } else {\n setFormControlSuccessValidationState(element)\n }\n}\n\nfunction setFormControlErrorValidationState(element, input, errors) {\n element.classList.remove(\"has-success\")\n element.classList.add(\"has-error\")\n\n clearFormControlValidationMessages(element)\n\n errors.forEach((error) => {\n const message = document.createElement(\"p\")\n message.className = \"help-block\"\n message.setAttribute(\"misago-dynamic-message\", \"true\")\n message.innerText = error\n input.after(message)\n })\n}\n\nfunction setFormControlSuccessValidationState(element) {\n element.classList.remove(\"has-error\")\n element.classList.add(\"has-success\")\n\n clearFormControlValidationMessages(element)\n}\n\nfunction clearFormControlValidationState(element) {\n element.classList.remove(\"has-error\")\n element.classList.remove(\"has-success\")\n\n clearFormControlValidationMessages(element)\n}\n\nfunction clearFormControlValidationMessages(element) {\n element\n .querySelectorAll(\"[misago-dynamic-message]\")\n .forEach((i) => i.remove())\n}\n\nasync function callValidationUrl(url, csrf, value, user) {\n const data = new FormData()\n data.set(csrf.name, csrf.value)\n data.set(\"value\", value)\n if (user) {\n data.set(\"user\", user)\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n mode: \"cors\",\n credentials: \"same-origin\",\n body: data,\n })\n return await response.json()\n}\n\nexport function registerValidators(element) {\n const target = element || document\n target.querySelectorAll(\"[misago-validate]\").forEach(registerElementValidator)\n}\n\nhtmx.onLoad(registerValidators)\n","import htmx from \"htmx.org\"\n\nconst SNACKBAR_TTL = 6\n\nconst container = document.getElementById(\"misago-snackbars\")\nlet timeout = null\n\nexport function removeSnackbars() {\n container.replaceChildren()\n}\n\nfunction renderSnackbars() {\n if (timeout) {\n window.clearTimeout(timeout)\n }\n\n container.querySelectorAll(\".snackbar\").forEach((element) => {\n element.classList.add(\"in\")\n })\n\n timeout = window.setTimeout(() => {\n container.querySelectorAll(\".snackbar\").forEach((element) => {\n element.classList.add(\"out\")\n timeout = window.setTimeout(removeSnackbars, 1000)\n })\n }, SNACKBAR_TTL * 1000)\n}\n\nexport function snackbar(type, message) {\n removeSnackbars()\n\n if (timeout) {\n window.clearTimeout(timeout)\n }\n\n const element = document.createElement(\"div\")\n element.classList.add(\"snackbar\")\n element.classList.add(\"snackbar-\" + type)\n element.innerText = message\n element.role = \"alert\"\n container.appendChild(element)\n\n timeout = window.setTimeout(renderSnackbars, 100)\n}\n\nexport function info(message) {\n snackbar(\"info\", message)\n}\n\nexport function success(message) {\n snackbar(\"success\", message)\n}\n\nexport function warning(message) {\n snackbar(\"warning\", message)\n}\n\nexport function error(message) {\n snackbar(\"danger\", message)\n}\n\nhtmx.onLoad(renderSnackbars)\n","import { error } from \"./snackbars\"\n\nfunction handleResponseError(event) {\n if (isEventVisible(event)) {\n const message = getResponseErrorMessage(event.detail.xhr)\n error(message)\n }\n}\n\nfunction getResponseErrorMessage(xhr) {\n if (xhr.getResponseHeader(\"content-type\") === \"application/json\") {\n const data = JSON.parse(xhr.response)\n if (data.error) {\n return data.error\n }\n }\n\n if (xhr.status === 404) {\n return pgettext(\"htmx response error\", \"Page not found\")\n }\n\n if (xhr.status === 403) {\n return pgettext(\"htmx response error\", \"Permission denied\")\n }\n\n return pgettext(\"htmx response error\", \"Unexpected error\")\n}\n\nfunction handleSendError(event) {\n if (isEventVisible(event)) {\n const message = pgettext(\n \"htmx response error\",\n \"Site could not be reached.\"\n )\n error(message)\n }\n}\n\nfunction handleTimeoutError(event) {\n if (isEventVisible(event)) {\n const message = pgettext(\n \"htmx response error\",\n \"Site took too long to reply\"\n )\n error(message)\n }\n}\n\nfunction isEventVisible({ detail }) {\n const silent = getEventTargetSilentAttr(detail.target)\n return !(silent === \"true\" && detail.requestConfig.verb === \"get\")\n}\n\nfunction getEventTargetSilentAttr(target) {\n const element = target.closest(\"[hx-silent]\")\n if (element) {\n return element.getAttribute(\"hx-silent\")\n }\n return null\n}\n\nexport function setupHtmxErrors() {\n document.addEventListener(\"htmx:responseError\", handleResponseError)\n document.addEventListener(\"htmx:sendError\", handleSendError)\n document.addEventListener(\"htmx:timeout\", handleTimeoutError)\n}\n\nsetupHtmxErrors()\n","import htmx from \"htmx.org\"\n\nimport { dateRelative, dateRelativeShort, fullDateTime } from \"./formats\"\n\nconst cache = {}\n\nexport function updateTimestamp(element) {\n const timestamp = element.getAttribute(\"misago-timestamp\")\n if (!cache[timestamp]) {\n cache[timestamp] = new Date(timestamp)\n }\n\n if (!element.hasAttribute(\"misago-timestamp-title\")) {\n element.setAttribute(\"misago-timestamp-title\", \"true\")\n element.setAttribute(\"title\", fullDateTime.format(cache[timestamp]))\n }\n\n const format = element.getAttribute(\"misago-timestamp-format\")\n\n if (format == \"short\") {\n element.textContent = dateRelativeShort(cache[timestamp])\n } else {\n element.textContent = dateRelative(cache[timestamp])\n }\n}\n\nexport function startLiveTimestamps() {\n document.querySelectorAll(\"[misago-timestamp]\").forEach(updateTimestamp)\n\n updateLiveTimestamps()\n window.setInterval(updateLiveTimestamps, 1000 * 55)\n}\n\nexport function updateLiveTimestamps(element) {\n const target = element || document\n target.querySelectorAll(\"[misago-timestamp]\").forEach(updateTimestamp)\n}\n\nstartLiveTimestamps()\nhtmx.onLoad(updateLiveTimestamps)\n","import \"bootstrap/js/transition\"\nimport \"bootstrap/js/affix\"\nimport \"bootstrap/js/modal\"\nimport \"bootstrap/js/dropdown\"\nimport \"at-js\"\nimport \"cropit\"\nimport \"jquery-caret\"\nimport htmx from \"htmx.org\"\nimport OrderedList from \"misago/utils/ordered-list\"\nimport \"misago/style/index.less\"\nimport AjaxLoader, { useLoader } from \"./AjaxLoader\"\nimport BulkModeration from \"./BulkModeration\"\nimport \"./formValidators\"\nimport \"./htmxErrors\"\nimport \"./liveTimestamps\"\nimport * as snackbars from \"./snackbars\"\n\nconst loader = new AjaxLoader()\n\nexport class Misago {\n constructor() {\n this._initializers = []\n this._context = {}\n\n this.loader = loader\n }\n\n addInitializer(initializer) {\n this._initializers.push({\n key: initializer.name,\n\n item: initializer.initializer,\n\n after: initializer.after,\n before: initializer.before,\n })\n }\n\n init(context) {\n this._context = context\n\n var initOrder = new OrderedList(this._initializers).orderedValues()\n initOrder.forEach((initializer) => {\n initializer(this)\n })\n }\n\n // context accessors\n has(key) {\n return !!this._context[key]\n }\n\n get(key, fallback) {\n if (this.has(key)) {\n return this._context[key]\n } else {\n return fallback || undefined\n }\n }\n\n pop(key) {\n if (this.has(key)) {\n let value = this._context[key]\n this._context[key] = null\n return value\n } else {\n return undefined\n }\n }\n\n snackbar(type, message) {\n snackbars.snackbar(type, message)\n }\n\n snackbarInfo(message) {\n snackbars.info(message)\n }\n\n snackbarSuccess(message) {\n snackbars.success(message)\n }\n\n snackbarWarning(message) {\n snackbars.warning(message)\n }\n\n snackbarError(message) {\n snackbars.error(message)\n }\n\n bulkModeration(options) {\n return new BulkModeration(options)\n }\n}\n\n// create the singleton\nconst misago = new Misago()\n\n// expose it globally\nwindow.misago = misago\n\n// and export it for tests and stuff\nexport default misago\n\n// Register ajax loader events\ndocument.addEventListener(\"htmx:beforeRequest\", ({ target }) => {\n if (useLoader(target)) {\n loader.show()\n }\n})\n\ndocument.addEventListener(\"htmx:afterRequest\", ({ target }) => {\n if (useLoader(target)) {\n loader.hide()\n }\n})\n\n// Hide moderation modal after moderation action completes\ndocument.addEventListener(\"misago:afterModeration\", () => {\n $(\"#threads-moderation-modal\").modal(\"hide\")\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\n\nexport default function initializer() {\n ajax.init(misago.get(\"CSRF_COOKIE_NAME\"))\n}\n\nmisago.addInitializer({\n name: \"ajax\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport { patch } from \"misago/reducers/auth\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nconst AUTH_SYNC_RATE = 45 // sync user with backend every 45 seconds\n\nexport default function initializer(context) {\n if (context.get(\"isAuthenticated\")) {\n window.setInterval(function () {\n ajax.get(context.get(\"AUTH_API\")).then(\n function (data) {\n store.dispatch(patch(data))\n },\n function (rejection) {\n snackbar.apiError(rejection)\n }\n )\n }, AUTH_SYNC_RATE * 1000)\n }\n}\n\nmisago.addInitializer({\n name: \"auth-sync\",\n initializer: initializer,\n after: \"auth\",\n})\n","import misago from \"misago/index\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport store from \"misago/services/store\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n auth.init(store, storage, modal)\n}\n\nmisago.addInitializer({\n name: \"auth\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport captcha from \"misago/services/captcha\"\nimport include from \"misago/services/include\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer(context) {\n captcha.init(context, ajax, include, snackbar)\n}\n\nmisago.addInitializer({\n name: \"captcha\",\n initializer: initializer,\n})\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class AcceptAgreement extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = { submiting: false }\n }\n\n handleDecline = () => {\n if (this.state.submiting) return\n\n const confirmation = window.confirm(\n pgettext(\n \"accept agreement prompt\",\n \"Declining will result in immediate deactivation and deletion of your account. This action is not reversible.\"\n )\n )\n if (!confirmation) return\n\n this.setState({ submiting: true })\n\n ajax.post(this.props.api, { accept: false }).then(() => {\n window.location.reload(true)\n })\n }\n\n handleAccept = () => {\n if (this.state.submiting) return\n\n this.setState({ submiting: true })\n\n ajax.post(this.props.api, { accept: true }).then(() => {\n window.location.reload(true)\n })\n }\n\n render() {\n return (\n
    \n \n {pgettext(\"accept agreement choice\", \"Decline\")}\n \n \n {pgettext(\"accept agreement choice\", \"Accept and continue\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport AcceptAgreement from \"misago/components/accept-agreement\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n if (document.getElementById(\"required-agreement-mount\")) {\n mount(\n ,\n \"required-agreement-mount\",\n false\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:accept-agreement\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nexport default class extends React.Component {\n refresh() {\n window.location.reload()\n }\n\n getMessage() {\n if (this.props.signedIn) {\n return interpolate(\n pgettext(\n \"auth message\",\n \"You have signed in as %(username)s. Please refresh the page before continuing.\"\n ),\n { username: this.props.signedIn.username },\n true\n )\n } else if (this.props.signedOut) {\n return interpolate(\n pgettext(\n \"auth message\",\n \"%(username)s, you have been signed out. Please refresh the page before continuing.\"\n ),\n { username: this.props.user.username },\n true\n )\n }\n }\n\n render() {\n let className = \"auth-message\"\n if (this.props.signedIn || this.props.signedOut) {\n className += \" show\"\n }\n\n return (\n
    \n
    \n

    {this.getMessage()}

    \n

    \n \n {pgettext(\"auth message\", \"Reload page\")}\n \n \n {\" \" + pgettext(\"auth message\", \"or press F5 key.\")}\n \n

    \n
    \n
    \n )\n }\n}\n\nexport function select(state) {\n return {\n user: state.auth.user,\n signedIn: state.auth.signedIn,\n signedOut: state.auth.signedOut,\n }\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport AuthMessage, { select } from \"misago/components/auth-message\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(AuthMessage), \"auth-message-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:auth-message\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default function initializer(context) {\n if (context.has(\"BAN_MESSAGE\")) {\n showBannedPage(context.get(\"BAN_MESSAGE\"), false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:banmed-page\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport modal from \"../services/modal\"\nimport SignInModal from \"./sign-in\"\n\nclass SignInModalAutoOpen extends React.Component {\n componentDidMount() {\n const query = window.document.location.search\n if (query === \"?modal=login\") {\n window.setTimeout(() => modal.show(), 300)\n }\n }\n\n render() {\n return null\n }\n}\n\nexport default SignInModalAutoOpen\n","import React from \"react\"\n\nexport default function NavbarBranding({ logo, logoXs, text, url }) {\n if (logo) {\n return (\n
    \n \n {text}\n \n
    \n )\n }\n\n return (\n
    \n {!!logoXs && (\n \n {text}\n \n )}\n {!!text && (\n \n {text}\n \n )}\n
    \n )\n}\n","import React from \"react\"\n\nexport default function NavbarExtraMenu({ items }) {\n return (\n
      \n {items.map((item, index) => (\n
    • \n \n {item.title}\n \n
    • \n ))}\n
    \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { DropdownFooter, DropdownHeader, DropdownPills } from \"../Dropdown\"\n\nexport default function NotificationsDropdownBody({\n children,\n showAll,\n showUnread,\n unread,\n}) {\n return (\n
    \n \n {pgettext(\"notifications title\", \"Notifications\")}\n \n \n \n {pgettext(\"notifications dropdown\", \"All\")}\n \n \n {pgettext(\"notifications dropdown\", \"Unread\")}\n \n \n {children}\n \n \n {pgettext(\"notifications\", \"See all notifications\")}\n \n \n
    \n )\n}\n\nfunction NotificationsDropdownBodyPill({ active, children, onClick }) {\n return (\n \n {children}\n \n )\n}\n","import NotificationsDropdown from \"./NotificationsDropdown\"\n\nexport default NotificationsDropdown\n","import React from \"react\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport {\n NotificationsList,\n NotificationsListError,\n NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsDropdownBody from \"./NotificationsDropdownBody\"\n\nexport default class NotificationsDropdown extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n unread: false,\n url: \"\",\n }\n }\n\n getApiUrl() {\n let url = misago.get(\"NOTIFICATIONS_API\") + \"?limit=20\"\n url += this.state.unread ? \"&filter=unread\" : \"\"\n return url\n }\n\n render = () => (\n this.setState({ unread: false })}\n showUnread={() => this.setState({ unread: true })}\n >\n \n {({ data, loading, error }) => {\n if (loading) {\n return \n }\n\n if (error) {\n return \n }\n\n return (\n \n )\n }}\n \n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarNotificationsToggle({\n id,\n className,\n badge,\n url,\n active,\n onClick,\n}) {\n const title = !!badge\n ? pgettext(\"navbar\", \"You have unread notifications!\")\n : pgettext(\"navbar\", \"Open notifications\")\n\n return (\n \n {!!badge && {badge}}\n \n {!!badge ? \"notifications_active\" : \"notifications_none\"}\n \n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NotificationsDropdown from \"../NotificationsDropdown\"\nimport NavbarNotificationsToggle from \"./NavbarNotificationsToggle\"\n\nexport default function NavbarNotificationsDropdown({\n id,\n className,\n badge,\n url,\n}) {\n return (\n (\n {\n event.preventDefault()\n toggle()\n }}\n />\n )}\n menuClassName=\"notifications-dropdown\"\n menuAlignRight\n >\n {({ isOpen }) => }\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarPrivateThreads({\n id,\n className,\n badge,\n url,\n active,\n onClick,\n}) {\n const title = !!badge\n ? pgettext(\"navbar\", \"You have unread private threads!\")\n : pgettext(\"navbar\", \"Open private threads\")\n\n return (\n \n {!!badge && {badge}}\n inbox\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarSearchToggle({\n id,\n className,\n url,\n active,\n onClick,\n}) {\n return (\n \n search\n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport { SearchDropdown } from \"../Search\"\nimport NavbarSearchToggle from \"./NavbarSearchToggle\"\n\nexport default function NavbarSearchDropdown({ id, className, url }) {\n return (\n (\n {\n event.preventDefault()\n toggle()\n\n window.setTimeout(() => {\n document\n .querySelector(\".search-dropdown .form-control-search\")\n .focus()\n }, 0)\n }}\n />\n )}\n menuClassName=\"search-dropdown\"\n menuAlignRight\n >\n {() => }\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarSiteNavToggle({\n id,\n className,\n active,\n onClick,\n}) {\n return (\n \n menu\n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NavbarSiteNavToggle from \"./NavbarSiteNavToggle\"\nimport { SiteNavDropdown } from \"../SiteNav\"\n\nexport default function NavbarSiteNavDropdown({ id, className }) {\n return (\n (\n \n )}\n menuClassName=\"site-nav-dropdown\"\n menuAlignRight\n >\n {({ isOpen, close }) => }\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport Avatar from \"../avatar\"\n\nexport default function NavbarUserNavToggle({\n id,\n className,\n user,\n active,\n onClick,\n}) {\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NavbarUserNavToggle from \"./NavbarUserNavToggle\"\nimport { UserNavDropdown } from \"../UserNav\"\n\nexport default function NavbarUserNavDropdown({ id, className, user }) {\n return (\n (\n {\n event.preventDefault()\n toggle()\n }}\n />\n )}\n menuClassName=\"user-nav-dropdown\"\n menuAlignRight\n >\n {({ isOpen, close }) => }\n \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport * as overlay from \"../../reducers/overlay\"\nimport RegisterButton from \"../RegisterButton\"\nimport SignInButton from \"../SignInButton\"\nimport SignInModalAutoOpen from \"../SignInModalAutoOpen\"\nimport NavbarBranding from \"./NavbarBranding\"\nimport NavbarExtraMenu from \"./NavbarExtraMenu\"\nimport NavbarNotificationsDropdown from \"./NavbarNotificationsDropdown\"\nimport NavbarNotificationsToggle from \"./NavbarNotificationsToggle\"\nimport NavbarPrivateThreads from \"./NavbarPrivateThreads\"\nimport NavbarSearchDropdown from \"./NavbarSearchDropdown\"\nimport NavbarSearchToggle from \"./NavbarSearchToggle\"\nimport NavbarSiteNavDropdown from \"./NavbarSiteNavDropdown\"\nimport NavbarSiteNavToggle from \"./NavbarSiteNavToggle\"\nimport NavbarUserNavDropdown from \"./NavbarUserNavDropdown\"\nimport NavbarUserNavToggle from \"./NavbarUserNavToggle\"\n\nexport function Navbar({\n dispatch,\n branding,\n extraMenuItems,\n authDelegated,\n user,\n searchUrl,\n notificationsUrl,\n privateThreadsUrl,\n showSearch,\n showPrivateThreads,\n}) {\n return (\n
    \n \n
    \n {extraMenuItems.length > 0 && (\n \n )}\n {!!showSearch && (\n \n )}\n {!!showSearch && (\n {\n dispatch(overlay.openSearch())\n event.preventDefault()\n }}\n />\n )}\n \n {\n dispatch(overlay.openSiteNav())\n }}\n />\n {!!showPrivateThreads && (\n \n )}\n {!!user && (\n \n )}\n {!!user && (\n {\n dispatch(overlay.openNotifications())\n event.preventDefault()\n }}\n />\n )}\n {!!user && (\n \n )}\n {!!user && (\n {\n dispatch(overlay.openUserNav())\n event.preventDefault()\n }}\n />\n )}\n {!user && }\n {!user && !authDelegated && (\n \n )}\n {!user && !authDelegated && }\n
    \n
    \n )\n}\n\nfunction select(state) {\n const settings = misago.get(\"SETTINGS\")\n const user = state.auth.user\n\n return {\n branding: {\n logo: settings.logo,\n logoXs: settings.logo_small,\n text: settings.logo_text,\n url: misago.get(\"MISAGO_PATH\"),\n },\n extraMenuItems: misago.get(\"extraMenuItems\"),\n\n user: !user.id\n ? null\n : {\n id: user.id,\n username: user.username,\n email: user.email,\n avatars: user.avatars,\n unreadNotifications: user.unreadNotifications,\n unreadPrivateThreads: user.unread_private_threads,\n url: user.url,\n },\n\n searchUrl: misago.get(\"SEARCH_URL\"),\n notificationsUrl: misago.get(\"NOTIFICATIONS_URL\"),\n privateThreadsUrl: misago.get(\"PRIVATE_THREADS_URL\"),\n\n authDelegated: settings.enable_oauth2_client,\n showSearch: !!user.acl.can_search,\n showPrivateThreads: !!user && !!user.acl.can_use_private_threads,\n }\n}\n\nconst NavbarConnected = connect(select)(Navbar)\n\nexport default NavbarConnected\n","import Navbar from \"./Navbar\"\n\nexport default Navbar\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport Navbar from \"../../components/Navbar\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"misago-navbar\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:navbar\",\n initializer: initializer,\n after: \"store\",\n})\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { DropdownFooter, DropdownPills } from \"../Dropdown\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\n\nexport default function NotificationsOverlayBody({\n children,\n open,\n showAll,\n showUnread,\n unread,\n}) {\n return (\n \n \n {pgettext(\"notifications title\", \"Notifications\")}\n \n \n \n {pgettext(\"notifications dropdown\", \"All\")}\n \n \n {pgettext(\"notifications dropdown\", \"Unread\")}\n \n \n {children}\n \n \n {pgettext(\"notifications\", \"See all notifications\")}\n \n \n \n )\n}\n\nfunction NotificationsOverlayBodyPill({ active, children, onClick }) {\n return (\n \n {children}\n \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport {\n NotificationsList,\n NotificationsListError,\n NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsOverlayBody from \"./NotificationsOverlayBody\"\n\nclass NotificationsOverlay extends React.Component {\n constructor(props) {\n super(props)\n\n this.body = document.body\n\n this.state = {\n unread: false,\n url: \"\",\n }\n }\n\n getApiUrl() {\n let url = misago.get(\"NOTIFICATIONS_API\") + \"?limit=20\"\n url += this.state.unread ? \"&filter=unread\" : \"\"\n return url\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.open !== this.props.open) {\n if (this.props.open) {\n this.body.classList.add(\"notifications-fullscreen\")\n } else {\n this.body.classList.remove(\"notifications-fullscreen\")\n }\n }\n }\n\n render = () => (\n this.setState({ unread: false })}\n showUnread={() => this.setState({ unread: true })}\n >\n \n {({ data, loading, error }) => {\n if (loading) {\n return \n }\n\n if (error) {\n return \n }\n\n return (\n \n )\n }}\n \n \n )\n}\n\nfunction select(state) {\n return { open: state.overlay.notifications }\n}\n\nconst NotificationsOverlayConnected = connect(select)(NotificationsOverlay)\n\nexport default NotificationsOverlayConnected\n","import NotificationsOverlay from \"./NotificationsOverlay\"\n\nexport default NotificationsOverlay\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport NotificationsOverlay from \"../../components/NotificationsOverlay\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n if (context.get(\"isAuthenticated\")) {\n const root = document.getElementById(\"notifications-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:notifications-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport { PageHeaderPlain } from \"../PageHeader\"\n\nexport default function NotificationsHeader() {\n return (\n \n )\n}\n","import PageTitle from \"./PageTitle\"\n\nexport default PageTitle\n","export default function PageTitle({ title, subtitle }) {\n const parts = []\n if (subtitle) {\n parts.push(subtitle)\n }\n if (title) {\n parts.push(title)\n }\n parts.push(misago.get(\"SETTINGS\").forum_name)\n\n document.title = parts.join(\" | \")\n return null\n}\n","import React from \"react\"\n\nexport default function PillsNav({ children }) {\n return
      {children}
    \n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function PillsNavLink({ active, link, icon, children }) {\n return (\n
  • \n \n {!!icon && {icon}}\n {children}\n \n
  • \n )\n}\n","import React from \"react\"\nimport { PillsNav, PillsNavLink } from \"../PillsNav\"\nimport { Toolbar, ToolbarSection, ToolbarItem } from \"../Toolbar\"\n\nexport default function NotificationsPills({ filter }) {\n const basename = misago.get(\"NOTIFICATIONS_URL\")\n\n return (\n \n \n \n \n \n {pgettext(\"notifications nav\", \"All\")}\n \n \n {pgettext(\"notifications nav\", \"Unread\")}\n \n \n {pgettext(\"notifications nav\", \"Read\")}\n \n \n \n \n \n )\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function NotificationsPagination({ baseUrl, data, disabled }) {\n return (\n
    \n \n {pgettext(\"notifications pagination\", \"Latest\")}\n \n \n {pgettext(\"notifications pagination\", \"Newer\")}\n \n \n {pgettext(\"notifications pagination\", \"Older\")}\n \n
    \n )\n}\n\nfunction NotificationsPaginationLink({ disabled, children, url }) {\n if (disabled) {\n return (\n \n )\n }\n\n return (\n \n {children}\n \n )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport Button from \"../button\"\nimport { Toolbar, ToolbarSection, ToolbarItem, ToolbarSpacer } from \"../Toolbar\"\nimport NotificationsPagination from \"./NotificationsPagination\"\n\nexport default function NotificationsToolbar({\n baseUrl,\n data,\n disabled,\n bottom,\n markAllAsRead,\n}) {\n return (\n \n \n \n \n \n \n \n \n \n \n done_all\n {pgettext(\"notifications\", \"Mark all as read\")}\n \n \n \n \n )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { updateAuthenticatedUser } from \"../../reducers/auth\"\nimport snackbar from \"../../services/snackbar\"\nimport { ApiMutation } from \"../Api\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport PageTitle from \"../PageTitle\"\nimport PageContainer from \"../PageContainer\"\nimport {\n NotificationsList,\n NotificationsListError,\n NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsPills from \"./NotificationsPills\"\nimport NotificationsToolbar from \"./NotificationsToolbar\"\n\nfunction NotificationsRoute({ dispatch, location, route }) {\n const { query } = location\n const { filter } = route.props\n\n const baseUrl = getBaseUrl(filter)\n\n return (\n \n \n\n \n\n \n {({ data, loading, error, refetch }) => (\n \n {(readAll, { loading: mutating }) => {\n const toolbarProps = {\n baseUrl,\n data,\n disabled:\n loading || mutating || !data || data.results.length === 0,\n markAllAsRead: async () => {\n const confirmed = window.confirm(\n pgettext(\"notifications\", \"Mark all notifications as read?\")\n )\n\n if (confirmed) {\n readAll({\n onSuccess: async () => {\n refetch()\n dispatch(\n updateAuthenticatedUser({ unreadNotifications: null })\n )\n snackbar.success(\n pgettext(\n \"notifications\",\n \"All notifications have been marked as read.\"\n )\n )\n },\n onError: snackbar.apiError,\n })\n }\n },\n }\n\n if (loading || mutating) {\n return (\n
    \n \n \n \n
    \n )\n }\n\n if (error) {\n return (\n
    \n \n \n \n
    \n )\n }\n\n if (data) {\n if (!data.hasPrevious && query) {\n window.history.replaceState({}, \"\", baseUrl)\n }\n\n return (\n
    \n \n \n \n
    \n )\n }\n\n return null\n }}\n
    \n )}\n
    \n
    \n )\n}\n\nfunction getSubtitle(filter) {\n if (filter === \"unread\") {\n return pgettext(\"notifications title\", \"Unread notifications\")\n } else if (filter === \"read\") {\n return pgettext(\"notifications title\", \"Read notifications\")\n } else {\n return null\n }\n}\n\nfunction getBaseUrl(filter) {\n let url = misago.get(\"NOTIFICATIONS_URL\")\n if (filter !== \"all\") {\n url += filter + \"/\"\n }\n return url\n}\n\nconst NotificationsRouteConnected = connect()(NotificationsRoute)\n\nexport default NotificationsRouteConnected\n","import Notifications from \"./Notifications\"\nimport NotificationsFetch from \"../NotificationsFetch/NotificationsFetch\"\n\nexport default Notifications\n\nexport { NotificationsFetch }\n","import React from \"react\"\nimport { Router, browserHistory } from \"react-router\"\nimport NotificationsHeader from \"./NotificationsHeader\"\nimport NotificationsRoute from \"./NotificationsRoute\"\n\nexport default function Notifications() {\n const basename = misago.get(\"NOTIFICATIONS_URL\")\n\n return (\n
    \n \n \n
    \n )\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport Notifications from \"../../components/Notifications\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const basename = misago.get(\"NOTIFICATIONS_URL\")\n if (\n document.location.pathname.startsWith(basename) &&\n !document.location.pathname.startsWith(basename + \"disable-email/\") &&\n context.get(\"isAuthenticated\")\n ) {\n const root = document.getElementById(\"page-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:notifications\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n \n
    \n )\n }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport PanelLoader from \"misago/components/panel-loader\"\nimport PanelMessage from \"misago/components/panel-message\"\nimport misago from \"misago/index\"\nimport polls from \"misago/services/polls\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"PROFILE_BAN\")) {\n this.initWithPreloadedData(misago.pop(\"PROFILE_BAN\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling(props.profile.api.ban)\n }\n\n initWithPreloadedData(ban) {\n if (ban.expires_on) {\n ban.expires_on = moment(ban.expires_on)\n }\n\n this.state = {\n isLoaded: true,\n ban,\n }\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling(api) {\n polls.start({\n poll: \"ban-details\",\n url: api,\n frequency: 90 * 1000,\n update: this.update,\n error: this.error,\n })\n }\n\n update = (ban) => {\n if (ban.expires_on) {\n ban.expires_on = moment(ban.expires_on)\n }\n\n this.setState({\n isLoaded: true,\n error: null,\n\n ban,\n })\n }\n\n error = (error) => {\n this.setState({\n isLoaded: true,\n error: error.detail,\n ban: null,\n })\n }\n\n componentDidMount() {\n title.set({\n title: pgettext(\"profile ban details title\", \"Ban details\"),\n parent: this.props.profile.username,\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"ban-details\")\n }\n\n getUserMessage() {\n if (this.state.ban.user_message) {\n return (\n
    \n

    {pgettext(\"profile ban details\", \"User-shown ban message\")}

    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getStaffMessage() {\n if (this.state.ban.staff_message) {\n return (\n
    \n

    {pgettext(\"profile ban details\", \"Team-shown ban message\")}

    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getExpirationMessage() {\n if (this.state.ban.expires_on) {\n if (this.state.ban.expires_on.isAfter(moment())) {\n let title = interpolate(\n pgettext(\n \"profile ban details\",\n \"This ban expires on %(expires_on)s.\"\n ),\n {\n expires_on: this.state.ban.expires_on.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n pgettext(\"profile ban details\", \"This ban expires %(expires_on)s.\"),\n {\n expires_on: this.state.ban.expires_on.fromNow(),\n },\n true\n )\n\n return {message}\n } else {\n return pgettext(\"profile ban details\", \"This ban has expired.\")\n }\n } else {\n return interpolate(\n pgettext(\"profile ban details\", \"%(username)s's ban is permanent.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getPanelBody() {\n if (this.state.ban) {\n if (Object.keys(this.state.ban).length) {\n return (\n
    \n {this.getUserMessage()}\n {this.getStaffMessage()}\n\n
    \n

    {pgettext(\"profile ban details\", \"Ban expiration\")}

    \n

    {this.getExpirationMessage()}

    \n
    \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n } else if (this.state.error) {\n return (\n
    \n \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n

    \n {pgettext(\"profile ban details title\", \"Ban details\")}\n

    \n
    \n\n {this.getPanelBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default function ({ display }) {\n if (!display) return null\n\n return (\n \n )\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({ display }) {\n if (!display) return null\n\n return (\n
    \n \n
    \n )\n}\n","import React from \"react\"\nimport Select from \"misago/components/select\"\n\nexport default class extends React.Component {\n onChange = (ev) => {\n const { field, onChange } = this.props\n onChange(field.fieldname, ev.target.value)\n }\n\n render() {\n const { disabled, field, value } = this.props\n const { input } = field\n\n if (input.type === \"select\") {\n return (\n \n )\n }\n\n if (input.type === \"textarea\") {\n return (\n \n )\n }\n\n if (input.type === \"text\") {\n return (\n \n )\n }\n\n return null\n }\n}\n","import React from \"react\"\nimport FieldInput from \"./field-input\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport default function ({ disabled, errors, fields, name, onChange, value }) {\n return (\n
    \n {name}\n {fields.map((field) => {\n return (\n \n \n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Fieldset from \"./fieldset\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n errors: {},\n }\n\n const groups = props.groups.length\n for (let i = 0; i < groups; i++) {\n const group = props.groups[i]\n const fields = group.fields.length\n for (let f = 0; f < fields; f++) {\n const fieldname = group.fields[f].fieldname\n const initial = group.fields[f].initial\n this.state[fieldname] = initial\n }\n }\n }\n\n send() {\n const data = Object.assign({}, this.state, {\n errors: null,\n isLoading: null,\n })\n\n return ajax.post(this.props.api, data)\n }\n\n handleSuccess(data) {\n this.props.onSuccess(data)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({ errors: rejection })\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onChange = (name, value) => {\n this.setState({\n [name]: value,\n })\n }\n\n render() {\n return (\n
    \n
    \n {this.props.groups.map((group, i) => {\n return (\n \n )\n })}\n
    \n
    \n {\" \"}\n \n
    \n
    \n )\n }\n}\n\nexport function CancelButton({ onCancel, disabled }) {\n if (!onCancel) return null\n\n return (\n \n {pgettext(\"user profile details form btn\", \"Cancel\")}\n \n )\n}\n","import React from \"react\"\nimport Blankslate from \"./blankslate\"\nimport Loader from \"./loader\"\nimport Form from \"./form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n loading: true,\n groups: null,\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.api).then(\n (groups) => {\n this.setState({\n loading: false,\n\n groups,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n if (this.props.cancel) {\n this.props.cancel()\n }\n }\n )\n }\n\n render() {\n const { groups, loading } = this.state\n\n return (\n
    \n
    \n

    \n {pgettext(\"user profile details form title\", \"Edit details\")}\n

    \n
    \n \n \n \n
    \n )\n }\n}\n\nexport function FormDisplay({ api, display, groups, onCancel, onSuccess }) {\n if (!display) return null\n\n return (\n
    \n )\n}\n","import React from \"react\"\nimport Form from \"misago/components/edit-details\"\n\nexport default function ({ api, display, onCancel, onSuccess }) {\n if (!display) return null\n\n return \n}\n","import React from \"react\"\n\nexport default function ({ isAuthenticated, profile }) {\n let message = null\n if (isAuthenticated) {\n message = pgettext(\n \"profile details empty\",\n \"You are not sharing any details with others.\"\n )\n } else {\n message = interpolate(\n pgettext(\n \"profile details empty\",\n \"%(username)s is not sharing any details with others.\"\n ),\n {\n username: profile.username,\n },\n true\n )\n }\n\n return (\n
    \n
    {message}
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ html, text, url }) {\n if (html) {\n return (\n \n )\n }\n\n return (\n
    \n \n
    \n )\n}\n\nexport function SafeValue({ text, url }) {\n if (url) {\n return (\n

    \n \n {text || url}\n \n

    \n )\n }\n\n if (text) {\n return

    {text}

    \n }\n\n return null\n}\n","import React from \"react\"\nimport FieldValue from \"./field-value\"\n\nexport default function (props) {\n return (\n
    \n {props.name}:\n \n
    \n )\n}\n","import React from \"react\"\nimport Field from \"./field\"\n\nexport default function ({ fields, name }) {\n return (\n
    \n
    \n

    {name}

    \n
    \n
    \n
    \n {fields.map(({ fieldname, html, name, text, url }) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport EmptyMessage from \"./empty-message\"\nimport Group from \"./group\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({\n display,\n groups,\n isAuthenticated,\n loading,\n profile,\n}) {\n if (!display) return null\n\n if (loading) {\n return \n }\n\n if (!groups.length) {\n return \n }\n\n return (\n
    \n {groups.map((group, i) => {\n return \n })}\n
    \n )\n}\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nconst ProfileDetailsHeader = ({ onEdit, showEditButton }) => (\n \n \n \n

    {pgettext(\"profile details title\", \"Details\")}

    \n
    \n
    \n {showEditButton && (\n \n \n \n {pgettext(\"profile details edit btn\", \"Edit\")}\n \n \n \n )}\n
    \n)\n\nexport default ProfileDetailsHeader\n","import React from \"react\"\nimport { load } from \"misago/reducers/profile-details\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n componentDidMount() {\n const { data, dispatch, user } = this.props\n if (data && data.id === user.id) return\n\n ajax.get(this.props.user.api.details).then(\n (data) => {\n dispatch(load(data))\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n return this.props.children\n }\n}\n","import React from \"react\"\nimport Form from \"./form\"\nimport GroupsList from \"./groups-list\"\nimport Header from \"./header\"\nimport ProfileDetailsData from \"misago/data/profile-details\"\nimport { load as loadDetails } from \"misago/reducers/profile-details\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n editing: false,\n }\n }\n\n componentDidMount() {\n title.set({\n title: pgettext(\"profile details title\", \"Details\"),\n parent: this.props.profile.username,\n })\n }\n\n onCancel = () => {\n this.setState({ editing: false })\n }\n\n onEdit = () => {\n this.setState({ editing: true })\n }\n\n onSuccess = (newDetails) => {\n const { dispatch, isAuthenticated, profile } = this.props\n\n let message = null\n if (isAuthenticated) {\n message = pgettext(\n \"profile details form\",\n \"Your details have been changed.\"\n )\n } else {\n message = interpolate(\n pgettext(\n \"profile details form\",\n \"%(username)s's details have been changed.\"\n ),\n {\n username: profile.username,\n },\n true\n )\n }\n\n snackbar.info(message)\n dispatch(loadDetails(newDetails))\n this.setState({ editing: false })\n }\n\n render() {\n const { dispatch, isAuthenticated, profile, profileDetails } = this.props\n const loading = profileDetails.id !== profile.id\n\n return (\n \n
    \n \n \n \n
    \n \n )\n }\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport * as posts from \"misago/reducers/posts\"\nimport title from \"misago/services/page-title\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n loadItems(start = 0) {\n ajax\n .get(this.props.api, {\n start: start || 0,\n })\n .then(\n (data) => {\n if (start === 0) {\n store.dispatch(posts.load(data))\n } else {\n store.dispatch(posts.append(data))\n }\n\n this.setState({\n isLoading: false,\n })\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.apiError(rejection)\n }\n )\n }\n\n loadMore = () => {\n this.setState({\n isLoading: true,\n })\n\n this.loadItems(this.props.posts.next)\n }\n\n componentDidMount() {\n title.set({\n title: this.props.title,\n parent: this.props.profile.username,\n })\n\n this.loadItems()\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.props.header}

    \n
    \n
    \n
    \n \n
    \n )\n }\n}\n\nexport function Feed(props) {\n if (props.posts.isLoaded && !props.posts.results.length) {\n return

    {props.emptyMessage}

    \n }\n\n return (\n
    \n \n \n
    \n )\n}\n\nexport function LoadMoreButton(props) {\n if (!props.next) return null\n\n return (\n
    \n \n {pgettext(\"profile load more btn\", \"Show older activity\")}\n \n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.className) {\n return \"form-search \" + this.props.className\n } else {\n return \"form-search\"\n }\n }\n\n render() {\n return (\n
    \n \n search\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsersList from \"misago/components/users-list\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.setSpecialProps()\n\n if (misago.has(this.PRELOADED_DATA_KEY)) {\n this.initWithPreloadedData(misago.pop(this.PRELOADED_DATA_KEY))\n } else {\n this.initWithoutPreloadedData()\n }\n }\n\n setSpecialProps() {\n this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWERS\"\n this.TITLE = pgettext(\"profile followers title\", \"Followers\")\n this.API_FILTER = \"followers\"\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n isBusy: false,\n\n search: \"\",\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n isBusy: false,\n\n search: \"\",\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n }\n\n this.loadUsers()\n }\n\n loadUsers(page = 1, search = null) {\n const apiUrl = this.props.profile.api[this.API_FILTER]\n\n ajax\n .get(\n apiUrl,\n {\n search: search,\n page: page || 1,\n },\n \"user-\" + this.API_FILTER\n )\n .then(\n (data) => {\n if (page === 1) {\n store.dispatch(hydrate(data.results))\n } else {\n store.dispatch(append(data.results))\n }\n\n this.setState({\n isLoaded: true,\n isBusy: false,\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n componentDidMount() {\n title.set({\n title: this.TITLE,\n parent: this.props.profile.username,\n })\n }\n\n loadMore = () => {\n this.setState({\n isBusy: true,\n })\n\n this.loadUsers(this.state.page + 1, this.state.search)\n }\n\n search = (ev) => {\n this.setState({\n isLoaded: false,\n isBusy: true,\n\n search: ev.target.value,\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n })\n\n this.loadUsers(1, ev.target.value)\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return pgettext(\"Loading...\")\n } else if (this.state.search) {\n let message = npgettext(\n \"profile followers\",\n \"Found %(users)s user.\",\n \"Found %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = npgettext(\n \"profile followers\",\n \"You have %(users)s follower.\",\n \"You have %(users)s followers.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else {\n let message = npgettext(\n \"profile followers\",\n \"%(username)s has %(users)s follower.\",\n \"%(username)s has %(users)s followers.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n users: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return pgettext(\n \"profile followers\",\n \"Search returned no users matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return pgettext(\"profile followers\", \"You have no followers.\")\n } else {\n return interpolate(\n pgettext(\"profile followers\", \"%(username)s has no followers.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getMoreButton() {\n if (!this.state.more) return null\n\n return (\n
    \n \n {interpolate(\n pgettext(\"profile followers\", \"Show more (%(more)s)\"),\n {\n more: this.state.more,\n },\n true\n )}\n \n
    \n )\n }\n\n getListBody() {\n if (this.state.isLoaded && this.state.count === 0) {\n return

    {this.getEmptyMessage()}

    \n }\n\n return (\n
    \n \n\n {this.getMoreButton()}\n
    \n )\n }\n\n getClassName() {\n return \"profile-\" + this.API_FILTER\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.getLabel()}

    \n
    \n
    \n \n \n \n \n \n
    \n\n {this.getListBody()}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Followers from \"misago/components/profile/followers\"\n\nexport default class extends Followers {\n setSpecialProps() {\n this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWS\"\n this.TITLE = pgettext(\"profile follows title\", \"Follows\")\n this.API_FILTER = \"follows\"\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return pgettext(\"profile follows\", \"Loading...\")\n } else if (this.state.search) {\n let message = npgettext(\n \"profile follows\",\n \"Found %(users)s user.\",\n \"Found %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = npgettext(\n \"profile follows\",\n \"You are following %(users)s user.\",\n \"You are following %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else {\n let message = npgettext(\n \"profile follows\",\n \"%(username)s is following %(users)s user.\",\n \"%(username)s is following %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n users: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return pgettext(\n \"profile follows\",\n \"Search returned no users matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return pgettext(\"profile follows\", \"You are not following any users.\")\n } else {\n return interpolate(\n pgettext(\"profile follows\", \"%(username)s is not following any users.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getEmptyMessage() {\n if (this.props.emptyMessage) {\n return this.props.emptyMessage\n } else {\n return pgettext(\n \"username history empty\",\n \"Your account has no history of name changes.\"\n )\n }\n }\n\n render() {\n return (\n
    \n
      \n
    • \n {this.getEmptyMessage()}\n
    • \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default class extends React.Component {\n renderUserAvatar() {\n if (this.props.change.changed_by) {\n return (\n \n \n \n )\n } else {\n return (\n \n \n \n )\n }\n }\n\n renderUsername() {\n if (this.props.change.changed_by) {\n return (\n \n {this.props.change.changed_by.username}\n \n )\n } else {\n return (\n \n {this.props.change.changed_by_username}\n \n )\n }\n }\n\n render() {\n return (\n
  • \n
    {this.renderUserAvatar()}
    \n
    {this.renderUsername()}
    \n
    \n {this.props.change.old_username}\n arrow_forward\n {this.props.change.new_username}\n
    \n
    \n \n {this.props.change.changed_on.fromNow()}\n \n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport Change from \"misago/components/username-history/change\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n
      \n {this.props.changes.map((change) => {\n return \n })}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n getClassName() {\n if (this.props.hiddenOnMobile) {\n return \"list-group-item hidden-xs hidden-sm\"\n } else {\n return \"list-group-item\"\n }\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n
    \n \n  \n \n
    \n
    \n \n  \n \n arrow_forward\n \n  \n \n
    \n
    \n \n  \n \n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ChangePreview from \"misago/components/username-history/change-preview\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n
      \n {[0, 1, 2].map((i) => {\n return 0} key={i} />\n })}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/username-history/list-empty\"\nimport ListReady from \"misago/components/username-history/list-ready\"\nimport ListPreview from \"misago/components/username-history/list-preview\"\n\nexport default class extends React.Component {\n render() {\n if (this.props.isLoaded) {\n if (this.props.changes.length) {\n return \n } else {\n return \n }\n } else {\n return \n }\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsernameHistory from \"misago/components/username-history/root\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/username-history\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"PROFILE_NAME_HISTORY\")) {\n this.initWithPreloadedData(misago.pop(\"PROFILE_NAME_HISTORY\"))\n } else {\n this.initWithoutPreloadedData()\n }\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n isBusy: false,\n\n search: \"\",\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n isBusy: false,\n\n search: \"\",\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n }\n\n this.loadChanges()\n }\n\n loadChanges(page = 1, search = null) {\n ajax\n .get(\n misago.get(\"USERNAME_CHANGES_API\"),\n {\n user: this.props.profile.id,\n search: search,\n page: page || 1,\n },\n \"search-username-history\"\n )\n .then(\n (data) => {\n if (page === 1) {\n store.dispatch(hydrate(data.results))\n } else {\n store.dispatch(append(data.results))\n }\n\n this.setState({\n isLoaded: true,\n isBusy: false,\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n componentDidMount() {\n title.set({\n title: pgettext(\"profile username history title\", \"Username history\"),\n parent: this.props.profile.username,\n })\n }\n\n loadMore = () => {\n this.setState({\n isBusy: true,\n })\n\n this.loadChanges(this.state.page + 1, this.state.search)\n }\n\n search = (ev) => {\n this.setState({\n isLoaded: false,\n isBusy: true,\n\n search: ev.target.value,\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n })\n\n this.loadChanges(1, ev.target.value)\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return pgettext(\"profile username history\", \"Loading...\")\n } else if (this.state.search) {\n let message = npgettext(\n \"profile username history\",\n \"Found %(changes)s username change.\",\n \"Found %(changes)s username changes.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n changes: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = npgettext(\n \"profile username history\",\n \"Your username was changed %(changes)s time.\",\n \"Your username was changed %(changes)s times.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n changes: this.state.count,\n },\n true\n )\n } else {\n let message = npgettext(\n \"profile username history\",\n \"%(username)s's username was changed %(changes)s time.\",\n \"%(username)s's username was changed %(changes)s times.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n changes: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return pgettext(\n \"profile username history\",\n \"Search returned no username changes matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return pgettext(\n \"username history empty\",\n \"Your account has no history of name changes.\"\n )\n } else {\n return interpolate(\n pgettext(\n \"profile username history\",\n \"%(username)s's username was never changed.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getMoreButton() {\n if (!this.state.more) return null\n\n return (\n
    \n \n {interpolate(\n pgettext(\"profile username history\", \"Show older (%(more)s)\"),\n {\n more: this.state.more,\n },\n true\n )}\n \n
    \n )\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.getLabel()}

    \n
    \n
    \n \n \n \n \n \n
    \n\n \n\n {this.getMoreButton()}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport { patch } from \"misago/reducers/profile\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n getClassName() {\n if (this.props.profile.is_followed) {\n return this.props.className + \" btn-default btn-following\"\n } else {\n return this.props.className + \" btn-default btn-follow\"\n }\n }\n\n getIcon() {\n if (this.props.profile.is_followed) {\n return \"favorite\"\n } else {\n return \"favorite_border\"\n }\n }\n\n getLabel() {\n if (this.props.profile.is_followed) {\n return pgettext(\"user profile follow btn\", \"Following\")\n } else {\n return pgettext(\"user profile follow btn\", \"Follow\")\n }\n }\n\n action = () => {\n this.setState({\n isLoading: true,\n })\n\n if (this.props.profile.is_followed) {\n store.dispatch(\n patch({\n is_followed: false,\n followers: this.props.profile.followers - 1,\n })\n )\n } else {\n store.dispatch(\n patch({\n is_followed: true,\n followers: this.props.profile.followers + 1,\n })\n )\n }\n\n ajax.post(this.props.profile.api.follow).then(\n (data) => {\n this.setState({\n isLoading: false,\n })\n\n store.dispatch(patch(data))\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n })\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n return (\n \n {this.getIcon()}\n {this.getLabel()}\n \n )\n }\n}\n","import React from \"react\"\nimport posting from \"misago/services/posting\"\nimport misago from \"misago\"\n\nexport default class extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"START_PRIVATE\",\n submit: misago.get(\"PRIVATE_THREADS_API\"),\n\n to: [this.props.profile],\n })\n }\n\n render() {\n const canMessage = this.props.user.acl.can_start_private_threads\n const isProfileOwner = this.props.user.id === this.props.profile.id\n\n if (!canMessage || isProfileOwner) return null\n\n return (\n \n comment\n {pgettext(\"profile message btn\", \"Message\")}\n \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { updateAvatar } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n error: null,\n\n is_avatar_locked: \"\",\n avatar_lock_user_message: \"\",\n avatar_lock_staff_message: \"\",\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.moderate_avatar).then(\n (options) => {\n this.setState({\n isLoaded: true,\n\n is_avatar_locked: options.is_avatar_locked,\n avatar_lock_user_message: options.avatar_lock_user_message || \"\",\n avatar_lock_staff_message: options.avatar_lock_staff_message || \"\",\n })\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(this.validate().username[0])\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.profile.api.moderate_avatar, {\n is_avatar_locked: this.state.is_avatar_locked,\n avatar_lock_user_message: this.state.avatar_lock_user_message,\n avatar_lock_staff_message: this.state.avatar_lock_staff_message,\n })\n }\n\n handleSuccess(apiResponse) {\n store.dispatch(updateAvatar(this.props.profile, apiResponse.avatar_hash))\n snackbar.success(\n pgettext(\n \"profile avatar moderation\",\n \"Avatar controls have been changed.\"\n )\n )\n }\n\n getFormBody() {\n return (\n \n
    \n \n \n \n\n \n \n \n\n \n \n \n
    \n
    \n \n {pgettext(\"profile avatar moderation btn\", \"Close\")}\n \n \n
    \n \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n return this.getFormBody()\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error) {\n return \"modal-dialog modal-message modal-avatar-controls\"\n } else {\n return \"modal-dialog modal-avatar-controls\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"profile avatar moderation title\", \"Avatar controls\")}\n

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { addNameChange } from \"misago/reducers/username-history\"\nimport { updateUsername } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n error: null,\n\n username: \"\",\n validators: {\n username: [validators.usernameContent()],\n },\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.moderate_username).then(\n () => {\n this.setState({\n isLoaded: true,\n })\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(this.validate().username[0])\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.profile.api.moderate_username, {\n username: this.state.username,\n })\n }\n\n handleSuccess(apiResponse) {\n this.setState({\n username: \"\",\n })\n\n store.dispatch(\n addNameChange(apiResponse, this.props.profile, this.props.user)\n )\n store.dispatch(\n updateUsername(this.props.profile, apiResponse.username, apiResponse.slug)\n )\n\n snackbar.success(\n pgettext(\"profile username moderation\", \"Username has been changed.\")\n )\n }\n\n getFormBody() {\n return (\n
    \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"profile username moderation btn\", \"Cancel\")}\n \n \n
    \n
    \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n return this.getFormBody()\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error) {\n return \"modal-dialog modal-message modal-rename-user\"\n } else {\n return \"modal-dialog modal-rename-user\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"profile username moderation title\", \"Change username\")}\n

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport polls from \"misago/services/polls\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n isDeleted: false,\n error: null,\n\n countdown: 5,\n confirm: false,\n\n with_content: false,\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.delete).then(\n () => {\n this.setState({\n isLoaded: true,\n })\n\n this.countdown()\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n countdown = () => {\n window.setTimeout(() => {\n if (this.state.countdown > 1) {\n this.setState({\n countdown: this.state.countdown - 1,\n })\n this.countdown()\n } else if (!this.state.confirm) {\n this.setState({\n confirm: true,\n })\n }\n }, 1000)\n }\n\n send() {\n return ajax.post(this.props.profile.api.delete, {\n with_content: this.state.with_content,\n })\n }\n\n handleSuccess() {\n polls.stop(\"user-profile\")\n\n if (this.state.with_content) {\n this.setState({\n isDeleted: interpolate(\n pgettext(\n \"profile delete\",\n \"%(username)s's account, threads, posts and other content has been deleted.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n ),\n })\n } else {\n this.setState({\n isDeleted: interpolate(\n pgettext(\n \"profile delete\",\n \"%(username)s's account has been deleted and other content has been hidden.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n ),\n })\n }\n }\n\n getButtonLabel() {\n if (this.state.confirm) {\n return interpolate(\n pgettext(\"profile delete btn\", \"Delete %(username)s\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n } else {\n return interpolate(\n pgettext(\"profile delete btn\", \"Please wait... (%(countdown)ss)\"),\n {\n countdown: this.state.countdown,\n },\n true\n )\n }\n }\n\n getForm() {\n return (\n
    \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"profile delete btn\", \"Cancel\")}\n \n\n \n {this.getButtonLabel()}\n \n
    \n
    \n )\n }\n\n getDeletedBody() {\n return (\n
    \n
    \n info_outline\n
    \n \n
    \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n if (this.state.isDeleted) {\n return this.getDeletedBody()\n } else {\n return this.getForm()\n }\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error || this.state.isDeleted) {\n return \"modal-dialog modal-message modal-delete-account\"\n } else {\n return \"modal-dialog modal-delete-account\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"profile delete title\", \"Delete user account\")}\n

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport AvatarControls from \"misago/components/profile/moderation/avatar-controls\"\nimport ChangeUsername from \"misago/components/profile/moderation/change-username\"\nimport DeleteAccount from \"misago/components/profile/moderation/delete-account\"\nimport modal from \"misago/services/modal\"\n\nlet select = function (store) {\n return {\n tick: store.tick,\n user: store.auth,\n profile: store.profile,\n }\n}\n\nexport default class extends React.Component {\n showAvatarDialog = () => {\n modal.show(connect(select)(AvatarControls))\n }\n\n showRenameDialog = () => {\n modal.show(connect(select)(ChangeUsername))\n }\n\n showDeleteDialog = () => {\n modal.show(connect(select)(DeleteAccount))\n }\n\n render() {\n const { moderation } = this.props\n\n return (\n
      \n {!!moderation.avatar && (\n
    • \n \n portrait\n {pgettext(\"profile moderation menu\", \"Avatar controls\")}\n \n
    • \n )}\n {!!moderation.rename && (\n
    • \n \n credit_card\n {pgettext(\"profile moderation menu\", \"Change username\")}\n \n
    • \n )}\n {!!moderation.delete && (\n
    • \n \n clear\n {pgettext(\"profile moderation menu\", \"Delete account\")}\n \n
    • \n )}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Status, { StatusIcon, StatusLabel } from \"../user-status\"\n\nconst ProfileDataList = ({ profile }) => (\n
      \n {profile.is_active === false && (\n
    • \n \n {pgettext(\"profile data list\", \"Account disabled\")}\n \n
    • \n )}\n
    • \n \n \n \n \n
    • \n {profile.rank.is_tab ? (\n
    • \n \n {profile.rank.name}\n \n
    • \n ) : (\n
    • \n {profile.rank.name}\n
    • \n )}\n {(profile.title || profile.rank.title) && (\n
    • {profile.title || profile.rank.title}
    • \n )}\n
    • \n \n {interpolate(\n pgettext(\"profile data list\", \"Joined %(joined_on)s\"),\n {\n joined_on: profile.joined_on.fromNow(),\n },\n true\n )}\n \n
    • \n {profile.email && (\n
    • \n \n {profile.email}\n \n
    • \n )}\n
    \n)\n\nexport default ProfileDataList\n","import React from \"react\"\nimport Avatar from \"../avatar\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n PageHeaderDetails,\n} from \"../PageHeader\"\nimport FollowButton from \"./follow-button\"\nimport MessageButton from \"./message-button\"\nimport ModerationOptions from \"./moderation/nav\"\nimport ProfileDataList from \"./ProfileDataList\"\n\nconst ProfileHeader = ({ profile, user, moderation, message, follow }) => (\n \n \n \n
    \n
    \n \n \n \n
    \n

    {profile.username}

    \n
    \n \n \n \n \n \n \n \n \n {message && (\n \n \n \n \n {moderation.available && !follow && (\n \n
    \n \n \n
    \n
    \n )}\n
    \n )}\n {follow && (\n \n \n \n \n {moderation.available && (\n \n
    \n \n \n
    \n
    \n )}\n
    \n )}\n {moderation.available && !follow && !message && (\n \n \n
    \n \n \n
    \n
    \n \n
    \n \n settings\n {pgettext(\"profile options btn\", \"Options\")}\n \n \n
    \n
    \n
    \n )}\n
    \n
    \n \n
    \n)\n\nconst ProfileModerationButton = () => (\n \n settings\n \n)\n\nexport default ProfileHeader\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst ProfileNav = ({ baseUrl, page, pages }) => (\n
    \n
    \n \n {page.icon}\n {page.name}\n \n
      \n {pages.map((page) => (\n
    • \n \n {page.icon}\n {page.name}\n \n
    • \n ))}\n
    \n
    \n
      \n {pages.map((page) => (\n
    • \n \n {page.icon}\n {page.name}\n \n
    • \n ))}\n
    \n
    \n)\n\nexport default ProfileNav\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport BanDetails from \"./ban-details\"\nimport Details from \"./details\"\nimport { Posts, Threads } from \"./feed\"\nimport Followers from \"./followers\"\nimport Follows from \"./follows\"\nimport UsernameHistory from \"./username-history\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport PageContainer from \"../PageContainer\"\nimport ProfileHeader from \"./ProfileHeader\"\nimport ProfileNav from \"./ProfileNav\"\n\nexport default class extends WithDropdown {\n constructor(props) {\n super(props)\n\n this.startPolling(props.profile.api.index)\n }\n\n startPolling(api) {\n polls.start({\n poll: \"user-profile\",\n url: api,\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data))\n }\n\n render() {\n const baseUrl = misago.get(\"PROFILE\").url\n const pages = misago.get(\"PROFILE_PAGES\")\n const page = pages.filter((page) => {\n const url = baseUrl + page.component + \"/\"\n return this.props.location.pathname === url\n })[0]\n const { profile, user } = this.props\n const moderation = getModeration(profile, user)\n const message =\n !!user.acl.can_start_private_threads && profile.id !== user.id\n const follow = !!profile.acl.can_follow && profile.id !== user.id\n\n return (\n
    \n \n \n \n\n {this.props.children}\n \n
    \n )\n }\n}\n\nconst getModeration = (profile, user) => {\n const moderation = {\n available: false,\n rename: false,\n avatar: false,\n delete: false,\n }\n\n if (user.is_anonymous) return moderation\n\n moderation.rename = profile.acl.can_rename\n moderation.avatar = profile.acl.can_moderate_avatar\n moderation.delete = profile.acl.can_delete\n moderation.available = !!(\n moderation.rename ||\n moderation.avatar ||\n moderation.delete\n )\n\n return moderation\n}\n\nexport function select(store) {\n return {\n isAuthenticated: store.auth.user.id === store.profile.id,\n\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n posts: store.posts,\n profile: store.profile,\n profileDetails: store[\"profile-details\"],\n \"username-history\": store[\"username-history\"],\n }\n}\n\nconst COMPONENTS = {\n posts: Posts,\n threads: Threads,\n followers: Followers,\n follows: Follows,\n details: Details,\n \"username-history\": UsernameHistory,\n \"ban-details\": BanDetails,\n}\n\nexport function paths() {\n let paths = []\n misago.get(\"PROFILE_PAGES\").forEach(function (item) {\n paths.push(\n Object.assign({}, item, {\n path: misago.get(\"PROFILE\").url + item.component + \"/\",\n component: connect(select)(COMPONENTS[item.component]),\n })\n )\n })\n\n return paths\n}\n","import React from \"react\"\nimport Route from \"./route\"\n\nexport function Threads(props) {\n let emptyMessage = null\n if (props.user.id === props.profile.id) {\n emptyMessage = pgettext(\n \"profile threads\",\n \"You haven't started any threads.\"\n )\n } else {\n emptyMessage = interpolate(\n pgettext(\"profile threads\", \"%(username)s hasn't started any threads\"),\n {\n username: props.profile.username,\n },\n true\n )\n }\n\n let header = null\n if (!props.posts.isLoaded) {\n header = pgettext(\"profile threads\", \"Loading...\")\n } else if (props.profile.id === props.user.id) {\n const message = npgettext(\n \"profile threads\",\n \"You have started %(threads)s thread.\",\n \"You have started %(threads)s threads.\",\n props.profile.threads\n )\n\n header = interpolate(\n message,\n {\n threads: props.profile.threads,\n },\n true\n )\n } else {\n const message = npgettext(\n \"profile threads\",\n \"%(username)s has started %(threads)s thread.\",\n \"%(username)s has started %(threads)s threads.\",\n props.profile.threads\n )\n\n header = interpolate(\n message,\n {\n username: props.profile.username,\n threads: props.profile.threads,\n },\n true\n )\n }\n\n return (\n \n )\n}\n\nexport function Posts(props) {\n let emptyMessage = null\n if (props.user.id === props.profile.id) {\n emptyMessage = pgettext(\"profile posts\", \"You have posted no messages.\")\n } else {\n emptyMessage = interpolate(\n pgettext(\"profile posts\", \"%(username)s posted no messages.\"),\n {\n username: props.profile.username,\n },\n true\n )\n }\n\n let header = null\n if (!props.posts.isLoaded) {\n header = pgettext(\"profile posts\", \"Loading...\")\n } else if (props.profile.id === props.user.id) {\n const message = npgettext(\n \"profile posts\",\n \"You have posted %(posts)s message.\",\n \"You have posted %(posts)s messages.\",\n props.profile.posts\n )\n\n header = interpolate(\n message,\n {\n posts: props.profile.posts,\n },\n true\n )\n } else {\n const message = npgettext(\n \"profile posts\",\n \"%(username)s has posted %(posts)s message.\",\n \"%(username)s has posted %(posts)s messages.\",\n props.profile.posts\n )\n\n header = interpolate(\n message,\n {\n username: props.profile.username,\n posts: props.profile.posts,\n },\n true\n )\n }\n\n return (\n \n )\n}\n","import { connect } from \"react-redux\"\nimport Profile, { paths, select } from \"misago/components/profile/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"PROFILE\") && context.has(\"PROFILE_PAGES\")) {\n mount({\n root: misago.get(\"PROFILE\").url,\n component: connect(select)(Profile),\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:profile\",\n initializer: initializer,\n after: \"reducer:profile-hydrate\",\n})\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestLinkForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n email: \"\",\n\n validators: {\n email: [validators.email()],\n },\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(\n pgettext(\n \"request activation link form\",\n \"Enter a valid e-mail address.\"\n )\n )\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"SEND_ACTIVATION_API\"), {\n email: this.state.email,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if ([\"already_active\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n snackbar.info(rejection.detail)\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {pgettext(\"request activation link form btn\", \"Send link\")}\n \n \n
    \n )\n }\n}\n\nexport class LinkSent extends React.Component {\n getMessage() {\n return interpolate(\n pgettext(\n \"request activation link form\",\n \"Activation link was sent to %(email)s\"\n ),\n {\n email: this.props.user.email,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n check\n
    \n
    \n

    {this.getMessage()}

    \n
    \n \n {pgettext(\n \"request activation link form btn\",\n \"Request another link\"\n )}\n \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n complete = (apiResponse) => {\n this.setState({\n complete: apiResponse,\n })\n }\n\n reset = () => {\n this.setState({\n complete: false,\n })\n }\n\n render() {\n if (this.state.complete) {\n return \n } else {\n return \n }\n }\n}\n","import misago from \"misago/index\"\nimport RequestActivationLink from \"misago/components/request-activation-link\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"request-activation-link-mount\")) {\n mount(RequestActivationLink, \"request-activation-link-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:request-activation-link\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestResetForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n email: \"\",\n\n validators: {\n email: [validators.email()],\n },\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(\n pgettext(\"request password reset form\", \"Enter a valid e-mail address.\")\n )\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"SEND_PASSWORD_RESET_API\"), {\n email: this.state.email,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if ([\"inactive_user\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n this.props.showInactivePage(rejection)\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {pgettext(\"request password reset form btn\", \"Send link\")}\n \n \n
    \n )\n }\n}\n\nexport class LinkSent extends React.Component {\n getMessage() {\n return interpolate(\n pgettext(\n \"request password reset form\",\n \"Reset password link was sent to %(email)s\"\n ),\n {\n email: this.props.user.email,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n check\n
    \n
    \n

    {this.getMessage()}

    \n
    \n \n {pgettext(\n \"request password reset form btn\",\n \"Request another link\"\n )}\n \n
    \n
    \n )\n }\n}\n\nexport class AccountInactivePage extends React.Component {\n getActivateButton() {\n if (this.props.activation === \"inactive_user\") {\n return (\n

    \n \n {pgettext(\n \"request password reset form error\",\n \"Activate your account.\"\n )}\n \n

    \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n info_outline\n
    \n\n
    \n

    \n {pgettext(\n \"request password reset form error\",\n \"Your account is inactive.\"\n )}\n

    \n

    {this.props.message}

    \n {this.getActivateButton()}\n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n complete = (apiResponse) => {\n this.setState({\n complete: apiResponse,\n })\n }\n\n reset = () => {\n this.setState({\n complete: false,\n })\n }\n\n showInactivePage(apiResponse) {\n ReactDOM.render(\n ,\n document.getElementById(\"page-mount\")\n )\n }\n\n render() {\n if (this.state.complete) {\n return \n }\n\n return (\n \n )\n }\n}\n","import misago from \"misago/index\"\nimport RequestPasswordReset from \"misago/components/request-password-reset\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"request-password-reset-mount\")) {\n mount(RequestPasswordReset, \"request-password-reset-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:request-password-reset\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport SignInModal from \"misago/components/sign-in.js\"\nimport ajax from \"misago/services/ajax\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class ResetPasswordForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n password: \"\",\n }\n }\n\n clean() {\n if (this.state.password.trim().length) {\n return true\n } else {\n snackbar.error(pgettext(\"password reset form\", \"Enter new password.\"))\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"CHANGE_PASSWORD_API\"), {\n password: this.state.password,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {pgettext(\"password reset form btn\", \"Change password\")}\n \n \n
    \n )\n }\n}\n\nexport class PasswordChangedPage extends React.Component {\n getMessage() {\n return interpolate(\n pgettext(\n \"password reset form\",\n \"%(username)s, your password has been changed.\"\n ),\n {\n username: this.props.user.username,\n },\n true\n )\n }\n\n showSignIn() {\n modal.show(SignInModal)\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n check\n
    \n\n
    \n

    {this.getMessage()}

    \n

    \n {pgettext(\n \"password reset form\",\n \"Sign in using new password to continue.\"\n )}\n

    \n

    \n \n {pgettext(\"password reset form btn\", \"Sign in\")}\n \n

    \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n complete = (apiResponse) => {\n auth.softSignOut()\n\n // nuke \"next\" field so we don't end\n // coming back to error page after sign in\n $('#hidden-login-form input[name=\"next\"]').remove()\n\n ReactDOM.render(\n ,\n document.getElementById(\"page-mount\")\n )\n }\n\n render() {\n return \n }\n}\n","import misago from \"misago\"\nimport ResetPasswordForm from \"misago/components/reset-password-form\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"reset-password-form-mount\")) {\n mount(ResetPasswordForm, \"reset-password-form-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:reset-password-form\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { SearchOverlay } from \"../../components/Search\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"search-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:search-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport misago from \"misago\"\nimport Form from \"misago/components/form\"\nimport { load as updatePosts } from \"misago/reducers/posts\"\nimport { update as updateSearch } from \"misago/reducers/search\"\nimport { hydrate as updateUsers } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n PageHeader,\n PageHeaderContainer,\n PageHeaderBanner,\n PageHeaderDetails,\n} from \"../PageHeader\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n query: props.search.query,\n }\n }\n\n componentDidMount() {\n if (this.state.query.length) {\n this.handleSubmit()\n }\n }\n\n onQueryChange = (event) => {\n this.changeValue(\"query\", event.target.value)\n }\n\n clean() {\n if (!this.state.query.trim().length) {\n snackbar.error(pgettext(\"search form\", \"You have to enter search query.\"))\n return false\n }\n\n return true\n }\n\n send() {\n store.dispatch(\n updateSearch({\n isLoading: true,\n })\n )\n\n const query = this.state.query.trim()\n\n let url = window.location.href\n const urlQuery = url.indexOf(\"?q=\")\n if (urlQuery > 0) {\n url = url.substring(0, urlQuery + 3)\n }\n window.history.pushState({}, \"\", url + encodeURIComponent(query))\n\n return ajax.get(misago.get(\"SEARCH_API\"), { q: query })\n }\n\n handleSuccess(providers) {\n store.dispatch(\n updateSearch({\n query: this.state.query.trim(),\n isLoading: false,\n providers,\n })\n )\n\n providers.forEach((provider) => {\n if (provider.id === \"users\") {\n store.dispatch(updateUsers(provider.results.results))\n } else if (provider.id === \"threads\") {\n store.dispatch(updatePosts(provider.results))\n }\n })\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n\n store.dispatch(\n updateSearch({\n isLoading: false,\n })\n )\n }\n\n render() {\n return (\n
    \n \n \n \n

    {pgettext(\"search form title\", \"Search\")}

    \n
    \n \n \n \n \n \n \n \n \n search\n \n \n \n \n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function (props) {\n return (\n
    \n {props.providers.map((provider) => {\n return (\n \n {provider.icon}\n {provider.name}\n \n \n )\n })}\n
    \n )\n}\n\nexport function Badge(props) {\n if (!props.results) return null\n\n let count = props.results.count\n if (count > 1000000) {\n count = Math.ceil(count / 1000000) + \"KK\"\n } else if (count > 1000) {\n count = Math.ceil(count / 1000) + \"K\"\n }\n\n return {count}\n}\n","import React from \"react\"\nimport PageContainer from \"../PageContainer\"\nimport SearchForm from \"./form\"\nimport SideNav from \"./sidenav\"\n\nexport default function (props) {\n return (\n
    \n \n \n
    \n
    \n \n
    \n
    \n {props.children}\n \n
    \n
    \n
    \n
    \n )\n}\n\nexport function SearchTime(props) {\n let time = null\n props.search.providers.forEach((p) => {\n if (p.id === props.provider.id) {\n time = p.time\n }\n })\n\n if (time === null) return null\n\n const copy = pgettext(\"search time\", \"Search took %(time)s s\")\n\n return (\n
    \n

    {interpolate(copy, { time }, true)}

    \n
    \n )\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport {\n update as updatePosts,\n append as appendPosts,\n} from \"misago/reducers/posts\"\nimport { updateProvider } from \"misago/reducers/search\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n return (\n
    \n \n \n
    \n )\n}\n\nexport class LoadMore extends React.Component {\n onClick = () => {\n store.dispatch(\n updatePosts({\n isBusy: true,\n })\n )\n\n ajax\n .get(this.props.provider.api, {\n q: this.props.query,\n page: this.props.next,\n })\n .then(\n (providers) => {\n providers.forEach((provider) => {\n if (provider.id !== \"threads\") return\n store.dispatch(appendPosts(provider.results))\n store.dispatch(updateProvider(provider))\n })\n\n store.dispatch(\n updatePosts({\n isBusy: false,\n })\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n store.dispatch(\n updatePosts({\n isBusy: false,\n })\n )\n }\n )\n }\n\n render() {\n if (!this.props.more) return null\n\n return (\n
    \n \n {pgettext(\"search threads btn\", \"Show more\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport Results from \"./results\"\n\nexport default function (props) {\n return (\n \n \n \n \n \n )\n}\n\nexport function Blankslate({ children, loading, posts, query }) {\n if (posts && posts.count) return children\n\n if (query.length) {\n return (\n

    \n {loading\n ? pgettext(\"search threads\", \"Loading results...\")\n : pgettext(\n \"search threads\",\n \"No threads matching search query have been found.\"\n )}\n

    \n )\n }\n\n return (\n

    \n {pgettext(\n \"search threads\",\n \"Enter at least two characters to search threads.\"\n )}\n

    \n )\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport UsersList from \"misago/components/users-list\"\n\nexport default function (props) {\n return (\n \n \n \n \n \n )\n}\n\nexport function Blankslate({ children, loading, query, users }) {\n if (users.length) return children\n\n if (query.length) {\n return (\n

    \n {loading\n ? pgettext(\"search users\", \"Loading results...\")\n : pgettext(\n \"search users\",\n \"No users matching search query have been found.\"\n )}\n

    \n )\n }\n\n return (\n

    \n {pgettext(\n \"search users\",\n \"Enter at least two characters to search users.\"\n )}\n

    \n )\n}\n","import { connect } from \"react-redux\"\nimport SearchThreads from \"./threads\"\nimport SearchUsers from \"./users\"\n\nconst components = {\n threads: SearchThreads,\n users: SearchUsers,\n}\n\nexport function select(store) {\n return {\n posts: store.posts,\n search: store.search,\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n }\n}\n\nexport default function (providers) {\n return providers.map((provider) => {\n return {\n path: provider.url,\n component: connect(select)(components[provider.id]),\n provider: provider,\n }\n })\n}\n","import paths from \"misago/components/search-route\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.get(\"CURRENT_LINK\") === \"misago:search\") {\n mount({\n paths: paths(misago.get(\"SEARCH_PROVIDERS\")),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:search\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { SiteNavOverlay } from \"../../components/SiteNav\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"site-nav-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:site-nav-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nconst TYPES_CLASSES = {\n info: \"alert-info\",\n success: \"alert-success\",\n warning: \"alert-warning\",\n error: \"alert-danger\",\n}\n\nexport class Snackbar extends React.Component {\n getSnackbarClass() {\n let snackbarClass = \"alerts-snackbar\"\n if (this.props.isVisible) {\n snackbarClass += \" in\"\n } else {\n snackbarClass += \" out\"\n }\n return snackbarClass\n }\n\n render() {\n return (\n
    \n

    \n {this.props.message}\n

    \n
    \n )\n }\n}\n\nexport function select(state) {\n return state.snackbar\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport { Snackbar, select } from \"misago/components/snackbar\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(Snackbar), \"snackbar-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:snackbar\",\n initializer: initializer,\n after: \"snackbar\",\n})\n","import React from \"react\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nconst Header = ({ backendName }) => {\n const pageTitleTpl = pgettext(\"social auth title\", \"Sign in with %(backend)s\")\n const pageTitle = interpolate(pageTitleTpl, { backend: backendName }, true)\n\n return (\n \n \n \n

    {pageTitle}

    \n
    \n
    \n
    \n )\n}\n\nexport default Header\n","import React from \"react\"\nimport misago from \"misago\"\nimport RegisterLegalFootnote from \"misago/components/RegisterLegalFootnote\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nexport default class Register extends Form {\n constructor(props) {\n super(props)\n\n const formValidators = {\n email: [validators.email()],\n username: [validators.usernameContent()],\n }\n\n if (!!misago.get(\"TERMS_OF_SERVICE_ID\")) {\n formValidators.termsOfService = [validators.requiredTermsOfService()]\n }\n\n if (!!misago.get(\"PRIVACY_POLICY_ID\")) {\n formValidators.privacyPolicy = [validators.requiredPrivacyPolicy()]\n }\n\n this.state = {\n email: props.email || \"\",\n emailProtected: !!props.email,\n username: props.username || \"\",\n\n termsOfService: null,\n privacyPolicy: null,\n\n validators: formValidators,\n errors: {},\n\n isLoading: false,\n }\n }\n\n clean() {\n let errors = this.validate()\n let lengths = [\n this.state.email.trim().length,\n this.state.username.trim().length,\n ]\n\n if (lengths.indexOf(0) !== -1) {\n snackbar.error(pgettext(\"social auth form\", \"Fill out all fields.\"))\n return false\n }\n\n const { validators } = this.state\n\n const checkTermsOfService = !!misago.get(\"TERMS_OF_SERVICE_ID\")\n if (checkTermsOfService && this.state.termsOfService === null) {\n snackbar.error(validators.termsOfService[0](null))\n return false\n }\n\n const checkPrivacyPolicy = !!misago.get(\"PRIVACY_POLICY_ID\")\n if (checkPrivacyPolicy && this.state.privacyPolicy === null) {\n snackbar.error(validators.privacyPolicy[0](null))\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.url, {\n email: this.state.email,\n username: this.state.username,\n terms_of_service: this.state.termsOfService,\n privacy_policy: this.state.privacyPolicy,\n })\n }\n\n handleSuccess(response) {\n const { onRegistrationComplete } = this.props\n onRegistrationComplete(response)\n }\n\n handleError(rejection) {\n if (rejection.status === 200) {\n // We've entered \"errored\" state because response is HTML instead of exptected JSON\n const { onRegistrationComplete } = this.props\n const { username } = this.state\n onRegistrationComplete({ activation: \"active\", step: \"done\", username })\n } else if (rejection.status === 400) {\n const stateUpdate = { errors: rejection }\n if (rejection.email) {\n stateUpdate.emailProtected = false\n }\n this.setState(stateUpdate)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n handlePrivacyPolicyChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"privacyPolicy\", value)\n }\n\n handleTermsOfServiceChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"termsOfService\", value)\n }\n\n handleToggleAgreement = (agreement, value) => {\n this.setState((prevState, props) => {\n if (prevState[agreement] === null) {\n const errors = { ...prevState.errors, [agreement]: null }\n return { errors, [agreement]: value }\n }\n\n const validator = this.state.validators[agreement][0]\n const errors = { ...prevState.errors, [agreement]: [validator(null)] }\n return { errors, [agreement]: null }\n })\n }\n\n render() {\n const { backend_name } = this.props\n const { email, emailProtected, username, isLoading } = this.state\n\n let emailHelpText = null\n if (emailProtected) {\n const emailHelpTextTpl = pgettext(\n \"social auth form\",\n \"Your e-mail address has been verified by %(backend)s.\"\n )\n emailHelpText = interpolate(\n emailHelpTextTpl,\n { backend: backend_name },\n true\n )\n }\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n {pgettext(\n \"social auth form title\",\n \"Complete your account\"\n )}\n

    \n
    \n
    \n \n \n \n \n \n \n \n
    \n
    \n \n {pgettext(\"social auth form btn\", \"Sign in\")}\n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nconst Complete = ({ activation, backend_name, username }) => {\n let icon = \"\"\n let message = \"\"\n if (activation === \"user\") {\n message = pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\"\n )\n } else if (activation === \"admin\") {\n message = pgettext(\n \"account activation required\",\n \"%(username)s, your account has been created but the site administrator will have to activate it before you will be able to sign in.\"\n )\n } else {\n message = pgettext(\n \"social auth complete\",\n \"%(username)s, your account has been created and you have been signed in to it.\"\n )\n }\n\n if (activation === \"active\") {\n icon = \"check\"\n } else {\n icon = \"info_outline\"\n }\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n
    \n

    \n {pgettext(\n \"social auth complete title\",\n \"Registration completed!\"\n )}\n

    \n
    \n
    \n
    \n {icon}\n
    \n
    \n

    \n {interpolate(message, { username }, true)}\n

    \n

    \n \n {pgettext(\n \"social auth complete link\",\n \"Return to forum index\"\n )}\n \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n )\n}\n\nexport default Complete\n","import React from \"react\"\nimport Register from \"./register\"\nimport Complete from \"./complete\"\n\nexport default class SocialAuth extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n step: props.step,\n\n activation: props.activation || \"\",\n email: props.email || \"\",\n username: props.username || \"\",\n }\n }\n\n handleRegistrationComplete = ({ activation, email, step, username }) => {\n this.setState({ activation, email, step, username })\n }\n\n render() {\n const { backend_name, url } = this.props\n const { activation, email, step, username } = this.state\n\n if (step === \"register\") {\n return (\n \n )\n }\n\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport SocialAuth from \"misago/components/social-auth\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n if (context.get(\"CURRENT_LINK\") === \"misago:social-complete\") {\n const props = context.get(\"SOCIAL_AUTH_FORM\")\n mount(, \"page-mount\")\n }\n}\n\nmisago.addInitializer({\n name: \"component:social-auth\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport Form from \"./form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n username: \"\",\n }\n }\n\n onUsernameChange = (event) => {\n this.changeValue(\"username\", event.target.value)\n }\n\n clean() {\n if (!this.state.username.trim().length) {\n snackbar.error(\n pgettext(\n \"add private thread participant\",\n \"You have to enter user name.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.patch(this.props.thread.api.index, [\n { op: \"add\", path: \"participants\", value: this.state.username },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n }\n\n handleSuccess(data) {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n snackbar.success(\n pgettext(\n \"add private thread participant\",\n \"New participant has been added to thread.\"\n )\n )\n\n modal.hide()\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\n \"add private thread participant btn\",\n \"Add participant\"\n )}\n \n \n {pgettext(\"add private thread participant btn\", \"Cancel\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\n \"add private thread participant modal title\",\n \"Add participant\"\n )}\n

    \n
    \n )\n}\n","import React from \"react\"\nimport AddParticipantModal from \"misago/components/add-participant\"\nimport modal from \"misago/services/modal\"\n\nexport default class extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.thread.acl.can_add_participants) return null\n\n return (\n
    \n \n person_add\n {pgettext(\"add participant btn\", \"Add participant\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport { changeOwner } from \"./actions\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.isUser = props.participant.id === props.user.id\n }\n\n onClick = () => {\n let confirmed = false\n if (this.isUser) {\n confirmed = window.confirm(\n pgettext(\n \"private thread owner change\",\n \"Are you sure you want to take over this thread?\"\n )\n )\n } else {\n const message = pgettext(\n \"private thread owner change\",\n \"Are you sure you want to change thread owner to %(user)s?\"\n )\n confirmed = window.confirm(\n interpolate(\n message,\n {\n user: this.props.participant.username,\n },\n true\n )\n )\n }\n\n if (!confirmed) return\n\n changeOwner(this.props.thread, this.props.participant)\n }\n\n render() {\n if (this.props.participant.is_owner) return null\n if (!this.props.thread.acl.can_change_owner) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function leave(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"remove\", path: \"participants\", value: participant.id },\n ])\n .then(\n () => {\n snackbar.success(\n pgettext(\"thread participants actions\", \"You have left this thread.\")\n )\n window.setTimeout(() => {\n window.location = misago.get(\"PRIVATE_THREADS_URL\")\n }, 3 * 1000)\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n\nexport function remove(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"remove\", path: \"participants\", value: participant.id },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n .then(\n (data) => {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n const message = pgettext(\n \"thread participants actions\",\n \"%(user)s has been removed from this thread.\"\n )\n snackbar.success(\n interpolate(\n message,\n {\n user: participant.username,\n },\n true\n )\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n\nexport function changeOwner(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"replace\", path: \"owner\", value: participant.id },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n .then(\n (data) => {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n const message = pgettext(\n \"thread participants actions\",\n \"%(user)s has been made new thread owner.\"\n )\n snackbar.success(\n interpolate(\n message,\n {\n user: participant.username,\n },\n true\n )\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n","import React from \"react\"\nimport { remove, leave } from \"./actions\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.isUser = props.participant.id === props.user.id\n }\n\n onClick = () => {\n let confirmed = false\n if (this.isUser) {\n confirmed = window.confirm(\n pgettext(\n \"private thread leave\",\n \"Are you sure you want to leave this thread?\"\n )\n )\n } else {\n const message = pgettext(\n \"private thread leave\",\n \"Are you sure you want to remove %(user)s from this thread?\"\n )\n confirmed = window.confirm(\n interpolate(\n message,\n {\n user: this.props.participant.username,\n },\n true\n )\n )\n }\n\n if (!confirmed) return\n\n if (this.isUser) {\n leave(this.props.thread, this.props.participant)\n } else {\n remove(this.props.thread, this.props.participant)\n }\n }\n\n render() {\n const isModerator = this.props.user.acl.can_moderate_private_threads\n\n if (!(this.props.userIsOwner || this.isUser || isModerator)) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport MakeOwner from \"./make-owner\"\nimport Remove from \"./remove\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default function (props) {\n const participant = props.participant\n\n let className = \"btn btn-default\"\n if (participant.is_owner) {\n className = \"btn btn-primary\"\n }\n className += \" btn-user btn-block\"\n\n return (\n
    \n
    \n \n \n {participant.username}\n \n \n
    \n
    \n )\n}\n\nexport function UserStatus({ isOwner }) {\n if (!isOwner) return null\n\n return (\n
  • \n start\n \n {pgettext(\"thread participants owner status\", \"Thread owner\")}\n \n
  • \n )\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ participants, thread, user, userIsOwner }) {\n return (\n
    \n
    \n {participants.map((participant) => {\n return (\n \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport AddParticipant from \"./add-participant\"\nimport CardsList from \"./cards-list\"\nimport * as utils from \"./utils\"\n\nexport default function (props) {\n if (!props.participants.length) return null\n\n return (\n
    \n
    \n \n
    \n \n
    \n

    {utils.getParticipantsCopy(props.participants)}

    \n
    \n
    \n
    \n
    \n )\n}\n\nexport function getUserIsOwner(user, participants) {\n return participants[0].id === user.id\n}\n","export function getParticipantsCopy(participants) {\n const count = participants.length\n const message = npgettext(\n \"thread participants stat\",\n \"This thread has %(users)s participant.\",\n \"This thread has %(users)s participants.\",\n count\n )\n\n return interpolate(\n message,\n {\n users: count,\n },\n true\n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n {props.poll.choices.map((choice) => {\n return (\n \n )\n })}\n
    \n )\n}\n\nexport function PollChoice(props) {\n let proc = 0\n if (props.choice.votes && props.poll.votes) {\n proc = Math.ceil((props.choice.votes * 100) / props.poll.votes)\n }\n\n return (\n
    \n
    {props.choice.label}
    \n
    \n
    \n \n \n {getVotesLabel(props.votes, props.proc)}\n \n
    \n \n
      \n \n \n
    \n
    \n
    \n )\n}\n\nexport function ChoiceVotes(props) {\n return (\n
  • \n {getVotesLabel(props.votes, props.proc)}\n
  • \n )\n}\n\nexport function getVotesLabel(votes, proc) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s vote, %(proc)s% of total.\",\n \"%(votes)s votes, %(proc)s% of total.\",\n votes\n )\n\n return interpolate(\n message,\n {\n votes: votes,\n proc: proc,\n },\n true\n )\n}\n\nexport function UserChoice(props) {\n if (!props.selected) return null\n\n return (\n
  • \n check_box\n {pgettext(\"thread poll\", \"You've voted on this choice.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: true,\n error: null,\n data: [],\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.poll.api.votes).then(\n (data) => {\n const hydratedData = data.map((choice) => {\n return Object.assign({}, choice, {\n voters: choice.voters.map((voter) => {\n return Object.assign({}, voter, {\n voted_on: moment(voter.voted_on),\n })\n }),\n })\n })\n\n this.setState({\n isLoading: false,\n data: hydratedData,\n })\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n error: rejection.detail,\n })\n }\n )\n }\n\n render() {\n return (\n \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"thread poll\", \"Poll votes\")}\n

    \n
    \n\n \n
    \n \n )\n }\n}\n\nexport function ModalBody(props) {\n if (props.isLoading) {\n return \n } else if (props.error) {\n return \n }\n\n return \n}\n\nexport function ChoicesList(props) {\n return (\n
    \n
      \n {props.data.map((choice) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function ChoiceDetails(props) {\n return (\n
  • \n

    {props.label}

    \n \n \n
    \n
  • \n )\n}\n\nexport function VotesCount(props) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s user has voted for this choice.\",\n \"%(votes)s users have voted for this choice.\",\n props.votes\n )\n\n const label = interpolate(\n message,\n {\n votes: props.votes,\n },\n true\n )\n\n return

    {label}

    \n}\n\nexport function VotesList(props) {\n if (!props.voters.length) return null\n\n return (\n
      \n {props.voters.map((user) => {\n return \n })}\n
    \n )\n}\n\nexport function Voter(props) {\n if (props.url) {\n return (\n
  • \n \n {props.username}\n {\" \"}\n \n
  • \n )\n }\n\n return (\n
  • \n {props.username} \n
  • \n )\n}\n\nexport function VoteDate(props) {\n return (\n \n {props.voted_on.fromNow()}\n \n )\n}\n","import React from \"react\"\nimport Modal from \"./modal\"\nimport * as poll from \"misago/reducers/poll\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n const { isPollOver, poll, showVoting, thread } = props\n\n if (!isVisible(isPollOver, poll.acl, poll)) return null\n\n const controls = []\n\n const canVote = poll.acl.can_vote\n const canChangeVote = !poll.hasSelectedChoices || poll.allow_revotes\n\n if (canVote && canChangeVote) controls.push(0)\n if (poll.is_public || poll.acl.can_see_votes) controls.push(1)\n if (poll.acl.can_edit) controls.push(2)\n if (poll.acl.can_delete) controls.push(3)\n\n return (\n
    \n \n \n \n \n
    \n )\n}\n\nexport function isVisible(isPollOver, acl, poll) {\n return (\n poll.is_public ||\n acl.can_delete ||\n acl.can_edit ||\n acl.can_see_votes ||\n (acl.can_vote &&\n !isPollOver &&\n (!poll.hasSelectedChoices || poll.allow_revotes))\n )\n}\n\nexport function getClassName(controls, control) {\n let className = \"col-xs-6\"\n\n if (controls.length === 1) {\n className = \"col-xs-12\"\n }\n\n if (controls.length === 3 && controls[0] === control) {\n className = \"col-xs-12\"\n }\n\n return className + \" col-sm-3 col-md-2\"\n}\n\nexport function ChangeVote(props) {\n const canVote = props.poll.acl.can_vote\n const canChangeVote =\n !props.poll.hasSelectedChoices || props.poll.allow_revotes\n\n if (!(canVote && canChangeVote)) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Vote\")}\n \n
    \n )\n}\n\nexport class SeeVotes extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const seeVotes =\n this.props.poll.is_public || this.props.poll.acl.can_see_votes\n if (!seeVotes) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"See votes\")}\n \n
    \n )\n }\n}\n\nexport function Edit(props) {\n if (!props.poll.acl.can_edit) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Edit\")}\n \n
    \n )\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n const deletePoll = window.confirm(\n pgettext(\n \"thread poll\",\n \"Are you sure you want to delete this poll? This action is not reversible.\"\n )\n )\n if (!deletePoll) return false\n\n store.dispatch(poll.busy())\n\n ajax\n .delete(this.props.poll.api.index)\n .then(this.handleSuccess, this.handleError)\n }\n\n handleSuccess = (newThreadAcl) => {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been deleted\"))\n store.dispatch(poll.remove())\n store.dispatch(thread.updateAcl(newThreadAcl))\n }\n\n handleError = (rejection) => {\n snackbar.apiError(rejection)\n store.dispatch(poll.release())\n }\n\n render() {\n if (!this.props.poll.acl.can_delete) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Delete\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n
    \n )\n}\n\nexport function PollCreation(props) {\n const message = interpolate(\n escapeHtml(pgettext(\"thread poll\", \"Started by %(poster)s %(posted_on)s.\")),\n {\n poster: getPoster(props.poll),\n posted_on: getPostedOn(props.poll),\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getPoster(poll) {\n if (poll.url.poster) {\n return interpolate(\n USER_URL,\n {\n url: escapeHtml(poll.url.poster),\n user: escapeHtml(poll.poster_name),\n },\n true\n )\n }\n\n return interpolate(\n USER_SPAN,\n {\n user: escapeHtml(poll.poster_name),\n },\n true\n )\n}\n\nexport function getPostedOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.posted_on.format(\"LLL\")),\n relative: escapeHtml(poll.posted_on.fromNow()),\n },\n true\n )\n}\n\nexport function PollLength(props) {\n if (!props.poll.length) {\n return null\n }\n\n const message = interpolate(\n escapeHtml(pgettext(\"thread poll\", \"Voting ends %(ends_on)s.\")),\n {\n ends_on: getEndsOn(props.poll),\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getEndsOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.endsOn.format(\"LLL\")),\n relative: escapeHtml(poll.endsOn.fromNow()),\n },\n true\n )\n}\n\nexport function PollVotes(props) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s vote.\",\n \"%(votes)s votes.\",\n props.votes\n )\n const label = interpolate(\n message,\n {\n votes: props.votes,\n },\n true\n )\n\n return
  • {label}
  • \n}\n\nexport function PollIsPublic(props) {\n if (!props.poll.is_public) {\n return null\n }\n\n return (\n
  • \n {pgettext(\"thread poll\", \"Voting is public.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport Chart from \"./chart\"\nimport Options from \"./options\"\nimport PollInfo from \"../info\"\n\nexport default function (props) {\n return (\n
    \n
    \n

    {props.poll.question}

    \n \n \n \n
    \n
    \n )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n
    \n )\n}\n\nexport function PollChoicesLeft({ choicesLeft }) {\n if (choicesLeft === 0) {\n return (\n
  • \n {pgettext(\"thread poll\", \"You can't select any more choices.\")}\n
  • \n )\n }\n\n const message = npgettext(\n \"thread poll\",\n \"You can select %(choices)s more choice.\",\n \"You can select %(choices)s more choices.\",\n choicesLeft\n )\n\n const label = interpolate(\n message,\n {\n choices: choicesLeft,\n },\n true\n )\n\n return
  • {label}
  • \n}\n\nexport function PollAllowRevote(props) {\n if (props.poll.allow_revotes) {\n return (\n
  • \n {pgettext(\"thread poll\", \"You can change your vote later.\")}\n
  • \n )\n }\n\n return (\n
  • \n {pgettext(\"thread poll\", \"Votes are final.\")}\n
  • \n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
      \n {props.choices.map((choice) => {\n return (\n \n )\n })}\n
    \n )\n}\n\nexport class ChoiceSelect extends React.Component {\n onClick = () => {\n this.props.toggleChoice(this.props.choice.hash)\n }\n\n render() {\n return (\n
  • \n \n \n {this.props.choice.selected\n ? \"check_box\"\n : \"check_box_outline_blank\"}\n \n {this.props.choice.label}\n \n
  • \n )\n }\n}\n","export function getChoiceFromHash(choices, hash) {\n for (const i in choices) {\n const choice = choices[i]\n if (choice.hash === hash) {\n return choice\n }\n }\n\n return null\n}\n\nexport function getChoicesLeft(poll, choices) {\n let selection = []\n for (const i in choices) {\n const choice = choices[i]\n if (choice.selected) {\n selection.push(choice)\n }\n }\n\n return poll.allowed_choices - selection.length\n}\n","import React from \"react\"\nimport ChoicesHelp from \"./help\"\nimport ChoicesSelect from \"./select\"\nimport { getChoicesLeft, getChoiceFromHash } from \"./utils\"\nimport PollInfo from \"../info\"\nimport { Delete, Edit, getClassName } from \"../results/options\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n choices: props.poll.choices,\n choicesLeft: getChoicesLeft(props.poll, props.poll.choices),\n }\n }\n\n toggleChoice = (hash) => {\n const choice = getChoiceFromHash(this.state.choices, hash)\n\n let choices = null\n if (!choice.selected) {\n choices = this.selectChoice(choice, hash)\n } else {\n choices = this.deselectChoice(choice, hash)\n }\n\n this.setState({\n choices,\n choicesLeft: getChoicesLeft(this.props.poll, choices),\n })\n }\n\n selectChoice = (choice, hash) => {\n const choicesLeft = getChoicesLeft(this.props.poll, this.state.choices)\n\n if (!choicesLeft) {\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected && item.hash != hash) {\n item.selected = false\n break\n }\n }\n }\n\n return this.state.choices.map((choice) => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? true : choice.selected,\n })\n })\n }\n\n deselectChoice = (choice, hash) => {\n return this.state.choices.map((choice) => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? false : choice.selected,\n })\n })\n }\n\n clean() {\n if (this.state.choicesLeft === this.props.poll.allowed_choices) {\n snackbar.error(\n pgettext(\"thread poll vote\", \"You need to select at least one choice.\")\n )\n return false\n }\n\n return true\n }\n\n send() {\n let data = []\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected) {\n data.push(item.hash)\n }\n }\n\n return ajax.post(this.props.poll.api.votes, data)\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n snackbar.success(pgettext(\"thread poll vote\", \"Your vote has been saved.\"))\n\n this.props.showResults()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n const controls = []\n\n if (this.props.poll.acl.can_vote) controls.push(0)\n if (this.props.poll.is_public || this.props.poll.acl.can_see_votes)\n controls.push(1)\n if (this.props.poll.acl.can_edit) controls.push(2)\n if (this.props.poll.acl.can_delete) controls.push(3)\n\n return (\n
    \n
    \n
    \n

    {this.props.poll.question}

    \n \n \n \n
    \n
    \n
    \n
    \n \n {pgettext(\"thread poll vote btn\", \"Save your vote\")}\n \n
    \n
    \n \n {pgettext(\"thread poll vote btn\", \"See results\")}\n \n
    \n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Results from \"./results\"\nimport Voting from \"./voting\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n let showResults = true\n if (props.user.id && !props.poll.hasSelectedChoices) {\n showResults = false\n }\n\n this.state = {\n showResults,\n }\n }\n\n showResults = () => {\n this.setState({\n showResults: true,\n })\n }\n\n showVoting = () => {\n this.setState({\n showResults: false,\n })\n }\n\n render() {\n if (!this.props.thread.poll) return null\n\n const isPollOver = getIsPollOver(this.props.poll)\n\n if (\n !isPollOver &&\n this.props.poll.acl.can_vote &&\n !this.state.showResults\n ) {\n return \n } else {\n return (\n \n )\n }\n }\n}\n\nexport function getIsPollOver(poll) {\n if (poll.length) {\n return moment().isAfter(poll.endsOn)\n }\n return false\n}\n","import React from \"react\"\nimport getRandomString from \"../../../utils/getRandomString\"\n\nconst HASH_LENGTH = 12\n\nexport default class extends React.Component {\n onAdd = () => {\n let choices = this.props.choices.slice()\n choices.push({\n hash: getRandomString(HASH_LENGTH),\n label: \"\",\n })\n\n this.props.setChoices(choices)\n }\n\n onChange = (hash, label) => {\n const choices = this.props.choices.map((choice) => {\n if (choice.hash === hash) {\n choice.label = label\n }\n\n return choice\n })\n this.props.setChoices(choices)\n }\n\n onDelete = (hash) => {\n const choices = this.props.choices.filter((choice) => {\n return choice.hash !== hash\n })\n this.props.setChoices(choices)\n }\n\n render() {\n return (\n
    \n
      \n {this.props.choices.map((choice) => {\n return (\n 2}\n choice={choice}\n disabled={this.props.disabled}\n key={choice.hash}\n onChange={this.onChange}\n onDelete={this.onDelete}\n />\n )\n })}\n
    \n \n {pgettext(\"thread poll\", \"Add choice\")}\n \n
    \n )\n }\n}\n\nexport class PollChoice extends React.Component {\n onChange = (event) => {\n this.props.onChange(this.props.choice.hash, event.target.value)\n }\n\n onDelete = () => {\n const deleteItem =\n this.props.choice.label.length === 0\n ? true\n : window.confirm(\n pgettext(\n \"thread poll\",\n \"Are you sure you want to remove this choice?\"\n )\n )\n if (deleteItem) {\n this.props.onDelete(this.props.choice.hash)\n }\n }\n\n render() {\n return (\n
  • \n \n close\n \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ChoicesControl from \"./choices-control\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n const poll = props.poll.id\n ? props.poll\n : {\n question: \"\",\n choices: [\n {\n hash: \"choice-10000\",\n label: \"\",\n },\n {\n hash: \"choice-20000\",\n label: \"\",\n },\n ],\n length: 0,\n allowed_choices: 1,\n allow_revotes: 0,\n is_public: 0,\n }\n\n this.state = {\n isLoading: false,\n isEdit: !!poll.id,\n\n question: poll.question,\n choices: poll.choices,\n length: poll.length,\n allowed_choices: poll.allowed_choices,\n allow_revotes: poll.allow_revotes,\n is_public: poll.is_public,\n\n validators: {\n question: [],\n choices: [],\n length: [],\n allowed_choices: [],\n },\n\n errors: {},\n }\n }\n\n setChoices = (choices) => {\n this.setState((state) => {\n return {\n choices,\n errors: Object.assign({}, state.errors, { choices: null }),\n }\n })\n }\n\n onCancel = () => {\n let cancel = false\n\n // Nothing added to the poll so no changes to discard\n const formEmpty = !!(\n this.state.question === \"\" &&\n this.state.choices &&\n this.state.choices.every((choice) => choice.label === \"\") &&\n this.state.length === 0 &&\n this.state.allowed_choices === 1\n )\n\n if (formEmpty) {\n return this.props.close()\n }\n\n if (!!this.props.poll) {\n cancel = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to discard changes?\")\n )\n } else {\n cancel = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to discard new poll?\")\n )\n }\n\n if (cancel) {\n this.props.close()\n }\n }\n\n send() {\n const data = {\n question: this.state.question,\n choices: this.state.choices,\n length: this.state.length,\n allowed_choices: this.state.allowed_choices,\n allow_revotes: this.state.allow_revotes,\n is_public: this.state.is_public,\n }\n\n if (this.state.isEdit) {\n return ajax.put(this.props.poll.api.index, data)\n }\n\n return ajax.post(this.props.thread.api.poll, data)\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n\n if (this.state.isEdit) {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been edited.\"))\n } else {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been posted.\"))\n }\n\n this.props.close()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.non_field_errors) {\n rejection.allowed_choices = rejection.non_field_errors\n }\n\n this.setState({\n errors: Object.assign({}, rejection),\n })\n\n snackbar.error(gettext(\"Form contains errors.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n

    \n {this.state.isEdit\n ? pgettext(\"thread poll\", \"Edit poll\")\n : pgettext(\"thread poll\", \"Add poll\")}\n

    \n
    \n
    \n
    \n \n {pgettext(\"thread poll\", \"Question and choices\")}\n \n\n \n \n \n\n \n \n \n
    \n\n
    \n {pgettext(\"thread poll\", \"Voting\")}\n\n
    \n
    \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n \n {pgettext(\"thread poll\", \"Cancel\")}\n {\" \"}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function PollPublicSwitch(props) {\n if (props.isEdit) return null\n\n return (\n
    \n \n \n \n
    \n )\n}\n","import React from \"react\"\n\nconst ICON = {\n changed_title: \"edit\",\n\n pinned_globally: \"bookmark\",\n pinned_locally: \"bookmark_border\",\n unpinned: \"panorama_fish_eye\",\n\n moved: \"arrow_forward\",\n merged: \"call_merge\",\n\n approved: \"done\",\n\n opened: \"lock_open\",\n closed: \"lock_outline\",\n\n unhid: \"visibility\",\n hid: \"visibility_off\",\n\n changed_owner: \"grade\",\n tookover: \"grade\",\n\n added_participant: \"person_add\",\n\n owner_left: \"person_outline\",\n participant_left: \"person_outline\",\n removed_participant: \"remove_circle_outline\",\n}\n\nconst EventIcon = (props) => (\n \n {ICON[props.post.event_type]}\n \n)\n\nexport default EventIcon\n","import React from \"react\"\nimport moment from \"moment\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n if (isVisible(props.post.acl)) {\n return (\n
  • \n \n \n \n
  • \n )\n } else {\n return null\n }\n}\n\nexport function isVisible(acl) {\n return acl.can_hide\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: this.props.user.username,\n url: Object.assign(this.props.post.url, {\n hidden_by: this.props.user.url,\n }),\n })\n )\n\n const op = { op: \"replace\", path: \"is-hidden\", value: true }\n\n ajax.patch(this.props.post.api.index, [op]).then(\n (patch) => {\n store.dispatch(post.patch(this.props.post, patch))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: false,\n })\n )\n }\n )\n }\n\n render() {\n if (!this.props.post.is_hidden) {\n return (\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: false,\n })\n )\n\n const op = { op: \"replace\", path: \"is-hidden\", value: false }\n\n ajax.patch(this.props.post.api.index, [op]).then(\n (patch) => {\n store.dispatch(post.patch(this.props.post, patch))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: true,\n })\n )\n }\n )\n }\n\n render() {\n if (this.props.post.is_hidden) {\n return (\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n const decision = window.confirm(\n pgettext(\n \"event delete\",\n \"Are you sure you wish to delete this event? This action is not reversible!\"\n )\n )\n if (decision) {\n this.delete()\n }\n }\n\n delete = () => {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n ajax.delete(this.props.post.api.index).then(\n () => {\n snackbar.success(pgettext(\"event delete\", \"Event has been deleted.\"))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: false,\n })\n )\n }\n )\n }\n\n render() {\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport Controls from \"./controls\"\n\nconst DATE_ABBR = '%(relative)s'\nconst DATE_URL = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n \n
    \n )\n}\n\nexport function Hidden(props) {\n if (props.post.is_hidden) {\n let user = null\n if (props.post.url.hidden_by) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.post.url.hidden_by),\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n relative: escapeHtml(props.post.hidden_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\"event info\", \"Hidden by %(event_by)s %(event_on)s.\")\n ),\n {\n event_by: user,\n event_on: date,\n },\n true\n )\n\n return (\n \n )\n } else {\n return null\n }\n}\n\nexport function Poster(props) {\n let user = null\n if (props.post.poster) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.post.poster.url),\n user: escapeHtml(props.post.poster_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.post.poster_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_URL,\n {\n url: escapeHtml(props.post.url.index),\n absolute: escapeHtml(props.post.posted_on.format(\"LLL\")),\n relative: escapeHtml(props.post.posted_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(pgettext(\"event info\", \"By %(event_by)s %(event_on)s.\")),\n {\n event_by: user,\n event_on: date,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst MESSAGE = {\n pinned_globally: pgettext(\n \"event message\",\n \"Thread has been pinned globally.\"\n ),\n pinned_locally: pgettext(\n \"event message\",\n \"Thread has been pinned in category.\"\n ),\n unpinned: pgettext(\"event message\", \"Thread has been unpinned.\"),\n\n approved: pgettext(\"event message\", \"Thread has been approved.\"),\n\n opened: pgettext(\"event message\", \"Thread has been opened.\"),\n closed: pgettext(\"event message\", \"Thread has been closed.\"),\n\n unhid: pgettext(\"event message\", \"Thread has been revealed.\"),\n hid: pgettext(\"event message\", \"Thread has been made hidden.\"),\n\n tookover: pgettext(\"event message\", \"Took thread over.\"),\n\n owner_left: pgettext(\n \"event message\",\n \"Owner has left thread. This thread is now closed.\"\n ),\n participant_left: pgettext(\"event message\", \"Participant has left thread.\"),\n}\n\nconst ITEM_LINK = '%(name)s'\nconst ITEM_SPAN = '%(name)s'\n\nexport default function (props) {\n if (MESSAGE[props.post.event_type]) {\n return

    {MESSAGE[props.post.event_type]}

    \n } else if (props.post.event_type === \"changed_title\") {\n return \n } else if (props.post.event_type === \"moved\") {\n return \n } else if (props.post.event_type === \"merged\") {\n return \n } else if (props.post.event_type === \"changed_owner\") {\n return \n } else if (props.post.event_type === \"added_participant\") {\n return \n } else if (props.post.event_type === \"removed_participant\") {\n return \n } else {\n return null\n }\n}\n\nexport function ChangedTitle(props) {\n const msgstring = escapeHtml(\n pgettext(\n \"event message\",\n \"Thread title has been changed from %(old_title)s.\"\n )\n )\n const oldTitle = interpolate(\n ITEM_SPAN,\n {\n name: escapeHtml(props.post.event_context.old_title),\n },\n true\n )\n const message = interpolate(\n msgstring,\n {\n old_title: oldTitle,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function Moved(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Thread has been moved from %(from_category)s.\")\n )\n const fromCategory = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.from_category.url),\n name: escapeHtml(props.post.event_context.from_category.name),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n from_category: fromCategory,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function Merged(props) {\n const msgstring = escapeHtml(\n pgettext(\n \"event message\",\n \"The %(merged_thread)s thread has been merged into this thread.\"\n )\n )\n const mergedThread = interpolate(\n ITEM_SPAN,\n {\n name: escapeHtml(props.post.event_context.merged_thread),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n merged_thread: mergedThread,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function ChangedOwner(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Changed thread owner to %(user)s.\")\n )\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function AddedParticipant(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Added %(user)s to thread.\")\n )\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function RemovedParticipant(props) {\n const msgstring = escapeHtml(\n pgettext(\"event message\", \"Removed %(user)s from thread.\")\n )\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n if (post.is_read) return null\n\n return (\n
    \n \n {pgettext(\"event unread label\", \"New event\")}\n \n
    \n )\n}\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.initialized = false\n this.primed = false\n this.observer = null\n }\n\n initialize = (element) => {\n this.initialized = true\n\n this.observer = new IntersectionObserver((entries) =>\n entries.forEach(this.callback)\n )\n this.observer.observe(element)\n }\n\n callback = (entry) => {\n if (!entry.isIntersecting || this.props.post.is_read || this.primed) {\n return\n }\n\n window.setTimeout(() => {\n ajax.post(this.props.post.api.read)\n }, 0)\n\n this.primed = true\n this.destroy()\n }\n\n destroy() {\n if (this.observer) {\n this.observer.disconnect()\n this.observer = null\n }\n }\n\n componentWillUnmount() {\n this.destroy()\n }\n\n render() {\n const ready = !this.initialized && !this.primed && !this.props.post.is_read\n\n return (\n {\n if (node && ready) {\n this.initialize(node)\n }\n }}\n >\n {this.props.children}\n \n )\n }\n}\n","import React from \"react\"\nimport Icon from \"./icon\"\nimport Info from \"./info\"\nimport Message from \"./message\"\nimport UnreadLabel from \"./unread-label\"\nimport Waypoint from \"../waypoint\"\n\nexport default function (props) {\n let className = \"event\"\n if (props.post.isDeleted) {\n className = \"hide\"\n } else if (props.post.is_hidden) {\n className = \"event post-hidden\"\n }\n\n return (\n
  • \n \n
    \n
    \n \n
    \n \n \n \n \n
    \n
  • \n )\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport formatFilesize from \"misago/utils/file-size\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
    \n \n
    \n \n {props.attachment.filename}\n \n \n
    \n
    \n )\n}\n\nexport function AttachmentPreview(props) {\n if (props.attachment.is_image) {\n return (\n
    \n \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n}\n\nexport function AttachmentIcon(props) {\n return (\n \n insert_drive_file\n \n )\n}\n\nexport function AttachmentThumbnail(props) {\n const url = props.attachment.url.thumb || props.attachment.url.index\n return (\n \n )\n}\n\nexport function AttachmentDetails(props) {\n let user = null\n if (props.attachment.url.uploader) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.attachment.url.uploader),\n user: escapeHtml(props.attachment.uploader_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.attachment.uploader_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.attachment.uploaded_on.format(\"LLL\")),\n relative: escapeHtml(props.attachment.uploaded_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\n \"post attachment\",\n \"%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.\"\n )\n ),\n {\n filetype: props.attachment.filetype,\n size: formatFilesize(props.attachment.size),\n uploader: user,\n uploaded_on: date,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\nimport batch from \"misago/utils/batch\"\nimport Attachment from \"./attachment\"\n\nexport default function (props) {\n if (!isVisible(props.post)) {\n return null\n }\n\n return (\n
    \n {batch(props.post.attachments, 2).map((row) => {\n const key = row\n .map((a) => {\n return a ? a.id : 0\n })\n .join(\"_\")\n return \n })}\n
    \n )\n}\n\nexport function isVisible(post) {\n return (!post.is_hidden || post.acl.can_see_hidden) && post.attachments\n}\n\nexport function Row(props) {\n return (\n
    \n {props.row.map((attachment) => {\n return (\n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Waypoint from \"../waypoint\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst HIDDEN_BY_URL = '%(user)s'\nconst HIDDEN_BY_SPAN = '%(user)s'\nconst HIDDEN_ON =\n '%(relative)s'\n\nexport default function (props) {\n if (props.post.is_hidden && !props.post.acl.can_see_hidden) {\n return \n } else if (props.post.content) {\n return \n } else {\n return \n }\n}\n\nexport function Default({ post }) {\n const poster = \"@\" + (post.poster ? post.poster.username : post.poster_name)\n\n return (\n \n \n \n )\n}\n\nexport function Hidden(props) {\n let user = null\n if (props.post.hidden_by) {\n user = interpolate(\n HIDDEN_BY_URL,\n {\n url: escapeHtml(props.post.url.hidden_by),\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n } else {\n user = interpolate(\n HIDDEN_BY_SPAN,\n {\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n }\n\n const date = interpolate(\n HIDDEN_ON,\n {\n absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n relative: escapeHtml(props.post.hidden_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\"post body hidden\", \"Hidden by %(hidden_by)s %(hidden_on)s.\")\n ),\n {\n hidden_by: user,\n hidden_on: date,\n },\n true\n )\n\n return (\n \n

    \n {pgettext(\n \"post body hidden\",\n \"This post is hidden. You cannot see its contents.\"\n )}\n

    \n

    \n \n )\n}\n\nexport function Invalid(props) {\n return (\n \n

    \n {pgettext(\n \"post body invalid\",\n \"This post's contents cannot be displayed.\"\n )}\n

    \n

    \n {pgettext(\n \"post body invalid\",\n \"This error is caused by invalid post content manipulation.\"\n )}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport function FlagBestAnswer({ post, thread, user }) {\n if (!(isVisible(post) && post.id === thread.best_answer)) {\n return null\n }\n\n let message = null\n if (user.id && thread.best_answer_marked_by === user.id) {\n message = interpolate(\n pgettext(\n \"post best answer flag\",\n \"Marked as best answer by you %(marked_on)s.\"\n ),\n {\n marked_on: thread.best_answer_marked_on.fromNow(),\n },\n true\n )\n } else {\n message = interpolate(\n pgettext(\n \"post best answer flag\",\n \"Marked as best answer by %(marked_by)s %(marked_on)s.\"\n ),\n {\n marked_by: thread.best_answer_marked_by_name,\n marked_on: thread.best_answer_marked_on.fromNow(),\n },\n true\n )\n }\n\n return (\n
    \n check_box\n

    {message}

    \n
    \n )\n}\n\nexport function FlagHidden(props) {\n if (!(isVisible(props.post) && props.post.is_hidden)) {\n return null\n }\n\n return (\n
    \n visibility_off\n

    \n {pgettext(\n \"post hidden flag\",\n \"This post is hidden. Only users with permission may see its contents.\"\n )}\n

    \n
    \n )\n}\n\nexport function FlagUnapproved(props) {\n if (!(isVisible(props.post) && props.post.is_unapproved)) {\n return null\n }\n\n return (\n
    \n remove_circle_outline\n

    \n {pgettext(\n \"post unapproved flag\",\n \"This post is unapproved. Only users with permission to approve posts and its author may see its contents.\"\n )}\n

    \n
    \n )\n}\n\nexport function FlagProtected(props) {\n if (!(isVisible(props.post) && props.post.is_protected)) {\n return null\n }\n\n return (\n
    \n lock_outline\n

    \n {pgettext(\n \"post protected flag\",\n \"This post is protected. Only moderators may change it.\"\n )}\n

    \n
    \n )\n}\n\nexport function isVisible(post) {\n return !post.is_hidden || post.acl.can_see_hidden\n}\n","import moment from \"moment\"\nimport * as thread from \"misago/reducers/thread\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function approve(props) {\n store.dispatch(\n post.patch(props.post, {\n is_unapproved: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-unapproved\", value: false }]\n\n const previousState = {\n is_unapproved: props.post.is_unapproved,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function protect(props) {\n store.dispatch(\n post.patch(props.post, {\n is_protected: true,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: true }]\n\n const previousState = {\n is_protected: props.post.is_protected,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unprotect(props) {\n store.dispatch(\n post.patch(props.post, {\n is_protected: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: false }]\n\n const previousState = {\n is_protected: props.post.is_protected,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function hide(props) {\n store.dispatch(\n post.patch(props.post, {\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(props.post.url, {\n hidden_by: props.user.url,\n }),\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: true }]\n\n const previousState = {\n is_hidden: props.post.is_hidden,\n hidden_on: props.post.hidden_on,\n hidden_by_name: props.post.hidden_by_name,\n url: props.post.url,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unhide(props) {\n store.dispatch(\n post.patch(props.post, {\n is_hidden: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: false }]\n\n const previousState = {\n is_hidden: props.post.is_hidden,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function like(props) {\n const lastLikes = props.post.last_likes || []\n const concatedLikes = [props.user].concat(lastLikes)\n const finalLikes =\n concatedLikes.length > 3 ? concatedLikes.slice(0, -1) : concatedLikes\n\n store.dispatch(\n post.patch(props.post, {\n is_liked: true,\n likes: props.post.likes + 1,\n last_likes: finalLikes,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-liked\", value: true }]\n\n const previousState = {\n is_liked: props.post.is_liked,\n likes: props.post.likes,\n last_likes: props.post.last_likes,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unlike(props) {\n store.dispatch(\n post.patch(props.post, {\n is_liked: false,\n likes: props.post.likes - 1,\n last_likes: props.post.last_likes.filter((user) => {\n return !user.id || user.id !== props.user.id\n }),\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-liked\", value: false }]\n\n const previousState = {\n is_liked: props.post.is_liked,\n likes: props.post.likes,\n last_likes: props.post.last_likes,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function patch(props, ops, previousState) {\n ajax.patch(props.post.api.index, ops).then(\n (newState) => {\n store.dispatch(post.patch(props.post, newState))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(post.patch(props.post, previousState))\n }\n )\n}\n\nexport function remove(props) {\n let confirmed = window.confirm(\n pgettext(\n \"post delete\",\n \"Are you sure you want to delete this post? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n store.dispatch(\n post.patch(props.post, {\n isDeleted: true,\n })\n )\n\n ajax.delete(props.post.api.index).then(\n () => {\n snackbar.success(pgettext(\"post delete\", \"Post has been deleted.\"))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(props.post, {\n isDeleted: false,\n })\n )\n }\n )\n}\n\nexport function markAsBestAnswer(props) {\n const { post, user } = props\n\n store.dispatch(\n thread.update({\n best_answer: post.id,\n best_answer_is_protected: post.is_protected,\n best_answer_marked_on: moment(),\n best_answer_marked_by: user.id,\n best_answer_marked_by_name: user.username,\n best_answer_marked_by_slug: user.slug,\n })\n )\n\n const ops = [\n { op: \"replace\", path: \"best-answer\", value: post.id },\n { op: \"add\", path: \"acl\", value: true },\n ]\n\n const previousState = {\n best_answer: props.thread.best_answer,\n best_answer_is_protected: props.thread.best_answer_is_protected,\n best_answer_marked_on: props.thread.best_answer_marked_on,\n best_answer_marked_by: props.thread.best_answer_marked_by,\n best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n }\n\n patchThread(props, ops, previousState)\n}\n\nexport function unmarkBestAnswer(props) {\n const { post } = props\n\n store.dispatch(\n thread.update({\n best_answer: null,\n best_answer_is_protected: false,\n best_answer_marked_on: null,\n best_answer_marked_by: null,\n best_answer_marked_by_name: null,\n best_answer_marked_by_slug: null,\n })\n )\n\n const ops = [\n { op: \"remove\", path: \"best-answer\", value: post.id },\n { op: \"add\", path: \"acl\", value: true },\n ]\n\n const previousState = {\n best_answer: props.thread.best_answer,\n best_answer_is_protected: props.thread.best_answer_is_protected,\n best_answer_marked_on: props.thread.best_answer_marked_on,\n best_answer_marked_by: props.thread.best_answer_marked_by,\n best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n }\n\n patchThread(props, ops, previousState)\n}\n\nexport function patchThread(props, ops, previousState) {\n ajax.patch(props.thread.api.index, ops).then(\n (newState) => {\n if (newState.best_answer_marked_on) {\n newState.best_answer_marked_on = moment(newState.best_answer_marked_on)\n }\n store.dispatch(thread.update(newState))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(thread.update(previousState))\n }\n )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Avatar from \"misago/components/avatar\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n\n error: null,\n likes: [],\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.post.api.likes).then(\n (data) => {\n this.setState({\n isReady: true,\n likes: data.map(hydrateLike),\n })\n },\n (rejection) => {\n this.setState({\n isReady: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.error) {\n return (\n \n \n \n )\n } else if (this.state.isReady) {\n if (this.state.likes.length) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n}\n\nexport function hydrateLike(data) {\n return Object.assign({}, data, {\n liked_on: moment(data.liked_on),\n })\n}\n\nexport function ModalDialog({ className, children, likes }) {\n let title = pgettext(\"post likes modal title\", \"Post Likes\")\n if (likes) {\n const likesCount = likes.length\n const message = npgettext(\n \"post likes modal\",\n \"%(likes)s like\",\n \"%(likes)s likes\",\n likesCount\n )\n\n title = interpolate(message, { likes: likesCount }, true)\n }\n\n return (\n
    \n
    \n
    \n \n ×\n \n

    {title}

    \n
    \n {children}\n
    \n
    \n )\n}\n\nexport function LikesList(props) {\n return (\n
    \n
      \n {props.likes.map((like) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function LikeDetails(props) {\n if (props.url) {\n const user = {\n id: props.liker_id,\n avatars: props.avatars,\n }\n\n return (\n
  • \n
    \n \n \n \n
    \n
    \n \n {props.username}\n {\" \"}\n \n
    \n
  • \n )\n }\n\n return (\n
  • \n
    \n \n \n \n
    \n
    \n {props.username} \n
    \n
  • \n )\n}\n\nexport function LikeDate(props) {\n return (\n \n {props.likedOn.fromNow()}\n \n )\n}\n","import React from \"react\"\nimport * as actions from \"./controls/actions\"\nimport LikesModal from \"misago/components/post-likes\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\n\nexport default function (props) {\n if (!isVisible(props.post)) return null\n\n return (\n
    \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport function isVisible(post) {\n return (\n (!post.is_hidden || post.acl.can_see_hidden) &&\n (post.acl.can_reply ||\n post.acl.can_edit ||\n (post.acl.can_see_likes && (post.last_likes || []).length) ||\n post.acl.can_like)\n )\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n onClick = () => {\n actions.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n \n check_box\n {pgettext(\"post footer btn\", \"Best answer\")}\n \n )\n }\n}\n\nexport class MarkAsBestAnswerCompact extends React.Component {\n onClick = () => {\n actions.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n \n check_box\n \n )\n }\n}\n\nexport class Like extends React.Component {\n onClick = () => {\n if (this.props.post.is_liked) {\n actions.unlike(this.props)\n } else {\n actions.like(this.props)\n }\n }\n\n render() {\n if (!this.props.post.acl.can_like) return null\n\n let className = \"btn btn-default btn-sm pull-left\"\n if (this.props.post.is_liked) {\n className = \"btn btn-success btn-sm pull-left\"\n }\n\n return (\n \n {this.props.post.is_liked\n ? pgettext(\"post footer btn\", \"Liked\")\n : pgettext(\"post footer btn\", \"Like\")}\n \n )\n }\n}\n\nexport class Likes extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const hasLikes = (this.props.post.last_likes || []).length > 0\n if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n if (this.props.post.acl.can_see_likes === 2) {\n return (\n \n {getLikesMessage(this.props.likes, this.props.lastLikes)}\n \n )\n }\n\n return (\n

    \n {getLikesMessage(this.props.likes, this.props.lastLikes)}\n

    \n )\n }\n}\n\nexport class LikesCompact extends Likes {\n render() {\n const hasLikes = (this.props.post.last_likes || []).length > 0\n if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n if (this.props.post.acl.can_see_likes === 2) {\n return (\n \n favorite\n {this.props.likes}\n \n )\n }\n\n return (\n

    \n favorite\n {this.props.likes}\n

    \n )\n }\n}\n\nexport function getLikesMessage(likes, users) {\n const usernames = users.slice(0, 3).map((u) => u.username)\n\n if (usernames.length == 1) {\n return interpolate(\n pgettext(\"post likes\", \"%(user)s likes this.\"),\n {\n user: usernames[0],\n },\n true\n )\n }\n\n const hiddenLikes = likes - usernames.length\n\n const otherUsers = usernames.slice(0, -1).join(\", \")\n const lastUser = usernames.slice(-1)[0]\n\n const usernamesList = interpolate(\n pgettext(\"post likes\", \"%(users)s and %(last_user)s\"),\n {\n users: otherUsers,\n last_user: lastUser,\n },\n true\n )\n\n if (hiddenLikes === 0) {\n return interpolate(\n pgettext(\"post likes\", \"%(users)s like this.\"),\n {\n users: usernamesList,\n },\n true\n )\n }\n\n const message = npgettext(\n \"post likes\",\n \"%(users)s and %(likes)s other user like this.\",\n \"%(users)s and %(likes)s other users like this.\",\n hiddenLikes\n )\n\n return interpolate(\n message,\n {\n users: usernames.join(\", \"),\n likes: hiddenLikes,\n },\n true\n )\n}\n\nexport class Reply extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"REPLY\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n })\n }\n\n render() {\n if (this.props.post.acl.can_reply) {\n return (\n \n {pgettext(\"post footer btn\", \"Reply\")}\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Quote extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"QUOTE\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n\n context: {\n reply: this.props.post.id,\n },\n })\n }\n\n render() {\n if (this.props.post.acl.can_reply) {\n return (\n \n {pgettext(\"post footer btn\", \"Quote\")}\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Edit extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"EDIT\",\n\n thread: this.props.thread,\n post: this.props.post,\n config: this.props.post.api.editor,\n submit: this.props.post.api.index,\n })\n }\n\n render() {\n if (this.props.post.acl.can_edit) {\n return (\n \n {pgettext(\"post footer btn\", \"Edit\")}\n \n )\n } else {\n return null\n }\n }\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(\n pgettext(\n \"post move modal\",\n \"You have to enter link to the other thread.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.move, {\n new_thread: this.state.url,\n posts: [this.props.post.id],\n })\n }\n\n handleSuccess(success) {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n modal.hide()\n\n snackbar.success(\n pgettext(\n \"post move modal\",\n \"Selected post was moved to the other thread.\"\n )\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"post move modal btn\", \"Move post\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"post move modal title\", \"Move post\")}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n
      \n {props.diff.map((item, i) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function DiffItem(props) {\n if (props.item[0] === \"?\") return null\n\n return (\n
  • {cleanItem(props.item)}
  • \n )\n}\n\nexport function getItemClassName(item) {\n let className = \"diff-item\"\n if (item[0] === \"-\") {\n className += \" diff-item-sub\"\n } else if (item[0] === \"+\") {\n className += \" diff-item-add\"\n }\n return className\n}\n\nexport function cleanItem(item) {\n return item.substr(2)\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\n\nexport default class extends React.Component {\n onClick = () => {\n this.props.revertEdit(this.props.edit.id)\n }\n\n render() {\n if (!this.props.canRevert) return null\n\n return (\n
    \n \n {pgettext(\"post revert btn\", \"Revert\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default class extends React.Component {\n goLast = () => {\n this.props.goToEdit()\n }\n\n goForward = () => {\n this.props.goToEdit(this.props.edit.next)\n }\n\n goBack = () => {\n this.props.goToEdit(this.props.edit.previous)\n }\n\n revertEdit = () => {\n this.props.revertEdit(this.props.edit.id)\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n )\n }\n}\n\nexport function GoBackBtn(props) {\n return (\n \n chevron_left\n \n )\n}\n\nexport function GoForwardBtn(props) {\n return (\n \n chevron_right\n \n )\n}\n\nexport function GoLastBtn(props) {\n return (\n \n last_page\n \n )\n}\n\nexport function RevertBtn(props) {\n if (!props.canRevert) return null\n\n return (\n
    \n \n {pgettext(\"post revert btn\", \"Revert\")}\n \n
    \n )\n}\n\nexport function Label(props) {\n let user = null\n if (props.edit.url.editor) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.edit.url.editor),\n user: escapeHtml(props.edit.editor_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.edit.editor_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.edit.edited_on.format(\"LLL\")),\n relative: escapeHtml(props.edit.edited_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n pgettext(\"post history modal\", \"By %(edited_by)s %(edited_on)s.\")\n ),\n {\n edited_by: user,\n edited_on: date,\n },\n true\n )\n\n return

    \n}\n","import moment from \"moment\"\n\nexport function hydrateEdit(json) {\n return Object.assign({}, json, {\n edited_on: moment(json.edited_on),\n })\n}\n","import React from \"react\"\nimport Diff from \"./diff\"\nimport Footer from \"./footer\"\nimport Toolbar from \"./toolbar\"\nimport { hydrateEdit } from \"./utils\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isBusy: true,\n\n canRevert: props.post.acl.can_edit,\n\n error: null,\n edit: null,\n }\n }\n\n componentDidMount() {\n this.goToEdit()\n }\n\n goToEdit = (edit = null) => {\n this.setState({\n isBusy: true,\n })\n\n let url = this.props.post.api.edits\n if (edit !== null) {\n url += \"?edit=\" + edit\n }\n\n ajax.get(url).then(\n (data) => {\n this.setState({\n isReady: true,\n isBusy: false,\n edit: hydrateEdit(data),\n })\n },\n (rejection) => {\n this.setState({\n isReady: true,\n isBusy: false,\n error: rejection.detail,\n })\n }\n )\n }\n\n revertEdit = (edit) => {\n if (this.state.isBusy) return\n\n const confirmation = window.confirm(\n pgettext(\n \"post revert\",\n \"Are you sure you with to revert this post to the state from before this edit?\"\n )\n )\n if (!confirmation) return\n\n this.setState({\n isBusy: true,\n })\n\n const url = this.props.post.api.edits + \"?edit=\" + edit\n ajax.post(url).then(\n (data) => {\n const hydratedPost = post.hydrate(data)\n store.dispatch(post.patch(data, hydratedPost))\n\n snackbar.success(\n pgettext(\"post revert\", \"Post has been reverted to previous state.\")\n )\n modal.hide()\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n this.setState({\n isBusy: false,\n })\n }\n )\n }\n\n render() {\n if (this.state.error) {\n return (\n \n \n \n )\n } else if (this.state.isReady) {\n return (\n \n \n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n}\n\nexport function ModalDialog(props) {\n return (\n

    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"post history modal title\", \"Post edits history\")}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport Select from \"misago/components/select\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default function (props) {\n return \n}\n\nexport class PostingConfig extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isError: false,\n\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n post: item.post,\n })\n })\n\n this.setState({\n isLoaded: true,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.isError) {\n return \n } else if (this.state.isLoaded) {\n return (\n \n )\n } else {\n return \n }\n }\n}\n\nexport class ModerationForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n title: \"\",\n category: null,\n categories: props.categories,\n weight: 0,\n is_hidden: 0,\n is_closed: false,\n\n validators: {\n title: [validators.required()],\n },\n\n errors: {},\n }\n\n this.isHiddenChoices = [\n {\n value: 0,\n icon: \"visibility\",\n label: pgettext(\"thread hidden switch choice\", \"No\"),\n },\n {\n value: 1,\n icon: \"visibility_off\",\n label: pgettext(\"thread hidden switch choice\", \"Yes\"),\n },\n ]\n\n this.isClosedChoices = [\n {\n value: false,\n icon: \"lock_outline\",\n label: pgettext(\"thread closed switch choice\", \"No\"),\n },\n {\n value: true,\n icon: \"lock\",\n label: pgettext(\"thread closed switch choice\", \"Yes\"),\n },\n ]\n\n this.acl = {}\n this.props.categories.forEach((category) => {\n if (category.post) {\n if (!this.state.category) {\n this.state.category = category.id\n }\n\n this.acl[category.id] = {\n can_pin_threads: category.post.pin,\n can_close_threads: category.post.close,\n can_hide_threads: category.post.hide,\n }\n }\n })\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.split, {\n title: this.state.title,\n category: this.state.category,\n weight: this.state.weight,\n is_hidden: this.state.is_hidden,\n is_closed: this.state.is_closed,\n posts: [this.props.post.id],\n })\n }\n\n handleSuccess(apiResponse) {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n modal.hide()\n\n snackbar.success(\n pgettext(\"post split modal\", \"Selected post was split into new thread.\")\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n snackbar.error(gettext(\"Form contains errors.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (ev) => {\n const categoryId = ev.target.value\n const newState = {\n category: categoryId,\n }\n\n if (this.acl[categoryId].can_pin_threads < newState.weight) {\n newState.weight = 0\n }\n\n if (!this.acl[categoryId].can_hide_threads) {\n newState.is_hidden = 0\n }\n\n if (!this.acl[categoryId].can_close_threads) {\n newState.is_closed = false\n }\n\n this.setState(newState)\n }\n\n getWeightChoices() {\n const choices = [\n {\n value: 0,\n icon: \"remove\",\n label: pgettext(\"thread weight choice\", \"Not pinned\"),\n },\n {\n value: 1,\n icon: \"bookmark_border\",\n label: pgettext(\"thread weight choice\", \"Pinned in category\"),\n },\n ]\n\n if (this.acl[this.state.category].can_pin_threads == 2) {\n choices.push({\n value: 2,\n icon: \"bookmark\",\n label: pgettext(\"thread weight choice\", \"Pinned globally\"),\n })\n }\n\n return choices\n }\n\n renderWeightField() {\n if (this.acl[this.state.category].can_pin_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderHiddenField() {\n if (this.acl[this.state.category].can_hide_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderClosedField() {\n if (this.acl[this.state.category].can_close_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n \n \n
    \n\n \n \n \n
    \n\n {this.renderWeightField()}\n {this.renderHiddenField()}\n {this.renderClosedField()}\n
    \n
    \n \n
    \n \n \n )\n }\n}\n\nexport function Loader() {\n return (\n \n \n \n )\n}\n\nexport function Error(props) {\n return (\n \n
    \n info_outline\n
    \n
    \n

    \n {pgettext(\n \"post split modal\",\n \"You can't move this post at the moment.\"\n )}\n

    \n

    {props.message}

    \n
    \n
    \n )\n}\n\nexport function Modal(props) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"posts split modal title\", \"Split post into new thread\")}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport * as moderation from \"./actions\"\nimport MoveModal from \"./move\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport SplitModal from \"./split\"\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport class Permalink extends React.Component {\n onClick = () => {\n let permaUrl = window.location.protocol + \"//\"\n permaUrl += window.location.host\n permaUrl += this.props.post.url.index\n\n prompt(pgettext(\"post permalink\", \"Permament link to this post:\"), permaUrl)\n }\n\n render() {\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Edit extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"EDIT\",\n\n thread: this.props.thread,\n post: this.props.post,\n config: this.props.post.api.editor,\n submit: this.props.post.api.index,\n })\n }\n\n render() {\n if (!this.props.post.acl.can_edit) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n onClick = () => {\n moderation.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (post.id === thread.best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class UnmarkMarkBestAnswer extends React.Component {\n onClick = () => {\n moderation.unmarkBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id !== thread.best_answer) return null\n if (!thread.acl.can_unmark_best_answer) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class PostEdits extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isHidden =\n this.props.post.is_hidden && !this.props.post.acl.can_see_hidden\n const isUnedited = this.props.post.edits === 0\n if (isHidden || isUnedited) return null\n\n const message = npgettext(\n \"post edits\",\n \"This post was edited %(edits)s time.\",\n \"This post was edited %(edits)s times.\",\n this.props.post.edits\n )\n\n const title = interpolate(\n message,\n {\n edits: this.props.post.edits,\n },\n true\n )\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Approve extends React.Component {\n onClick = () => {\n moderation.approve(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_approve) return null\n if (!this.props.post.is_unapproved) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Move extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.post.acl.can_move) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Split extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.post.acl.can_move) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Protect extends React.Component {\n onClick = () => {\n moderation.protect(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_protect) return null\n if (this.props.post.is_protected) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unprotect extends React.Component {\n onClick = () => {\n moderation.unprotect(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_protect) return null\n if (!this.props.post.is_protected) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n moderation.hide(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id === thread.best_answer) return null\n if (!post.acl.can_hide) return null\n if (post.is_hidden) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n moderation.unhide(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_unhide) return null\n if (!this.props.post.is_hidden) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n moderation.remove(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id === thread.best_answer) return null\n if (!post.acl.can_delete) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport Dropdown from \"./dropdown\"\n\nexport default function (props) {\n return (\n
    \n \n expand_more\n \n \n
    \n )\n}\n","import React from \"react\"\nimport * as posts from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n onClick = () => {\n if (this.props.post.isSelected) {\n store.dispatch(posts.deselect(this.props.post))\n } else {\n store.dispatch(posts.select(this.props.post))\n }\n }\n\n render() {\n if (\n !(this.props.thread.acl.can_merge_posts || isVisible(this.props.post.acl))\n ) {\n return null\n }\n\n return (\n
    \n \n \n {this.props.post.isSelected\n ? \"check_box\"\n : \"check_box_outline_blank\"}\n \n \n
    \n )\n }\n}\n\nexport function isVisible(acl) {\n return (\n acl.can_approve ||\n acl.can_hide ||\n acl.can_protect ||\n acl.can_unhide ||\n acl.can_delete ||\n acl.can_move\n )\n}\n","import React from \"react\"\nimport Controls from \"./controls\"\nimport Select from \"./select\"\nimport {\n StatusIcon,\n getStatusClassName,\n getStatusDescription,\n} from \"misago/components/user-status\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport modal from \"misago/services/modal\"\n\nexport default function (props) {\n return (\n
    \n \n \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n {post.poster_name}\n\n \n {pgettext(\"post removed poster username\", \"Removed user\")}\n \n
    \n
    \n
    \n )\n}\n","export default function ({ title, rank }) {\n return rank.is_tab || !!title || !!rank.title\n}\n","import React from \"react\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n const message = npgettext(\n \"poster stats\",\n \"%(posts)s post\",\n \"%(posts)s posts\",\n poster.posts\n )\n\n let className = \"user-postcount\"\n if (hasVisibleTitle(poster)) {\n className += \" hidden-xs hidden-sm\"\n }\n\n return (\n \n {interpolate(\n message,\n {\n posts: poster.posts,\n },\n true\n )}\n \n )\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n let className = \"hidden-xs\"\n if (hasVisibleTitle(poster)) {\n className += \" hidden-sm\"\n }\n\n return (\n \n \n \n \n \n )\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title\n if (!userTitle && rank.is_tab) {\n userTitle = rank.name\n }\n\n if (!userTitle) return null\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n )\n }\n\n return
    {userTitle}
    \n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Controls from \"misago/components/posts-list/post/controls\"\nimport Select from \"misago/components/posts-list/post/select\"\nimport UserStatus, { StatusIcon } from \"misago/components/user-status\"\nimport UserPostcount from \"./user-postcount\"\nimport UserStatusLabel from \"./user-status\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ post, thread }) {\n const { poster } = post\n\n return (\n
    \n \n \n )\n}\n\nexport function PollSelect({ choices, onChange, value }) {\n if (!choices) return null\n\n return (\n \n \n {choices.map((choice) => {\n return (\n \n )\n })}\n \n \n )\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport MergeConflict from \"misago/components/merge-conflict\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(\n pgettext(\n \"thread merge form\",\n \"You have to enter link to the other thread.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n // freeze thread\n store.dispatch(thread.busy())\n\n return ajax.post(this.props.thread.api.merge, {\n other_thread: this.state.url,\n })\n }\n\n handleSuccess = (success) => {\n this.handleSuccessUnmounted(success)\n\n // keep form loading\n this.setState({\n isLoading: true,\n })\n }\n\n handleSuccessUnmounted = (success) => {\n snackbar.success(\n pgettext(\"thread merge form\", \"Thread has been merged with other one.\")\n )\n window.location = success.url\n }\n\n handleError = (rejection) => {\n store.dispatch(thread.release())\n\n if (rejection.status === 400) {\n if (rejection.best_answers || rejection.polls) {\n modal.show(\n \n )\n } else if (rejection.best_answer) {\n snackbar.error(rejection.best_answer[0])\n } else if (rejection.poll) {\n snackbar.error(rejection.poll[0])\n } else {\n snackbar.error(rejection.detail)\n }\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"thread merge form btn\", \"Cancel\")}\n \n \n {pgettext(\"thread merge form btn\", \"Merge thread\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"thread merge form title\", \"Merge thread\")}\n

    \n
    \n )\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport * as posts from \"misago/reducers/posts\"\nimport * as thread from \"misago/reducers/thread\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n isError: false,\n\n category: null,\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n let category = null\n\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n // pick first category that allows posting and if it may, override it with initial one\n if (item.post !== false && !category) {\n category = item.id\n }\n\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n })\n })\n\n this.setState({\n isReady: true,\n\n category,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n send() {\n // freeze thread\n store.dispatch(thread.busy())\n\n return ajax.patch(this.props.thread.api.index, [\n { op: \"replace\", path: \"category\", value: this.state.category },\n ])\n }\n\n handleSuccess() {\n // refresh thread and displayed posts\n ajax\n .get(this.props.thread.api.posts.index, { page: this.props.posts.page })\n .then(\n (data) => {\n store.dispatch(thread.replace(data))\n store.dispatch(posts.load(data.post_set))\n store.dispatch(thread.release())\n\n snackbar.success(\n pgettext(\"thread move form\", \"Thread has been moved.\")\n )\n modal.hide()\n },\n (rejection) => {\n store.dispatch(thread.release())\n snackbar.apiError(rejection)\n }\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (event) => {\n this.changeValue(\"category\", event.target.value)\n }\n\n render() {\n if (this.state.isReady) {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"thread move form btn\", \"Cancel\")}\n \n \n {pgettext(\"thread move form btn\", \"Move thread\")}\n \n
    \n
    \n
    \n
    \n )\n } else if (this.state.isError) {\n return \n } else {\n return \n }\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"thread move form title\", \"Move thread\")}\n

    \n
    \n )\n}\n\nexport function ModalLoading(props) {\n return (\n
    \n
    \n \n \n
    \n
    \n )\n}\n\nexport function ModalMessage(props) {\n return (\n
    \n
    \n \n
    \n info_outline\n
    \n
    \n

    \n {pgettext(\n \"thread move form\",\n \"You can't move this thread at the moment.\"\n )}\n

    \n

    {props.message}

    \n \n {pgettext(\"thread move form dismiss btn\", \"Ok\")}\n \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport ThreadChangeTitleModal from \"./ThreadChangeTitleModal\"\nimport MergeModal from \"./merge\"\nimport MoveModal from \"./move\"\n\nexport default class extends React.Component {\n callApi = (ops, successMessage) => {\n store.dispatch(thread.busy())\n\n // by the chance update thread acl too\n ops.push({ op: \"add\", path: \"acl\", value: true })\n\n ajax.patch(this.props.thread.api.index, ops).then(\n (data) => {\n store.dispatch(thread.update(data))\n store.dispatch(thread.release())\n snackbar.success(successMessage)\n },\n (rejection) => {\n store.dispatch(thread.release())\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n )\n }\n\n changeTitle = () => {\n modal.show()\n }\n\n pinGlobally = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"weight\",\n value: 2,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been pinned globally.\")\n )\n }\n\n pinLocally = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"weight\",\n value: 1,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been pinned in category.\")\n )\n }\n\n unpin = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"weight\",\n value: 0,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been unpinned.\")\n )\n }\n\n approve = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-unapproved\",\n value: false,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been approved.\")\n )\n }\n\n open = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-closed\",\n value: false,\n },\n ],\n gettext(\"Thread has been opened.\")\n )\n }\n\n close = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-closed\",\n value: true,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been closed.\")\n )\n }\n\n unhide = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-hidden\",\n value: false,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been made visible.\")\n )\n }\n\n hide = () => {\n this.callApi(\n [\n {\n op: \"replace\",\n path: \"is-hidden\",\n value: true,\n },\n ],\n pgettext(\"thread moderation\", \"Thread has been made hidden.\")\n )\n }\n\n move = () => {\n modal.show(\n \n )\n }\n\n merge = () => {\n modal.show()\n }\n\n delete = () => {\n if (\n !window.confirm(\n pgettext(\n \"thread moderation\",\n \"Are you sure you want to delete this thread?\"\n )\n )\n ) {\n return\n }\n\n store.dispatch(thread.busy())\n\n ajax.delete(this.props.thread.api.index).then(\n (data) => {\n snackbar.success(\n pgettext(\"thread moderation\", \"Thread has been deleted.\")\n )\n window.location = this.props.thread.category.url.index\n },\n (rejection) => {\n store.dispatch(thread.release())\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n const { moderation } = this.props\n\n return (\n
      \n {!!moderation.edit && (\n
    • \n \n edit\n {pgettext(\"thread moderation btn\", \"Change title\")}\n \n
    • \n )}\n {!!moderation.pinGlobally && (\n
    • \n \n bookmark\n {pgettext(\"thread moderation btn\", \"Pin globally\")}\n \n
    • \n )}\n {!!moderation.pinLocally && (\n
    • \n \n bookmark_border\n {pgettext(\"thread moderation btn\", \"Pin in category\")}\n \n
    • \n )}\n {!!moderation.unpin && (\n
    • \n \n
    • \n )}\n {!!moderation.move && (\n
    • \n \n
    • \n )}\n {!!moderation.merge && (\n
    • \n \n
    • \n )}\n {!!moderation.approve && (\n
    • \n \n done\n {pgettext(\"thread moderation btn\", \"Approve\")}\n \n
    • \n )}\n {!!moderation.open && (\n
    • \n \n
    • \n )}\n {!!moderation.close && (\n
    • \n \n
    • \n )}\n {!!moderation.unhide && (\n
    • \n \n visibility\n {pgettext(\"thread moderation btn\", \"Unhide\")}\n \n
    • \n )}\n {!!moderation.hide && (\n
    • \n \n
    • \n )}\n {!!moderation.delete && (\n
    • \n \n clear\n {pgettext(\"thread moderation btn\", \"Delete\")}\n \n
    • \n )}\n
    \n )\n }\n}\n","import ThreadModerationOptions from \"./controls\"\n\nexport default ThreadModerationOptions\n","import React from \"react\"\nimport ThreadModerationOptions from \"./moderation/thread\"\n\nconst ThreadModeration = ({ thread, posts, moderation }) => (\n
    \n \n settings\n \n \n
    \n)\n\nexport default ThreadModeration\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport { update } from \"../../reducers/thread\"\nimport snackbar from \"../../services/snackbar\"\nimport { ApiMutation } from \"../Api\"\nimport { DropdownSubheader } from \"../Dropdown\"\n\nconst ThreadWatchButton = ({ dispatch, dropup, stickToBottom, thread }) => (\n \n {(mutate, { loading }) => {\n function setNotifications(notifications) {\n if (thread.notifications !== notifications) {\n dispatch(update({ notifications }))\n mutate({\n json: { notifications },\n onError: (error) => {\n snackbar.apiError(error)\n dispatch(update({ notifications: thread.notifications }))\n },\n })\n }\n }\n\n return (\n
    \n \n \n {getIcon(thread.notifications)}\n \n {getLabel(thread.notifications)}\n \n \n \n {pgettext(\"watch thread\", \"Notify about new replies\")}\n \n
  • \n setNotifications(2)}\n >\n mail\n {pgettext(\"watch thread\", \"On site and with e-mail\")}\n \n
  • \n
  • \n setNotifications(1)}\n >\n notifications_active\n {pgettext(\"watch thread\", \"On site only\")}\n \n
  • \n
  • \n setNotifications(0)}\n >\n notifications_none\n {pgettext(\"watch thread\", \"Don't notify\")}\n \n
  • \n \n
    \n )\n }}\n
    \n)\n\nfunction getIcon(notifications) {\n if (notifications === 2) return \"mail\"\n if (notifications === 1) return \"notifications_active\"\n\n return \"notifications_none\"\n}\n\nfunction getLabel(notifications) {\n if (notifications) {\n return pgettext(\"watch thread\", \"Watching\")\n }\n\n return pgettext(\"watch thread\", \"Watch\")\n}\n\nconst ThreadWatchButtonConnected = connect()(ThreadWatchButton)\n\nexport default ThreadWatchButtonConnected\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst Breadcrumbs = ({ children, className }) => (\n
      {children}
    \n)\n\nexport default Breadcrumbs\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst BreadcrumbsCategory = ({ category, className }) => (\n
  • \n \n \n label\n \n {!!category.short_name && (\n \n {category.short_name}\n \n )}\n {!!category.short_name && (\n {category.name}\n )}\n {!category.short_name && (\n {category.name}\n )}\n \n
  • \n)\n\nexport default BreadcrumbsCategory\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst BreadcrumbsRootCategory = ({ category, className }) => (\n
  • \n \n chevron_right\n \n {category.special_role === \"root_category\"\n ? pgettext(\"breadcrumb\", \"Threads\")\n : pgettext(\"breadcrumb\", \"Private threads\")}\n \n \n
  • \n)\n\nexport default BreadcrumbsRootCategory\n","import React from \"react\"\nimport {\n Breadcrumbs,\n BreadcrumbsCategory,\n BreadcrumbsRootCategory,\n} from \"../../Breadcrumbs\"\n\nconst ThreadHeaderBreadcrumbs = ({ breadcrumbs }) => (\n \n {breadcrumbs.map((category) =>\n category.special_role ? (\n \n ) : (\n \n )\n )}\n \n)\n\nexport default ThreadHeaderBreadcrumbs\n","import React from \"react\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../../FlexRow\"\nimport ThreadFlags from \"../../ThreadFlags\"\nimport ThreadReplies from \"../../ThreadReplies\"\nimport ThreadStarterCard from \"../../ThreadStarterCard\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n PageHeaderDetails,\n} from \"../../PageHeader\"\nimport ThreadModeration from \"../ThreadModeration\"\nimport ThreadWatchButton from \"../ThreadWatchButton\"\nimport ThreadHeaderBreadcrumbs from \"./ThreadHeaderBreadcrumbs\"\n\nconst ThreadHeader = ({ styleName, thread, posts, user, moderation }) => (\n \n \n \n \n

    {thread.title}

    \n
    \n \n \n \n \n \n \n \n {thread.replies > 0 && (\n \n \n \n )}\n {hasFlags(thread) && (\n \n \n \n )}\n \n {user.is_authenticated && (\n \n \n \n \n {moderation.enabled && (\n \n \n \n )}\n \n )}\n \n \n
    \n
    \n)\n\nconst hasFlags = (thread) => {\n return (\n thread.is_closed ||\n thread.is_hidden ||\n thread.is_unapproved ||\n thread.weight > 0 ||\n thread.best_answer ||\n thread.has_poll ||\n thread.has_unapproved_posts\n )\n}\n\nexport default ThreadHeader\n","import ThreadHeader from \"./ThreadHeader\"\n\nexport default ThreadHeader\n","import React from \"react\"\nimport { Link, withRouter } from \"react-router\"\nimport { Dropdown } from \"../Dropdown\"\n\nconst ThreadPaginator = ({ router, baseUrl, posts, scrollToTop }) => (\n
    \n {posts.isLoaded && posts.first ? (\n \n first_page\n \n ) : (\n \n first_page\n \n )}\n {posts.isLoaded && posts.previous ? (\n 1 ? posts.previous + \"/\" : \"\")}\n title={pgettext(\"paginator\", \"Go to previous page\")}\n onClick={scrollToTop ? resetScroll : null}\n >\n chevron_left\n \n ) : (\n \n chevron_left\n \n )}\n (\n \n {getLabel(posts.page, posts.pages)}\n \n )}\n onOpen={(dropdown) => {\n dropdown.querySelector(\"input\").focus()\n }}\n >\n {({ close }) => (\n {\n if (posts.isLoaded) {\n const formData = new FormData(event.target)\n const page = parseInt(formData.get(\"page\"))\n\n if (\n page &&\n page != posts.page &&\n page >= 1 &&\n page <= posts.pages\n ) {\n const url = page > 1 ? baseUrl + page + \"/\" : baseUrl\n router.push({ pathname: url })\n }\n }\n\n event.preventDefault()\n close()\n\n if (scrollToTop) {\n resetScroll()\n }\n }}\n >\n \n \n {pgettext(\"paginator\", \"Go\")}\n \n \n )}\n \n {posts.isLoaded && posts.next ? (\n \n chevron_right\n \n ) : (\n \n chevron_right\n \n )}\n {posts.isLoaded && posts.last ? (\n \n last_page\n \n ) : (\n \n last_page\n \n )}\n
    \n)\n\nfunction getLabel(page, pages) {\n return pgettext(\"paginator\", \"Page %(page)s of %(pages)s\")\n .replace(\"%(page)s\", page)\n .replace(\"%(pages)s\", pages)\n}\n\nfunction resetScroll() {\n window.scrollTo(0, 0)\n}\n\nconst ThreadPaginatorConnected = withRouter(ThreadPaginator)\n\nexport default ThreadPaginatorConnected\n","import React from \"react\"\n\nexport default function ({ errors, posts }) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"thread posts moderation modal title\", \"Moderation\")}\n

    \n
    \n
    \n

    \n {pgettext(\n \"thread posts moderation modal\",\n \"One or more posts could not be changed:\"\n )}\n

    \n\n
      \n {errors.map((post) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n )\n}\n\nexport function PostErrors({ errors, post }) {\n const heading = interpolate(\n pgettext(\"thread posts moderation modal\", \"%(username)s on %(posted_on)s\"),\n {\n posted_on: post.posted_on.format(\"LL, LT\"),\n username: post.poster_name,\n },\n true\n )\n\n return (\n
  • \n
    {heading}:
    \n {errors.map((error, i) => {\n return

    {error}

    \n })}\n
  • \n )\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport * as post from \"misago/reducers/post\"\nimport * as posts from \"misago/reducers/posts\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport ErrorsList from \"./errors-list\"\n\nexport function approve(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-unapproved\", value: false }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_unapproved: false,\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_unapproved: post.is_unapproved,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function protect(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: true }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: true,\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: post.is_protected,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function unprotect(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: false }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: false,\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_protected: post.is_protected,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function hide(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: true }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(post.url, {\n hidden_by: props.user.url,\n }),\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: post.is_hidden,\n hidden_on: post.hidden_on,\n hidden_by_name: post.hidden_by_name,\n url: post.url,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function unhide(props) {\n const { selection } = props\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: false }]\n\n const newState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: false,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(post.url, {\n hidden_by: props.user.url,\n }),\n }\n })\n\n const previousState = selection.map((post) => {\n return {\n id: post.id,\n is_hidden: post.is_hidden,\n hidden_on: post.hidden_on,\n hidden_by_name: post.hidden_by_name,\n url: post.url,\n }\n })\n\n patch(props, ops, newState, previousState)\n}\n\nexport function patch(props, ops, newState, previousState) {\n const { selection, thread } = props\n\n // patch selected items\n newState.forEach((item) => {\n post.patch(item, item)\n })\n\n // deselect all the things\n store.dispatch(posts.deselectAll())\n\n // call ajax\n const data = {\n ops,\n\n ids: selection.map((post) => {\n return post.id\n }),\n }\n\n ajax.patch(thread.api.posts.index, data).then(\n (data) => {\n data.forEach((item) => {\n store.dispatch(post.patch(item, item))\n })\n },\n (rejection) => {\n if (rejection.status !== 400) {\n // rollback all\n previousState.forEach((item) => {\n store.dispatch(post.patch(item, item))\n })\n return snackbar.apiError(rejection)\n }\n\n let errors = []\n let rollback = []\n\n rejection.forEach((item) => {\n if (item.detail) {\n errors.push(item)\n rollback.push(item.id)\n } else {\n store.dispatch(post.patch(item, item))\n }\n\n previousState.forEach((item) => {\n if (rollback.indexOf(item) !== -1) {\n store.dispatch(post.patch(item, item))\n }\n })\n })\n\n let posts = {}\n selection.forEach((item) => {\n posts[item.id] = item\n })\n\n modal.show()\n }\n )\n}\n\nexport function merge(props) {\n let confirmed = window.confirm(\n pgettext(\n \"merge posts\",\n \"Are you sure you want to merge selected posts? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n props.selection.slice(1).map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n ajax\n .post(props.thread.api.posts.merge, {\n posts: props.selection.map((post) => post.id),\n })\n .then(\n (data) => {\n store.dispatch(post.patch(data, post.hydrate(data)))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n props.selection.slice(1).map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: false,\n })\n )\n })\n }\n )\n\n store.dispatch(posts.deselectAll())\n}\n\nexport function remove(props) {\n let confirmed = window.confirm(\n pgettext(\n \"delete posts\",\n \"Are you sure you want to delete selected posts? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n props.selection.map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n const ids = props.selection.map((post) => {\n return post.id\n })\n\n ajax.delete(props.thread.api.posts.index, ids).then(\n () => {\n return\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n props.selection.map((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: false,\n })\n )\n })\n }\n )\n\n store.dispatch(posts.deselectAll())\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(\n pgettext(\n \"thread posts moderation move\",\n \"You have to enter link to the other thread.\"\n )\n )\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.move, {\n new_thread: this.state.url,\n posts: this.props.selection.map((post) => post.id),\n })\n }\n\n handleSuccess(success) {\n this.props.selection.forEach((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n modal.hide()\n\n snackbar.success(\n pgettext(\n \"thread posts moderation move\",\n \"Selected posts were moved to the other thread.\"\n )\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {pgettext(\"thread posts moderation move btn\", \"Cancel\")}\n \n \n {pgettext(\"thread posts moderation move btn\", \"Move posts\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    \n {pgettext(\"thread posts moderation move title\", \"Move posts\")}\n

    \n
    \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport Select from \"misago/components/select\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\nimport ErrorsModal from \"./errors-list\"\n\nexport default function (props) {\n return \n}\n\nexport class PostingConfig extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isError: false,\n\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n post: item.post,\n })\n })\n\n this.setState({\n isLoaded: true,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.isError) {\n return \n } else if (this.state.isLoaded) {\n return (\n \n )\n } else {\n return \n }\n }\n}\n\nexport class ModerationForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n title: \"\",\n category: null,\n categories: props.categories,\n weight: 0,\n is_hidden: 0,\n is_closed: false,\n\n validators: {\n title: [validators.required()],\n },\n\n errors: {},\n }\n\n this.isHiddenChoices = [\n {\n value: 0,\n icon: \"visibility\",\n label: pgettext(\"thread hidden switch choice\", \"No\"),\n },\n {\n value: 1,\n icon: \"visibility_off\",\n label: pgettext(\"thread hidden switch choice\", \"Yes\"),\n },\n ]\n\n this.isClosedChoices = [\n {\n value: false,\n icon: \"lock_outline\",\n label: pgettext(\"thread closed switch choice\", \"No\"),\n },\n {\n value: true,\n icon: \"lock\",\n label: pgettext(\"thread closed switch choice\", \"Yes\"),\n },\n ]\n\n this.acl = {}\n this.props.categories.forEach((category) => {\n if (category.post) {\n if (!this.state.category) {\n this.state.category = category.id\n }\n\n this.acl[category.id] = {\n can_pin_threads: category.post.pin,\n can_close_threads: category.post.close,\n can_hide_threads: category.post.hide,\n }\n }\n })\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.split, {\n title: this.state.title,\n category: this.state.category,\n weight: this.state.weight,\n is_hidden: this.state.is_hidden,\n is_closed: this.state.is_closed,\n posts: this.props.selection.map((post) => post.id),\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.selection.forEach((selection) => {\n store.dispatch(\n post.patch(selection, {\n isDeleted: true,\n })\n )\n })\n\n modal.hide()\n\n snackbar.success(\n pgettext(\n \"posts moderation split\",\n \"Selected posts were split into new thread.\"\n )\n )\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n snackbar.error(gettext(\"Form contains errors.\"))\n } else if (rejection.status === 403 && Array.isArray(rejection)) {\n modal.show()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (ev) => {\n const categoryId = ev.target.value\n const newState = {\n category: categoryId,\n }\n\n if (this.acl[categoryId].can_pin_threads < newState.weight) {\n newState.weight = 0\n }\n\n if (!this.acl[categoryId].can_hide_threads) {\n newState.is_hidden = 0\n }\n\n if (!this.acl[categoryId].can_close_threads) {\n newState.is_closed = false\n }\n\n this.setState(newState)\n }\n\n getWeightChoices() {\n const choices = [\n {\n value: 0,\n icon: \"remove\",\n label: pgettext(\"thread weight choice\", \"Not pinned\"),\n },\n {\n value: 1,\n icon: \"bookmark_border\",\n label: pgettext(\"thread weight choice\", \"Pinned in category\"),\n },\n ]\n\n if (this.acl[this.state.category].can_pin_threads == 2) {\n choices.push({\n value: 2,\n icon: \"bookmark\",\n label: pgettext(\"thread weight choice\", \"Pinned globally\"),\n })\n }\n\n return choices\n }\n\n renderWeightField() {\n if (this.acl[this.state.category].can_pin_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderHiddenField() {\n if (this.acl[this.state.category].can_hide_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderClosedField() {\n if (this.acl[this.state.category].can_close_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n \n \n
    \n\n \n \n \n
    \n\n {this.renderWeightField()}\n {this.renderHiddenField()}\n {this.renderClosedField()}\n
    \n
    \n \n {pgettext(\"posts moderation split btn\", \"Cancel\")}\n \n \n
    \n \n \n )\n }\n}\n\nexport function Loader() {\n return (\n \n \n \n )\n}\n\nexport function Error(props) {\n return (\n \n
    \n info_outline\n
    \n
    \n

    \n {pgettext(\n \"posts moderation split\",\n \"You can't move selected posts at the moment.\"\n )}\n

    \n

    {props.message}

    \n \n
    \n
    \n )\n}\n\nexport function Modal(props) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\n \"posts moderation split title\",\n \"Split posts into new thread\"\n )}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport modal from \"misago/services/modal\"\nimport * as moderation from \"./actions\"\nimport MoveModal from \"./move\"\nimport SplitModal from \"./split\"\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport class Approve extends React.Component {\n onClick = () => {\n moderation.approve(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_approve && post.is_unapproved\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Merge extends React.Component {\n onClick = () => {\n moderation.merge(this.props)\n }\n\n render() {\n const isVisible =\n this.props.selection.length > 1 &&\n this.props.selection.find((post) => {\n return post.acl.can_merge\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Move extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_move\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Split extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_move\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Protect extends React.Component {\n onClick = () => {\n moderation.protect(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return !post.is_protected && post.acl.can_protect\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unprotect extends React.Component {\n onClick = () => {\n moderation.unprotect(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.is_protected && post.acl.can_protect\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n moderation.hide(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_hide && !post.is_hidden\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n moderation.unhide(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_unhide && post.is_hidden\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n moderation.remove(this.props)\n }\n\n render() {\n const isVisible = this.props.selection.find((post) => {\n return post.acl.can_delete\n })\n\n if (!isVisible) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport { ThreadPostsModerationOptions } from \"./moderation/posts\"\n\nconst ThreadPostsModeration = ({ thread, user, selection, dropup }) => (\n
    \n \n settings\n \n \n
    \n)\n\nexport default ThreadPostsModeration\n","import React from \"react\"\n\nconst ThreadReplyButton = ({ onClick }) => (\n \n chat\n {pgettext(\"thread reply btn\", \"Reply\")}\n \n)\n\nexport default ThreadReplyButton\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\nimport ThreadPaginator from \"./ThreadPaginator\"\nimport ThreadPostsModeration from \"./ThreadPostsModeration\"\nimport ThreadReplyButton from \"./ThreadReplyButton\"\nimport ThreadWatchButton from \"./ThreadWatchButton\"\n\nconst ThreadToolbarBottom = ({\n thread,\n posts,\n user,\n selection,\n moderation,\n onReply,\n}) => (\n \n {posts.pages > 1 && (\n \n \n \n \n \n )}\n \n {user.is_authenticated && (\n \n \n \n \n {thread.acl.can_reply && (\n \n \n \n )}\n {moderation.enabled && (\n \n \n \n )}\n \n )}\n {user.is_authenticated && (\n \n \n \n \n \n )}\n \n)\n\nexport default ThreadToolbarBottom\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\n\nconst ThreadToolbarThird = () => (\n \n \n \n \n window.scrollTo(0, 0)}\n >\n arrow_upward\n {pgettext(\"go up\", \"Go to top\")}\n \n \n \n \n)\n\nexport default ThreadToolbarThird\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ThreadPollButton = ({ compact, disabled, onClick }) => (\n \n poll\n {!compact && pgettext(\"thread poll btn\", \"Add poll\")}\n \n)\n\nexport default ThreadPollButton\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst ThreadShortcutsButton = ({ user, thread, posts }) => (\n
    \n \n bookmark\n \n \n
    \n)\n\nexport default ThreadShortcutsButton\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\nimport ThreadPaginator from \"./ThreadPaginator\"\nimport ThreadPollButton from \"./ThreadPollButton\"\nimport ThreadPostsModeration from \"./ThreadPostsModeration\"\nimport ThreadReplyButton from \"./ThreadReplyButton\"\nimport ThreadShortcutsButton from \"./ThreadShortcutsButton\"\n\nconst ThreadToolbarTop = ({\n thread,\n posts,\n user,\n pollDisabled,\n selection,\n moderation,\n onPoll,\n onReply,\n}) => (\n \n \n \n \n \n {posts.pages > 1 && (\n \n \n \n )}\n \n \n {thread.acl.can_start_poll && !thread.poll && (\n \n \n \n \n \n )}\n {thread.acl.can_reply ? (\n \n \n \n \n \n \n \n {thread.acl.can_start_poll && !thread.poll && (\n \n \n \n )}\n {moderation.enabled && (\n \n \n \n )}\n \n ) : (\n \n \n \n \n {thread.acl.can_start_poll && !thread.poll && (\n \n \n \n )}\n {moderation.enabled && (\n \n \n \n )}\n \n )}\n {posts.pages > 1 && (\n \n \n \n \n \n )}\n \n)\n\nexport default ThreadToolbarTop\n","import React from \"react\"\nimport Participants from \"misago/components/participants\"\nimport { Poll, PollForm } from \"misago/components/poll\"\nimport PostsList from \"misago/components/posts-list\"\nimport * as participants from \"misago/reducers/participants\"\nimport * as poll from \"misago/reducers/poll\"\nimport * as posts from \"misago/reducers/posts\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport polls from \"misago/services/polls\"\nimport snackbar from \"misago/services/snackbar\"\nimport posting from \"misago/services/posting\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { PostingQuoteSelection } from \"../posting\"\nimport PageContainer from \"../PageContainer\"\nimport ThreadHeader from \"./ThreadHeader\"\nimport ThreadToolbarBottom from \"./ThreadToolbarBottom\"\nimport ThreadToolbarThird from \"./ThreadToolbarThird\"\nimport ThreadToolbarTop from \"./ThreadToolbarTop\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n editPoll: false,\n }\n }\n\n componentDidMount() {\n if (this.shouldFetchData()) {\n this.fetchData()\n this.setPageTitle()\n }\n\n this.startPollingApi()\n }\n\n componentDidUpdate() {\n if (this.shouldFetchData()) {\n this.fetchData()\n this.startPollingApi()\n this.setPageTitle()\n }\n }\n\n componentWillUnmount() {\n this.stopPollingApi()\n }\n\n shouldFetchData() {\n if (this.props.posts.isLoaded) {\n const page = (this.props.params.page || 1) * 1\n return page != this.props.posts.page\n } else {\n return false\n }\n }\n\n fetchData() {\n store.dispatch(posts.unload())\n\n ajax\n .get(\n this.props.thread.api.posts.index,\n {\n page: this.props.params.page || 1,\n },\n \"posts\"\n )\n .then(\n (data) => {\n this.update(data)\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n startPollingApi() {\n polls.start({\n poll: \"thread-posts\",\n\n url: this.props.thread.api.posts.index,\n data: {\n page: this.props.params.page || 1,\n },\n update: this.update,\n\n frequency: 120 * 1000,\n delayed: true,\n })\n }\n\n stopPollingApi() {\n polls.stop(\"thread-posts\")\n }\n\n setPageTitle() {\n title.set({\n title: this.props.thread.title,\n parent: this.props.thread.category.name,\n page: (this.props.params.page || 1) * 1,\n })\n }\n\n update = (data) => {\n store.dispatch(thread.replace(data))\n store.dispatch(posts.load(data.post_set))\n\n if (data.participants) {\n store.dispatch(participants.replace(data.participants))\n }\n\n if (data.poll) {\n store.dispatch(poll.replace(data.poll))\n }\n\n this.setPageTitle()\n }\n\n openPollForm = () => {\n this.setState({ editPoll: true })\n }\n\n closePollForm = () => {\n this.setState({ editPoll: false })\n }\n\n openReplyForm = () => {\n posting.open({\n mode: \"REPLY\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n })\n }\n\n render() {\n const category = this.props.thread.category\n\n let className = \"page page-thread\"\n if (category.css_class) {\n className += \" page-thread-\" + category.css_class\n }\n\n const styleName =\n category.special_role === \"private_threads\"\n ? \"private-threads\"\n : category.css_class || \"category-threads\"\n\n const threadModeration = getThreadModeration(\n this.props.thread,\n this.props.user\n )\n\n const postsModeration = getPostsModeration(\n this.props.posts.results,\n this.props.user\n )\n const selection = this.props.posts.results.filter((post) => post.isSelected)\n\n return (\n
    \n \n \n \n \n {this.state.editPoll ? (\n \n ) : (\n \n )}\n {this.props.thread.acl.can_reply ? (\n \n \n \n ) : (\n \n )}\n \n \n \n
    \n )\n }\n}\n\nconst getThreadModeration = (thread, user) => {\n const moderation = {\n enabled: false,\n edit: false,\n approve: false,\n close: false,\n open: false,\n hide: false,\n unhide: false,\n move: false,\n merge: false,\n pinGlobally: false,\n pinLocally: false,\n unpin: false,\n delete: false,\n }\n\n if (!user.is_authenticated) return moderation\n\n moderation.edit = thread.acl.can_edit\n moderation.approve = thread.acl.can_approve && thread.is_unapproved\n moderation.close = thread.acl.can_close && !thread.is_closed\n moderation.open = thread.acl.can_close && thread.is_closed\n moderation.hide = thread.acl.can_hide && !thread.is_hidden\n moderation.unhide = thread.acl.can_unhide && thread.is_hidden\n moderation.move = thread.acl.can_move\n moderation.merge = thread.acl.can_merge\n moderation.pinGlobally = thread.acl.can_pin_globally && thread.weight < 2\n moderation.pinLocally = thread.acl.can_pin && thread.weight !== 1\n moderation.unpin =\n (thread.acl.can_pin && thread.weight === 1) ||\n (thread.acl.can_pin_globally && thread.weight === 2)\n moderation.delete = thread.acl.can_delete\n\n moderation.enabled =\n moderation.edit ||\n moderation.approve ||\n moderation.close ||\n moderation.open ||\n moderation.hide ||\n moderation.unhide ||\n moderation.move ||\n moderation.merge ||\n moderation.pinGlobally ||\n moderation.pinLocally ||\n moderation.unpin ||\n moderation.delete\n\n return moderation\n}\n\nconst getPostsModeration = (posts, user) => {\n const moderation = {\n enabled: false,\n approve: false,\n move: false,\n merge: false,\n protect: false,\n hide: false,\n delete: false,\n }\n\n if (!user.is_authenticated) return moderation\n\n posts.forEach((post) => {\n if (!post.is_event) {\n if (post.acl.can_approve && post.is_unapproved) {\n moderation.approve = true\n }\n if (post.acl.can_move) moderation.move = true\n if (post.acl.can_merge) moderation.merge = true\n if (post.acl.can_protect || post.acl.can_unprotect) {\n moderation.protect = true\n }\n if (post.acl.can_hide || post.acl.can_unhide) {\n moderation.hide = true\n }\n if (post.acl.can_delete) moderation.delete = true\n\n if (\n moderation.approve ||\n moderation.move ||\n moderation.merge ||\n moderation.protect ||\n moderation.hide ||\n moderation.delete\n ) {\n moderation.enabled = true\n }\n }\n })\n\n return moderation\n}\n","import { connect } from \"react-redux\"\nimport Route from \"misago/components/thread/route\"\nimport misago from \"misago/index\"\n\nexport function select(store) {\n return {\n participants: store.participants,\n poll: store.poll,\n posts: store.posts,\n thread: store.thread,\n tick: store.tick.tick,\n user: store.auth.user,\n }\n}\n\nexport function paths() {\n const thread = misago.get(\"THREAD\")\n const basePath = thread.url.index.replace(\n thread.slug + \"-\" + thread.pk,\n \":slug\"\n )\n return [\n {\n path: basePath,\n component: connect(select)(Route),\n },\n {\n path: basePath + \":page/\",\n component: connect(select)(Route),\n },\n ]\n}\n","import { paths } from \"misago/components/thread/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"THREAD\") && context.has(\"POSTS\")) {\n mount({\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:thread\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { UserNavOverlay } from \"../../components/UserNav\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n const root = document.getElementById(\"user-nav-mount\")\n ReactDOM.render(\n \n \n ,\n root\n )\n}\n\nmisago.addInitializer({\n name: \"component:user-nav-overlay\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst UsersNav = ({ baseUrl, page, pages }) => (\n
    \n
    \n \n menu\n {page.name}\n \n
      \n {pages.map((page) => {\n const url = getPageUrl(baseUrl, page)\n return (\n
    • \n {page.name}\n
    • \n )\n })}\n
    \n
    \n
      \n {pages.map((page) => {\n const url = getPageUrl(baseUrl, page)\n return (\n
    • \n {page.name}\n
    • \n )\n })}\n
    \n
    \n)\n\nconst getPageUrl = (baseUrl, page) => {\n let url = baseUrl\n if (page.component === \"rank\") {\n url += page.slug\n } else {\n url += page.component\n }\n return url + \"/\"\n}\n\nexport default UsersNav\n","import React from \"react\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n getEmptyMessage() {\n return interpolate(\n npgettext(\n \"top posters empty\",\n \"No users have posted any new messages during last %(days)s day.\",\n \"No users have posted any new messages during last %(days)s days.\",\n this.props.trackedPeriod\n ),\n { days: this.props.trackedPeriod },\n true\n )\n }\n\n render() {\n return (\n
    \n \n \n

    {this.getEmptyMessage()}

    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n getClassName() {\n if (this.props.hiddenOnMobile) {\n return \"list-group-item hidden-xs hidden-sm\"\n } else {\n return \"list-group-item\"\n }\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n\n
    \n
    \n \n \n  \n \n \n
    \n\n
    \n \n  \n \n  \n \n \n \n \n  \n \n \n \n \n  \n \n \n
    \n
    \n \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Rank\")}\n \n \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Ranked posts\")}\n \n
    \n
    \n\n
    \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Rank\")}\n
    \n\n
    \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Ranked posts\")}\n
    \n\n
    \n \n \n  \n \n \n {pgettext(\"top posters list item\", \"Total posts\")}\n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ItemPreview from \"misago/components/users/active-posters/list-item-preview\"\nimport * as random from \"misago/utils/random\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n \n \n

    \n \n  \n \n

    \n\n
    \n
      \n {[0, 1, 2].map((i) => {\n return 0} key={i} />\n })}\n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Avatar from \"misago/components/avatar\"\nimport Status, { StatusIcon, StatusLabel } from \"misago/components/user-status\"\nimport misago from \"misago/index\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.rank.css_class) {\n return \"list-group-item list-group-rank-\" + this.props.rank.css_class\n } else {\n return \"list-group-item\"\n }\n }\n\n getUserStatus() {\n if (this.props.user.status) {\n return (\n \n \n \n \n )\n }\n\n return (\n \n  \n \n  \n \n \n )\n }\n\n getRankName() {\n if (!this.props.rank.is_tab) {\n return (\n {this.props.rank.name}\n )\n }\n\n let rankUrl = misago.get(\"USERS_LIST_URL\") + this.props.rank.slug + \"/\"\n return (\n \n {this.props.rank.name}\n \n )\n }\n\n getUserTitle() {\n if (!this.props.user.title) return null\n\n return (\n \n {this.props.user.title}\n \n )\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n\n
    \n \n
    \n {this.getUserStatus()}\n {this.getRankName()}\n {this.getUserTitle()}\n
    \n
    \n \n #{this.props.counter}\n {pgettext(\"top posters list item\", \"Rank\")}\n \n\n \n {this.props.user.meta.score}\n {pgettext(\"top posters list item\", \"Ranked posts\")}\n \n
    \n
    \n\n
    \n #{this.props.counter}\n {pgettext(\"top posters list item\", \"Rank\")}\n
    \n\n
    \n {this.props.user.meta.score}\n {pgettext(\"top posters list item\", \"Ranked posts\")}\n
    \n\n
    \n {this.props.user.posts}\n {pgettext(\"top posters list item\", \"Total posts\")}\n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ListItem from \"misago/components/users/active-posters/list-item\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n getLeadMessage() {\n let message = npgettext(\n \"top posters list\",\n \"%(posters)s top poster from last %(days)s days.\",\n \"%(posters)s top posters from last %(days)s days.\",\n this.props.count\n )\n\n return interpolate(\n message,\n {\n posters: this.props.count,\n days: this.props.trackedPeriod,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n \n \n

    {this.getLeadMessage()}

    \n\n
    \n
      \n {this.props.users.map((user, i) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/users/active-posters/list-empty\"\nimport ListPreview from \"misago/components/users/active-posters/list-preview\"\nimport ListReady from \"misago/components/users/active-posters/list-ready\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"USERS\")) {\n this.initWithPreloadedData(misago.pop(\"USERS\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling()\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n\n trackedPeriod: data.tracked_period,\n count: data.count,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling() {\n polls.start({\n poll: \"active-posters\",\n url: misago.get(\"USERS_API\"),\n data: {\n list: \"active\",\n },\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data.results))\n\n this.setState({\n isLoaded: true,\n\n trackedPeriod: data.tracked_period,\n count: data.count,\n })\n }\n\n componentDidMount() {\n title.set({\n title: this.props.route.extra.name,\n parent: pgettext(\"users page title\", \"Users\"),\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"active-posters\")\n }\n\n render() {\n const page = { name: this.props.route.extra.name }\n\n if (this.state.isLoaded) {\n if (this.state.count > 0) {\n return (\n \n )\n } else {\n return (\n \n )\n }\n } else {\n return \n }\n }\n}\n","import React from \"react\"\nimport stringCount from \"misago/utils/string-count\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.copy && this.props.copy.length) {\n if (\n stringCount(this.props.copy, \"\n )\n } else {\n return null\n }\n }\n}\n","export default function (string, subString) {\n string = (string + \"\").toLowerCase()\n subString = (subString + \"\").toLowerCase()\n\n if (subString.length <= 0) return 0\n\n let n = 0\n let pos = 0\n let step = subString.length\n\n while (true) {\n pos = string.indexOf(subString, pos)\n if (pos >= 0) {\n n += 1\n pos += step\n } else {\n break\n }\n }\n\n return n\n}\n","import React from \"react\"\nimport UsersList from \"../../users-list\"\n\nconst RankUsersList = ({ users }) => (\n \n)\n\nexport default RankUsersList\n","import React from \"react\"\nimport UsersList from \"misago/components/users-list\"\n\nclass RankUsersListLoader extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render = () => \n}\n\nexport default RankUsersListLoader\n","import React from \"react\"\n\nconst RankUsersLeft = ({ users }) => {\n if (users.more) {\n return (\n

    \n {interpolate(\n npgettext(\n \"rank users list\",\n \"There is %(more)s more user with this rank.\",\n \"There are %(more)s more users with this rank.\",\n users.more\n ),\n { more: users.more },\n true\n )}\n

    \n )\n }\n\n return (\n

    \n {pgettext(\n \"rank users list empty\",\n \"There are no more users with this rank.\"\n )}\n

    \n )\n}\n\nexport default RankUsersLeft\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst RankUsersPagination = ({ baseUrl, users }) => (\n
    \n {users.isLoaded && users.first ? (\n \n first_page\n \n ) : (\n \n first_page\n \n )}\n {users.isLoaded && users.previous ? (\n 1 ? users.previous + \"/\" : \"\")}\n title={pgettext(\"rank users list paginator\", \"Go to previous page\")}\n >\n chevron_left\n \n ) : (\n \n chevron_left\n \n )}\n {users.isLoaded && users.next ? (\n \n chevron_right\n \n ) : (\n \n chevron_right\n \n )}\n {users.isLoaded && users.last ? (\n \n last_page\n \n ) : (\n \n last_page\n \n )}\n
    \n)\n\nexport default RankUsersPagination\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\nimport RankUsersLeft from \"./RankUsersLeft\"\nimport RankUsersPagination from \"./RankUsersPagination\"\n\nconst RankUsersToolbar = ({ baseUrl, users }) => (\n \n \n \n \n \n \n \n \n \n \n \n \n)\n\nexport default RankUsersToolbar\n","import React from \"react\"\nimport PageLead from \"misago/components/page-lead\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport PageContainer from \"../../PageContainer\"\nimport RankUsersList from \"./RankUsersList\"\nimport RankUsersListLoader from \"./RankUsersListLoader\"\nimport RankUsersToolbar from \"./RankUsersToolbar\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"USERS\")) {\n this.initWithPreloadedData(misago.pop(\"USERS\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling(props.params.page || 1)\n }\n\n initWithPreloadedData(data) {\n this.state = Object.assign(data, {\n isLoaded: true,\n })\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling(page) {\n polls.start({\n poll: \"rank-users\",\n url: misago.get(\"USERS_API\"),\n data: {\n rank: this.props.route.rank.id,\n page: page,\n },\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data.results))\n\n data.isLoaded = true\n this.setState(data)\n }\n\n componentDidMount() {\n title.set({\n title: this.props.route.rank.name,\n page: this.props.params.page || null,\n parent: pgettext(\"users page title\", \"Users\"),\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"rank-users\")\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.params.page !== nextProps.params.page) {\n title.set({\n title: this.props.route.rank.name,\n page: nextProps.params.page || null,\n parent: pgettext(\"users page title\", \"Users\"),\n })\n\n this.setState({\n isLoaded: false,\n })\n\n polls.stop(\"rank-users\")\n this.startPolling(nextProps.params.page)\n }\n }\n\n getClassName() {\n if (this.props.route.rank.css_class) {\n return \"rank-users-list rank-users-\" + this.props.route.rank.css_class\n } else {\n return \"rank-users-list\"\n }\n }\n\n getRankDescription() {\n if (this.props.route.rank.description) {\n return (\n
    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getComponent() {\n if (this.state.isLoaded) {\n if (this.state.count > 0) {\n return \n } else {\n return (\n

    \n {pgettext(\n \"rank users list\",\n \"There are no users with this rank at the moment.\"\n )}\n

    \n )\n }\n } else {\n return \n }\n }\n\n render() {\n return (\n
    \n \n \n {this.getRankDescription()}\n {this.getComponent()}\n \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport ActivePosters from \"misago/components/users/active-posters/root\"\nimport Rank from \"misago/components/users/rank/root\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago/index\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nexport default class extends WithDropdown {\n render() {\n return (\n
    \n \n \n \n

    {pgettext(\"users page title\", \"Users\")}

    \n
    \n
    \n
    \n {this.props.children}\n
    \n )\n }\n}\n\nexport function select(store) {\n return {\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n }\n}\n\nexport function paths() {\n let paths = []\n\n misago.get(\"USERS_LISTS\").forEach(function (item) {\n if (item.component === \"rank\") {\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/:page/\",\n component: connect(select)(Rank),\n rank: item,\n })\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/\",\n component: connect(select)(Rank),\n rank: item,\n })\n } else if (item.component === \"active-posters\") {\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.component + \"/\",\n component: connect(select)(ActivePosters),\n extra: {\n name: item.name,\n },\n })\n }\n })\n\n return paths\n}\n","import Users, { paths } from \"misago/components/users/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"USERS_LISTS\")) {\n mount({\n root: misago.get(\"USERS_LIST_URL\"),\n component: Users,\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:users\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\n\nexport default function initializer(context) {\n include.init(context.get(\"STATIC_URL\"))\n}\n\nmisago.addInitializer({\n name: \"include\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n storage.init(\"misago_\")\n}\n\nmisago.addInitializer({\n name: \"local-storage\",\n initializer: initializer,\n})\n","import mount from \"misago/utils/mount-component\"\n\nexport class MobileNavbarDropdown {\n init(element) {\n this._element = element\n this._component = null\n }\n\n show(component) {\n if (this._component === component) {\n this.hide()\n } else {\n this._component = component\n mount(component, this._element.id)\n $(this._element).addClass(\"open\")\n }\n }\n\n showConnected(name, component) {\n if (this._component === name) {\n this.hide()\n } else {\n this._component = name\n mount(component, this._element.id, true)\n $(this._element).addClass(\"open\")\n }\n }\n\n hide() {\n $(this._element).removeClass(\"open\")\n this._component = null\n }\n}\n\nexport default new MobileNavbarDropdown()\n","import misago from \"misago/index\"\nimport dropdown from \"misago/services/mobile-navbar-dropdown\"\n\nexport default function initializer() {\n let element = document.getElementById(\"mobile-navbar-dropdown-mount\")\n if (element) {\n dropdown.init(element)\n }\n}\n\nmisago.addInitializer({\n name: \"dropdown\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport modal from \"misago/services/modal\"\n\nexport default function initializer() {\n let element = document.getElementById(\"modal-mount\")\n if (element) {\n modal.init(element)\n }\n}\n\nmisago.addInitializer({\n name: \"modal\",\n initializer: initializer,\n before: \"store\",\n})\n","import moment from \"moment\"\nimport misago from \"misago/index\"\n\nexport default function initializer() {\n moment.locale($(\"html\").attr(\"lang\"))\n}\n\nmisago.addInitializer({\n name: \"moment\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport title from \"misago/services/page-title\"\n\nexport default function initializer(context) {\n title.init(\n context.get(\"SETTINGS\").forum_index_title,\n context.get(\"SETTINGS\").forum_name\n )\n}\n\nmisago.addInitializer({\n name: \"page-title\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport polls from \"misago/services/polls\"\n\nexport default function initializer() {\n polls.init(ajax, snackbar)\n}\n\nmisago.addInitializer({\n name: \"polls\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer() {\n posting.init(ajax, snackbar, document.getElementById(\"posting-mount\"))\n}\n\nmisago.addInitializer({\n name: \"posting\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/auth\"\nimport store from \"misago/services/store\"\n\nexport default function initializer(context) {\n store.addReducer(\n \"auth\",\n reducer,\n Object.assign(\n {\n isAuthenticated: context.get(\"isAuthenticated\"),\n isAnonymous: !context.get(\"isAuthenticated\"),\n\n user: context.get(\"user\"),\n },\n initialState\n )\n )\n}\n\nmisago.addInitializer({\n name: \"reducer:auth\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"../../reducers/overlay\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n store.addReducer(\"overlay\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:overlay\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/participants\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\")) {\n initialState = misago.get(\"THREAD\").participants\n }\n\n store.addReducer(\"participants\", reducer, initialState || [])\n}\n\nmisago.addInitializer({\n name: \"reducer:participants\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/poll\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\") && misago.get(\"THREAD\").poll) {\n initialState = hydrate(misago.get(\"THREAD\").poll)\n } else {\n initialState = {}\n }\n\n store.addReducer(\"poll\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:poll\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"POSTS\")) {\n initialState = hydrate(misago.get(\"POSTS\"))\n } else {\n initialState = {\n isLoaded: false,\n isBusy: false,\n }\n }\n\n store.addReducer(\"posts\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:posts\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile-details\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"PROFILE_DETAILS\")) {\n initialState = misago.get(\"PROFILE_DETAILS\")\n }\n\n store.addReducer(\"profile-details\", reducer, initialState || {})\n}\n\nmisago.addInitializer({\n name: \"reducer:profile-details\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n if (misago.has(\"PROFILE\")) {\n store.dispatch(hydrate(misago.get(\"PROFILE\")))\n }\n}\n\nmisago.addInitializer({\n name: \"reducer:profile-hydrate\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"profile\", reducer, {})\n}\n\nmisago.addInitializer({\n name: \"reducer:profile\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago\"\nimport reducer, { initialState } from \"misago/reducers/search\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\n \"search\",\n reducer,\n Object.assign({}, initialState, {\n providers: misago.get(\"SEARCH_PROVIDERS\") || [],\n query: misago.get(\"SEARCH_QUERY\") || \"\",\n })\n )\n}\n\nmisago.addInitializer({\n name: \"reducer:search\",\n initializer: initializer,\n before: \"store\",\n})\n","export function push(array, value) {\n if (array.indexOf(value) === -1) {\n let copy = array.slice()\n copy.push(value)\n return copy\n } else {\n return array\n }\n}\n\nexport function remove(array, value) {\n if (array.indexOf(value) >= 0) {\n return array.filter(function (i) {\n return i !== value\n })\n } else {\n return array\n }\n}\n\nexport function toggle(array, value) {\n if (array.indexOf(value) === -1) {\n let copy = array.slice()\n copy.push(value)\n return copy\n } else {\n return array.filter(function (i) {\n return i !== value\n })\n }\n}\n","import { toggle } from \"misago/utils/sets\"\n\nexport const SELECT_ALL = \"SELECT_ALL\"\nexport const SELECT_NONE = \"SELECT_NONE\"\nexport const SELECT_ITEM = \"SELECT_ITEM\"\n\nexport function all(itemsIds) {\n return {\n type: SELECT_ALL,\n items: itemsIds,\n }\n}\n\nexport function none() {\n return {\n type: SELECT_NONE,\n }\n}\n\nexport function item(itemId) {\n return {\n type: SELECT_ITEM,\n item: itemId,\n }\n}\n\nexport default function selection(state = [], action = null) {\n switch (action.type) {\n case SELECT_ALL:\n return action.items\n\n case SELECT_NONE:\n return []\n\n case SELECT_ITEM:\n return toggle(state, action.item)\n\n default:\n return state\n }\n}\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/selection\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"selection\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:selection\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"snackbar\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:snackbar\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/thread\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\")) {\n initialState = hydrate(misago.get(\"THREAD\"))\n } else {\n initialState = {\n isBusy: false,\n }\n }\n\n store.addReducer(\"thread\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:thread\",\n initializer: initializer,\n before: \"store\",\n})\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_THREADS = \"APPEND_THREADS\"\nexport const DELETE_THREAD = \"DELETE_THREAD\"\nexport const FILTER_THREADS = \"FILTER_THREADS\"\nexport const HYDRATE_THREADS = \"HYDRATE_THREADS\"\nexport const PATCH_THREAD = \"PATCH_THREAD\"\nexport const SORT_THREADS = \"SORT_THREADS\"\n\nexport const MODERATION_PERMISSIONS = [\n \"can_announce\",\n \"can_approve\",\n \"can_close\",\n \"can_hide\",\n \"can_move\",\n \"can_merge\",\n \"can_pin\",\n \"can_review\",\n]\n\nexport function append(items, sorting) {\n return {\n type: APPEND_THREADS,\n items,\n sorting,\n }\n}\n\nexport function deleteThread(thread) {\n return {\n type: DELETE_THREAD,\n thread,\n }\n}\n\nexport function filterThreads(category, categoriesMap) {\n return {\n type: FILTER_THREADS,\n category,\n categoriesMap,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_THREADS,\n items,\n }\n}\n\nexport function patch(thread, patch, sorting = null) {\n return {\n type: PATCH_THREAD,\n thread,\n patch,\n sorting,\n }\n}\n\nexport function sort(sorting) {\n return {\n type: SORT_THREADS,\n sorting,\n }\n}\n\nexport function getThreadModerationOptions(thread_acl) {\n let options = []\n MODERATION_PERMISSIONS.forEach(function (perm) {\n if (thread_acl[perm]) {\n options.push(perm)\n }\n })\n return options\n}\n\nexport function hydrateThread(thread) {\n return Object.assign({}, thread, {\n moderation: getThreadModerationOptions(thread.acl),\n })\n}\n\nexport default function thread(state = [], action = null) {\n switch (action.type) {\n case APPEND_THREADS:\n const mergedState = concatUnique(action.items.map(hydrateThread), state)\n return mergedState.sort(action.sorting)\n\n case DELETE_THREAD:\n return state.filter(function (item) {\n return item.id !== action.thread.id\n })\n\n case FILTER_THREADS:\n return state.filter(function (item) {\n const itemCategory = action.categoriesMap[item.category]\n if (\n itemCategory.lft >= action.category.lft &&\n itemCategory.rght <= action.category.rght\n ) {\n // same or sub category\n return true\n } else if (item.weight == 2) {\n // globally pinned\n return true\n } else {\n // thread moved outside displayed scope, hide it\n return false\n }\n })\n\n case HYDRATE_THREADS:\n return action.items.map(hydrateThread)\n\n case PATCH_THREAD:\n const patchedState = state.map(function (item) {\n if (item.id === action.thread.id) {\n return Object.assign({}, item, action.patch)\n } else {\n return item\n }\n })\n\n if (action.sorting) {\n return patchedState.sort(action.sorting)\n }\n return patchedState\n\n case SORT_THREADS:\n return state.sort(action.sorting)\n\n default:\n return state\n }\n}\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/threads\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"threads\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:threads\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"tick\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:tick\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/username-history\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"username-history\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:username-history\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/users\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"users\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:users\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n snackbar.init(store)\n}\n\nmisago.addInitializer({\n name: \"snackbar\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.init()\n}\n\nmisago.addInitializer({\n name: \"store\",\n initializer: initializer,\n before: \"_end\",\n})\n","import misago from \"misago/index\"\nimport { doTick } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nconst TICK_PERIOD = 50 * 1000 //do the tick every 50s\n\nexport default function initializer() {\n window.setInterval(function () {\n store.dispatch(doTick())\n }, TICK_PERIOD)\n}\n\nmisago.addInitializer({\n name: \"tick-start\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\nimport zxcvbn from \"misago/services/zxcvbn\"\n\nexport default function initializer() {\n zxcvbn.init(include)\n}\n\nmisago.addInitializer({\n name: \"zxcvbn\",\n initializer: initializer,\n})\n","import { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\n\nexport var initialState = {\n signedIn: false,\n signedOut: false,\n}\n\nexport const UPDATE_AUTHENTICATED_USER = \"UPDATE_AUTHENTICATED_USER\"\nexport const PATCH_USER = \"PATCH_USER\"\nexport const SIGN_IN = \"SIGN_IN\"\nexport const SIGN_OUT = \"SIGN_OUT\"\n\nexport function updateAuthenticatedUser(data) {\n return {\n type: UPDATE_AUTHENTICATED_USER,\n data,\n }\n}\n\nexport function patch(patch) {\n return {\n type: PATCH_USER,\n patch,\n }\n}\n\nexport function signIn(user) {\n return {\n type: SIGN_IN,\n user,\n }\n}\n\nexport function signOut(soft = false) {\n return {\n type: SIGN_OUT,\n soft,\n }\n}\n\nexport default function auth(state = initialState, action = null) {\n switch (action.type) {\n case PATCH_USER:\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, action.patch)\n return newState\n\n case UPDATE_AUTHENTICATED_USER:\n let updatedState = Object.assign({}, state)\n updatedState.user = Object.assign({}, state.user, action.data)\n return updatedState\n\n case SIGN_IN:\n return Object.assign({}, state, {\n signedIn: action.user,\n })\n\n case SIGN_OUT:\n return Object.assign({}, state, {\n isAuthenticated: false,\n isAnonymous: true,\n signedOut: !action.soft,\n })\n\n case UPDATE_AVATAR:\n if (state.isAuthenticated && state.user.id === action.userId) {\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, {\n avatars: action.avatars,\n })\n return newState\n }\n return state\n\n case UPDATE_USERNAME:\n if (state.isAuthenticated && state.user.id === action.userId) {\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, {\n username: action.username,\n slug: action.slug,\n })\n return newState\n }\n return state\n\n default:\n return state\n }\n}\n","export const OPEN_SITE_NAV = \"OPEN_SITE_NAV\"\nexport const OPEN_SEARCH = \"OPEN_SEARCH\"\nexport const OPEN_NOTIFICATIONS = \"OPEN_NOTIFICATIONS\"\nexport const OPEN_PRIVATE_THREADS = \"OPEN_PRIVATE_THREADS\"\nexport const OPEN_USER_NAV = \"OPEN_USER_NAV\"\nexport const CLOSE = \"CLOSE_OVERLAYS\"\n\nexport function openSiteNav() {\n return { type: OPEN_SITE_NAV }\n}\n\nexport function openSearch() {\n return { type: OPEN_SEARCH }\n}\n\nexport function openNotifications() {\n return { type: OPEN_NOTIFICATIONS }\n}\n\nexport function openPrivateThreads() {\n return { type: OPEN_PRIVATE_THREADS }\n}\n\nexport function openUserNav() {\n return { type: OPEN_USER_NAV }\n}\n\nexport function close() {\n return { type: CLOSE }\n}\n\nexport const initialState = {\n siteNav: false,\n search: false,\n notifications: false,\n privateThreads: false,\n userNav: false,\n}\n\nexport default function notifications(state = initialState, action = null) {\n switch (action.type) {\n case OPEN_SITE_NAV:\n return Object.assign({}, state, initialState, { siteNav: true })\n\n case OPEN_SEARCH:\n return Object.assign({}, state, initialState, { search: true })\n\n case OPEN_NOTIFICATIONS:\n return Object.assign({}, state, initialState, { notifications: true })\n\n case OPEN_PRIVATE_THREADS:\n return Object.assign({}, state, initialState, { privateThreads: true })\n\n case OPEN_USER_NAV:\n return Object.assign({}, state, initialState, { userNav: true })\n\n case CLOSE:\n return Object.assign({}, state, initialState)\n\n default:\n return state\n }\n}\n","export const REPLACE_PARTICIPANTS = \"REPLACE_PARTICIPANTS\"\n\nexport function replace(newState) {\n return {\n type: REPLACE_PARTICIPANTS,\n state: newState,\n }\n}\n\nexport default function participants(state = [], action = null) {\n switch (action.type) {\n case REPLACE_PARTICIPANTS:\n return action.state\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\n\nexport const BUSY_POLL = \"BUSY_POLL\"\nexport const RELEASE_POLL = \"RELEASE_POLL\"\nexport const REMOVE_POLL = \"REMOVE_POLL\"\nexport const REPLACE_POLL = \"REPLACE_POLL\"\nexport const UPDATE_POLL = \"UPDATE_POLL\"\n\nexport function hydrate(json) {\n let hasSelectedChoices = false\n for (const i in json.choices) {\n const choice = json.choices[i]\n if (choice.selected) {\n hasSelectedChoices = true\n break\n }\n }\n\n return Object.assign({}, json, {\n posted_on: moment(json.posted_on),\n\n hasSelectedChoices,\n endsOn: json.length\n ? moment(json.posted_on).add(json.length, \"days\")\n : null,\n\n isBusy: false,\n })\n}\n\nexport function busy() {\n return {\n type: BUSY_POLL,\n }\n}\n\nexport function release() {\n return {\n type: RELEASE_POLL,\n }\n}\n\nexport function replace(newState, hydrated = false) {\n return {\n type: REPLACE_POLL,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function update(data) {\n return {\n type: UPDATE_POLL,\n data,\n }\n}\n\nexport function remove() {\n return {\n type: REMOVE_POLL,\n }\n}\n\nexport default function poll(state = {}, action = null) {\n switch (action.type) {\n case BUSY_POLL:\n return Object.assign({}, state, { isBusy: true })\n\n case RELEASE_POLL:\n return Object.assign({}, state, { isBusy: false })\n\n case REMOVE_POLL:\n return {\n isBusy: false,\n }\n\n case REPLACE_POLL:\n return action.state\n\n case UPDATE_POLL:\n return Object.assign({}, state, action.data)\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport { hydrateUser } from \"./users\"\n\nexport const PATCH_POST = \"PATCH_POST\"\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n posted_on: moment(json.posted_on),\n updated_on: moment(json.updated_on),\n hidden_on: moment(json.hidden_on),\n\n attachments: json.attachments\n ? json.attachments.map(hydrateAttachment)\n : null,\n poster: json.poster ? hydrateUser(json.poster) : null,\n\n isSelected: false,\n isBusy: false,\n isDeleted: false,\n })\n}\n\nexport function hydrateAttachment(json) {\n return Object.assign({}, json, {\n uploaded_on: moment(json.uploaded_on),\n })\n}\n\nexport function patch(post, patch) {\n return {\n type: PATCH_POST,\n post,\n patch,\n }\n}\n\nexport default function post(state = {}, action = null) {\n switch (action.type) {\n case PATCH_POST:\n if (state.id == action.post.id) {\n return Object.assign({}, state, action.patch)\n }\n return state\n\n default:\n return state\n }\n}\n","import postReducer, {\n PATCH_POST,\n hydrate as hydratePost,\n} from \"misago/reducers/post\"\n\nexport const APPEND_POSTS = \"APPEND_POSTS\"\nexport const SELECT_POST = \"SELECT_POST\"\nexport const DESELECT_POST = \"DESELECT_POST\"\nexport const DESELECT_POSTS = \"DESELECT_POSTS\"\nexport const LOAD_POSTS = \"LOAD_POSTS\"\nexport const UNLOAD_POSTS = \"UNLOAD_POSTS\"\nexport const UPDATE_POSTS = \"UPDATE_POSTS\"\n\nexport function select(post) {\n return {\n type: SELECT_POST,\n post,\n }\n}\n\nexport function deselect(post) {\n return {\n type: DESELECT_POST,\n post,\n }\n}\n\nexport function deselectAll() {\n return {\n type: DESELECT_POSTS,\n }\n}\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n results: json.results.map(hydratePost),\n isLoaded: true,\n isBusy: false,\n isSelected: false,\n })\n}\n\nexport function load(newState, hydrated = false) {\n return {\n type: LOAD_POSTS,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function append(newState, hydrated = false) {\n return {\n type: APPEND_POSTS,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function unload() {\n return {\n type: UNLOAD_POSTS,\n }\n}\n\nexport function update(newState) {\n return {\n type: UPDATE_POSTS,\n update: newState,\n }\n}\n\nexport default function posts(state = {}, action = null) {\n switch (action.type) {\n case SELECT_POST:\n const selectedPosts = state.results.map((post) => {\n if (post.id == action.post.id) {\n return Object.assign({}, post, {\n isSelected: true,\n })\n } else {\n return post\n }\n })\n\n return Object.assign({}, state, {\n results: selectedPosts,\n })\n\n case DESELECT_POST:\n const deseletedPosts = state.results.map((post) => {\n if (post.id == action.post.id) {\n return Object.assign({}, post, {\n isSelected: false,\n })\n } else {\n return post\n }\n })\n\n return Object.assign({}, state, {\n results: deseletedPosts,\n })\n\n case DESELECT_POSTS:\n const deseletedAllPosts = state.results.map((post) => {\n return Object.assign({}, post, {\n isSelected: false,\n })\n })\n\n return Object.assign({}, state, {\n results: deseletedAllPosts,\n })\n\n case APPEND_POSTS:\n let results = state.results.slice()\n const resultsIds = state.results.map((post) => {\n return post.id\n })\n\n action.state.results.map((post) => {\n if (resultsIds.indexOf(post.id) === -1) {\n results.push(post)\n }\n })\n\n return Object.assign({}, action.state, {\n results,\n })\n\n case LOAD_POSTS:\n return action.state\n\n case UNLOAD_POSTS:\n return Object.assign({}, state, {\n isLoaded: false,\n })\n\n case UPDATE_POSTS:\n return Object.assign({}, state, action.update)\n\n case PATCH_POST:\n const reducedPosts = state.results.map((post) => {\n return postReducer(post, action)\n })\n\n return Object.assign({}, state, {\n results: reducedPosts,\n })\n\n default:\n return state\n }\n}\n","export const LOAD_DETAILS = \"LOAD_DETAILS\"\n\nexport function load(newState) {\n return {\n type: LOAD_DETAILS,\n\n newState,\n }\n}\n\nexport default function details(state = {}, action = null) {\n switch (action.type) {\n case LOAD_DETAILS:\n return action.newState\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport {\n UPDATE_AVATAR,\n UPDATE_USERNAME,\n hydrateStatus,\n} from \"misago/reducers/users\"\n\nexport const HYDRATE_PROFILE = \"HYDRATE_PROFILE\"\nexport const PATCH_PROFILE = \"PATCH_PROFILE\"\n\nexport function hydrate(profile) {\n return {\n type: HYDRATE_PROFILE,\n profile,\n }\n}\n\nexport function patch(patch) {\n return {\n type: PATCH_PROFILE,\n patch,\n }\n}\n\nexport default function auth(state = {}, action = null) {\n switch (action.type) {\n case HYDRATE_PROFILE:\n return Object.assign({}, action.profile, {\n joined_on: moment(action.profile.joined_on),\n status: hydrateStatus(action.profile.status),\n })\n\n case PATCH_PROFILE:\n return Object.assign({}, state, action.patch)\n\n case UPDATE_AVATAR:\n if (state.id === action.userId) {\n return Object.assign({}, state, {\n avatars: action.avatars,\n })\n }\n return state\n\n case UPDATE_USERNAME:\n if (state.id === action.userId) {\n return Object.assign({}, state, {\n username: action.username,\n slug: action.slug,\n })\n }\n return state\n\n default:\n return state\n }\n}\n","export const REPLACE_SEARCH = \"REPLACE_SEARCH\"\nexport const UPDATE_SEARCH = \"UPDATE_SEARCH\"\nexport const UPDATE_SEARCH_PROVIDER = \"UPDATE_SEARCH_PROVIDER\"\n\nexport const initialState = {\n isLoading: false,\n query: \"\",\n providers: [],\n}\n\nexport function replace(newState) {\n return {\n type: REPLACE_SEARCH,\n state: {\n isLoading: false,\n providers: newState,\n },\n }\n}\n\nexport function update(newState) {\n return {\n type: UPDATE_SEARCH,\n update: newState,\n }\n}\n\nexport function updateProvider(provider) {\n return {\n type: UPDATE_SEARCH_PROVIDER,\n provider: provider,\n }\n}\n\nexport default function participants(state = {}, action = null) {\n switch (action.type) {\n case REPLACE_SEARCH:\n return action.state\n\n case UPDATE_SEARCH:\n return Object.assign({}, state, action.update)\n\n case UPDATE_SEARCH_PROVIDER:\n return Object.assign({}, state, {\n providers: state.providers.map((provider) => {\n if (provider.id === action.provider.id) {\n return action.provider\n } else {\n return provider\n }\n }),\n })\n\n default:\n return state\n }\n}\n","export var initialState = {\n type: \"info\",\n message: \"\",\n isVisible: false,\n}\n\nexport const SHOW_SNACKBAR = \"SHOW_SNACKBAR\"\nexport const HIDE_SNACKBAR = \"HIDE_SNACKBAR\"\n\nexport function showSnackbar(message, type) {\n return {\n type: SHOW_SNACKBAR,\n message,\n messageType: type,\n }\n}\n\nexport function hideSnackbar() {\n return {\n type: HIDE_SNACKBAR,\n }\n}\n\nexport default function snackbar(state = initialState, action = null) {\n if (action.type === SHOW_SNACKBAR) {\n return {\n type: action.messageType,\n message: action.message,\n isVisible: true,\n }\n } else if (action.type === HIDE_SNACKBAR) {\n return Object.assign({}, state, {\n isVisible: false,\n })\n } else {\n return state\n }\n}\n","import moment from \"moment\"\nimport { REMOVE_POLL, REPLACE_POLL } from \"./poll\"\n\nexport const BUSY_THREAD = \"BUSY_THREAD\"\nexport const RELEASE_THREAD = \"RELEASE_THREAD\"\nexport const REPLACE_THREAD = \"REPLACE_THREAD\"\nexport const UPDATE_THREAD = \"UPDATE_THREAD\"\nexport const UPDATE_THREAD_ACL = \"UPDATE_THREAD_ACL\"\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n started_on: moment(json.started_on),\n last_post_on: moment(json.last_post_on),\n best_answer_marked_on: json.best_answer_marked_on\n ? moment(json.best_answer_marked_on)\n : null,\n\n isBusy: false,\n })\n}\n\nexport function busy() {\n return {\n type: BUSY_THREAD,\n }\n}\n\nexport function release() {\n return {\n type: RELEASE_THREAD,\n }\n}\n\nexport function replace(newState, hydrated = false) {\n return {\n type: REPLACE_THREAD,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function update(data) {\n return {\n type: UPDATE_THREAD,\n data,\n }\n}\n\nexport function updateAcl(data) {\n return {\n type: UPDATE_THREAD_ACL,\n data,\n }\n}\n\nexport default function thread(state = {}, action = null) {\n switch (action.type) {\n case BUSY_THREAD:\n return Object.assign({}, state, { isBusy: true })\n\n case RELEASE_THREAD:\n return Object.assign({}, state, { isBusy: false })\n\n case REMOVE_POLL:\n return Object.assign({}, state, { poll: null })\n\n case REPLACE_POLL:\n return Object.assign({}, state, { poll: action.state })\n\n case REPLACE_THREAD:\n return action.state\n\n case UPDATE_THREAD:\n return Object.assign({}, state, action.data)\n\n case UPDATE_THREAD_ACL:\n const acl = Object.assign({}, state.acl, action.data)\n return Object.assign({}, state, { acl })\n\n default:\n return state\n }\n}\n","export var initialState = {\n tick: 0,\n}\n\nexport const TICK = \"TICK\"\n\nexport function doTick() {\n return {\n type: TICK,\n }\n}\n\nexport default function tick(state = initialState, action = null) {\n if (action.type === TICK) {\n return Object.assign({}, state, {\n tick: state.tick + 1,\n })\n } else {\n return state\n }\n}\n","import moment from \"moment\"\nimport { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const ADD_NAME_CHANGE = \"ADD_NAME_CHANGE\"\nexport const APPEND_HISTORY = \"APPEND_HISTORY\"\nexport const HYDRATE_HISTORY = \"HYDRATE_HISTORY\"\n\nexport function addNameChange(change, user, changedBy) {\n return {\n type: ADD_NAME_CHANGE,\n change,\n user,\n changedBy,\n }\n}\n\nexport function append(items) {\n return {\n type: APPEND_HISTORY,\n items: items,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_HISTORY,\n items: items,\n }\n}\n\nexport function hydrateNamechange(namechange) {\n return Object.assign({}, namechange, {\n changed_on: moment(namechange.changed_on),\n })\n}\n\nexport default function username(state = [], action = null) {\n switch (action.type) {\n case ADD_NAME_CHANGE:\n let newState = state.slice()\n newState.unshift({\n id: Math.floor(Date.now() / 1000), // just small hax for getting id\n changed_by: action.changedBy,\n changed_by_username: action.changedBy.username,\n changed_on: moment(),\n new_username: action.change.username,\n old_username: action.user.username,\n })\n return newState\n\n case APPEND_HISTORY:\n return concatUnique(state, action.items.map(hydrateNamechange))\n\n case HYDRATE_HISTORY:\n return action.items.map(hydrateNamechange)\n\n case UPDATE_AVATAR:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.changed_by && item.changed_by.id === action.userId) {\n item.changed_by = Object.assign({}, item.changed_by, {\n avatars: action.avatars,\n })\n }\n\n return item\n })\n\n case UPDATE_USERNAME:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.changed_by && item.changed_by.id === action.userId) {\n item.changed_by = Object.assign({}, item.changed_by, {\n username: action.username,\n slug: action.slug,\n })\n }\n\n return Object.assign({}, item)\n })\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_USERS = \"APPEND_USERS\"\nexport const HYDRATE_USERS = \"HYDRATE_USERS\"\nexport const UPDATE_AVATAR = \"UPDATE_AVATAR\"\nexport const UPDATE_USERNAME = \"UPDATE_USERNAME\"\n\nexport function append(items) {\n return {\n type: APPEND_USERS,\n items,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_USERS,\n items,\n }\n}\n\nexport function hydrateStatus(status) {\n if (status) {\n return Object.assign({}, status, {\n last_click: status.last_click ? moment(status.last_click) : null,\n banned_until: status.banned_until ? moment(status.banned_until) : null,\n })\n } else {\n return null\n }\n}\n\nexport function hydrateUser(user) {\n return Object.assign({}, user, {\n joined_on: moment(user.joined_on),\n status: hydrateStatus(user.status),\n })\n}\n\nexport function updateAvatar(user, avatars) {\n return {\n type: UPDATE_AVATAR,\n userId: user.id,\n avatars,\n }\n}\n\nexport function updateUsername(user, username, slug) {\n return {\n type: UPDATE_USERNAME,\n userId: user.id,\n username,\n slug,\n }\n}\n\nexport default function user(state = [], action = null) {\n switch (action.type) {\n case APPEND_USERS:\n return concatUnique(state, action.items.map(hydrateUser))\n\n case HYDRATE_USERS:\n return action.items.map(hydrateUser)\n\n case UPDATE_AVATAR:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.id === action.userId) {\n item.avatars = action.avatars\n }\n\n return item\n })\n\n default:\n return state\n }\n}\n","export class Ajax {\n constructor() {\n this._cookieName = null\n this._csrfToken = null\n this._locks = {}\n }\n\n init(cookieName) {\n this._cookieName = cookieName\n }\n\n getCsrfToken() {\n if (document.cookie.indexOf(this._cookieName) !== -1) {\n let cookieRegex = new RegExp(this._cookieName + \"=([^;]*)\")\n let cookie = document.cookie.match(cookieRegex)[0]\n return cookie ? cookie.split(\"=\")[1] : null\n } else {\n return null\n }\n }\n\n request(method, url, data) {\n let self = this\n return new Promise(function (resolve, reject) {\n let xhr = {\n url: url,\n method: method,\n headers: {\n \"X-CSRFToken\": self.getCsrfToken(),\n },\n\n data: data ? JSON.stringify(data) : null,\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n\n success: function (data) {\n resolve(data)\n },\n\n error: function (jqXHR) {\n let rejection = jqXHR.responseJSON || {}\n\n rejection.status = jqXHR.status\n\n if (rejection.status === 0) {\n rejection.detail = pgettext(\n \"ajax client error\",\n \"Could not connect to the site.\"\n )\n }\n\n if (rejection.status === 404) {\n if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n rejection.detail = pgettext(\n \"ajax client error\",\n \"Action link is invalid.\"\n )\n }\n }\n\n if (rejection.status === 500 && !rejection.detail) {\n rejection.detail = pgettext(\n \"ajax client error\",\n \"Unknown error has occurred.\"\n )\n }\n\n rejection.statusText = jqXHR.statusText\n\n reject(rejection)\n },\n }\n\n $.ajax(xhr)\n })\n }\n\n get(url, params, lock) {\n if (params) {\n url += \"?\" + $.param(params)\n }\n\n if (lock) {\n let self = this\n\n // update url in existing lock?\n if (this._locks[lock]) {\n this._locks[lock].url = url\n }\n\n // immediately dereference promise handlers without doing anything\n // we are already waiting for existing response to resolve\n if (this._locks[lock] && this._locks[lock].waiter) {\n return {\n then: function () {\n return\n },\n }\n\n // return promise that will begin when original one resolves\n } else if (this._locks[lock] && this._locks[lock].wait) {\n this._locks[lock].waiter = true\n\n return new Promise(function (resolve, reject) {\n let wait = function (url) {\n // keep waiting on promise\n if (self._locks[lock].wait) {\n window.setTimeout(function () {\n wait(url)\n }, 300)\n\n // poll for new url\n } else if (self._locks[lock].url !== url) {\n wait(self._locks[lock].url)\n\n // ajax backend for response\n } else {\n self._locks[lock].waiter = false\n self.request(\"GET\", self._locks[lock].url).then(\n function (data) {\n if (self._locks[lock].url === url) {\n resolve(data)\n } else {\n self._locks[lock].waiter = true\n wait(self._locks[lock].url)\n }\n },\n function (rejection) {\n if (self._locks[lock].url === url) {\n reject(rejection)\n } else {\n self._locks[lock].waiter = true\n wait(self._locks[lock].url)\n }\n }\n )\n }\n }\n\n window.setTimeout(function () {\n wait(url)\n }, 300)\n })\n\n // setup new lock without waiter\n } else {\n this._locks[lock] = {\n url,\n wait: true,\n waiter: false,\n }\n\n return new Promise(function (resolve, reject) {\n self.request(\"GET\", url).then(\n function (data) {\n self._locks[lock].wait = false\n if (self._locks[lock].url === url) {\n resolve(data)\n }\n },\n function (rejection) {\n self._locks[lock].wait = false\n if (self._locks[lock].url === url) {\n reject(rejection)\n }\n }\n )\n })\n }\n } else {\n return this.request(\"GET\", url)\n }\n }\n\n post(url, data) {\n return this.request(\"POST\", url, data)\n }\n\n patch(url, data) {\n return this.request(\"PATCH\", url, data)\n }\n\n put(url, data) {\n return this.request(\"PUT\", url, data)\n }\n\n delete(url, data) {\n return this.request(\"DELETE\", url, data)\n }\n\n upload(url, data, progress) {\n let self = this\n return new Promise(function (resolve, reject) {\n let xhr = {\n url: url,\n method: \"POST\",\n headers: {\n \"X-CSRFToken\": self.getCsrfToken(),\n },\n\n data: data,\n contentType: false,\n processData: false,\n\n xhr: function () {\n let xhr = new window.XMLHttpRequest()\n xhr.upload.addEventListener(\n \"progress\",\n function (evt) {\n if (evt.lengthComputable) {\n progress(Math.round((evt.loaded / evt.total) * 100))\n }\n },\n false\n )\n return xhr\n },\n\n success: function (response) {\n resolve(response)\n },\n\n error: function (jqXHR) {\n let rejection = jqXHR.responseJSON || {}\n\n rejection.status = jqXHR.status\n\n if (rejection.status === 0) {\n rejection.detail = pgettext(\n \"api error\",\n \"Could not connect to the site.\"\n )\n }\n\n if (rejection.status === 413 && !rejection.detail) {\n rejection.detail = pgettext(\n \"api error\",\n \"Upload was rejected by the site as too large.\"\n )\n }\n\n if (rejection.status === 404) {\n if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n rejection.detail = pgettext(\n \"api error\",\n \"Action link is invalid.\"\n )\n }\n }\n\n if (rejection.status === 500 && !rejection.detail) {\n rejection.detail = pgettext(\n \"api error\",\n \"Unknown error has occurred.\"\n )\n }\n\n rejection.statusText = jqXHR.statusText\n\n reject(rejection)\n },\n }\n\n $.ajax(xhr)\n })\n }\n}\n\nexport default new Ajax()\n","import { signIn, signOut } from \"misago/reducers/auth\"\n\nexport class Auth {\n init(store, local, modal) {\n this._store = store\n this._local = local\n this._modal = modal\n\n // tell other tabs what auth state is because we are most current with it\n this.syncSession()\n\n // listen for other tabs to tell us that state changed\n this.watchState()\n }\n\n syncSession() {\n const state = this._store.getState().auth\n if (state.isAuthenticated) {\n this._local.set(\"auth\", {\n isAuthenticated: true,\n username: state.user.username,\n })\n } else {\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n }\n }\n\n watchState() {\n const state = this._store.getState().auth\n this._local.watch(\"auth\", (newState) => {\n if (newState.isAuthenticated) {\n this._store.dispatch(\n signIn({\n username: newState.username,\n })\n )\n } else if (state.isAuthenticated) {\n // check if we are authenticated in this tab\n // because some browser plugins prune local store\n // aggressively, forcing erroneous message to display here\n // tracking bug #955\n this._store.dispatch(signOut())\n }\n })\n this._modal.hide()\n }\n\n signIn(user) {\n this._store.dispatch(signIn(user))\n this._local.set(\"auth\", {\n isAuthenticated: true,\n username: user.username,\n })\n this._modal.hide()\n }\n\n signOut() {\n this._store.dispatch(signOut())\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n this._modal.hide()\n }\n\n softSignOut() {\n this._store.dispatch(signOut(true))\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n this._modal.hide()\n }\n}\n\nexport default new Auth()\n","/* global grecaptcha */\nimport React from \"react\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport class BaseCaptcha {\n init(context, ajax, include, snackbar) {\n this._context = context\n this._ajax = ajax\n this._include = include\n this._snackbar = snackbar\n }\n}\n\nexport class NoCaptcha extends BaseCaptcha {\n load() {\n return new Promise(function (resolve) {\n // immediately resolve as we don't have anything to validate\n resolve()\n })\n }\n\n validator() {\n return null\n }\n\n component() {\n return null\n }\n}\n\nexport class QACaptcha extends BaseCaptcha {\n load() {\n var self = this\n return new Promise((resolve, reject) => {\n self._ajax.get(self._context.get(\"CAPTCHA_API\")).then(\n function (data) {\n self.question = data.question\n self.helpText = data.help_text\n resolve()\n },\n function () {\n self._snackbar.error(\n pgettext(\"captcha field\", \"Failed to load CAPTCHA.\")\n )\n reject()\n }\n )\n })\n }\n\n validator() {\n return []\n }\n\n component(kwargs) {\n return (\n \n \n \n )\n }\n}\n\nexport class ReCaptchaComponent extends React.Component {\n componentDidMount() {\n grecaptcha.render(\"recaptcha\", {\n sitekey: this.props.siteKey,\n callback: (response) => {\n // fire fakey event to binding\n this.props.binding({\n target: {\n value: response,\n },\n })\n },\n })\n }\n\n render() {\n return
    \n }\n}\n\nexport class ReCaptcha extends BaseCaptcha {\n load() {\n this._include.include(\"https://www.google.com/recaptcha/api.js\", true)\n\n return new Promise(function (resolve) {\n var wait = function () {\n if (typeof grecaptcha === \"undefined\") {\n window.setTimeout(function () {\n wait()\n }, 200)\n } else {\n resolve()\n }\n }\n wait()\n })\n }\n\n validator() {\n return []\n }\n\n component(kwargs) {\n return (\n \n \n \n )\n }\n}\n\nexport class Captcha {\n init(context, ajax, include, snackbar) {\n switch (context.get(\"SETTINGS\").captcha_type) {\n case \"no\":\n this._captcha = new NoCaptcha()\n break\n\n case \"qa\":\n this._captcha = new QACaptcha()\n break\n\n case \"re\":\n this._captcha = new ReCaptcha()\n break\n }\n\n this._captcha.init(context, ajax, include, snackbar)\n }\n\n // accessors for underlying strategy\n\n load() {\n return this._captcha.load()\n }\n\n validator() {\n return this._captcha.validator()\n }\n\n component(kwargs) {\n return this._captcha.component(kwargs)\n }\n}\n\nexport default new Captcha()\n","export class Include {\n init(staticUrl) {\n this._staticUrl = staticUrl\n this._included = []\n }\n\n include(script, remote = false) {\n if (this._included.indexOf(script) === -1) {\n this._included.push(script)\n this._include(script, remote)\n }\n }\n\n _include(script, remote) {\n $.ajax({\n url: (!remote ? this._staticUrl : \"\") + script,\n cache: true,\n dataType: \"script\",\n })\n }\n}\n\nexport default new Include()\n","let storage = window.localStorage\n\nexport class LocalStorage {\n init(prefix) {\n this._prefix = prefix\n this._watchers = []\n\n window.addEventListener(\"storage\", (e) => {\n let newValueJson = JSON.parse(e.newValue)\n this._watchers.forEach(function (watcher) {\n if (watcher.key === e.key && e.oldValue !== e.newValue) {\n watcher.callback(newValueJson)\n }\n })\n })\n }\n\n set(key, value) {\n storage.setItem(this._prefix + key, JSON.stringify(value))\n }\n\n get(key) {\n let itemString = storage.getItem(this._prefix + key)\n if (itemString) {\n return JSON.parse(itemString)\n } else {\n return null\n }\n }\n\n watch(key, callback) {\n this._watchers.push({\n key: this._prefix + key,\n callback: callback,\n })\n }\n}\n\nexport default new LocalStorage()\n","import ReactDOM from \"react-dom\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Modal {\n init(element) {\n this._element = element\n\n this._modal = $(element).modal({ show: false })\n\n this._modal.on(\"hidden.bs.modal\", () => {\n ReactDOM.unmountComponentAtNode(this._element)\n })\n }\n\n show(component) {\n mount(component, this._element.id)\n this._modal.modal(\"show\")\n }\n\n hide() {\n this._modal.modal(\"hide\")\n }\n}\n\nexport default new Modal()\n","export class PageTitle {\n init(indexTitle, forumName) {\n this._indexTitle = indexTitle\n this._forumName = forumName\n }\n\n set(title) {\n if (!title) {\n document.title = this._indexTitle || this._forumName\n return\n }\n\n if (typeof title === \"string\") {\n title = { title: title }\n }\n\n let finalTitle = title.title\n\n if (title.page > 1) {\n const pageLabel = interpolate(\n pgettext(\"page title pagination\", \"page: %(page)s\"),\n {\n page: title.page,\n },\n true\n )\n\n finalTitle += \" (\" + pageLabel + \")\"\n }\n\n if (title.parent) {\n finalTitle += \" | \" + title.parent\n }\n\n document.title = finalTitle + \" | \" + this._forumName\n }\n}\n\nexport default new PageTitle()\n","export class Polls {\n init(ajax, snackbar) {\n this._ajax = ajax\n this._snackbar = snackbar\n\n this._polls = {}\n }\n\n start(kwargs) {\n this.stop(kwargs.poll)\n\n const poolServer = () => {\n this._polls[kwargs.poll] = kwargs\n\n this._ajax.get(kwargs.url, kwargs.data || null).then(\n (data) => {\n if (!this._polls[kwargs.poll]._stopped) {\n kwargs.update(data)\n\n this._polls[kwargs.poll].timeout = window.setTimeout(\n poolServer,\n kwargs.frequency\n )\n }\n },\n (rejection) => {\n if (!this._polls[kwargs.poll]._stopped) {\n if (kwargs.error) {\n kwargs.error(rejection)\n } else {\n this._snackbar.apiError(rejection)\n }\n }\n }\n )\n }\n\n if (kwargs.delayed) {\n this._polls[kwargs.poll] = {\n timeout: window.setTimeout(poolServer, kwargs.frequency),\n }\n } else {\n poolServer()\n }\n }\n\n stop(pollId) {\n if (this._polls[pollId]) {\n window.clearTimeout(this._polls[pollId].timeout)\n this._polls[pollId]._stopped = true\n }\n }\n}\n\nexport default new Polls()\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport PostingComponent from \"misago/components/posting\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Posting {\n init(ajax, snackbar, mount) {\n this._ajax = ajax\n this._snackbar = snackbar\n this._mount = mount\n\n this._mode = null\n this._spacer = document.getElementById(\"posting-spacer\")\n this._observer = new ResizeObserver((entries) => {\n this._spacer.style.height = entries[0].contentRect.height + \"px\"\n })\n\n this._isOpen = false\n this._isClosing = false\n\n this._beforeunloadSet = false\n this._props = null\n }\n\n isOpen() {\n return this._isOpen\n }\n\n setBeforeUnload() {\n if (!this._beforeunloadSet) {\n window.addEventListener(\"beforeunload\", this.beforeUnload, {\n capture: true,\n })\n this._beforeunloadSet = true\n }\n }\n\n unsetBeforeUnload() {\n window.removeEventListener(\"beforeunload\", this.beforeUnload, {\n capture: true,\n })\n this._beforeunloadSet = false\n }\n\n beforeUnload(event) {\n event.returnValue = \"true\"\n return \"true\"\n }\n\n open(props) {\n if (this._isOpen === false) {\n if (props.mode === \"QUOTE\") {\n this._mode = \"REPLY\"\n } else {\n this._mode = props.mode\n }\n\n this._isOpen = props.submit\n this._realOpen(Object.assign({}, props, { mode: this._mode }))\n } else if (props.mode === \"QUOTE\") {\n this._realOpen(\n Object.assign({}, this._props, {\n config: props.config,\n context: props.context,\n })\n )\n } else if (this._isOpen !== props.submit) {\n let message = gettext(\n \"You are already working on other message. Do you want to discard it?\"\n )\n\n const changeForm = window.confirm(message)\n if (changeForm) {\n this._mode = props.mode\n this._isOpen = props.submit\n this._realOpen(props)\n }\n } else if (this._mode == \"REPLY\" && props.mode == \"REPLY\") {\n this._realOpen(props)\n }\n }\n\n _realOpen(props) {\n mount(, this._mount.id)\n\n this._props = props\n this._mount.classList.add(\"show\")\n this._observer.observe(this._mount)\n this.setBeforeUnload()\n }\n\n close = () => {\n this.unsetBeforeUnload()\n this._props = null\n\n if (this._isOpen && !this._isClosing) {\n this._isClosing = true\n this._mount.classList.remove(\"show\")\n\n window.setTimeout(() => {\n ReactDOM.unmountComponentAtNode(this._mount)\n this._observer.unobserve(this._mount)\n this._spacer.style.height = \"0px;\"\n this._isClosing = false\n this._isOpen = false\n this._mode = null\n }, 300)\n }\n }\n}\n\nexport default new Posting()\n","import { showSnackbar, hideSnackbar } from \"misago/reducers/snackbar\"\n\nconst HIDE_ANIMATION_LENGTH = 300\nconst MESSAGE_SHOW_LENGTH = 5000\n\nexport class Snackbar {\n init(store) {\n this._store = store\n this._timeout = null\n }\n\n alert = (message, type) => {\n if (this._timeout) {\n window.clearTimeout(this._timeout)\n this._store.dispatch(hideSnackbar())\n\n this._timeout = window.setTimeout(() => {\n this._timeout = null\n this.alert(message, type)\n }, HIDE_ANIMATION_LENGTH)\n } else {\n this._store.dispatch(showSnackbar(message, type))\n this._timeout = window.setTimeout(() => {\n this._store.dispatch(hideSnackbar())\n this._timeout = null\n }, MESSAGE_SHOW_LENGTH)\n }\n }\n\n // shorthands for message types\n\n info = (message) => {\n this.alert(message, \"info\")\n }\n\n success = (message) => {\n this.alert(message, \"success\")\n }\n\n warning = (message) => {\n this.alert(message, \"warning\")\n }\n\n error = (message) => {\n this.alert(message, \"error\")\n }\n\n // shorthand for api errors\n\n apiError = (rejection) => {\n let message = rejection.data ? rejection.data.detail : rejection.detail\n\n if (!message) {\n if (rejection.status === 0) {\n message = pgettext(\"api error\", \"Could not connect to the site.\")\n } else if (rejection.status === 404) {\n message = pgettext(\"api error\", \"Action link is invalid.\")\n } else {\n message = pgettext(\"api error\", \"Unknown error has occurred.\")\n }\n }\n\n if (rejection.status === 403 && message === \"Permission denied\") {\n message = pgettext(\n \"api error\",\n \"You don't have permission to perform this action.\"\n )\n }\n\n this.error(message)\n }\n}\n\nexport default new Snackbar()\n","import { combineReducers, createStore } from \"redux\"\n\nexport class StoreWrapper {\n constructor() {\n this._store = null\n this._reducers = {}\n this._initialState = {}\n }\n\n addReducer(name, reducer, initialState) {\n this._reducers[name] = reducer\n this._initialState[name] = initialState\n }\n\n init() {\n this._store = createStore(\n combineReducers(this._reducers),\n this._initialState\n )\n }\n\n getStore() {\n return this._store\n }\n\n // Store API\n\n getState() {\n return this._store.getState()\n }\n\n dispatch(action) {\n return this._store.dispatch(action)\n }\n}\n\nexport default new StoreWrapper()\n","/* global zxcvbn */\nexport class Zxcvbn {\n init(include) {\n this._include = include\n this._isLoaded = false\n }\n\n scorePassword(password, inputs) {\n // 0-4 score, the more the stronger password\n if (this._isLoaded) {\n return zxcvbn(password, inputs).score\n }\n\n return 0\n }\n\n load() {\n if (!this._isLoaded) {\n this._include.include(\"misago/js/zxcvbn.js\")\n return this._loadingPromise()\n } else {\n return this._loadedPromise()\n }\n }\n\n _loadingPromise() {\n const self = this\n\n return new Promise(function (resolve, reject) {\n var wait = function (tries = 0) {\n tries += 1\n if (tries > 200) {\n reject()\n } else if (typeof zxcvbn === \"undefined\") {\n window.setTimeout(function () {\n wait(tries)\n }, 200)\n } else {\n self._isLoaded = true\n resolve()\n }\n }\n wait()\n })\n }\n\n _loadedPromise() {\n // we have already loaded zxcvbn.js, resolve away!\n return new Promise(function (resolve) {\n resolve()\n })\n }\n}\n\nexport default new Zxcvbn()\n","import moment from \"moment\"\nimport React from \"react\"\n\nexport default class extends React.Component {\n getReasonMessage() {\n if (this.props.message.html) {\n return (\n \n )\n } else {\n return

    {this.props.message.plain}

    \n }\n }\n\n getExpirationMessage() {\n if (this.props.expires) {\n if (this.props.expires.isAfter(moment())) {\n let title = interpolate(\n pgettext(\"banned page\", \"This ban expires on %(expires_on)s.\"),\n {\n expires_on: this.props.expires.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n pgettext(\"banned page\", \"This ban expires %(expires_on)s.\"),\n {\n expires_on: this.props.expires.fromNow(),\n },\n true\n )\n\n return {message}\n } else {\n return pgettext(\"banned page\", \"This ban has expired.\")\n }\n } else {\n return pgettext(\"banned page\", \"This ban is permanent.\")\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n highlight_off\n
    \n
    \n {this.getReasonMessage()}\n

    {this.getExpirationMessage()}

    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider, connect } from \"react-redux\"\nimport BannedPage from \"misago/components/banned-page\"\nimport misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nlet select = function (state) {\n return state.tick\n}\n\nlet RedrawedBannedPage = connect(select)(BannedPage)\n\nexport default function (ban, changeState) {\n ReactDOM.render(\n \n \n ,\n\n document.getElementById(\"page-mount\")\n )\n\n if (typeof changeState === \"undefined\" || changeState) {\n let forumName = misago.get(\"SETTINGS\").forum_name\n document.title =\n pgettext(\"banned error title\", \"You are banned\") + \" | \" + forumName\n window.history.pushState({}, \"\", misago.get(\"BANNED_URL\"))\n }\n}\n","export default function (list, rowWidth, padding = false) {\n let rows = []\n let row = []\n\n list.forEach(function (element) {\n row.push(element)\n if (row.length === rowWidth) {\n rows.push(row)\n row = []\n }\n })\n\n // pad row to required length?\n if (padding !== false && row.length > 0 && row.length < rowWidth) {\n for (let i = row.length; i < rowWidth; i++) {\n row.push(padding)\n }\n }\n\n if (row.length) {\n rows.push(row)\n }\n\n return rows\n}\n","export default function (a, b) {\n let ids = []\n return a.concat(b).filter(function (item) {\n if (ids.indexOf(item.id) === -1) {\n ids.push(item.id)\n return true\n } else {\n return false\n }\n })\n}\n","const map = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n}\n\nexport default function (text) {\n return text.replace(/[&<>\"']/g, function (m) {\n return map[m]\n })\n}\n","export default function (bytes) {\n if (bytes > 1024 * 1024 * 1024) {\n return roundSize(bytes / (1024 * 1024 * 1024)) + \" GB\"\n } else if (bytes > 1024 * 1024) {\n return roundSize(bytes / (1024 * 1024)) + \" MB\"\n } else if (bytes > 1024) {\n return roundSize(bytes / 1024) + \" KB\"\n } else {\n return roundSize(bytes) + \" B\"\n }\n}\n\nexport function roundSize(value) {\n return value.toFixed(1)\n}\n","export const ALPHA = \"12345678990abcdefghijklmnopqrstuvwxyz\"\nexport const ALPHA_LEN = ALPHA.length\n\nexport default function getRandomString(len) {\n const chars = []\n for (let i = 0; i < len; i++) {\n const index = Math.floor(Math.random() * ALPHA_LEN)\n chars.push(ALPHA[index])\n }\n return chars.join(\"\")\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport store from \"misago/services/store\"\n\nexport default function (Component, rootElementId, connected = true) {\n let rootElement = document.getElementById(rootElementId)\n\n let finalComponent = Component.props ? Component : \n\n if (rootElement) {\n if (connected) {\n ReactDOM.render(\n {finalComponent},\n\n rootElement\n )\n } else {\n ReactDOM.render(finalComponent, rootElement)\n }\n }\n}\n","export function int(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nexport function range(min, max) {\n let array = new Array(int(min, max))\n for (let i = 0; i < array.length; i++) {\n array[i] = i\n }\n\n return array\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { Router, browserHistory } from \"react-router\"\nimport store from \"misago/services/store\"\n\nconst rootElement = document.getElementById(\"page-mount\")\n\nexport default function (options) {\n let routes = {\n component: options.component || null,\n childRoutes: [],\n }\n\n if (options.root) {\n routes.childRoutes = [\n {\n path: options.root,\n onEnter: function (nextState, replaceState) {\n replaceState(null, options.paths[0].path)\n },\n },\n ].concat(options.paths)\n } else {\n routes.childRoutes = options.paths\n }\n\n ReactDOM.render(\n \n \n ,\n rootElement\n )\n}\n","const EMAIL =\n /^(([^<>()[\\]\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i\nconst USERNAME = new RegExp(\"^[0-9a-z_]+$\", \"i\")\nconst USERNAME_ALPHANUMERIC = new RegExp(\"[0-9a-z]\", \"i\")\n\nexport function required(message) {\n return function (value) {\n if (\n value === false ||\n value === null ||\n String(value).trim().length === 0\n ) {\n return message || gettext(\"This field is required.\")\n }\n }\n}\n\nexport function requiredTermsOfService(message) {\n const error = pgettext(\n \"agreement validator\",\n \"You have to accept the terms of service.\"\n )\n return required(message || error)\n}\n\nexport function requiredPrivacyPolicy(message) {\n const error = pgettext(\n \"agreement validator\",\n \"You have to accept the privacy policy.\"\n )\n return required(message || error)\n}\n\nexport function email(message) {\n return function (value) {\n if (!EMAIL.test(value)) {\n return (\n message || pgettext(\"email validator\", \"Enter a valid e-mail address.\")\n )\n }\n }\n}\n\nexport function minLength(limitValue, message) {\n return function (value) {\n var returnMessage = \"\"\n var length = value.trim().length\n\n if (length < limitValue) {\n if (message) {\n returnMessage = message(limitValue, length)\n } else {\n returnMessage = npgettext(\n \"value length validator\",\n \"Ensure this value has at least %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n }\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n\nexport function maxLength(limitValue, message) {\n return function (value) {\n var returnMessage = \"\"\n var length = value.trim().length\n\n if (length > limitValue) {\n if (message) {\n returnMessage = message(limitValue, length)\n } else {\n returnMessage = npgettext(\n \"value length validator\",\n \"Ensure this value has at most %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n }\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n\nexport function usernameMinLength(lengthMin) {\n var message = function (lengthMin) {\n return npgettext(\n \"username length validator\",\n \"Username must be at least %(limit_value)s character long.\",\n \"Username must be at least %(limit_value)s characters long.\",\n lengthMin\n )\n }\n return minLength(lengthMin, message)\n}\n\nexport function usernameMaxLength(lengthMax) {\n var message = function (lengthMax) {\n return npgettext(\n \"username length validator\",\n \"Username cannot be longer than %(limit_value)s character.\",\n \"Username cannot be longer than %(limit_value)s characters.\",\n lengthMax\n )\n }\n return maxLength(lengthMax, message)\n}\n\nexport function usernameContent() {\n return function (value) {\n const valueTrimmed = value.trim()\n if (!USERNAME.test(valueTrimmed)) {\n return pgettext(\n \"username validator\",\n \"Username can only contain Latin alphabet letters, digits, and an underscore sign.\"\n )\n }\n if (!USERNAME_ALPHANUMERIC.test(valueTrimmed)) {\n return pgettext(\n \"username validator\",\n \"Username must contain Latin alphabet letters or digits.\"\n )\n }\n }\n}\n\nexport function passwordMinLength(limitValue) {\n return function (value) {\n const length = value.length\n\n if (length < limitValue) {\n const returnMessage = npgettext(\n \"password length validator\",\n \"Valid password must be at least %(limit_value)s character long.\",\n \"Valid password must be at least %(limit_value)s characters long.\",\n limitValue\n )\n\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 30094,\n\t\"./hi.js\": 30094,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + \"hljs\" + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t174: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkmisago\"] = self[\"webpackChunkmisago\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(99170)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(58339)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(64109)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(46226)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(93240)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(75147)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(4894)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(29223)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(73806)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(27015)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(88097)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(46016)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(32488)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(11768)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(61323)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(64752)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(40949)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(78679)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(61814)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(95920)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(44095)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(63290)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(77031)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(97751)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(76093)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(87336)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(47549)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(22331)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(21513)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(98749)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(98251)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(6720)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(66806)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(10846)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(18255)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(14113)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(24444)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(1764)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(68351)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(81521)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(68585)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(41229)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(43589)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(62894)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(33934)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(85577)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(83526)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(43060)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(92292)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(33409)))\nvar __webpack_exports__ = __webpack_require__.O(undefined, [736], () => (__webpack_require__(31341)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","ApiFetch","props","url","cache","data","setState","loading","error","onData","fetch","method","credentials","signal","then","response","status","json","setCache","headers","get","rejection","request","mutation","state","controller","AbortController","this","disabled","prevProps","urlChanged","disabledChanged","abort","hasCache","getCache","children","Object","assign","refetch","update","React","ApiMutation","options","body","onSuccess","onError","mutate","csrfToken","JSON","stringify","cookieName","window","misago_csrf","document","cookie","indexOf","cookieRegex","RegExp","match","split","Dropdown","event","isOpen","root","contains","target","menu","closest","prevState","dropdown","addEventListener","handleClick","removeEventListener","onOpen","onClose","id","className","classnames","open","ref","element","toggle","aria","ariaProps","menuAlignRight","menuClassName","role","close","DropdownDivider","DropdownFooter","listItem","DropdownHeader","DropdownMenuItem","DropdownPills","DropdownSubheader","shrink","auto","ListGroup","ListGroupItem","ListGroupEmpty","icon","message","ListGroupError","detail","ListGroupLoading","ListGroupMessage","getApiUrl","filter","query","api","misago","after","before","connect","auth","user","unreadNotifications","dispatch","updateAuthenticatedUser","NotificationsListEmpty","emptyMessage","pgettext","NotificationsListGroup","NotificationsListItemActor","notification","actor","href","title","username","size","actor_name","NotificationsListItemMessage","isRead","dangerouslySetInnerHTML","__html","NotificationsListItemReadStatus","NotificationsListItemTimestamp","Timestamp","datetime","createdAt","NotificationsListItem","NotificationsList","items","length","map","NotificationsListError","gettext","NotificationsListLoading","BODY_CLASS","Overlay","scrollOrigin","pageYOffset","classList","add","remove","scrollTo","onClick","closeOnNavigation","type","styleName","header","STYLES","LABELS","_score","_password","_inputs","loaded","zxcvbn","password","inputs","cacheStale","value","i","trim","score","getScore","style","width","RegisterForm","handleToggleAgreement","agreement","errors","validator","validators","criteria","passwordMinLength","forEach","item","name","min_length","formValidators","max_length","email","captcha","termsOfService","privacyPolicy","isLoading","isValid","snackbar","validate","ajax","terms_of_service","privacy_policy","apiResponse","callback","__all__","ban","showBannedPage","modal","onSubmit","handleSubmit","display","StartSocialAuth","buttonClassName","buttonLabel","formLabel","label","for","validation","onChange","bindInput","extra","form","RegisterLegalFootnote","onPrivacyPolicyChange","handlePrivacyPolicyChange","onTermsOfServiceChange","handleTermsOfServiceChange","Form","RegisterComplete","activation","interpolate","getLead","getSubscript","complete","completeRegistration","account_activation","isLoaded","Promise","all","result","block","showRegisterForm","LegalAgreement","checked","agreementHtml","escapeHtml","termsOfServiceId","termsOfServiceUrl","privacyPolicyId","privacyPolicyUrl","SearchResultsList","SearchMessage","SearchResultPost","post","index","thread","headline","content","category","poster","poster_name","posted_on","SearchResultUser","rank","joined_on","SearchResults","results","threads","users","count","encodeURIComponent","npgettext","replace","SearchResultsEmpty","SearchResultsError","errorDetail","SearchResultsLoading","CACHE","SearchFetch","debounce","clearTimeout","setTimeout","Api","resultsCount","isResultEmpty","SearchInput","setQuery","placeholder","SearchQuery","SearchDropdown","overlay","search","querySelector","focus","settings","DELEGATE_AUTH","LOGIN_URL","preventDefault","SiteNavMenuConnected","isAnonymous","baseUrl","mainItems","extraItems","extraFooterItems","categories","authDelegated","enable_oauth2_client","topNav","push","footerNav","tosTitle","tosUrl","privacyTitle","privacyUrl","SignInButton","RegisterButton","forum_name","targetBlank","rel","is_vanilla","last","color","short_name","SiteNavDropdown","siteNav","FormHeader","text","labelClassName","socialAuth","pk","button_text","button_color","finalButtonLabel","site","tick","now","Date","diff","Math","ceil","abs","round","date","timeout","scheduleNextUpdate","displayed","narrow","dateRelativeShort","dateRelative","fullDateTime","callApi","avatarType","avatar","onComplete","showError","gravatar","setGravatar","crop_src","showCrop","upload","showUpload","galleries","showGallery","userPeview","avatars","getAvatarPreview","getGravatarButton","setGenerated","getCropButton","getUploadButton","getGalleryButton","cropit","$","deviceRatio","cropitOffset","crop","offset","x","y","zoom","crop_tmp","dataUrl","cropperWidth","getAvatarSize","initialWidth","height","exportZoom","imageState","src","getImagePath","onImageLoaded","zoomLevel","imageSize","offsetX","offsetY","cropAvatar","showIndex","getElementById","click","image","files","validationError","validateFile","preview","URL","createObjectURL","progress","FormData","append","uploaded","limit","filesize","fileSize","invalidTypeMsg","allowed_mime_types","extensionFound","loweredFilename","toLowerCase","allowed_extensions","extension","substr","extensions","join","pickFile","getUploadRequirements","getUploadProgressLabel","uploadFile","getUploadProgress","renderCrop","renderUpload","GalleryItem","select","selection","getClassName","Gallery","batch","images","row","save","ChangeAvatarError","reason","getErrorReason","component","AvatarIndex","AvatarUpload","AvatarCrop","AvatarGallery","store","updateAvatar","completeFlow","getBody","logout","submit","UserNavMenu","selectAvatar","ChangeAvatarModal","optionsMore","slice","adminUrl","showPrivateThreads","unreadPrivateThreads","changeAvatar","revealOptions","unread_private_threads","acl","can_use_private_threads","UserNavDropdown","userNav","size2x","alt","getSrc","srcSet","av","resolveAvatarForSize","Button","defaultProps","choices","repeat","level","isValidated","helpText","labelClass","htmlFor","controlClass","getFeedbackDescription","getFeedback","getHelpText","validateRequired","required","changeValue","newState","formErrors","validateField","clean","promise","send","success","handleSuccess","handleError","optional","validatedFields","hasOwnProperty","fieldErrors","field","requiredError","isControlled","isActive","path","location","pathname","activeClassName","ytRegExp","highlightCode","embedYoutubePlayers","_youtube","hljs","codeblocks","querySelectorAll","highlightElement","anchors","a","onlyChild","parentNode","childNodes","parseYoutubeUrl","youtubeMovie","swapYoutubePlayer","youtube","video","start","player","replaceWith","wrap","cleanedUrl","cleanUrl","getVideoIdFromUrl","timebit","bits","parseInt","onebox","documentNode","find","revealSpoiler","nextProps","nextState","markup","author","undefined","node","btn","parent","addClass","PanelMessage","Default","Invalid","tooltip","format","fromNow","userTitle","css_class","is_tab","random","isReady","posts","PostingQuoteSelection","range","getQuoteSelection","rect","getBoundingClientRect","posting","globalState","getGlobalState","quote","getQuoteMarkup","focusEditor","default","onMouseUp","selected","onTouchEnd","position","left","scrollX","top","bottom","scrollY","reply","textarea","selectionStart","selectionEnd","container","getSelection","rangeCount","getRangeAt","isRangeContained","isPostContained","isAnyTextSelected","cloneContents","commonAncestorContainer","p","nodeName","dataset","noquote","child","nodeType","Node","TEXT_NODE","textContent","metadata","getQuoteMetadata","convertNodesToMarkup","prefix","suffix","codeBlock","getQuoteCodeBlock","syntax","isNodeInlineCodeBlock","isNodeElementWithQuoteMetadata","getQuoteMetadataFromNode","ELEMENT_NODE","isNodeCodeBlock","getNodeCodeBlockMeta","nodes","stack","convertNodeToMarkup","SIMPLE_NODE_MAPPINGS","H1","H2","H3","H4","H5","H6","STRONG","EM","DEL","B","U","I","SUB","SUP","toUpperCase","code","innerText","misagoReply","setGlobalState","clearGlobalState","attachments","attachment","isRemoved","MarkupAttachmentModal","is_image","filename","filetype","formatFilesize","uploaded_on","uploader","uploader_name","wrapSelection","def","newValue","caret","setSelectionRange","replaceSelection","end","createRange","moveStart","substring","scroll","scrollTop","thumb","getAttachmentMarkup","confirm","key","canProtect","empty","isProtected","submitText","showPreview","closePreview","enableProtection","disableProtection","MarkupCodeModal","ev","LANGUAGES","rows","MarkupFormattingHelpModal","ExampleFormatting","ExampleFormattingSpoiler","reveal","URL_PATTERN","isUrl","str","test","textUrl","file","maxSize","max_attachment_size","getRandomString","concat","refreshState","moment","updateAttachments","actions","insertSpoiler","input","createElement","multiple","parsed","stopPropagation","dataTransfer","onAttachmentsChange","clipboardData","kind","getAsFile","focused","atwho","at","displayTpl","insertTpl","searchKey","callbacks","remoteFilter","getJSON","q","on","_storage","source","headPos","endPos","setMentions","onDrop","onFocus","onPaste","onBlur","post_length_min","CLASS_ACTIVE","CLASS_DEFAULT","CLASS_MINIMIZED","CLASS_FULLSCREEN","fullscreen","minimized","minimize","fullscreenEnter","fullscreenExit","PostingThreadOptions","isClosed","isHidden","isPinned","hide","unhide","pinGlobally","pinLocally","unpin","icons","closed","hidden","pinned","getIcons","pin","categoryOptions","getTitleValidators","getPostValidators","config","loadSuccess","loadError","non_field_errors","dialogProps","onCancel","PostingDialogStart","Toolbar","showOptions","onTitleChange","onCategoryChange","onHide","onUnhide","onPinGlobally","onPinLocally","onUnpin","onPostChange","usernames","removedBlanks","pos","to","cleanUsernames","PostingDialogStartPrivate","onToChange","quoteText","newPost","context","onQuote","newContext","appendData","PostingDialogReply","originalPost","protect","is_protected","can_protect","originalPostSameAsCurrentPost","noAttachementsAdded","PostingDialogEditReply","mode","minLength","thread_title_length_min","limitValue","limit_value","show_value","maxLength","thread_title_length_max","post_length_max","validatePostLengthMin","choice","getChoice","Icon","getIcon","getLabel","change","showActivation","val","getActivationButton","is_banned","is_hidden","is_online_hidden","is_offline_hidden","is_online","is_offline","getClass","StatusIcon","StatusLabel","banned_until","ban_expires","last_click","getHelp","showStatus","Status","JoinDate","Posts","Threads","Followers","getStatClassName","followers","stat","colClassName","cols","list","Array","apply","Number","call","iconOn","iconOff","labelOn","labelOff","locale","misago_locale","momentAgo","momentAgoShort","dayAt","soonAt","tomorrowAt","yesterdayAt","minutesShort","hoursShort","daysShort","thisYearShort","otherYearShort","relativeNumeric","Intl","RelativeTimeFormat","numeric","DateTimeFormat","dateStyle","timeStyle","thisYearDate","month","day","otherYearDate","year","short","weekday","shortTime","absDiff","sign","minutes","hours","isSameDay","yesterday","setDate","getDate","isYesterday","isTomorrow","formatDayAtTime","getFullYear","getMonth","days","parts","formatToParts","isOrdered","_items","order","values","values_only","_order","unordered","ordered","ordering","insertItem","insertAt","splice","iterations","useLoader","silent","getAttribute","requests","onRemoveSelection","onAction","moderation","htmx","swap","tagName","control","button","selector","registerEvents","registerActions","registerElementValidator","strip","csrf","setAttribute","setFormControlValidationState","callValidationUrl","clearFormControlValidationMessages","clearFormControlValidationState","setFormControlErrorValidationState","setFormControlSuccessValidationState","set","removeSnackbars","replaceChildren","renderSnackbars","SNACKBAR_TTL","appendChild","isEventVisible","requestConfig","verb","xhr","getResponseHeader","parse","getResponseErrorMessage","updateTimestamp","timestamp","hasAttribute","updateLiveTimestamps","setInterval","loader","AjaxLoader","_initializers","_context","initializer","OrderedList","orderedValues","fallback","has","snackbars","BulkModeration","show","patch","AUTH_SYNC_RATE","storage","include","AcceptAgreement","submiting","accept","reload","handleDecline","handleAccept","mount","signedIn","signedOut","getMessage","refresh","AuthMessage","NavbarBranding","logo","logoXs","NavbarExtraMenu","NotificationsDropdownBody","showAll","showUnread","unread","NotificationsDropdownBodyPill","active","NotificationsFetch","NavbarNotificationsToggle","badge","NavbarNotificationsDropdown","NavbarPrivateThreads","NavbarSearchToggle","NavbarSearchDropdown","Search","NavbarSiteNavToggle","NavbarSiteNavDropdown","SiteNav","NavbarUserNavToggle","NavbarUserNavDropdown","UserNav","branding","logo_small","logo_text","extraMenuItems","searchUrl","notificationsUrl","privateThreadsUrl","showSearch","can_search","addInitializer","ReactDOM","NotificationsOverlayBody","NotificationsOverlayBodyPill","NotificationsOverlay","notifications","NotificationsHeader","PageHeader","subtitle","PillsNav","PillsNavLink","link","NotificationsPills","basename","NotificationsPagination","NotificationsPaginationLink","hasPrevious","firstCursor","lastCursor","hasNext","NotificationsToolbar","markAllAsRead","getSubtitle","route","getBaseUrl","PageContainer","readAll","mutating","toolbarProps","history","replaceState","browserHistory","routes","NotificationsRoute","startsWith","expires_on","initWithPreloadedData","initWithoutPreloadedData","startPolling","profile","polls","poll","frequency","user_message","html","staff_message","isAfter","keys","getUserMessage","getStaffMessage","getExpirationMessage","getPanelBody","fieldname","fields","help_text","groups","group","f","initial","CancelButton","cancel","FormDisplay","isAuthenticated","SafeValue","onEdit","showEditButton","details","load","editing","newDetails","loadDetails","profileDetails","edit","edit_details","loadItems","next","Feed","loadMore","LoadMoreButton","isBusy","loadUsers","page","more","pages","setSpecialProps","PRELOADED_DATA_KEY","TITLE","API_FILTER","hydrate","apiUrl","getEmptyMessage","getMoreButton","getListBody","changed_by","changed_by_username","renderUserAvatar","renderUsername","old_username","new_username","changed_on","changes","hiddenOnMobile","loadChanges","is_followed","follow","action","canMessage","can_start_private_threads","isProfileOwner","is_avatar_locked","avatar_lock_user_message","avatar_lock_staff_message","moderate_avatar","avatar_hash","getFormBody","getModalBody","moderate_username","addNameChange","updateUsername","slug","countdown","isDeleted","with_content","getButtonLabel","getDeletedBody","getForm","AvatarControls","ChangeUsername","DeleteAccount","showAvatarDialog","rename","showRenameDialog","showDeleteDialog","is_active","ProfileModerationButton","FlexRow","available","getModeration","can_follow","WithDropdown","delete","is_anonymous","can_rename","can_moderate_avatar","can_delete","COMPONENTS","follows","Follows","Details","UsernameHistory","BanDetails","paths","Profile","RequestLinkForm","LinkSent","reset","RequestActivationLink","RequestResetForm","showInactivePage","AccountInactivePage","getActivateButton","RequestPasswordReset","ResetPasswordForm","PasswordChangedPage","SignInModal","showSignIn","updateSearch","urlQuery","pushState","providers","provider","updateUsers","updatePosts","onQueryChange","Badge","SearchTime","time","copy","LoadMore","appendPosts","updateProvider","Blankslate","components","TYPES_CLASSES","info","warning","Snackbar","snackbarClass","isVisible","getSnackbarClass","backendName","pageTitleTpl","pageTitle","backend","Register","emailProtected","onRegistrationComplete","step","stateUpdate","backend_name","emailHelpText","emailHelpTextTpl","SocialAuth","handleRegistrationComplete","op","updateAcl","participants","ModalHeader","onUsernameChange","can_add_participants","participant","confirmed","isUser","is_owner","can_change_owner","isModerator","can_moderate_private_threads","userIsOwner","UserStatus","isOwner","getUserIsOwner","utils","PollChoice","hash","proc","votes","getVotesLabel","ChoiceVotes","UserChoice","hydratedData","voters","voter","voted_on","ModalBody","ChoicesList","ChoiceDetails","VotesCount","VotesList","Voter","VoteDate","isPollOver","showVoting","is_public","can_edit","can_see_votes","can_vote","hasSelectedChoices","allow_revotes","controls","canVote","canChangeVote","ChangeVote","SeeVotes","Edit","Delete","newThreadAcl","DATE_ABBR","PollVotes","PollLength","PollIsPublic","PollCreation","getPoster","getPostedOn","absolute","relative","ends_on","getEndsOn","endsOn","question","PollChoicesLeft","choicesLeft","PollAllowRevote","ChoiceSelect","toggleChoice","getChoicesLeft","allowed_choices","getChoiceFromHash","deselectChoice","selectChoice","showResults","getIsPollOver","setChoices","canDelete","onDelete","onAdd","every","isEdit","PollPublicSwitch","ICON","changed_title","pinned_globally","pinned_locally","unpinned","moved","merged","approved","opened","unhid","hid","changed_owner","tookover","added_participant","owner_left","participant_left","removed_participant","event_type","can_hide","Hide","Unhide","hidden_on","hidden_by_name","hidden_by","USER_SPAN","USER_URL","Hidden","Poster","event_by","event_on","MESSAGE","ITEM_LINK","ITEM_SPAN","ChangedTitle","Moved","Merged","ChangedOwner","AddedParticipant","RemovedParticipant","msgstring","oldTitle","event_context","old_title","fromCategory","from_category","mergedThread","merged_thread","newOwner","is_read","initialized","observer","IntersectionObserver","entries","observe","entry","isIntersecting","primed","read","destroy","disconnect","ready","initialize","AttachmentPreview","AttachmentDetails","AttachmentThumbnail","AttachmentIcon","backgroundImage","can_see_hidden","Row","FlagBestAnswer","best_answer","best_answer_marked_by","marked_on","best_answer_marked_on","marked_by","best_answer_marked_by_name","FlagHidden","FlagUnapproved","is_unapproved","FlagProtected","approve","unprotect","like","lastLikes","last_likes","concatedLikes","finalLikes","is_liked","likes","unlike","previousState","ops","markAsBestAnswer","best_answer_is_protected","best_answer_marked_by_slug","patchThread","unmarkBestAnswer","hydrateLike","ModalDialog","LikesList","liked_on","likesCount","LikeDetails","liker_id","LikeDate","likedOn","can_reply","can_see_likes","can_like","MarkAsBestAnswer","MarkAsBestAnswerCompact","Like","Likes","LikesCompact","Reply","Quote","can_mark_best_answer","can_mark_as_best_answer","can_change_best_answer","hasLikes","getLikesMessage","u","hiddenLikes","otherUsers","lastUser","usernamesList","last_user","editor","move","new_thread","onUrlChange","DiffItem","revertEdit","canRevert","goToEdit","previous","GoBackBtn","goBack","GoForwardBtn","goForward","GoLastBtn","goLast","Label","RevertBtn","editor_name","edited_on","edited_by","hydrateEdit","edits","hydratedPost","PostingConfig","ModerationForm","isError","Error","Loader","categoryId","can_pin_threads","weight","can_hide_threads","can_close_threads","is_closed","isHiddenChoices","isClosedChoices","getWeightChoices","Modal","renderWeightField","renderHiddenField","renderClosedField","Permalink","UnmarkMarkBestAnswer","PostEdits","Approve","Move","Split","Protect","Unprotect","permaUrl","protocol","host","prompt","can_unmark_best_answer","isUnedited","can_approve","can_move","can_unhide","isSelected","can_merge_posts","UnreadLabel","UnreadCompact","PostedOn","PostedOnCompact","PostEditsCompacts","ProtectedLabel","postAuthor","hasAcl","hasVisibleTitle","ListItem","is_event","has_poll","has_unapproved_posts","replies","starter","starter_name","started_on","handleSuccessUnmounted","bestAnswer","BestAnswerSelect","bestAnswers","onBestAnswerChange","PollSelect","onPollChange","best_answers","merge","other_thread","post_set","ModalMessage","ModalLoading","successMessage","changeTitle","dropup","stickToBottom","watch","setNotifications","special_role","breadcrumbs","hasFlags","is_authenticated","enabled","resetScroll","ThreadPaginatorConnected","withRouter","router","scrollToTop","first","formData","min","max","PostErrors","heading","ids","rollback","isArray","Merge","can_merge","onReply","compact","is_new","new_post","unapproved_post","last_post","pollDisabled","onPoll","can_start_poll","setPageTitle","editPoll","shouldFetchData","fetchData","startPollingApi","stopPollingApi","params","delayed","threadModeration","getThreadModeration","postsModeration","getPostsModeration","openPollForm","openReplyForm","closePollForm","can_close","can_pin_globally","can_pin","can_unprotect","basePath","Route","getPageUrl","trackedPeriod","rankUrl","getUserStatus","getRankName","getUserTitle","counter","meta","posters","getLeadMessage","tracked_period","string","subString","n","stringCount","description","getRankDescription","getComponent","Rank","ActivePosters","Users","_element","_component","removeClass","attr","forum_index_title","reducer","initialState","array","SELECT_ALL","SELECT_NONE","SELECT_ITEM","APPEND_THREADS","DELETE_THREAD","FILTER_THREADS","HYDRATE_THREADS","PATCH_THREAD","SORT_THREADS","MODERATION_PERMISSIONS","hydrateThread","thread_acl","perm","mergedState","concatUnique","sort","sorting","itemCategory","categoriesMap","lft","rght","patchedState","doTick","UPDATE_AUTHENTICATED_USER","PATCH_USER","SIGN_IN","SIGN_OUT","signIn","signOut","soft","updatedState","UPDATE_AVATAR","userId","UPDATE_USERNAME","OPEN_SITE_NAV","OPEN_SEARCH","OPEN_NOTIFICATIONS","OPEN_PRIVATE_THREADS","OPEN_USER_NAV","CLOSE","openSiteNav","openSearch","openNotifications","openUserNav","privateThreads","REPLACE_PARTICIPANTS","BUSY_POLL","RELEASE_POLL","REMOVE_POLL","REPLACE_POLL","UPDATE_POLL","busy","release","hydrated","PATCH_POST","updated_on","hydrateAttachment","hydrateUser","APPEND_POSTS","SELECT_POST","DESELECT_POST","DESELECT_POSTS","LOAD_POSTS","UNLOAD_POSTS","UPDATE_POSTS","deselect","deselectAll","hydratePost","unload","selectedPosts","deseletedPosts","deseletedAllPosts","resultsIds","reducedPosts","postReducer","LOAD_DETAILS","HYDRATE_PROFILE","PATCH_PROFILE","hydrateStatus","REPLACE_SEARCH","UPDATE_SEARCH","UPDATE_SEARCH_PROVIDER","SHOW_SNACKBAR","HIDE_SNACKBAR","showSnackbar","messageType","hideSnackbar","BUSY_THREAD","RELEASE_THREAD","REPLACE_THREAD","UPDATE_THREAD","UPDATE_THREAD_ACL","last_post_on","TICK","ADD_NAME_CHANGE","APPEND_HISTORY","HYDRATE_HISTORY","changedBy","hydrateNamechange","namechange","unshift","floor","APPEND_USERS","HYDRATE_USERS","_cookieName","_csrfToken","_locks","self","resolve","reject","getCsrfToken","contentType","dataType","jqXHR","responseJSON","statusText","lock","param","waiter","wait","processData","XMLHttpRequest","evt","lengthComputable","total","local","_store","_local","_modal","syncSession","watchState","getState","BaseCaptcha","_ajax","_include","_snackbar","NoCaptcha","QACaptcha","kwargs","ReCaptchaComponent","grecaptcha","render","sitekey","siteKey","binding","ReCaptcha","recaptcha_site_key","captcha_type","_captcha","init","staticUrl","_staticUrl","_included","script","remote","localStorage","_prefix","_watchers","e","newValueJson","watcher","oldValue","setItem","itemString","getItem","indexTitle","forumName","_indexTitle","_forumName","finalTitle","_polls","stop","poolServer","_stopped","apiError","pollId","unsetBeforeUnload","_props","_isOpen","_isClosing","_mount","_observer","unobserve","_spacer","_mode","ResizeObserver","contentRect","_beforeunloadSet","beforeUnload","capture","returnValue","_realOpen","setBeforeUnload","_timeout","alert","_reducers","_initialState","createStore","combineReducers","_isLoaded","_loadedPromise","_loadingPromise","tries","plain","expires","getReasonMessage","RedrawedBannedPage","BannedPage","changeState","rowWidth","padding","b","m","bytes","roundSize","toFixed","ALPHA","ALPHA_LEN","len","chars","Component","rootElementId","connected","rootElement","finalComponent","int","childRoutes","onEnter","EMAIL","USERNAME","USERNAME_ALPHANUMERIC","String","requiredTermsOfService","requiredPrivacyPolicy","returnMessage","usernameMinLength","lengthMin","usernameMaxLength","lengthMax","usernameContent","valueTrimmed","webpackContext","req","webpackContextResolve","__webpack_require__","o","module","exports","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","r","getter","__esModule","d","definition","defineProperty","enumerable","chunkId","reduce","promises","miniCssF","g","globalThis","Function","hmd","create","obj","prop","prototype","l","done","needAttach","scripts","getElementsByTagName","s","charset","nc","onScriptComplete","prev","onerror","onload","doneFns","removeChild","bind","head","Symbol","toStringTag","nmd","scriptUrl","importScripts","currentScript","installedChunks","installedChunkData","errorType","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/misago/templates/misago/posting/select_category_modal.html b/misago/templates/misago/posting/select_category/modal.html similarity index 90% rename from misago/templates/misago/posting/select_category_modal.html rename to misago/templates/misago/posting/select_category/modal.html index b3509a0c53..13aedfb983 100644 --- a/misago/templates/misago/posting/select_category_modal.html +++ b/misago/templates/misago/posting/select_category/modal.html @@ -8,7 +8,7 @@

    {% trans "Start new thread in" context "posting select