Просмотр исходного кода

Update py to 3.10 and bump requirements (#1388)

* Update py to 3.10 and bump requirements

* WIP: move tests to github action

* Tweak gh workflow

* Move to ariadne_django

* Update apps

* Bump bleach

* Fix import errors for markup lib

* Adjusted urls to new django version (#1389)

* adjusted urls to new django version

* tweak

* tweak

* changed re_path to path

* fixed next url warnings

* Remove SSO, WIP fix message parser

* Fix build

* Update deps

* Add python-coveralls

* Replace python-coveralls with coveralls

* Add some tweaks to markup parser

* Update py deps fields (#1391)

Fix warnings for new Django version (urlconfs, JSON field in models, etc ect)

* Fix tests, cleanup code a little

* Resolve warnings for is_ajax and signals

* Fix tests, format with black

* Update translation files

Co-authored-by: raydeal <alnw@interia.eu>
Rafał Pitoń 2 лет назад
Родитель
Сommit
71d91fc355
190 измененных файлов с 35815 добавлено и 5421 удалено
  1. 37 0
      .github/workflows/tests.yml
  2. 0 25
      .travis.yml
  3. 1 1
      Dockerfile
  4. 13 8
      dev
  5. 4 3
      devproject/settings.py
  6. 0 29
      devproject/test_settings.py
  7. 6 8
      devproject/urls.py
  8. 9 13
      frontend/src/components/options/root.js
  9. 24 48
      frontend/src/components/user-menu/guest-nav.js
  10. 0 2
      misago/acl/__init__.py
  11. 7 7
      misago/acl/admin/__init__.py
  12. 1 2
      misago/acl/migrations/0001_initial.py
  13. 1 2
      misago/acl/models.py
  14. 0 2
      misago/admin/__init__.py
  15. 8 9
      misago/admin/urlpatterns.py
  16. 3 3
      misago/admin/urls.py
  17. 3 3
      misago/analytics/urls.py
  18. 0 1
      misago/cache/__init__.py
  19. 0 2
      misago/categories/__init__.py
  20. 17 17
      misago/categories/admin/__init__.py
  21. 1 2
      misago/categories/migrations/0001_initial.py
  22. 1 1
      misago/categories/signals.py
  23. 5 5
      misago/categories/urls/__init__.py
  24. 0 2
      misago/conf/__init__.py
  25. 9 23
      misago/conf/admin/__init__.py
  26. 0 1
      misago/conf/admin/forms/__init__.py
  27. 0 53
      misago/conf/admin/forms/sso.py
  28. 0 5
      misago/conf/admin/tests/test_change_settings_views.py
  29. 0 47
      misago/conf/admin/tests/test_enabling_sso.py
  30. 0 6
      misago/conf/admin/views.py
  31. 0 1
      misago/conf/context_processors.py
  32. 1 2
      misago/conf/migrations/0001_initial.py
  33. 24 0
      misago/conf/migrations/0006_remove_sso_settings.py
  34. 0 1
      misago/conf/models.py
  35. 0 3
      misago/core/__init__.py
  36. 0 9
      misago/core/decorators.py
  37. 12 3
      misago/core/errorpages.py
  38. 13 5
      misago/core/middleware.py
  39. 39 41
      misago/core/testproject/urls.py
  40. 15 12
      misago/core/tests/test_exceptionhandler_middleware.py
  41. 8 7
      misago/core/tests/test_frontendcontext_middleware.py
  42. 2 2
      misago/core/utils.py
  43. 0 1
      misago/faker/__init__.py
  44. 0 1
      misago/graphql/__init__.py
  45. 4 4
      misago/graphql/admin/__init__.py
  46. 2 2
      misago/healthcheck/urls.py
  47. 0 1
      misago/icons/__init__.py
  48. 3 3
      misago/icons/admin/__init__.py
  49. 0 1
      misago/legal/__init__.py
  50. 10 10
      misago/legal/admin/__init__.py
  51. 3 3
      misago/legal/urls/__init__.py
  52. 2 2
      misago/legal/urls/api.py
  53. BIN
      misago/locale/de/LC_MESSAGES/django.mo
  54. 7963 0
      misago/locale/de/LC_MESSAGES/django.po
  55. BIN
      misago/locale/de/LC_MESSAGES/djangojs.mo
  56. 51 55
      misago/locale/de/LC_MESSAGES/djangojs.po
  57. BIN
      misago/locale/en/LC_MESSAGES/django.mo
  58. 222 350
      misago/locale/en/LC_MESSAGES/django.po
  59. BIN
      misago/locale/en/LC_MESSAGES/djangojs.mo
  60. 79 86
      misago/locale/en/LC_MESSAGES/djangojs.po
  61. BIN
      misago/locale/es/LC_MESSAGES/django.mo
  62. 193 308
      misago/locale/es/LC_MESSAGES/django.po
  63. BIN
      misago/locale/es/LC_MESSAGES/djangojs.mo
  64. 88 93
      misago/locale/es/LC_MESSAGES/djangojs.po
  65. BIN
      misago/locale/et/LC_MESSAGES/django.mo
  66. 7963 0
      misago/locale/et/LC_MESSAGES/django.po
  67. BIN
      misago/locale/et/LC_MESSAGES/djangojs.mo
  68. 50 53
      misago/locale/et/LC_MESSAGES/djangojs.po
  69. BIN
      misago/locale/fr/LC_MESSAGES/django.mo
  70. 241 365
      misago/locale/fr/LC_MESSAGES/django.po
  71. BIN
      misago/locale/fr/LC_MESSAGES/djangojs.mo
  72. 89 93
      misago/locale/fr/LC_MESSAGES/djangojs.po
  73. BIN
      misago/locale/ko/LC_MESSAGES/django.mo
  74. 7963 0
      misago/locale/ko/LC_MESSAGES/django.po
  75. BIN
      misago/locale/ko/LC_MESSAGES/djangojs.mo
  76. 141 94
      misago/locale/ko/LC_MESSAGES/djangojs.po
  77. BIN
      misago/locale/nl/LC_MESSAGES/django.mo
  78. 7963 0
      misago/locale/nl/LC_MESSAGES/django.po
  79. BIN
      misago/locale/nl/LC_MESSAGES/djangojs.mo
  80. 52 56
      misago/locale/nl/LC_MESSAGES/djangojs.po
  81. BIN
      misago/locale/pl/LC_MESSAGES/django.mo
  82. 173 289
      misago/locale/pl/LC_MESSAGES/django.po
  83. BIN
      misago/locale/pl/LC_MESSAGES/djangojs.mo
  84. 95 104
      misago/locale/pl/LC_MESSAGES/djangojs.po
  85. BIN
      misago/locale/pt_BR/LC_MESSAGES/django.mo
  86. 250 389
      misago/locale/pt_BR/LC_MESSAGES/django.po
  87. BIN
      misago/locale/pt_BR/LC_MESSAGES/djangojs.mo
  88. 107 117
      misago/locale/pt_BR/LC_MESSAGES/djangojs.po
  89. BIN
      misago/locale/ru/LC_MESSAGES/django.mo
  90. 212 328
      misago/locale/ru/LC_MESSAGES/django.po
  91. BIN
      misago/locale/ru/LC_MESSAGES/djangojs.mo
  92. 73 76
      misago/locale/ru/LC_MESSAGES/djangojs.po
  93. BIN
      misago/locale/tr/LC_MESSAGES/django.mo
  94. 214 333
      misago/locale/tr/LC_MESSAGES/django.po
  95. BIN
      misago/locale/tr/LC_MESSAGES/djangojs.mo
  96. 76 83
      misago/locale/tr/LC_MESSAGES/djangojs.po
  97. BIN
      misago/locale/zh_Hans/LC_MESSAGES/django.mo
  98. 317 329
      misago/locale/zh_Hans/LC_MESSAGES/django.po
  99. BIN
      misago/locale/zh_Hans/LC_MESSAGES/djangojs.mo
  100. 84 74
      misago/locale/zh_Hans/LC_MESSAGES/djangojs.po
  101. 0 2
      misago/markup/__init__.py
  102. 82 2
      misago/markup/bbcode/code.py
  103. 35 37
      misago/markup/bbcode/inline.py
  104. 7 7
      misago/markup/bbcode/quote.py
  105. 8 8
      misago/markup/bbcode/spoiler.py
  106. 15 12
      misago/markup/md/shortimgs.py
  107. 2 2
      misago/markup/md/strikethrough.py
  108. 25 25
      misago/markup/parser.py
  109. 8 8
      misago/markup/tests/snapshots/snap_test_code_bbcode.py
  110. 26 0
      misago/markup/tests/snapshots/snap_test_code_md.py
  111. 29 0
      misago/markup/tests/snapshots/snap_test_escaping.py
  112. 25 7
      misago/markup/tests/snapshots/snap_test_inline_bbcode.py
  113. 3 3
      misago/markup/tests/test_code_bbcode.py
  114. 31 0
      misago/markup/tests/test_code_md.py
  115. 26 0
      misago/markup/tests/test_escaping.py
  116. 35 0
      misago/markup/tests/test_inline_bbcode.py
  117. 2 2
      misago/markup/urls.py
  118. 0 2
      misago/menus/__init__.py
  119. 9 9
      misago/menus/admin/__init__.py
  120. 0 1
      misago/readtracker/__init__.py
  121. 1 1
      misago/readtracker/signals.py
  122. 0 3
      misago/search/__init__.py
  123. 3 3
      misago/search/urls/__init__.py
  124. 3 3
      misago/search/urls/api.py
  125. 0 2
      misago/socialauth/__init__.py
  126. 10 12
      misago/socialauth/admin/__init__.py
  127. 1 2
      misago/socialauth/migrations/0001_initial.py
  128. 1 2
      misago/socialauth/models.py
  129. 0 8
      misago/socialauth/tests/test_begin_auth.py
  130. 3 3
      misago/socialauth/urls.py
  131. 0 3
      misago/socialauth/views.py
  132. 0 1
      misago/sso/__init__.py
  133. 0 34
      misago/sso/api.py
  134. 0 11
      misago/sso/apps.py
  135. 0 56
      misago/sso/client.py
  136. 0 0
      misago/sso/tests/__init__.py
  137. 0 69
      misago/sso/tests/test_sso_sync_api.py
  138. 0 213
      misago/sso/tests/test_sso_views.py
  139. 0 60
      misago/sso/tests/test_user_data_validation.py
  140. 0 85
      misago/sso/tests/test_user_syncing.py
  141. 0 6
      misago/sso/tests/utils.py
  142. 0 14
      misago/sso/urls.py
  143. 0 43
      misago/sso/user.py
  144. 0 35
      misago/sso/validators.py
  145. 1 1
      misago/static/misago/js/misago.js
  146. 0 0
      misago/static/misago/js/misago.js.map
  147. 0 10
      misago/templates/misago/admin/conf/sso_settings.html
  148. 0 6
      misago/templates/misago/admin/conf/users_settings.html
  149. 0 6
      misago/templates/misago/admin/socialauth/list.html
  150. 0 2
      misago/themes/__init__.py
  151. 30 30
      misago/themes/admin/__init__.py
  152. 0 1
      misago/threads/__init__.py
  153. 10 12
      misago/threads/admin/__init__.py
  154. 4 5
      misago/threads/migrations/0001_initial.py
  155. 1 2
      misago/threads/models/poll.py
  156. 3 4
      misago/threads/models/post.py
  157. 2 2
      misago/threads/serializers/moderation.py
  158. 2 2
      misago/threads/signals.py
  159. 32 34
      misago/threads/urls/__init__.py
  160. 22 22
      misago/urls.py
  161. 0 2
      misago/users/__init__.py
  162. 25 25
      misago/users/admin/__init__.py
  163. 0 12
      misago/users/api/auth.py
  164. 1 1
      misago/users/api/mention.py
  165. 0 23
      misago/users/api/users.py
  166. 0 9
      misago/users/apps.py
  167. 2 2
      misago/users/avatars/dynamic.py
  168. 2 2
      misago/users/avatars/store.py
  169. 1 2
      misago/users/migrations/0001_initial.py
  170. 17 0
      misago/users/migrations/0023_remove_user_sso_id.py
  171. 1 1
      misago/users/models/deleteduser.py
  172. 2 4
      misago/users/models/user.py
  173. 0 13
      misago/users/tests/test_activation_views.py
  174. 0 24
      misago/users/tests/test_auth_api.py
  175. 0 16
      misago/users/tests/test_forgottenpassword_views.py
  176. 0 10
      misago/users/tests/test_options_views.py
  177. 14 12
      misago/users/tests/test_realip_middleware.py
  178. 0 8
      misago/users/tests/test_user_changeemail_api.py
  179. 0 8
      misago/users/tests/test_user_changepassword_api.py
  180. 0 12
      misago/users/tests/test_user_create_api.py
  181. 0 5
      misago/users/tests/test_user_username_api.py
  182. 0 5
      misago/users/tests/test_users_api.py
  183. 52 52
      misago/users/urls/__init__.py
  184. 10 10
      misago/users/urls/api.py
  185. 0 5
      misago/users/views/activation.py
  186. 2 2
      misago/users/views/auth.py
  187. 2 16
      misago/users/views/forgottenpassword.py
  188. 0 6
      misago/users/views/options.py
  189. 16 13
      requirements.in
  190. 224 67
      requirements.txt

+ 37 - 0
.github/workflows/tests.yml

@@ -0,0 +1,37 @@
+name: Tests
+
+on: [push]
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    services:
+        postgres:
+          image: postgres:11
+          env:
+            POSTGRES_USER: misago
+            POSTGRES_PASSWORD: misago
+            POSTGRES_DB: misago
+          ports:
+            - 5432:5432
+    steps:
+      - uses: actions/checkout@v1
+      - name: Set up Python 3.10
+        uses: actions/setup-python@v1
+        with:
+          python-version: "3.10"
+      - name: Install dependencies
+        run: |
+          python -m pip install --upgrade pip
+          pip install -e .
+      - name: Test with pytest
+        env:
+          DJANGO_SETTINGS_MODULE: devproject.test_settings
+          COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
+          POSTGRES_DB: misago
+          POSTGRES_USER: misago
+          POSTGRES_PASSWORD: misago
+          POSTGRES_HOST: localhost
+        run: |
+          pytest --cov=misago
+          coveralls

+ 0 - 25
.travis.yml

@@ -1,25 +0,0 @@
-dist: xenial
-language: python
-jobs:
-  include:
-    - python:
-        - 3.7
-      addons:
-        postgresql: 9.6
-      install:
-        - pip install -U pip setuptools
-        - python setup.py install
-        - pip install coveralls pytest-cov
-      before_script:
-        - psql -c "create database travis_ci_test;" -U postgres
-      script:
-        - pytest --cov=misago
-      after_success:
-        - coveralls
-    - name: "lint"
-      python: 3.7
-      install:
-        - pip install -U pip setuptools
-        - pip install black
-      script:
-        - black --check devproject misago

+ 1 - 1
Dockerfile

@@ -1,7 +1,7 @@
 # This dockerfile is only meant for local development of Misago
 # If you are looking for a proper docker setup for running Misago in production,
 # please use misago-docker instead
-FROM python:3.7
+FROM python:3.10
 
 ENV PYTHONUNBUFFERED 1
 ENV IN_MISAGO_DOCKER 1

+ 13 - 8
dev

@@ -205,15 +205,20 @@ makemessages() {
 # Docker part of makemessages
 makemessages_in_docker() {
     require_in_docker
-    
-    echo "Extracting messages for $1 language:"
     cd ./misago
 
-    echo "Processing .py and .html files..."
-    django-admin.py makemessages -l $1 -e html,txt,py > /dev/null
+    if [[ $1 ]]; then
+        echo "Extracting messages for $1 language:"
+        echo "Processing .py and .html files..."
+        django-admin makemessages -l $1 --no-obsolete -e html,txt,py > /dev/null
 
-    echo "Processing .js files..."
-    django-admin.py makemessages -l $1 -d djangojs > /dev/null
+        echo "Processing .js files..."
+        django-admin makemessages -l $1 --no-obsolete -d djangojs > /dev/null
+    else
+        echo "Extracting messages for all languages:"
+        django-admin makemessages --all --no-obsolete -e html,txt,py > /dev/null
+        django-admin makemessages --all --no-obsolete -d djangojs > /dev/null
+    fi
 }
 
 # Compile messages
@@ -225,7 +230,7 @@ compilemessages() {
 compilemessages_in_docker() {
     require_in_docker
     cd ./misago
-    django-admin.py compilemessages
+    django-admin compilemessages
 }
 
 # Pull translation files from transifex
@@ -297,7 +302,7 @@ if [[ $1 ]]; then
     elif [[ $1 = "test" ]]; then
         test $@
     elif [[ $1 = "makemessages" ]]; then
-        makemessages ${2:-en}
+        makemessages $2
     elif [[ $1 = "makemessages_in_docker" ]]; then
         makemessages_in_docker $2
     elif [[ $1 = "compilemessages" ]]; then

+ 4 - 3
devproject/settings.py

@@ -175,7 +175,7 @@ INSTALLED_APPS = INSTALLED_PLUGINS + [
     "django.contrib.messages",
     "django.contrib.staticfiles",
     # 3rd party apps used by Misago
-    "ariadne.contrib.django",
+    "ariadne_django",
     "celery",
     "debug_toolbar",
     "mptt",
@@ -200,7 +200,6 @@ INSTALLED_APPS = INSTALLED_PLUGINS + [
     "misago.graphql",
     "misago.faker",
     "misago.menus",
-    "misago.sso",
     "misago.plugins",
 ]
 
@@ -265,7 +264,7 @@ SOCIAL_AUTH_PIPELINE = (
     "misago.socialauth.pipeline.require_activation",
 )
 
-SOCIAL_AUTH_POSTGRES_JSONFIELD = True
+SOCIAL_AUTH_JSONFIELD_ENABLED = True
 
 TEMPLATES = [
     {
@@ -427,3 +426,5 @@ EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
 DEBUG_TOOLBAR_CONFIG = {
     "SHOW_TOOLBAR_CALLBACK": "misago.conf.debugtoolbar.enable_debug_toolbar"
 }
+
+DEFAULT_AUTO_FIELD = "django.db.models.AutoField"

+ 0 - 29
devproject/test_settings.py

@@ -1,19 +1,5 @@
-import os
-
 from .settings import *  # pylint: disable-all
 
-# Use test DB
-DATABASES = {
-    "default": {
-        "ENGINE": "django.db.backends.postgresql_psycopg2",
-        "NAME": os.environ.get("POSTGRES_TEST_DB"),
-        "USER": os.environ.get("POSTGRES_USER"),
-        "PASSWORD": os.environ.get("POSTGRES_PASSWORD"),
-        "HOST": os.environ.get("POSTGRES_HOST"),
-        "PORT": 5432,
-    }
-}
-
 # Use in-memory cache
 CACHES = {"default": {"BACKEND": "django.core.cache.backends.dummy.DummyCache"}}
 
@@ -54,18 +40,3 @@ MISAGO_POST_SEARCH_FILTERS = ["misago.core.testproject.searchfilters.test_filter
 
 # Default test name
 TEST_NAME = "miasago_test"
-
-# Additional overrides for Travis-CI
-if os.environ.get("TRAVIS"):
-    DATABASES = {
-        "default": {
-            "ENGINE": "django.db.backends.postgresql_psycopg2",
-            "NAME": "travis_ci_test",
-            "USER": "postgres",
-            "PASSWORD": "",
-            "HOST": "127.0.0.1",
-            "PORT": "",
-        }
-    }
-
-    TEST_NAME = "travis_ci_test"

+ 6 - 8
devproject/urls.py

@@ -14,9 +14,9 @@ Including another URLconf
     2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
 """
 from django.conf import settings
-from django.conf.urls import include, url
 from django.conf.urls.static import static
 from django.contrib import admin
+from django.urls import include, path
 from django.utils import timezone
 from django.views.decorators.cache import cache_page
 from django.views.decorators.http import last_modified
@@ -30,10 +30,10 @@ admin.site.login_form = AdminAuthenticationForm
 
 
 urlpatterns = [
-    url(r"^", include("misago.urls", namespace="misago")),
+    path("", include("misago.urls", namespace="misago")),
     # Javascript translations
-    url(
-        r"^django-i18n.js$",
+    path(
+        "django-i18n.js",
         last_modified(lambda req, **kw: timezone.now())(
             cache_page(86400 * 2, key_prefix="misagojsi18n")(
                 JavaScriptCatalog.as_view(packages=["misago"])
@@ -42,9 +42,7 @@ urlpatterns = [
         name="django-i18n",
     ),
     # Uncomment next line if you plan to use Django admin for 3rd party apps
-    url(r"^django-admin/", admin.site.urls),
-    # django-simple-sso doesn't have namespaces, we can't use namespace here
-    url(r"^sso/", include("misago.sso.urls")),
+    path("django-admin/", admin.site.urls),
 ]
 
 
@@ -52,7 +50,7 @@ urlpatterns = [
 if settings.DEBUG:
     import debug_toolbar
 
-    urlpatterns += [url(r"^__debug__/", include(debug_toolbar.urls))]
+    urlpatterns += [path("__debug__/", include(debug_toolbar.urls))]
 
 
 # Use static file server for static and media files (debug only)

+ 9 - 13
frontend/src/components/options/root.js

@@ -56,8 +56,6 @@ export function select(store) {
 }
 
 export function paths() {
-  const SSO_ENABLED = misago.get("SETTINGS").enable_sso
-
   const paths = [
     {
       path: misago.get("USERCP_URL") + "forum-options/",
@@ -69,16 +67,14 @@ export function paths() {
     }
   ]
 
-  if (!SSO_ENABLED) {
-    paths.push({
-      path: misago.get("USERCP_URL") + "change-username/",
-      component: connect(select)(ChangeUsername)
-    })
-    paths.push({
-      path: misago.get("USERCP_URL") + "sign-in-credentials/",
-      component: connect(select)(ChangeSignInCredentials)
-    })
-  }
+  paths.push({
+    path: misago.get("USERCP_URL") + "change-username/",
+    component: connect(select)(ChangeUsername)
+  })
+  paths.push({
+    path: misago.get("USERCP_URL") + "sign-in-credentials/",
+    component: connect(select)(ChangeSignInCredentials)
+  })
 
   if (misago.get("ENABLE_DOWNLOAD_OWN_DATA")) {
     paths.push({
@@ -87,7 +83,7 @@ export function paths() {
     })
   }
 
-  if (!SSO_ENABLED && misago.get("ENABLE_DELETE_OWN_ACCOUNT")) {
+  if (misago.get("ENABLE_DELETE_OWN_ACCOUNT")) {
     paths.push({
       path: misago.get("USERCP_URL") + "delete-account/",
       component: connect(select)(DeleteAccount)

+ 24 - 48
frontend/src/components/user-menu/guest-nav.js

@@ -26,33 +26,20 @@ export class GuestMenu extends React.Component {
             )}
           </p>
           <div className="row">
-            {misago.get("SETTINGS").enable_sso ? (
-              <div className="col-xs-12">
-                <a
-                  className="btn btn-primary btn-register btn-block"
-                  href={misago.get("SETTINGS").SSO_LOGIN_URL}
-                >
-                  {gettext("Sign in")}
-                </a>
-              </div>
-            ) : (
-              <div className="col-xs-6">
-                <button
-                  className="btn btn-default btn-sign-in btn-block"
-                  onClick={this.showSignInModal}
-                  type="button"
-                >
-                  {gettext("Sign in")}
-                </button>
-              </div>
-            )}
-            {!misago.get("SETTINGS").enable_sso && (
-              <div className="col-xs-6">
-                <RegisterButton className="btn-primary btn-register btn-block">
-                  {gettext("Register")}
-                </RegisterButton>
-              </div>
-            )}
+            <div className="col-xs-6">
+              <button
+                className="btn btn-default btn-sign-in btn-block"
+                onClick={this.showSignInModal}
+                type="button"
+              >
+                {gettext("Sign in")}
+              </button>
+            </div>
+            <div className="col-xs-6">
+              <RegisterButton className="btn-primary btn-register btn-block">
+                {gettext("Register")}
+              </RegisterButton>
+            </div>
           </div>
         </li>
       </ul>
@@ -64,27 +51,16 @@ export class GuestNav extends GuestMenu {
   render() {
     return (
       <div className="nav nav-guest">
-        {misago.get("SETTINGS").enable_sso ? (
-          <a
-            className="btn navbar-btn btn-primary btn-register"
-            href={misago.get("SETTINGS").SSO_LOGIN_URL}
-          >
-            {gettext("Sign in")}
-          </a>
-        ) : (
-          <button
-            className="btn navbar-btn btn-default btn-sign-in"
-            onClick={this.showSignInModal}
-            type="button"
-          >
-            {gettext("Sign in")}
-          </button>
-        )}
-        {!misago.get("SETTINGS").enable_sso && (
-          <RegisterButton className="navbar-btn btn-primary btn-register">
-            {gettext("Register")}
-          </RegisterButton>
-        )}
+        <button
+          className="btn navbar-btn btn-default btn-sign-in"
+          onClick={this.showSignInModal}
+          type="button"
+        >
+          {gettext("Sign in")}
+        </button>
+        <RegisterButton className="navbar-btn btn-primary btn-register">
+          {gettext("Register")}
+        </RegisterButton>
         <div className="navbar-left">
           <NavbarSearch />
         </div>

+ 0 - 2
misago/acl/__init__.py

@@ -1,3 +1 @@
-default_app_config = "misago.acl.apps.MisagoACLsConfig"
-
 ACL_CACHE = "acl"

+ 7 - 7
misago/acl/admin/__init__.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 from django.utils.translation import gettext_lazy as _
 
 from .views import DeleteRole, EditRole, NewRole, RolesList, RoleUsers
@@ -7,16 +7,16 @@ from .views import DeleteRole, EditRole, NewRole, RolesList, RoleUsers
 class MisagoAdminExtension:
     def register_urlpatterns(self, urlpatterns):
         # Permissions section
-        urlpatterns.namespace(r"^permissions/", "permissions")
+        urlpatterns.namespace("permissions/", "permissions")
 
         # Roles
         urlpatterns.patterns(
             "permissions",
-            url(r"^$", RolesList.as_view(), name="index"),
-            url(r"^new/$", NewRole.as_view(), name="new"),
-            url(r"^edit/(?P<pk>\d+)/$", EditRole.as_view(), name="edit"),
-            url(r"^users/(?P<pk>\d+)/$", RoleUsers.as_view(), name="users"),
-            url(r"^delete/(?P<pk>\d+)/$", DeleteRole.as_view(), name="delete"),
+            path("", RolesList.as_view(), name="index"),
+            path("new/", NewRole.as_view(), name="new"),
+            path("edit/<int:pk>/", EditRole.as_view(), name="edit"),
+            path("users/<int:pk>/", RoleUsers.as_view(), name="users"),
+            path("delete/<int:pk>/", DeleteRole.as_view(), name="delete"),
         )
 
     def register_navigation_nodes(self, site):

+ 1 - 2
misago/acl/migrations/0001_initial.py

@@ -1,4 +1,3 @@
-from django.contrib.postgres.fields import JSONField
 from django.db import migrations, models
 
 from ..models import permissions_default
@@ -28,7 +27,7 @@ class Migration(migrations.Migration):
                     "special_role",
                     models.CharField(max_length=255, null=True, blank=True),
                 ),
-                ("permissions", JSONField(default=permissions_default)),
+                ("permissions", models.JSONField(default=permissions_default)),
             ],
             options={"abstract": False},
             bases=(models.Model,),

+ 1 - 2
misago/acl/models.py

@@ -1,4 +1,3 @@
-from django.contrib.postgres.fields import JSONField
 from django.db import models
 from django.utils.translation import gettext as _
 
@@ -12,7 +11,7 @@ def permissions_default():
 class BaseRole(models.Model):
     name = models.CharField(max_length=255)
     special_role = models.CharField(max_length=255, null=True, blank=True)
-    permissions = JSONField(default=permissions_default)
+    permissions = models.JSONField(default=permissions_default)
 
     class Meta:
         abstract = True

+ 0 - 2
misago/admin/__init__.py

@@ -1,5 +1,3 @@
 from .site import site
 from .urlpatterns import urlpatterns
 from .discoverer import discover_misago_admin
-
-default_app_config = "misago.admin.apps.MisagoAdminConfig"

+ 8 - 9
misago/admin/urlpatterns.py

@@ -1,4 +1,4 @@
-from django.conf.urls import include, url
+from django.urls import include, path
 
 
 class URLPatterns:
@@ -8,17 +8,17 @@ class URLPatterns:
         self._patterns = []
         self._urlpatterns = None
 
-    def namespace(self, path, namespace, parent=None):
+    def namespace(self, url_path, namespace, parent=None):
         self._namespaces.append(
-            {"path": path, "parent": parent, "namespace": namespace}
+            {"path": url_path, "parent": parent, "namespace": namespace}
         )
 
     def patterns(self, namespace, *new_patterns):
         self._patterns.append({"namespace": namespace, "urlpatterns": new_patterns})
 
-    def single_pattern(self, path, namespace, parent, view):
-        self.namespace(path, namespace, parent)
-        self.patterns(":".join((parent, namespace)), url(r"^$", view, name="index"))
+    def single_pattern(self, url_path, namespace, parent, view):
+        self.namespace(url_path, namespace, parent)
+        self.patterns(":".join((parent, namespace)), path("", view, name="index"))
 
     def get_child_patterns(self, parent):
         prefix = "%s:" % parent if parent else ""
@@ -32,8 +32,7 @@ class URLPatterns:
                     (child_patterns, namespace["namespace"]),
                     namespace=namespace["namespace"],
                 )
-                namespace_urlpatterns.append(url(namespace["path"], included_patterns))
-
+                namespace_urlpatterns.append(path(namespace["path"], included_patterns))
         return namespace_urlpatterns
 
     def sum_registered_patters(self):
@@ -54,7 +53,7 @@ class URLPatterns:
                     (child_patterns, namespace["namespace"]),
                     namespace=namespace["namespace"],
                 )
-                root_urlpatterns.append(url(namespace["path"], included_patterns))
+                root_urlpatterns.append(path(namespace["path"], included_patterns))
 
         return root_urlpatterns
 

+ 3 - 3
misago/admin/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 
 from .. import admin
 from .views import auth, index
@@ -7,8 +7,8 @@ urlpatterns = [
     # "misago:admin:index" link symbolises "root" of Misago admin links space
     # any request with path that falls below this one is assumed to be directed
     # at Misago Admin and will be checked by Misago Admin Middleware
-    url(r"^$", index.admin_index, name="index"),
-    url(r"^logout/$", auth.logout, name="logout"),
+    path("", index.admin_index, name="index"),
+    path("logout/", auth.logout, name="logout"),
 ]
 
 # Discover admin and register patterns

+ 3 - 3
misago/analytics/urls.py

@@ -1,10 +1,10 @@
-from django.conf.urls import url
+from django.urls import path
 
 from .views import google_site_verification
 
 urlpatterns = [
-    url(
-        r"^google(?P<token>[a-z0-9]+)\.html$",
+    path(
+        "google(<slug:token>\.html",
         google_site_verification,
         name="google-site-verification",
     )

+ 0 - 1
misago/cache/__init__.py

@@ -1 +0,0 @@
-default_app_config = "misago.cache.apps.MisagoCacheConfig"

+ 0 - 2
misago/categories/__init__.py

@@ -1,4 +1,2 @@
-default_app_config = "misago.categories.apps.MisagoCategoriesConfig"
-
 PRIVATE_THREADS_ROOT_NAME = "private_threads"
 THREADS_ROOT_NAME = "root_category"

+ 17 - 17
misago/categories/admin/__init__.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 from django.utils.translation import gettext_lazy as _
 
 from .views.categories import (
@@ -22,39 +22,39 @@ from .views.perms import (
 class MisagoAdminExtension:
     def register_urlpatterns(self, urlpatterns):
         # Categories section
-        urlpatterns.namespace(r"^categories/", "categories")
+        urlpatterns.namespace("categories/", "categories")
 
         # Nodes
         urlpatterns.patterns(
             "categories",
-            url(r"^$", CategoriesList.as_view(), name="index"),
-            url(r"^new/$", NewCategory.as_view(), name="new"),
-            url(r"^edit/(?P<pk>\d+)/$", EditCategory.as_view(), name="edit"),
-            url(
-                r"^permissions/(?P<pk>\d+)/$",
+            path("", CategoriesList.as_view(), name="index"),
+            path("new/", NewCategory.as_view(), name="new"),
+            path("edit/<int:pk>/", EditCategory.as_view(), name="edit"),
+            path(
+                "permissions/<int:pk>/",
                 CategoryPermissions.as_view(),
                 name="permissions",
             ),
-            url(r"^move/down/(?P<pk>\d+)/$", MoveDownCategory.as_view(), name="down"),
-            url(r"^move/up/(?P<pk>\d+)/$", MoveUpCategory.as_view(), name="up"),
-            url(r"^delete/(?P<pk>\d+)/$", DeleteCategory.as_view(), name="delete"),
+            path("move/down/<int:pk>/", MoveDownCategory.as_view(), name="down"),
+            path("move/up/<int:pk>/", MoveUpCategory.as_view(), name="up"),
+            path("delete/<int:pk>/", DeleteCategory.as_view(), name="delete"),
         )
 
         # Category Roles
-        urlpatterns.namespace(r"^categories/", "categories", "permissions")
+        urlpatterns.namespace("categories/", "categories", "permissions")
         urlpatterns.patterns(
             "permissions:categories",
-            url(r"^$", CategoryRolesList.as_view(), name="index"),
-            url(r"^new/$", NewCategoryRole.as_view(), name="new"),
-            url(r"^edit/(?P<pk>\d+)/$", EditCategoryRole.as_view(), name="edit"),
-            url(r"^delete/(?P<pk>\d+)/$", DeleteCategoryRole.as_view(), name="delete"),
+            path("", CategoryRolesList.as_view(), name="index"),
+            path("new/", NewCategoryRole.as_view(), name="new"),
+            path("edit/<int:pk>/", EditCategoryRole.as_view(), name="edit"),
+            path("delete/<int:pk>/", DeleteCategoryRole.as_view(), name="delete"),
         )
 
         # Change Role Category Permissions
         urlpatterns.patterns(
             "permissions",
-            url(
-                r"^categories/(?P<pk>\d+)/$",
+            path(
+                "categories/<int:pk>/",
                 RoleCategoriesACL.as_view(),
                 name="categories",
             ),

+ 1 - 2
misago/categories/migrations/0001_initial.py

@@ -1,7 +1,6 @@
 import django.db.models.deletion
 import mptt.fields
 from django.conf import settings
-from django.contrib.postgres.fields import JSONField
 from django.db import migrations, models
 
 from ...acl.models import permissions_default
@@ -114,7 +113,7 @@ class Migration(migrations.Migration):
                     "special_role",
                     models.CharField(max_length=255, null=True, blank=True),
                 ),
-                ("permissions", JSONField(default=permissions_default)),
+                ("permissions", models.JSONField(default=permissions_default)),
             ],
             options={"abstract": False},
             bases=(models.Model,),

+ 1 - 1
misago/categories/signals.py

@@ -4,7 +4,7 @@ from ..users.signals import anonymize_user_data, username_changed
 from .models import Category
 
 delete_category_content = Signal()
-move_category_content = Signal(providing_args=["new_category"])
+move_category_content = Signal()
 
 
 @receiver([anonymize_user_data, username_changed])

+ 5 - 5
misago/categories/urls/__init__.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 
 from ...conf import settings
 from ...core.views import home_redirect
@@ -6,12 +6,12 @@ from ...core.views import home_redirect
 from ..views import categories
 
 if settings.MISAGO_THREADS_ON_INDEX:
-    URL_PATH = r"^categories/$"
+    URL_PATH = "categories/"
 else:
-    URL_PATH = r"^$"
+    URL_PATH = ""
 
 urlpatterns = [
-    url(URL_PATH, categories, name="categories"),
+    path(URL_PATH, categories, name="categories"),
     # fallback for after we changed index setting
-    url(r"^categories/$", home_redirect),
+    path("categories/", home_redirect),
 ]

+ 0 - 2
misago/conf/__init__.py

@@ -1,7 +1,5 @@
 from .staticsettings import StaticSettings
 
-default_app_config = "misago.conf.apps.MisagoConfConfig"
-
 SETTINGS_CACHE = "settings"
 
 settings = StaticSettings()

+ 9 - 23
misago/conf/admin/__init__.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 from django.utils.translation import gettext_lazy as _
 
 from .views import index
@@ -6,7 +6,6 @@ from .views import (
     ChangeAnalyticsSettingsView,
     ChangeCaptchaSettingsView,
     ChangeGeneralSettingsView,
-    ChangeSSOSettingsView,
     ChangeThreadsSettingsView,
     ChangeUsersSettingsView,
 )
@@ -14,30 +13,27 @@ from .views import (
 
 class MisagoAdminExtension:
     def register_urlpatterns(self, urlpatterns):
-        urlpatterns.namespace(r"^settings/", "settings")
+        urlpatterns.namespace("settings/", "settings")
 
-        urlpatterns.patterns("settings", url(r"^$", index, name="index"))
+        urlpatterns.patterns("settings", path("", index, name="index"))
 
         urlpatterns.single_pattern(
-            r"^analytics/",
+            "analytics/",
             "analytics",
             "settings",
             ChangeAnalyticsSettingsView.as_view(),
         )
         urlpatterns.single_pattern(
-            r"^captcha/", "captcha", "settings", ChangeCaptchaSettingsView.as_view()
+            "captcha/", "captcha", "settings", ChangeCaptchaSettingsView.as_view()
         )
         urlpatterns.single_pattern(
-            r"^general/", "general", "settings", ChangeGeneralSettingsView.as_view()
+            "general/", "general", "settings", ChangeGeneralSettingsView.as_view()
         )
         urlpatterns.single_pattern(
-            r"^sso/", "sso", "settings", ChangeSSOSettingsView.as_view()
+            "threads/", "threads", "settings", ChangeThreadsSettingsView.as_view()
         )
         urlpatterns.single_pattern(
-            r"^threads/", "threads", "settings", ChangeThreadsSettingsView.as_view()
-        )
-        urlpatterns.single_pattern(
-            r"^users/", "users", "settings", ChangeUsersSettingsView.as_view()
+            "users/", "users", "settings", ChangeUsersSettingsView.as_view()
         )
 
     def register_navigation_nodes(self, site):
@@ -73,21 +69,11 @@ class MisagoAdminExtension:
             after="users:index",
         )
         site.add_node(
-            name=_("Single Sign-On"),
-            description=_(
-                "SSO enables you to delegate user login and registration from Misago to"
-                "the third party site."
-            ),
-            parent="settings",
-            namespace="sso",
-            after="captcha:index",
-        )
-        site.add_node(
             name=_("Analytics"),
             description=_("Enable Google Analytics or setup Google Site Verification."),
             parent="settings",
             namespace="analytics",
-            after="sso:index",
+            after="captcha:index",
         )
         site.add_node(
             name=_("Threads"),

+ 0 - 1
misago/conf/admin/forms/__init__.py

@@ -2,6 +2,5 @@ from .analytics import ChangeAnalyticsSettingsForm
 from .base import ChangeSettingsForm
 from .captcha import ChangeCaptchaSettingsForm
 from .general import ChangeGeneralSettingsForm
-from .sso import ChangeSSOSettingsForm
 from .threads import ChangeThreadsSettingsForm
 from .users import ChangeUsersSettingsForm

+ 0 - 53
misago/conf/admin/forms/sso.py

@@ -1,53 +0,0 @@
-from django import forms
-from django.utils.crypto import get_random_string
-from django.utils.translation import gettext_lazy as _
-
-from ....admin.forms import YesNoSwitch
-from .base import ChangeSettingsForm
-
-
-class ChangeSSOSettingsForm(ChangeSettingsForm):
-    settings = ["enable_sso", "sso_public_key", "sso_private_key", "sso_url"]
-
-    enable_sso = YesNoSwitch(
-        label=_("Enable Single Sign-On"),
-        help_text=_(
-            "Enabling SSO will make login option redirect users to the server URL "
-            "configured below. It will also disable option to register on forum, "
-            "change username, email or passward, as those features will be delegated "
-            "to the 3rd party site."
-        ),
-    )
-    sso_public_key = forms.CharField(
-        label=_("Public key"),
-        help_text=_(
-            "Leave this field empty for Misago to generate this key on form submission."
-        ),
-        max_length=64,
-        required=False,
-    )
-    sso_private_key = forms.CharField(
-        label=_("Private key"),
-        help_text=_(
-            "Leave this field empty for Misago to generate this key on form submission."
-        ),
-        max_length=64,
-        required=False,
-    )
-    sso_url = forms.URLField(label=_("Server URL"), max_length=255, required=False)
-
-    def clean(self):
-        cleaned_data = super().clean()
-
-        if cleaned_data.get("enable_sso"):
-            if not cleaned_data.get("sso_public_key"):
-                cleaned_data["sso_public_key"] = get_random_string(64)
-            if not cleaned_data.get("sso_private_key"):
-                cleaned_data["sso_private_key"] = get_random_string(64)
-
-            if not cleaned_data.get("sso_url"):
-                self.add_error(
-                    "sso_url", _("You need to enter server URL to enable SSO.")
-                )
-
-        return cleaned_data

+ 0 - 5
misago/conf/admin/tests/test_change_settings_views.py

@@ -90,11 +90,6 @@ def test_general_settings_form_renders(admin_client):
     assert response.status_code == 200
 
 
-def test_sso_settings_form_renders(admin_client):
-    response = admin_client.get(reverse("misago:admin:settings:sso:index"))
-    assert response.status_code == 200
-
-
 def test_threads_settings_form_renders(admin_client):
     response = admin_client.get(reverse("misago:admin:settings:threads:index"))
     assert response.status_code == 200

+ 0 - 47
misago/conf/admin/tests/test_enabling_sso.py

@@ -1,47 +0,0 @@
-from django.urls import reverse
-
-from ...models import Setting
-
-admin_link = reverse("misago:admin:settings:sso:index")
-
-
-def test_sso_form_generates_public_key_when_enabling_sso(admin_client):
-    response = admin_client.post(
-        admin_link, {"enable_sso": "1", "sso_url": "https://test.com"}
-    )
-    setting = Setting.objects.get(setting="sso_public_key")
-    assert setting.value
-
-
-def test_sso_form_generates_private_key_when_enabling_sso(admin_client):
-    response = admin_client.post(
-        admin_link, {"enable_sso": "1", "sso_url": "https://test.com"}
-    )
-    setting = Setting.objects.get(setting="sso_private_key")
-    assert setting.value
-
-
-def test_sso_public_key_can_be_set_explicitly_when_enabling_sso(admin_client):
-    response = admin_client.post(
-        admin_link,
-        {"enable_sso": "1", "sso_public_key": "custom", "sso_url": "https://test.com"},
-    )
-    setting = Setting.objects.get(setting="sso_public_key")
-    assert setting.value == "custom"
-
-
-def test_sso_private_key_can_be_set_explicitly_when_enabling_sso(admin_client):
-    response = admin_client.post(
-        admin_link,
-        {"enable_sso": "1", "sso_private_key": "custom", "sso_url": "https://test.com"},
-    )
-    setting = Setting.objects.get(setting="sso_private_key")
-    assert setting.value == "custom"
-
-
-def test_form_requires_sso_url_when_enabling_sso(admin_client):
-    response = admin_client.post(
-        admin_link, {"enable_sso": "1", "sso_private_key": "custom", "sso_url": ""}
-    )
-    setting = Setting.objects.get(setting="enable_sso")
-    assert not setting.value

+ 0 - 6
misago/conf/admin/views.py

@@ -9,7 +9,6 @@ from .forms import (
     ChangeAnalyticsSettingsForm,
     ChangeCaptchaSettingsForm,
     ChangeGeneralSettingsForm,
-    ChangeSSOSettingsForm,
     ChangeThreadsSettingsForm,
     ChangeUsersSettingsForm,
 )
@@ -76,11 +75,6 @@ class ChangeGeneralSettingsView(ChangeSettingsView):
     template_name = "misago/admin/conf/general_settings.html"
 
 
-class ChangeSSOSettingsView(ChangeSettingsView):
-    form_class = ChangeSSOSettingsForm
-    template_name = "misago/admin/conf/sso_settings.html"
-
-
 class ChangeThreadsSettingsView(ChangeSettingsView):
     form_class = ChangeThreadsSettingsForm
     template_name = "misago/admin/conf/threads_settings.html"

+ 0 - 1
misago/conf/context_processors.py

@@ -39,7 +39,6 @@ def preload_settings_json(request):
 
     preloaded_settings.update(
         {
-            "SSO_LOGIN_URL": reverse("simple-sso-login"),
             "LOGIN_API_URL": settings.MISAGO_LOGIN_API_URL,
             "LOGIN_REDIRECT_URL": reverse(settings.LOGIN_REDIRECT_URL),
             "LOGIN_URL": reverse(settings.LOGIN_URL),

+ 1 - 2
misago/conf/migrations/0001_initial.py

@@ -1,5 +1,4 @@
 import django.db.models.deletion
-from django.contrib.postgres.fields import JSONField
 from django.db import migrations, models
 
 
@@ -33,7 +32,7 @@ class Migration(migrations.Migration):
                 ("is_public", models.BooleanField(default=False)),
                 ("is_lazy", models.BooleanField(default=False)),
                 ("form_field", models.CharField(default="text", max_length=255)),
-                ("field_extra", JSONField()),
+                ("field_extra", models.JSONField()),
             ],
             options={},
             bases=(models.Model,),

+ 24 - 0
misago/conf/migrations/0006_remove_sso_settings.py

@@ -0,0 +1,24 @@
+# Generated by Django 3.2.15 on 2022-09-27 18:45
+
+from django.db import migrations
+
+sso_settings = (
+    "enable_sso",
+    "sso_public_key",
+    "sso_private_key",
+    "sso_url",
+)
+
+
+def delete_settings(apps, _):
+    Setting = apps.get_model("misago_conf", "Setting")
+    Setting.objects.filter(setting__in=sso_settings).delete()
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("misago_conf", "0005_add_sso_settings"),
+    ]
+
+    operations = [migrations.RunPython(delete_settings)]

+ 0 - 1
misago/conf/models.py

@@ -1,6 +1,5 @@
 from pathlib import Path
 
-from django.contrib.postgres.fields import JSONField
 from django.db import models
 
 from ..core.utils import get_file_hash

+ 0 - 3
misago/core/__init__.py

@@ -20,6 +20,3 @@ def check_db_engine(app_configs, **kwargs):
         )
 
     return errors
-
-
-default_app_config = "misago.core.apps.MisagoCoreConfig"

+ 0 - 9
misago/core/decorators.py

@@ -3,15 +3,6 @@ from rest_framework import serializers
 from .errorpages import not_allowed
 
 
-def ajax_only(f):
-    def decorator(request, *args, **kwargs):
-        if not request.is_ajax():
-            return not_allowed(request)
-        return f(request, *args, **kwargs)
-
-    return decorator
-
-
 def require_POST(f):
     def decorator(request, *args, **kwargs):
         if not request.method == "POST":

+ 12 - 3
misago/core/errorpages.py

@@ -9,6 +9,15 @@ from .exceptions import SocialAuthBanned, SocialAuthFailed
 from .utils import get_exception_message, is_request_to_misago
 
 
+def _is_ajax(request):
+    # Request is AJAX when done with XMLHttpRequest
+    if request.headers.get("x-requested-with") == "XMLHttpRequest":
+        return True
+
+    # Assume that request is AJAX when it has JSON payload
+    return "application/json" in request.headers.get("content-type", "")
+
+
 def _ajax_error(code, exception=None, default_message=None):
     return JsonResponse(
         {"detail": get_exception_message(exception, default_message)}, status=code
@@ -38,13 +47,13 @@ def banned(request, exception):
 
 
 def permission_denied(request, exception):
-    if request.is_ajax():
+    if _is_ajax(request):
         return _ajax_error(403, exception, _("Permission denied."))
     return _error_page(request, 403, exception)
 
 
 def page_not_found(request, exception):
-    if request.is_ajax():
+    if _is_ajax(request):
         return _ajax_error(404, exception, "Not found.")
     return _error_page(request, 404, exception)
 
@@ -106,7 +115,7 @@ def social_auth_failed(request, exception):
 
 @admin_csrf_failure
 def csrf_failure(request, reason=""):
-    if request.is_ajax():
+    if _is_ajax(request):
         return JsonResponse(
             {
                 "detail": _(

+ 13 - 5
misago/core/middleware.py

@@ -1,10 +1,14 @@
-from django.utils.deprecation import MiddlewareMixin
-
 from . import exceptionhandler
 from .utils import is_request_to_misago
 
 
-class ExceptionHandlerMiddleware(MiddlewareMixin):
+class ExceptionHandlerMiddleware:
+    def __init__(self, get_response):
+        self.get_response = get_response
+
+    def __call__(self, request):
+        return self.get_response(request)
+
     def process_exception(self, request, exception):
         request_is_to_misago = is_request_to_misago(request)
         misago_can_handle_exception = exceptionhandler.is_misago_exception(exception)
@@ -13,7 +17,11 @@ class ExceptionHandlerMiddleware(MiddlewareMixin):
             return exceptionhandler.handle_misago_exception(request, exception)
 
 
-class FrontendContextMiddleware(MiddlewareMixin):
-    def process_request(self, request):
+class FrontendContextMiddleware:
+    def __init__(self, get_response):
+        self.get_response = get_response
+
+    def __call__(self, request):
         request.include_frontend_context = True
         request.frontend_context = {}
+        return self.get_response(request)

+ 39 - 41
misago/core/testproject/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls import include, url
+from django.urls import include, path
 
 # Setup Django admin to work with Misago auth
 from django.contrib import admin
@@ -14,11 +14,11 @@ admin.autodiscover()
 admin.site.login_form = AdminAuthenticationForm
 
 urlpatterns = [
-    url(r"^", include("social_django.urls", namespace="social")),
-    url(r"^forum/", include("misago.urls", namespace="misago")),
-    url(r"^django-admin/", admin.site.urls),
-    url(
-        r"^django-i18n.js$",
+    path("", include("social_django.urls", namespace="social")),
+    path("forum/", include("misago.urls", namespace="misago")),
+    path("django-admin/", admin.site.urls),
+    path(
+        "django-i18n.js",
         cache_page(86400 * 2, key_prefix="misagojsi18n")(
             last_modified(lambda req, **kw: timezone.now())(
                 JavaScriptCatalog.as_view(packages=["misago"])
@@ -26,75 +26,73 @@ urlpatterns = [
         ),
         name="django-i18n",
     ),
-    # django-simple-sso doesn't have namespaces, we can't use namespace here
-    url(r"^sso/", include("misago.sso.urls")),
-    url(r"^forum/test-pagination/$", views.test_pagination, name="test-pagination"),
-    url(
-        r"^forum/test-pagination/(?P<page>[1-9][0-9]*)/$",
+    path("forum/test-pagination/", views.test_pagination, name="test-pagination"),
+    path(
+        "forum/test-pagination/<int:page>/",
         views.test_pagination,
         name="test-pagination",
     ),
-    url(
-        r"^forum/test-paginated-response/$",
+    path(
+        "forum/test-paginated-response/",
         views.test_paginated_response,
         name="test-paginated-response",
     ),
-    url(
-        r"^forum/test-paginated-response-data/$",
+    path(
+        "forum/test-paginated-response-data/",
         views.test_paginated_response_data,
         name="test-paginated-response-data",
     ),
-    url(
-        r"^forum/test-paginated-response-serializer/$",
+    path(
+        "forum/test-paginated-response-serializer/",
         views.test_paginated_response_serializer,
         name="test-paginated-response-serializer",
     ),
-    url(
-        r"^forum/test-paginated-response-data-serializer/$",
+    path(
+        "forum/test-paginated-response-data-serializer/",
         views.test_paginated_response_data_serializer,
         name="test-paginated-response-data-serializer",
     ),
-    url(
-        r"^forum/test-paginated-response-data-extra/$",
+    path(
+        "forum/test-paginated-response-data-extra/",
         views.test_paginated_response_data_extra,
         name="test-paginated-response-data-extra",
     ),
-    url(
-        r"^forum/test-valid-slug/(?P<slug>[a-z0-9\-]+)-(?P<pk>\d+)/$",
+    path(
+        "forum/test-valid-slug/<slug:slug>-<int:pk>/",
         views.validate_slug_view,
         name="validate-slug-view",
     ),
-    url(r"^forum/test-banned/$", views.raise_misago_banned, name="raise-misago-banned"),
-    url(r"^forum/test-403/$", views.raise_misago_403, name="raise-misago-403"),
-    url(r"^forum/test-404/$", views.raise_misago_404, name="raise-misago-404"),
-    url(r"^forum/test-405/$", views.raise_misago_405, name="raise-misago-405"),
-    url(
-        r"^forum/social-auth-failed/$",
+    path("forum/test-banned/", views.raise_misago_banned, name="raise-misago-banned"),
+    path("forum/test-403/", views.raise_misago_403, name="raise-misago-403"),
+    path("forum/test-404/", views.raise_misago_404, name="raise-misago-404"),
+    path("forum/test-405/", views.raise_misago_405, name="raise-misago-405"),
+    path(
+        "forum/social-auth-failed/",
         views.raise_social_auth_failed,
         name="raise-social-auth-failed",
     ),
-    url(
-        r"^forum/social-wrong-backend/$",
+    path(
+        "forum/social-wrong-backend/",
         views.raise_social_wrong_backend,
         name="raise-social-wrong-backend",
     ),
-    url(
-        r"^forum/social-not-allowed-to-disconnect/$",
+    path(
+        "forum/social-not-allowed-to-disconnect/",
         views.raise_social_not_allowed_to_disconnect,
         name="raise-social-not-allowed-to-disconnect",
     ),
-    url(
-        r"^forum/raise-social-auth-failed-message/$",
+    path(
+        "forum/raise-social-auth-failed-message/",
         views.raise_social_auth_failed_message,
         name="raise-social-auth-failed-message",
     ),
-    url(
-        r"^forum/raise-social-auth-banned/$",
+    path(
+        "forum/raise-social-auth-banned/",
         views.raise_social_auth_banned,
         name="raise-social-auth-banned",
     ),
-    url(r"^test-403/$", views.raise_403, name="raise-403"),
-    url(r"^test-404/$", views.raise_404, name="raise-404"),
-    url(r"^test-redirect/$", views.test_redirect, name="test-redirect"),
-    url(r"^test-require-post/$", views.test_require_post, name="test-require-post"),
+    path("test-403/", views.raise_403, name="raise-403"),
+    path("test-404/", views.raise_404, name="raise-404"),
+    path("test-redirect/", views.test_redirect, name="test-redirect"),
+    path("test-require-post/", views.test_require_post, name="test-require-post"),
 ]

+ 15 - 12
misago/core/tests/test_exceptionhandler_middleware.py

@@ -1,5 +1,4 @@
 from django.http import Http404
-from django.test import TestCase
 from django.test.client import RequestFactory
 from django.urls import reverse
 
@@ -22,15 +21,19 @@ def create_request():
     return request
 
 
-class ExceptionHandlerMiddlewareTests(TestCase):
-    def test_middleware_returns_response_for_supported_exception(self):
-        """Middleware returns HttpResponse for supported exception"""
-        middleware = ExceptionHandlerMiddleware()
-        exception = Http404()
-        assert middleware.process_exception(create_request(), exception)
+def get_response(*_args):
+    raise NotImplementedError()
 
-    def test_middleware_returns_none_for_non_supported_exception(self):
-        """Middleware returns None for non-supported exception"""
-        middleware = ExceptionHandlerMiddleware()
-        exception = TypeError()
-        assert middleware.process_exception(create_request(), exception) is None
+
+def test_exception_handler_middleware_returns_response_for_supported_exception(db):
+    """Middleware returns HttpResponse for supported exception"""
+    middleware = ExceptionHandlerMiddleware(get_response)
+    exception = Http404()
+    assert middleware.process_exception(create_request(), exception)
+
+
+def test_exception_handler_middleware_returns_none_for_non_supported_exception(db):
+    """Middleware returns None for non-supported exception"""
+    middleware = ExceptionHandlerMiddleware(get_response)
+    exception = TypeError()
+    assert middleware.process_exception(create_request(), exception) is None

+ 8 - 7
misago/core/tests/test_frontendcontext_middleware.py

@@ -1,4 +1,4 @@
-from django.test import TestCase
+from django.http import HttpResponse
 
 from ..middleware import FrontendContextMiddleware
 
@@ -7,10 +7,11 @@ class MockRequest:
     pass
 
 
-class FrontendContextMiddlewareTests(TestCase):
-    def test_middleware_frontend_context_dict(self):
-        """Middleware sets frontend_context dict on request"""
-        request = MockRequest()
+def get_response(*_):
+    return HttpResponse("OK!")
 
-        FrontendContextMiddleware().process_request(request)
-        self.assertEqual(request.frontend_context, {})
+
+def test_frontend_middleware_sets_frontend_context_dict_on_request():
+    request = MockRequest()
+    FrontendContextMiddleware(get_response)(request)
+    assert request.frontend_context == {}

+ 2 - 2
misago/core/utils.py

@@ -6,7 +6,7 @@ from django.core.exceptions import PermissionDenied
 from django.http import Http404
 from django.urls import resolve, reverse
 from django.utils import html, timezone
-from django.utils.encoding import force_text
+from django.utils.encoding import force_str
 from django.utils.module_loading import import_string
 
 MISAGO_SLUGIFY = getattr(settings, "MISAGO_SLUGIFY", "misago.core.slugify.default")
@@ -27,7 +27,7 @@ ISO8601_FORMATS = ("%Y-%m-%dT%H:%M:%S", "%Y-%m-%dT%H:%M:%S.%f")
 
 def parse_iso8601_string(value):
     """turns ISO 8601 string into datetime object"""
-    value = force_text(value, strings_only=True).rstrip("Z")
+    value = force_str(value, strings_only=True).rstrip("Z")
 
     for format_str in ISO8601_FORMATS:
         try:

+ 0 - 1
misago/faker/__init__.py

@@ -1 +0,0 @@
-default_app_config = "misago.faker.apps.MisagoFakerConfig"

+ 0 - 1
misago/graphql/__init__.py

@@ -1 +0,0 @@
-default_app_config = "misago.graphql.apps.MisagoGraphQLConfig"

+ 4 - 4
misago/graphql/admin/__init__.py

@@ -1,5 +1,5 @@
-from ariadne.contrib.django.views import GraphQLView
-from django.conf.urls import url
+from ariadne_django.views import GraphQLView
+from django.urls import path
 
 from .schema import schema
 
@@ -7,7 +7,7 @@ from .schema import schema
 class MisagoAdminExtension:
     def register_urlpatterns(self, urlpatterns):
         # GraphQL API
-        urlpatterns.namespace(r"^graphql/", "graphql")
+        urlpatterns.namespace("graphql/", "graphql")
         urlpatterns.patterns(
-            "graphql", url(r"^$", GraphQLView.as_view(schema=schema), name="index")
+            "graphql", path("", GraphQLView.as_view(schema=schema), name="index")
         )

+ 2 - 2
misago/healthcheck/urls.py

@@ -1,5 +1,5 @@
-from django.conf.urls import url
+from django.urls import path
 
 from .views import healthcheck
 
-urlpatterns = [url(r"^healthcheck/$", healthcheck, name="healthcheck")]
+urlpatterns = [path("healthcheck/", healthcheck, name="healthcheck")]

+ 0 - 1
misago/icons/__init__.py

@@ -1 +0,0 @@
-default_app_config = "misago.icons.apps.MisagoIconsConfig"

+ 3 - 3
misago/icons/admin/__init__.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 from django.utils.translation import gettext_lazy as _
 
 from .views import icons_admin
@@ -7,8 +7,8 @@ from .views import icons_admin
 class MisagoAdminExtension:
     def register_urlpatterns(self, urlpatterns):
         # Icons
-        urlpatterns.namespace(r"^icons/", "icons", "settings")
-        urlpatterns.patterns("settings:icons", url(r"^$", icons_admin, name="index"))
+        urlpatterns.namespace("icons/", "icons", "settings")
+        urlpatterns.patterns("settings:icons", path("", icons_admin, name="index"))
 
     def register_navigation_nodes(self, site):
         site.add_node(

+ 0 - 1
misago/legal/__init__.py

@@ -1 +0,0 @@
-default_app_config = "misago.legal.apps.MisagoLegalConfig"

+ 10 - 10
misago/legal/admin/__init__.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 from django.utils.translation import gettext_lazy as _
 
 from .views import (
@@ -14,20 +14,20 @@ from .views import (
 class MisagoAdminExtension:
     def register_urlpatterns(self, urlpatterns):
         # Legal Agreements
-        urlpatterns.namespace(r"^agreements/", "agreements", "settings")
+        urlpatterns.namespace("agreements/", "agreements", "settings")
         urlpatterns.patterns(
             "settings:agreements",
-            url(r"^$", AgreementsList.as_view(), name="index"),
-            url(r"^(?P<page>\d+)/$", AgreementsList.as_view(), name="index"),
-            url(r"^new/$", NewAgreement.as_view(), name="new"),
-            url(r"^edit/(?P<pk>\d+)/$", EditAgreement.as_view(), name="edit"),
-            url(r"^delete/(?P<pk>\d+)/$", DeleteAgreement.as_view(), name="delete"),
-            url(
-                r"^set-as-active/(?P<pk>\d+)/$",
+            path("", AgreementsList.as_view(), name="index"),
+            path("<int:page>/", AgreementsList.as_view(), name="index"),
+            path("new/", NewAgreement.as_view(), name="new"),
+            path("edit/<int:pk>/", EditAgreement.as_view(), name="edit"),
+            path("delete/<int:pk>/", DeleteAgreement.as_view(), name="delete"),
+            path(
+                "set-as-active/<int:pk>/",
                 SetAgreementAsActive.as_view(),
                 name="set-as-active",
             ),
-            url(r"^disable/(?P<pk>\d+)/$", DisableAgreement.as_view(), name="disable"),
+            path("disable/<int:pk>/", DisableAgreement.as_view(), name="disable"),
         )
 
     def register_navigation_nodes(self, site):

+ 3 - 3
misago/legal/urls/__init__.py

@@ -1,8 +1,8 @@
-from django.conf.urls import url
+from django.urls import path
 
 from ..views import privacy_policy, terms_of_service
 
 urlpatterns = [
-    url(r"^privacy-policy/$", privacy_policy, name="privacy-policy"),
-    url(r"^terms-of-service/$", terms_of_service, name="terms-of-service"),
+    path("privacy-policy/", privacy_policy, name="privacy-policy"),
+    path("terms-of-service/", terms_of_service, name="terms-of-service"),
 ]

+ 2 - 2
misago/legal/urls/api.py

@@ -1,7 +1,7 @@
-from django.conf.urls import url
+from django.urls import path
 
 from ..api import submit_agreement
 
 urlpatterns = [
-    url(r"^submit-agreement/(?P<pk>\d+)/$", submit_agreement, name="submit-agreement")
+    path("submit-agreement/<int:pk>/", submit_agreement, name="submit-agreement")
 ]

BIN
misago/locale/de/LC_MESSAGES/django.mo


+ 7963 - 0
misago/locale/de/LC_MESSAGES/django.po

@@ -0,0 +1,7963 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: acl/admin/__init__.py:24 templates/misago/acl_debug.html:16
+#: templates/misago/admin/ranks/form.html:58
+msgid "Permissions"
+msgstr ""
+
+#: acl/admin/forms.py:9 categories/admin/forms.py:238
+msgid "Role name"
+msgstr ""
+
+#: acl/admin/views.py:15 categories/admin/views/perms.py:23
+msgid "Requested role does not exist."
+msgstr ""
+
+#: acl/admin/views.py:51 categories/admin/views/perms.py:62
+msgid "Form contains errors."
+msgstr ""
+
+#: acl/admin/views.py:62 categories/admin/views/perms.py:73
+#, python-format
+msgid "New role \"%(name)s\" has been saved."
+msgstr ""
+
+#: acl/admin/views.py:66 categories/admin/views/perms.py:77
+#, python-format
+msgid "Role \"%(name)s\" has been changed."
+msgstr ""
+
+#: acl/admin/views.py:72 categories/admin/views/perms.py:83
+#, python-format
+msgid "Role \"%(name)s\" is special role and can't be deleted."
+msgstr ""
+
+#: acl/admin/views.py:77 categories/admin/views/perms.py:88
+#, python-format
+msgid "Role \"%(name)s\" has been deleted."
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:10
+msgid "Member"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:48
+msgid "Guest"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:78
+#: categories/migrations/0003_categories_roles.py:71
+#: categories/migrations/0003_categories_roles.py:117
+#: users/migrations/0004_default_ranks.py:30
+msgid "Moderator"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:133
+msgid "Renaming users"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:141
+msgid "Banning users"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:155
+#: users/migrations/0004_default_ranks.py:33 users/permissions/delete.py:23
+msgid "Deleting users"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:166
+msgid "Can't be blocked"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:174
+#: threads/permissions/privatethreads.py:33
+#: threads/threadtypes/privatethread.py:12 threads/viewmodels/thread.py:147
+#: users/migrations/0004_default_ranks.py:31
+#: users/migrations/0004_default_ranks.py:35
+msgid "Private threads"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:189
+#: users/migrations/0004_default_ranks.py:32
+msgid "Private threads moderator"
+msgstr ""
+
+#: acl/panels.py:8
+msgid "Misago User ACL"
+msgstr ""
+
+#: acl/panels.py:17
+msgid "Anonymous user"
+msgstr ""
+
+#: admin/admin.py:6 templates/misago/admin/dashboard/index.html:5
+#: templates/misago/admin/dashboard/index.html:11
+msgid "Dashboard"
+msgstr ""
+
+#: admin/auth.py:29
+msgid "Your admin session has expired."
+msgstr ""
+
+#: admin/forms.py:46
+msgid ""
+"Value must be a 7-character string specifying an RGB color in a hexadecimal "
+"format."
+msgstr ""
+
+#: admin/forms.py:67 templates/misago/admin/users/edit.html:145
+#: templates/misago/admin/users/edit.html:163
+#: templates/misago/admin/users/edit.html:265 users/admin/forms.py:582
+msgid "Yes"
+msgstr ""
+
+#: admin/forms.py:68 templates/misago/admin/users/edit.html:149
+#: templates/misago/admin/users/edit.html:167
+#: templates/misago/admin/users/edit.html:269
+#: threads/permissions/bestanswers.py:34 threads/permissions/bestanswers.py:40
+#: threads/permissions/polls.py:34 threads/permissions/polls.py:40
+#: threads/permissions/polls.py:46 threads/permissions/threads.py:120
+#: threads/permissions/threads.py:130 threads/permissions/threads.py:142
+#: threads/permissions/threads.py:149 threads/permissions/threads.py:159
+#: threads/permissions/threads.py:168 threads/permissions/threads.py:180
+#: threads/permissions/threads.py:188 threads/permissions/threads.py:218
+#: users/admin/forms.py:582 users/models/user.py:105
+msgid "No"
+msgstr ""
+
+#: admin/views/auth.py:39
+msgid "Your admin session has been closed."
+msgstr ""
+
+#: admin/views/generic/list.py:39
+msgid "Selected: 0"
+msgstr ""
+
+#: admin/views/generic/list.py:40
+msgid "Select items"
+msgstr ""
+
+#: admin/views/generic/list.py:288 admin/views/generic/list.py:293
+msgid "You have to select one or more items."
+msgstr ""
+
+#: admin/views/generic/list.py:307
+msgid "Action is not allowed."
+msgstr ""
+
+#: categories/admin/__init__.py:65 templates/misago/categories/base.html:7
+#: templates/misago/categories/base.html:29
+#: templates/misago/categories/base.html:38
+#: templates/misago/categories/header.html:8 templates/misago/navbar.html:25
+#: templates/misago/navbar.html:31
+msgid "Categories"
+msgstr ""
+
+#: categories/admin/__init__.py:72
+msgid "Category permissions"
+msgstr ""
+
+#: categories/admin/forms.py:46
+#: templates/misago/admin/themes/assets/css.html:31
+#: templates/misago/admin/themes/assets/media.html:21 themes/admin/forms.py:26
+#: themes/admin/forms.py:53 themes/admin/forms.py:174 users/admin/forms.py:386
+msgid "Name"
+msgstr ""
+
+#: categories/admin/forms.py:48 users/admin/forms.py:402
+msgid "Description"
+msgstr ""
+
+#: categories/admin/forms.py:52
+msgid "Optional description explaining category intented purpose."
+msgstr ""
+
+#: categories/admin/forms.py:55 menus/admin/forms.py:20
+#: templates/misago/admin/categories/list.html:18
+#: templates/misago/admin/ranks/list.html:20 users/admin/forms.py:419
+msgid "CSS class"
+msgstr ""
+
+#: categories/admin/forms.py:58
+msgid ""
+"Optional CSS class used to customize this category's appearance from "
+"templates."
+msgstr ""
+
+#: categories/admin/forms.py:63
+msgid "Closed category"
+msgstr ""
+
+#: categories/admin/forms.py:66
+msgid "Only members with valid permissions can post in closed categories."
+msgstr ""
+
+#: categories/admin/forms.py:70 conf/admin/__init__.py:79
+#: templates/misago/admin/categories/list.html:19
+#: templates/misago/admin/dashboard/totals.html:19
+#: templates/misago/navbar.html:20 templates/misago/navbar.html:36
+#: templates/misago/profile/threads.html:5
+#: templates/misago/profile/threads.html:8
+#: templates/misago/profile/threads.html:9
+#: templates/misago/threadslist/category.html:68
+#: templates/misago/threadslist/threads.html:14
+#: templates/misago/threadslist/threads.html:16
+#: templates/misago/threadslist/threads.html:33
+#: templates/misago/threadslist/threads.html:42
+#: templates/misago/threadslist/threads.html:66
+#: threads/permissions/threads.py:73 threads/permissions/threads.py:104
+#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:97
+msgid "Threads"
+msgstr ""
+
+#: categories/admin/forms.py:73
+msgid "All threads started in this category will require moderator approval."
+msgstr ""
+
+#: categories/admin/forms.py:77
+msgid "Replies"
+msgstr ""
+
+#: categories/admin/forms.py:80
+msgid "All replies posted in this category will require moderator approval."
+msgstr ""
+
+#: categories/admin/forms.py:84
+msgid "Edits"
+msgstr ""
+
+#: categories/admin/forms.py:87
+msgid ""
+"Will make all edited replies return to unapproved state for moderator to "
+"review."
+msgstr ""
+
+#: categories/admin/forms.py:92
+msgid "Thread age"
+msgstr ""
+
+#: categories/admin/forms.py:95
+msgid ""
+"Prune thread if number of days since its creation is greater than specified. "
+"Enter 0 to disable this pruning criteria."
+msgstr ""
+
+#: categories/admin/forms.py:100
+msgid "Last reply"
+msgstr ""
+
+#: categories/admin/forms.py:103
+msgid ""
+"Prune thread if number of days since last reply is greater than specified. "
+"Enter 0 to disable this pruning criteria."
+msgstr ""
+
+#: categories/admin/forms.py:126
+msgid "Permissions cannot be copied from category into itself."
+msgstr ""
+
+#: categories/admin/forms.py:133
+msgid "Category cannot act as archive for itself."
+msgstr ""
+
+#: categories/admin/forms.py:155
+msgid "Parent category"
+msgstr ""
+
+#: categories/admin/forms.py:161
+msgid "Copy permissions"
+msgstr ""
+
+#: categories/admin/forms.py:163
+msgid ""
+"You can replace this category permissions with permissions copied from "
+"category selected here."
+msgstr ""
+
+#: categories/admin/forms.py:167
+msgid "Don't copy permissions"
+msgstr ""
+
+#: categories/admin/forms.py:171
+msgid "Archive"
+msgstr ""
+
+#: categories/admin/forms.py:173
+msgid ""
+"Instead of being deleted, pruned threads can be moved to designated category."
+msgstr ""
+
+#: categories/admin/forms.py:177
+msgid "Don't archive pruned threads"
+msgstr ""
+
+#: categories/admin/forms.py:194
+msgid "You are trying to move this category threads to itself."
+msgstr ""
+
+#: categories/admin/forms.py:200
+msgid ""
+"You are trying to move this category threads to a child category that will "
+"be deleted together with this category."
+msgstr ""
+
+#: categories/admin/forms.py:213
+msgid "Move category threads to"
+msgstr ""
+
+#: categories/admin/forms.py:216 categories/admin/forms.py:230
+msgid "Delete with category"
+msgstr ""
+
+#: categories/admin/forms.py:228
+msgid "Move child categories to"
+msgstr ""
+
+#: categories/admin/forms.py:249 categories/admin/forms.py:264
+#: templates/misago/acl_debug.html:15 templates/misago/admin/roles/list.html:16
+msgid "Role"
+msgstr ""
+
+#: categories/admin/forms.py:253 categories/admin/forms.py:268
+msgid "No access"
+msgstr ""
+
+#: categories/admin/views/categories.py:17
+msgid "Requested category does not exist."
+msgstr ""
+
+#: categories/admin/views/categories.py:96
+#, python-format
+msgid "New category \"%(name)s\" has been saved."
+msgstr ""
+
+#: categories/admin/views/categories.py:100
+#, python-format
+msgid "Category \"%(name)s\" has been edited."
+msgstr ""
+
+#: categories/admin/views/categories.py:104
+#, python-format
+msgid "Category \"%(name)s\" has been deleted."
+msgstr ""
+
+#: categories/admin/views/categories.py:154
+#, python-format
+msgid "Category \"%(name)s\" has been moved below \"%(other)s\"."
+msgstr ""
+
+#: categories/admin/views/categories.py:170
+#, python-format
+msgid "Category \"%(name)s\" has been moved above \"%(other)s\"."
+msgstr ""
+
+#: categories/admin/views/perms.py:134
+#, python-format
+msgid "Category %(name)s permissions have been changed."
+msgstr ""
+
+#: categories/admin/views/perms.py:145
+#: templates/misago/admin/categoryroles/categoryroles.html:37
+#: templates/misago/admin/categoryroles/rolecategories.html:31
+msgid "Change permissions"
+msgstr ""
+
+#: categories/admin/views/perms.py:158
+msgid "No categories exist."
+msgstr ""
+
+#: categories/admin/views/perms.py:197
+#, python-format
+msgid "Category permissions for role %(name)s have been changed."
+msgstr ""
+
+#: categories/admin/views/perms.py:208
+msgid "Categories permissions"
+msgstr ""
+
+#: categories/migrations/0002_default_categories.py:31
+msgid "First category"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:10
+msgid "See only"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:18
+msgid "Read only"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:33
+msgid "Reply to threads"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:51
+msgid "Start and reply threads"
+msgstr ""
+
+#: categories/migrations/0006_moderation_queue_roles.py:10
+msgid "In moderation queue"
+msgstr ""
+
+#: categories/migrations/0007_best_answers_roles.py:11
+msgid "Q&A user"
+msgstr ""
+
+#: categories/migrations/0007_best_answers_roles.py:23
+msgid "Q&A moderator"
+msgstr ""
+
+#: categories/permissions.py:13
+msgid "Category access"
+msgstr ""
+
+#: categories/permissions.py:15
+msgid "Can see category"
+msgstr ""
+
+#: categories/permissions.py:16
+msgid "Can see category contents"
+msgstr ""
+
+#: categories/permissions.py:119
+#, python-format
+msgid "You don't have permission to browse \"%(category)s\" contents."
+msgstr ""
+
+#: conf/admin/__init__.py:41 templates/misago/admin/conf/index.html:5
+#: templates/misago/admin/themes/form.html:48
+msgid "Settings"
+msgstr ""
+
+#: conf/admin/__init__.py:48 templates/misago/admin/socialauth/form.html:27
+msgid "General"
+msgstr ""
+
+#: conf/admin/__init__.py:49
+msgid "Change forum details like name, description or footer."
+msgstr ""
+
+#: conf/admin/__init__.py:54 templates/misago/admin/dashboard/totals.html:7
+#: templates/misago/admin/users/ban.html:22 templates/misago/navbar.html:42
+#: templates/misago/userslists/base.html:5
+#: templates/misago/userslists/base.html:14 users/admin/__init__.py:74
+#: users/search.py:16
+msgid "Users"
+msgstr ""
+
+#: conf/admin/__init__.py:56
+msgid "Customize user accounts default behavior and features availability."
+msgstr ""
+
+#: conf/admin/__init__.py:63
+msgid "Captcha"
+msgstr ""
+
+#: conf/admin/__init__.py:65
+msgid "Setup protection against automatic registrations on the site."
+msgstr ""
+
+#: conf/admin/__init__.py:72 templates/misago/admin/dashboard/analytics.html:7
+#: templates/misago/admin/dashboard/index.html:40
+msgid "Analytics"
+msgstr ""
+
+#: conf/admin/__init__.py:73
+msgid "Enable Google Analytics or setup Google Site Verification."
+msgstr ""
+
+#: conf/admin/__init__.py:80
+msgid "Threads, posts, polls and attachments options."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:17
+msgid "Tracking ID"
+msgstr ""
+
+#: conf/admin/forms/analytics.py:19
+msgid ""
+"Setting the Tracking ID will result in gtag.js file being included in your "
+"site's HTML markup, enabling Google Analytics integration."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:25
+msgid "Site verification token"
+msgstr ""
+
+#: conf/admin/forms/analytics.py:27
+msgid ""
+"This token was extracted from uploaded site verification file. To change it, "
+"upload new verification file."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:34
+msgid "Upload site verification file"
+msgstr ""
+
+#: conf/admin/forms/analytics.py:36
+msgid ""
+"Site verification file can be downloaded from Search Console's \"Ownership "
+"verification\" page."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:48
+msgid "Submitted file type is not HTML."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:54
+msgid "Submitted file doesn't contain a verification code."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:21
+msgid "Enable CAPTCHA"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:23
+msgid "No CAPTCHA"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:24
+msgid "reCaptcha"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:25
+#: templates/misago/admin/conf/captcha_settings.html:25
+msgid "Question and answer"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:31
+msgid "Site key"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:34
+msgid "Secret key"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:38
+msgid "Test question"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:41
+msgid "Question help text"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:44
+msgid "Valid answers"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:45
+msgid "Enter each answer in new line. Answers are case-insensitive."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:52
+msgid "Validate new registrations against SFS database"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:54
+msgid ""
+"Turning this option on will result in Misago validating new user's e-mail "
+"and IP address against SFS database."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:59
+msgid "Minimum SFS confidence required"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:61
+msgid ""
+"SFS compares user e-mail and IP address with database of known spammers and "
+"assigns the confidence score in range of 0 to 100 that user is a spammer "
+"themselves. If this score is equal or higher than specified, Misago will "
+"block user from registering and ban their IP address for 24 hours."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:79
+msgid "You need to enter site key if selected CAPTCHA type is reCaptcha."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:88
+msgid "You need to enter secret key if selected CAPTCHA type is reCaptcha."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:97
+msgid "You need to set question if selected CAPTCHA type is Q&A."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:104
+msgid "You need to set question answers if selected CAPTCHA type is Q&A."
+msgstr ""
+
+#: conf/admin/forms/general.py:25
+msgid "Forum name"
+msgstr ""
+
+#: conf/admin/forms/general.py:26
+msgid "Forum address"
+msgstr ""
+
+#: conf/admin/forms/general.py:29
+msgid "Header text"
+msgstr ""
+
+#: conf/admin/forms/general.py:30
+msgid "This text will replace forum name in page header."
+msgstr ""
+
+#: conf/admin/forms/general.py:34
+msgid "Page title"
+msgstr ""
+
+#: conf/admin/forms/general.py:36
+msgid "Meta Description"
+msgstr ""
+
+#: conf/admin/forms/general.py:38
+msgid ""
+"Short description of your forum that search and social sites may display "
+"next to link to your forum's index."
+msgstr ""
+
+#: conf/admin/forms/general.py:46
+#: templates/misago/admin/conf/general_settings.html:17
+msgid "Logo"
+msgstr ""
+
+#: conf/admin/forms/general.py:47
+msgid "Image that will displayed in forum navbar."
+msgstr ""
+
+#: conf/admin/forms/general.py:50
+msgid "Delete logo image"
+msgstr ""
+
+#: conf/admin/forms/general.py:52
+msgid "Small logo"
+msgstr ""
+
+#: conf/admin/forms/general.py:54
+msgid ""
+"Image that will be displayed in compact forum navbar. When set, it will "
+"replace icon pointing to forum index."
+msgstr ""
+
+#: conf/admin/forms/general.py:60
+msgid "Delete small logo image"
+msgstr ""
+
+#: conf/admin/forms/general.py:63 legal/admin/forms.py:34
+msgid "Text"
+msgstr ""
+
+#: conf/admin/forms/general.py:65
+msgid ""
+"Text displayed in forum navbar. If logo image was uploaded, text will be "
+"displayed right next to it. Never displayed by the compact navbar."
+msgstr ""
+
+#: conf/admin/forms/general.py:73
+msgid "Image"
+msgstr ""
+
+#: conf/admin/forms/general.py:75
+msgid ""
+"Custom image that will appear next to links to your forum posted on social "
+"sites. Facebook recommends that this image should be 1200 pixels wide and "
+"630 pixels tall."
+msgstr ""
+
+#: conf/admin/forms/general.py:81
+msgid "Delete image"
+msgstr ""
+
+#: conf/admin/forms/general.py:83
+msgid "Replace image with avatar on user profiles"
+msgstr ""
+
+#: conf/admin/forms/general.py:86
+msgid "Replace image with avatar on threads"
+msgstr ""
+
+#: conf/admin/forms/general.py:90
+#: templates/misago/admin/conf/general_settings.html:59
+msgid "Forum footnote"
+msgstr ""
+
+#: conf/admin/forms/general.py:91
+msgid "Short message displayed in forum footer."
+msgstr ""
+
+#: conf/admin/forms/general.py:96
+msgid "E-mails footer"
+msgstr ""
+
+#: conf/admin/forms/general.py:98
+msgid "Optional short message included at the end of e-mails sent by forum."
+msgstr ""
+
+#: conf/admin/forms/general.py:109
+#, python-format
+msgid ""
+"Misago uses this setting to build links in e-mails sent to site users. "
+"Address under which site is running appears to be \"%(address)s\"."
+msgstr ""
+
+#: conf/admin/forms/threads.py:27
+msgid "Daily post limit per user"
+msgstr ""
+
+#: conf/admin/forms/threads.py:29
+msgid ""
+"Daily limit of posts that may be posted by single user. Fail-safe for "
+"situations when forum is flooded by spam bots. Change to 0 to remove the "
+"limit."
+msgstr ""
+
+#: conf/admin/forms/threads.py:36
+msgid "Hourly post limit per user"
+msgstr ""
+
+#: conf/admin/forms/threads.py:38
+msgid ""
+"Hourly limit of posts that may be posted by single user. Fail-safe for "
+"situations when forum is flooded by spam bots. Change to 0 to remove the "
+"limit."
+msgstr ""
+
+#: conf/admin/forms/threads.py:45
+msgid "Maximum number of attachments per post"
+msgstr ""
+
+#: conf/admin/forms/threads.py:48
+msgid "Maximum allowed post length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:51
+msgid "Minimum required post length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:54
+msgid "Maximum allowed thread title length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:57
+msgid "Minimum required thread title length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:60
+msgid "Unused attachments lifetime"
+msgstr ""
+
+#: conf/admin/forms/threads.py:62
+msgid ""
+"Period of time (in hours) after which user-uploaded files that weren't "
+"attached to any post are deleted from disk."
+msgstr ""
+
+#: conf/admin/forms/threads.py:69
+msgid "Read-tracker cutoff"
+msgstr ""
+
+#: conf/admin/forms/threads.py:71
+msgid ""
+"Controls amount of data used by read-tracking system. All content older than "
+"number of days specified in this setting is considered old and read, even if "
+"the opposite is true for the user. Active forums can try lowering this value "
+"while less active ones may wish to increase it instead. "
+msgstr ""
+
+#: conf/admin/forms/threads.py:80
+msgid "Number of threads displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/threads.py:84
+msgid "Number of posts displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/threads.py:87 conf/admin/forms/users.py:141
+msgid "Maximum orphans"
+msgstr ""
+
+#: conf/admin/forms/threads.py:89
+msgid ""
+"If number of posts to be displayed on the last page is less or equal to "
+"number specified in this setting, those posts will instead be displayed on "
+"previous page, reducing the total number of pages in thread."
+msgstr ""
+
+#: conf/admin/forms/threads.py:96
+msgid "Maximum number of events displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/threads.py:100
+msgid "Permission denied"
+msgstr ""
+
+#: conf/admin/forms/threads.py:102
+msgid ""
+"Attachments proxy will display this image in place of default one when user "
+"tries to access attachment they have no permission to see."
+msgstr ""
+
+#: conf/admin/forms/threads.py:108
+msgid "Delete custom permission denied image"
+msgstr ""
+
+#: conf/admin/forms/threads.py:111
+msgid "Not found"
+msgstr ""
+
+#: conf/admin/forms/threads.py:113
+msgid ""
+"Attachments proxy will display this image in place of default one when user "
+"tries to access attachment that doesn't exist."
+msgstr ""
+
+#: conf/admin/forms/threads.py:119
+msgid "Delete custom not found image"
+msgstr ""
+
+#: conf/admin/forms/threads.py:129
+msgid "This value must be lower than number of posts per page."
+msgstr ""
+
+#: conf/admin/forms/users.py:37
+msgid "Require new accounts activation"
+msgstr ""
+
+#: conf/admin/forms/users.py:39
+msgid "No activation required"
+msgstr ""
+
+#: conf/admin/forms/users.py:40
+msgid "Activation token sent to user e-mail"
+msgstr ""
+
+#: conf/admin/forms/users.py:41
+msgid "Activation by administrator"
+msgstr ""
+
+#: conf/admin/forms/users.py:42
+msgid "Disable new registrations"
+msgstr ""
+
+#: conf/admin/forms/users.py:48
+msgid ""
+"Delete new inactive accounts if they weren't activated within this number of "
+"days"
+msgstr ""
+
+#: conf/admin/forms/users.py:51
+msgid "Enter 0 to never delete inactive new accounts."
+msgstr ""
+
+#: conf/admin/forms/users.py:56
+msgid "Minimum allowed username length"
+msgstr ""
+
+#: conf/admin/forms/users.py:59
+msgid "Maximum allowed username length"
+msgstr ""
+
+#: conf/admin/forms/users.py:63
+msgid "Allow custom avatar uploads"
+msgstr ""
+
+#: conf/admin/forms/users.py:65
+msgid ""
+"Turning this option off will forbid forum users from uploading custom "
+"avatars. Good for forums adressed at young users."
+msgstr ""
+
+#: conf/admin/forms/users.py:70
+msgid "Maximum size of uploaded avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:71
+msgid "Enter maximum allowed file size (in KB) for avatar uploads."
+msgstr ""
+
+#: conf/admin/forms/users.py:75
+msgid "Default avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:77 conf/admin/forms/users.py:90
+msgid "Individual"
+msgstr ""
+
+#: conf/admin/forms/users.py:78
+msgid "Gravatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:79 conf/admin/forms/users.py:91
+msgid "Random avatar from gallery"
+msgstr ""
+
+#: conf/admin/forms/users.py:84
+msgid "Fallback for default gravatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:86
+msgid ""
+"Select which avatar to use when user has no gravatar associated with their e-"
+"mail address."
+msgstr ""
+
+#: conf/admin/forms/users.py:96
+msgid "Blank avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:98
+msgid ""
+"Blank avatar is displayed in the interface when user's avatar is not "
+"available: when user was deleted or is guest. Uploaded image should be a "
+"square."
+msgstr ""
+
+#: conf/admin/forms/users.py:105
+msgid "Delete custom blank avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:109
+msgid "Maximum allowed signature length"
+msgstr ""
+
+#: conf/admin/forms/users.py:113 threads/permissions/threads.py:110
+#: users/admin/forms.py:175
+msgid "Started threads"
+msgstr ""
+
+#: conf/admin/forms/users.py:115 conf/admin/forms/users.py:127
+msgid "Don't watch"
+msgstr ""
+
+#: conf/admin/forms/users.py:116 conf/admin/forms/users.py:128
+msgid "Put on watched threads list"
+msgstr ""
+
+#: conf/admin/forms/users.py:119 conf/admin/forms/users.py:131
+msgid "Put on watched threads list and e-mail user when somebody replies"
+msgstr ""
+
+#: conf/admin/forms/users.py:125
+msgid "Replied threads"
+msgstr ""
+
+#: conf/admin/forms/users.py:138
+msgid "Number of users displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/users.py:143
+msgid ""
+"If number of users to be displayed on the last page is less or equal to "
+"number specified in this setting, those users will instead be displayed on "
+"previous page, reducing the total number of pages on the list."
+msgstr ""
+
+#: conf/admin/forms/users.py:151
+msgid "Maximum age in days of posts that should count to the ranking"
+msgstr ""
+
+#: conf/admin/forms/users.py:155
+msgid "Maximum number of ranked users"
+msgstr ""
+
+#: conf/admin/forms/users.py:158
+msgid "Allow users to download their data"
+msgstr ""
+
+#: conf/admin/forms/users.py:160
+msgid "Maximum age in hours of data downloads before they expire"
+msgstr ""
+
+#: conf/admin/forms/users.py:162
+msgid ""
+"Data downloads older than specified will have their files deleted and will "
+"be marked as expired."
+msgstr ""
+
+#: conf/admin/forms/users.py:169
+msgid "Allow users to delete their own accounts"
+msgstr ""
+
+#: conf/admin/forms/users.py:173
+msgid "IP storage time"
+msgstr ""
+
+#: conf/admin/forms/users.py:175
+msgid ""
+"Number of days for which users IP addresses are stored in forum database. "
+"Enter zero to store registered IP addresses forever. Deleting user account "
+"always deletes the IP addresses associated with it."
+msgstr ""
+
+#: conf/admin/forms/users.py:183
+msgid "Anonymous username"
+msgstr ""
+
+#: conf/admin/forms/users.py:185
+msgid ""
+"This username is displayed instead of delete user's actual name next to "
+"their content."
+msgstr ""
+
+#: conf/admin/forms/users.py:202 icons/admin/forms.py:117
+#, python-format
+msgid "Uploaded image's edge should be at least %(size)s pixels long."
+msgstr ""
+
+#: conf/admin/forms/users.py:215
+msgid "This value must be lower than number of users per page."
+msgstr ""
+
+#: conf/admin/views.py:39
+msgid "Settings have been saved."
+msgstr ""
+
+#: core/errorpages.py:51
+msgid "Permission denied."
+msgstr ""
+
+#: core/errorpages.py:80
+msgid ""
+"A problem was encountered when disconnecting your account from the remote "
+"site."
+msgstr ""
+
+#: core/errorpages.py:84
+msgid ""
+"You are not allowed to disconnect your account from the other site, because "
+"currently it's the only way to sign in to your account."
+msgstr ""
+
+#: core/errorpages.py:89
+#, python-format
+msgid "A problem was encountered when signing you in using %(backend)s."
+msgstr ""
+
+#: core/errorpages.py:93
+msgid "The sign in process has been canceled by user."
+msgstr ""
+
+#: core/errorpages.py:95
+msgid "The other service could not be reached."
+msgstr ""
+
+#: core/errorpages.py:101
+msgid "Unexpected problem has been encountered during sign in process."
+msgstr ""
+
+#: core/errorpages.py:122
+msgid ""
+"Your request was rejected because your browser didn't send the CSRF cookie, "
+"or the cookie sent was invalid."
+msgstr ""
+
+#: core/rest_permissions.py:9
+msgid "This action is not available to guests."
+msgstr ""
+
+#: core/templatetags/misago_pagetitle.py:10
+#: templates/misago/thread/private_thread.html:7
+#: templates/misago/thread/thread.html:7
+#, python-format
+msgid "page: %(page)s"
+msgstr ""
+
+#: core/validators.py:10
+msgid "Value has to contain alpha-numerical characters."
+msgstr ""
+
+#: core/validators.py:12
+msgid "Value is too long."
+msgstr ""
+
+#: core/validators.py:26
+msgid "Uploaded image is not a square."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:27
+msgid "The site is running using unreleased version of Misago."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:29
+msgid ""
+"Unreleased versions of Misago can lack security features and there is no "
+"supported way to upgrade them to release versions later."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:42
+msgid "Failed to connect to pypi.org API. Try again later."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:44
+#: templates/misago/admin/dashboard/checks.html:17
+#: templates/misago/admin/dashboard/index.html:33
+msgid ""
+"Version check feature relies on the API operated by the Python Package Index "
+"(pypi.org) API to retrieve latest Misago release version."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:70
+msgid "The site is running updated version of Misago."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:71
+#, python-format
+msgid "Misago %(version)s is latest release."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:77
+msgid "The site is running outdated version of Misago."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:79
+#, python-format
+msgid ""
+"The site is running Misago version %(version)s while version %(latest)s is "
+"available."
+msgstr ""
+
+#: icons/admin/__init__.py:15
+msgid "Icons"
+msgstr ""
+
+#: icons/admin/__init__.py:16
+msgid "Upload favicon and application icon for the site."
+msgstr ""
+
+#: icons/admin/forms.py:21 icons/admin/forms.py:28
+msgid "Upload image"
+msgstr ""
+
+#: icons/admin/forms.py:22
+msgid "Uploaded image should be a square that is 48px wide and tall."
+msgstr ""
+
+#: icons/admin/forms.py:25 icons/admin/forms.py:33
+msgid "Delete custom icon"
+msgstr ""
+
+#: icons/admin/forms.py:29
+msgid "Uploaded image should be square at least 180px wide and tall."
+msgstr ""
+
+#: icons/admin/forms.py:124
+msgid "Uploaded image was not gif, jpeg or png."
+msgstr ""
+
+#: icons/admin/views.py:17
+msgid "Icons have been updated."
+msgstr ""
+
+#: legal/admin/__init__.py:35
+msgid "Legal agreements"
+msgstr ""
+
+#: legal/admin/__init__.py:36
+msgid "Set terms of service and privacy policy contents."
+msgstr ""
+
+#: legal/admin/forms.py:11 legal/admin/forms.py:64
+#: templates/misago/admin/agreements/list.html:19
+#: templates/misago/admin/attachmenttypes/list.html:16
+#: templates/misago/admin/bans/list.html:18
+#: templates/misago/admin/themes/assets/media.html:24
+#: templates/misago/admin/users/edit.html:300 users/admin/forms.py:569
+msgid "Type"
+msgstr ""
+
+#: legal/admin/forms.py:13 menus/admin/forms.py:10
+#: templates/misago/admin/ranks/list.html:19
+msgid "Title"
+msgstr ""
+
+#: legal/admin/forms.py:14
+msgid "Optional, leave empty for agreement to be named after its type."
+msgstr ""
+
+#: legal/admin/forms.py:18
+msgid "Active for its type"
+msgstr ""
+
+#: legal/admin/forms.py:20
+msgid ""
+"If other agreement is already active for this type, it will be unset and "
+"replaced with this one. Misago will ask users who didn't accept this "
+"agreement to do so before allowing them to continue using the site."
+msgstr ""
+
+#: legal/admin/forms.py:27 templates/misago/admin/themes/assets/css.html:17
+msgid "Link"
+msgstr ""
+
+#: legal/admin/forms.py:29
+msgid "If your agreement is located on other page, enter here a link to it."
+msgstr ""
+
+#: legal/admin/forms.py:35
+msgid "You can use Markdown syntax for rich text elements."
+msgstr ""
+
+#: legal/admin/forms.py:48
+msgid "Please fill in agreement link or text."
+msgstr ""
+
+#: legal/admin/forms.py:66 threads/admin/forms.py:8
+msgid "All types"
+msgstr ""
+
+#: legal/admin/forms.py:68
+msgid "Content"
+msgstr ""
+
+#: legal/admin/views.py:16
+msgid "Requested agreement does not exist."
+msgstr ""
+
+#: legal/admin/views.py:29 threads/admin/views/attachments.py:26
+#: users/admin/views/bans.py:24 users/admin/views/datadownloads.py:22
+#: users/admin/views/users.py:63
+msgid "From newest"
+msgstr ""
+
+#: legal/admin/views.py:29 threads/admin/views/attachments.py:27
+#: users/admin/views/bans.py:25 users/admin/views/datadownloads.py:22
+#: users/admin/views/users.py:64
+msgid "From oldest"
+msgstr ""
+
+#: legal/admin/views.py:31
+msgid "With agreements: 0"
+msgstr ""
+
+#: legal/admin/views.py:32
+msgid "Select agreements"
+msgstr ""
+
+#: legal/admin/views.py:36
+msgid "Delete agreements"
+msgstr ""
+
+#: legal/admin/views.py:37
+msgid "Are you sure you want to delete those agreements?"
+msgstr ""
+
+#: legal/admin/views.py:48
+msgid "Selected agreements have been deleted."
+msgstr ""
+
+#: legal/admin/views.py:52
+#, python-format
+msgid "New agreement \"%(title)s\" has been saved."
+msgstr ""
+
+#: legal/admin/views.py:63
+#, python-format
+msgid "Agreement \"%(title)s\" has been edited."
+msgstr ""
+
+#: legal/admin/views.py:78
+#, python-format
+msgid "Agreement \"%(title)s\" has been deleted."
+msgstr ""
+
+#: legal/admin/views.py:86
+#, python-format
+msgid "Agreement \"%(title)s\" has been set as active for type \"%(type)s\"."
+msgstr ""
+
+#: legal/admin/views.py:98
+#, python-format
+msgid "Agreement \"%(title)s\" has been disabled."
+msgstr ""
+
+#: legal/api.py:17
+msgid "You have already accepted this agreement."
+msgstr ""
+
+#: legal/api.py:26
+msgid "You need to submit a valid choice."
+msgstr ""
+
+#: legal/models.py:42 templates/misago/footer.html:29
+msgid "Terms of service"
+msgstr ""
+
+#: legal/models.py:43 templates/misago/footer.html:34
+msgid "Privacy policy"
+msgstr ""
+
+#: markup/finalize.py:24
+#, python-format
+msgid "%(title)s has written:"
+msgstr ""
+
+#: markup/finalize.py:26
+msgid "Quoted message:"
+msgstr ""
+
+#: markup/finalize.py:33
+#, python-format
+msgid "%(title)s:"
+msgstr ""
+
+#: markup/finalize.py:35
+msgid "Spoiler:"
+msgstr ""
+
+#: markup/finalize.py:40
+msgid "Reveal spoiler"
+msgstr ""
+
+#: menus/admin/__init__.py:31
+msgid "Menu items"
+msgstr ""
+
+#: menus/admin/__init__.py:33
+msgid "Use those options to add custom items to the navbar and footer menus."
+msgstr ""
+
+#: menus/admin/forms.py:12
+msgid "URL"
+msgstr ""
+
+#: menus/admin/forms.py:12
+msgid "URL where this item will point to."
+msgstr ""
+
+#: menus/admin/forms.py:15
+msgid "Menu"
+msgstr ""
+
+#: menus/admin/forms.py:17
+msgid "Menu in which this item will be displayed."
+msgstr ""
+
+#: menus/admin/forms.py:21
+msgid "If you want to set custom value for link's \"class\"."
+msgstr ""
+
+#: menus/admin/forms.py:25
+msgid "Open this link in new window"
+msgstr ""
+
+#: menus/admin/forms.py:27
+msgid ""
+"Enabling this option will result in the target=\"_blank\" attribute being "
+"added to this link's HTML element."
+msgstr ""
+
+#: menus/admin/forms.py:33
+msgid "Rel attribute"
+msgstr ""
+
+#: menus/admin/forms.py:35
+msgid "Optional \"rel\" attribute that this item will use (ex. \"nofollow\")."
+msgstr ""
+
+#: menus/admin/views.py:16
+msgid "Requested menu item does not exist."
+msgstr ""
+
+#: menus/admin/views.py:30
+msgid "Delete items"
+msgstr ""
+
+#: menus/admin/views.py:31
+msgid "Are you sure you want to delete those menu items?"
+msgstr ""
+
+#: menus/admin/views.py:38
+msgid "Selected menu items have been deleted."
+msgstr ""
+
+#: menus/admin/views.py:42
+#, python-format
+msgid "New menu item %(item)s has been saved."
+msgstr ""
+
+#: menus/admin/views.py:52
+#, python-format
+msgid "Menu item %(item)s has been edited."
+msgstr ""
+
+#: menus/admin/views.py:64
+#, python-format
+msgid "Menu item %(item)s has been deleted."
+msgstr ""
+
+#: menus/admin/views.py:82
+#, python-format
+msgid "Menu item %(item)s has been moved after %(other)s."
+msgstr ""
+
+#: menus/admin/views.py:101
+#, python-format
+msgid "Menu item %(item)s has been moved before %(other)s."
+msgstr ""
+
+#: menus/models.py:10
+msgid "Navbar and footer"
+msgstr ""
+
+#: menus/models.py:11 templates/misago/admin/menuitems/list.html:41
+msgid "Navbar"
+msgstr ""
+
+#: menus/models.py:12 templates/misago/admin/menuitems/list.html:46
+msgid "Footer"
+msgstr ""
+
+#: search/api.py:17 search/views.py:12 search/views.py:21
+msgid "You don't have permission to search site."
+msgstr ""
+
+#: search/permissions.py:10 templates/misago/search.html:23
+#: templates/misago/search.html:34
+msgid "Search"
+msgstr ""
+
+#: search/permissions.py:12
+msgid "Can search site"
+msgstr ""
+
+#: socialauth/admin/__init__.py:40
+msgid "Social login"
+msgstr ""
+
+#: socialauth/admin/__init__.py:42
+msgid "Enable users to sign on and login using their social profile."
+msgstr ""
+
+#: socialauth/admin/forms/base.py:10
+msgid "Button text"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:11
+msgid "Button color"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:12
+msgid "Enable this provider"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:37
+msgid "Associate existing users by email"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:39
+msgid ""
+"Enabling this option will result in the user being signed in if their forum "
+"account was registered using same e-mail address as used on the social site. "
+"Otherwise they will be asked to specify a different e-mail to continue sign "
+"in using social site."
+msgstr ""
+
+#: socialauth/admin/forms/base.py:51 socialauth/admin/forms/base.py:53
+#: threads/admin/forms.py:97
+msgid "This field is required."
+msgstr ""
+
+#: socialauth/admin/forms/facebook.py:8
+msgid "App ID"
+msgstr ""
+
+#: socialauth/admin/forms/facebook.py:9
+msgid "App Secret"
+msgstr ""
+
+#: socialauth/admin/forms/github.py:8 socialauth/admin/forms/google.py:8
+msgid "Client ID"
+msgstr ""
+
+#: socialauth/admin/forms/github.py:9 socialauth/admin/forms/google.py:9
+msgid "Client Secret"
+msgstr ""
+
+#: socialauth/admin/forms/twitter.py:8
+msgid "Consumer API key"
+msgstr ""
+
+#: socialauth/admin/forms/twitter.py:9
+msgid "Consumer API secret key"
+msgstr ""
+
+#: socialauth/admin/views.py:15
+msgid "Requested social login provider does not exist."
+msgstr ""
+
+#: socialauth/admin/views.py:61
+#, python-format
+msgid "Login with %(provider)s has been updated."
+msgstr ""
+
+#: socialauth/admin/views.py:71
+#, python-format
+msgid "Login with %(provider)s has been disabled."
+msgstr ""
+
+#: socialauth/admin/views.py:91
+#, python-format
+msgid "Login with %(provider)s has been moved after %(other)s."
+msgstr ""
+
+#: socialauth/admin/views.py:112
+#, python-format
+msgid "Login with %(provider)s has been moved before %(other)s."
+msgstr ""
+
+#: socialauth/pipeline.py:88
+#, python-format
+msgid ""
+"The e-mail address associated with your %(backend)s account is not available "
+"for use on this site."
+msgstr ""
+
+#: socialauth/pipeline.py:98
+#, python-format
+msgid ""
+"Your account has to be activated by site administrator before you will be "
+"able to sign in with %(backend)s."
+msgstr ""
+
+#: socialauth/pipeline.py:223 users/api/userendpoints/create.py:60
+msgid "Please try resubmitting the form."
+msgstr ""
+
+#: templates/misago/acl_debug.html:5
+#, python-format
+msgid ""
+"\n"
+"    %(user)s roles\n"
+"    "
+msgstr ""
+
+#: templates/misago/acl_debug.html:9
+msgid "Anonymous roles"
+msgstr ""
+
+#: templates/misago/acl_debug.html:30
+msgid "Current ACL"
+msgstr ""
+
+#: templates/misago/acl_debug.html:34
+msgid "Key"
+msgstr ""
+
+#: templates/misago/acl_debug.html:35
+msgid "Value"
+msgstr ""
+
+#: templates/misago/activation/done.html:5
+msgid "Account activated"
+msgstr ""
+
+#: templates/misago/activation/done.html:20
+msgid ""
+"You can now sign in to finish setting up your account and to participate in "
+"or start new discussions."
+msgstr ""
+
+#: templates/misago/activation/error.html:5
+msgid "Activation error"
+msgstr ""
+
+#: templates/misago/activation/error.html:19
+msgid "Can't activate account."
+msgstr ""
+
+#: templates/misago/activation/request.html:5
+#: templates/misago/activation/request.html:13
+msgid "Request activation link"
+msgstr ""
+
+#: templates/misago/activation/request.html:25
+msgid ""
+"The site administrator may impose a requirement on newly registered accounts "
+"to be activated before users will be able to sign in."
+msgstr ""
+
+#: templates/misago/activation/request.html:28
+msgid ""
+"Depending on the time of registration, you will be able to activate your "
+"account by clicking a special activation link. This link will be valid only "
+"for your browser, for seven days or until your account is activated."
+msgstr ""
+
+#: templates/misago/activation/request.html:31
+msgid ""
+"To receive this link, enter your account's e-mail address in the form and "
+"press the \"Send link\" button."
+msgstr ""
+
+#: templates/misago/activation/request.html:49
+msgid "To request a new activation link please enable JavaScript."
+msgstr ""
+
+#: templates/misago/activation/stopped.html:5
+msgid "Activation failed"
+msgstr ""
+
+#: templates/misago/activation/stopped.html:20
+msgid "Your account can't be activated at this time."
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:9
+#: templates/misago/admin/agreements/form.html:40
+#: templates/misago/admin/agreements/list.html:9
+msgid "New agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:29
+#: templates/misago/admin/categories/form.html:35
+#: templates/misago/admin/categoryroles/categoryroles.html:30
+#: templates/misago/admin/ranks/form.html:29
+#: templates/misago/admin/users/edit.html:23
+msgid "View on site"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:38
+#: templates/misago/admin/agreements/list.html:107
+msgid "Edit agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:48
+#: templates/misago/admin/categoryroles/form.html:36
+#: templates/misago/admin/conf/captcha_settings.html:8
+#: templates/misago/admin/menuitems/form.html:41
+#: templates/misago/admin/roles/form.html:36
+msgid "Basic settings"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:58
+msgid "Agreement contents"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:61
+msgid "Fill in one of the fields."
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:17
+#: templates/misago/admin/users/edit.html:299
+msgid "Agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:20
+msgid "Created"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:21
+#: templates/misago/admin/themes/assets/css.html:32
+#: templates/misago/admin/themes/assets/media.html:22
+msgid "Modified"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:41
+msgid "Users are required to accept this agreement to use the site"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:42
+#: templates/misago/admin/themes/list.html:51 users/admin/forms.py:587
+msgid "Active"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:60
+#, python-format
+msgid "%(created_on)s by %(created_by)s"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:78
+#, python-format
+msgid "%(last_modified_on)s by %(last_modified_by)s"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:82
+msgid "never"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:95
+#: templates/misago/admin/themes/list.html:78
+msgid "Set as active"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:102
+msgid "Disable agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:112
+msgid "Remove agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:124
+msgid "No agreements matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:126
+msgid "No agreements are set."
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:137
+msgid "Are you sure you want to set this agreement as active for its type?"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:141
+msgid "Are you sure you want to disable this agreement?"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:145
+msgid "Are you sure you want to remove this agreement?"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:7
+msgid "Attachment"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:8
+msgid "Thread"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:48
+#, python-format
+msgid "%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s."
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:59
+msgid "None"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:66
+#: templates/misago/admin/warnings/list.html:112
+#: templates/misago/poll/results.html:76
+msgid "Delete"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:76
+msgid "No attachments matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:78
+msgid "No attachments exist."
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:113
+msgid "Are you sure you want to delete this attachment?"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:9
+#: templates/misago/admin/attachmenttypes/list.html:9
+msgid "New type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:26
+msgid "Edit attachment type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:28
+msgid "New attachment type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:36
+#: templates/misago/admin/warnings/form.html:34
+msgid "Basic options"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:47
+msgid "Availability"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:18
+msgid "Extensions"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:19
+#: threads/admin/forms.py:56
+msgid "Mimetypes"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:20
+msgid "Files"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:33
+msgid "Uploading new files of this type is disabled"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:34
+msgid "Limited"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:37
+msgid "Uploading and downloading files of this type is disabled"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:38
+#: templates/misago/admin/users/edit.html:67
+#: templates/misago/admin/users/list.html:70
+msgid "Disabled"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:57
+#: templates/misago/admin/categories/list.html:45
+#: templates/misago/admin/menuitems/list.html:54
+#: templates/misago/admin/ranks/list.html:59
+#: templates/misago/admin/ranks/list.html:66
+msgid "Not set"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:70
+msgid "Edit type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:75
+msgid "Delete type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:86
+msgid "No attachment types are set."
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:95
+msgid "Are you sure you want to delete this attachment type?"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:9
+#: templates/misago/admin/bans/form.html:28
+#: templates/misago/admin/bans/list.html:9
+msgid "New ban"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:26
+#: templates/misago/admin/bans/list.html:65
+msgid "Edit ban"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:36
+#: templates/misago/admin/users/ban.html:62
+msgid "Ban settings"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:47
+#: templates/misago/admin/users/ban.html:71
+msgid "Messages"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:61
+#: templates/misago/admin/bans/list.html:54
+#: templates/misago/admin/users/ban.html:90
+msgid "Never"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:62
+#: templates/misago/admin/users/ban.html:91
+msgid "Set date"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:16
+msgid "Ban"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:19
+msgid "Expires on"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:36 users/admin/forms.py:580
+msgid "Registration only"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:41 users/admin/forms.py:587
+#: users/models/datadownload.py:29
+msgid "Expired"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:70
+msgid "Remove ban"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:82
+msgid "No bans matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:84
+msgid "No bans are set."
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:95
+msgid "Are you sure you want to remove this ban?"
+msgstr ""
+
+#: templates/misago/admin/base.html:7 templates/misago/admin/login.html:6
+msgid "Misago Administration"
+msgstr ""
+
+#: templates/misago/admin/categories/delete.html:6
+#, python-format
+msgid "Delete category: %(category)s"
+msgstr ""
+
+#: templates/misago/admin/categories/delete.html:21
+#: templates/misago/admin/categories/delete.html:39
+#: templates/misago/admin/categories/list.html:97
+msgid "Delete category"
+msgstr ""
+
+#: templates/misago/admin/categories/delete.html:27
+msgid "Category contents"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:9
+#: templates/misago/admin/categories/form.html:46
+#: templates/misago/admin/categories/list.html:9
+msgid "New category"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:29
+msgid "Edit permissions"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:44
+#: templates/misago/admin/categories/list.html:94
+#: templates/misago/admin/categoryroles/categoryroles.html:24
+msgid "Edit category"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:54
+msgid "Display and position"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:65
+msgid "Behaviour"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:74
+msgid "Content approval"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:84
+msgid "Prune threads"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:17
+msgid "Category"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:20
+#: templates/misago/admin/dashboard/index.html:45
+#: templates/misago/admin/dashboard/totals.html:31
+#: templates/misago/admin/users/list.html:21
+#: templates/misago/profile/posts.html:5 templates/misago/profile/posts.html:8
+#: templates/misago/profile/posts.html:9 users/apps.py:93
+msgid "Posts"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:58
+#: templates/misago/admin/menuitems/list.html:72
+#: templates/misago/admin/ranks/list.html:74
+#: templates/misago/admin/socialauth/list.html:32
+#: templates/misago/admin/themes/assets/css.html:68
+#: templates/misago/admin/warnings/list.html:84
+msgid "Move down"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:72
+#: templates/misago/admin/menuitems/list.html:86
+#: templates/misago/admin/ranks/list.html:88
+#: templates/misago/admin/socialauth/list.html:46
+#: templates/misago/admin/themes/assets/css.html:73
+#: templates/misago/admin/warnings/list.html:96
+msgid "Move up"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:107
+msgid "No categories are set."
+msgstr ""
+
+#: templates/misago/admin/categoryroles/categoryroles.html:6
+#, python-format
+msgid "%(category)s: Permissions"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/categoryroles.html:59
+#: templates/misago/admin/categoryroles/rolecategories.html:56
+msgid "Are you sure you want to abandon changes?"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/form.html:9
+#: templates/misago/admin/categoryroles/form.html:28
+msgid "New category role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/form.html:26
+msgid "Edit category role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:9
+#: templates/misago/admin/roles/form.html:9
+#: templates/misago/admin/roles/form.html:28
+#: templates/misago/admin/roles/list.html:9
+msgid "New role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:16 users/admin/forms.py:250
+msgid "Roles"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:34
+#: templates/misago/admin/categoryroles/rolecategories.html:24
+#: templates/misago/admin/roles/form.html:26
+#: templates/misago/admin/roles/list.html:42
+msgid "Edit role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:39
+#: templates/misago/admin/roles/list.html:47
+msgid "Delete role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:50
+msgid "No category roles are set."
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:59
+#: templates/misago/admin/roles/list.html:67
+msgid "Are you sure you want to delete this role?"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/rolecategories.html:6
+#, python-format
+msgid "%(role)s: Category permissions"
+msgstr ""
+
+#: templates/misago/admin/conf/analytics_settings.html:8
+msgid "Google Analytics and Search Console"
+msgstr ""
+
+#: templates/misago/admin/conf/captcha_settings.html:16
+msgid "reCAPTCHA"
+msgstr ""
+
+#: templates/misago/admin/conf/captcha_settings.html:35
+msgid "Stop Forum Spam"
+msgstr ""
+
+#: templates/misago/admin/conf/form.html:16
+#: templates/misago/admin/socialauth/list.html:63
+msgid "Change settings"
+msgstr ""
+
+#: templates/misago/admin/conf/form.html:27
+#: templates/misago/admin/generic/form.html:25
+msgid "Form was completed with errors."
+msgstr ""
+
+#: templates/misago/admin/conf/form.html:37
+#: templates/misago/admin/generic/form.html:45
+#: templates/misago/admin/themes/assets/css-editor-form.html:60
+#: templates/misago/emails/change_email.html:16
+#: templates/misago/emails/change_password.html:16
+msgid "Save changes"
+msgstr ""
+
+#: templates/misago/admin/conf/general_settings.html:8
+msgid "Site details"
+msgstr ""
+
+#: templates/misago/admin/conf/general_settings.html:35
+msgid "Open Graph image"
+msgstr ""
+
+#: templates/misago/admin/conf/general_settings.html:49
+msgid "Forum index"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:8
+msgid "Posting"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:26
+msgid "Threads lists"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:34
+msgid "Thread pages"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:44
+msgid "Read-tracker"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:52
+msgid "Attachment error images"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:8
+msgid "New accounts"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:17 users/admin/forms.py:484
+#: users/admin/forms.py:573
+msgid "Usernames"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:27
+msgid "Avatars"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:43
+msgid "Signatures"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:51
+#: users/admin/__init__.py:80
+msgid "Data downloads"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:60
+msgid "Own account deletion"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:68 users/admin/forms.py:492
+msgid "IP addresses"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:76
+msgid "Default subscription preferences"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:85
+msgid "Users lists"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:94
+msgid "Top posters ranking"
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:5
+msgid "System checks"
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:16
+#: templates/misago/admin/dashboard/index.html:32
+msgid "Checking Misago version used by the site..."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:30
+msgid "The site is running in DEBUG mode."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:31
+msgid ""
+"Error pages displayed in DEBUG mode will expose site configuration details "
+"like secrets and tokens to all visitors. This is MAJOR security risk."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:48
+msgid "Forum address is not configured."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:49
+msgid "Links in e-mails sent by Misago will be broken."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:69
+msgid "Configured forum address appears to be incorrect."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:77
+#, python-format
+msgid ""
+"Your forum address is set to %(configured_address)s while correct value "
+"appears to be %(correct_address)s."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:82
+msgid "Links in e-mails sentby Misagoill be broken."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:102
+msgid "The site is not running over HTTPS."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:103
+msgid ""
+"Browsers may warn users visiting the site about it being insecure. Search "
+"engines will lower its position in search results."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:117
+msgid "Cache is disabled."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:118
+msgid ""
+"This will cause degraded performance and increased CPU usage by the site, "
+"possibly leading to increased hosting costs."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:133
+#, python-format
+msgid "There is %(downloads)s unprocessed data download request."
+msgid_plural "There are %(downloads)s unprocessed data download requests."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/dashboard/checks.html:139
+msgid ""
+"Cron task that should process user data download requests is not running."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:156
+#, python-format
+msgid "There is %(users)s inactive user accounts."
+msgid_plural "There are %(users)s inactive users accounts."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/dashboard/checks.html:162
+msgid ""
+"The site may be targeted by bots, is not sending activation e-mails, or is "
+"not configured to delete inactive user accounts."
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:28
+msgid "Version check is currently unavailable due to an error."
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:29
+msgid "Misago admin API did not answer or answered with an error."
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:42
+msgid "User registrations"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:43
+msgid "User deletions"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:44
+msgid "Threads started"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:46
+msgid "Attachments uploaded"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:47
+msgid "Data download requests"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:49
+msgid "Site analytics are currently unavailable due to an error."
+msgstr ""
+
+#: templates/misago/admin/dashboard/totals.html:43 threads/admin/__init__.py:36
+#: threads/permissions/attachments.py:11 threads/permissions/attachments.py:29
+msgid "Attachments"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/form.html:6
+#: templates/misago/admin/datadownloads/form.html:11
+msgid "Request new data downloads"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:9
+msgid "New downloads"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:17
+#: templates/misago/admin/users/ban.html:28
+#: templates/misago/admin/users/list.html:17 users/admin/forms.py:670
+msgid "User"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:18 threads/admin/forms.py:58
+#: users/admin/forms.py:668
+msgid "Status"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:19
+msgid "Requested on"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:21 users/admin/forms.py:671
+msgid "Requested by"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:32
+#: templates/misago/admin/datadownloads/list.html:51
+#: templates/misago/admin/datadownloads/list.html:54
+#: templates/misago/admin/users/ban.html:38
+#: templates/misago/admin/users/edit.html:38
+#: templates/misago/admin/users/edit.html:195
+#: templates/misago/admin/users/list.html:32
+#: templates/misago/userslists/active_posters.html:83
+msgid "Avatar"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:70
+#: templates/misago/admin/datadownloads/list.html:74
+msgid "Download"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:84
+msgid "No data downloads matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:86
+msgid "No data downloads exist."
+msgstr ""
+
+#: templates/misago/admin/errorpages/403.html:5
+#: templates/misago/errorpages/403.html:5
+msgid "Page not available"
+msgstr ""
+
+#: templates/misago/admin/errorpages/403.html:12
+msgid "Requested page is not available"
+msgstr ""
+
+#: templates/misago/admin/errorpages/403.html:18
+#: templates/misago/errorpages/403.html:12
+#: templates/misago/errorpages/403.html:25
+#: templates/misago/errorpages/403.html:34
+#: templates/misago/errorpages/403.html:54
+msgid "You don't have permission to access this page."
+msgstr ""
+
+#: templates/misago/admin/errorpages/404.html:5
+#: templates/misago/errorpages/403.html:17
+#: templates/misago/errorpages/403.html:18
+#: templates/misago/errorpages/404.html:5
+#: templates/misago/errorpages/404.html:13
+#: templates/misago/errorpages/404.html:14
+msgid "Page not found"
+msgstr ""
+
+#: templates/misago/admin/errorpages/404.html:12
+msgid "Requested page could not be found"
+msgstr ""
+
+#: templates/misago/admin/errorpages/404.html:16
+#: templates/misago/errorpages/404.html:9
+#: templates/misago/errorpages/404.html:18
+#: templates/misago/errorpages/404.html:23
+msgid ""
+"The link you clicked was incorrect or the page has been moved or deleted."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure.html:5
+#: templates/misago/admin/errorpages/csrf_failure.html:14
+#: templates/misago/admin/errorpages/csrf_failure_authenticated.html:5
+#: templates/misago/admin/errorpages/csrf_failure_authenticated.html:12
+msgid "Form submission rejected"
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:3
+msgid ""
+"Your form submission was rejected because your browser didn't send the CSRF "
+"cookie, or the cookie sent was invalid."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:6
+msgid "This is usually a result of one of following problems:"
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:9
+msgid "Your browser is configured to don't accept or send any cookies."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:12
+msgid ""
+"The form was sent after being opened in the browser for a long time (eg. few "
+"days) and cookie token has expired."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:15
+msgid ""
+"The site is configured to use the HTTPS, but this form was sent over the the "
+"HTTP."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:16
+msgid ""
+"If you are an owner of this site, please check if the HTTPS certificate used "
+"by the site is valid and accepted by the browser."
+msgstr ""
+
+#: templates/misago/admin/generic/filter_form.html:7
+msgid "Filter"
+msgstr ""
+
+#: templates/misago/admin/generic/filter_form.html:17
+msgid "Clear filters"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:36
+#: templates/misago/admin/themes/assets/css-editor-form.html:69
+#: templates/misago/admin/themes/assets/css-link-form.html:44
+#: templates/misago/admin/themes/assets/upload-css.html:20
+#: templates/misago/admin/themes/assets/upload-media.html:26
+msgid "Cancel"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:42
+#: templates/misago/admin/themes/assets/css-editor-form.html:58
+msgid "Save and keep editing"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:49
+msgid "Save and add another"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:52
+#: templates/misago/admin/themes/assets/css-editor-form.html:62
+msgid "Save"
+msgstr ""
+
+#: templates/misago/admin/generic/list.html:87
+msgid "Filters"
+msgstr ""
+
+#: templates/misago/admin/generic/list.html:90
+#: templates/misago/admin/generic/list.html:105
+#: templates/misago/admin/themes/assets/upload-css.html:7
+#: templates/misago/admin/themes/assets/upload-media.html:7
+msgid "Close"
+msgstr ""
+
+#: templates/misago/admin/generic/list.html:108
+msgid "Done"
+msgstr ""
+
+#: templates/misago/admin/generic/mass_actions.html:10
+msgid "With selected:"
+msgstr ""
+
+#: templates/misago/admin/generic/order_by.html:5
+msgid "Sort:"
+msgstr ""
+
+#: templates/misago/admin/generic/order_by.html:10
+msgid "Change sorting to:"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:4
+#: templates/misago/thread/paginator.html:7
+msgid "Go to first page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:5
+#: templates/misago/admin/generic/paginator.html:9
+msgid "First"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:13
+#: templates/misago/thread/paginator.html:13
+#: templates/misago/thread/paginator.html:19
+#: templates/misago/userslists/rank.html:99
+#: templates/misago/userslists/rank.html:107
+msgid "Go to previous page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:22
+#: templates/misago/thread/paginator.html:27
+#: templates/misago/userslists/rank.html:116
+msgid "Go to next page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:31
+#: templates/misago/thread/paginator.html:32
+msgid "Go to last page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:32
+#: templates/misago/admin/generic/paginator.html:36
+#: templates/misago/thread/toolbar-top.html:20
+msgid "Last"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:41
+#, python-format
+msgid "Page %(page)s of %(pages)s"
+msgstr ""
+
+#: templates/misago/admin/icons.html:8
+msgid "Favicon"
+msgstr ""
+
+#: templates/misago/admin/icons.html:11
+msgid ""
+"Favicon is small icon that internet browsers display next to your site in "
+"its interface."
+msgstr ""
+
+#: templates/misago/admin/icons.html:68
+msgid "Apple Touch Icon"
+msgstr ""
+
+#: templates/misago/admin/icons.html:71
+msgid ""
+"Apple devices and Safari web browser will use this image to represent the "
+"site in its interfaces."
+msgstr ""
+
+#: templates/misago/admin/login.html:6
+msgid "Log in"
+msgstr ""
+
+#: templates/misago/admin/login.html:6
+msgid "Django Administration"
+msgstr ""
+
+#: templates/misago/admin/login.html:24
+msgid "Administration"
+msgstr ""
+
+#: templates/misago/admin/login.html:29 users/captcha.py:19
+msgid "Please try again."
+msgstr ""
+
+#: templates/misago/admin/login.html:48 users/forms/auth.py:60
+msgid "Username or e-mail"
+msgstr ""
+
+#: templates/misago/admin/login.html:53 users/admin/forms.py:67
+#: users/forms/auth.py:63
+msgid "Password"
+msgstr ""
+
+#: templates/misago/admin/login.html:57 templates/misago/auth.html:5
+msgid "Sign in"
+msgstr ""
+
+#: templates/misago/admin/login.html:60
+msgid "Return to site"
+msgstr ""
+
+#: templates/misago/admin/menuitems/form.html:9
+#: templates/misago/admin/menuitems/form.html:33
+#: templates/misago/admin/menuitems/list.html:9
+msgid "New menu item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/form.html:31
+msgid "Edit menu item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/form.html:50
+msgid "Behavior and appearance"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:16
+msgid "Item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:18
+msgid "CSS Class"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:19
+msgid "Target"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:20
+msgid "Rel"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:40
+msgid "Is displayed on the forum navbar."
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:45
+msgid "Is displayed on the forum footer."
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:103
+msgid "Edit item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:108
+msgid "Remove item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:119
+msgid "No menu items are set."
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:129
+msgid "Are you sure you want to remove this menu item?"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:12
+msgid "GitHub"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:16
+msgid "Support forum"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:20
+msgid "Site index"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:24
+msgid "Your avatar"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:29
+msgid "Edit your account"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:35
+msgid "Close admin session"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:41
+msgid "Log out completely"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:9
+#: templates/misago/admin/ranks/form.html:40
+#: templates/misago/admin/ranks/list.html:9
+msgid "New rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:38
+#: templates/misago/admin/ranks/list.html:116
+msgid "Edit rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:48
+msgid "Name and description"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:66
+msgid "Display and visibility"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:17
+#: templates/misago/admin/users/list.html:19
+#: templates/misago/userslists/active_posters.html:112
+#: templates/misago/userslists/active_posters.html:123 users/admin/forms.py:238
+msgid "Rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:45
+msgid "Has dedicated page on users list"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:46
+msgid "Tab"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:50
+msgid "This is default rank assigned to new members"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:51
+msgid "Default"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:105
+msgid "List users"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:111
+msgid "Set as default"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:121
+msgid "Delete rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:132
+msgid "No user ranks are set."
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:141
+msgid "Are you sure you want to delete this rank?"
+msgstr ""
+
+#: templates/misago/admin/roles/list.html:39
+msgid "Users with role"
+msgstr ""
+
+#: templates/misago/admin/roles/list.html:58
+msgid "No user roles are set."
+msgstr ""
+
+#: templates/misago/admin/socialauth/form.html:17
+msgid "Edit social login"
+msgstr ""
+
+#: templates/misago/admin/socialauth/form.html:19
+msgid "Setup social login"
+msgstr ""
+
+#: templates/misago/admin/socialauth/form.html:40
+msgid "Button appearance"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:8
+msgid "Enabled login methods"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:15
+#: templates/misago/admin/socialauth/list.html:106
+msgid "Provider"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:68
+msgid "Disable login"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:79
+msgid "No social login methods are enabled."
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:88
+msgid "Are you sure you want to disable this social login provider?"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:100
+msgid "Setup new login method"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:119
+msgid "Setup login with this provider"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:120
+msgid "Setup"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:127
+msgid "No new login providers are available for setup at this time."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-editor-form.html:9
+#: templates/misago/admin/themes/assets/css-editor-form.html:41
+msgid "New CSS"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-editor-form.html:39
+msgid "Edit CSS"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-link-form.html:9
+#: templates/misago/admin/themes/assets/css-link-form.html:31
+msgid "New CSS link"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-link-form.html:29
+msgid "Edit CSS link"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:7
+msgid "CSS files"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:12
+#: templates/misago/admin/themes/assets/media.html:12
+#: templates/misago/admin/themes/assets/upload-css.html:21
+#: templates/misago/admin/themes/assets/upload-media.html:27
+msgid "Upload"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:22
+msgid "Create"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:33
+#: templates/misago/admin/themes/assets/media.html:23
+msgid "Size"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:80
+#: templates/misago/admin/themes/assets/css.html:84
+#: templates/misago/admin/users/list.html:95
+#: templates/misago/admin/warnings/list.html:105
+#: templates/misago/poll/results.html:69
+#: templates/misago/profile/details.html:25
+#: templates/misago/thread/posts/post/footer.html:31
+#: users/admin/djangoadmin.py:72
+msgid "Edit"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:94
+msgid "This theme has no CSS files."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:103
+#: templates/misago/admin/themes/assets/media.html:79
+msgid "Delete selected"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/list.html:6
+msgid "Assets"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/list.html:22
+#: templates/misago/admin/themes/form.html:38
+msgid "Edit theme"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/list.html:44
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/media.html:7
+msgid "Media"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/media.html:25
+msgid "Dimensions"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/media.html:70
+msgid "This theme has no media."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-css.html:6
+msgid "Upload CSS"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-css.html:15
+msgid "Select CSS files to upload"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:6
+msgid "Upload media"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:15
+msgid "Select media files to upload"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:18
+msgid ""
+"Media files are primarily image and font files that can be linked to from "
+"the CSS, but files of any type can be uploaded using this option."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:21
+msgid ""
+"Theme CSS that use the \"url()\" to point to media files will be updated "
+"automatically."
+msgstr ""
+
+#: templates/misago/admin/themes/form.html:9
+#: templates/misago/admin/themes/form.html:40
+msgid "New theme"
+msgstr ""
+
+#: templates/misago/admin/themes/form.html:29
+#: templates/misago/admin/themes/list.html:63
+msgid "Edit assets"
+msgstr ""
+
+#: templates/misago/admin/themes/form.html:57
+msgid "Additional information (optional)"
+msgstr ""
+
+#: templates/misago/admin/themes/import.html:6
+#: templates/misago/admin/themes/import.html:11
+#: templates/misago/admin/themes/list.html:9
+msgid "Import theme"
+msgstr ""
+
+#: templates/misago/admin/themes/import.html:23
+msgid "Import"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:15
+msgid "Create theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:22
+msgid "Theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:68
+msgid "Edit information"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:72
+msgid "Create child theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:86
+msgid "Export theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:94
+msgid "Delete theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:109
+msgid ""
+"Are you sure you want to delete this theme? Deleting theme will also delete "
+"its child themes."
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:6
+#: templates/misago/admin/users/ban.html:82 users/admin/views/users.py:74
+msgid "Ban users"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:11
+msgid "Ban selected users"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:29 users/admin/forms.py:314
+#: users/signals.py:30
+msgid "E-mail"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:30 users/models/ban.py:73
+msgid "IP address"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:51
+#: templates/misago/admin/users/list.html:85
+msgid "IP removed"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:31
+#: templates/misago/admin/users/list.html:94
+msgid "Edit user"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:44
+#: templates/misago/admin/users/list.html:47
+msgid "Can use admin control panel and manage other administrators"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:45
+#: templates/misago/admin/users/list.html:48
+msgid "Super Admin"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:48
+#: templates/misago/admin/users/list.html:51
+msgid "Can use admin control panel"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:49
+#: templates/misago/admin/users/list.html:52
+msgid "Admin"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:53
+#: templates/misago/admin/users/list.html:56
+msgid "Requires activation by administrator"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:54
+#: templates/misago/admin/users/edit.html:58
+#: templates/misago/admin/users/list.html:57
+#: templates/misago/admin/users/list.html:61
+msgid "Inactive"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:57
+#: templates/misago/admin/users/list.html:60
+msgid "Has to activate their account"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:62
+#: templates/misago/admin/users/list.html:65
+msgid "Account scheduled for deletion"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:63
+#: templates/misago/admin/users/list.html:66
+msgid "Deleted"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:66
+#: templates/misago/admin/users/list.html:69 users/admin/forms.py:317
+msgid "Account disabled"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:92
+#: templates/misago/categories/stats.html:12
+#: templates/misago/thread/posts/post/side.html:41
+#: templates/misago/thread/posts/post/side.html:49
+#: templates/misago/userslists/usercard.html:52
+#, python-format
+msgid "%(posts)s post"
+msgid_plural "%(posts)s posts"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/users/edit.html:99
+#: templates/misago/categories/stats.html:5
+#: templates/misago/userslists/usercard.html:59
+#, python-format
+msgid "%(threads)s thread"
+msgid_plural "%(threads)s threads"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/users/edit.html:110
+#: templates/misago/admin/users/new.html:18
+msgid "Basic account settings"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:129
+msgid "Administrator status"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:136
+msgid "Only superusers can change other users administrator status."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:180
+#: templates/misago/admin/users/new.html:37
+msgid "Sign-in credentials"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:184
+msgid ""
+"This user has not set account password and uses other service to "
+"authenticate."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:205
+msgid "Signature"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:228 users/apps.py:24
+msgid "Forum options"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:237
+msgid "Automatic subscription preferences"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:246
+msgid "Account status"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:250
+msgid ""
+"This user is deleting their account. It has been deactivated for the "
+"duration of the process."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:251
+msgid ""
+"No additional action is required. This account will be deleted automatically."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:294
+msgid "Agreements"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:301
+msgid "Accepted on"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:324
+msgid "This user didn't accept any agreements."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:9
+#: templates/misago/admin/users/new.html:6
+#: templates/misago/admin/users/new.html:11
+msgid "New user"
+msgstr ""
+
+#: templates/misago/admin/users/list.html:20
+msgid "Registration"
+msgstr ""
+
+#: templates/misago/admin/users/list.html:103
+msgid "No users matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:111
+msgid "You can include wildcard (\"*\") in username and email search:"
+msgstr ""
+
+#: templates/misago/admin/users/list.html:114
+msgid "\"admin*\" will find both \"admin\" and \"administrator\"."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:117
+msgid "\"*chan\" will match both \"chan\" and \"marichan\"."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:120
+msgid "\"*son*\" will match \"son\", \"song\", \"firstson\" and \"firstsong\"."
+msgstr ""
+
+#: templates/misago/admin/users/new.html:47
+msgid "Save user"
+msgstr ""
+
+#: templates/misago/admin/warnings/form.html:9
+#: templates/misago/admin/warnings/form.html:19
+#: templates/misago/admin/warnings/list.html:9
+msgid "New warning level"
+msgstr ""
+
+#: templates/misago/admin/warnings/form.html:41
+msgid "Restrictions"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:16
+msgid "Warning level"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:17
+msgid "Length"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:18
+msgid "Replying"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:19
+msgid "Starting threads"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:40
+msgid "Permanent"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:47
+#: templates/misago/admin/warnings/list.html:65
+msgid "Not restricted"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:52
+#: templates/misago/admin/warnings/list.html:70
+msgid "Moderated"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:57
+#: templates/misago/admin/warnings/list.html:75
+msgid "Forbidden"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:122
+msgid "No warning levels are set."
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:131
+msgid "Are you sure you want to delete this warning level?"
+msgstr ""
+
+#: templates/misago/auth.html:10
+msgid "Log out"
+msgstr ""
+
+#: templates/misago/categories/base.html:18
+#: templates/misago/categories/base.html:49
+#: templates/misago/categories/base.html:62
+#, python-format
+msgid ""
+"There is %(categories)s main category currenty available on the "
+"%(forum_name)s."
+msgid_plural ""
+"There are %(categories)s main categories currenty available on the "
+"%(forum_name)s."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/categories/body.html:15
+msgid "No categories exist or you don't have permission to see them."
+msgstr ""
+
+#: templates/misago/categories/icon.html:4
+msgid "This category has no new posts. (closed)"
+msgstr ""
+
+#: templates/misago/categories/icon.html:10
+msgid "This category has new posts. (closed)"
+msgstr ""
+
+#: templates/misago/categories/icon.html:18
+msgid "This category has no new posts."
+msgstr ""
+
+#: templates/misago/categories/icon.html:24
+msgid "This category has new posts."
+msgstr ""
+
+#: templates/misago/categories/last_thread.html:54
+msgid "This category is empty. No threads were posted within it so far."
+msgstr ""
+
+#: templates/misago/categories/last_thread.html:68
+msgid "This category is private. You can see only your own threads within it."
+msgstr ""
+
+#: templates/misago/categories/last_thread.html:82
+msgid "This category is protected. You can't browse it's contents."
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.html:6
+#: templates/misago/emails/activation/by_admin.txt:6
+#, python-format
+msgid "%(user)s, your account has been activated by forum administrator."
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.html:12
+#: templates/misago/emails/register/complete.html:18
+#: templates/misago/emails/register/inactive.html:31
+msgid "this form"
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.html:14
+#, python-format
+msgid "You can now sign in to it using %(login_form)s."
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.txt:10
+msgid "You can now sign in to it using the form below:"
+msgstr ""
+
+#: templates/misago/emails/activation/by_user.html:6
+#: templates/misago/emails/activation/by_user.txt:6
+#, python-format
+msgid "%(user)s, to activate your account click the below link:"
+msgstr ""
+
+#: templates/misago/emails/activation/by_user.html:11
+#: templates/misago/emails/register/inactive.html:27
+msgid "Activate my account!"
+msgstr ""
+
+#: templates/misago/emails/change_email.html:6
+#: templates/misago/emails/change_email.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because you have changed your e-"
+"mail address."
+msgstr ""
+
+#: templates/misago/emails/change_email.html:11
+#: templates/misago/emails/change_email.txt:10
+#: templates/misago/emails/change_password.html:11
+#: templates/misago/emails/change_password.txt:10
+msgid "To confirm this change, click the link below:"
+msgstr ""
+
+#: templates/misago/emails/change_password.html:6
+#: templates/misago/emails/change_password.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because you have changed your "
+"password."
+msgstr ""
+
+#: templates/misago/emails/change_password_form_link.html:6
+#: templates/misago/emails/change_password_form_link.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because you want to change "
+"forgotten password for your forum account."
+msgstr ""
+
+#: templates/misago/emails/change_password_form_link.html:11
+#: templates/misago/emails/change_password_form_link.txt:10
+msgid "To change your account password click the link below:"
+msgstr ""
+
+#: templates/misago/emails/change_password_form_link.html:16
+#: templates/misago/forgottenpassword/form.html:7
+#: templates/misago/forgottenpassword/form.html:20
+#: templates/misago/forgottenpassword/request.html:7
+#: templates/misago/forgottenpassword/request.html:20
+msgid "Set new password"
+msgstr ""
+
+#: templates/misago/emails/data_download.html:6
+#: templates/misago/emails/data_download.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because your data is ready for "
+"download."
+msgstr ""
+
+#: templates/misago/emails/data_download.html:11 users/apps.py:52
+msgid "Download data"
+msgstr ""
+
+#: templates/misago/emails/data_download.html:14
+#: templates/misago/emails/data_download.txt:15
+#, python-format
+msgid ""
+"This link will remain active for %(expires_in)s hour from the time this "
+"message has been sent."
+msgid_plural ""
+"This link will remain active for %(expires_in)s hours from the time this "
+"message has been sent."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/emails/data_download.txt:10
+msgid "To download your data, click the following link:"
+msgstr ""
+
+#: templates/misago/emails/privatethread/added.html:9
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has invited you "
+"to participate in private thread %(thread)s."
+msgstr ""
+
+#: templates/misago/emails/privatethread/added.html:14
+#: templates/misago/emails/privatethread/added.txt:10
+msgid "To read this thread click the link below:"
+msgstr ""
+
+#: templates/misago/emails/privatethread/added.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has invited you "
+"to participate in private thread \"%(thread)s\"."
+msgstr ""
+
+#: templates/misago/emails/register/complete.html:6
+#: templates/misago/emails/register/complete.txt:6
+#: templates/misago/emails/register/inactive.txt:6
+#, python-format
+msgid "%(user)s, thank you for joining us!"
+msgstr ""
+
+#: templates/misago/emails/register/complete.html:12
+#: templates/misago/emails/register/complete.txt:10
+msgid ""
+"You may now join discussion on our forums. Why not spend a minute or two to "
+"have a look around and share your opinions and knowledge with rest of "
+"community?"
+msgstr ""
+
+#: templates/misago/emails/register/complete.html:20
+#, python-format
+msgid "You can always sign in to your account using %(login_form)s."
+msgstr ""
+
+#: templates/misago/emails/register/complete.txt:14
+msgid "You can always sign in to your account using the form below:"
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:7
+#: templates/misago/emails/register/inactive.txt:10
+msgid ""
+"Before you will be able to join discussion on our forums, one of our "
+"administrators will have to activate your account."
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:12
+#: templates/misago/emails/register/inactive.txt:15
+msgid ""
+"This may take a while, but you will receive e-mail with notification once it "
+"happens."
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:17
+#: templates/misago/emails/register/inactive.txt:20
+msgid "Thank you for your patience and see you soon!"
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:22
+#: templates/misago/emails/register/inactive.txt:25
+msgid ""
+"Before you will be able to join discussion on our forums, you have to "
+"activate your account. To do so, simply click the link below:"
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:33
+#, python-format
+msgid ""
+"Once your account is activated, you can always sign in to it using "
+"%(login_form)s."
+msgstr ""
+
+#: templates/misago/emails/register/inactive.txt:30
+msgid ""
+"Once your account is activated, you can always sign in to it using the form "
+"below:"
+msgstr ""
+
+#: templates/misago/emails/thread/reply.html:9
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has replied to "
+"the thread %(thread)s that you are subscribed to."
+msgstr ""
+
+#: templates/misago/emails/thread/reply.html:14
+#: templates/misago/emails/thread/reply.txt:10
+msgid "To read this reply, click the below link:"
+msgstr ""
+
+#: templates/misago/emails/thread/reply.html:17
+msgid "Go to reply"
+msgstr ""
+
+#: templates/misago/emails/thread/reply.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has replied to "
+"the thread \"%(thread)s\" that you are subscribed to."
+msgstr ""
+
+#: templates/misago/errorpages/403.html:50
+msgid "This page is not available."
+msgstr ""
+
+#: templates/misago/errorpages/404.html:38
+msgid "Requested page could not be found."
+msgstr ""
+
+#: templates/misago/errorpages/404.html:39
+msgid ""
+"The link you followed was incorrect or the page has been moved or deleted."
+msgstr ""
+
+#: templates/misago/errorpages/405.html:5
+#: templates/misago/errorpages/405.html:13
+#: templates/misago/errorpages/405.html:14
+msgid "Wrong way"
+msgstr ""
+
+#: templates/misago/errorpages/405.html:9
+#: templates/misago/errorpages/405.html:18
+#: templates/misago/errorpages/405.html:23
+#: templates/misago/errorpages/405.html:39
+msgid "This page should be reached via form submission or pressing button."
+msgstr ""
+
+#: templates/misago/errorpages/405.html:38
+msgid "Page reached in wrong way."
+msgstr ""
+
+#: templates/misago/errorpages/ban_message.html:15
+#, python-format
+msgid "This ban expires on %(expires_on)s."
+msgstr ""
+
+#: templates/misago/errorpages/ban_message.html:19
+msgid "This ban is permanent."
+msgstr ""
+
+#: templates/misago/errorpages/banned.html:5
+msgid "You are banned"
+msgstr ""
+
+#: templates/misago/errorpages/banned.html:9
+msgid "You are banned from accessing this page."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:5
+#: templates/misago/errorpages/csrf_failure_authenticated.html:5
+msgid "Request blocked"
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:9
+msgid ""
+"This is usually caused by your browser not accepting or using outdated "
+"cookies. Check your browser configuration and try again."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:24
+#: templates/misago/errorpages/csrf_failure_authenticated.html:19
+msgid "Suspicious request blocked."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:25
+#: templates/misago/errorpages/csrf_failure_authenticated.html:20
+msgid ""
+"This is usually caused by your browser not accepting or using outdated "
+"cookies."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:26
+#: templates/misago/errorpages/csrf_failure_authenticated.html:21
+msgid "Check your browser configuration and try again."
+msgstr ""
+
+#: templates/misago/errorpages/social.html:5
+#: templates/misago/errorpages/social.html:11
+#: templates/misago/errorpages/social.html:12
+msgid "Problem with sign in"
+msgstr ""
+
+#: templates/misago/errorpages/social.html:38
+msgid ""
+"Please try again or use another method to sign in if the problem persists."
+msgstr ""
+
+#: templates/misago/footer.html:9
+msgid "For complete experience please enable JavaScript."
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:7
+msgid "Set new password error"
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:9
+msgid "Change forgotten password error"
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:26
+msgid "Can't set new password."
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:28
+msgid "Can't change forgotten password."
+msgstr ""
+
+#: templates/misago/forgottenpassword/form.html:9
+#: templates/misago/forgottenpassword/form.html:22
+#: templates/misago/forgottenpassword/request.html:9
+#: templates/misago/forgottenpassword/request.html:22
+msgid "Change forgotten password"
+msgstr ""
+
+#: templates/misago/forgottenpassword/form.html:42
+msgid "To reset your password please enable JavaScript."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:35
+msgid ""
+"Your user account has no password set for it because it was created with "
+"other service."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:36
+msgid ""
+"To set password for your account, you can use special secure form that will "
+"be available by special link valid only for your browser, for seven days or "
+"until your password is set."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:38
+msgid ""
+"Because user passwords are processed in an irreversible way before being "
+"saved to database, it is not possible for us to simply send you your "
+"password."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:39
+msgid ""
+"Instead, you can change your password using special secure form that will be "
+"available by special link valid only for your browser, for seven days or "
+"until your password is changed."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:42
+msgid ""
+"To receive this link, enter your account's e-mail addres in form and press "
+"the \"Send link\" button."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:60
+msgid "To request new password reset link please enable JavaScript."
+msgstr ""
+
+#: templates/misago/options/credentials_changed.html:5
+#: templates/misago/options/credentials_error.html:5
+msgid "Change sign-in credentials"
+msgstr ""
+
+#: templates/misago/options/credentials_changed.html:20
+msgid "From now you will need to use new credentials when signing in."
+msgstr ""
+
+#: templates/misago/options/credentials_error.html:19
+msgid "Change confirmation link is invalid."
+msgstr ""
+
+#: templates/misago/options/credentials_error.html:20
+msgid ""
+"The confirmation link belongs to other user, was already used, or has "
+"expired."
+msgstr ""
+
+#: templates/misago/options/noscript.html:5
+msgid "Change your options"
+msgstr ""
+
+#: templates/misago/options/noscript.html:20
+#: templates/misago/socialauth.html:22
+msgid "Enable JavaScript"
+msgstr ""
+
+#: templates/misago/options/noscript.html:21
+msgid "You need to enable JavaScript in your browser to change your options."
+msgstr ""
+
+#: templates/misago/participants.html:30
+msgid "Add participant"
+msgstr ""
+
+#: templates/misago/participants.html:36
+#, python-format
+msgid "This thread has %(users)s participant."
+msgid_plural "This thread has %(users)s participants."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/info.html:4
+#, python-format
+msgid "%(votes)s vote."
+msgid_plural "%(votes)s votes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/info.html:15
+#, python-format
+msgid "Voting ends on %(ends_on)s."
+msgstr ""
+
+#: templates/misago/poll/info.html:22
+msgid "Votes are public."
+msgstr ""
+
+#: templates/misago/poll/info.html:36
+#, python-format
+msgid "Posted by %(poster)s on %(posted_on)s."
+msgstr ""
+
+#: templates/misago/poll/results.html:21 templates/misago/poll/results.html:31
+#, python-format
+msgid "%(votes)s vote, %(proc)s%% of total."
+msgid_plural "%(votes)s votes, %(proc)s%% of total."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/results.html:41
+msgid "Your choice."
+msgstr ""
+
+#: templates/misago/poll/results.html:55
+msgid "Vote"
+msgstr ""
+
+#: templates/misago/poll/results.html:62
+msgid "See votes"
+msgstr ""
+
+#: templates/misago/poll/voting.html:24
+#, python-format
+msgid "You can select %(choices)s choice."
+msgid_plural "You can select %(choices)s choices."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/voting.html:32
+msgid "You can change your vote later."
+msgstr ""
+
+#: templates/misago/poll/voting.html:36
+msgid "Votes are final."
+msgstr ""
+
+#: templates/misago/poll/voting.html:46
+msgid "Save your vote"
+msgstr ""
+
+#: templates/misago/poll/voting.html:51
+msgid "See results"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:5
+#: templates/misago/profile/ban_details.html:8
+#: templates/misago/profile/ban_details.html:9
+#: templates/misago/profile/ban_details.html:16 users/apps.py:128
+msgid "Ban details"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:22
+msgid "User-shown ban message"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:31
+msgid "Team-shown ban message"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:39
+msgid "Ban expiration"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:43
+#, python-format
+msgid "%(username)s's ban expires on %(expires_on)s."
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:47
+#, python-format
+msgid "%(username)s's ban is permanent."
+msgstr ""
+
+#: templates/misago/profile/base.html:9 templates/misago/profile/base.html:20
+#: templates/misago/profile/base.html:35
+#, python-format
+msgid "%(title)s, joined on %(joined_on)s."
+msgstr ""
+
+#: templates/misago/profile/base.html:22 templates/misago/profile/base.html:37
+#, python-format
+msgid "Wrote %(posts)s post."
+msgid_plural "Wrote %(posts)s posts."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/base.html:26 templates/misago/profile/base.html:41
+#, python-format
+msgid "Started %(threads)s thread."
+msgid_plural "Started %(threads)s threads."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/details.html:5
+#: templates/misago/profile/details.html:8
+#: templates/misago/profile/details.html:9
+#: templates/misago/profile/details.html:19 users/apps.py:115
+msgid "Details"
+msgstr ""
+
+#: templates/misago/profile/details.html:75
+msgid "You are not sharing any details with others."
+msgstr ""
+
+#: templates/misago/profile/details.html:77
+#, python-format
+msgid "%(username)s is not sharing any details with others."
+msgstr ""
+
+#: templates/misago/profile/feed.html:10
+msgid "See post"
+msgstr ""
+
+#: templates/misago/profile/feed.html:61
+#: templates/misago/thread/posts/post/body.html:10
+msgid "This post's contents cannot be displayed."
+msgstr ""
+
+#: templates/misago/profile/feed.html:62
+#: templates/misago/thread/posts/post/body.html:11
+msgid "This error is caused by invalid post content manipulation."
+msgstr ""
+
+#: templates/misago/profile/followers.html:5
+#: templates/misago/profile/followers.html:8
+#: templates/misago/profile/followers.html:9 users/apps.py:103
+msgid "Followers"
+msgstr ""
+
+#: templates/misago/profile/followers.html:18
+#, python-format
+msgid "You have %(users)s follower."
+msgid_plural "You have %(users)s followers."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/followers.html:24
+#, python-format
+msgid "%(username)s has %(users)s follower."
+msgid_plural "%(username)s has %(users)s followers."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/followers.html:49
+msgid "You have no followers."
+msgstr ""
+
+#: templates/misago/profile/followers.html:51
+#, python-format
+msgid "%(username)s has no followers."
+msgstr ""
+
+#: templates/misago/profile/follows.html:5
+#: templates/misago/profile/follows.html:8
+#: templates/misago/profile/follows.html:9 users/apps.py:109
+msgid "Follows"
+msgstr ""
+
+#: templates/misago/profile/follows.html:18
+#, python-format
+msgid "You are following %(users)s user."
+msgid_plural "You are following %(users)s users."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/follows.html:24
+#, python-format
+msgid "%(username)s is following %(users)s user."
+msgid_plural "%(username)s is following %(users)s users."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/follows.html:49
+msgid "You are not following any users."
+msgstr ""
+
+#: templates/misago/profile/follows.html:51
+#, python-format
+msgid "%(username)s is not following any users."
+msgstr ""
+
+#: templates/misago/profile/header.html:7
+msgid "This user is deleting their account."
+msgstr ""
+
+#: templates/misago/profile/header.html:9
+msgid "This user's account has been disabled by administrator."
+msgstr ""
+
+#: templates/misago/profile/header.html:46
+#, python-format
+msgid "Member since %(joined_on)s"
+msgstr ""
+
+#: templates/misago/profile/posts.html:20
+#, python-format
+msgid "You have posted %(posts)s message."
+msgid_plural "You have posted %(posts)s messages."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/posts.html:26
+#, python-format
+msgid "%(username)s has posted %(posts)s message."
+msgid_plural "%(username)s has posted %(posts)s messages."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/posts.html:40
+msgid "You have posted no messages"
+msgstr ""
+
+#: templates/misago/profile/posts.html:42
+#, python-format
+msgid "%(username)s posted no messages."
+msgstr ""
+
+#: templates/misago/profile/threads.html:20
+#, python-format
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/threads.html:26
+#, python-format
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/threads.html:40
+msgid "You have no started threads."
+msgstr ""
+
+#: templates/misago/profile/threads.html:42
+#, python-format
+msgid "%(username)s started no threads."
+msgstr ""
+
+#: templates/misago/profile/username_history.html:5
+#: templates/misago/profile/username_history.html:8
+#: templates/misago/profile/username_history.html:9 users/apps.py:121
+msgid "Username history"
+msgstr ""
+
+#: templates/misago/profile/username_history.html:18
+#, python-format
+msgid "Your username was changed %(changes)s time."
+msgid_plural "Your username was changed %(changes)s times."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/username_history.html:24
+#, python-format
+msgid "%(username)s's username was changed %(changes)s time."
+msgid_plural "%(username)s's username was changed %(changes)s times."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/username_history.html:79
+msgid "Your username was never changed."
+msgstr ""
+
+#: templates/misago/profile/username_history.html:81
+#, python-format
+msgid "%(username)s's username was never changed."
+msgstr ""
+
+#: templates/misago/required_agreement.html:9
+#, python-format
+msgid "Please review the updated %(agreement)s:"
+msgstr ""
+
+#: templates/misago/required_agreement.html:19
+msgid "here"
+msgstr ""
+
+#: templates/misago/required_agreement.html:21
+#, python-format
+msgid "Please review the updated %(agreement)s available %(link)s."
+msgstr ""
+
+#: templates/misago/search.html:5 templates/misago/search.html:8
+#: templates/misago/search.html:9
+msgid "Search site"
+msgstr ""
+
+#: templates/misago/search.html:47
+msgid "Loading search..."
+msgstr ""
+
+#: templates/misago/socialauth.html:5
+#, python-format
+msgid "Sign in with %(backend)s"
+msgstr ""
+
+#: templates/misago/socialauth.html:24
+#, python-format
+msgid ""
+"You need to enable JavaScript in your browser to complete the sign in with "
+"%(backend)s."
+msgstr ""
+
+#: templates/misago/thread/paginator.html:41
+#, python-format
+msgid "There is %(more)s more post in this thread."
+msgid_plural "There are %(more)s more posts in this thread."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/thread/paginator.html:47
+msgid "There are no more posts in this thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:48
+#, python-format
+msgid "Thread title has been changed from %(old_title)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:52
+msgid "Thread has been pinned globally."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:54
+msgid "Thread has been pinned locally."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:56
+msgid "Thread has been unpinned."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:61
+#, python-format
+msgid "Thread has been moved from %(from_category)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:68
+#, python-format
+msgid "The %(merged_thread)s thread has been merged into this thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:72
+msgid "Thread has been approved."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:74
+msgid "Thread has been opened."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:76
+msgid "Thread has been closed."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:78
+msgid "Thread has been revealed."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:80
+msgid "Thread has been made hidden."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:82
+msgid "Took thread over."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:84
+msgid "Owner has left thread. This thread is now closed."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:86
+msgid "Participant has left thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:91
+#, python-format
+msgid "Changed thread owner to %(user)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:98
+#, python-format
+msgid "Added %(user)s to thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:105
+#, python-format
+msgid "Removed %(user)s from thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/info.html:12
+#: templates/misago/thread/posts/post/body-hidden.html:14
+#, python-format
+msgid "Hidden by %(hidden_by)s on %(hidden_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/info.html:28
+#, python-format
+msgid "By %(event_by)s on %(event_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/attachments.html:33
+#, python-format
+msgid "%(filetype)s, %(size)s, uploaded by %(uploader)s on %(uploaded_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/body-hidden.html:4
+msgid "This post is hidden. You cannot not see its contents."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:7
+#, python-format
+msgid "Marked as best answer by you %(marked_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:13
+#, python-format
+msgid "Marked as best answer by %(marked_by)s %(marked_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:23
+msgid "This post is hidden. Only users with permission may see its contents."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:29
+msgid ""
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:35
+msgid "This post is protected. Only moderators may change it."
+msgstr ""
+
+#: templates/misago/thread/posts/post/footer.html:7
+msgid "Liked"
+msgstr ""
+
+#: templates/misago/thread/posts/post/footer.html:9
+msgid "Like"
+msgstr ""
+
+#: templates/misago/thread/posts/post/footer.html:26
+msgid "Reply"
+msgstr ""
+
+#: templates/misago/thread/posts/post/header.html:5
+msgid "New post"
+msgstr ""
+
+#: templates/misago/thread/posts/post/header.html:8
+#: templates/misago/thread/toolbar-top.html:7
+#: templates/misago/threadslist/tabs.html:17
+msgid "New"
+msgstr ""
+
+#: templates/misago/thread/posts/post/header.html:22
+#: templates/misago/thread/posts/post/side.html:4
+msgid "Post link"
+msgstr ""
+
+#: templates/misago/thread/posts/post/side.html:73
+msgid "Removed user"
+msgstr ""
+
+#: templates/misago/thread/stats.html:11
+#: templates/misago/threadslist/thread.html:21
+msgid "Pinned globally"
+msgstr ""
+
+#: templates/misago/thread/stats.html:20
+#: templates/misago/threadslist/thread.html:30
+msgid "Pinned locally"
+msgstr ""
+
+#: templates/misago/thread/stats.html:30
+#: templates/misago/thread/toolbar-top.html:14
+#: templates/misago/threadslist/tabs.html:33
+#: templates/misago/threadslist/thread.html:40
+msgid "Unapproved"
+msgstr ""
+
+#: templates/misago/thread/stats.html:39
+#: templates/misago/threadslist/thread.html:49
+msgid "Unapproved posts"
+msgstr ""
+
+#: templates/misago/thread/stats.html:49
+#: templates/misago/threadslist/thread.html:119
+msgid "Hidden"
+msgstr ""
+
+#: templates/misago/thread/stats.html:59
+#: templates/misago/threadslist/thread.html:129
+msgid "Closed"
+msgstr ""
+
+#: templates/misago/thread/stats.html:68
+#: templates/misago/threadslist/thread.html:153
+#, python-format
+msgid "%(replies)s reply"
+msgid_plural "%(replies)s replies"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/thread/stats.html:83
+#, python-format
+msgid "last reply by %(user)s %(date)s"
+msgstr ""
+
+#: templates/misago/thread/thread.html:19
+#: templates/misago/thread/thread.html:30
+#, python-format
+msgid "Started by %(starter)s on %(started_on)s in the %(category)s category."
+msgstr ""
+
+#: templates/misago/thread/thread.html:21
+#: templates/misago/thread/thread.html:32
+#, python-format
+msgid "%(replies)s reply, last one from %(last_post_on)s."
+msgid_plural "%(replies)s replies, last one from %(last_post_on)s."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/thread/thread.html:25
+#: templates/misago/thread/thread.html:36
+msgid "Answered."
+msgstr ""
+
+#: templates/misago/thread/thread.html:25
+#: templates/misago/thread/thread.html:36
+msgid "Closed."
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:6
+msgid "Go to first new post"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:13
+msgid "Go to first unapproved post"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:19
+msgid "Go to last post"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:25
+msgid "Go to best answers"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:26
+msgid "Best answer"
+msgstr ""
+
+#: templates/misago/threadslist/base.html:57
+msgid "There are no threads in this category."
+msgstr ""
+
+#: templates/misago/threadslist/base.html:59
+msgid "There are no threads on this forum... yet!"
+msgstr ""
+
+#: templates/misago/threadslist/base.html:63
+#: templates/misago/threadslist/private_threads.html:61
+msgid "Why not start one yourself?"
+msgstr ""
+
+#: templates/misago/threadslist/base.html:67
+#: templates/misago/threadslist/private_threads.html:64
+msgid "No threads matching specified criteria were found."
+msgstr ""
+
+#: templates/misago/threadslist/base.html:82
+msgid "Next page"
+msgstr ""
+
+#: templates/misago/threadslist/private_threads.html:42
+msgid ""
+"Private threads are threads which only those that started them and those "
+"they have invited may see and participate in."
+msgstr ""
+
+#: templates/misago/threadslist/private_threads.html:58
+msgid "You aren't participating in any private threads."
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:7 threads/admin/forms.py:27
+msgid "All"
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:12
+msgid "My"
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:22
+msgid "Unread"
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:27
+msgid "Subscribed"
+msgstr ""
+
+#: templates/misago/threadslist/thread.html:11
+msgid "New posts"
+msgstr ""
+
+#: templates/misago/threadslist/thread.html:59
+msgid "Answered"
+msgstr ""
+
+#: templates/misago/threadslist/thread.html:139
+msgid "Poll"
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:5
+#: templates/misago/userslists/active_posters.html:23
+#: templates/misago/userslists/active_posters.html:24 users/apps.py:72
+msgid "Top posters"
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:10
+#, python-format
+msgid "%(posters)s most active poster from last %(days)s days."
+msgid_plural "%(posters)s most active posters from last %(days)s days."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/userslists/active_posters.html:16
+#: templates/misago/userslists/active_posters.html:35
+#: templates/misago/userslists/active_posters.html:50
+#: templates/misago/userslists/active_posters.html:145
+#, python-format
+msgid "No users have posted any new messages during last %(days)s days."
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:29
+#: templates/misago/userslists/active_posters.html:44
+#: templates/misago/userslists/active_posters.html:69
+#, python-format
+msgid "%(posters)s top poster from last %(days)s days."
+msgid_plural "%(posters)s top posters from last %(days)s days."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/userslists/active_posters.html:116
+#: templates/misago/userslists/active_posters.html:128
+msgid "Ranked posts"
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:133
+msgid "Total posts"
+msgstr ""
+
+#: templates/misago/userslists/rank.html:9
+#: templates/misago/userslists/rank.html:41
+#: templates/misago/userslists/rank.html:52
+#, python-format
+msgid "%(users)s user have this rank."
+msgid_plural "%(users)s users have this rank."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/userslists/rank.html:130
+msgid "There are no users with this rank at the moment."
+msgstr ""
+
+#: templates/misago/userslists/usercard.html:42
+#: templates/misago/userslists/usercard.html:45
+#, python-format
+msgid "Joined on %(joined_on)s"
+msgstr ""
+
+#: templates/misago/userslists/usercard.html:66
+#, python-format
+msgid "%(followers)s follower"
+msgid_plural "%(followers)s followers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: themes/admin/__init__.py:94
+msgid "Themes"
+msgstr ""
+
+#: themes/admin/forms.py:20
+msgid "No parent"
+msgstr ""
+
+#: themes/admin/forms.py:27 themes/admin/forms.py:58
+msgid "Parent"
+msgstr ""
+
+#: themes/admin/forms.py:28
+msgid "Version"
+msgstr ""
+
+#: themes/admin/forms.py:29
+msgid "Author(s)"
+msgstr ""
+
+#: themes/admin/forms.py:30
+msgid "Url"
+msgstr ""
+
+#: themes/admin/forms.py:54
+msgid "Leave this field empty to use theme name from imported file."
+msgstr ""
+
+#: themes/admin/forms.py:60
+msgid "Theme file"
+msgstr ""
+
+#: themes/admin/forms.py:60
+msgid "Theme file should be a ZIP file."
+msgstr ""
+
+#: themes/admin/forms.py:65
+msgid "Uploaded file is not a valid ZIP file."
+msgstr ""
+
+#: themes/admin/forms.py:110
+msgid "No files have been uploaded."
+msgstr ""
+
+#: themes/admin/forms.py:137
+#, python-format
+msgid "File \"%(file)s\" content type \"%(content_type)s\" is not allowed."
+msgstr ""
+
+#: themes/admin/forms.py:149
+#, python-format
+msgid "File \"%(file)s\" extension is invalid."
+msgstr ""
+
+#: themes/admin/forms.py:176
+msgid ""
+"Should be an correct filename and include the .css extension. It will be "
+"lowercased."
+msgstr ""
+
+#: themes/admin/forms.py:194
+msgid "You need to enter CSS for this file."
+msgstr ""
+
+#: themes/admin/forms.py:221
+msgid "Link name"
+msgstr ""
+
+#: themes/admin/forms.py:222
+msgid "Can be descriptive (e.g. \"roboto from fonts.google.com\")."
+msgstr ""
+
+#: themes/admin/forms.py:224
+msgid "Remote CSS URL"
+msgstr ""
+
+#: themes/admin/importer.py:21
+msgid ""
+"\"manifest.json\" contained by ZIP file is not a valid theme manifest file."
+msgstr ""
+
+#: themes/admin/importer.py:61
+msgid "Uploaded ZIP file could not be extracted."
+msgstr ""
+
+#: themes/admin/importer.py:67
+msgid "Uploaded ZIP file is empty."
+msgstr ""
+
+#: themes/admin/importer.py:69
+msgid "Uploaded ZIP file should contain single directory."
+msgstr ""
+
+#: themes/admin/importer.py:71
+msgid "Uploaded ZIP file didn't contain a directory."
+msgstr ""
+
+#: themes/admin/importer.py:85
+msgid "Uploaded ZIP file didn't contain a \"manifest.json\"."
+msgstr ""
+
+#: themes/admin/importer.py:89
+msgid "\"manifest.json\" contained by ZIP file is not a valid JSON file."
+msgstr ""
+
+#: themes/admin/validators.py:12
+msgid "Name is missing an .css extension."
+msgstr ""
+
+#: themes/admin/validators.py:15
+msgid "Name can't start with period (\".\")."
+msgstr ""
+
+#: themes/admin/validators.py:20
+msgid ""
+"Name can contain only latin alphabet characters, digits, dots, underscores "
+"and dashes."
+msgstr ""
+
+#: themes/admin/validators.py:27
+msgid "Name has to contain at least one latin alphabet character or digit."
+msgstr ""
+
+#: themes/admin/validators.py:36
+msgid "This name is already in use by other asset."
+msgstr ""
+
+#: themes/admin/views.py:28
+msgid "Requested theme does not exist."
+msgstr ""
+
+#: themes/admin/views.py:36
+#, python-format
+msgid "New theme \"%(name)s\" has been saved."
+msgstr ""
+
+#: themes/admin/views.py:51
+#, python-format
+msgid "Theme \"%(name)s\" has been updated."
+msgstr ""
+
+#: themes/admin/views.py:55
+msgid "Default theme can't be edited."
+msgstr ""
+
+#: themes/admin/views.py:64
+#, python-format
+msgid "Theme \"%(name)s\" has been deleted."
+msgstr ""
+
+#: themes/admin/views.py:68
+msgid "Default theme can't be deleted."
+msgstr ""
+
+#: themes/admin/views.py:70
+msgid "Active theme can't be deleted."
+msgstr ""
+
+#: themes/admin/views.py:73
+#, python-format
+msgid ""
+"Theme \"%(name)s\" can't be deleted because one of its child themes is set "
+"as active."
+msgstr ""
+
+#: themes/admin/views.py:90
+#, python-format
+msgid "Active theme has been changed to \"%(name)s\"."
+msgstr ""
+
+#: themes/admin/views.py:103
+msgid "Default theme can't be exported."
+msgstr ""
+
+#: themes/admin/views.py:123
+#, python-format
+msgid "Theme \"%(name)s\" has been imported."
+msgstr ""
+
+#: themes/admin/views.py:130
+msgid "Default theme assets can't be edited."
+msgstr ""
+
+#: themes/admin/views.py:158
+msgid "Some css files could not have been added to the theme."
+msgstr ""
+
+#: themes/admin/views.py:182
+msgid "New CSS files have been added to the theme."
+msgstr ""
+
+#: themes/admin/views.py:187
+msgid "New media files have been added to the theme."
+msgstr ""
+
+#: themes/admin/views.py:218
+msgid "Selected CSS files have been deleted."
+msgstr ""
+
+#: themes/admin/views.py:227
+msgid "Selected media have been deleted."
+msgstr ""
+
+#: themes/admin/views.py:247
+msgid "Requested CSS could not be found in the theme."
+msgstr ""
+
+#: themes/admin/views.py:273
+#, python-format
+msgid "\"%s\" was moved up."
+msgstr ""
+
+#: themes/admin/views.py:282
+#, python-format
+msgid "\"%s\" was moved down."
+msgstr ""
+
+#: themes/admin/views.py:324
+#, python-format
+msgid "New CSS \"%(name)s\" has been saved."
+msgstr ""
+
+#: themes/admin/views.py:341
+#, python-format
+msgid "CSS \"%(name)s\" has been updated."
+msgstr ""
+
+#: themes/admin/views.py:364
+#, python-format
+msgid "No changes have been made to \"%(css)s\"."
+msgstr ""
+
+#: themes/admin/views.py:369
+#, python-format
+msgid "New CSS link \"%(name)s\" has been saved."
+msgstr ""
+
+#: themes/admin/views.py:392
+#, python-format
+msgid "CSS link \"%(name)s\" has been updated."
+msgstr ""
+
+#: themes/models.py:40
+msgid "Default Misago Theme"
+msgstr ""
+
+#: threads/admin/__init__.py:43
+msgid "Attachment types"
+msgstr ""
+
+#: threads/admin/__init__.py:44
+msgid "Specify what files may be uploaded on the forum."
+msgstr ""
+
+#: threads/admin/forms.py:14
+msgid "Uploader name contains"
+msgstr ""
+
+#: threads/admin/forms.py:15
+msgid "Filename contains"
+msgstr ""
+
+#: threads/admin/forms.py:17
+msgid "File type"
+msgstr ""
+
+#: threads/admin/forms.py:24 users/admin/forms.py:585
+msgid "State"
+msgstr ""
+
+#: threads/admin/forms.py:28
+msgid "Only orphaned"
+msgstr ""
+
+#: threads/admin/forms.py:29
+msgid "Not orphaned"
+msgstr ""
+
+#: threads/admin/forms.py:54
+msgid "Type name"
+msgstr ""
+
+#: threads/admin/forms.py:55
+msgid "File extensions"
+msgstr ""
+
+#: threads/admin/forms.py:57
+msgid "Maximum allowed uploaded file size"
+msgstr ""
+
+#: threads/admin/forms.py:59
+msgid "Limit uploads to"
+msgstr ""
+
+#: threads/admin/forms.py:60
+msgid "Limit downloads to"
+msgstr ""
+
+#: threads/admin/forms.py:64
+msgid ""
+"List of comma separated file extensions associated with this attachment type."
+msgstr ""
+
+#: threads/admin/forms.py:68
+msgid ""
+"Optional list of comma separated mime types associated with this attachment "
+"type."
+msgstr ""
+
+#: threads/admin/forms.py:72
+msgid ""
+"Maximum allowed uploaded file size for this type, in kb. May be overriden "
+"via user permission."
+msgstr ""
+
+#: threads/admin/forms.py:75
+msgid "Controls this attachment type availability on your site."
+msgstr ""
+
+#: threads/admin/forms.py:77
+msgid ""
+"If you wish to limit option to upload files of this type to users with "
+"specific roles, select them on this list. Otherwhise don't select any roles "
+"to allow all users with permission to upload attachments to be able to "
+"upload attachments of this type."
+msgstr ""
+
+#: threads/admin/forms.py:83
+msgid ""
+"If you wish to limit option to download files of this type to users with "
+"specific roles, select them on this list. Otherwhise don't select any roles "
+"to allow all users with permission to download attachments to be able to "
+"download attachments of this type."
+msgstr ""
+
+#: threads/admin/views/attachments.py:14
+msgid "Requested attachment could not be found."
+msgstr ""
+
+#: threads/admin/views/attachments.py:28 users/admin/views/bans.py:26
+#: users/admin/views/users.py:65
+msgid "A to z"
+msgstr ""
+
+#: threads/admin/views/attachments.py:29 users/admin/views/bans.py:27
+#: users/admin/views/users.py:66
+msgid "Z to a"
+msgstr ""
+
+#: threads/admin/views/attachments.py:30
+msgid "Smallest files"
+msgstr ""
+
+#: threads/admin/views/attachments.py:31
+msgid "Largest files"
+msgstr ""
+
+#: threads/admin/views/attachments.py:33
+msgid "With attachments: 0"
+msgstr ""
+
+#: threads/admin/views/attachments.py:34
+msgid "Select attachments"
+msgstr ""
+
+#: threads/admin/views/attachments.py:38
+msgid "Delete attachments"
+msgstr ""
+
+#: threads/admin/views/attachments.py:39
+msgid "Are you sure you want to delete selected attachments?"
+msgstr ""
+
+#: threads/admin/views/attachments.py:62
+msgid "Selected attachments have been deleted."
+msgstr ""
+
+#: threads/admin/views/attachments.py:83
+#, python-format
+msgid "Attachment \"%(filename)s\" has been deleted."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:15
+msgid "Requested attachment type could not be found."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:36
+#, python-format
+msgid "New type \"%(name)s\" has been saved."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:40
+#, python-format
+msgid "Attachment type \"%(name)s\" has been edited."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:47
+#, python-format
+msgid ""
+"Attachment type \"%(name)s\" has associated attachments and can't be deleted."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:54
+#, python-format
+msgid "Attachment type \"%(name)s\" has been deleted."
+msgstr ""
+
+#: threads/api/attachments.py:18
+msgid "You don't have permission to upload new files."
+msgstr ""
+
+#: threads/api/attachments.py:28
+msgid "No file has been uploaded."
+msgstr ""
+
+#: threads/api/attachments.py:48
+msgid "Uploaded image was corrupted or invalid."
+msgstr ""
+
+#: threads/api/attachments.py:86
+msgid "You can't upload files of this type."
+msgstr ""
+
+#: threads/api/attachments.py:92
+#, python-format
+msgid ""
+"You can't upload files larger than %(limit)s (your file has %(upload)s)."
+msgstr ""
+
+#: threads/api/attachments.py:104
+#, python-format
+msgid ""
+"You can't upload files of this type larger than %(limit)s (your file has "
+"%(upload)s)."
+msgstr ""
+
+#: threads/api/postendpoints/edits.py:87
+msgid "Edits record is unavailable for this post."
+msgstr ""
+
+#: threads/api/postendpoints/merge.py:11
+msgid "You can't merge posts in this thread."
+msgstr ""
+
+#: threads/api/postendpoints/move.py:10
+msgid "You can't move posts in this thread."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:36
+msgid "You can't like posts in this category."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:99
+#: threads/api/threadendpoints/patch.py:147
+msgid "Content approval can't be reversed."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:180
+msgid "One or more posts to update could not be found."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:198
+#, python-format
+msgid "No more than %(limit)s post can be updated at a single time."
+msgid_plural "No more than %(limit)s posts can be updated at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/postendpoints/split.py:12
+msgid "You can't split posts from this thread."
+msgstr ""
+
+#: threads/api/postingendpoint/attachments.py:63
+#, python-format
+msgid "You don't have permission to remove \"%(attachment)s\" attachment."
+msgstr ""
+
+#: threads/api/postingendpoint/attachments.py:132
+#, python-format
+msgid ""
+"You can't attach more than %(limit_value)s file to single post (added "
+"%(show_value)s)."
+msgid_plural ""
+"You can't attach more than %(limit_value)s flies to single post (added "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/postingendpoint/category.py:45
+msgid "You have to select category to post thread in."
+msgstr ""
+
+#: threads/api/postingendpoint/category.py:46
+#: threads/api/postingendpoint/category.py:65
+msgid "Selected category is invalid."
+msgstr ""
+
+#: threads/api/postingendpoint/category.py:71
+msgid ""
+"Selected category doesn't exist or you don't have permission to browse it."
+msgstr ""
+
+#: threads/api/postingendpoint/emailnotification.py:43
+#, python-format
+msgid "%(user)s has replied to your thread \"%(thread)s\""
+msgstr ""
+
+#: threads/api/postingendpoint/emailnotification.py:46
+#, python-format
+msgid "%(user)s has replied to thread \"%(thread)s\" that you are watching"
+msgstr ""
+
+#: threads/api/postingendpoint/floodprotection.py:25
+msgid "You can't post message so quickly after previous one."
+msgstr ""
+
+#: threads/api/postingendpoint/floodprotection.py:35
+msgid "Your account has exceed an hourly post limit."
+msgstr ""
+
+#: threads/api/postingendpoint/floodprotection.py:41
+msgid "Your account has exceed a daily post limit."
+msgstr ""
+
+#: threads/api/postingendpoint/participants.py:52
+msgid ""
+"You can't include yourself on the list of users to invite to new thread."
+msgstr ""
+
+#: threads/api/postingendpoint/participants.py:61
+msgid "You have to enter user names."
+msgstr ""
+
+#: threads/api/postingendpoint/participants.py:67
+#, python-format
+msgid ""
+"You can't add more than %(users)s user to private thread (you've added "
+"%(added)s)."
+msgid_plural ""
+"You can't add more than %(users)s users to private thread (you've added "
+"%(added)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/postingendpoint/participants.py:93
+#, python-format
+msgid "One or more users could not be found: %(usernames)s"
+msgstr ""
+
+#: threads/api/postingendpoint/reply.py:81 threads/validators.py:77
+msgid "You have to enter a message."
+msgstr ""
+
+#: threads/api/postingendpoint/reply.py:106
+msgid "You have to enter thread title."
+msgstr ""
+
+#: threads/api/threadendpoints/editor.py:14
+msgid "You need to be signed in to start threads."
+msgstr ""
+
+#: threads/api/threadendpoints/editor.py:60
+msgid ""
+"No categories that allow new threads are available to you at the moment."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:65
+msgid "Not a valid string."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:86
+msgid "You can't change globally pinned threads weights in this category."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:94
+msgid "You can't pin threads globally in this category."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:122
+msgid "You can't move thread to the category it's already in."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:170
+msgid "You don't have permission to close this thread."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:172
+msgid "You don't have permission to open this thread."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:225
+#: threads/api/threadendpoints/patch.py:264
+#: threads/api/threadendpoints/patch.py:327
+#: threads/api/threadendpoints/patch.py:355
+msgid "A valid integer is required."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:238
+msgid "This post is already marked as thread's best answer."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:273
+msgid ""
+"This post can't be unmarked because it's not currently marked as best answer."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:301
+msgid "You have to enter new participant's username."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:304
+msgid "No user with such name exists."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:307
+msgid "This user is already thread participant."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:333
+#: threads/api/threadendpoints/patch.py:364
+msgid "Participant doesn't exist."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:360
+msgid "This user already is thread owner."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:479
+msgid "One or more threads to update could not be found."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:496
+#, python-format
+msgid "No more than %(limit)s thread can be updated at a single time."
+msgid_plural "No more than %(limit)s threads can be updated at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/threadpoll.py:60
+msgid "There's already a poll in this thread."
+msgstr ""
+
+#: threads/api/threadposts.py:210
+msgid "You can't reply to events."
+msgstr ""
+
+#: threads/api/threadposts.py:212
+msgid "You can't reply to hidden posts."
+msgstr ""
+
+#: threads/api/threadposts.py:245
+msgid "You can't see who liked this post."
+msgstr ""
+
+#: threads/api/threads.py:120
+msgid "You can't start private threads."
+msgstr ""
+
+#: threads/mergeconflict.py:56
+msgid "Unmark all best answers"
+msgstr ""
+
+#: threads/mergeconflict.py:75
+msgid "Delete all polls"
+msgstr ""
+
+#: threads/mergeconflict.py:126 threads/serializers/moderation.py:475
+#: threads/serializers/moderation.py:478 threads/serializers/moderation.py:545
+#: threads/serializers/moderation.py:548
+msgid "Invalid choice."
+msgstr ""
+
+#: threads/models/attachmenttype.py:17
+msgid "Allow uploads and downloads"
+msgstr ""
+
+#: threads/models/attachmenttype.py:18
+msgid "Allow downloads only"
+msgstr ""
+
+#: threads/models/attachmenttype.py:19
+msgid "Disallow both uploading and downloading"
+msgstr ""
+
+#: threads/models/thread.py:17
+msgid "Don't pin thread"
+msgstr ""
+
+#: threads/models/thread.py:18
+msgid "Pin thread within category"
+msgstr ""
+
+#: threads/models/thread.py:19
+msgid "Pin thread globally"
+msgstr ""
+
+#: threads/moderation/posts.py:53
+msgid "You can't make original post visible without revealing thread."
+msgstr ""
+
+#: threads/moderation/posts.py:66
+msgid "You can't hide original post without hiding thread."
+msgstr ""
+
+#: threads/moderation/posts.py:92
+msgid "You can't delete original post without deleting thread."
+msgstr ""
+
+#: threads/participants.py:142
+#, python-format
+msgid ""
+"%(user)s has invited you to participate in private thread \"%(thread)s\""
+msgstr ""
+
+#: threads/permissions/attachments.py:14
+msgid "Max attached file size (in kb)"
+msgstr ""
+
+#: threads/permissions/attachments.py:15
+msgid "Enter 0 to don't allow uploading end deleting attachments."
+msgstr ""
+
+#: threads/permissions/attachments.py:21
+msgid "Can download other users attachments"
+msgstr ""
+
+#: threads/permissions/attachments.py:24
+msgid "Can delete other users attachments"
+msgstr ""
+
+#: threads/permissions/attachments.py:32
+msgid "Can download attachments"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:28
+msgid "Best answers"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:31
+msgid "Can mark posts as best answers"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:34 threads/permissions/bestanswers.py:40
+#: threads/permissions/polls.py:34 threads/permissions/threads.py:120
+msgid "Own threads"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:34 threads/permissions/bestanswers.py:40
+#: threads/permissions/polls.py:34 threads/permissions/threads.py:110
+#: threads/permissions/threads.py:120
+msgid "All threads"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:37
+msgid "Can change marked answers"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:44
+msgid "Time limit for changing marked best answer in owned thread, in minutes"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:47
+msgid ""
+"Enter 0 to don't limit time for changing marked best answer in owned thread."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:134
+#: threads/permissions/bestanswers.py:293
+msgid "You have to sign in to mark best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:141
+#: threads/permissions/bestanswers.py:303
+#, python-format
+msgid ""
+"You don't have permission to mark best answers in the \"%(category)s\" "
+"category."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:153
+#: threads/permissions/bestanswers.py:315
+msgid ""
+"You don't have permission to mark best answer in this thread because you "
+"didn't start it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:162
+#, python-format
+msgid ""
+"You don't have permission to mark best answer in this thread because its "
+"category \"%(category)s\" is closed."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:170
+msgid ""
+"You can't mark best answer in this thread because it's closed and you don't "
+"have permission to open it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:188
+#, python-format
+msgid ""
+"You don't have permission to change this thread's marked answer because it's "
+"in the \"%(category)s\" category."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:198
+msgid ""
+"You don't have permission to change this thread's marked answer because you "
+"are not a thread starter."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:205
+#, python-format
+msgid ""
+"You don't have permission to change best answer that was marked for more "
+"than %(minutes)s minute."
+msgid_plural ""
+"You don't have permission to change best answer that was marked for more "
+"than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/bestanswers.py:216
+msgid ""
+"You don't have permission to change this thread's best answer because a "
+"moderator has protected it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:227
+msgid "You have to sign in to unmark best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:237
+#, python-format
+msgid ""
+"You don't have permission to unmark threads answers in the \"%(category)s\" "
+"category."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:247
+msgid ""
+"You don't have permission to unmark this best answer because you are not a "
+"thread starter."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:254
+#, python-format
+msgid ""
+"You don't have permission to unmark best answer that was marked for more "
+"than %(minutes)s minute."
+msgid_plural ""
+"You don't have permission to unmark best answer that was marked for more "
+"than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/bestanswers.py:266
+#, python-format
+msgid ""
+"You don't have permission to unmark this best answer because its category "
+"\"%(category)s\" is closed."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:274
+msgid ""
+"You can't unmark this thread's best answer because it's closed and you don't "
+"have permission to open it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:282
+msgid ""
+"You don't have permission to unmark this thread's best answer because a "
+"moderator has protected it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:296
+msgid "Events can't be marked as best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:322
+msgid "First post in a thread can't be marked as best answer."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:326
+msgid "Hidden posts can't be marked as best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:329
+msgid "Unapproved posts can't be marked as best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:334
+msgid ""
+"You don't have permission to mark this post as best answer because a "
+"moderator has protected it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:346
+msgid "You can't hide this post because its marked as best answer."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:356
+msgid "You can't delete this post because its marked as best answer."
+msgstr ""
+
+#: threads/permissions/polls.py:28
+msgid "Polls"
+msgstr ""
+
+#: threads/permissions/polls.py:31
+msgid "Can start polls"
+msgstr ""
+
+#: threads/permissions/polls.py:37
+msgid "Can edit polls"
+msgstr ""
+
+#: threads/permissions/polls.py:40 threads/permissions/polls.py:46
+msgid "Own polls"
+msgstr ""
+
+#: threads/permissions/polls.py:40 threads/permissions/polls.py:46
+msgid "All polls"
+msgstr ""
+
+#: threads/permissions/polls.py:43
+msgid "Can delete polls"
+msgstr ""
+
+#: threads/permissions/polls.py:49
+msgid "Time limit for own polls edits, in minutes"
+msgstr ""
+
+#: threads/permissions/polls.py:50
+msgid "Enter 0 to don't limit time for editing own polls."
+msgstr ""
+
+#: threads/permissions/polls.py:55
+msgid "Can always see polls voters"
+msgstr ""
+
+#: threads/permissions/polls.py:57
+msgid "Allows users to see who voted in poll even if poll votes are secret."
+msgstr ""
+
+#: threads/permissions/polls.py:112
+msgid "You have to sign in to start polls."
+msgstr ""
+
+#: threads/permissions/polls.py:119
+msgid "You can't start polls."
+msgstr ""
+
+#: threads/permissions/polls.py:121
+msgid "You can't start polls in other users threads."
+msgstr ""
+
+#: threads/permissions/polls.py:126
+msgid "This category is closed. You can't start polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:130
+msgid "This thread is closed. You can't start polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:139
+msgid "You have to sign in to edit polls."
+msgstr ""
+
+#: threads/permissions/polls.py:146
+msgid "You can't edit polls."
+msgstr ""
+
+#: threads/permissions/polls.py:151
+msgid "You can't edit other users polls in this category."
+msgstr ""
+
+#: threads/permissions/polls.py:155
+#, python-format
+msgid "You can't edit polls that are older than %(minutes)s minute."
+msgid_plural "You can't edit polls that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/polls.py:162
+msgid "This poll is over. You can't edit it."
+msgstr ""
+
+#: threads/permissions/polls.py:167
+msgid "This category is closed. You can't edit polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:171
+msgid "This thread is closed. You can't edit polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:180
+msgid "You have to sign in to delete polls."
+msgstr ""
+
+#: threads/permissions/polls.py:187
+msgid "You can't delete polls."
+msgstr ""
+
+#: threads/permissions/polls.py:192
+msgid "You can't delete other users polls in this category."
+msgstr ""
+
+#: threads/permissions/polls.py:196
+#, python-format
+msgid "You can't delete polls that are older than %(minutes)s minute."
+msgid_plural "You can't delete polls that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/polls.py:202
+msgid "This poll is over. You can't delete it."
+msgstr ""
+
+#: threads/permissions/polls.py:207
+msgid "This category is closed. You can't delete polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:211
+msgid "This thread is closed. You can't delete polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:220
+msgid "You have to sign in to vote in polls."
+msgstr ""
+
+#: threads/permissions/polls.py:223
+msgid "You have already voted in this poll."
+msgstr ""
+
+#: threads/permissions/polls.py:225
+msgid "This poll is over. You can't vote in it."
+msgstr ""
+
+#: threads/permissions/polls.py:233
+msgid "This category is closed. You can't vote in it."
+msgstr ""
+
+#: threads/permissions/polls.py:235
+msgid "This thread is closed. You can't vote in it."
+msgstr ""
+
+#: threads/permissions/polls.py:243
+msgid "You dont have permission to this poll's voters."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:35
+msgid "Can use private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:36
+msgid "Can start private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:38
+msgid "Max number of users invited to private thread"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:39
+msgid "Enter 0 to don't limit number of participants."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:44
+msgid "Can add everyone to threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:46
+msgid "Allows user to add users that are blocking them to private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:50
+msgid "Can report private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:52
+msgid ""
+"Allows user to report private threads they are participating in, making them "
+"accessible to moderators."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:57
+msgid "Can moderate private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:59
+msgid ""
+"Allows user to read, reply, edit and delete content in reported private "
+"threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:179
+msgid "You have to sign in to use private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:181
+msgid "You can't use private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:210
+msgid "Only thread owner and moderators can change threads owners."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:214
+msgid "Only moderators can change closed threads owners."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:226
+msgid "You have to be thread owner to add new participants to it."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:231
+msgid "Only moderators can add participants to closed threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:238
+msgid "You can't add any more new users to this thread."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:253
+msgid "Only moderators can remove participants from closed threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:258
+msgid "You have to be thread owner to remove participants from it."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:270
+#, python-format
+msgid "%(user)s can't participate in private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:277
+#, python-format
+msgid "%(user)s is blocking you."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:281
+#, python-format
+msgid "%(user)s is not allowing invitations to private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:288
+#, python-format
+msgid "%(user)s limits invitations to private threads to followed users."
+msgstr ""
+
+#: threads/permissions/threads.py:76
+msgid "Can see unapproved content list"
+msgstr ""
+
+#: threads/permissions/threads.py:78
+msgid ""
+"Allows access to \"unapproved\" tab on threads lists for easy listing of "
+"threads that are unapproved or contain unapproved posts. Despite the tab "
+"being available on all threads lists, it will only display threads belonging "
+"to categories in which the user has permission to approve content."
+msgstr ""
+
+#: threads/permissions/threads.py:87
+msgid "Can see reported content list"
+msgstr ""
+
+#: threads/permissions/threads.py:89
+msgid ""
+"Allows access to \"reported\" tab on threads lists for easy listing of "
+"threads that contain reported posts. Despite the tab being available on all "
+"categories threads lists, it will only display threads belonging to "
+"categories in which the user has permission to see posts reports."
+msgstr ""
+
+#: threads/permissions/threads.py:98
+msgid "Can omit flood protection"
+msgstr ""
+
+#: threads/permissions/threads.py:99
+msgid "Allows posting more frequently than flood protection would."
+msgstr ""
+
+#: threads/permissions/threads.py:107
+msgid "Can see threads"
+msgstr ""
+
+#: threads/permissions/threads.py:113
+msgid "Can start threads"
+msgstr ""
+
+#: threads/permissions/threads.py:114
+msgid "Can reply to threads"
+msgstr ""
+
+#: threads/permissions/threads.py:117
+msgid "Can edit threads"
+msgstr ""
+
+#: threads/permissions/threads.py:123
+msgid "Can hide own threads"
+msgstr ""
+
+#: threads/permissions/threads.py:125
+msgid ""
+"Only threads started within time limit and with no replies can be hidden."
+msgstr ""
+
+#: threads/permissions/threads.py:130 threads/permissions/threads.py:142
+msgid "Hide threads"
+msgstr ""
+
+#: threads/permissions/threads.py:130 threads/permissions/threads.py:142
+msgid "Delete threads"
+msgstr ""
+
+#: threads/permissions/threads.py:133
+msgid "Time limit for own threads edits, in minutes"
+msgstr ""
+
+#: threads/permissions/threads.py:134
+msgid "Enter 0 to don't limit time for editing own threads."
+msgstr ""
+
+#: threads/permissions/threads.py:139
+msgid "Can hide all threads"
+msgstr ""
+
+#: threads/permissions/threads.py:146
+msgid "Can pin threads"
+msgstr ""
+
+#: threads/permissions/threads.py:149
+msgid "Locally"
+msgstr ""
+
+#: threads/permissions/threads.py:149
+msgid "Globally"
+msgstr ""
+
+#: threads/permissions/threads.py:151
+msgid "Can close threads"
+msgstr ""
+
+#: threads/permissions/threads.py:152
+msgid "Can move threads"
+msgstr ""
+
+#: threads/permissions/threads.py:153
+msgid "Can merge threads"
+msgstr ""
+
+#: threads/permissions/threads.py:156
+msgid "Can edit posts"
+msgstr ""
+
+#: threads/permissions/threads.py:159
+msgid "Own posts"
+msgstr ""
+
+#: threads/permissions/threads.py:159
+msgid "All posts"
+msgstr ""
+
+#: threads/permissions/threads.py:162
+msgid "Can hide own posts"
+msgstr ""
+
+#: threads/permissions/threads.py:164
+msgid "Only last posts to thread made within edit time limit can be hidden."
+msgstr ""
+
+#: threads/permissions/threads.py:168 threads/permissions/threads.py:180
+msgid "Hide posts"
+msgstr ""
+
+#: threads/permissions/threads.py:168 threads/permissions/threads.py:180
+msgid "Delete posts"
+msgstr ""
+
+#: threads/permissions/threads.py:171
+msgid "Time limit for own post edits, in minutes"
+msgstr ""
+
+#: threads/permissions/threads.py:172
+msgid "Enter 0 to don't limit time for editing own posts."
+msgstr ""
+
+#: threads/permissions/threads.py:177
+msgid "Can hide all posts"
+msgstr ""
+
+#: threads/permissions/threads.py:184
+msgid "Can see posts likes"
+msgstr ""
+
+#: threads/permissions/threads.py:189
+msgid "Number only"
+msgstr ""
+
+#: threads/permissions/threads.py:190
+msgid "Number and list of likers"
+msgstr ""
+
+#: threads/permissions/threads.py:194
+msgid "Can like posts"
+msgstr ""
+
+#: threads/permissions/threads.py:195
+msgid "Only users with this permission to see likes can like posts."
+msgstr ""
+
+#: threads/permissions/threads.py:199
+msgid "Can protect posts"
+msgstr ""
+
+#: threads/permissions/threads.py:200
+msgid "Only users with this permission can edit protected posts."
+msgstr ""
+
+#: threads/permissions/threads.py:203
+msgid "Can move posts"
+msgstr ""
+
+#: threads/permissions/threads.py:204
+msgid "Will be able to move posts to other threads."
+msgstr ""
+
+#: threads/permissions/threads.py:206
+msgid "Can merge posts"
+msgstr ""
+
+#: threads/permissions/threads.py:208
+msgid "Can approve content"
+msgstr ""
+
+#: threads/permissions/threads.py:209
+msgid "Will be able to see and approve unapproved content."
+msgstr ""
+
+#: threads/permissions/threads.py:211
+msgid "Can report posts"
+msgstr ""
+
+#: threads/permissions/threads.py:212
+msgid "Can see reports"
+msgstr ""
+
+#: threads/permissions/threads.py:215
+msgid "Can hide events"
+msgstr ""
+
+#: threads/permissions/threads.py:218
+msgid "Hide events"
+msgstr ""
+
+#: threads/permissions/threads.py:218
+msgid "Delete events"
+msgstr ""
+
+#: threads/permissions/threads.py:221
+msgid "Require threads approval"
+msgstr ""
+
+#: threads/permissions/threads.py:222
+msgid "Require replies approval"
+msgstr ""
+
+#: threads/permissions/threads.py:223
+msgid "Require edits approval"
+msgstr ""
+
+#: threads/permissions/threads.py:539
+msgid "You have to sign in to start threads."
+msgstr ""
+
+#: threads/permissions/threads.py:545
+msgid "You don't have permission to start new threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:550
+msgid "This category is closed. You can't start new threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:559
+msgid "You have to sign in to reply threads."
+msgstr ""
+
+#: threads/permissions/threads.py:566
+msgid "You can't reply to threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:571
+msgid "This category is closed. You can't reply to threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:575
+msgid "You can't reply to closed threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:584
+msgid "You have to sign in to edit threads."
+msgstr ""
+
+#: threads/permissions/threads.py:591
+msgid "You can't edit threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:596
+msgid "You can't edit other users threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:601
+#, python-format
+msgid "You can't edit threads that are older than %(minutes)s minute."
+msgid_plural "You can't edit threads that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:612
+msgid "This category is closed. You can't edit threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:615
+msgid "This thread is closed. You can't edit it."
+msgstr ""
+
+#: threads/permissions/threads.py:623
+msgid "You have to sign in to change threads weights."
+msgstr ""
+
+#: threads/permissions/threads.py:630
+msgid "You can't change threads weights in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:635
+msgid "This category is closed. You can't change threads weights in it."
+msgstr ""
+
+#: threads/permissions/threads.py:639
+msgid "This thread is closed. You can't change its weight."
+msgstr ""
+
+#: threads/permissions/threads.py:648 threads/permissions/threads.py:668
+msgid "You have to sign in to hide threads."
+msgstr ""
+
+#: threads/permissions/threads.py:657
+msgid "This category is closed. You can't reveal threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:660
+msgid "This thread is closed. You can't reveal it."
+msgstr ""
+
+#: threads/permissions/threads.py:678
+msgid "You can't hide threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:683
+msgid "You can't hide other users theads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:688
+#, python-format
+msgid "You can't hide threads that are older than %(minutes)s minute."
+msgid_plural "You can't hide threads that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:699
+msgid "This category is closed. You can't hide threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:702
+msgid "This thread is closed. You can't hide it."
+msgstr ""
+
+#: threads/permissions/threads.py:710
+msgid "You have to sign in to delete threads."
+msgstr ""
+
+#: threads/permissions/threads.py:720
+msgid "You can't delete threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:728
+msgid "You can't delete other users theads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:733
+#, python-format
+msgid "You can't delete threads that are older than %(minutes)s minute."
+msgid_plural ""
+"You can't delete threads that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:744
+msgid "This category is closed. You can't delete threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:747
+msgid "This thread is closed. You can't delete it."
+msgstr ""
+
+#: threads/permissions/threads.py:755
+msgid "You have to sign in to move threads."
+msgstr ""
+
+#: threads/permissions/threads.py:762
+msgid "You can't move threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:767
+msgid "This category is closed. You can't move it's threads."
+msgstr ""
+
+#: threads/permissions/threads.py:770
+msgid "This thread is closed. You can't move it."
+msgstr ""
+
+#: threads/permissions/threads.py:778
+msgid "You have to sign in to merge threads."
+msgstr ""
+
+#: threads/permissions/threads.py:786
+msgid "Other thread can't be merged with."
+msgstr ""
+
+#: threads/permissions/threads.py:787
+msgid "You can't merge threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:793
+msgid "Other thread's category is closed. You can't merge with it."
+msgstr ""
+
+#: threads/permissions/threads.py:796
+msgid "This category is closed. You can't merge it's threads."
+msgstr ""
+
+#: threads/permissions/threads.py:801
+msgid "Other thread is closed and can't be merged with."
+msgstr ""
+
+#: threads/permissions/threads.py:804
+msgid "This thread is closed. You can't merge it with other threads."
+msgstr ""
+
+#: threads/permissions/threads.py:813
+msgid "You have to sign in to approve threads."
+msgstr ""
+
+#: threads/permissions/threads.py:820
+msgid "You can't approve threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:825
+msgid "This category is closed. You can't approve threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:828
+msgid "This thread is closed. You can't approve it."
+msgstr ""
+
+#: threads/permissions/threads.py:858
+msgid "You have to sign in to edit posts."
+msgstr ""
+
+#: threads/permissions/threads.py:861
+msgid "Events can't be edited."
+msgstr ""
+
+#: threads/permissions/threads.py:868
+msgid "You can't edit posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:875
+msgid "This post is hidden, you can't edit it."
+msgstr ""
+
+#: threads/permissions/threads.py:880
+msgid "You can't edit other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:884
+msgid "This post is protected. You can't edit it."
+msgstr ""
+
+#: threads/permissions/threads.py:888
+#, python-format
+msgid "You can't edit posts that are older than %(minutes)s minute."
+msgid_plural "You can't edit posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:899
+msgid "This category is closed. You can't edit posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:903
+msgid "This thread is closed. You can't edit posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:912
+msgid "You have to sign in to reveal posts."
+msgstr ""
+
+#: threads/permissions/threads.py:920
+msgid "You can't reveal posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:924
+msgid "You can't reveal other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:928
+msgid "This post is protected. You can't reveal it."
+msgstr ""
+
+#: threads/permissions/threads.py:932
+#, python-format
+msgid "You can't reveal posts that are older than %(minutes)s minute."
+msgid_plural "You can't reveal posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:941
+msgid "You can't reveal thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:946
+msgid "This category is closed. You can't reveal posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:950
+msgid "This thread is closed. You can't reveal posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:959
+msgid "You have to sign in to hide posts."
+msgstr ""
+
+#: threads/permissions/threads.py:967
+msgid "You can't hide posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:971
+msgid "You can't hide other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:975
+msgid "This post is protected. You can't hide it."
+msgstr ""
+
+#: threads/permissions/threads.py:979
+#, python-format
+msgid "You can't hide posts that are older than %(minutes)s minute."
+msgid_plural "You can't hide posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:988
+msgid "You can't hide thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:993
+msgid "This category is closed. You can't hide posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:997
+msgid "This thread is closed. You can't hide posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1006
+msgid "You have to sign in to delete posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1014
+msgid "You can't delete posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1018
+msgid "You can't delete other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1022
+msgid "This post is protected. You can't delete it."
+msgstr ""
+
+#: threads/permissions/threads.py:1026
+#, python-format
+msgid "You can't delete posts that are older than %(minutes)s minute."
+msgid_plural "You can't delete posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:1035
+msgid "You can't delete thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1040
+msgid "This category is closed. You can't delete posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1044
+msgid "This thread is closed. You can't delete posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1053
+msgid "You have to sign in to protect posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1060
+msgid "You can't protect posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1062
+msgid "You can't protect posts you can't edit."
+msgstr ""
+
+#: threads/permissions/threads.py:1070
+msgid "You have to sign in to approve posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1077
+msgid "You can't approve posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1079
+msgid "You can't approve thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1085
+msgid "You can't approve posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1090
+msgid "This category is closed. You can't approve posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1094
+msgid "This thread is closed. You can't approve posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1103
+msgid "You have to sign in to move posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1110
+msgid "You can't move posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1112
+msgid "Events can't be moved."
+msgstr ""
+
+#: threads/permissions/threads.py:1114
+msgid "You can't move thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1116
+msgid "You can't move posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1121
+msgid "This category is closed. You can't move posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1125
+msgid "This thread is closed. You can't move posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1134
+msgid "You have to sign in to merge posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1141
+msgid "You can't merge posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1143
+msgid "Events can't be merged."
+msgstr ""
+
+#: threads/permissions/threads.py:1149
+msgid "You can't merge posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1154
+msgid "This category is closed. You can't merge posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1158
+msgid "This thread is closed. You can't merge posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1167
+msgid "You have to sign in to split posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1174
+msgid "You can't split posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1176
+msgid "Events can't be split."
+msgstr ""
+
+#: threads/permissions/threads.py:1178
+msgid "You can't split thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1180
+msgid "You can't split posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1185
+msgid "This category is closed. You can't split posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1189
+msgid "This thread is closed. You can't split posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1198
+msgid "You have to sign in to reveal events."
+msgstr ""
+
+#: threads/permissions/threads.py:1205
+msgid "You can't reveal events in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1210
+msgid "This category is closed. You can't reveal events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1214
+msgid "This thread is closed. You can't reveal events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1223
+msgid "You have to sign in to hide events."
+msgstr ""
+
+#: threads/permissions/threads.py:1230
+msgid "You can't hide events in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1235
+msgid "This category is closed. You can't hide events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1239
+msgid "This thread is closed. You can't hide events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1248
+msgid "You have to sign in to delete events."
+msgstr ""
+
+#: threads/permissions/threads.py:1255
+msgid "You can't delete events in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1260
+msgid "This category is closed. You can't delete events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1264
+msgid "This thread is closed. You can't delete events in it."
+msgstr ""
+
+#: threads/serializers/moderation.py:49
+msgid "You have to specify at least one post to delete."
+msgstr ""
+
+#: threads/serializers/moderation.py:56 threads/serializers/moderation.py:111
+#: threads/serializers/moderation.py:205 threads/serializers/moderation.py:363
+msgid "One or more post ids received were invalid."
+msgstr ""
+
+#: threads/serializers/moderation.py:70
+#, python-format
+msgid "No more than %(limit)s post can be deleted at a single time."
+msgid_plural "No more than %(limit)s posts can be deleted at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:98
+msgid "One or more posts to delete could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:105
+msgid "You have to select at least two posts to merge."
+msgstr ""
+
+#: threads/serializers/moderation.py:128
+#, python-format
+msgid "No more than %(limit)s post can be merged at a single time."
+msgid_plural "No more than %(limit)s posts can be merged at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:156
+msgid "Posts made by different users can't be merged."
+msgstr ""
+
+#: threads/serializers/moderation.py:169
+msgid "Post marked as best answer can't be merged with thread's first post."
+msgstr ""
+
+#: threads/serializers/moderation.py:180
+msgid "Posts with different visibility can't be merged."
+msgstr ""
+
+#: threads/serializers/moderation.py:187
+msgid "One or more posts to merge could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:195
+msgid "You have to specify at least one post to move."
+msgstr ""
+
+#: threads/serializers/moderation.py:199 threads/serializers/moderation.py:472
+msgid "Enter link to new thread."
+msgstr ""
+
+#: threads/serializers/moderation.py:222 threads/serializers/moderation.py:488
+msgid "This is not a valid thread link."
+msgstr ""
+
+#: threads/serializers/moderation.py:225
+msgid "Thread to move posts to is same as current one."
+msgstr ""
+
+#: threads/serializers/moderation.py:233 threads/serializers/moderation.py:500
+msgid ""
+"The thread you have entered link to doesn't exist or you don't have "
+"permission to see it."
+msgstr ""
+
+#: threads/serializers/moderation.py:240
+msgid "You can't move posts to threads you can't reply."
+msgstr ""
+
+#: threads/serializers/moderation.py:250
+#, python-format
+msgid "No more than %(limit)s post can be moved at a single time."
+msgid_plural "No more than %(limit)s posts can be moved at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:277
+msgid "One or more posts to move could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:305
+msgid "You can't create new threads in selected category."
+msgstr ""
+
+#: threads/serializers/moderation.py:319
+msgid "You don't have permission to pin threads globally in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:325
+msgid "You don't have permission to pin threads in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:337
+msgid "You don't have permission to hide threads in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:349
+msgid "You don't have permission to close threads in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:356
+msgid "You have to specify at least one post to split."
+msgstr ""
+
+#: threads/serializers/moderation.py:377
+#, python-format
+msgid "No more than %(limit)s post can be split at a single time."
+msgid_plural "No more than %(limit)s posts can be split at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:404
+msgid "One or more posts to split could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:411
+msgid "You have to specify at least one thread to delete."
+msgstr ""
+
+#: threads/serializers/moderation.py:418 threads/serializers/moderation.py:534
+msgid "One or more thread ids received were invalid."
+msgstr ""
+
+#: threads/serializers/moderation.py:432
+#, python-format
+msgid "No more than %(limit)s thread can be deleted at a single time."
+msgid_plural "No more than %(limit)s threads can be deleted at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:464
+msgid "One or more threads to delete could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:490
+msgid "You can't merge thread with itself."
+msgstr ""
+
+#: threads/serializers/moderation.py:507
+msgid "You can't merge this thread into thread you can't reply."
+msgstr ""
+
+#: threads/serializers/moderation.py:526
+msgid "You have to select at least two threads to merge."
+msgstr ""
+
+#: threads/serializers/moderation.py:555
+#, python-format
+msgid "No more than %(limit)s thread can be merged at a single time."
+msgid_plural "No more than %(limit)s threads can be merged at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:578
+msgid "One or more threads to merge could not be found."
+msgstr ""
+
+#: threads/serializers/poll.py:106
+msgid "One or more poll choices are invalid."
+msgstr ""
+
+#: threads/serializers/poll.py:116
+msgid "You need to add at least two choices to a poll."
+msgstr ""
+
+#: threads/serializers/poll.py:122
+#, python-format
+msgid ""
+"You can't add more than %(limit_value)s option to a single poll (added "
+"%(show_value)s)."
+msgid_plural ""
+"You can't add more than %(limit_value)s options to a single poll (added "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/poll.py:134
+msgid "Number of allowed choices can't be greater than number of all choices."
+msgstr ""
+
+#: threads/serializers/pollvote.py:15
+#, python-format
+msgid "This poll disallows voting for more than %(choices)s choice."
+msgid_plural "This poll disallows voting for more than %(choices)s choices."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/pollvote.py:32
+msgid "One or more of poll choices were invalid."
+msgstr ""
+
+#: threads/serializers/pollvote.py:36
+msgid "You have to make a choice."
+msgstr ""
+
+#: threads/signals.py:168
+msgid "Question"
+msgstr ""
+
+#: threads/signals.py:169
+msgid "Choices"
+msgstr ""
+
+#: threads/templatetags/misago_poststags.py:17
+#, python-format
+msgid "%(user)s likes this."
+msgstr ""
+
+#: threads/templatetags/misago_poststags.py:26
+#, python-format
+msgid "%(users)s like this."
+msgstr ""
+
+#: threads/templatetags/misago_poststags.py:29
+#, python-format
+msgid "%(users)s and %(likes)s other user like this."
+msgid_plural "%(users)s and %(likes)s other users like this."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/templatetags/misago_poststags.py:41
+#, python-format
+msgid "%(users)s and %(last_user)s"
+msgstr ""
+
+#: threads/threadtypes/thread.py:14
+msgid "None (will become top level category)"
+msgstr ""
+
+#: threads/validators.py:27
+msgid "Requested category could not be found."
+msgstr ""
+
+#: threads/validators.py:30
+msgid "You don't have permission to access this category."
+msgstr ""
+
+#: threads/validators.py:37
+msgid "Thread title should contain alpha-numeric characters."
+msgstr ""
+
+#: threads/validators.py:38
+msgid "Thread title is too long."
+msgstr ""
+
+#: threads/validators.py:46
+msgid "You have to enter an thread title."
+msgstr ""
+
+#: threads/validators.py:51
+#, python-format
+msgid ""
+"Thread title should be at least %(limit_value)s character long (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Thread title should be at least %(limit_value)s characters long (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/validators.py:63
+#, python-format
+msgid ""
+"Thread title cannot be longer than %(limit_value)s character (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Thread title cannot be longer than %(limit_value)s characters (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/validators.py:82
+#, python-format
+msgid ""
+"Posted message should be at least %(limit_value)s character long (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Posted message should be at least %(limit_value)s characters long (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/validators.py:93
+#, python-format
+msgid ""
+"Posted message cannot be longer than %(limit_value)s character (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Posted message cannot be longer than %(limit_value)s characters (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/viewmodels/threads.py:23
+msgid "Your threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:24
+msgid "New threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:25
+msgid "Unread threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:26
+msgid "Subscribed threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:27
+msgid "Unapproved content"
+msgstr ""
+
+#: threads/viewmodels/threads.py:32
+msgid "You have to sign in to see list of threads that you have started."
+msgstr ""
+
+#: threads/viewmodels/threads.py:34
+msgid "You have to sign in to see list of threads you haven't read."
+msgstr ""
+
+#: threads/viewmodels/threads.py:36
+msgid "You have to sign in to see list of threads with new replies."
+msgstr ""
+
+#: threads/viewmodels/threads.py:39
+msgid "You have to sign in to see list of threads you are subscribing."
+msgstr ""
+
+#: threads/viewmodels/threads.py:42
+msgid "You have to sign in to see list of threads with unapproved posts."
+msgstr ""
+
+#: threads/viewmodels/threads.py:113
+msgid "You don't have permission to see unapproved content lists."
+msgstr ""
+
+#: threads/views/goto.py:130
+msgid ""
+"You need permission to approve content to be able to go to first unapproved "
+"post."
+msgstr ""
+
+#: users/admin/__init__.py:77
+msgid "Bans"
+msgstr ""
+
+#: users/admin/__init__.py:87
+msgid "Ranks"
+msgstr ""
+
+#: users/admin/djangoadmin.py:42
+msgid "Misago user data"
+msgstr ""
+
+#: users/admin/djangoadmin.py:56
+msgid "Edit permissions and groups"
+msgstr ""
+
+#: users/admin/djangoadmin.py:76
+msgid "Edit the user from Misago admin panel"
+msgstr ""
+
+#: users/admin/forms.py:22 users/admin/forms.py:313 users/models/ban.py:71
+#: users/signals.py:29
+msgid "Username"
+msgstr ""
+
+#: users/admin/forms.py:23
+msgid "Custom title"
+msgstr ""
+
+#: users/admin/forms.py:24 users/models/ban.py:72
+msgid "E-mail address"
+msgstr ""
+
+#: users/admin/forms.py:59
+msgid "All registered members must have a \"Member\" role."
+msgstr ""
+
+#: users/admin/forms.py:76
+msgid "Is administrator"
+msgstr ""
+
+#: users/admin/forms.py:78
+msgid ""
+"Designates whether the user can log into admin sites. If Django admin site "
+"is enabled, this user will need additional permissions assigned within it to "
+"admin Django modules."
+msgstr ""
+
+#: users/admin/forms.py:84
+msgid "Is superuser"
+msgstr ""
+
+#: users/admin/forms.py:86
+msgid ""
+"Only administrators can access admin sites. In addition to admin site "
+"access, superadmins can also change other members admin levels."
+msgstr ""
+
+#: users/admin/forms.py:91
+msgid "Is active"
+msgstr ""
+
+#: users/admin/forms.py:93
+msgid ""
+"Designates whether this user should be treated as active. Turning this off "
+"is non-destructible way to remove user accounts."
+msgstr ""
+
+#: users/admin/forms.py:97 users/admin/forms.py:128 users/admin/forms.py:158
+msgid "Staff message"
+msgstr ""
+
+#: users/admin/forms.py:99
+msgid ""
+"Optional message for forum team members explaining why user's account has "
+"been disabled."
+msgstr ""
+
+#: users/admin/forms.py:104
+msgid "Change password to"
+msgstr ""
+
+#: users/admin/forms.py:111
+msgid "Lock avatar"
+msgstr ""
+
+#: users/admin/forms.py:113
+msgid ""
+"Setting this to yes will stop user from changing his/her avatar, and will "
+"reset his/her avatar to procedurally generated one."
+msgstr ""
+
+#: users/admin/forms.py:119 users/admin/forms.py:150 users/admin/forms.py:457
+#: users/admin/forms.py:524
+msgid "User message"
+msgstr ""
+
+#: users/admin/forms.py:121
+msgid ""
+"Optional message for user explaining why he/she is banned form changing "
+"avatar."
+msgstr ""
+
+#: users/admin/forms.py:130
+msgid ""
+"Optional message for forum team members explaining why user is banned form "
+"changing avatar."
+msgstr ""
+
+#: users/admin/forms.py:138
+msgid "Signature contents"
+msgstr ""
+
+#: users/admin/forms.py:143
+msgid "Lock signature"
+msgstr ""
+
+#: users/admin/forms.py:145
+msgid ""
+"Setting this to yes will stop user from making changes to his/her signature."
+msgstr ""
+
+#: users/admin/forms.py:152
+msgid "Optional message to user explaining why his/hers signature is locked."
+msgstr ""
+
+#: users/admin/forms.py:160
+msgid ""
+"Optional message to team members explaining why user signature is locked."
+msgstr ""
+
+#: users/admin/forms.py:166
+msgid "Hides presence"
+msgstr ""
+
+#: users/admin/forms.py:169
+msgid "Who can add user to private threads"
+msgstr ""
+
+#: users/admin/forms.py:178
+msgid "Replid threads"
+msgstr ""
+
+#: users/admin/forms.py:221 users/serializers/moderation.py:36
+#, python-format
+msgid "Signature can't be longer than %(limit)s character."
+msgid_plural "Signature can't be longer than %(limit)s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/admin/forms.py:240
+msgid ""
+"Ranks are used to group and distinguish users. They are also used to add "
+"permissions to groups of users."
+msgstr ""
+
+#: users/admin/forms.py:252
+msgid "Individual roles of this user. All users must have a \"Member\" role."
+msgstr ""
+
+#: users/admin/forms.py:315
+msgid "Profile fields contain"
+msgstr ""
+
+#: users/admin/forms.py:316
+msgid "Requires activation"
+msgstr ""
+
+#: users/admin/forms.py:318
+msgid "Administrator"
+msgstr ""
+
+#: users/admin/forms.py:319
+msgid "Deletes their account"
+msgstr ""
+
+#: users/admin/forms.py:364
+msgid "All ranks"
+msgstr ""
+
+#: users/admin/forms.py:368
+msgid "All roles"
+msgstr ""
+
+#: users/admin/forms.py:374
+msgid "Has rank"
+msgstr ""
+
+#: users/admin/forms.py:377
+msgid "Has role"
+msgstr ""
+
+#: users/admin/forms.py:389
+msgid ""
+"Short and descriptive name of all users with this rank. \"The Team\" or "
+"\"Game Masters\" are good examples."
+msgstr ""
+
+#: users/admin/forms.py:394
+msgid "User title"
+msgstr ""
+
+#: users/admin/forms.py:397
+msgid ""
+"Optional, singular version of rank name displayed by user names. For example "
+"\"GM\" or \"Dev\"."
+msgstr ""
+
+#: users/admin/forms.py:407
+msgid ""
+"Optional description explaining function or status of members distincted "
+"with this rank."
+msgstr ""
+
+#: users/admin/forms.py:412
+msgid "User roles"
+msgstr ""
+
+#: users/admin/forms.py:416
+msgid "Rank can give additional roles to users with it."
+msgstr ""
+
+#: users/admin/forms.py:422
+msgid "Optional css class added to content belonging to this rank owner."
+msgstr ""
+
+#: users/admin/forms.py:426
+msgid "Give rank dedicated tab on users list"
+msgstr ""
+
+#: users/admin/forms.py:429
+msgid ""
+"Selecting this option will make users with this rank easily discoverable by "
+"others through dedicated page on forum users list."
+msgstr ""
+
+#: users/admin/forms.py:447
+msgid "This name collides with other rank."
+msgstr ""
+
+#: users/admin/forms.py:454
+msgid "Values to ban"
+msgstr ""
+
+#: users/admin/forms.py:460
+msgid "Optional message displayed to users instead of default one."
+msgstr ""
+
+#: users/admin/forms.py:463 users/admin/forms.py:473 users/admin/forms.py:530
+#: users/admin/forms.py:540
+msgid "Message can't be longer than 1000 characters."
+msgstr ""
+
+#: users/admin/forms.py:467 users/admin/forms.py:534
+msgid "Team message"
+msgstr ""
+
+#: users/admin/forms.py:470 users/admin/forms.py:537
+msgid "Optional ban message for moderators and administrators."
+msgstr ""
+
+#: users/admin/forms.py:476 users/admin/forms.py:543
+msgid "Expiration date"
+msgstr ""
+
+#: users/admin/forms.py:485 users/admin/forms.py:574
+msgid "E-mails"
+msgstr ""
+
+#: users/admin/forms.py:486
+msgid "E-mail domains"
+msgstr ""
+
+#: users/admin/forms.py:493
+msgid "First segment of IP addresses"
+msgstr ""
+
+#: users/admin/forms.py:494
+msgid "First two segments of IP addresses"
+msgstr ""
+
+#: users/admin/forms.py:500
+msgid "Check type"
+msgstr ""
+
+#: users/admin/forms.py:503
+msgid "Restrict this ban to registrations"
+msgstr ""
+
+#: users/admin/forms.py:505
+msgid ""
+"Changing this to yes will make this ban check be only performed on "
+"registration step. This is good if you want to block certain registrations "
+"like ones from recently comprimised e-mail providers, without harming "
+"existing users."
+msgstr ""
+
+#: users/admin/forms.py:512
+msgid "Banned value"
+msgstr ""
+
+#: users/admin/forms.py:515
+msgid ""
+"This value is case-insensitive and accepts asterisk (*) for rought matches. "
+"For example, making IP ban for value \"83.*\" will ban all IP addresses "
+"beginning with \"83.\"."
+msgstr ""
+
+#: users/admin/forms.py:520
+msgid "Banned value can't be longer than 250 characters."
+msgstr ""
+
+#: users/admin/forms.py:527
+msgid "Optional message displayed to user instead of default one."
+msgstr ""
+
+#: users/admin/forms.py:562
+msgid "Banned value is too vague."
+msgstr ""
+
+#: users/admin/forms.py:572
+msgid "All bans"
+msgstr ""
+
+#: users/admin/forms.py:575
+msgid "IPs"
+msgstr ""
+
+#: users/admin/forms.py:578
+msgid "Banned value begins with"
+msgstr ""
+
+#: users/admin/forms.py:582 users/admin/forms.py:587
+msgid "Any"
+msgstr ""
+
+#: users/admin/forms.py:622
+msgid "Usernames or emails"
+msgstr ""
+
+#: users/admin/forms.py:624
+msgid ""
+"Enter every item in new line. Duplicates will be ignored. This field is case "
+"insensitive. Depending on site configuration and amount of data to archive "
+"it may take up to few days for requests to complete. E-mail will "
+"notification will be sent to every user once their download is ready."
+msgstr ""
+
+#: users/admin/forms.py:641
+#, python-format
+msgid ""
+"You may not enter more than 20 items at a single time (You have entered "
+"%(show_value)s)."
+msgstr ""
+
+#: users/admin/forms.py:660
+msgid "One or more specified users could not be found."
+msgstr ""
+
+#: users/admin/views/bans.py:14
+msgid "Requested ban does not exist."
+msgstr ""
+
+#: users/admin/views/bans.py:30
+msgid "With bans: 0"
+msgstr ""
+
+#: users/admin/views/bans.py:31
+msgid "Select bans"
+msgstr ""
+
+#: users/admin/views/bans.py:35
+msgid "Remove bans"
+msgstr ""
+
+#: users/admin/views/bans.py:36
+msgid "Are you sure you want to remove those bans?"
+msgstr ""
+
+#: users/admin/views/bans.py:43
+msgid "Selected bans have been removed."
+msgstr ""
+
+#: users/admin/views/bans.py:47
+#, python-format
+msgid "New ban \"%(name)s\" has been saved."
+msgstr ""
+
+#: users/admin/views/bans.py:51
+#, python-format
+msgid "Ban \"%(name)s\" has been edited."
+msgstr ""
+
+#: users/admin/views/bans.py:58
+#, python-format
+msgid "Ban \"%(name)s\" has been removed."
+msgstr ""
+
+#: users/admin/views/datadownloads.py:23
+msgid "With data downloads: 0"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:24
+msgid "Select data downloads"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:28
+msgid "Expire downloads"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:30
+msgid "Are you sure you want to set selected data downloads as expired?"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:35
+msgid "Delete downloads"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:37
+msgid "Are you sure you want to delete selected data downloads?"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:52
+msgid "Selected data downloads have been set as expired."
+msgstr ""
+
+#: users/admin/views/datadownloads.py:59
+msgid "Selected data downloads have been deleted."
+msgstr ""
+
+#: users/admin/views/datadownloads.py:71
+msgid "Data downloads have been requested for specified users."
+msgstr ""
+
+#: users/admin/views/ranks.py:16
+msgid "Requested rank does not exist."
+msgstr ""
+
+#: users/admin/views/ranks.py:33
+#, python-format
+msgid "New rank \"%(name)s\" has been saved."
+msgstr ""
+
+#: users/admin/views/ranks.py:37
+#, python-format
+msgid "Rank \"%(name)s\" has been edited."
+msgstr ""
+
+#: users/admin/views/ranks.py:44
+#, python-format
+msgid "Rank \"%(name)s\" is default rank and can't be deleted."
+msgstr ""
+
+#: users/admin/views/ranks.py:47
+#, python-format
+msgid "Rank \"%(name)s\" is assigned to users and can't be deleted."
+msgstr ""
+
+#: users/admin/views/ranks.py:52
+#, python-format
+msgid "Rank \"%(name)s\" has been deleted."
+msgstr ""
+
+#: users/admin/views/ranks.py:69
+#, python-format
+msgid "Rank \"%(name)s\" has been moved below \"%(other)s\"."
+msgstr ""
+
+#: users/admin/views/ranks.py:87
+#, python-format
+msgid "Rank \"%(name)s\" has been moved above \"%(other)s\"."
+msgstr ""
+
+#: users/admin/views/ranks.py:101
+#, python-format
+msgid "Rank \"%(name)s\" is already default."
+msgstr ""
+
+#: users/admin/views/ranks.py:106
+#, python-format
+msgid "Rank \"%(name)s\" has been made default."
+msgstr ""
+
+#: users/admin/views/users.py:67
+msgid "Biggest posters"
+msgstr ""
+
+#: users/admin/views/users.py:68
+msgid "Smallest posters"
+msgstr ""
+
+#: users/admin/views/users.py:70
+msgid "With users: 0"
+msgstr ""
+
+#: users/admin/views/users.py:71
+msgid "Select users"
+msgstr ""
+
+#: users/admin/views/users.py:73
+msgid "Activate accounts"
+msgstr ""
+
+#: users/admin/views/users.py:75
+msgid "Request data download"
+msgstr ""
+
+#: users/admin/views/users.py:78
+msgid "Delete accounts"
+msgstr ""
+
+#: users/admin/views/users.py:79
+msgid "Are you sure you want to delete selected users?"
+msgstr ""
+
+#: users/admin/views/users.py:83
+msgid "Delete with content"
+msgstr ""
+
+#: users/admin/views/users.py:85
+msgid ""
+"Are you sure you want to delete selected users? This will also delete all "
+"content associated with their accounts."
+msgstr ""
+
+#: users/admin/views/users.py:106
+msgid "You have to select inactive users."
+msgstr ""
+
+#: users/admin/views/users.py:113
+#, python-format
+msgid "Your account on %(forum_name)s forums has been activated"
+msgstr ""
+
+#: users/admin/views/users.py:123
+msgid "Selected users accounts have been activated."
+msgstr ""
+
+#: users/admin/views/users.py:131
+#, python-format
+msgid "%(user)s is super admin and can't be banned."
+msgstr ""
+
+#: users/admin/views/users.py:193
+msgid "Selected users have been banned."
+msgstr ""
+
+#: users/admin/views/users.py:208
+msgid "Data download requests have been placed for selected users."
+msgstr ""
+
+#: users/admin/views/users.py:214 users/admin/views/users.py:230
+msgid "You can't delete yourself."
+msgstr ""
+
+#: users/admin/views/users.py:216 users/admin/views/users.py:232
+#, python-format
+msgid "%(user)s is admin and can't be deleted."
+msgstr ""
+
+#: users/admin/views/users.py:225
+msgid "Selected users have been deleted."
+msgstr ""
+
+#: users/admin/views/users.py:246
+msgid ""
+"Selected users have been disabled and queued for deletion together with "
+"their content."
+msgstr ""
+
+#: users/admin/views/users.py:255
+#, python-format
+msgid "New user \"%(user)s\" has been registered."
+msgstr ""
+
+#: users/admin/views/users.py:287
+#, python-format
+msgid "User \"%(user)s\" has been edited."
+msgstr ""
+
+#: users/api/auth.py:94
+#, python-format
+msgid "Activate %(user)s account on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/auth.py:129
+#, python-format
+msgid "Change %(user)s password on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/auth.py:164
+msgid "Form link is invalid. Please try again."
+msgstr ""
+
+#: users/api/auth.py:165
+msgid "Your link has expired. Please request new one."
+msgstr ""
+
+#: users/api/rest_permissions.py:30
+msgid "This action is not available to signed in users."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:26
+msgid "Your avatar is locked. You can't change it."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:109
+msgid "This avatar type is not allowed."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:116
+msgid "Unknown avatar type."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:137
+msgid "New avatar based on your account was set."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:143
+msgid "Gravatar was downloaded and set as new avatar."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:145
+msgid "No Gravatar is associated with your e-mail address."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:147
+msgid "Failed to connect to Gravatar servers."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:157
+msgid "Avatar from gallery was set."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:159
+msgid "Incorrect image."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:165
+msgid "No file was sent."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:178
+msgid "Avatar was re-cropped."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:183
+msgid "Uploaded avatar was set."
+msgstr ""
+
+#: users/api/userendpoints/changeemail.py:22
+#, python-format
+msgid "Confirm e-mail change on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/userendpoints/changeemail.py:35
+msgid "E-mail change confirmation link was sent to new address."
+msgstr ""
+
+#: users/api/userendpoints/changepassword.py:22
+#, python-format
+msgid "Confirm password change on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/userendpoints/changepassword.py:33
+msgid "Password change confirmation link was sent to your address."
+msgstr ""
+
+#: users/api/userendpoints/create.py:25
+msgid "New users registrations are currently closed."
+msgstr ""
+
+#: users/api/userendpoints/signature.py:13
+msgid "You don't have permission to change signature."
+msgstr ""
+
+#: users/api/userendpoints/signature.py:25
+msgid "Your signature is locked. You can't change it."
+msgstr ""
+
+#: users/api/userendpoints/username.py:32
+msgid "You can't change your username now."
+msgstr ""
+
+#: users/api/userendpoints/username.py:60
+#: users/api/userendpoints/username.py:82
+msgid "Error changing username. Please try again."
+msgstr ""
+
+#: users/api/usernamechanges.py:28
+msgid "You don't have permission to see other users name history."
+msgstr ""
+
+#: users/api/users.py:64
+msgid "You have to sign in to perform this action."
+msgstr ""
+
+#: users/api/users.py:110
+msgid "You can't change other users avatars."
+msgstr ""
+
+#: users/api/users.py:122
+msgid "You can't change other users options."
+msgstr ""
+
+#: users/api/users.py:127
+msgid "Your forum options have been changed."
+msgstr ""
+
+#: users/api/users.py:133
+msgid "You can't change other users names."
+msgstr ""
+
+#: users/api/users.py:140
+msgid "You can't change other users signatures."
+msgstr ""
+
+#: users/api/users.py:152
+msgid "You can't change other users passwords."
+msgstr ""
+
+#: users/api/users.py:162
+msgid "You can't change other users e-mail addresses."
+msgstr ""
+
+#: users/api/users.py:269
+msgid "You can't request data downloads for other users."
+msgstr ""
+
+#: users/api/users.py:273
+msgid "You can't download your data."
+msgstr ""
+
+#: users/api/users.py:278
+msgid "You can't have more than one data download request at a single time."
+msgstr ""
+
+#: users/api/users.py:335
+msgid "You can't see other users data downloads."
+msgstr ""
+
+#: users/apps.py:30
+msgid "Edit details"
+msgstr ""
+
+#: users/apps.py:36
+msgid "Change username"
+msgstr ""
+
+#: users/apps.py:42
+msgid "Change email or password"
+msgstr ""
+
+#: users/apps.py:63
+msgid "Delete account"
+msgstr ""
+
+#: users/avatars/uploaded.py:38
+msgid "Uploaded file is too big."
+msgstr ""
+
+#: users/avatars/uploaded.py:46 users/avatars/uploaded.py:51
+msgid "Uploaded file type is not allowed."
+msgstr ""
+
+#: users/avatars/uploaded.py:59
+#, python-format
+msgid "Uploaded image should be at least %(size)s pixels tall and wide."
+msgstr ""
+
+#: users/avatars/uploaded.py:63
+msgid "Uploaded image is too big."
+msgstr ""
+
+#: users/avatars/uploaded.py:68
+msgid "Uploaded image ratio cannot be greater than 16:9."
+msgstr ""
+
+#: users/avatars/uploaded.py:74
+msgid "Crop data is invalid. Please try again."
+msgstr ""
+
+#: users/captcha.py:21
+msgid "Failed to contact reCAPTCHA API."
+msgstr ""
+
+#: users/captcha.py:28
+msgid "Entered answer is incorrect."
+msgstr ""
+
+#: users/decorators.py:14
+msgid "This page is not available to signed in users."
+msgstr ""
+
+#: users/decorators.py:26
+msgid "You have to sign in to access this page."
+msgstr ""
+
+#: users/forms/auth.py:15
+msgid "Fill out both fields."
+msgstr ""
+
+#: users/forms/auth.py:16
+msgid "Login or password is incorrect."
+msgstr ""
+
+#: users/forms/auth.py:18
+msgid "You have to activate your account before you will be able to sign in."
+msgstr ""
+
+#: users/forms/auth.py:21
+msgid ""
+"Your account has to be activated by site administrator before you will be "
+"able to sign in."
+msgstr ""
+
+#: users/forms/auth.py:98
+msgid "Your account does not have admin privileges."
+msgstr ""
+
+#: users/forms/auth.py:118
+msgid "Enter e-mail address."
+msgstr ""
+
+#: users/forms/auth.py:124
+msgid "Entered e-mail is invalid."
+msgstr ""
+
+#: users/forms/auth.py:134
+msgid "No user with this e-mail exists."
+msgstr ""
+
+#: users/forms/auth.py:150 users/views/activation.py:46
+#, python-format
+msgid "%(user)s, your account is already active."
+msgstr ""
+
+#: users/forms/auth.py:156
+#, python-format
+msgid "%(user)s, only administrator may activate your account."
+msgstr ""
+
+#: users/forms/auth.py:165
+msgid ""
+"You have to activate your account before you will be able to request new "
+"password."
+msgstr ""
+
+#: users/forms/auth.py:169
+msgid ""
+"Administrator has to activate your account before you will be able to "
+"request new password."
+msgstr ""
+
+#: users/forms/register.py:34 users/validators.py:80
+msgid "This username is not allowed."
+msgstr ""
+
+#: users/forms/register.py:45 users/validators.py:52
+msgid "This e-mail address is not allowed."
+msgstr ""
+
+#: users/forms/register.py:51
+msgid "This agreement is required."
+msgstr ""
+
+#: users/forms/register.py:61
+msgid "New registrations from this IP address are not allowed."
+msgstr ""
+
+#: users/management/commands/prepareuserdatadownloads.py:38
+#, python-format
+msgid "%(user)s, your data download is ready"
+msgstr ""
+
+#: users/migrations/0004_default_ranks.py:13
+#: users/migrations/0004_default_ranks.py:14 users/models/user.py:77
+msgid "Forum team"
+msgstr ""
+
+#: users/migrations/0004_default_ranks.py:15
+msgid "Team"
+msgstr ""
+
+#: users/migrations/0004_default_ranks.py:22
+#: users/migrations/0004_default_ranks.py:23
+msgid "Members"
+msgstr ""
+
+#: users/models/datadownload.py:26
+msgid "Pending"
+msgstr ""
+
+#: users/models/datadownload.py:27
+msgid "Processing"
+msgstr ""
+
+#: users/models/datadownload.py:28
+msgid "Ready"
+msgstr ""
+
+#: users/models/deleteduser.py:12
+msgid "By self"
+msgstr ""
+
+#: users/models/deleteduser.py:13
+msgid "By staff"
+msgstr ""
+
+#: users/models/deleteduser.py:14
+msgid "By system"
+msgstr ""
+
+#: users/models/user.py:106
+msgid "Notify"
+msgstr ""
+
+#: users/models/user.py:107
+msgid "Notify with e-mail"
+msgstr ""
+
+#: users/models/user.py:115
+msgid "Everybody"
+msgstr ""
+
+#: users/models/user.py:116
+msgid "Users I follow"
+msgstr ""
+
+#: users/models/user.py:117
+msgid "Nobody"
+msgstr ""
+
+#: users/models/user.py:136
+msgid "joined on"
+msgstr ""
+
+#: users/models/user.py:148
+msgid "staff status"
+msgstr ""
+
+#: users/models/user.py:150
+msgid "Designates whether the user can log into admin sites."
+msgstr ""
+
+#: users/models/user.py:157
+msgid "active"
+msgstr ""
+
+#: users/models/user.py:161
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+
+#: users/permissions/account.py:10
+msgid "Account settings"
+msgstr ""
+
+#: users/permissions/account.py:13
+msgid "Allowed username changes number"
+msgstr ""
+
+#: users/permissions/account.py:16
+msgid "Don't count username changes older than"
+msgstr ""
+
+#: users/permissions/account.py:18
+msgid ""
+"Number of days since name change that makes that change no longer count to "
+"limit. Enter zero to make all changes count."
+msgstr ""
+
+#: users/permissions/account.py:25
+msgid "Can have signature"
+msgstr ""
+
+#: users/permissions/account.py:26
+msgid "Can put links in signature"
+msgstr ""
+
+#: users/permissions/account.py:27
+msgid "Can put images in signature"
+msgstr ""
+
+#: users/permissions/account.py:29
+msgid "Can use text blocks in signature"
+msgstr ""
+
+#: users/permissions/account.py:31
+msgid ""
+"Controls whether or not users can put quote, code, spoiler blocks and "
+"horizontal lines in signatures."
+msgstr ""
+
+#: users/permissions/decorators.py:10
+msgid "You have to sig in to perform this action."
+msgstr ""
+
+#: users/permissions/decorators.py:19
+msgid "Only guests can perform this action."
+msgstr ""
+
+#: users/permissions/delete.py:26
+msgid "Maximum age of deleted account (in days)"
+msgstr ""
+
+#: users/permissions/delete.py:27 users/permissions/delete.py:33
+msgid "Enter zero to disable this check."
+msgstr ""
+
+#: users/permissions/delete.py:32
+msgid "Maximum number of posts on deleted account"
+msgstr ""
+
+#: users/permissions/delete.py:74
+msgid "You can't delete users."
+msgstr ""
+
+#: users/permissions/delete.py:77 users/permissions/delete.py:106
+msgid "You can't delete your account."
+msgstr ""
+
+#: users/permissions/delete.py:79
+msgid "You can't delete administrators."
+msgstr ""
+
+#: users/permissions/delete.py:84
+#, python-format
+msgid "You can't delete users that are members for more than %(days)s day."
+msgid_plural ""
+"You can't delete users that are members for more than %(days)s days."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/permissions/delete.py:92
+#, python-format
+msgid "You can't delete users that made more than %(posts)s post."
+msgid_plural "You can't delete users that made more than %(posts)s posts."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/permissions/delete.py:104
+msgid "You can't delete other users accounts."
+msgstr ""
+
+#: users/permissions/delete.py:109
+msgid "You can't delete your account because you are an administrator."
+msgstr ""
+
+#: users/permissions/moderation.py:33
+msgid "Users moderation"
+msgstr ""
+
+#: users/permissions/moderation.py:35
+msgid "Can rename users"
+msgstr ""
+
+#: users/permissions/moderation.py:36
+msgid "Can moderate avatars"
+msgstr ""
+
+#: users/permissions/moderation.py:37
+msgid "Can moderate signatures"
+msgstr ""
+
+#: users/permissions/moderation.py:38
+msgid "Can moderate profile details"
+msgstr ""
+
+#: users/permissions/moderation.py:39
+msgid "Can ban users"
+msgstr ""
+
+#: users/permissions/moderation.py:41
+msgid "Max length, in days, of imposed ban"
+msgstr ""
+
+#: users/permissions/moderation.py:42
+msgid "Enter zero to let moderators impose permanent bans."
+msgstr ""
+
+#: users/permissions/moderation.py:46
+msgid "Can lift bans"
+msgstr ""
+
+#: users/permissions/moderation.py:48
+msgid "Max length, in days, of lifted ban"
+msgstr ""
+
+#: users/permissions/moderation.py:49
+msgid "Enter zero to let moderators lift permanent bans."
+msgstr ""
+
+#: users/permissions/moderation.py:111
+msgid "You can't rename users."
+msgstr ""
+
+#: users/permissions/moderation.py:113
+msgid "You can't rename administrators."
+msgstr ""
+
+#: users/permissions/moderation.py:121
+msgid "You can't moderate avatars."
+msgstr ""
+
+#: users/permissions/moderation.py:123
+msgid "You can't moderate administrators avatars."
+msgstr ""
+
+#: users/permissions/moderation.py:131
+msgid "You can't moderate signatures."
+msgstr ""
+
+#: users/permissions/moderation.py:133
+msgid "You can't moderate administrators signatures."
+msgstr ""
+
+#: users/permissions/moderation.py:142
+msgid "You have to sign in to edit profile details."
+msgstr ""
+
+#: users/permissions/moderation.py:147
+msgid "You can't edit other users details."
+msgstr ""
+
+#: users/permissions/moderation.py:149
+msgid "You can't edit administrators details."
+msgstr ""
+
+#: users/permissions/moderation.py:158
+msgid "You can't ban users."
+msgstr ""
+
+#: users/permissions/moderation.py:160
+msgid "You can't ban administrators."
+msgstr ""
+
+#: users/permissions/moderation.py:168
+msgid "You can't lift bans."
+msgstr ""
+
+#: users/permissions/moderation.py:171
+msgid "This user is not banned."
+msgstr ""
+
+#: users/permissions/moderation.py:176
+msgid "You can't lift permanent bans."
+msgstr ""
+
+#: users/permissions/moderation.py:178
+#, python-format
+msgid "You can't lift bans that expire after %(expiration)s."
+msgstr ""
+
+#: users/permissions/profiles.py:23
+msgid "Can browse users list"
+msgstr ""
+
+#: users/permissions/profiles.py:24
+msgid "Can search user profiles"
+msgstr ""
+
+#: users/permissions/profiles.py:25
+msgid "Can see other members name history"
+msgstr ""
+
+#: users/permissions/profiles.py:27
+msgid "Can see members bans details"
+msgstr ""
+
+#: users/permissions/profiles.py:29
+msgid "Allows users with this permission to see user and staff ban messages."
+msgstr ""
+
+#: users/permissions/profiles.py:35
+msgid "User profiles"
+msgstr ""
+
+#: users/permissions/profiles.py:46
+msgid "Can follow other users"
+msgstr ""
+
+#: users/permissions/profiles.py:47
+msgid "Can be blocked by other users"
+msgstr ""
+
+#: users/permissions/profiles.py:50
+msgid "Can see members e-mails"
+msgstr ""
+
+#: users/permissions/profiles.py:51
+msgid "Can see members IPs"
+msgstr ""
+
+#: users/permissions/profiles.py:53
+msgid "Can see members that hide their presence"
+msgstr ""
+
+#: users/permissions/profiles.py:113
+msgid "You can't browse users list."
+msgstr ""
+
+#: users/permissions/profiles.py:122
+msgid "You can't follow other users."
+msgstr ""
+
+#: users/permissions/profiles.py:124
+msgid "You can't add yourself to followed."
+msgstr ""
+
+#: users/permissions/profiles.py:133
+msgid "You can't block administrators."
+msgstr ""
+
+#: users/permissions/profiles.py:135
+msgid "You can't block yourself."
+msgstr ""
+
+#: users/permissions/profiles.py:145
+msgid "You can't see users bans details."
+msgstr ""
+
+#: users/profilefields/default.py:12
+msgid "Bio"
+msgstr ""
+
+#: users/profilefields/default.py:17
+msgid "Real name"
+msgstr ""
+
+#: users/profilefields/default.py:22
+msgid "Location"
+msgstr ""
+
+#: users/profilefields/default.py:27
+msgid "Gender"
+msgstr ""
+
+#: users/profilefields/default.py:30
+msgid "Not specified"
+msgstr ""
+
+#: users/profilefields/default.py:31
+msgid "Not telling"
+msgstr ""
+
+#: users/profilefields/default.py:32
+msgid "Female"
+msgstr ""
+
+#: users/profilefields/default.py:33
+msgid "Male"
+msgstr ""
+
+#: users/profilefields/default.py:39
+msgid "Website"
+msgstr ""
+
+#: users/profilefields/default.py:41
+msgid ""
+"If you own website in the internet you wish to share on your profile you may "
+"enter its address here. Remember to for it to be valid http address starting "
+"with either \"http://\" or \"https://\"."
+msgstr ""
+
+#: users/profilefields/default.py:49
+msgid "Skype ID"
+msgstr ""
+
+#: users/profilefields/default.py:51
+msgid ""
+"Entering your Skype ID in this field may invite other users to contact you "
+"over the Skype instead of via private threads."
+msgstr ""
+
+#: users/profilefields/default.py:58
+msgid "Twitter handle"
+msgstr ""
+
+#: users/profilefields/default.py:62
+#, python-format
+msgid ""
+"If you own Twitter account, here you may enter your Twitter handle for other "
+"users to find you. Starting your handle with \"@\" sign is optional. Either "
+"\"@%(slug)s\" or \"%(slug)s\" are valid values."
+msgstr ""
+
+#: users/profilefields/default.py:73
+msgid "This is not a valid twitter handle."
+msgstr ""
+
+#: users/profilefields/default.py:79
+msgid "Join IP"
+msgstr ""
+
+#: users/registration.py:12
+#, python-format
+msgid "Welcome on %(forum_name)s forums!"
+msgstr ""
+
+#: users/search.py:22
+msgid "You don't have permission to search users."
+msgstr ""
+
+#: users/serializers/ban.py:26
+msgid "Your IP address is banned."
+msgstr ""
+
+#: users/serializers/ban.py:28
+msgid "You are banned."
+msgstr ""
+
+#: users/serializers/options.py:46
+msgid "Signature is too long."
+msgstr ""
+
+#: users/serializers/options.py:57
+msgid "Enter new username."
+msgstr ""
+
+#: users/serializers/options.py:61
+msgid "New username is same as current one."
+msgstr ""
+
+#: users/serializers/options.py:80 users/serializers/options.py:94
+#: users/serializers/options.py:116
+msgid "Entered password is invalid."
+msgstr ""
+
+#: users/serializers/options.py:100
+msgid "You have to enter new e-mail address."
+msgstr ""
+
+#: users/serializers/options.py:104
+msgid "New e-mail is same as current one."
+msgstr ""
+
+#: users/signals.py:31
+msgid "Joined on"
+msgstr ""
+
+#: users/signals.py:32
+msgid "Joined from ip"
+msgstr ""
+
+#: users/signals.py:74
+msgid "New username"
+msgstr ""
+
+#: users/signals.py:75
+msgid "Old username"
+msgstr ""
+
+#: users/validators.py:40
+msgid "This e-mail address is not available."
+msgstr ""
+
+#: users/validators.py:68
+msgid "This username is not available."
+msgstr ""
+
+#: users/validators.py:86
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr ""
+
+#: users/validators.py:93
+#, python-format
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/validators.py:101
+#, python-format
+msgid "Username cannot be longer than %(limit_value)s characters."
+msgid_plural "Username cannot be longer than %(limit_value)s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/validators.py:137
+msgid "Data entered was found in spammers database."
+msgstr ""
+
+#: users/validators.py:147
+msgid "This email is not allowed."
+msgstr ""
+
+#: users/views/activation.py:51
+#, python-format
+msgid ""
+"%(user)s, your activation link is invalid. Try again or request new "
+"activation link."
+msgstr ""
+
+#: users/views/activation.py:69
+#, python-format
+msgid "%(user)s, your account has been activated!"
+msgstr ""
+
+#: users/views/forgottenpassword.py:31
+#, python-format
+msgid "%(user)s, your link has expired. Please request new link and try again."
+msgstr ""
+
+#: users/views/forgottenpassword.py:38
+#, python-format
+msgid "%(user)s, your link is invalid. Please try again or request new link."
+msgstr ""
+
+#: users/views/options.py:56
+#, python-format
+msgid "%(user)s, your e-mail has been changed."
+msgstr ""
+
+#: users/views/options.py:74
+#, python-format
+msgid "%(user)s, your password has been changed."
+msgstr ""

BIN
misago/locale/de/LC_MESSAGES/djangojs.mo


+ 51 - 55
misago/locale/de/LC_MESSAGES/djangojs.po

@@ -2,25 +2,25 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # Ettore Atalan <atalanttore@googlemail.com>, 2017
 # Lara Rönnebeck, 2018
 # Rey Koxha <rey@koxha.de>, 2018
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Rey Koxha <rey@koxha.de>, 2018\n"
 "Language-Team: German (https://www.transifex.com/misago/teams/65369/de/)\n"
+"Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: de\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #: static/misago/admin/index.js:16
@@ -120,8 +120,7 @@ msgstr "Dieser Bann ist permanent."
 #: static/misago/js/misago.js:1
 msgid "No categories exist or you don't have permission to see them."
 msgstr ""
-"Es existieren keine Kategorien oder du hast keine Berechtigung, sie zu "
-"sehen."
+"Es existieren keine Kategorien oder du hast keine Berechtigung, sie zu sehen."
 
 #: static/misago/js/misago.js:1
 msgid "This category has no new posts. (closed)"
@@ -387,8 +386,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Please select the best answer for your newly merged thread. No posts will be"
-" deleted during the merge."
+"Please select the best answer for your newly merged thread. No posts will be "
+"deleted during the merge."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -478,8 +477,8 @@ msgstr "Konto löschen"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You are going to delete your account. This action is nonreversible, and will"
-" result in following data being deleted:"
+"You are going to delete your account. This action is nonreversible, and will "
+"result in following data being deleted:"
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -500,8 +499,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"All your posted content will NOT be deleted, but username associated with it"
-" will be changed to one shared by all deleted accounts."
+"All your posted content will NOT be deleted, but username associated with it "
+"will be changed to one shared by all deleted accounts."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -692,6 +691,10 @@ msgid "Change forgotten password"
 msgstr "Vergessenes Passwort ändern"
 
 #: static/misago/js/misago.js:1
+msgid "%(user)s has been made new thread owner."
+msgstr ""
+
+#: static/misago/js/misago.js:1
 msgid "You have left this thread."
 msgstr "Du hast diesen Thread verlassen."
 
@@ -700,10 +703,6 @@ msgid "%(user)s has been removed from this thread."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "%(user)s has been made new thread owner."
-msgstr ""
-
-#: static/misago/js/misago.js:1
 msgid "See profile"
 msgstr ""
 
@@ -958,8 +957,7 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you with to revert this post to the state from before this "
-"edit?"
+"Are you sure you with to revert this post to the state from before this edit?"
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -1369,13 +1367,13 @@ msgid "This post is hidden. Only users with permission may see its contents."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+msgid "This post is protected. Only moderators may change it."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "This post is protected. Only moderators may change it."
+msgid ""
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -1477,22 +1475,22 @@ msgid "%(username)s's details have been updated."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "You have no started threads."
+msgid "You have posted no messages."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s started no threads."
+msgid "%(username)s posted no messages."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "You have started %(threads)s thread."
-msgid_plural "You have started %(threads)s threads."
+msgid "You have posted %(posts)s message."
+msgid_plural "You have posted %(posts)s messages."
 msgstr[0] ""
 msgstr[1] ""
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s has started %(threads)s thread."
-msgid_plural "%(username)s has started %(threads)s threads."
+msgid "%(username)s has posted %(posts)s message."
+msgid_plural "%(username)s has posted %(posts)s messages."
 msgstr[0] ""
 msgstr[1] ""
 
@@ -1501,32 +1499,32 @@ msgid "Loading..."
 msgstr "Wird geladen..."
 
 #: static/misago/js/misago.js:1
-msgid "Threads"
-msgstr ""
+msgid "Posts"
+msgstr "Beiträge"
 
 #: static/misago/js/misago.js:1
-msgid "You have posted no messages."
+msgid "You have no started threads."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s posted no messages."
+msgid "%(username)s started no threads."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "You have posted %(posts)s message."
-msgid_plural "You have posted %(posts)s messages."
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
 msgstr[0] ""
 msgstr[1] ""
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s has posted %(posts)s message."
-msgid_plural "%(username)s has posted %(posts)s messages."
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
 msgstr[0] ""
 msgstr[1] ""
 
 #: static/misago/js/misago.js:1
-msgid "Posts"
-msgstr "Beiträge"
+msgid "Threads"
+msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid "Show older activity"
@@ -1992,8 +1990,7 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you want to merge selected posts? This action is not "
-"reversible!"
+"Are you sure you want to merge selected posts? This action is not reversible!"
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -2331,8 +2328,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You need permission to start threads in category to be able to merge threads"
-" to it."
+"You need permission to start threads in category to be able to merge threads "
+"to it."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -2590,18 +2587,22 @@ msgid "You are banned"
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "You have to accept the terms of service."
-msgstr ""
+msgid "Valid password must be at least %(limit_value)s character long."
+msgid_plural "Valid password must be at least %(limit_value)s characters long."
+msgstr[0] ""
+msgstr[1] ""
 
 #: static/misago/js/misago.js:1
 msgid "You have to accept the privacy policy."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "Username must be at least %(limit_value)s character long."
-msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] ""
-msgstr[1] ""
+msgid "You have to accept the terms of service."
+msgstr ""
+
+#: static/misago/js/misago.js:1
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid "Username cannot be longer than %(limit_value)s character."
@@ -2610,13 +2611,8 @@ msgstr[0] ""
 msgstr[1] ""
 
 #: static/misago/js/misago.js:1
-msgid "Username can only contain latin alphabet letters and digits."
-msgstr ""
-
-#: static/misago/js/misago.js:1
-msgid "Valid password must be at least %(limit_value)s character long."
-msgid_plural ""
-"Valid password must be at least %(limit_value)s characters long."
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
 msgstr[0] ""
 msgstr[1] ""
 

BIN
misago/locale/en/LC_MESSAGES/django.mo


+ 222 - 350
misago/locale/en/LC_MESSAGES/django.po

@@ -2,20 +2,20 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: \n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #: acl/admin/__init__.py:24 templates/misago/acl_debug.html:16
@@ -214,7 +214,7 @@ msgstr "Closed category"
 msgid "Only members with valid permissions can post in closed categories."
 msgstr "Only members with valid permissions can post in closed categories."
 
-#: categories/admin/forms.py:70 conf/admin/__init__.py:93
+#: categories/admin/forms.py:70 conf/admin/__init__.py:79
 #: templates/misago/admin/categories/list.html:19
 #: templates/misago/admin/dashboard/totals.html:19
 #: templates/misago/navbar.html:20 templates/misago/navbar.html:36
@@ -228,7 +228,7 @@ msgstr "Only members with valid permissions can post in closed categories."
 #: templates/misago/threadslist/threads.html:42
 #: templates/misago/threadslist/threads.html:66
 #: threads/permissions/threads.py:73 threads/permissions/threads.py:104
-#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:106
+#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:97
 msgid "Threads"
 msgstr "Threads"
 
@@ -262,11 +262,11 @@ msgstr "Thread age"
 
 #: categories/admin/forms.py:95
 msgid ""
-"Prune thread if number of days since its creation is greater than specified."
-" Enter 0 to disable this pruning criteria."
+"Prune thread if number of days since its creation is greater than specified. "
+"Enter 0 to disable this pruning criteria."
 msgstr ""
-"Prune thread if number of days since its creation is greater than specified."
-" Enter 0 to disable this pruning criteria."
+"Prune thread if number of days since its creation is greater than specified. "
+"Enter 0 to disable this pruning criteria."
 
 #: categories/admin/forms.py:100
 msgid "Last reply"
@@ -314,11 +314,9 @@ msgstr "Archive"
 
 #: categories/admin/forms.py:173
 msgid ""
-"Instead of being deleted, pruned threads can be moved to designated "
-"category."
+"Instead of being deleted, pruned threads can be moved to designated category."
 msgstr ""
-"Instead of being deleted, pruned threads can be moved to designated "
-"category."
+"Instead of being deleted, pruned threads can be moved to designated category."
 
 #: categories/admin/forms.py:177
 msgid "Don't archive pruned threads"
@@ -349,8 +347,7 @@ msgid "Move child categories to"
 msgstr "Move child categories to"
 
 #: categories/admin/forms.py:249 categories/admin/forms.py:264
-#: templates/misago/acl_debug.html:15
-#: templates/misago/admin/roles/list.html:16
+#: templates/misago/acl_debug.html:15 templates/misago/admin/roles/list.html:16
 msgid "Role"
 msgstr "Role"
 
@@ -460,20 +457,20 @@ msgstr "Can see category contents"
 msgid "You don't have permission to browse \"%(category)s\" contents."
 msgstr "You don't have permission to browse \"%(category)s\" contents."
 
-#: conf/admin/__init__.py:45 templates/misago/admin/conf/index.html:5
+#: conf/admin/__init__.py:41 templates/misago/admin/conf/index.html:5
 #: templates/misago/admin/themes/form.html:48
 msgid "Settings"
 msgstr "Settings"
 
-#: conf/admin/__init__.py:52 templates/misago/admin/socialauth/form.html:27
+#: conf/admin/__init__.py:48 templates/misago/admin/socialauth/form.html:27
 msgid "General"
 msgstr "General"
 
-#: conf/admin/__init__.py:53
+#: conf/admin/__init__.py:49
 msgid "Change forum details like name, description or footer."
 msgstr "Change forum details like name, description or footer."
 
-#: conf/admin/__init__.py:58 templates/misago/admin/dashboard/totals.html:7
+#: conf/admin/__init__.py:54 templates/misago/admin/dashboard/totals.html:7
 #: templates/misago/admin/users/ban.html:22 templates/misago/navbar.html:42
 #: templates/misago/userslists/base.html:5
 #: templates/misago/userslists/base.html:14 users/admin/__init__.py:74
@@ -481,40 +478,28 @@ msgstr "Change forum details like name, description or footer."
 msgid "Users"
 msgstr "Users"
 
-#: conf/admin/__init__.py:60
+#: conf/admin/__init__.py:56
 msgid "Customize user accounts default behavior and features availability."
 msgstr "Customize user accounts default behavior and features availability."
 
-#: conf/admin/__init__.py:67
+#: conf/admin/__init__.py:63
 msgid "Captcha"
 msgstr "Captcha"
 
-#: conf/admin/__init__.py:69
+#: conf/admin/__init__.py:65
 msgid "Setup protection against automatic registrations on the site."
 msgstr "Setup protection against automatic registrations on the site."
 
-#: conf/admin/__init__.py:76
-msgid "Single Sign-On"
-msgstr "Single Sign-On"
-
-#: conf/admin/__init__.py:78
-msgid ""
-"SSO enables you to delegate user login and registration from Misago tothe "
-"third party site."
-msgstr ""
-"SSO enables you to delegate user login and registration from Misago tothe "
-"third party site."
-
-#: conf/admin/__init__.py:86 templates/misago/admin/dashboard/analytics.html:7
+#: conf/admin/__init__.py:72 templates/misago/admin/dashboard/analytics.html:7
 #: templates/misago/admin/dashboard/index.html:40
 msgid "Analytics"
 msgstr "Analytics"
 
-#: conf/admin/__init__.py:87
+#: conf/admin/__init__.py:73
 msgid "Enable Google Analytics or setup Google Site Verification."
 msgstr "Enable Google Analytics or setup Google Site Verification."
 
-#: conf/admin/__init__.py:94
+#: conf/admin/__init__.py:80
 msgid "Threads, posts, polls and attachments options."
 msgstr "Threads, posts, polls and attachments options."
 
@@ -536,11 +521,11 @@ msgstr "Site verification token"
 
 #: conf/admin/forms/analytics.py:27
 msgid ""
-"This token was extracted from uploaded site verification file. To change it,"
-" upload new verification file."
+"This token was extracted from uploaded site verification file. To change it, "
+"upload new verification file."
 msgstr ""
-"This token was extracted from uploaded site verification file. To change it,"
-" upload new verification file."
+"This token was extracted from uploaded site verification file. To change it, "
+"upload new verification file."
 
 #: conf/admin/forms/analytics.py:34
 msgid "Upload site verification file"
@@ -772,44 +757,6 @@ msgstr ""
 "Misago uses this setting to build links in e-mails sent to site users. "
 "Address under which site is running appears to be \"%(address)s\"."
 
-#: conf/admin/forms/sso.py:13
-msgid "Enable Single Sign-On"
-msgstr "Enable Single Sign-On"
-
-#: conf/admin/forms/sso.py:15
-msgid ""
-"Enabling SSO will make login option redirect users to the server URL "
-"configured below. It will also disable option to register on forum, change "
-"username, email or passward, as those features will be delegated to the 3rd "
-"party site."
-msgstr ""
-"Enabling SSO will make login option redirect users to the server URL "
-"configured below. It will also disable option to register on forum, change "
-"username, email or passward, as those features will be delegated to the 3rd "
-"party site."
-
-#: conf/admin/forms/sso.py:22
-msgid "Public key"
-msgstr "Public key"
-
-#: conf/admin/forms/sso.py:24 conf/admin/forms/sso.py:32
-msgid ""
-"Leave this field empty for Misago to generate this key on form submission."
-msgstr ""
-"Leave this field empty for Misago to generate this key on form submission."
-
-#: conf/admin/forms/sso.py:30
-msgid "Private key"
-msgstr "Private key"
-
-#: conf/admin/forms/sso.py:37
-msgid "Server URL"
-msgstr "Server URL"
-
-#: conf/admin/forms/sso.py:50
-msgid "You need to enter server URL to enable SSO."
-msgstr "You need to enter server URL to enable SSO."
-
 #: conf/admin/forms/threads.py:27
 msgid "Daily post limit per user"
 msgstr "Daily post limit per user"
@@ -876,15 +823,15 @@ msgstr "Read-tracker cutoff"
 
 #: conf/admin/forms/threads.py:71
 msgid ""
-"Controls amount of data used by read-tracking system. All content older than"
-" number of days specified in this setting is considered old and read, even "
-"if the opposite is true for the user. Active forums can try lowering this "
-"value while less active ones may wish to increase it instead. "
+"Controls amount of data used by read-tracking system. All content older than "
+"number of days specified in this setting is considered old and read, even if "
+"the opposite is true for the user. Active forums can try lowering this value "
+"while less active ones may wish to increase it instead. "
 msgstr ""
-"Controls amount of data used by read-tracking system. All content older than"
-" number of days specified in this setting is considered old and read, even "
-"if the opposite is true for the user. Active forums can try lowering this "
-"value while less active ones may wish to increase it instead. "
+"Controls amount of data used by read-tracking system. All content older than "
+"number of days specified in this setting is considered old and read, even if "
+"the opposite is true for the user. Active forums can try lowering this value "
+"while less active ones may wish to increase it instead. "
 
 #: conf/admin/forms/threads.py:80
 msgid "Number of threads displayed on a single page"
@@ -970,11 +917,11 @@ msgstr "Disable new registrations"
 
 #: conf/admin/forms/users.py:48
 msgid ""
-"Delete new inactive accounts if they weren't activated within this number of"
-" days"
+"Delete new inactive accounts if they weren't activated within this number of "
+"days"
 msgstr ""
-"Delete new inactive accounts if they weren't activated within this number of"
-" days"
+"Delete new inactive accounts if they weren't activated within this number of "
+"days"
 
 #: conf/admin/forms/users.py:51
 msgid "Enter 0 to never delete inactive new accounts."
@@ -1030,11 +977,11 @@ msgstr "Fallback for default gravatar"
 
 #: conf/admin/forms/users.py:86
 msgid ""
-"Select which avatar to use when user has no gravatar associated with their "
-"e-mail address."
+"Select which avatar to use when user has no gravatar associated with their e-"
+"mail address."
 msgstr ""
-"Select which avatar to use when user has no gravatar associated with their "
-"e-mail address."
+"Select which avatar to use when user has no gravatar associated with their e-"
+"mail address."
 
 #: conf/admin/forms/users.py:96
 msgid "Blank avatar"
@@ -1156,15 +1103,15 @@ msgstr "Uploaded image's edge should be at least %(size)s pixels long."
 msgid "This value must be lower than number of users per page."
 msgstr "This value must be lower than number of users per page."
 
-#: conf/admin/views.py:40
+#: conf/admin/views.py:39
 msgid "Settings have been saved."
 msgstr "Settings have been saved."
 
-#: core/errorpages.py:42
+#: core/errorpages.py:51
 msgid "Permission denied."
 msgstr "Permission denied."
 
-#: core/errorpages.py:71
+#: core/errorpages.py:80
 msgid ""
 "A problem was encountered when disconnecting your account from the remote "
 "site."
@@ -1172,7 +1119,7 @@ msgstr ""
 "A problem was encountered when disconnecting your account from the remote "
 "site."
 
-#: core/errorpages.py:75
+#: core/errorpages.py:84
 msgid ""
 "You are not allowed to disconnect your account from the other site, because "
 "currently it's the only way to sign in to your account."
@@ -1180,24 +1127,24 @@ msgstr ""
 "You are not allowed to disconnect your account from the other site, because "
 "currently it's the only way to sign in to your account."
 
-#: core/errorpages.py:80
+#: core/errorpages.py:89
 #, python-format
 msgid "A problem was encountered when signing you in using %(backend)s."
 msgstr "A problem was encountered when signing you in using %(backend)s."
 
-#: core/errorpages.py:84
+#: core/errorpages.py:93
 msgid "The sign in process has been canceled by user."
 msgstr "The sign in process has been canceled by user."
 
-#: core/errorpages.py:86
+#: core/errorpages.py:95
 msgid "The other service could not be reached."
 msgstr "The other service could not be reached."
 
-#: core/errorpages.py:92
+#: core/errorpages.py:101
 msgid "Unexpected problem has been encountered during sign in process."
 msgstr "Unexpected problem has been encountered during sign in process."
 
-#: core/errorpages.py:113
+#: core/errorpages.py:122
 msgid ""
 "Your request was rejected because your browser didn't send the CSRF cookie, "
 "or the cookie sent was invalid."
@@ -1248,11 +1195,11 @@ msgstr "Failed to connect to pypi.org API. Try again later."
 #: templates/misago/admin/dashboard/checks.html:17
 #: templates/misago/admin/dashboard/index.html:33
 msgid ""
-"Version check feature relies on the API operated by the Python Package Index"
-" (pypi.org) API to retrieve latest Misago release version."
+"Version check feature relies on the API operated by the Python Package Index "
+"(pypi.org) API to retrieve latest Misago release version."
 msgstr ""
-"Version check feature relies on the API operated by the Python Package Index"
-" (pypi.org) API to retrieve latest Misago release version."
+"Version check feature relies on the API operated by the Python Package Index "
+"(pypi.org) API to retrieve latest Misago release version."
 
 #: graphql/admin/versioncheck.py:70
 msgid "The site is running updated version of Misago."
@@ -1585,11 +1532,11 @@ msgstr "Search"
 msgid "Can search site"
 msgstr "Can search site"
 
-#: socialauth/admin/__init__.py:42
+#: socialauth/admin/__init__.py:40
 msgid "Social login"
 msgstr "Social login"
 
-#: socialauth/admin/__init__.py:44
+#: socialauth/admin/__init__.py:42
 msgid "Enable users to sign on and login using their social profile."
 msgstr "Enable users to sign on and login using their social profile."
 
@@ -1612,14 +1559,14 @@ msgstr "Associate existing users by email"
 #: socialauth/admin/forms/base.py:39
 msgid ""
 "Enabling this option will result in the user being signed in if their forum "
-"account was registered using same e-mail address as used on the social site."
-" Otherwise they will be asked to specify a different e-mail to continue sign"
-" in using social site."
+"account was registered using same e-mail address as used on the social site. "
+"Otherwise they will be asked to specify a different e-mail to continue sign "
+"in using social site."
 msgstr ""
 "Enabling this option will result in the user being signed in if their forum "
-"account was registered using same e-mail address as used on the social site."
-" Otherwise they will be asked to specify a different e-mail to continue sign"
-" in using social site."
+"account was registered using same e-mail address as used on the social site. "
+"Otherwise they will be asked to specify a different e-mail to continue sign "
+"in using social site."
 
 #: socialauth/admin/forms/base.py:51 socialauth/admin/forms/base.py:53
 #: threads/admin/forms.py:97
@@ -1677,11 +1624,11 @@ msgstr "Login with %(provider)s has been moved before %(other)s."
 #: socialauth/pipeline.py:88
 #, python-format
 msgid ""
-"The e-mail address associated with your %(backend)s account is not available"
-" for use on this site."
+"The e-mail address associated with your %(backend)s account is not available "
+"for use on this site."
 msgstr ""
-"The e-mail address associated with your %(backend)s account is not available"
-" for use on this site."
+"The e-mail address associated with your %(backend)s account is not available "
+"for use on this site."
 
 #: socialauth/pipeline.py:98
 #, python-format
@@ -1696,18 +1643,6 @@ msgstr ""
 msgid "Please try resubmitting the form."
 msgstr "Please try resubmitting the form."
 
-#: socialauth/views.py:23
-msgid "Please use the 3rd party site to login."
-msgstr "Please use the 3rd party site to login."
-
-#: sso/validators.py:24 users/forms/register.py:34 users/validators.py:80
-msgid "This username is not allowed."
-msgstr "This username is not allowed."
-
-#: sso/validators.py:33 users/forms/register.py:45 users/validators.py:52
-msgid "This e-mail address is not allowed."
-msgstr "This e-mail address is not allowed."
-
 #: templates/misago/acl_debug.html:5
 #, python-format
 msgid ""
@@ -1762,11 +1697,11 @@ msgstr "Request activation link"
 
 #: templates/misago/activation/request.html:25
 msgid ""
-"The site administrator may impose a requirement on newly registered accounts"
-" to be activated before users will be able to sign in."
+"The site administrator may impose a requirement on newly registered accounts "
+"to be activated before users will be able to sign in."
 msgstr ""
-"The site administrator may impose a requirement on newly registered accounts"
-" to be activated before users will be able to sign in."
+"The site administrator may impose a requirement on newly registered accounts "
+"to be activated before users will be able to sign in."
 
 #: templates/misago/activation/request.html:28
 msgid ""
@@ -2141,7 +2076,7 @@ msgstr "Category"
 #: templates/misago/admin/dashboard/totals.html:31
 #: templates/misago/admin/users/list.html:21
 #: templates/misago/profile/posts.html:5 templates/misago/profile/posts.html:8
-#: templates/misago/profile/posts.html:9 users/apps.py:102
+#: templates/misago/profile/posts.html:9 users/apps.py:93
 msgid "Posts"
 msgstr "Posts"
 
@@ -2285,58 +2220,45 @@ msgstr "Read-tracker"
 msgid "Attachment error images"
 msgstr "Attachment error images"
 
-#: templates/misago/admin/conf/users_settings.html:9
-#: templates/misago/admin/socialauth/list.html:97
-msgid "Note"
-msgstr "Note"
-
-#: templates/misago/admin/conf/users_settings.html:9
-msgid ""
-"Single Sign-On is enabled. Site's registration, password and deletion "
-"features have been disabled and delegated to the third-party site."
-msgstr ""
-"Single Sign-On is enabled. Site's registration, password and deletion "
-"features have been disabled and delegated to the third-party site."
-
-#: templates/misago/admin/conf/users_settings.html:14
+#: templates/misago/admin/conf/users_settings.html:8
 msgid "New accounts"
 msgstr "New accounts"
 
-#: templates/misago/admin/conf/users_settings.html:23 users/admin/forms.py:484
+#: templates/misago/admin/conf/users_settings.html:17 users/admin/forms.py:484
 #: users/admin/forms.py:573
 msgid "Usernames"
 msgstr "Usernames"
 
-#: templates/misago/admin/conf/users_settings.html:33
+#: templates/misago/admin/conf/users_settings.html:27
 msgid "Avatars"
 msgstr "Avatars"
 
-#: templates/misago/admin/conf/users_settings.html:49
+#: templates/misago/admin/conf/users_settings.html:43
 msgid "Signatures"
 msgstr "Signatures"
 
-#: templates/misago/admin/conf/users_settings.html:57
+#: templates/misago/admin/conf/users_settings.html:51
 #: users/admin/__init__.py:80
 msgid "Data downloads"
 msgstr "Data downloads"
 
-#: templates/misago/admin/conf/users_settings.html:66
+#: templates/misago/admin/conf/users_settings.html:60
 msgid "Own account deletion"
 msgstr "Own account deletion"
 
-#: templates/misago/admin/conf/users_settings.html:74 users/admin/forms.py:492
+#: templates/misago/admin/conf/users_settings.html:68 users/admin/forms.py:492
 msgid "IP addresses"
 msgstr "IP addresses"
 
-#: templates/misago/admin/conf/users_settings.html:82
+#: templates/misago/admin/conf/users_settings.html:76
 msgid "Default subscription preferences"
 msgstr "Default subscription preferences"
 
-#: templates/misago/admin/conf/users_settings.html:91
+#: templates/misago/admin/conf/users_settings.html:85
 msgid "Users lists"
 msgstr "Users lists"
 
-#: templates/misago/admin/conf/users_settings.html:100
+#: templates/misago/admin/conf/users_settings.html:94
 msgid "Top posters ranking"
 msgstr "Top posters ranking"
 
@@ -2470,9 +2392,8 @@ msgstr "Data download requests"
 msgid "Site analytics are currently unavailable due to an error."
 msgstr "Site analytics are currently unavailable due to an error."
 
-#: templates/misago/admin/dashboard/totals.html:43
-#: threads/admin/__init__.py:38 threads/permissions/attachments.py:11
-#: threads/permissions/attachments.py:29
+#: templates/misago/admin/dashboard/totals.html:43 threads/admin/__init__.py:36
+#: threads/permissions/attachments.py:11 threads/permissions/attachments.py:29
 msgid "Attachments"
 msgstr "Attachments"
 
@@ -2592,27 +2513,27 @@ msgstr "Your browser is configured to don't accept or send any cookies."
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:12
 msgid ""
-"The form was sent after being opened in the browser for a long time (eg. few"
-" days) and cookie token has expired."
+"The form was sent after being opened in the browser for a long time (eg. few "
+"days) and cookie token has expired."
 msgstr ""
-"The form was sent after being opened in the browser for a long time (eg. few"
-" days) and cookie token has expired."
+"The form was sent after being opened in the browser for a long time (eg. few "
+"days) and cookie token has expired."
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:15
 msgid ""
-"The site is configured to use the HTTPS, but this form was sent over the the"
-" HTTP."
+"The site is configured to use the HTTPS, but this form was sent over the the "
+"HTTP."
 msgstr ""
-"The site is configured to use the HTTPS, but this form was sent over the the"
-" HTTP."
+"The site is configured to use the HTTPS, but this form was sent over the the "
+"HTTP."
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:16
 msgid ""
-"If you are an owner of this site, please check if the HTTPS certificate used"
-" by the site is valid and accepted by the browser."
+"If you are an owner of this site, please check if the HTTPS certificate used "
+"by the site is valid and accepted by the browser."
 msgstr ""
-"If you are an owner of this site, please check if the HTTPS certificate used"
-" by the site is valid and accepted by the browser."
+"If you are an owner of this site, please check if the HTTPS certificate used "
+"by the site is valid and accepted by the browser."
 
 #: templates/misago/admin/generic/filter_form.html:7
 msgid "Filter"
@@ -2872,8 +2793,7 @@ msgstr "Display and visibility"
 #: templates/misago/admin/ranks/list.html:17
 #: templates/misago/admin/users/list.html:19
 #: templates/misago/userslists/active_posters.html:112
-#: templates/misago/userslists/active_posters.html:123
-#: users/admin/forms.py:238
+#: templates/misago/userslists/active_posters.html:123 users/admin/forms.py:238
 msgid "Rank"
 msgstr "Rank"
 
@@ -2938,7 +2858,7 @@ msgid "Enabled login methods"
 msgstr "Enabled login methods"
 
 #: templates/misago/admin/socialauth/list.html:15
-#: templates/misago/admin/socialauth/list.html:112
+#: templates/misago/admin/socialauth/list.html:106
 msgid "Provider"
 msgstr "Provider"
 
@@ -2954,27 +2874,19 @@ msgstr "No social login methods are enabled."
 msgid "Are you sure you want to disable this social login provider?"
 msgstr "Are you sure you want to disable this social login provider?"
 
-#: templates/misago/admin/socialauth/list.html:97
-msgid ""
-"Single Sign-On is enabled. Social authentication has been disabled and "
-"delegated to the third-party site."
-msgstr ""
-"Single Sign-On is enabled. Social authentication has been disabled and "
-"delegated to the third-party site."
-
-#: templates/misago/admin/socialauth/list.html:106
+#: templates/misago/admin/socialauth/list.html:100
 msgid "Setup new login method"
 msgstr "Setup new login method"
 
-#: templates/misago/admin/socialauth/list.html:125
+#: templates/misago/admin/socialauth/list.html:119
 msgid "Setup login with this provider"
 msgstr "Setup login with this provider"
 
-#: templates/misago/admin/socialauth/list.html:126
+#: templates/misago/admin/socialauth/list.html:120
 msgid "Setup"
 msgstr "Setup"
 
-#: templates/misago/admin/socialauth/list.html:133
+#: templates/misago/admin/socialauth/list.html:127
 msgid "No new login providers are available for setup at this time."
 msgstr "No new login providers are available for setup at this time."
 
@@ -3279,7 +3191,7 @@ msgstr ""
 msgid "Signature"
 msgstr "Signature"
 
-#: templates/misago/admin/users/edit.html:228 users/apps.py:27
+#: templates/misago/admin/users/edit.html:228 users/apps.py:24
 msgid "Forum options"
 msgstr "Forum options"
 
@@ -3301,11 +3213,9 @@ msgstr ""
 
 #: templates/misago/admin/users/edit.html:251
 msgid ""
-"No additional action is required. This account will be deleted "
-"automatically."
+"No additional action is required. This account will be deleted automatically."
 msgstr ""
-"No additional action is required. This account will be deleted "
-"automatically."
+"No additional action is required. This account will be deleted automatically."
 
 #: templates/misago/admin/users/edit.html:294
 msgid "Agreements"
@@ -3347,7 +3257,8 @@ msgstr "\"*chan\" will match both \"chan\" and \"marichan\"."
 
 #: templates/misago/admin/users/list.html:120
 msgid "\"*son*\" will match \"son\", \"song\", \"firstson\" and \"firstsong\"."
-msgstr "\"*son*\" will match \"son\", \"song\", \"firstson\" and \"firstsong\"."
+msgstr ""
+"\"*son*\" will match \"son\", \"song\", \"firstson\" and \"firstsong\"."
 
 #: templates/misago/admin/users/new.html:47
 msgid "Save user"
@@ -3453,8 +3364,7 @@ msgstr "This category is empty. No threads were posted within it so far."
 
 #: templates/misago/categories/last_thread.html:68
 msgid "This category is private. You can see only your own threads within it."
-msgstr ""
-"This category is private. You can see only your own threads within it."
+msgstr "This category is private. You can see only your own threads within it."
 
 #: templates/misago/categories/last_thread.html:82
 msgid "This category is protected. You can't browse it's contents."
@@ -3496,11 +3406,11 @@ msgstr "Activate my account!"
 #: templates/misago/emails/change_email.txt:6
 #, python-format
 msgid ""
-"%(user)s, you are receiving this message because you have changed your "
-"e-mail address."
+"%(user)s, you are receiving this message because you have changed your e-"
+"mail address."
 msgstr ""
-"%(user)s, you are receiving this message because you have changed your "
-"e-mail address."
+"%(user)s, you are receiving this message because you have changed your e-"
+"mail address."
 
 #: templates/misago/emails/change_email.html:11
 #: templates/misago/emails/change_email.txt:10
@@ -3552,7 +3462,7 @@ msgstr ""
 "%(user)s, you are receiving this message because your data is ready for "
 "download."
 
-#: templates/misago/emails/data_download.html:11 users/apps.py:57
+#: templates/misago/emails/data_download.html:11 users/apps.py:52
 msgid "Download data"
 msgstr "Download data"
 
@@ -3638,11 +3548,11 @@ msgstr ""
 #: templates/misago/emails/register/inactive.html:12
 #: templates/misago/emails/register/inactive.txt:15
 msgid ""
-"This may take a while, but you will receive e-mail with notification once it"
-" happens."
+"This may take a while, but you will receive e-mail with notification once it "
+"happens."
 msgstr ""
-"This may take a while, but you will receive e-mail with notification once it"
-" happens."
+"This may take a while, but you will receive e-mail with notification once it "
+"happens."
 
 #: templates/misago/emails/register/inactive.html:17
 #: templates/misago/emails/register/inactive.txt:20
@@ -3855,12 +3765,12 @@ msgstr ""
 
 #: templates/misago/forgottenpassword/request.html:39
 msgid ""
-"Instead, you can change your password using special secure form that will be"
-" available by special link valid only for your browser, for seven days or "
+"Instead, you can change your password using special secure form that will be "
+"available by special link valid only for your browser, for seven days or "
 "until your password is changed."
 msgstr ""
-"Instead, you can change your password using special secure form that will be"
-" available by special link valid only for your browser, for seven days or "
+"Instead, you can change your password using special secure form that will be "
+"available by special link valid only for your browser, for seven days or "
 "until your password is changed."
 
 #: templates/misago/forgottenpassword/request.html:42
@@ -3986,7 +3896,7 @@ msgstr "See results"
 #: templates/misago/profile/ban_details.html:5
 #: templates/misago/profile/ban_details.html:8
 #: templates/misago/profile/ban_details.html:9
-#: templates/misago/profile/ban_details.html:16 users/apps.py:137
+#: templates/misago/profile/ban_details.html:16 users/apps.py:128
 msgid "Ban details"
 msgstr "Ban details"
 
@@ -4035,7 +3945,7 @@ msgstr[1] "Started %(threads)s threads."
 #: templates/misago/profile/details.html:5
 #: templates/misago/profile/details.html:8
 #: templates/misago/profile/details.html:9
-#: templates/misago/profile/details.html:19 users/apps.py:124
+#: templates/misago/profile/details.html:19 users/apps.py:115
 msgid "Details"
 msgstr "Details"
 
@@ -4064,7 +3974,7 @@ msgstr "This error is caused by invalid post content manipulation."
 
 #: templates/misago/profile/followers.html:5
 #: templates/misago/profile/followers.html:8
-#: templates/misago/profile/followers.html:9 users/apps.py:112
+#: templates/misago/profile/followers.html:9 users/apps.py:103
 msgid "Followers"
 msgstr "Followers"
 
@@ -4093,7 +4003,7 @@ msgstr "%(username)s has no followers."
 
 #: templates/misago/profile/follows.html:5
 #: templates/misago/profile/follows.html:8
-#: templates/misago/profile/follows.html:9 users/apps.py:118
+#: templates/misago/profile/follows.html:9 users/apps.py:109
 msgid "Follows"
 msgstr "Follows"
 
@@ -4181,7 +4091,7 @@ msgstr "%(username)s started no threads."
 
 #: templates/misago/profile/username_history.html:5
 #: templates/misago/profile/username_history.html:8
-#: templates/misago/profile/username_history.html:9 users/apps.py:130
+#: templates/misago/profile/username_history.html:9 users/apps.py:121
 msgid "Username history"
 msgstr "Username history"
 
@@ -4366,11 +4276,11 @@ msgstr "This post is hidden. Only users with permission may see its contents."
 
 #: templates/misago/thread/posts/post/flags.html:29
 msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 
 #: templates/misago/thread/posts/post/flags.html:35
 msgid "This post is protected. Only moderators may change it."
@@ -4456,8 +4366,7 @@ msgstr "last reply by %(user)s %(date)s"
 #: templates/misago/thread/thread.html:30
 #, python-format
 msgid "Started by %(starter)s on %(started_on)s in the %(category)s category."
-msgstr ""
-"Started by %(starter)s on %(started_on)s in the %(category)s category."
+msgstr "Started by %(starter)s on %(started_on)s in the %(category)s category."
 
 #: templates/misago/thread/thread.html:21
 #: templates/misago/thread/thread.html:32
@@ -4561,7 +4470,7 @@ msgstr "Poll"
 
 #: templates/misago/userslists/active_posters.html:5
 #: templates/misago/userslists/active_posters.html:23
-#: templates/misago/userslists/active_posters.html:24 users/apps.py:81
+#: templates/misago/userslists/active_posters.html:24 users/apps.py:72
 msgid "Top posters"
 msgstr "Top posters"
 
@@ -4877,11 +4786,11 @@ msgstr "CSS link \"%(name)s\" has been updated."
 msgid "Default Misago Theme"
 msgstr "Default Misago Theme"
 
-#: threads/admin/__init__.py:45
+#: threads/admin/__init__.py:43
 msgid "Attachment types"
 msgstr "Attachment types"
 
-#: threads/admin/__init__.py:46
+#: threads/admin/__init__.py:44
 msgid "Specify what files may be uploaded on the forum."
 msgstr "Specify what files may be uploaded on the forum."
 
@@ -4931,11 +4840,9 @@ msgstr "Limit downloads to"
 
 #: threads/admin/forms.py:64
 msgid ""
-"List of comma separated file extensions associated with this attachment "
-"type."
+"List of comma separated file extensions associated with this attachment type."
 msgstr ""
-"List of comma separated file extensions associated with this attachment "
-"type."
+"List of comma separated file extensions associated with this attachment type."
 
 #: threads/admin/forms.py:68
 msgid ""
@@ -5045,11 +4952,9 @@ msgstr "Attachment type \"%(name)s\" has been edited."
 #: threads/admin/views/attachmenttypes.py:47
 #, python-format
 msgid ""
-"Attachment type \"%(name)s\" has associated attachments and can't be "
-"deleted."
+"Attachment type \"%(name)s\" has associated attachments and can't be deleted."
 msgstr ""
-"Attachment type \"%(name)s\" has associated attachments and can't be "
-"deleted."
+"Attachment type \"%(name)s\" has associated attachments and can't be deleted."
 
 #: threads/admin/views/attachmenttypes.py:54
 #, python-format
@@ -5266,11 +5171,9 @@ msgstr "This post is already marked as thread's best answer."
 
 #: threads/api/threadendpoints/patch.py:273
 msgid ""
-"This post can't be unmarked because it's not currently marked as best "
-"answer."
+"This post can't be unmarked because it's not currently marked as best answer."
 msgstr ""
-"This post can't be unmarked because it's not currently marked as best "
-"answer."
+"This post can't be unmarked because it's not currently marked as best answer."
 
 #: threads/api/threadendpoints/patch.py:301
 msgid "You have to enter new participant's username."
@@ -5376,8 +5279,10 @@ msgstr "You can't delete original post without deleting thread."
 
 #: threads/participants.py:142
 #, python-format
-msgid "%(user)s has invited you to participate in private thread \"%(thread)s\""
-msgstr "%(user)s has invited you to participate in private thread \"%(thread)s\""
+msgid ""
+"%(user)s has invited you to participate in private thread \"%(thread)s\""
+msgstr ""
+"%(user)s has invited you to participate in private thread \"%(thread)s\""
 
 #: threads/permissions/attachments.py:14
 msgid "Max attached file size (in kb)"
@@ -5424,8 +5329,7 @@ msgstr "Can change marked answers"
 
 #: threads/permissions/bestanswers.py:44
 msgid "Time limit for changing marked best answer in owned thread, in minutes"
-msgstr ""
-"Time limit for changing marked best answer in owned thread, in minutes"
+msgstr "Time limit for changing marked best answer in owned thread, in minutes"
 
 #: threads/permissions/bestanswers.py:47
 msgid ""
@@ -5477,11 +5381,11 @@ msgstr ""
 #: threads/permissions/bestanswers.py:188
 #, python-format
 msgid ""
-"You don't have permission to change this thread's marked answer because it's"
-" in the \"%(category)s\" category."
+"You don't have permission to change this thread's marked answer because it's "
+"in the \"%(category)s\" category."
 msgstr ""
-"You don't have permission to change this thread's marked answer because it's"
-" in the \"%(category)s\" category."
+"You don't have permission to change this thread's marked answer because it's "
+"in the \"%(category)s\" category."
 
 #: threads/permissions/bestanswers.py:198
 msgid ""
@@ -5561,11 +5465,11 @@ msgstr ""
 
 #: threads/permissions/bestanswers.py:274
 msgid ""
-"You can't unmark this thread's best answer because it's closed and you don't"
-" have permission to open it."
+"You can't unmark this thread's best answer because it's closed and you don't "
+"have permission to open it."
 msgstr ""
-"You can't unmark this thread's best answer because it's closed and you don't"
-" have permission to open it."
+"You can't unmark this thread's best answer because it's closed and you don't "
+"have permission to open it."
 
 #: threads/permissions/bestanswers.py:282
 msgid ""
@@ -5783,11 +5687,11 @@ msgstr "Can report private threads"
 
 #: threads/permissions/privatethreads.py:52
 msgid ""
-"Allows user to report private threads they are participating in, making them"
-" accessible to moderators."
+"Allows user to report private threads they are participating in, making them "
+"accessible to moderators."
 msgstr ""
-"Allows user to report private threads they are participating in, making them"
-" accessible to moderators."
+"Allows user to report private threads they are participating in, making them "
+"accessible to moderators."
 
 #: threads/permissions/privatethreads.py:57
 msgid "Can moderate private threads"
@@ -5865,13 +5769,13 @@ msgstr "Can see unapproved content list"
 msgid ""
 "Allows access to \"unapproved\" tab on threads lists for easy listing of "
 "threads that are unapproved or contain unapproved posts. Despite the tab "
-"being available on all threads lists, it will only display threads belonging"
-" to categories in which the user has permission to approve content."
+"being available on all threads lists, it will only display threads belonging "
+"to categories in which the user has permission to approve content."
 msgstr ""
 "Allows access to \"unapproved\" tab on threads lists for easy listing of "
 "threads that are unapproved or contain unapproved posts. Despite the tab "
-"being available on all threads lists, it will only display threads belonging"
-" to categories in which the user has permission to approve content."
+"being available on all threads lists, it will only display threads belonging "
+"to categories in which the user has permission to approve content."
 
 #: threads/permissions/threads.py:87
 msgid "Can see reported content list"
@@ -6777,8 +6681,7 @@ msgstr[1] ""
 
 #: threads/serializers/poll.py:134
 msgid "Number of allowed choices can't be greater than number of all choices."
-msgstr ""
-"Number of allowed choices can't be greater than number of all choices."
+msgstr "Number of allowed choices can't be greater than number of all choices."
 
 #: threads/serializers/pollvote.py:15
 #, python-format
@@ -7005,12 +6908,12 @@ msgstr "Is administrator"
 #: users/admin/forms.py:78
 msgid ""
 "Designates whether the user can log into admin sites. If Django admin site "
-"is enabled, this user will need additional permissions assigned within it to"
-" admin Django modules."
+"is enabled, this user will need additional permissions assigned within it to "
+"admin Django modules."
 msgstr ""
 "Designates whether the user can log into admin sites. If Django admin site "
-"is enabled, this user will need additional permissions assigned within it to"
-" admin Django modules."
+"is enabled, this user will need additional permissions assigned within it to "
+"admin Django modules."
 
 #: users/admin/forms.py:84
 msgid "Is superuser"
@@ -7186,11 +7089,11 @@ msgstr "User title"
 
 #: users/admin/forms.py:397
 msgid ""
-"Optional, singular version of rank name displayed by user names. For example"
-" \"GM\" or \"Dev\"."
+"Optional, singular version of rank name displayed by user names. For example "
+"\"GM\" or \"Dev\"."
 msgstr ""
-"Optional, singular version of rank name displayed by user names. For example"
-" \"GM\" or \"Dev\"."
+"Optional, singular version of rank name displayed by user names. For example "
+"\"GM\" or \"Dev\"."
 
 #: users/admin/forms.py:407
 msgid ""
@@ -7337,13 +7240,13 @@ msgstr "Usernames or emails"
 
 #: users/admin/forms.py:624
 msgid ""
-"Enter every item in new line. Duplicates will be ignored. This field is case"
-" insensitive. Depending on site configuration and amount of data to archive "
+"Enter every item in new line. Duplicates will be ignored. This field is case "
+"insensitive. Depending on site configuration and amount of data to archive "
 "it may take up to few days for requests to complete. E-mail will "
 "notification will be sent to every user once their download is ready."
 msgstr ""
-"Enter every item in new line. Duplicates will be ignored. This field is case"
-" insensitive. Depending on site configuration and amount of data to archive "
+"Enter every item in new line. Duplicates will be ignored. This field is case "
+"insensitive. Depending on site configuration and amount of data to archive "
 "it may take up to few days for requests to complete. E-mail will "
 "notification will be sent to every user once their download is ready."
 
@@ -7585,26 +7488,21 @@ msgstr "New user \"%(user)s\" has been registered."
 msgid "User \"%(user)s\" has been edited."
 msgstr "User \"%(user)s\" has been edited."
 
-#: users/api/auth.py:42 users/api/auth.py:92 users/api/auth.py:130
-#: users/api/auth.py:174
-msgid "Please use the 3rd party site to authenticate."
-msgstr "Please use the 3rd party site to authenticate."
-
-#: users/api/auth.py:100
+#: users/api/auth.py:94
 #, python-format
 msgid "Activate %(user)s account on %(forum_name)s forums"
 msgstr "Activate %(user)s account on %(forum_name)s forums"
 
-#: users/api/auth.py:138
+#: users/api/auth.py:129
 #, python-format
 msgid "Change %(user)s password on %(forum_name)s forums"
 msgstr "Change %(user)s password on %(forum_name)s forums"
 
-#: users/api/auth.py:176
+#: users/api/auth.py:164
 msgid "Form link is invalid. Please try again."
 msgstr "Form link is invalid. Please try again."
 
-#: users/api/auth.py:177
+#: users/api/auth.py:165
 msgid "Your link has expired. Please request new one."
 msgstr "Your link has expired. Please request new one."
 
@@ -7707,83 +7605,63 @@ msgstr "You don't have permission to see other users name history."
 msgid "You have to sign in to perform this action."
 msgstr "You have to sign in to perform this action."
 
-#: users/api/users.py:90
-msgid "Please use the 3rd party site to register."
-msgstr "Please use the 3rd party site to register."
-
-#: users/api/users.py:113
+#: users/api/users.py:110
 msgid "You can't change other users avatars."
 msgstr "You can't change other users avatars."
 
-#: users/api/users.py:125
+#: users/api/users.py:122
 msgid "You can't change other users options."
 msgstr "You can't change other users options."
 
-#: users/api/users.py:130
+#: users/api/users.py:127
 msgid "Your forum options have been changed."
 msgstr "Your forum options have been changed."
 
-#: users/api/users.py:137
-msgid "Please use the 3rd party site to change your username."
-msgstr "Please use the 3rd party site to change your username."
-
-#: users/api/users.py:141
+#: users/api/users.py:133
 msgid "You can't change other users names."
 msgstr "You can't change other users names."
 
-#: users/api/users.py:148
+#: users/api/users.py:140
 msgid "You can't change other users signatures."
 msgstr "You can't change other users signatures."
 
-#: users/api/users.py:161
-msgid "Please use the 3rd party site to change your password."
-msgstr "Please use the 3rd party site to change your password."
-
-#: users/api/users.py:165
+#: users/api/users.py:152
 msgid "You can't change other users passwords."
 msgstr "You can't change other users passwords."
 
-#: users/api/users.py:175
-msgid "Please use the 3rd party site to change your e-mail."
-msgstr "Please use the 3rd party site to change your e-mail."
-
-#: users/api/users.py:180
+#: users/api/users.py:162
 msgid "You can't change other users e-mail addresses."
 msgstr "You can't change other users e-mail addresses."
 
-#: users/api/users.py:211
-msgid "Please use the 3rd party site to delete account."
-msgstr "Please use the 3rd party site to delete account."
-
-#: users/api/users.py:292
+#: users/api/users.py:269
 msgid "You can't request data downloads for other users."
 msgstr "You can't request data downloads for other users."
 
-#: users/api/users.py:296
+#: users/api/users.py:273
 msgid "You can't download your data."
 msgstr "You can't download your data."
 
-#: users/api/users.py:301
+#: users/api/users.py:278
 msgid "You can't have more than one data download request at a single time."
 msgstr "You can't have more than one data download request at a single time."
 
-#: users/api/users.py:358
+#: users/api/users.py:335
 msgid "You can't see other users data downloads."
 msgstr "You can't see other users data downloads."
 
-#: users/apps.py:33
+#: users/apps.py:30
 msgid "Edit details"
 msgstr "Edit details"
 
-#: users/apps.py:39
+#: users/apps.py:36
 msgid "Change username"
 msgstr "Change username"
 
-#: users/apps.py:46
+#: users/apps.py:42
 msgid "Change email or password"
 msgstr "Change email or password"
 
-#: users/apps.py:71
+#: users/apps.py:63
 msgid "Delete account"
 msgstr "Delete account"
 
@@ -7864,7 +7742,7 @@ msgstr "Entered e-mail is invalid."
 msgid "No user with this e-mail exists."
 msgstr "No user with this e-mail exists."
 
-#: users/forms/auth.py:150 users/views/activation.py:51
+#: users/forms/auth.py:150 users/views/activation.py:46
 #, python-format
 msgid "%(user)s, your account is already active."
 msgstr "%(user)s, your account is already active."
@@ -7890,6 +7768,14 @@ msgstr ""
 "Administrator has to activate your account before you will be able to "
 "request new password."
 
+#: users/forms/register.py:34 users/validators.py:80
+msgid "This username is not allowed."
+msgstr "This username is not allowed."
+
+#: users/forms/register.py:45 users/validators.py:52
+msgid "This e-mail address is not allowed."
+msgstr "This e-mail address is not allowed."
+
 #: users/forms/register.py:51
 msgid "This agreement is required."
 msgstr "This agreement is required."
@@ -8066,8 +7952,7 @@ msgstr "You can't delete administrators."
 msgid "You can't delete users that are members for more than %(days)s day."
 msgid_plural ""
 "You can't delete users that are members for more than %(days)s days."
-msgstr[0] ""
-"You can't delete users that are members for more than %(days)s day."
+msgstr[0] "You can't delete users that are members for more than %(days)s day."
 msgstr[1] ""
 "You can't delete users that are members for more than %(days)s days."
 
@@ -8297,13 +8182,13 @@ msgstr "Website"
 
 #: users/profilefields/default.py:41
 msgid ""
-"If you own website in the internet you wish to share on your profile you may"
-" enter its address here. Remember to for it to be valid http address "
-"starting with either \"http://\" or \"https://\"."
+"If you own website in the internet you wish to share on your profile you may "
+"enter its address here. Remember to for it to be valid http address starting "
+"with either \"http://\" or \"https://\"."
 msgstr ""
-"If you own website in the internet you wish to share on your profile you may"
-" enter its address here. Remember to for it to be valid http address "
-"starting with either \"http://\" or \"https://\"."
+"If you own website in the internet you wish to share on your profile you may "
+"enter its address here. Remember to for it to be valid http address starting "
+"with either \"http://\" or \"https://\"."
 
 #: users/profilefields/default.py:49
 msgid "Skype ID"
@@ -8324,13 +8209,13 @@ msgstr "Twitter handle"
 #: users/profilefields/default.py:62
 #, python-format
 msgid ""
-"If you own Twitter account, here you may enter your Twitter handle for other"
-" users to find you. Starting your handle with \"@\" sign is optional. Either"
-" \"@%(slug)s\" or \"%(slug)s\" are valid values."
+"If you own Twitter account, here you may enter your Twitter handle for other "
+"users to find you. Starting your handle with \"@\" sign is optional. Either "
+"\"@%(slug)s\" or \"%(slug)s\" are valid values."
 msgstr ""
-"If you own Twitter account, here you may enter your Twitter handle for other"
-" users to find you. Starting your handle with \"@\" sign is optional. Either"
-" \"@%(slug)s\" or \"%(slug)s\" are valid values."
+"If you own Twitter account, here you may enter your Twitter handle for other "
+"users to find you. Starting your handle with \"@\" sign is optional. Either "
+"\"@%(slug)s\" or \"%(slug)s\" are valid values."
 
 #: users/profilefields/default.py:73
 msgid "This is not a valid twitter handle."
@@ -8432,11 +8317,7 @@ msgstr "Data entered was found in spammers database."
 msgid "This email is not allowed."
 msgstr "This email is not allowed."
 
-#: users/views/activation.py:21
-msgid "Please use the 3rd party site to activate your account."
-msgstr "Please use the 3rd party site to activate your account."
-
-#: users/views/activation.py:56
+#: users/views/activation.py:51
 #, python-format
 msgid ""
 "%(user)s, your activation link is invalid. Try again or request new "
@@ -8445,37 +8326,28 @@ msgstr ""
 "%(user)s, your activation link is invalid. Try again or request new "
 "activation link."
 
-#: users/views/activation.py:74
+#: users/views/activation.py:69
 #, python-format
 msgid "%(user)s, your account has been activated!"
 msgstr "%(user)s, your account has been activated!"
 
-#: users/views/forgottenpassword.py:18 users/views/options.py:70
-msgid "Please use the 3rd party site to change password."
-msgstr "Please use the 3rd party site to change password."
-
-#: users/views/forgottenpassword.py:45
+#: users/views/forgottenpassword.py:31
 #, python-format
-msgid ""
-"%(user)s, your link has expired. Please request new link and try again."
+msgid "%(user)s, your link has expired. Please request new link and try again."
 msgstr ""
 "%(user)s, your link has expired. Please request new link and try again."
 
-#: users/views/forgottenpassword.py:52
+#: users/views/forgottenpassword.py:38
 #, python-format
 msgid "%(user)s, your link is invalid. Please try again or request new link."
 msgstr "%(user)s, your link is invalid. Please try again or request new link."
 
-#: users/views/options.py:47
-msgid "Please use the 3rd party site to change e-mail."
-msgstr "Please use the 3rd party site to change e-mail."
-
-#: users/views/options.py:59
+#: users/views/options.py:56
 #, python-format
 msgid "%(user)s, your e-mail has been changed."
 msgstr "%(user)s, your e-mail has been changed."
 
-#: users/views/options.py:80
+#: users/views/options.py:74
 #, python-format
 msgid "%(user)s, your password has been changed."
 msgstr "%(user)s, your password has been changed."

BIN
misago/locale/en/LC_MESSAGES/djangojs.mo


+ 79 - 86
misago/locale/en/LC_MESSAGES/djangojs.po

@@ -2,20 +2,20 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: \n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #: static/misago/admin/index.js:16
@@ -140,8 +140,7 @@ msgstr "This category is empty. No threads were posted within it so far."
 
 #: static/misago/js/misago.js:1
 msgid "This category is private. You can see only your own threads within it."
-msgstr ""
-"This category is private. You can see only your own threads within it."
+msgstr "This category is private. You can see only your own threads within it."
 
 #: static/misago/js/misago.js:1
 msgid "This category is protected. You can't browse its contents."
@@ -381,11 +380,11 @@ msgstr "Best answer"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Please select the best answer for your newly merged thread. No posts will be"
-" deleted during the merge."
+"Please select the best answer for your newly merged thread. No posts will be "
+"deleted during the merge."
 msgstr ""
-"Please select the best answer for your newly merged thread. No posts will be"
-" deleted during the merge."
+"Please select the best answer for your newly merged thread. No posts will be "
+"deleted during the merge."
 
 #: static/misago/js/misago.js:1
 msgid "Poll"
@@ -478,11 +477,11 @@ msgstr "Delete account"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You are going to delete your account. This action is nonreversible, and will"
-" result in following data being deleted:"
+"You are going to delete your account. This action is nonreversible, and will "
+"result in following data being deleted:"
 msgstr ""
-"You are going to delete your account. This action is nonreversible, and will"
-" result in following data being deleted:"
+"You are going to delete your account. This action is nonreversible, and will "
+"result in following data being deleted:"
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -502,16 +501,15 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid "Your e-mail will become available for use in new account registration."
-msgstr ""
-"Your e-mail will become available for use in new account registration."
+msgstr "Your e-mail will become available for use in new account registration."
 
 #: static/misago/js/misago.js:1
 msgid ""
-"All your posted content will NOT be deleted, but username associated with it"
-" will be changed to one shared by all deleted accounts."
+"All your posted content will NOT be deleted, but username associated with it "
+"will be changed to one shared by all deleted accounts."
 msgstr ""
-"All your posted content will NOT be deleted, but username associated with it"
-" will be changed to one shared by all deleted accounts."
+"All your posted content will NOT be deleted, but username associated with it "
+"will be changed to one shared by all deleted accounts."
 
 #: static/misago/js/misago.js:1
 msgid "Delete my account"
@@ -712,6 +710,10 @@ msgid "Change forgotten password"
 msgstr "Change forgotten password"
 
 #: static/misago/js/misago.js:1
+msgid "%(user)s has been made new thread owner."
+msgstr "%(user)s has been made new thread owner."
+
+#: static/misago/js/misago.js:1
 msgid "You have left this thread."
 msgstr "You have left this thread."
 
@@ -720,10 +722,6 @@ msgid "%(user)s has been removed from this thread."
 msgstr "%(user)s has been removed from this thread."
 
 #: static/misago/js/misago.js:1
-msgid "%(user)s has been made new thread owner."
-msgstr "%(user)s has been made new thread owner."
-
-#: static/misago/js/misago.js:1
 msgid "See profile"
 msgstr "See profile"
 
@@ -985,11 +983,9 @@ msgstr "Revert"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you with to revert this post to the state from before this "
-"edit?"
+"Are you sure you with to revert this post to the state from before this edit?"
 msgstr ""
-"Are you sure you with to revert this post to the state from before this "
-"edit?"
+"Are you sure you with to revert this post to the state from before this edit?"
 
 #: static/misago/js/misago.js:1
 msgid "Post has been reverted to previous state."
@@ -1416,18 +1412,18 @@ msgid "This post is hidden. Only users with permission may see its contents."
 msgstr "This post is hidden. Only users with permission may see its contents."
 
 #: static/misago/js/misago.js:1
-msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
-msgstr ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
-
-#: static/misago/js/misago.js:1
 msgid "This post is protected. Only moderators may change it."
 msgstr "This post is protected. Only moderators may change it."
 
 #: static/misago/js/misago.js:1
+msgid ""
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
+msgstr ""
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
+
+#: static/misago/js/misago.js:1
 msgid "Liked"
 msgstr "Liked"
 
@@ -1526,34 +1522,6 @@ msgid "%(username)s's details have been updated."
 msgstr "%(username)s's details have been updated."
 
 #: static/misago/js/misago.js:1
-msgid "You have no started threads."
-msgstr "You have no started threads."
-
-#: static/misago/js/misago.js:1
-msgid "%(username)s started no threads."
-msgstr "%(username)s started no threads."
-
-#: static/misago/js/misago.js:1
-msgid "You have started %(threads)s thread."
-msgid_plural "You have started %(threads)s threads."
-msgstr[0] "You have started %(threads)s thread."
-msgstr[1] "You have started %(threads)s threads."
-
-#: static/misago/js/misago.js:1
-msgid "%(username)s has started %(threads)s thread."
-msgid_plural "%(username)s has started %(threads)s threads."
-msgstr[0] "%(username)s has started %(threads)s thread."
-msgstr[1] "%(username)s has started %(threads)s threads."
-
-#: static/misago/js/misago.js:1
-msgid "Loading..."
-msgstr "Loading..."
-
-#: static/misago/js/misago.js:1
-msgid "Threads"
-msgstr "Threads"
-
-#: static/misago/js/misago.js:1
 msgid "You have posted no messages."
 msgstr "You have posted no messages."
 
@@ -1574,10 +1542,38 @@ msgstr[0] "%(username)s has posted %(posts)s message."
 msgstr[1] "%(username)s has posted %(posts)s messages."
 
 #: static/misago/js/misago.js:1
+msgid "Loading..."
+msgstr "Loading..."
+
+#: static/misago/js/misago.js:1
 msgid "Posts"
 msgstr "Posts"
 
 #: static/misago/js/misago.js:1
+msgid "You have no started threads."
+msgstr "You have no started threads."
+
+#: static/misago/js/misago.js:1
+msgid "%(username)s started no threads."
+msgstr "%(username)s started no threads."
+
+#: static/misago/js/misago.js:1
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
+msgstr[0] "You have started %(threads)s thread."
+msgstr[1] "You have started %(threads)s threads."
+
+#: static/misago/js/misago.js:1
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
+msgstr[0] "%(username)s has started %(threads)s thread."
+msgstr[1] "%(username)s has started %(threads)s threads."
+
+#: static/misago/js/misago.js:1
+msgid "Threads"
+msgstr "Threads"
+
+#: static/misago/js/misago.js:1
 msgid "Show older activity"
 msgstr "Show older activity"
 
@@ -2057,11 +2053,9 @@ msgstr "last reply by %(user)s %(date)s"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you want to merge selected posts? This action is not "
-"reversible!"
+"Are you sure you want to merge selected posts? This action is not reversible!"
 msgstr ""
-"Are you sure you want to merge selected posts? This action is not "
-"reversible!"
+"Are you sure you want to merge selected posts? This action is not reversible!"
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -2407,11 +2401,11 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You need permission to start threads in category to be able to merge threads"
-" to it."
+"You need permission to start threads in category to be able to merge threads "
+"to it."
 msgstr ""
-"You need permission to start threads in category to be able to merge threads"
-" to it."
+"You need permission to start threads in category to be able to merge threads "
+"to it."
 
 #: static/misago/js/misago.js:1
 msgid "Selected threads were moved."
@@ -2672,18 +2666,22 @@ msgid "You are banned"
 msgstr "You are banned"
 
 #: static/misago/js/misago.js:1
-msgid "You have to accept the terms of service."
-msgstr "You have to accept the terms of service."
+msgid "Valid password must be at least %(limit_value)s character long."
+msgid_plural "Valid password must be at least %(limit_value)s characters long."
+msgstr[0] "Valid password must be at least %(limit_value)s character long."
+msgstr[1] "Valid password must be at least %(limit_value)s characters long."
 
 #: static/misago/js/misago.js:1
 msgid "You have to accept the privacy policy."
 msgstr "You have to accept the privacy policy."
 
 #: static/misago/js/misago.js:1
-msgid "Username must be at least %(limit_value)s character long."
-msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] "Username must be at least %(limit_value)s character long."
-msgstr[1] "Username must be at least %(limit_value)s characters long."
+msgid "You have to accept the terms of service."
+msgstr "You have to accept the terms of service."
+
+#: static/misago/js/misago.js:1
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr "Username can only contain latin alphabet letters and digits."
 
 #: static/misago/js/misago.js:1
 msgid "Username cannot be longer than %(limit_value)s character."
@@ -2692,15 +2690,10 @@ msgstr[0] "Username cannot be longer than %(limit_value)s character."
 msgstr[1] "Username cannot be longer than %(limit_value)s characters."
 
 #: static/misago/js/misago.js:1
-msgid "Username can only contain latin alphabet letters and digits."
-msgstr "Username can only contain latin alphabet letters and digits."
-
-#: static/misago/js/misago.js:1
-msgid "Valid password must be at least %(limit_value)s character long."
-msgid_plural ""
-"Valid password must be at least %(limit_value)s characters long."
-msgstr[0] "Valid password must be at least %(limit_value)s character long."
-msgstr[1] "Valid password must be at least %(limit_value)s characters long."
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
+msgstr[0] "Username must be at least %(limit_value)s character long."
+msgstr[1] "Username must be at least %(limit_value)s characters long."
 
 #: static/misago/js/misago.js:1
 msgid "This field is required."

BIN
misago/locale/es/LC_MESSAGES/django.mo


+ 193 - 308
misago/locale/es/LC_MESSAGES/django.po

@@ -2,26 +2,26 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # Javier Lorenzo <javichio@gmail.com>, 2017
 # Carlos López <carlos@vocalaze.com>, 2017
 # Rafał Pitoń <kontakt@rpiton.com>, 2017
 # Paulo Abraham <cnnick.ex@gmail.com>, 2019
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-13 18:22+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Paulo Abraham <cnnick.ex@gmail.com>, 2019\n"
 "Language-Team: Spanish (https://www.transifex.com/misago/teams/65369/es/)\n"
+"Language: es\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: es\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #: acl/admin/__init__.py:24 templates/misago/acl_debug.html:16
@@ -220,7 +220,7 @@ msgstr ""
 "Solo los miembros con permisos válidos pueden publicar en categorías "
 "cerradas."
 
-#: categories/admin/forms.py:70 conf/admin/__init__.py:93
+#: categories/admin/forms.py:70 conf/admin/__init__.py:79
 #: templates/misago/admin/categories/list.html:19
 #: templates/misago/admin/dashboard/totals.html:19
 #: templates/misago/navbar.html:20 templates/misago/navbar.html:36
@@ -234,7 +234,7 @@ msgstr ""
 #: templates/misago/threadslist/threads.html:42
 #: templates/misago/threadslist/threads.html:66
 #: threads/permissions/threads.py:73 threads/permissions/threads.py:104
-#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:106
+#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:97
 msgid "Threads"
 msgstr "Hilos"
 
@@ -272,8 +272,8 @@ msgstr "Edad del hilo"
 
 #: categories/admin/forms.py:95
 msgid ""
-"Prune thread if number of days since its creation is greater than specified."
-" Enter 0 to disable this pruning criteria."
+"Prune thread if number of days since its creation is greater than specified. "
+"Enter 0 to disable this pruning criteria."
 msgstr ""
 "Limpiar el hilo si el número de días desde su creación es mayor al "
 "especificado. Ingrese 0 para deshabilitar este criterio de limpieza."
@@ -324,8 +324,7 @@ msgstr "Archivo"
 
 #: categories/admin/forms.py:173
 msgid ""
-"Instead of being deleted, pruned threads can be moved to designated "
-"category."
+"Instead of being deleted, pruned threads can be moved to designated category."
 msgstr ""
 "En lugar de eliminarse, los hilos recortados se pueden mover a la categoría "
 "designada."
@@ -359,8 +358,7 @@ msgid "Move child categories to"
 msgstr "Mueve las categorías secundarias a"
 
 #: categories/admin/forms.py:249 categories/admin/forms.py:264
-#: templates/misago/acl_debug.html:15
-#: templates/misago/admin/roles/list.html:16
+#: templates/misago/acl_debug.html:15 templates/misago/admin/roles/list.html:16
 msgid "Role"
 msgstr "Rol"
 
@@ -470,22 +468,22 @@ msgstr "Puedes ver los contenidos de la categoría"
 msgid "You don't have permission to browse \"%(category)s\" contents."
 msgstr "No tienes permiso para explorar \"%(category)s\" contenidos."
 
-#: conf/admin/__init__.py:45 templates/misago/admin/conf/index.html:5
+#: conf/admin/__init__.py:41 templates/misago/admin/conf/index.html:5
 #: templates/misago/admin/themes/form.html:48
 msgid "Settings"
 msgstr "Ajustes"
 
-#: conf/admin/__init__.py:52 templates/misago/admin/socialauth/form.html:27
+#: conf/admin/__init__.py:48 templates/misago/admin/socialauth/form.html:27
 msgid "General"
 msgstr "General"
 
-#: conf/admin/__init__.py:53
+#: conf/admin/__init__.py:49
 msgid "Change forum details like name, description or footer."
 msgstr ""
 "Cambiar los detalles del foro como lo es el nombre, la descripción o pie de "
 "página."
 
-#: conf/admin/__init__.py:58 templates/misago/admin/dashboard/totals.html:7
+#: conf/admin/__init__.py:54 templates/misago/admin/dashboard/totals.html:7
 #: templates/misago/admin/users/ban.html:22 templates/misago/navbar.html:42
 #: templates/misago/userslists/base.html:5
 #: templates/misago/userslists/base.html:14 users/admin/__init__.py:74
@@ -493,38 +491,28 @@ msgstr ""
 msgid "Users"
 msgstr "Usuarios"
 
-#: conf/admin/__init__.py:60
+#: conf/admin/__init__.py:56
 msgid "Customize user accounts default behavior and features availability."
 msgstr ""
 
-#: conf/admin/__init__.py:67
+#: conf/admin/__init__.py:63
 msgid "Captcha"
 msgstr "CAPTCHA"
 
-#: conf/admin/__init__.py:69
+#: conf/admin/__init__.py:65
 msgid "Setup protection against automatic registrations on the site."
 msgstr ""
 
-#: conf/admin/__init__.py:76
-msgid "Single Sign-On"
-msgstr ""
-
-#: conf/admin/__init__.py:78
-msgid ""
-"SSO enables you to delegate user login and registration from Misago tothe "
-"third party site."
-msgstr ""
-
-#: conf/admin/__init__.py:86 templates/misago/admin/dashboard/analytics.html:7
+#: conf/admin/__init__.py:72 templates/misago/admin/dashboard/analytics.html:7
 #: templates/misago/admin/dashboard/index.html:40
 msgid "Analytics"
 msgstr ""
 
-#: conf/admin/__init__.py:87
+#: conf/admin/__init__.py:73
 msgid "Enable Google Analytics or setup Google Site Verification."
 msgstr ""
 
-#: conf/admin/__init__.py:94
+#: conf/admin/__init__.py:80
 msgid "Threads, posts, polls and attachments options."
 msgstr ""
 
@@ -544,8 +532,8 @@ msgstr ""
 
 #: conf/admin/forms/analytics.py:27
 msgid ""
-"This token was extracted from uploaded site verification file. To change it,"
-" upload new verification file."
+"This token was extracted from uploaded site verification file. To change it, "
+"upload new verification file."
 msgstr ""
 
 #: conf/admin/forms/analytics.py:34
@@ -763,39 +751,6 @@ msgid ""
 "Address under which site is running appears to be \"%(address)s\"."
 msgstr ""
 
-#: conf/admin/forms/sso.py:13
-msgid "Enable Single Sign-On"
-msgstr ""
-
-#: conf/admin/forms/sso.py:15
-msgid ""
-"Enabling SSO will make login option redirect users to the server URL "
-"configured below. It will also disable option to register on forum, change "
-"username, email or passward, as those features will be delegated to the 3rd "
-"party site."
-msgstr ""
-
-#: conf/admin/forms/sso.py:22
-msgid "Public key"
-msgstr ""
-
-#: conf/admin/forms/sso.py:24 conf/admin/forms/sso.py:32
-msgid ""
-"Leave this field empty for Misago to generate this key on form submission."
-msgstr ""
-
-#: conf/admin/forms/sso.py:30
-msgid "Private key"
-msgstr "Llave pública"
-
-#: conf/admin/forms/sso.py:37
-msgid "Server URL"
-msgstr "URL del servidor"
-
-#: conf/admin/forms/sso.py:50
-msgid "You need to enter server URL to enable SSO."
-msgstr "Necesitas ingresar el URL del servidor para habilitar SSO."
-
 #: conf/admin/forms/threads.py:27
 msgid "Daily post limit per user"
 msgstr ""
@@ -854,10 +809,10 @@ msgstr ""
 
 #: conf/admin/forms/threads.py:71
 msgid ""
-"Controls amount of data used by read-tracking system. All content older than"
-" number of days specified in this setting is considered old and read, even "
-"if the opposite is true for the user. Active forums can try lowering this "
-"value while less active ones may wish to increase it instead. "
+"Controls amount of data used by read-tracking system. All content older than "
+"number of days specified in this setting is considered old and read, even if "
+"the opposite is true for the user. Active forums can try lowering this value "
+"while less active ones may wish to increase it instead. "
 msgstr ""
 
 #: conf/admin/forms/threads.py:80
@@ -937,8 +892,8 @@ msgstr ""
 
 #: conf/admin/forms/users.py:48
 msgid ""
-"Delete new inactive accounts if they weren't activated within this number of"
-" days"
+"Delete new inactive accounts if they weren't activated within this number of "
+"days"
 msgstr ""
 
 #: conf/admin/forms/users.py:51
@@ -995,8 +950,8 @@ msgstr "Fallback para gravatar predeterminado"
 
 #: conf/admin/forms/users.py:86
 msgid ""
-"Select which avatar to use when user has no gravatar associated with their "
-"e-mail address."
+"Select which avatar to use when user has no gravatar associated with their e-"
+"mail address."
 msgstr ""
 
 #: conf/admin/forms/users.py:96
@@ -1108,44 +1063,44 @@ msgstr ""
 msgid "This value must be lower than number of users per page."
 msgstr ""
 
-#: conf/admin/views.py:40
+#: conf/admin/views.py:39
 msgid "Settings have been saved."
 msgstr ""
 
-#: core/errorpages.py:42
+#: core/errorpages.py:51
 msgid "Permission denied."
 msgstr "Permiso denegado."
 
-#: core/errorpages.py:71
+#: core/errorpages.py:80
 msgid ""
 "A problem was encountered when disconnecting your account from the remote "
 "site."
 msgstr ""
 
-#: core/errorpages.py:75
+#: core/errorpages.py:84
 msgid ""
 "You are not allowed to disconnect your account from the other site, because "
 "currently it's the only way to sign in to your account."
 msgstr ""
 
-#: core/errorpages.py:80
+#: core/errorpages.py:89
 #, python-format
 msgid "A problem was encountered when signing you in using %(backend)s."
 msgstr ""
 
-#: core/errorpages.py:84
+#: core/errorpages.py:93
 msgid "The sign in process has been canceled by user."
 msgstr ""
 
-#: core/errorpages.py:86
+#: core/errorpages.py:95
 msgid "The other service could not be reached."
 msgstr ""
 
-#: core/errorpages.py:92
+#: core/errorpages.py:101
 msgid "Unexpected problem has been encountered during sign in process."
 msgstr ""
 
-#: core/errorpages.py:113
+#: core/errorpages.py:122
 msgid ""
 "Your request was rejected because your browser didn't send the CSRF cookie, "
 "or the cookie sent was invalid."
@@ -1192,8 +1147,8 @@ msgstr ""
 #: templates/misago/admin/dashboard/checks.html:17
 #: templates/misago/admin/dashboard/index.html:33
 msgid ""
-"Version check feature relies on the API operated by the Python Package Index"
-" (pypi.org) API to retrieve latest Misago release version."
+"Version check feature relies on the API operated by the Python Package Index "
+"(pypi.org) API to retrieve latest Misago release version."
 msgstr ""
 
 #: graphql/admin/versioncheck.py:70
@@ -1520,11 +1475,11 @@ msgstr "Buscar"
 msgid "Can search site"
 msgstr "Puede buscar sitio"
 
-#: socialauth/admin/__init__.py:42
+#: socialauth/admin/__init__.py:40
 msgid "Social login"
 msgstr ""
 
-#: socialauth/admin/__init__.py:44
+#: socialauth/admin/__init__.py:42
 msgid "Enable users to sign on and login using their social profile."
 msgstr ""
 
@@ -1547,9 +1502,9 @@ msgstr ""
 #: socialauth/admin/forms/base.py:39
 msgid ""
 "Enabling this option will result in the user being signed in if their forum "
-"account was registered using same e-mail address as used on the social site."
-" Otherwise they will be asked to specify a different e-mail to continue sign"
-" in using social site."
+"account was registered using same e-mail address as used on the social site. "
+"Otherwise they will be asked to specify a different e-mail to continue sign "
+"in using social site."
 msgstr ""
 
 #: socialauth/admin/forms/base.py:51 socialauth/admin/forms/base.py:53
@@ -1608,8 +1563,8 @@ msgstr ""
 #: socialauth/pipeline.py:88
 #, python-format
 msgid ""
-"The e-mail address associated with your %(backend)s account is not available"
-" for use on this site."
+"The e-mail address associated with your %(backend)s account is not available "
+"for use on this site."
 msgstr ""
 
 #: socialauth/pipeline.py:98
@@ -1623,18 +1578,6 @@ msgstr ""
 msgid "Please try resubmitting the form."
 msgstr "Intenta volver a enviar el formulario."
 
-#: socialauth/views.py:23
-msgid "Please use the 3rd party site to login."
-msgstr ""
-
-#: sso/validators.py:24 users/forms/register.py:34 users/validators.py:80
-msgid "This username is not allowed."
-msgstr "Este nombre de usuario no está permitido."
-
-#: sso/validators.py:33 users/forms/register.py:45 users/validators.py:52
-msgid "This e-mail address is not allowed."
-msgstr "Esta dirección de correo electrónico no está permitida."
-
 #: templates/misago/acl_debug.html:5
 #, python-format
 msgid ""
@@ -1686,8 +1629,8 @@ msgstr "Solicitud de enlace de activación"
 
 #: templates/misago/activation/request.html:25
 msgid ""
-"The site administrator may impose a requirement on newly registered accounts"
-" to be activated before users will be able to sign in."
+"The site administrator may impose a requirement on newly registered accounts "
+"to be activated before users will be able to sign in."
 msgstr ""
 
 #: templates/misago/activation/request.html:28
@@ -2058,7 +2001,7 @@ msgstr "Categoría"
 #: templates/misago/admin/dashboard/totals.html:31
 #: templates/misago/admin/users/list.html:21
 #: templates/misago/profile/posts.html:5 templates/misago/profile/posts.html:8
-#: templates/misago/profile/posts.html:9 users/apps.py:102
+#: templates/misago/profile/posts.html:9 users/apps.py:93
 msgid "Posts"
 msgstr "Mensajes"
 
@@ -2202,56 +2145,45 @@ msgstr ""
 msgid "Attachment error images"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:9
-#: templates/misago/admin/socialauth/list.html:97
-msgid "Note"
-msgstr ""
-
-#: templates/misago/admin/conf/users_settings.html:9
-msgid ""
-"Single Sign-On is enabled. Site's registration, password and deletion "
-"features have been disabled and delegated to the third-party site."
-msgstr ""
-
-#: templates/misago/admin/conf/users_settings.html:14
+#: templates/misago/admin/conf/users_settings.html:8
 msgid "New accounts"
 msgstr "Nuevas cuentas"
 
-#: templates/misago/admin/conf/users_settings.html:23 users/admin/forms.py:484
+#: templates/misago/admin/conf/users_settings.html:17 users/admin/forms.py:484
 #: users/admin/forms.py:573
 msgid "Usernames"
 msgstr "Nombres de Usuario"
 
-#: templates/misago/admin/conf/users_settings.html:33
+#: templates/misago/admin/conf/users_settings.html:27
 msgid "Avatars"
 msgstr "Avatares"
 
-#: templates/misago/admin/conf/users_settings.html:49
+#: templates/misago/admin/conf/users_settings.html:43
 msgid "Signatures"
 msgstr "Firmas"
 
-#: templates/misago/admin/conf/users_settings.html:57
+#: templates/misago/admin/conf/users_settings.html:51
 #: users/admin/__init__.py:80
 msgid "Data downloads"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:66
+#: templates/misago/admin/conf/users_settings.html:60
 msgid "Own account deletion"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:74 users/admin/forms.py:492
+#: templates/misago/admin/conf/users_settings.html:68 users/admin/forms.py:492
 msgid "IP addresses"
 msgstr "Dirección(es) IP "
 
-#: templates/misago/admin/conf/users_settings.html:82
+#: templates/misago/admin/conf/users_settings.html:76
 msgid "Default subscription preferences"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:91
+#: templates/misago/admin/conf/users_settings.html:85
 msgid "Users lists"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:100
+#: templates/misago/admin/conf/users_settings.html:94
 msgid "Top posters ranking"
 msgstr ""
 
@@ -2374,9 +2306,8 @@ msgstr ""
 msgid "Site analytics are currently unavailable due to an error."
 msgstr ""
 
-#: templates/misago/admin/dashboard/totals.html:43
-#: threads/admin/__init__.py:38 threads/permissions/attachments.py:11
-#: threads/permissions/attachments.py:29
+#: templates/misago/admin/dashboard/totals.html:43 threads/admin/__init__.py:36
+#: threads/permissions/attachments.py:11 threads/permissions/attachments.py:29
 msgid "Attachments"
 msgstr "Adjuntos"
 
@@ -2495,20 +2426,20 @@ msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:12
 msgid ""
-"The form was sent after being opened in the browser for a long time (eg. few"
-" days) and cookie token has expired."
+"The form was sent after being opened in the browser for a long time (eg. few "
+"days) and cookie token has expired."
 msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:15
 msgid ""
-"The site is configured to use the HTTPS, but this form was sent over the the"
-" HTTP."
+"The site is configured to use the HTTPS, but this form was sent over the the "
+"HTTP."
 msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:16
 msgid ""
-"If you are an owner of this site, please check if the HTTPS certificate used"
-" by the site is valid and accepted by the browser."
+"If you are an owner of this site, please check if the HTTPS certificate used "
+"by the site is valid and accepted by the browser."
 msgstr ""
 
 #: templates/misago/admin/generic/filter_form.html:7
@@ -2765,8 +2696,7 @@ msgstr "Pantalla y visibilidad"
 #: templates/misago/admin/ranks/list.html:17
 #: templates/misago/admin/users/list.html:19
 #: templates/misago/userslists/active_posters.html:112
-#: templates/misago/userslists/active_posters.html:123
-#: users/admin/forms.py:238
+#: templates/misago/userslists/active_posters.html:123 users/admin/forms.py:238
 msgid "Rank"
 msgstr "Rango"
 
@@ -2831,7 +2761,7 @@ msgid "Enabled login methods"
 msgstr ""
 
 #: templates/misago/admin/socialauth/list.html:15
-#: templates/misago/admin/socialauth/list.html:112
+#: templates/misago/admin/socialauth/list.html:106
 msgid "Provider"
 msgstr ""
 
@@ -2847,25 +2777,19 @@ msgstr ""
 msgid "Are you sure you want to disable this social login provider?"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:97
-msgid ""
-"Single Sign-On is enabled. Social authentication has been disabled and "
-"delegated to the third-party site."
-msgstr ""
-
-#: templates/misago/admin/socialauth/list.html:106
+#: templates/misago/admin/socialauth/list.html:100
 msgid "Setup new login method"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:125
+#: templates/misago/admin/socialauth/list.html:119
 msgid "Setup login with this provider"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:126
+#: templates/misago/admin/socialauth/list.html:120
 msgid "Setup"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:133
+#: templates/misago/admin/socialauth/list.html:127
 msgid "No new login providers are available for setup at this time."
 msgstr ""
 
@@ -3164,7 +3088,7 @@ msgstr ""
 msgid "Signature"
 msgstr "Firma"
 
-#: templates/misago/admin/users/edit.html:228 users/apps.py:27
+#: templates/misago/admin/users/edit.html:228 users/apps.py:24
 msgid "Forum options"
 msgstr "Opciones de foro"
 
@@ -3184,8 +3108,7 @@ msgstr ""
 
 #: templates/misago/admin/users/edit.html:251
 msgid ""
-"No additional action is required. This account will be deleted "
-"automatically."
+"No additional action is required. This account will be deleted automatically."
 msgstr ""
 
 #: templates/misago/admin/users/edit.html:294
@@ -3376,8 +3299,8 @@ msgstr "¡Activa mi cuenta!"
 #: templates/misago/emails/change_email.txt:6
 #, python-format
 msgid ""
-"%(user)s, you are receiving this message because you have changed your "
-"e-mail address."
+"%(user)s, you are receiving this message because you have changed your e-"
+"mail address."
 msgstr ""
 "%(user)s, estás recibiendo este mensaje porque has cambiado tu cuenta de "
 "correo."
@@ -3405,8 +3328,8 @@ msgid ""
 "%(user)s, you are receiving this message because you want to change "
 "forgotten password for your forum account."
 msgstr ""
-"%(user)s, estás recibiendo este mensaje porque quieres cambiar tu contraseña"
-" olvidada."
+"%(user)s, estás recibiendo este mensaje porque quieres cambiar tu contraseña "
+"olvidada."
 
 #: templates/misago/emails/change_password_form_link.html:11
 #: templates/misago/emails/change_password_form_link.txt:10
@@ -3429,7 +3352,7 @@ msgid ""
 "download."
 msgstr ""
 
-#: templates/misago/emails/data_download.html:11 users/apps.py:57
+#: templates/misago/emails/data_download.html:11 users/apps.py:52
 msgid "Download data"
 msgstr ""
 
@@ -3508,8 +3431,8 @@ msgstr "Antes de que puedas entrar al foro un admin debe activar tu cuenta"
 #: templates/misago/emails/register/inactive.html:12
 #: templates/misago/emails/register/inactive.txt:15
 msgid ""
-"This may take a while, but you will receive e-mail with notification once it"
-" happens."
+"This may take a while, but you will receive e-mail with notification once it "
+"happens."
 msgstr "Esto tardará unos minutos, recibirás un email cuando esté listo"
 
 #: templates/misago/emails/register/inactive.html:17
@@ -3715,13 +3638,13 @@ msgstr ""
 
 #: templates/misago/forgottenpassword/request.html:39
 msgid ""
-"Instead, you can change your password using special secure form that will be"
-" available by special link valid only for your browser, for seven days or "
+"Instead, you can change your password using special secure form that will be "
+"available by special link valid only for your browser, for seven days or "
 "until your password is changed."
 msgstr ""
 "En cambio, puedes cambiar tu contraseña mediante un formulario seguro "
-"especial que estará disponible mediante un enlace mágico válido sólo para tu"
-" navegador, durante siete días o hasta que se cambie tu contraseña."
+"especial que estará disponible mediante un enlace mágico válido sólo para tu "
+"navegador, durante siete días o hasta que se cambie tu contraseña."
 
 #: templates/misago/forgottenpassword/request.html:42
 msgid ""
@@ -3849,7 +3772,7 @@ msgstr "Ver resultados"
 #: templates/misago/profile/ban_details.html:5
 #: templates/misago/profile/ban_details.html:8
 #: templates/misago/profile/ban_details.html:9
-#: templates/misago/profile/ban_details.html:16 users/apps.py:137
+#: templates/misago/profile/ban_details.html:16 users/apps.py:128
 msgid "Ban details"
 msgstr "Detalles del baneo"
 
@@ -3898,7 +3821,7 @@ msgstr[1] "Empezó %(threads)s hilos."
 #: templates/misago/profile/details.html:5
 #: templates/misago/profile/details.html:8
 #: templates/misago/profile/details.html:9
-#: templates/misago/profile/details.html:19 users/apps.py:124
+#: templates/misago/profile/details.html:19 users/apps.py:115
 msgid "Details"
 msgstr "Detalles"
 
@@ -3929,7 +3852,7 @@ msgstr ""
 
 #: templates/misago/profile/followers.html:5
 #: templates/misago/profile/followers.html:8
-#: templates/misago/profile/followers.html:9 users/apps.py:112
+#: templates/misago/profile/followers.html:9 users/apps.py:103
 msgid "Followers"
 msgstr "Seguidores"
 
@@ -3958,7 +3881,7 @@ msgstr "%(username)s no tiene seguidores."
 
 #: templates/misago/profile/follows.html:5
 #: templates/misago/profile/follows.html:8
-#: templates/misago/profile/follows.html:9 users/apps.py:118
+#: templates/misago/profile/follows.html:9 users/apps.py:109
 msgid "Follows"
 msgstr "Seguidos"
 
@@ -4046,7 +3969,7 @@ msgstr "%(username)s no ha iniciado ningún hilo."
 
 #: templates/misago/profile/username_history.html:5
 #: templates/misago/profile/username_history.html:8
-#: templates/misago/profile/username_history.html:9 users/apps.py:130
+#: templates/misago/profile/username_history.html:9 users/apps.py:121
 msgid "Username history"
 msgstr "Historial de nombres de usuario"
 
@@ -4230,8 +4153,8 @@ msgstr ""
 
 #: templates/misago/thread/posts/post/flags.html:29
 msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
 "El mensaje no ha sido aprobado. Sólo los usuarios con permisos pueden "
 "aprobar mensajes y sólo su autor puede ver su contenido."
@@ -4425,7 +4348,7 @@ msgstr "Encuesta"
 
 #: templates/misago/userslists/active_posters.html:5
 #: templates/misago/userslists/active_posters.html:23
-#: templates/misago/userslists/active_posters.html:24 users/apps.py:81
+#: templates/misago/userslists/active_posters.html:24 users/apps.py:72
 msgid "Top posters"
 msgstr ""
 
@@ -4734,11 +4657,11 @@ msgstr ""
 msgid "Default Misago Theme"
 msgstr ""
 
-#: threads/admin/__init__.py:45
+#: threads/admin/__init__.py:43
 msgid "Attachment types"
 msgstr "tipos de archivos adjuntos"
 
-#: threads/admin/__init__.py:46
+#: threads/admin/__init__.py:44
 msgid "Specify what files may be uploaded on the forum."
 msgstr ""
 
@@ -4788,8 +4711,7 @@ msgstr "Limita las descargas a"
 
 #: threads/admin/forms.py:64
 msgid ""
-"List of comma separated file extensions associated with this attachment "
-"type."
+"List of comma separated file extensions associated with this attachment type."
 msgstr ""
 "Lista de extensiones de archivo separadas por comas asociadas con este tipo "
 "de archivo adjunto."
@@ -4821,9 +4743,9 @@ msgid ""
 "to allow all users with permission to upload attachments to be able to "
 "upload attachments of this type."
 msgstr ""
-"Si deseas limitar la opción para cargar archivos de este tipo a usuarios con"
-" roles específicos, selecciónalos en esta lista. De otro modo no selecciones"
-" ningún rol para permitir que todos los usuarios con permiso para cargar "
+"Si deseas limitar la opción para cargar archivos de este tipo a usuarios con "
+"roles específicos, selecciónalos en esta lista. De otro modo no selecciones "
+"ningún rol para permitir que todos los usuarios con permiso para cargar "
 "archivos adjuntos puedan cargar archivos adjuntos de este tipo."
 
 #: threads/admin/forms.py:83
@@ -4835,9 +4757,8 @@ msgid ""
 msgstr ""
 "Si deseas limitar la opción para descargar archivos de este tipo a usuarios "
 "con roles específicos, selecciónalos en esta lista. De otro modo no "
-"selecciones ningún rol para permitir que todos los usuarios con permiso para"
-" descargar archivos adjuntos puedan descargar archivos adjuntos de este "
-"tipo."
+"selecciones ningún rol para permitir que todos los usuarios con permiso para "
+"descargar archivos adjuntos puedan descargar archivos adjuntos de este tipo."
 
 #: threads/admin/views/attachments.py:14
 msgid "Requested attachment could not be found."
@@ -4903,8 +4824,7 @@ msgstr "El tipo de adjunto \"%(name)s\" ha sido editado."
 #: threads/admin/views/attachmenttypes.py:47
 #, python-format
 msgid ""
-"Attachment type \"%(name)s\" has associated attachments and can't be "
-"deleted."
+"Attachment type \"%(name)s\" has associated attachments and can't be deleted."
 msgstr ""
 "El tipo de adjunto \"%(name)s\" tiene archivos adjuntos asociados y no se "
 "puede eliminar."
@@ -4935,8 +4855,7 @@ msgstr "No puedes subir archivos de este tipo."
 msgid ""
 "You can't upload files larger than %(limit)s (your file has %(upload)s)."
 msgstr ""
-"No puede cargar archivos mayores que %(limit)s (su archivo tiene "
-"%(upload)s)."
+"No puede cargar archivos mayores que %(limit)s (su archivo tiene %(upload)s)."
 
 #: threads/api/attachments.py:104
 #, python-format
@@ -5128,8 +5047,7 @@ msgstr ""
 
 #: threads/api/threadendpoints/patch.py:273
 msgid ""
-"This post can't be unmarked because it's not currently marked as best "
-"answer."
+"This post can't be unmarked because it's not currently marked as best answer."
 msgstr ""
 
 #: threads/api/threadendpoints/patch.py:301
@@ -5237,7 +5155,8 @@ msgstr "No puedes borrar la publicación original sin eliminar la secuencia."
 
 #: threads/participants.py:142
 #, python-format
-msgid "%(user)s has invited you to participate in private thread \"%(thread)s\""
+msgid ""
+"%(user)s has invited you to participate in private thread \"%(thread)s\""
 msgstr "%(user)s te ha invitado a participar en el hilo privado \"%(thread)s\""
 
 #: threads/permissions/attachments.py:14
@@ -5329,8 +5248,8 @@ msgstr ""
 #: threads/permissions/bestanswers.py:188
 #, python-format
 msgid ""
-"You don't have permission to change this thread's marked answer because it's"
-" in the \"%(category)s\" category."
+"You don't have permission to change this thread's marked answer because it's "
+"in the \"%(category)s\" category."
 msgstr ""
 
 #: threads/permissions/bestanswers.py:198
@@ -5393,8 +5312,8 @@ msgstr ""
 
 #: threads/permissions/bestanswers.py:274
 msgid ""
-"You can't unmark this thread's best answer because it's closed and you don't"
-" have permission to open it."
+"You can't unmark this thread's best answer because it's closed and you don't "
+"have permission to open it."
 msgstr ""
 
 #: threads/permissions/bestanswers.py:282
@@ -5611,8 +5530,8 @@ msgstr "Puede informar hilos privados"
 
 #: threads/permissions/privatethreads.py:52
 msgid ""
-"Allows user to report private threads they are participating in, making them"
-" accessible to moderators."
+"Allows user to report private threads they are participating in, making them "
+"accessible to moderators."
 msgstr ""
 "Permite al usuario informar hilos privados en los que participan, "
 "haciéndolos accesibles a los moderadores."
@@ -5669,8 +5588,8 @@ msgstr ""
 #: threads/permissions/privatethreads.py:258
 msgid "You have to be thread owner to remove participants from it."
 msgstr ""
-"Tienes que ser el propietario de la secuencia para eliminar participantes de"
-" ella."
+"Tienes que ser el propietario de la secuencia para eliminar participantes de "
+"ella."
 
 #: threads/permissions/privatethreads.py:270
 #, python-format
@@ -5690,8 +5609,7 @@ msgstr "%(user)s no permite invitaciones a hilos privados."
 #: threads/permissions/privatethreads.py:288
 #, python-format
 msgid "%(user)s limits invitations to private threads to followed users."
-msgstr ""
-"%(user)s limita las invitaciones a hilos privados a usuarios seguidos."
+msgstr "%(user)s limita las invitaciones a hilos privados a usuarios seguidos."
 
 #: threads/permissions/threads.py:76
 msgid "Can see unapproved content list"
@@ -5701,8 +5619,8 @@ msgstr "Puede ver la lista de contenido no aprobado"
 msgid ""
 "Allows access to \"unapproved\" tab on threads lists for easy listing of "
 "threads that are unapproved or contain unapproved posts. Despite the tab "
-"being available on all threads lists, it will only display threads belonging"
-" to categories in which the user has permission to approve content."
+"being available on all threads lists, it will only display threads belonging "
+"to categories in which the user has permission to approve content."
 msgstr ""
 "Permite el acceso a la pestaña \"no aprobada \" en las listas de hilos para "
 "una fácil inclusión de los hilos que no están aprobados o que contienen "
@@ -6537,8 +6455,7 @@ msgstr "No puede crear nuevos hilos en la categoría seleccionada."
 
 #: threads/serializers/moderation.py:319
 msgid "You don't have permission to pin threads globally in this category."
-msgstr ""
-"No tienes permiso para fijar hilos de manera global en esta categoría."
+msgstr "No tienes permiso para fijar hilos de manera global en esta categoría."
 
 #: threads/serializers/moderation.py:325
 msgid "You don't have permission to pin threads in this category."
@@ -6716,8 +6633,8 @@ msgid_plural ""
 "Thread title should be at least %(limit_value)s characters long (it has "
 "%(show_value)s)."
 msgstr[0] ""
-"El título del hilo debe ser de al menos %(limit_value)s caracter de longitud"
-" (es de %(show_value)s)."
+"El título del hilo debe ser de al menos %(limit_value)s caracter de longitud "
+"(es de %(show_value)s)."
 msgstr[1] ""
 "El título del hilo debe ser de al menos %(limit_value)s caracteres de "
 "longitud (es de %(show_value)s)."
@@ -6764,8 +6681,8 @@ msgstr[0] ""
 "El mensaje a publicar no debe ser mayor de %(limit_value)s caracter (es de "
 "%(show_value)s)."
 msgstr[1] ""
-"El mensaje a publicar no debe ser mayor de %(limit_value)s caracteres (es de"
-" %(show_value)s)."
+"El mensaje a publicar no debe ser mayor de %(limit_value)s caracteres (es de "
+"%(show_value)s)."
 
 #: threads/viewmodels/threads.py:23
 msgid "Your threads"
@@ -6867,8 +6784,8 @@ msgstr "Es administrador"
 #: users/admin/forms.py:78
 msgid ""
 "Designates whether the user can log into admin sites. If Django admin site "
-"is enabled, this user will need additional permissions assigned within it to"
-" admin Django modules."
+"is enabled, this user will need additional permissions assigned within it to "
+"admin Django modules."
 msgstr ""
 "Designa si el usuario puede iniciar sesión en sitios de administración. Si "
 "el sitio de administración de Django está habilitado, este usuario "
@@ -6946,8 +6863,8 @@ msgid ""
 "Optional message for forum team members explaining why user is banned form "
 "changing avatar."
 msgstr ""
-"Mensaje opcional para los miembros del equipo del foro explicando por qué el"
-" usuario está prohibido para cambiar el avatar."
+"Mensaje opcional para los miembros del equipo del foro explicando por qué el "
+"usuario está prohibido para cambiar el avatar."
 
 #: users/admin/forms.py:138
 msgid "Signature contents"
@@ -7043,8 +6960,8 @@ msgid ""
 "Short and descriptive name of all users with this rank. \"The Team\" or "
 "\"Game Masters\" are good examples."
 msgstr ""
-"Nombre breve y descriptivo de todos los usuarios con este rango. \"The "
-"Team\" o \"Game Masters\" son buenos ejemplos."
+"Nombre breve y descriptivo de todos los usuarios con este rango. \"The Team"
+"\" o \"Game Masters\" son buenos ejemplos."
 
 #: users/admin/forms.py:394
 msgid "User title"
@@ -7052,8 +6969,8 @@ msgstr "Título del usuario"
 
 #: users/admin/forms.py:397
 msgid ""
-"Optional, singular version of rank name displayed by user names. For example"
-" \"GM\" or \"Dev\"."
+"Optional, singular version of rank name displayed by user names. For example "
+"\"GM\" or \"Dev\"."
 msgstr ""
 "Versión opcional y singular del nombre de rango mostrado por los nombres de "
 "usuario. Por ejemplo \"GM\" o \"Dev\"."
@@ -7089,9 +7006,9 @@ msgid ""
 "Selecting this option will make users with this rank easily discoverable by "
 "others through dedicated page on forum users list."
 msgstr ""
-"Seleccionar esta opción hará que los usuarios con este rango sean fácilmente"
-" detectables por otros a través de la página dedicada en la lista de "
-"usuarios del foro."
+"Seleccionar esta opción hará que los usuarios con este rango sean fácilmente "
+"detectables por otros a través de la página dedicada en la lista de usuarios "
+"del foro."
 
 #: users/admin/forms.py:447
 msgid "This name collides with other rank."
@@ -7172,8 +7089,8 @@ msgid ""
 msgstr ""
 "Este valor no distingue entre mayúsculas y minúsculas y acepta un asterisco "
 "(*) para las coincidencias más avanzadas. Por ejemplo, hacer que la IP "
-"prohíba el valor \"83. * \" Prohibirá todas las direcciones IP que comiencen"
-" con \"83. \"."
+"prohíba el valor \"83. * \" Prohibirá todas las direcciones IP que comiencen "
+"con \"83. \"."
 
 #: users/admin/forms.py:520
 msgid "Banned value can't be longer than 250 characters."
@@ -7210,8 +7127,8 @@ msgstr ""
 
 #: users/admin/forms.py:624
 msgid ""
-"Enter every item in new line. Duplicates will be ignored. This field is case"
-" insensitive. Depending on site configuration and amount of data to archive "
+"Enter every item in new line. Duplicates will be ignored. This field is case "
+"insensitive. Depending on site configuration and amount of data to archive "
 "it may take up to few days for requests to complete. E-mail will "
 "notification will be sent to every user once their download is ready."
 msgstr ""
@@ -7319,7 +7236,8 @@ msgstr "El rango \"%(name)s\" ha sido editado."
 #: users/admin/views/ranks.py:44
 #, python-format
 msgid "Rank \"%(name)s\" is default rank and can't be deleted."
-msgstr "El rango \"%(name)s\" es el rango predeterminado y no se puede eliminar."
+msgstr ""
+"El rango \"%(name)s\" es el rango predeterminado y no se puede eliminar."
 
 #: users/admin/views/ranks.py:47
 #, python-format
@@ -7450,26 +7368,21 @@ msgstr "Nuevo usuario \"%(user)s\" ha sido registrado."
 msgid "User \"%(user)s\" has been edited."
 msgstr "Usuario \"%(user)s\" ha sido editado."
 
-#: users/api/auth.py:42 users/api/auth.py:92 users/api/auth.py:130
-#: users/api/auth.py:174
-msgid "Please use the 3rd party site to authenticate."
-msgstr ""
-
-#: users/api/auth.py:100
+#: users/api/auth.py:94
 #, python-format
 msgid "Activate %(user)s account on %(forum_name)s forums"
 msgstr "Activa la cuenta %(user)s de %(forum_name)s"
 
-#: users/api/auth.py:138
+#: users/api/auth.py:129
 #, python-format
 msgid "Change %(user)s password on %(forum_name)s forums"
 msgstr "Cambiar la contraseña de %(user)s en %(forum_name)s"
 
-#: users/api/auth.py:176
+#: users/api/auth.py:164
 msgid "Form link is invalid. Please try again."
 msgstr "El enlace del formulario no es válido. Por favor inténtalo de nuevo"
 
-#: users/api/auth.py:177
+#: users/api/auth.py:165
 msgid "Your link has expired. Please request new one."
 msgstr "Tu enlace ha expirado Por favor, solicita uno nuevo."
 
@@ -7544,8 +7457,7 @@ msgstr "Confirmar el cambio de contraseña de %(forum_name)s"
 #: users/api/userendpoints/changepassword.py:33
 msgid "Password change confirmation link was sent to your address."
 msgstr ""
-"El enlace de confirmación de cambio de contraseña fue enviado a tu "
-"dirección."
+"El enlace de confirmación de cambio de contraseña fue enviado a tu dirección."
 
 #: users/api/userendpoints/create.py:25
 msgid "New users registrations are currently closed."
@@ -7576,84 +7488,64 @@ msgstr "No tienes permiso para ver el historial de nombres de otros usuarios."
 msgid "You have to sign in to perform this action."
 msgstr "Debes iniciar sesión para realizar esta acción."
 
-#: users/api/users.py:90
-msgid "Please use the 3rd party site to register."
-msgstr ""
-
-#: users/api/users.py:113
+#: users/api/users.py:110
 msgid "You can't change other users avatars."
 msgstr "No puedes cambiar avatares de otros usuarios."
 
-#: users/api/users.py:125
+#: users/api/users.py:122
 msgid "You can't change other users options."
 msgstr "No puede cambiar opciones de otros usuarios."
 
-#: users/api/users.py:130
+#: users/api/users.py:127
 msgid "Your forum options have been changed."
 msgstr "Tus opciones de foro han sido cambiadas."
 
-#: users/api/users.py:137
-msgid "Please use the 3rd party site to change your username."
-msgstr ""
-
-#: users/api/users.py:141
+#: users/api/users.py:133
 msgid "You can't change other users names."
 msgstr "No puedes cambiar otros nombres de usuarios."
 
-#: users/api/users.py:148
+#: users/api/users.py:140
 msgid "You can't change other users signatures."
 msgstr "No puedes cambiar las firmas de otros usuarios."
 
-#: users/api/users.py:161
-msgid "Please use the 3rd party site to change your password."
-msgstr ""
-
-#: users/api/users.py:165
+#: users/api/users.py:152
 msgid "You can't change other users passwords."
 msgstr "No puedes cambiar las contraseñas de otros usuarios."
 
-#: users/api/users.py:175
-msgid "Please use the 3rd party site to change your e-mail."
-msgstr ""
-
-#: users/api/users.py:180
+#: users/api/users.py:162
 msgid "You can't change other users e-mail addresses."
 msgstr ""
 "No puedes cambiar las direcciones de correo electrónico de otros usuarios."
 
-#: users/api/users.py:211
-msgid "Please use the 3rd party site to delete account."
-msgstr ""
-
-#: users/api/users.py:292
+#: users/api/users.py:269
 msgid "You can't request data downloads for other users."
 msgstr ""
 
-#: users/api/users.py:296
+#: users/api/users.py:273
 msgid "You can't download your data."
 msgstr ""
 
-#: users/api/users.py:301
+#: users/api/users.py:278
 msgid "You can't have more than one data download request at a single time."
 msgstr ""
 
-#: users/api/users.py:358
+#: users/api/users.py:335
 msgid "You can't see other users data downloads."
 msgstr ""
 
-#: users/apps.py:33
+#: users/apps.py:30
 msgid "Edit details"
 msgstr "Editar detalles"
 
-#: users/apps.py:39
+#: users/apps.py:36
 msgid "Change username"
 msgstr "Cambiar nombre de usuario"
 
-#: users/apps.py:46
+#: users/apps.py:42
 msgid "Change email or password"
 msgstr "Cambiar e-mail o contraseña"
 
-#: users/apps.py:71
+#: users/apps.py:63
 msgid "Delete account"
 msgstr ""
 
@@ -7733,7 +7625,7 @@ msgstr "El correo electrónico ingresado no es válido."
 msgid "No user with this e-mail exists."
 msgstr "No existen usuarios con este correo electrónico."
 
-#: users/forms/auth.py:150 users/views/activation.py:51
+#: users/forms/auth.py:150 users/views/activation.py:46
 #, python-format
 msgid "%(user)s, your account is already active."
 msgstr "%(user)s, tu cuenta ya está activa."
@@ -7747,8 +7639,7 @@ msgstr "%(user)s, solo el administrador puede activar tu cuenta."
 msgid ""
 "You have to activate your account before you will be able to request new "
 "password."
-msgstr ""
-"Debes activar tu cuenta antes de poder solicitar una nueva contraseña."
+msgstr "Debes activar tu cuenta antes de poder solicitar una nueva contraseña."
 
 #: users/forms/auth.py:169
 msgid ""
@@ -7758,6 +7649,14 @@ msgstr ""
 "El administrador debe activar tu cuenta antes de que pueda solicitar una "
 "nueva contraseña."
 
+#: users/forms/register.py:34 users/validators.py:80
+msgid "This username is not allowed."
+msgstr "Este nombre de usuario no está permitido."
+
+#: users/forms/register.py:45 users/validators.py:52
+msgid "This e-mail address is not allowed."
+msgstr "Esta dirección de correo electrónico no está permitida."
+
 #: users/forms/register.py:51
 msgid "This agreement is required."
 msgstr ""
@@ -8174,13 +8073,13 @@ msgstr "Web"
 
 #: users/profilefields/default.py:41
 msgid ""
-"If you own website in the internet you wish to share on your profile you may"
-" enter its address here. Remember to for it to be valid http address "
-"starting with either \"http://\" or \"https://\"."
+"If you own website in the internet you wish to share on your profile you may "
+"enter its address here. Remember to for it to be valid http address starting "
+"with either \"http://\" or \"https://\"."
 msgstr ""
-"Si posese un sitio web en Internet que deseas compartir en tu perfil, puedes"
-" ingresar aquí su dirección. Recuerda que debe ser una dirección http válida"
-" que comience con \"http://\" o \"https://\"."
+"Si posese un sitio web en Internet que deseas compartir en tu perfil, puedes "
+"ingresar aquí su dirección. Recuerda que debe ser una dirección http válida "
+"que comience con \"http://\" o \"https://\"."
 
 #: users/profilefields/default.py:49
 msgid "Skype ID"
@@ -8202,13 +8101,13 @@ msgstr "Cuenta en twitter:"
 #: users/profilefields/default.py:62
 #, python-format
 msgid ""
-"If you own Twitter account, here you may enter your Twitter handle for other"
-" users to find you. Starting your handle with \"@\" sign is optional. Either"
-" \"@%(slug)s\" or \"%(slug)s\" are valid values."
+"If you own Twitter account, here you may enter your Twitter handle for other "
+"users to find you. Starting your handle with \"@\" sign is optional. Either "
+"\"@%(slug)s\" or \"%(slug)s\" are valid values."
 msgstr ""
 "Si tienes una cuenta de Twitter, aquí puedes ingresar tu nombre de Twitter "
-"para que otros usuarios lo encuentren. Iniciar su identificador con el signo"
-" \"@ \" es opcional. Cualquiera \"@%(slug)s\" o \"%(slug)s\" son valores "
+"para que otros usuarios lo encuentren. Iniciar su identificador con el signo "
+"\"@ \" es opcional. Cualquiera \"@%(slug)s\" o \"%(slug)s\" son valores "
 "válidos."
 
 #: users/profilefields/default.py:73
@@ -8310,18 +8209,13 @@ msgstr[1] ""
 
 #: users/validators.py:137
 msgid "Data entered was found in spammers database."
-msgstr ""
-"Los datos ingresados ​​se encontraron en la base de datos de spammers."
+msgstr "Los datos ingresados ​​se encontraron en la base de datos de spammers."
 
 #: users/validators.py:147
 msgid "This email is not allowed."
 msgstr "Este correo electrónico no está permitido."
 
-#: users/views/activation.py:21
-msgid "Please use the 3rd party site to activate your account."
-msgstr ""
-
-#: users/views/activation.py:56
+#: users/views/activation.py:51
 #, python-format
 msgid ""
 "%(user)s, your activation link is invalid. Try again or request new "
@@ -8330,40 +8224,31 @@ msgstr ""
 "%(user)s, su enlace de activación no es válido. Inténtalo de nuevo o "
 "solicita un nuevo enlace de activación."
 
-#: users/views/activation.py:74
+#: users/views/activation.py:69
 #, python-format
 msgid "%(user)s, your account has been activated!"
 msgstr "%(user)s, ¡tu cuenta ha sido activada!"
 
-#: users/views/forgottenpassword.py:18 users/views/options.py:70
-msgid "Please use the 3rd party site to change password."
-msgstr ""
-
-#: users/views/forgottenpassword.py:45
+#: users/views/forgottenpassword.py:31
 #, python-format
-msgid ""
-"%(user)s, your link has expired. Please request new link and try again."
+msgid "%(user)s, your link has expired. Please request new link and try again."
 msgstr ""
 "%(user)s, tu enlace ha expirado. Solicita un nuevo enlace y vuelve a "
 "intentarlo."
 
-#: users/views/forgottenpassword.py:52
+#: users/views/forgottenpassword.py:38
 #, python-format
 msgid "%(user)s, your link is invalid. Please try again or request new link."
 msgstr ""
-"%(user)s, tu enlace no es válido. Por favor inténtalo de nuevo o solicita un"
-" nuevo enlace."
-
-#: users/views/options.py:47
-msgid "Please use the 3rd party site to change e-mail."
-msgstr ""
+"%(user)s, tu enlace no es válido. Por favor inténtalo de nuevo o solicita un "
+"nuevo enlace."
 
-#: users/views/options.py:59
+#: users/views/options.py:56
 #, python-format
 msgid "%(user)s, your e-mail has been changed."
 msgstr "%(user)s, tu correo electrónico ha sido cambiado."
 
-#: users/views/options.py:80
+#: users/views/options.py:74
 #, python-format
 msgid "%(user)s, your password has been changed."
 msgstr "%(user)s, tu contraseña ha sido modificada."

BIN
misago/locale/es/LC_MESSAGES/djangojs.mo


+ 88 - 93
misago/locale/es/LC_MESSAGES/djangojs.po

@@ -2,24 +2,24 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # Javier Lorenzo <javichio@gmail.com>, 2017
 # Paulo Abraham <cnnick.ex@gmail.com>, 2020
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Paulo Abraham <cnnick.ex@gmail.com>, 2020\n"
 "Language-Team: Spanish (https://www.transifex.com/misago/teams/65369/es/)\n"
+"Language: es\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: es\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #: static/misago/admin/index.js:16
@@ -81,8 +81,8 @@ msgid ""
 "You have signed in as %(username)s. Please refresh the page before "
 "continuing."
 msgstr ""
-"Has iniciado sesión como %(username)s. Por favor, recarga la página antes de"
-" continuar."
+"Has iniciado sesión como %(username)s. Por favor, recarga la página antes de "
+"continuar."
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -383,8 +383,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Please select the best answer for your newly merged thread. No posts will be"
-" deleted during the merge."
+"Please select the best answer for your newly merged thread. No posts will be "
+"deleted during the merge."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -479,8 +479,8 @@ msgstr "Eliminar cuenta"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You are going to delete your account. This action is nonreversible, and will"
-" result in following data being deleted:"
+"You are going to delete your account. This action is nonreversible, and will "
+"result in following data being deleted:"
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -501,8 +501,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"All your posted content will NOT be deleted, but username associated with it"
-" will be changed to one shared by all deleted accounts."
+"All your posted content will NOT be deleted, but username associated with it "
+"will be changed to one shared by all deleted accounts."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -695,6 +695,10 @@ msgid "Change forgotten password"
 msgstr "Cambiar contraseña olvidada"
 
 #: static/misago/js/misago.js:1
+msgid "%(user)s has been made new thread owner."
+msgstr "%(user)s ha establecido un nuevo propietario del hilo."
+
+#: static/misago/js/misago.js:1
 msgid "You have left this thread."
 msgstr "Has abandonado el hilo."
 
@@ -703,10 +707,6 @@ msgid "%(user)s has been removed from this thread."
 msgstr "%(user)s ha sido elimnado del hilo."
 
 #: static/misago/js/misago.js:1
-msgid "%(user)s has been made new thread owner."
-msgstr "%(user)s ha establecido un nuevo propietario del hilo."
-
-#: static/misago/js/misago.js:1
 msgid "See profile"
 msgstr "Ver perfil"
 
@@ -720,8 +720,7 @@ msgstr "¿Estás seguro de que quieres retomar este hilo?"
 
 #: static/misago/js/misago.js:1
 msgid "Are you sure you want to change thread owner to %(user)s?"
-msgstr ""
-"Estás seguro de que quieres cambiar el propietario del hilo a %(user)s"
+msgstr "Estás seguro de que quieres cambiar el propietario del hilo a %(user)s"
 
 #: static/misago/js/misago.js:1
 msgid "Make owner"
@@ -853,8 +852,8 @@ msgid ""
 "for all polls."
 msgstr ""
 "Permitir el voto público permitirá a cualquiera que tenga acceso a la lista "
-"de votos, mostrando qué usuarios han votado por cada una de las elecciones y"
-" cuántas veces. Esta opción no puede ser alterada después de la creación de "
+"de votos, mostrando qué usuarios han votado por cada una de las elecciones y "
+"cuántas veces. Esta opción no puede ser alterada después de la creación de "
 "la encuesta. Los pueden ver los detalles de votación en cualquier caso."
 
 #: static/misago/js/misago.js:1
@@ -970,8 +969,7 @@ msgstr "Revertir"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you with to revert this post to the state from before this "
-"edit?"
+"Are you sure you with to revert this post to the state from before this edit?"
 msgstr ""
 "¿Estás seguro de querer revertir el contenido de este post al estado previo "
 "a la edición?"
@@ -1003,8 +1001,7 @@ msgstr "El contenido de este mensaje no puede ser mostrado."
 #: static/misago/js/misago.js:1
 msgid "This error is caused by invalid post content manipulation."
 msgstr ""
-"Este error está causado por una manipulación inválida del contenido del "
-"post."
+"Este error está causado por una manipulación inválida del contenido del post."
 
 #: static/misago/js/misago.js:1
 msgid "posted %(posted_on)s"
@@ -1128,8 +1125,8 @@ msgid_plural ""
 "Thread title should be at least %(limit_value)s characters long (it has "
 "%(show_value)s)."
 msgstr[0] ""
-"El título del hilo debe ser de al menos %(limit_value)s caracter de longitud"
-" (es de %(show_value)s)."
+"El título del hilo debe ser de al menos %(limit_value)s caracter de longitud "
+"(es de %(show_value)s)."
 msgstr[1] ""
 "El título del hilo debe ser de al menos %(limit_value)s caracteres de "
 "longitud (es de %(show_value)s)."
@@ -1173,8 +1170,8 @@ msgstr[0] ""
 "El mensaje a publicar no debe ser mayor de %(limit_value)s caracter (es de "
 "%(show_value)s)."
 msgstr[1] ""
-"El mensaje a publicar no debe ser mayor de %(limit_value)s caracteres (es de"
-" %(show_value)s)."
+"El mensaje a publicar no debe ser mayor de %(limit_value)s caracteres (es de "
+"%(show_value)s)."
 
 #: static/misago/js/misago.js:1
 msgid "Hide"
@@ -1406,18 +1403,18 @@ msgstr ""
 "El mensaje está oculto. Sólo usuarios con permisos pueden ver su contenido."
 
 #: static/misago/js/misago.js:1
+msgid "This post is protected. Only moderators may change it."
+msgstr "El mensaje está protegido. Sólo los moderadores pueden cambiarlo."
+
+#: static/misago/js/misago.js:1
 msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
 "El mensaje no ha sido aprobado. Sólo los usuarios con permisos pueden "
 "aprobar mensajes y sólo su autor puede ver su contenido."
 
 #: static/misago/js/misago.js:1
-msgid "This post is protected. Only moderators may change it."
-msgstr "El mensaje está protegido. Sólo los moderadores pueden cambiarlo."
-
-#: static/misago/js/misago.js:1
 msgid "Liked"
 msgstr "Liked"
 
@@ -1516,34 +1513,6 @@ msgid "%(username)s's details have been updated."
 msgstr "Los detalles de %(username)s han sido actualizados."
 
 #: static/misago/js/misago.js:1
-msgid "You have no started threads."
-msgstr "No has iniciado ningún hilo."
-
-#: static/misago/js/misago.js:1
-msgid "%(username)s started no threads."
-msgstr "%(username)s no ha iniciado ningún hilo."
-
-#: static/misago/js/misago.js:1
-msgid "You have started %(threads)s thread."
-msgid_plural "You have started %(threads)s threads."
-msgstr[0] "Has iniciado %(threads)s hilo."
-msgstr[1] "Has iniciado %(threads)s hilos."
-
-#: static/misago/js/misago.js:1
-msgid "%(username)s has started %(threads)s thread."
-msgid_plural "%(username)s has started %(threads)s threads."
-msgstr[0] "%(username)s ha iniciado %(threads)s hilo."
-msgstr[1] "%(username)s ha iniciado %(threads)s hilos."
-
-#: static/misago/js/misago.js:1
-msgid "Loading..."
-msgstr "Cargando..."
-
-#: static/misago/js/misago.js:1
-msgid "Threads"
-msgstr "Hilos"
-
-#: static/misago/js/misago.js:1
 msgid "You have posted no messages."
 msgstr "No has publicado mensajes."
 
@@ -1564,10 +1533,38 @@ msgstr[0] "%(username)s ha publicado %(posts)s mensaje."
 msgstr[1] "%(username)s ha publicado %(posts)s mensajes."
 
 #: static/misago/js/misago.js:1
+msgid "Loading..."
+msgstr "Cargando..."
+
+#: static/misago/js/misago.js:1
 msgid "Posts"
 msgstr "Mensajes"
 
 #: static/misago/js/misago.js:1
+msgid "You have no started threads."
+msgstr "No has iniciado ningún hilo."
+
+#: static/misago/js/misago.js:1
+msgid "%(username)s started no threads."
+msgstr "%(username)s no ha iniciado ningún hilo."
+
+#: static/misago/js/misago.js:1
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
+msgstr[0] "Has iniciado %(threads)s hilo."
+msgstr[1] "Has iniciado %(threads)s hilos."
+
+#: static/misago/js/misago.js:1
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
+msgstr[0] "%(username)s ha iniciado %(threads)s hilo."
+msgstr[1] "%(username)s ha iniciado %(threads)s hilos."
+
+#: static/misago/js/misago.js:1
+msgid "Threads"
+msgstr "Hilos"
+
+#: static/misago/js/misago.js:1
 msgid "Show older activity"
 msgstr ""
 
@@ -1714,8 +1711,8 @@ msgid ""
 "Optional message for forum team members explaining why user is prohibited "
 "form changing avatar."
 msgstr ""
-"Mensaje opcional para los miembros del foro explicando por qué al usuario se"
-" le prohibe cambiar su avatar."
+"Mensaje opcional para los miembros del foro explicando por qué al usuario se "
+"le prohibe cambiar su avatar."
 
 #: static/misago/js/misago.js:1
 msgid "Avatar controls"
@@ -1864,8 +1861,8 @@ msgid ""
 "%(username)s, your account has been created but board administrator will "
 "have to activate it before you will be able to sign in."
 msgstr ""
-"%(username)s, tu cuenta ha sido creada pero la administración del sitio debe"
-" activarla antes de que puedas iniciar sesión."
+"%(username)s, tu cuenta ha sido creada pero la administración del sitio debe "
+"activarla antes de que puedas iniciar sesión."
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -2051,11 +2048,10 @@ msgstr "última respuesta por %(user)s %(date)s"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you want to merge selected posts? This action is not "
-"reversible!"
+"Are you sure you want to merge selected posts? This action is not reversible!"
 msgstr ""
-"¿Estás seguro de que quieres mezclar los mensajes seleccionados? Esta opción"
-" no puede deshacerse."
+"¿Estás seguro de que quieres mezclar los mensajes seleccionados? Esta opción "
+"no puede deshacerse."
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -2397,8 +2393,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You need permission to start threads in category to be able to merge threads"
-" to it."
+"You need permission to start threads in category to be able to merge threads "
+"to it."
 msgstr ""
 "Necesitas permisos para empezar hilos en la categoría para poder mezclar "
 "hilos en ela."
@@ -2412,8 +2408,8 @@ msgid ""
 "You need permission to start threads in category to be able to move threads "
 "to it."
 msgstr ""
-"Necesitas permisos para empezar hilos en la categoría para poder mover hilos"
-" a ella"
+"Necesitas permisos para empezar hilos en la categoría para poder mover hilos "
+"a ella"
 
 #: static/misago/js/misago.js:1
 msgid "Select all"
@@ -2662,19 +2658,26 @@ msgid "You are banned"
 msgstr "Has sido baneado"
 
 #: static/misago/js/misago.js:1
-msgid "You have to accept the terms of service."
-msgstr ""
+msgid "Valid password must be at least %(limit_value)s character long."
+msgid_plural "Valid password must be at least %(limit_value)s characters long."
+msgstr[0] ""
+"La contraseña debe ser al menos de %(limit_value)s caracteres de largo."
+msgstr[1] ""
+"La contraseña debe ser al menos de %(limit_value)s caracteres de largo."
 
 #: static/misago/js/misago.js:1
 msgid "You have to accept the privacy policy."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "Username must be at least %(limit_value)s character long."
-msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] "El nombre de usuario debe tener al menos %(limit_value)s caracter."
-msgstr[1] ""
-"El nombre de usuario debe tener al menos %(limit_value)s caracteres."
+msgid "You have to accept the terms of service."
+msgstr ""
+
+#: static/misago/js/misago.js:1
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr ""
+"El nombre de usuario sólo puede contener caracteres latinos, letras y "
+"dígitos."
 
 #: static/misago/js/misago.js:1
 msgid "Username cannot be longer than %(limit_value)s character."
@@ -2685,19 +2688,11 @@ msgstr[1] ""
 "El nombre de usuario no puede ser mayor de %(limit_value)s caracteres."
 
 #: static/misago/js/misago.js:1
-msgid "Username can only contain latin alphabet letters and digits."
-msgstr ""
-"El nombre de usuario sólo puede contener caracteres latinos, letras y "
-"dígitos."
-
-#: static/misago/js/misago.js:1
-msgid "Valid password must be at least %(limit_value)s character long."
-msgid_plural ""
-"Valid password must be at least %(limit_value)s characters long."
-msgstr[0] ""
-"La contraseña debe ser al menos de %(limit_value)s caracteres de largo."
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
+msgstr[0] "El nombre de usuario debe tener al menos %(limit_value)s caracter."
 msgstr[1] ""
-"La contraseña debe ser al menos de %(limit_value)s caracteres de largo."
+"El nombre de usuario debe tener al menos %(limit_value)s caracteres."
 
 #: static/misago/js/misago.js:1
 msgid "This field is required."

BIN
misago/locale/et/LC_MESSAGES/django.mo


+ 7963 - 0
misago/locale/et/LC_MESSAGES/django.po

@@ -0,0 +1,7963 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: acl/admin/__init__.py:24 templates/misago/acl_debug.html:16
+#: templates/misago/admin/ranks/form.html:58
+msgid "Permissions"
+msgstr ""
+
+#: acl/admin/forms.py:9 categories/admin/forms.py:238
+msgid "Role name"
+msgstr ""
+
+#: acl/admin/views.py:15 categories/admin/views/perms.py:23
+msgid "Requested role does not exist."
+msgstr ""
+
+#: acl/admin/views.py:51 categories/admin/views/perms.py:62
+msgid "Form contains errors."
+msgstr ""
+
+#: acl/admin/views.py:62 categories/admin/views/perms.py:73
+#, python-format
+msgid "New role \"%(name)s\" has been saved."
+msgstr ""
+
+#: acl/admin/views.py:66 categories/admin/views/perms.py:77
+#, python-format
+msgid "Role \"%(name)s\" has been changed."
+msgstr ""
+
+#: acl/admin/views.py:72 categories/admin/views/perms.py:83
+#, python-format
+msgid "Role \"%(name)s\" is special role and can't be deleted."
+msgstr ""
+
+#: acl/admin/views.py:77 categories/admin/views/perms.py:88
+#, python-format
+msgid "Role \"%(name)s\" has been deleted."
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:10
+msgid "Member"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:48
+msgid "Guest"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:78
+#: categories/migrations/0003_categories_roles.py:71
+#: categories/migrations/0003_categories_roles.py:117
+#: users/migrations/0004_default_ranks.py:30
+msgid "Moderator"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:133
+msgid "Renaming users"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:141
+msgid "Banning users"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:155
+#: users/migrations/0004_default_ranks.py:33 users/permissions/delete.py:23
+msgid "Deleting users"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:166
+msgid "Can't be blocked"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:174
+#: threads/permissions/privatethreads.py:33
+#: threads/threadtypes/privatethread.py:12 threads/viewmodels/thread.py:147
+#: users/migrations/0004_default_ranks.py:31
+#: users/migrations/0004_default_ranks.py:35
+msgid "Private threads"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:189
+#: users/migrations/0004_default_ranks.py:32
+msgid "Private threads moderator"
+msgstr ""
+
+#: acl/panels.py:8
+msgid "Misago User ACL"
+msgstr ""
+
+#: acl/panels.py:17
+msgid "Anonymous user"
+msgstr ""
+
+#: admin/admin.py:6 templates/misago/admin/dashboard/index.html:5
+#: templates/misago/admin/dashboard/index.html:11
+msgid "Dashboard"
+msgstr ""
+
+#: admin/auth.py:29
+msgid "Your admin session has expired."
+msgstr ""
+
+#: admin/forms.py:46
+msgid ""
+"Value must be a 7-character string specifying an RGB color in a hexadecimal "
+"format."
+msgstr ""
+
+#: admin/forms.py:67 templates/misago/admin/users/edit.html:145
+#: templates/misago/admin/users/edit.html:163
+#: templates/misago/admin/users/edit.html:265 users/admin/forms.py:582
+msgid "Yes"
+msgstr ""
+
+#: admin/forms.py:68 templates/misago/admin/users/edit.html:149
+#: templates/misago/admin/users/edit.html:167
+#: templates/misago/admin/users/edit.html:269
+#: threads/permissions/bestanswers.py:34 threads/permissions/bestanswers.py:40
+#: threads/permissions/polls.py:34 threads/permissions/polls.py:40
+#: threads/permissions/polls.py:46 threads/permissions/threads.py:120
+#: threads/permissions/threads.py:130 threads/permissions/threads.py:142
+#: threads/permissions/threads.py:149 threads/permissions/threads.py:159
+#: threads/permissions/threads.py:168 threads/permissions/threads.py:180
+#: threads/permissions/threads.py:188 threads/permissions/threads.py:218
+#: users/admin/forms.py:582 users/models/user.py:105
+msgid "No"
+msgstr ""
+
+#: admin/views/auth.py:39
+msgid "Your admin session has been closed."
+msgstr ""
+
+#: admin/views/generic/list.py:39
+msgid "Selected: 0"
+msgstr ""
+
+#: admin/views/generic/list.py:40
+msgid "Select items"
+msgstr ""
+
+#: admin/views/generic/list.py:288 admin/views/generic/list.py:293
+msgid "You have to select one or more items."
+msgstr ""
+
+#: admin/views/generic/list.py:307
+msgid "Action is not allowed."
+msgstr ""
+
+#: categories/admin/__init__.py:65 templates/misago/categories/base.html:7
+#: templates/misago/categories/base.html:29
+#: templates/misago/categories/base.html:38
+#: templates/misago/categories/header.html:8 templates/misago/navbar.html:25
+#: templates/misago/navbar.html:31
+msgid "Categories"
+msgstr ""
+
+#: categories/admin/__init__.py:72
+msgid "Category permissions"
+msgstr ""
+
+#: categories/admin/forms.py:46
+#: templates/misago/admin/themes/assets/css.html:31
+#: templates/misago/admin/themes/assets/media.html:21 themes/admin/forms.py:26
+#: themes/admin/forms.py:53 themes/admin/forms.py:174 users/admin/forms.py:386
+msgid "Name"
+msgstr ""
+
+#: categories/admin/forms.py:48 users/admin/forms.py:402
+msgid "Description"
+msgstr ""
+
+#: categories/admin/forms.py:52
+msgid "Optional description explaining category intented purpose."
+msgstr ""
+
+#: categories/admin/forms.py:55 menus/admin/forms.py:20
+#: templates/misago/admin/categories/list.html:18
+#: templates/misago/admin/ranks/list.html:20 users/admin/forms.py:419
+msgid "CSS class"
+msgstr ""
+
+#: categories/admin/forms.py:58
+msgid ""
+"Optional CSS class used to customize this category's appearance from "
+"templates."
+msgstr ""
+
+#: categories/admin/forms.py:63
+msgid "Closed category"
+msgstr ""
+
+#: categories/admin/forms.py:66
+msgid "Only members with valid permissions can post in closed categories."
+msgstr ""
+
+#: categories/admin/forms.py:70 conf/admin/__init__.py:79
+#: templates/misago/admin/categories/list.html:19
+#: templates/misago/admin/dashboard/totals.html:19
+#: templates/misago/navbar.html:20 templates/misago/navbar.html:36
+#: templates/misago/profile/threads.html:5
+#: templates/misago/profile/threads.html:8
+#: templates/misago/profile/threads.html:9
+#: templates/misago/threadslist/category.html:68
+#: templates/misago/threadslist/threads.html:14
+#: templates/misago/threadslist/threads.html:16
+#: templates/misago/threadslist/threads.html:33
+#: templates/misago/threadslist/threads.html:42
+#: templates/misago/threadslist/threads.html:66
+#: threads/permissions/threads.py:73 threads/permissions/threads.py:104
+#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:97
+msgid "Threads"
+msgstr ""
+
+#: categories/admin/forms.py:73
+msgid "All threads started in this category will require moderator approval."
+msgstr ""
+
+#: categories/admin/forms.py:77
+msgid "Replies"
+msgstr ""
+
+#: categories/admin/forms.py:80
+msgid "All replies posted in this category will require moderator approval."
+msgstr ""
+
+#: categories/admin/forms.py:84
+msgid "Edits"
+msgstr ""
+
+#: categories/admin/forms.py:87
+msgid ""
+"Will make all edited replies return to unapproved state for moderator to "
+"review."
+msgstr ""
+
+#: categories/admin/forms.py:92
+msgid "Thread age"
+msgstr ""
+
+#: categories/admin/forms.py:95
+msgid ""
+"Prune thread if number of days since its creation is greater than specified. "
+"Enter 0 to disable this pruning criteria."
+msgstr ""
+
+#: categories/admin/forms.py:100
+msgid "Last reply"
+msgstr ""
+
+#: categories/admin/forms.py:103
+msgid ""
+"Prune thread if number of days since last reply is greater than specified. "
+"Enter 0 to disable this pruning criteria."
+msgstr ""
+
+#: categories/admin/forms.py:126
+msgid "Permissions cannot be copied from category into itself."
+msgstr ""
+
+#: categories/admin/forms.py:133
+msgid "Category cannot act as archive for itself."
+msgstr ""
+
+#: categories/admin/forms.py:155
+msgid "Parent category"
+msgstr ""
+
+#: categories/admin/forms.py:161
+msgid "Copy permissions"
+msgstr ""
+
+#: categories/admin/forms.py:163
+msgid ""
+"You can replace this category permissions with permissions copied from "
+"category selected here."
+msgstr ""
+
+#: categories/admin/forms.py:167
+msgid "Don't copy permissions"
+msgstr ""
+
+#: categories/admin/forms.py:171
+msgid "Archive"
+msgstr ""
+
+#: categories/admin/forms.py:173
+msgid ""
+"Instead of being deleted, pruned threads can be moved to designated category."
+msgstr ""
+
+#: categories/admin/forms.py:177
+msgid "Don't archive pruned threads"
+msgstr ""
+
+#: categories/admin/forms.py:194
+msgid "You are trying to move this category threads to itself."
+msgstr ""
+
+#: categories/admin/forms.py:200
+msgid ""
+"You are trying to move this category threads to a child category that will "
+"be deleted together with this category."
+msgstr ""
+
+#: categories/admin/forms.py:213
+msgid "Move category threads to"
+msgstr ""
+
+#: categories/admin/forms.py:216 categories/admin/forms.py:230
+msgid "Delete with category"
+msgstr ""
+
+#: categories/admin/forms.py:228
+msgid "Move child categories to"
+msgstr ""
+
+#: categories/admin/forms.py:249 categories/admin/forms.py:264
+#: templates/misago/acl_debug.html:15 templates/misago/admin/roles/list.html:16
+msgid "Role"
+msgstr ""
+
+#: categories/admin/forms.py:253 categories/admin/forms.py:268
+msgid "No access"
+msgstr ""
+
+#: categories/admin/views/categories.py:17
+msgid "Requested category does not exist."
+msgstr ""
+
+#: categories/admin/views/categories.py:96
+#, python-format
+msgid "New category \"%(name)s\" has been saved."
+msgstr ""
+
+#: categories/admin/views/categories.py:100
+#, python-format
+msgid "Category \"%(name)s\" has been edited."
+msgstr ""
+
+#: categories/admin/views/categories.py:104
+#, python-format
+msgid "Category \"%(name)s\" has been deleted."
+msgstr ""
+
+#: categories/admin/views/categories.py:154
+#, python-format
+msgid "Category \"%(name)s\" has been moved below \"%(other)s\"."
+msgstr ""
+
+#: categories/admin/views/categories.py:170
+#, python-format
+msgid "Category \"%(name)s\" has been moved above \"%(other)s\"."
+msgstr ""
+
+#: categories/admin/views/perms.py:134
+#, python-format
+msgid "Category %(name)s permissions have been changed."
+msgstr ""
+
+#: categories/admin/views/perms.py:145
+#: templates/misago/admin/categoryroles/categoryroles.html:37
+#: templates/misago/admin/categoryroles/rolecategories.html:31
+msgid "Change permissions"
+msgstr ""
+
+#: categories/admin/views/perms.py:158
+msgid "No categories exist."
+msgstr ""
+
+#: categories/admin/views/perms.py:197
+#, python-format
+msgid "Category permissions for role %(name)s have been changed."
+msgstr ""
+
+#: categories/admin/views/perms.py:208
+msgid "Categories permissions"
+msgstr ""
+
+#: categories/migrations/0002_default_categories.py:31
+msgid "First category"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:10
+msgid "See only"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:18
+msgid "Read only"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:33
+msgid "Reply to threads"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:51
+msgid "Start and reply threads"
+msgstr ""
+
+#: categories/migrations/0006_moderation_queue_roles.py:10
+msgid "In moderation queue"
+msgstr ""
+
+#: categories/migrations/0007_best_answers_roles.py:11
+msgid "Q&A user"
+msgstr ""
+
+#: categories/migrations/0007_best_answers_roles.py:23
+msgid "Q&A moderator"
+msgstr ""
+
+#: categories/permissions.py:13
+msgid "Category access"
+msgstr ""
+
+#: categories/permissions.py:15
+msgid "Can see category"
+msgstr ""
+
+#: categories/permissions.py:16
+msgid "Can see category contents"
+msgstr ""
+
+#: categories/permissions.py:119
+#, python-format
+msgid "You don't have permission to browse \"%(category)s\" contents."
+msgstr ""
+
+#: conf/admin/__init__.py:41 templates/misago/admin/conf/index.html:5
+#: templates/misago/admin/themes/form.html:48
+msgid "Settings"
+msgstr ""
+
+#: conf/admin/__init__.py:48 templates/misago/admin/socialauth/form.html:27
+msgid "General"
+msgstr ""
+
+#: conf/admin/__init__.py:49
+msgid "Change forum details like name, description or footer."
+msgstr ""
+
+#: conf/admin/__init__.py:54 templates/misago/admin/dashboard/totals.html:7
+#: templates/misago/admin/users/ban.html:22 templates/misago/navbar.html:42
+#: templates/misago/userslists/base.html:5
+#: templates/misago/userslists/base.html:14 users/admin/__init__.py:74
+#: users/search.py:16
+msgid "Users"
+msgstr ""
+
+#: conf/admin/__init__.py:56
+msgid "Customize user accounts default behavior and features availability."
+msgstr ""
+
+#: conf/admin/__init__.py:63
+msgid "Captcha"
+msgstr ""
+
+#: conf/admin/__init__.py:65
+msgid "Setup protection against automatic registrations on the site."
+msgstr ""
+
+#: conf/admin/__init__.py:72 templates/misago/admin/dashboard/analytics.html:7
+#: templates/misago/admin/dashboard/index.html:40
+msgid "Analytics"
+msgstr ""
+
+#: conf/admin/__init__.py:73
+msgid "Enable Google Analytics or setup Google Site Verification."
+msgstr ""
+
+#: conf/admin/__init__.py:80
+msgid "Threads, posts, polls and attachments options."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:17
+msgid "Tracking ID"
+msgstr ""
+
+#: conf/admin/forms/analytics.py:19
+msgid ""
+"Setting the Tracking ID will result in gtag.js file being included in your "
+"site's HTML markup, enabling Google Analytics integration."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:25
+msgid "Site verification token"
+msgstr ""
+
+#: conf/admin/forms/analytics.py:27
+msgid ""
+"This token was extracted from uploaded site verification file. To change it, "
+"upload new verification file."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:34
+msgid "Upload site verification file"
+msgstr ""
+
+#: conf/admin/forms/analytics.py:36
+msgid ""
+"Site verification file can be downloaded from Search Console's \"Ownership "
+"verification\" page."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:48
+msgid "Submitted file type is not HTML."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:54
+msgid "Submitted file doesn't contain a verification code."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:21
+msgid "Enable CAPTCHA"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:23
+msgid "No CAPTCHA"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:24
+msgid "reCaptcha"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:25
+#: templates/misago/admin/conf/captcha_settings.html:25
+msgid "Question and answer"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:31
+msgid "Site key"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:34
+msgid "Secret key"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:38
+msgid "Test question"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:41
+msgid "Question help text"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:44
+msgid "Valid answers"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:45
+msgid "Enter each answer in new line. Answers are case-insensitive."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:52
+msgid "Validate new registrations against SFS database"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:54
+msgid ""
+"Turning this option on will result in Misago validating new user's e-mail "
+"and IP address against SFS database."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:59
+msgid "Minimum SFS confidence required"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:61
+msgid ""
+"SFS compares user e-mail and IP address with database of known spammers and "
+"assigns the confidence score in range of 0 to 100 that user is a spammer "
+"themselves. If this score is equal or higher than specified, Misago will "
+"block user from registering and ban their IP address for 24 hours."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:79
+msgid "You need to enter site key if selected CAPTCHA type is reCaptcha."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:88
+msgid "You need to enter secret key if selected CAPTCHA type is reCaptcha."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:97
+msgid "You need to set question if selected CAPTCHA type is Q&A."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:104
+msgid "You need to set question answers if selected CAPTCHA type is Q&A."
+msgstr ""
+
+#: conf/admin/forms/general.py:25
+msgid "Forum name"
+msgstr ""
+
+#: conf/admin/forms/general.py:26
+msgid "Forum address"
+msgstr ""
+
+#: conf/admin/forms/general.py:29
+msgid "Header text"
+msgstr ""
+
+#: conf/admin/forms/general.py:30
+msgid "This text will replace forum name in page header."
+msgstr ""
+
+#: conf/admin/forms/general.py:34
+msgid "Page title"
+msgstr ""
+
+#: conf/admin/forms/general.py:36
+msgid "Meta Description"
+msgstr ""
+
+#: conf/admin/forms/general.py:38
+msgid ""
+"Short description of your forum that search and social sites may display "
+"next to link to your forum's index."
+msgstr ""
+
+#: conf/admin/forms/general.py:46
+#: templates/misago/admin/conf/general_settings.html:17
+msgid "Logo"
+msgstr ""
+
+#: conf/admin/forms/general.py:47
+msgid "Image that will displayed in forum navbar."
+msgstr ""
+
+#: conf/admin/forms/general.py:50
+msgid "Delete logo image"
+msgstr ""
+
+#: conf/admin/forms/general.py:52
+msgid "Small logo"
+msgstr ""
+
+#: conf/admin/forms/general.py:54
+msgid ""
+"Image that will be displayed in compact forum navbar. When set, it will "
+"replace icon pointing to forum index."
+msgstr ""
+
+#: conf/admin/forms/general.py:60
+msgid "Delete small logo image"
+msgstr ""
+
+#: conf/admin/forms/general.py:63 legal/admin/forms.py:34
+msgid "Text"
+msgstr ""
+
+#: conf/admin/forms/general.py:65
+msgid ""
+"Text displayed in forum navbar. If logo image was uploaded, text will be "
+"displayed right next to it. Never displayed by the compact navbar."
+msgstr ""
+
+#: conf/admin/forms/general.py:73
+msgid "Image"
+msgstr ""
+
+#: conf/admin/forms/general.py:75
+msgid ""
+"Custom image that will appear next to links to your forum posted on social "
+"sites. Facebook recommends that this image should be 1200 pixels wide and "
+"630 pixels tall."
+msgstr ""
+
+#: conf/admin/forms/general.py:81
+msgid "Delete image"
+msgstr ""
+
+#: conf/admin/forms/general.py:83
+msgid "Replace image with avatar on user profiles"
+msgstr ""
+
+#: conf/admin/forms/general.py:86
+msgid "Replace image with avatar on threads"
+msgstr ""
+
+#: conf/admin/forms/general.py:90
+#: templates/misago/admin/conf/general_settings.html:59
+msgid "Forum footnote"
+msgstr ""
+
+#: conf/admin/forms/general.py:91
+msgid "Short message displayed in forum footer."
+msgstr ""
+
+#: conf/admin/forms/general.py:96
+msgid "E-mails footer"
+msgstr ""
+
+#: conf/admin/forms/general.py:98
+msgid "Optional short message included at the end of e-mails sent by forum."
+msgstr ""
+
+#: conf/admin/forms/general.py:109
+#, python-format
+msgid ""
+"Misago uses this setting to build links in e-mails sent to site users. "
+"Address under which site is running appears to be \"%(address)s\"."
+msgstr ""
+
+#: conf/admin/forms/threads.py:27
+msgid "Daily post limit per user"
+msgstr ""
+
+#: conf/admin/forms/threads.py:29
+msgid ""
+"Daily limit of posts that may be posted by single user. Fail-safe for "
+"situations when forum is flooded by spam bots. Change to 0 to remove the "
+"limit."
+msgstr ""
+
+#: conf/admin/forms/threads.py:36
+msgid "Hourly post limit per user"
+msgstr ""
+
+#: conf/admin/forms/threads.py:38
+msgid ""
+"Hourly limit of posts that may be posted by single user. Fail-safe for "
+"situations when forum is flooded by spam bots. Change to 0 to remove the "
+"limit."
+msgstr ""
+
+#: conf/admin/forms/threads.py:45
+msgid "Maximum number of attachments per post"
+msgstr ""
+
+#: conf/admin/forms/threads.py:48
+msgid "Maximum allowed post length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:51
+msgid "Minimum required post length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:54
+msgid "Maximum allowed thread title length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:57
+msgid "Minimum required thread title length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:60
+msgid "Unused attachments lifetime"
+msgstr ""
+
+#: conf/admin/forms/threads.py:62
+msgid ""
+"Period of time (in hours) after which user-uploaded files that weren't "
+"attached to any post are deleted from disk."
+msgstr ""
+
+#: conf/admin/forms/threads.py:69
+msgid "Read-tracker cutoff"
+msgstr ""
+
+#: conf/admin/forms/threads.py:71
+msgid ""
+"Controls amount of data used by read-tracking system. All content older than "
+"number of days specified in this setting is considered old and read, even if "
+"the opposite is true for the user. Active forums can try lowering this value "
+"while less active ones may wish to increase it instead. "
+msgstr ""
+
+#: conf/admin/forms/threads.py:80
+msgid "Number of threads displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/threads.py:84
+msgid "Number of posts displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/threads.py:87 conf/admin/forms/users.py:141
+msgid "Maximum orphans"
+msgstr ""
+
+#: conf/admin/forms/threads.py:89
+msgid ""
+"If number of posts to be displayed on the last page is less or equal to "
+"number specified in this setting, those posts will instead be displayed on "
+"previous page, reducing the total number of pages in thread."
+msgstr ""
+
+#: conf/admin/forms/threads.py:96
+msgid "Maximum number of events displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/threads.py:100
+msgid "Permission denied"
+msgstr ""
+
+#: conf/admin/forms/threads.py:102
+msgid ""
+"Attachments proxy will display this image in place of default one when user "
+"tries to access attachment they have no permission to see."
+msgstr ""
+
+#: conf/admin/forms/threads.py:108
+msgid "Delete custom permission denied image"
+msgstr ""
+
+#: conf/admin/forms/threads.py:111
+msgid "Not found"
+msgstr ""
+
+#: conf/admin/forms/threads.py:113
+msgid ""
+"Attachments proxy will display this image in place of default one when user "
+"tries to access attachment that doesn't exist."
+msgstr ""
+
+#: conf/admin/forms/threads.py:119
+msgid "Delete custom not found image"
+msgstr ""
+
+#: conf/admin/forms/threads.py:129
+msgid "This value must be lower than number of posts per page."
+msgstr ""
+
+#: conf/admin/forms/users.py:37
+msgid "Require new accounts activation"
+msgstr ""
+
+#: conf/admin/forms/users.py:39
+msgid "No activation required"
+msgstr ""
+
+#: conf/admin/forms/users.py:40
+msgid "Activation token sent to user e-mail"
+msgstr ""
+
+#: conf/admin/forms/users.py:41
+msgid "Activation by administrator"
+msgstr ""
+
+#: conf/admin/forms/users.py:42
+msgid "Disable new registrations"
+msgstr ""
+
+#: conf/admin/forms/users.py:48
+msgid ""
+"Delete new inactive accounts if they weren't activated within this number of "
+"days"
+msgstr ""
+
+#: conf/admin/forms/users.py:51
+msgid "Enter 0 to never delete inactive new accounts."
+msgstr ""
+
+#: conf/admin/forms/users.py:56
+msgid "Minimum allowed username length"
+msgstr ""
+
+#: conf/admin/forms/users.py:59
+msgid "Maximum allowed username length"
+msgstr ""
+
+#: conf/admin/forms/users.py:63
+msgid "Allow custom avatar uploads"
+msgstr ""
+
+#: conf/admin/forms/users.py:65
+msgid ""
+"Turning this option off will forbid forum users from uploading custom "
+"avatars. Good for forums adressed at young users."
+msgstr ""
+
+#: conf/admin/forms/users.py:70
+msgid "Maximum size of uploaded avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:71
+msgid "Enter maximum allowed file size (in KB) for avatar uploads."
+msgstr ""
+
+#: conf/admin/forms/users.py:75
+msgid "Default avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:77 conf/admin/forms/users.py:90
+msgid "Individual"
+msgstr ""
+
+#: conf/admin/forms/users.py:78
+msgid "Gravatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:79 conf/admin/forms/users.py:91
+msgid "Random avatar from gallery"
+msgstr ""
+
+#: conf/admin/forms/users.py:84
+msgid "Fallback for default gravatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:86
+msgid ""
+"Select which avatar to use when user has no gravatar associated with their e-"
+"mail address."
+msgstr ""
+
+#: conf/admin/forms/users.py:96
+msgid "Blank avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:98
+msgid ""
+"Blank avatar is displayed in the interface when user's avatar is not "
+"available: when user was deleted or is guest. Uploaded image should be a "
+"square."
+msgstr ""
+
+#: conf/admin/forms/users.py:105
+msgid "Delete custom blank avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:109
+msgid "Maximum allowed signature length"
+msgstr ""
+
+#: conf/admin/forms/users.py:113 threads/permissions/threads.py:110
+#: users/admin/forms.py:175
+msgid "Started threads"
+msgstr ""
+
+#: conf/admin/forms/users.py:115 conf/admin/forms/users.py:127
+msgid "Don't watch"
+msgstr ""
+
+#: conf/admin/forms/users.py:116 conf/admin/forms/users.py:128
+msgid "Put on watched threads list"
+msgstr ""
+
+#: conf/admin/forms/users.py:119 conf/admin/forms/users.py:131
+msgid "Put on watched threads list and e-mail user when somebody replies"
+msgstr ""
+
+#: conf/admin/forms/users.py:125
+msgid "Replied threads"
+msgstr ""
+
+#: conf/admin/forms/users.py:138
+msgid "Number of users displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/users.py:143
+msgid ""
+"If number of users to be displayed on the last page is less or equal to "
+"number specified in this setting, those users will instead be displayed on "
+"previous page, reducing the total number of pages on the list."
+msgstr ""
+
+#: conf/admin/forms/users.py:151
+msgid "Maximum age in days of posts that should count to the ranking"
+msgstr ""
+
+#: conf/admin/forms/users.py:155
+msgid "Maximum number of ranked users"
+msgstr ""
+
+#: conf/admin/forms/users.py:158
+msgid "Allow users to download their data"
+msgstr ""
+
+#: conf/admin/forms/users.py:160
+msgid "Maximum age in hours of data downloads before they expire"
+msgstr ""
+
+#: conf/admin/forms/users.py:162
+msgid ""
+"Data downloads older than specified will have their files deleted and will "
+"be marked as expired."
+msgstr ""
+
+#: conf/admin/forms/users.py:169
+msgid "Allow users to delete their own accounts"
+msgstr ""
+
+#: conf/admin/forms/users.py:173
+msgid "IP storage time"
+msgstr ""
+
+#: conf/admin/forms/users.py:175
+msgid ""
+"Number of days for which users IP addresses are stored in forum database. "
+"Enter zero to store registered IP addresses forever. Deleting user account "
+"always deletes the IP addresses associated with it."
+msgstr ""
+
+#: conf/admin/forms/users.py:183
+msgid "Anonymous username"
+msgstr ""
+
+#: conf/admin/forms/users.py:185
+msgid ""
+"This username is displayed instead of delete user's actual name next to "
+"their content."
+msgstr ""
+
+#: conf/admin/forms/users.py:202 icons/admin/forms.py:117
+#, python-format
+msgid "Uploaded image's edge should be at least %(size)s pixels long."
+msgstr ""
+
+#: conf/admin/forms/users.py:215
+msgid "This value must be lower than number of users per page."
+msgstr ""
+
+#: conf/admin/views.py:39
+msgid "Settings have been saved."
+msgstr ""
+
+#: core/errorpages.py:51
+msgid "Permission denied."
+msgstr ""
+
+#: core/errorpages.py:80
+msgid ""
+"A problem was encountered when disconnecting your account from the remote "
+"site."
+msgstr ""
+
+#: core/errorpages.py:84
+msgid ""
+"You are not allowed to disconnect your account from the other site, because "
+"currently it's the only way to sign in to your account."
+msgstr ""
+
+#: core/errorpages.py:89
+#, python-format
+msgid "A problem was encountered when signing you in using %(backend)s."
+msgstr ""
+
+#: core/errorpages.py:93
+msgid "The sign in process has been canceled by user."
+msgstr ""
+
+#: core/errorpages.py:95
+msgid "The other service could not be reached."
+msgstr ""
+
+#: core/errorpages.py:101
+msgid "Unexpected problem has been encountered during sign in process."
+msgstr ""
+
+#: core/errorpages.py:122
+msgid ""
+"Your request was rejected because your browser didn't send the CSRF cookie, "
+"or the cookie sent was invalid."
+msgstr ""
+
+#: core/rest_permissions.py:9
+msgid "This action is not available to guests."
+msgstr ""
+
+#: core/templatetags/misago_pagetitle.py:10
+#: templates/misago/thread/private_thread.html:7
+#: templates/misago/thread/thread.html:7
+#, python-format
+msgid "page: %(page)s"
+msgstr ""
+
+#: core/validators.py:10
+msgid "Value has to contain alpha-numerical characters."
+msgstr ""
+
+#: core/validators.py:12
+msgid "Value is too long."
+msgstr ""
+
+#: core/validators.py:26
+msgid "Uploaded image is not a square."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:27
+msgid "The site is running using unreleased version of Misago."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:29
+msgid ""
+"Unreleased versions of Misago can lack security features and there is no "
+"supported way to upgrade them to release versions later."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:42
+msgid "Failed to connect to pypi.org API. Try again later."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:44
+#: templates/misago/admin/dashboard/checks.html:17
+#: templates/misago/admin/dashboard/index.html:33
+msgid ""
+"Version check feature relies on the API operated by the Python Package Index "
+"(pypi.org) API to retrieve latest Misago release version."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:70
+msgid "The site is running updated version of Misago."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:71
+#, python-format
+msgid "Misago %(version)s is latest release."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:77
+msgid "The site is running outdated version of Misago."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:79
+#, python-format
+msgid ""
+"The site is running Misago version %(version)s while version %(latest)s is "
+"available."
+msgstr ""
+
+#: icons/admin/__init__.py:15
+msgid "Icons"
+msgstr ""
+
+#: icons/admin/__init__.py:16
+msgid "Upload favicon and application icon for the site."
+msgstr ""
+
+#: icons/admin/forms.py:21 icons/admin/forms.py:28
+msgid "Upload image"
+msgstr ""
+
+#: icons/admin/forms.py:22
+msgid "Uploaded image should be a square that is 48px wide and tall."
+msgstr ""
+
+#: icons/admin/forms.py:25 icons/admin/forms.py:33
+msgid "Delete custom icon"
+msgstr ""
+
+#: icons/admin/forms.py:29
+msgid "Uploaded image should be square at least 180px wide and tall."
+msgstr ""
+
+#: icons/admin/forms.py:124
+msgid "Uploaded image was not gif, jpeg or png."
+msgstr ""
+
+#: icons/admin/views.py:17
+msgid "Icons have been updated."
+msgstr ""
+
+#: legal/admin/__init__.py:35
+msgid "Legal agreements"
+msgstr ""
+
+#: legal/admin/__init__.py:36
+msgid "Set terms of service and privacy policy contents."
+msgstr ""
+
+#: legal/admin/forms.py:11 legal/admin/forms.py:64
+#: templates/misago/admin/agreements/list.html:19
+#: templates/misago/admin/attachmenttypes/list.html:16
+#: templates/misago/admin/bans/list.html:18
+#: templates/misago/admin/themes/assets/media.html:24
+#: templates/misago/admin/users/edit.html:300 users/admin/forms.py:569
+msgid "Type"
+msgstr ""
+
+#: legal/admin/forms.py:13 menus/admin/forms.py:10
+#: templates/misago/admin/ranks/list.html:19
+msgid "Title"
+msgstr ""
+
+#: legal/admin/forms.py:14
+msgid "Optional, leave empty for agreement to be named after its type."
+msgstr ""
+
+#: legal/admin/forms.py:18
+msgid "Active for its type"
+msgstr ""
+
+#: legal/admin/forms.py:20
+msgid ""
+"If other agreement is already active for this type, it will be unset and "
+"replaced with this one. Misago will ask users who didn't accept this "
+"agreement to do so before allowing them to continue using the site."
+msgstr ""
+
+#: legal/admin/forms.py:27 templates/misago/admin/themes/assets/css.html:17
+msgid "Link"
+msgstr ""
+
+#: legal/admin/forms.py:29
+msgid "If your agreement is located on other page, enter here a link to it."
+msgstr ""
+
+#: legal/admin/forms.py:35
+msgid "You can use Markdown syntax for rich text elements."
+msgstr ""
+
+#: legal/admin/forms.py:48
+msgid "Please fill in agreement link or text."
+msgstr ""
+
+#: legal/admin/forms.py:66 threads/admin/forms.py:8
+msgid "All types"
+msgstr ""
+
+#: legal/admin/forms.py:68
+msgid "Content"
+msgstr ""
+
+#: legal/admin/views.py:16
+msgid "Requested agreement does not exist."
+msgstr ""
+
+#: legal/admin/views.py:29 threads/admin/views/attachments.py:26
+#: users/admin/views/bans.py:24 users/admin/views/datadownloads.py:22
+#: users/admin/views/users.py:63
+msgid "From newest"
+msgstr ""
+
+#: legal/admin/views.py:29 threads/admin/views/attachments.py:27
+#: users/admin/views/bans.py:25 users/admin/views/datadownloads.py:22
+#: users/admin/views/users.py:64
+msgid "From oldest"
+msgstr ""
+
+#: legal/admin/views.py:31
+msgid "With agreements: 0"
+msgstr ""
+
+#: legal/admin/views.py:32
+msgid "Select agreements"
+msgstr ""
+
+#: legal/admin/views.py:36
+msgid "Delete agreements"
+msgstr ""
+
+#: legal/admin/views.py:37
+msgid "Are you sure you want to delete those agreements?"
+msgstr ""
+
+#: legal/admin/views.py:48
+msgid "Selected agreements have been deleted."
+msgstr ""
+
+#: legal/admin/views.py:52
+#, python-format
+msgid "New agreement \"%(title)s\" has been saved."
+msgstr ""
+
+#: legal/admin/views.py:63
+#, python-format
+msgid "Agreement \"%(title)s\" has been edited."
+msgstr ""
+
+#: legal/admin/views.py:78
+#, python-format
+msgid "Agreement \"%(title)s\" has been deleted."
+msgstr ""
+
+#: legal/admin/views.py:86
+#, python-format
+msgid "Agreement \"%(title)s\" has been set as active for type \"%(type)s\"."
+msgstr ""
+
+#: legal/admin/views.py:98
+#, python-format
+msgid "Agreement \"%(title)s\" has been disabled."
+msgstr ""
+
+#: legal/api.py:17
+msgid "You have already accepted this agreement."
+msgstr ""
+
+#: legal/api.py:26
+msgid "You need to submit a valid choice."
+msgstr ""
+
+#: legal/models.py:42 templates/misago/footer.html:29
+msgid "Terms of service"
+msgstr ""
+
+#: legal/models.py:43 templates/misago/footer.html:34
+msgid "Privacy policy"
+msgstr ""
+
+#: markup/finalize.py:24
+#, python-format
+msgid "%(title)s has written:"
+msgstr ""
+
+#: markup/finalize.py:26
+msgid "Quoted message:"
+msgstr ""
+
+#: markup/finalize.py:33
+#, python-format
+msgid "%(title)s:"
+msgstr ""
+
+#: markup/finalize.py:35
+msgid "Spoiler:"
+msgstr ""
+
+#: markup/finalize.py:40
+msgid "Reveal spoiler"
+msgstr ""
+
+#: menus/admin/__init__.py:31
+msgid "Menu items"
+msgstr ""
+
+#: menus/admin/__init__.py:33
+msgid "Use those options to add custom items to the navbar and footer menus."
+msgstr ""
+
+#: menus/admin/forms.py:12
+msgid "URL"
+msgstr ""
+
+#: menus/admin/forms.py:12
+msgid "URL where this item will point to."
+msgstr ""
+
+#: menus/admin/forms.py:15
+msgid "Menu"
+msgstr ""
+
+#: menus/admin/forms.py:17
+msgid "Menu in which this item will be displayed."
+msgstr ""
+
+#: menus/admin/forms.py:21
+msgid "If you want to set custom value for link's \"class\"."
+msgstr ""
+
+#: menus/admin/forms.py:25
+msgid "Open this link in new window"
+msgstr ""
+
+#: menus/admin/forms.py:27
+msgid ""
+"Enabling this option will result in the target=\"_blank\" attribute being "
+"added to this link's HTML element."
+msgstr ""
+
+#: menus/admin/forms.py:33
+msgid "Rel attribute"
+msgstr ""
+
+#: menus/admin/forms.py:35
+msgid "Optional \"rel\" attribute that this item will use (ex. \"nofollow\")."
+msgstr ""
+
+#: menus/admin/views.py:16
+msgid "Requested menu item does not exist."
+msgstr ""
+
+#: menus/admin/views.py:30
+msgid "Delete items"
+msgstr ""
+
+#: menus/admin/views.py:31
+msgid "Are you sure you want to delete those menu items?"
+msgstr ""
+
+#: menus/admin/views.py:38
+msgid "Selected menu items have been deleted."
+msgstr ""
+
+#: menus/admin/views.py:42
+#, python-format
+msgid "New menu item %(item)s has been saved."
+msgstr ""
+
+#: menus/admin/views.py:52
+#, python-format
+msgid "Menu item %(item)s has been edited."
+msgstr ""
+
+#: menus/admin/views.py:64
+#, python-format
+msgid "Menu item %(item)s has been deleted."
+msgstr ""
+
+#: menus/admin/views.py:82
+#, python-format
+msgid "Menu item %(item)s has been moved after %(other)s."
+msgstr ""
+
+#: menus/admin/views.py:101
+#, python-format
+msgid "Menu item %(item)s has been moved before %(other)s."
+msgstr ""
+
+#: menus/models.py:10
+msgid "Navbar and footer"
+msgstr ""
+
+#: menus/models.py:11 templates/misago/admin/menuitems/list.html:41
+msgid "Navbar"
+msgstr ""
+
+#: menus/models.py:12 templates/misago/admin/menuitems/list.html:46
+msgid "Footer"
+msgstr ""
+
+#: search/api.py:17 search/views.py:12 search/views.py:21
+msgid "You don't have permission to search site."
+msgstr ""
+
+#: search/permissions.py:10 templates/misago/search.html:23
+#: templates/misago/search.html:34
+msgid "Search"
+msgstr ""
+
+#: search/permissions.py:12
+msgid "Can search site"
+msgstr ""
+
+#: socialauth/admin/__init__.py:40
+msgid "Social login"
+msgstr ""
+
+#: socialauth/admin/__init__.py:42
+msgid "Enable users to sign on and login using their social profile."
+msgstr ""
+
+#: socialauth/admin/forms/base.py:10
+msgid "Button text"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:11
+msgid "Button color"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:12
+msgid "Enable this provider"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:37
+msgid "Associate existing users by email"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:39
+msgid ""
+"Enabling this option will result in the user being signed in if their forum "
+"account was registered using same e-mail address as used on the social site. "
+"Otherwise they will be asked to specify a different e-mail to continue sign "
+"in using social site."
+msgstr ""
+
+#: socialauth/admin/forms/base.py:51 socialauth/admin/forms/base.py:53
+#: threads/admin/forms.py:97
+msgid "This field is required."
+msgstr ""
+
+#: socialauth/admin/forms/facebook.py:8
+msgid "App ID"
+msgstr ""
+
+#: socialauth/admin/forms/facebook.py:9
+msgid "App Secret"
+msgstr ""
+
+#: socialauth/admin/forms/github.py:8 socialauth/admin/forms/google.py:8
+msgid "Client ID"
+msgstr ""
+
+#: socialauth/admin/forms/github.py:9 socialauth/admin/forms/google.py:9
+msgid "Client Secret"
+msgstr ""
+
+#: socialauth/admin/forms/twitter.py:8
+msgid "Consumer API key"
+msgstr ""
+
+#: socialauth/admin/forms/twitter.py:9
+msgid "Consumer API secret key"
+msgstr ""
+
+#: socialauth/admin/views.py:15
+msgid "Requested social login provider does not exist."
+msgstr ""
+
+#: socialauth/admin/views.py:61
+#, python-format
+msgid "Login with %(provider)s has been updated."
+msgstr ""
+
+#: socialauth/admin/views.py:71
+#, python-format
+msgid "Login with %(provider)s has been disabled."
+msgstr ""
+
+#: socialauth/admin/views.py:91
+#, python-format
+msgid "Login with %(provider)s has been moved after %(other)s."
+msgstr ""
+
+#: socialauth/admin/views.py:112
+#, python-format
+msgid "Login with %(provider)s has been moved before %(other)s."
+msgstr ""
+
+#: socialauth/pipeline.py:88
+#, python-format
+msgid ""
+"The e-mail address associated with your %(backend)s account is not available "
+"for use on this site."
+msgstr ""
+
+#: socialauth/pipeline.py:98
+#, python-format
+msgid ""
+"Your account has to be activated by site administrator before you will be "
+"able to sign in with %(backend)s."
+msgstr ""
+
+#: socialauth/pipeline.py:223 users/api/userendpoints/create.py:60
+msgid "Please try resubmitting the form."
+msgstr ""
+
+#: templates/misago/acl_debug.html:5
+#, python-format
+msgid ""
+"\n"
+"    %(user)s roles\n"
+"    "
+msgstr ""
+
+#: templates/misago/acl_debug.html:9
+msgid "Anonymous roles"
+msgstr ""
+
+#: templates/misago/acl_debug.html:30
+msgid "Current ACL"
+msgstr ""
+
+#: templates/misago/acl_debug.html:34
+msgid "Key"
+msgstr ""
+
+#: templates/misago/acl_debug.html:35
+msgid "Value"
+msgstr ""
+
+#: templates/misago/activation/done.html:5
+msgid "Account activated"
+msgstr ""
+
+#: templates/misago/activation/done.html:20
+msgid ""
+"You can now sign in to finish setting up your account and to participate in "
+"or start new discussions."
+msgstr ""
+
+#: templates/misago/activation/error.html:5
+msgid "Activation error"
+msgstr ""
+
+#: templates/misago/activation/error.html:19
+msgid "Can't activate account."
+msgstr ""
+
+#: templates/misago/activation/request.html:5
+#: templates/misago/activation/request.html:13
+msgid "Request activation link"
+msgstr ""
+
+#: templates/misago/activation/request.html:25
+msgid ""
+"The site administrator may impose a requirement on newly registered accounts "
+"to be activated before users will be able to sign in."
+msgstr ""
+
+#: templates/misago/activation/request.html:28
+msgid ""
+"Depending on the time of registration, you will be able to activate your "
+"account by clicking a special activation link. This link will be valid only "
+"for your browser, for seven days or until your account is activated."
+msgstr ""
+
+#: templates/misago/activation/request.html:31
+msgid ""
+"To receive this link, enter your account's e-mail address in the form and "
+"press the \"Send link\" button."
+msgstr ""
+
+#: templates/misago/activation/request.html:49
+msgid "To request a new activation link please enable JavaScript."
+msgstr ""
+
+#: templates/misago/activation/stopped.html:5
+msgid "Activation failed"
+msgstr ""
+
+#: templates/misago/activation/stopped.html:20
+msgid "Your account can't be activated at this time."
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:9
+#: templates/misago/admin/agreements/form.html:40
+#: templates/misago/admin/agreements/list.html:9
+msgid "New agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:29
+#: templates/misago/admin/categories/form.html:35
+#: templates/misago/admin/categoryroles/categoryroles.html:30
+#: templates/misago/admin/ranks/form.html:29
+#: templates/misago/admin/users/edit.html:23
+msgid "View on site"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:38
+#: templates/misago/admin/agreements/list.html:107
+msgid "Edit agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:48
+#: templates/misago/admin/categoryroles/form.html:36
+#: templates/misago/admin/conf/captcha_settings.html:8
+#: templates/misago/admin/menuitems/form.html:41
+#: templates/misago/admin/roles/form.html:36
+msgid "Basic settings"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:58
+msgid "Agreement contents"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:61
+msgid "Fill in one of the fields."
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:17
+#: templates/misago/admin/users/edit.html:299
+msgid "Agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:20
+msgid "Created"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:21
+#: templates/misago/admin/themes/assets/css.html:32
+#: templates/misago/admin/themes/assets/media.html:22
+msgid "Modified"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:41
+msgid "Users are required to accept this agreement to use the site"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:42
+#: templates/misago/admin/themes/list.html:51 users/admin/forms.py:587
+msgid "Active"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:60
+#, python-format
+msgid "%(created_on)s by %(created_by)s"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:78
+#, python-format
+msgid "%(last_modified_on)s by %(last_modified_by)s"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:82
+msgid "never"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:95
+#: templates/misago/admin/themes/list.html:78
+msgid "Set as active"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:102
+msgid "Disable agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:112
+msgid "Remove agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:124
+msgid "No agreements matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:126
+msgid "No agreements are set."
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:137
+msgid "Are you sure you want to set this agreement as active for its type?"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:141
+msgid "Are you sure you want to disable this agreement?"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:145
+msgid "Are you sure you want to remove this agreement?"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:7
+msgid "Attachment"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:8
+msgid "Thread"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:48
+#, python-format
+msgid "%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s."
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:59
+msgid "None"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:66
+#: templates/misago/admin/warnings/list.html:112
+#: templates/misago/poll/results.html:76
+msgid "Delete"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:76
+msgid "No attachments matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:78
+msgid "No attachments exist."
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:113
+msgid "Are you sure you want to delete this attachment?"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:9
+#: templates/misago/admin/attachmenttypes/list.html:9
+msgid "New type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:26
+msgid "Edit attachment type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:28
+msgid "New attachment type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:36
+#: templates/misago/admin/warnings/form.html:34
+msgid "Basic options"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:47
+msgid "Availability"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:18
+msgid "Extensions"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:19
+#: threads/admin/forms.py:56
+msgid "Mimetypes"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:20
+msgid "Files"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:33
+msgid "Uploading new files of this type is disabled"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:34
+msgid "Limited"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:37
+msgid "Uploading and downloading files of this type is disabled"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:38
+#: templates/misago/admin/users/edit.html:67
+#: templates/misago/admin/users/list.html:70
+msgid "Disabled"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:57
+#: templates/misago/admin/categories/list.html:45
+#: templates/misago/admin/menuitems/list.html:54
+#: templates/misago/admin/ranks/list.html:59
+#: templates/misago/admin/ranks/list.html:66
+msgid "Not set"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:70
+msgid "Edit type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:75
+msgid "Delete type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:86
+msgid "No attachment types are set."
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:95
+msgid "Are you sure you want to delete this attachment type?"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:9
+#: templates/misago/admin/bans/form.html:28
+#: templates/misago/admin/bans/list.html:9
+msgid "New ban"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:26
+#: templates/misago/admin/bans/list.html:65
+msgid "Edit ban"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:36
+#: templates/misago/admin/users/ban.html:62
+msgid "Ban settings"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:47
+#: templates/misago/admin/users/ban.html:71
+msgid "Messages"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:61
+#: templates/misago/admin/bans/list.html:54
+#: templates/misago/admin/users/ban.html:90
+msgid "Never"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:62
+#: templates/misago/admin/users/ban.html:91
+msgid "Set date"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:16
+msgid "Ban"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:19
+msgid "Expires on"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:36 users/admin/forms.py:580
+msgid "Registration only"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:41 users/admin/forms.py:587
+#: users/models/datadownload.py:29
+msgid "Expired"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:70
+msgid "Remove ban"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:82
+msgid "No bans matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:84
+msgid "No bans are set."
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:95
+msgid "Are you sure you want to remove this ban?"
+msgstr ""
+
+#: templates/misago/admin/base.html:7 templates/misago/admin/login.html:6
+msgid "Misago Administration"
+msgstr ""
+
+#: templates/misago/admin/categories/delete.html:6
+#, python-format
+msgid "Delete category: %(category)s"
+msgstr ""
+
+#: templates/misago/admin/categories/delete.html:21
+#: templates/misago/admin/categories/delete.html:39
+#: templates/misago/admin/categories/list.html:97
+msgid "Delete category"
+msgstr ""
+
+#: templates/misago/admin/categories/delete.html:27
+msgid "Category contents"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:9
+#: templates/misago/admin/categories/form.html:46
+#: templates/misago/admin/categories/list.html:9
+msgid "New category"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:29
+msgid "Edit permissions"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:44
+#: templates/misago/admin/categories/list.html:94
+#: templates/misago/admin/categoryroles/categoryroles.html:24
+msgid "Edit category"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:54
+msgid "Display and position"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:65
+msgid "Behaviour"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:74
+msgid "Content approval"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:84
+msgid "Prune threads"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:17
+msgid "Category"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:20
+#: templates/misago/admin/dashboard/index.html:45
+#: templates/misago/admin/dashboard/totals.html:31
+#: templates/misago/admin/users/list.html:21
+#: templates/misago/profile/posts.html:5 templates/misago/profile/posts.html:8
+#: templates/misago/profile/posts.html:9 users/apps.py:93
+msgid "Posts"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:58
+#: templates/misago/admin/menuitems/list.html:72
+#: templates/misago/admin/ranks/list.html:74
+#: templates/misago/admin/socialauth/list.html:32
+#: templates/misago/admin/themes/assets/css.html:68
+#: templates/misago/admin/warnings/list.html:84
+msgid "Move down"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:72
+#: templates/misago/admin/menuitems/list.html:86
+#: templates/misago/admin/ranks/list.html:88
+#: templates/misago/admin/socialauth/list.html:46
+#: templates/misago/admin/themes/assets/css.html:73
+#: templates/misago/admin/warnings/list.html:96
+msgid "Move up"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:107
+msgid "No categories are set."
+msgstr ""
+
+#: templates/misago/admin/categoryroles/categoryroles.html:6
+#, python-format
+msgid "%(category)s: Permissions"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/categoryroles.html:59
+#: templates/misago/admin/categoryroles/rolecategories.html:56
+msgid "Are you sure you want to abandon changes?"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/form.html:9
+#: templates/misago/admin/categoryroles/form.html:28
+msgid "New category role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/form.html:26
+msgid "Edit category role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:9
+#: templates/misago/admin/roles/form.html:9
+#: templates/misago/admin/roles/form.html:28
+#: templates/misago/admin/roles/list.html:9
+msgid "New role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:16 users/admin/forms.py:250
+msgid "Roles"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:34
+#: templates/misago/admin/categoryroles/rolecategories.html:24
+#: templates/misago/admin/roles/form.html:26
+#: templates/misago/admin/roles/list.html:42
+msgid "Edit role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:39
+#: templates/misago/admin/roles/list.html:47
+msgid "Delete role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:50
+msgid "No category roles are set."
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:59
+#: templates/misago/admin/roles/list.html:67
+msgid "Are you sure you want to delete this role?"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/rolecategories.html:6
+#, python-format
+msgid "%(role)s: Category permissions"
+msgstr ""
+
+#: templates/misago/admin/conf/analytics_settings.html:8
+msgid "Google Analytics and Search Console"
+msgstr ""
+
+#: templates/misago/admin/conf/captcha_settings.html:16
+msgid "reCAPTCHA"
+msgstr ""
+
+#: templates/misago/admin/conf/captcha_settings.html:35
+msgid "Stop Forum Spam"
+msgstr ""
+
+#: templates/misago/admin/conf/form.html:16
+#: templates/misago/admin/socialauth/list.html:63
+msgid "Change settings"
+msgstr ""
+
+#: templates/misago/admin/conf/form.html:27
+#: templates/misago/admin/generic/form.html:25
+msgid "Form was completed with errors."
+msgstr ""
+
+#: templates/misago/admin/conf/form.html:37
+#: templates/misago/admin/generic/form.html:45
+#: templates/misago/admin/themes/assets/css-editor-form.html:60
+#: templates/misago/emails/change_email.html:16
+#: templates/misago/emails/change_password.html:16
+msgid "Save changes"
+msgstr ""
+
+#: templates/misago/admin/conf/general_settings.html:8
+msgid "Site details"
+msgstr ""
+
+#: templates/misago/admin/conf/general_settings.html:35
+msgid "Open Graph image"
+msgstr ""
+
+#: templates/misago/admin/conf/general_settings.html:49
+msgid "Forum index"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:8
+msgid "Posting"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:26
+msgid "Threads lists"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:34
+msgid "Thread pages"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:44
+msgid "Read-tracker"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:52
+msgid "Attachment error images"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:8
+msgid "New accounts"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:17 users/admin/forms.py:484
+#: users/admin/forms.py:573
+msgid "Usernames"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:27
+msgid "Avatars"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:43
+msgid "Signatures"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:51
+#: users/admin/__init__.py:80
+msgid "Data downloads"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:60
+msgid "Own account deletion"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:68 users/admin/forms.py:492
+msgid "IP addresses"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:76
+msgid "Default subscription preferences"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:85
+msgid "Users lists"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:94
+msgid "Top posters ranking"
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:5
+msgid "System checks"
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:16
+#: templates/misago/admin/dashboard/index.html:32
+msgid "Checking Misago version used by the site..."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:30
+msgid "The site is running in DEBUG mode."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:31
+msgid ""
+"Error pages displayed in DEBUG mode will expose site configuration details "
+"like secrets and tokens to all visitors. This is MAJOR security risk."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:48
+msgid "Forum address is not configured."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:49
+msgid "Links in e-mails sent by Misago will be broken."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:69
+msgid "Configured forum address appears to be incorrect."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:77
+#, python-format
+msgid ""
+"Your forum address is set to %(configured_address)s while correct value "
+"appears to be %(correct_address)s."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:82
+msgid "Links in e-mails sentby Misagoill be broken."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:102
+msgid "The site is not running over HTTPS."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:103
+msgid ""
+"Browsers may warn users visiting the site about it being insecure. Search "
+"engines will lower its position in search results."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:117
+msgid "Cache is disabled."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:118
+msgid ""
+"This will cause degraded performance and increased CPU usage by the site, "
+"possibly leading to increased hosting costs."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:133
+#, python-format
+msgid "There is %(downloads)s unprocessed data download request."
+msgid_plural "There are %(downloads)s unprocessed data download requests."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/dashboard/checks.html:139
+msgid ""
+"Cron task that should process user data download requests is not running."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:156
+#, python-format
+msgid "There is %(users)s inactive user accounts."
+msgid_plural "There are %(users)s inactive users accounts."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/dashboard/checks.html:162
+msgid ""
+"The site may be targeted by bots, is not sending activation e-mails, or is "
+"not configured to delete inactive user accounts."
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:28
+msgid "Version check is currently unavailable due to an error."
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:29
+msgid "Misago admin API did not answer or answered with an error."
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:42
+msgid "User registrations"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:43
+msgid "User deletions"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:44
+msgid "Threads started"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:46
+msgid "Attachments uploaded"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:47
+msgid "Data download requests"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:49
+msgid "Site analytics are currently unavailable due to an error."
+msgstr ""
+
+#: templates/misago/admin/dashboard/totals.html:43 threads/admin/__init__.py:36
+#: threads/permissions/attachments.py:11 threads/permissions/attachments.py:29
+msgid "Attachments"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/form.html:6
+#: templates/misago/admin/datadownloads/form.html:11
+msgid "Request new data downloads"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:9
+msgid "New downloads"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:17
+#: templates/misago/admin/users/ban.html:28
+#: templates/misago/admin/users/list.html:17 users/admin/forms.py:670
+msgid "User"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:18 threads/admin/forms.py:58
+#: users/admin/forms.py:668
+msgid "Status"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:19
+msgid "Requested on"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:21 users/admin/forms.py:671
+msgid "Requested by"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:32
+#: templates/misago/admin/datadownloads/list.html:51
+#: templates/misago/admin/datadownloads/list.html:54
+#: templates/misago/admin/users/ban.html:38
+#: templates/misago/admin/users/edit.html:38
+#: templates/misago/admin/users/edit.html:195
+#: templates/misago/admin/users/list.html:32
+#: templates/misago/userslists/active_posters.html:83
+msgid "Avatar"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:70
+#: templates/misago/admin/datadownloads/list.html:74
+msgid "Download"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:84
+msgid "No data downloads matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:86
+msgid "No data downloads exist."
+msgstr ""
+
+#: templates/misago/admin/errorpages/403.html:5
+#: templates/misago/errorpages/403.html:5
+msgid "Page not available"
+msgstr ""
+
+#: templates/misago/admin/errorpages/403.html:12
+msgid "Requested page is not available"
+msgstr ""
+
+#: templates/misago/admin/errorpages/403.html:18
+#: templates/misago/errorpages/403.html:12
+#: templates/misago/errorpages/403.html:25
+#: templates/misago/errorpages/403.html:34
+#: templates/misago/errorpages/403.html:54
+msgid "You don't have permission to access this page."
+msgstr ""
+
+#: templates/misago/admin/errorpages/404.html:5
+#: templates/misago/errorpages/403.html:17
+#: templates/misago/errorpages/403.html:18
+#: templates/misago/errorpages/404.html:5
+#: templates/misago/errorpages/404.html:13
+#: templates/misago/errorpages/404.html:14
+msgid "Page not found"
+msgstr ""
+
+#: templates/misago/admin/errorpages/404.html:12
+msgid "Requested page could not be found"
+msgstr ""
+
+#: templates/misago/admin/errorpages/404.html:16
+#: templates/misago/errorpages/404.html:9
+#: templates/misago/errorpages/404.html:18
+#: templates/misago/errorpages/404.html:23
+msgid ""
+"The link you clicked was incorrect or the page has been moved or deleted."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure.html:5
+#: templates/misago/admin/errorpages/csrf_failure.html:14
+#: templates/misago/admin/errorpages/csrf_failure_authenticated.html:5
+#: templates/misago/admin/errorpages/csrf_failure_authenticated.html:12
+msgid "Form submission rejected"
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:3
+msgid ""
+"Your form submission was rejected because your browser didn't send the CSRF "
+"cookie, or the cookie sent was invalid."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:6
+msgid "This is usually a result of one of following problems:"
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:9
+msgid "Your browser is configured to don't accept or send any cookies."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:12
+msgid ""
+"The form was sent after being opened in the browser for a long time (eg. few "
+"days) and cookie token has expired."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:15
+msgid ""
+"The site is configured to use the HTTPS, but this form was sent over the the "
+"HTTP."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:16
+msgid ""
+"If you are an owner of this site, please check if the HTTPS certificate used "
+"by the site is valid and accepted by the browser."
+msgstr ""
+
+#: templates/misago/admin/generic/filter_form.html:7
+msgid "Filter"
+msgstr ""
+
+#: templates/misago/admin/generic/filter_form.html:17
+msgid "Clear filters"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:36
+#: templates/misago/admin/themes/assets/css-editor-form.html:69
+#: templates/misago/admin/themes/assets/css-link-form.html:44
+#: templates/misago/admin/themes/assets/upload-css.html:20
+#: templates/misago/admin/themes/assets/upload-media.html:26
+msgid "Cancel"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:42
+#: templates/misago/admin/themes/assets/css-editor-form.html:58
+msgid "Save and keep editing"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:49
+msgid "Save and add another"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:52
+#: templates/misago/admin/themes/assets/css-editor-form.html:62
+msgid "Save"
+msgstr ""
+
+#: templates/misago/admin/generic/list.html:87
+msgid "Filters"
+msgstr ""
+
+#: templates/misago/admin/generic/list.html:90
+#: templates/misago/admin/generic/list.html:105
+#: templates/misago/admin/themes/assets/upload-css.html:7
+#: templates/misago/admin/themes/assets/upload-media.html:7
+msgid "Close"
+msgstr ""
+
+#: templates/misago/admin/generic/list.html:108
+msgid "Done"
+msgstr ""
+
+#: templates/misago/admin/generic/mass_actions.html:10
+msgid "With selected:"
+msgstr ""
+
+#: templates/misago/admin/generic/order_by.html:5
+msgid "Sort:"
+msgstr ""
+
+#: templates/misago/admin/generic/order_by.html:10
+msgid "Change sorting to:"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:4
+#: templates/misago/thread/paginator.html:7
+msgid "Go to first page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:5
+#: templates/misago/admin/generic/paginator.html:9
+msgid "First"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:13
+#: templates/misago/thread/paginator.html:13
+#: templates/misago/thread/paginator.html:19
+#: templates/misago/userslists/rank.html:99
+#: templates/misago/userslists/rank.html:107
+msgid "Go to previous page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:22
+#: templates/misago/thread/paginator.html:27
+#: templates/misago/userslists/rank.html:116
+msgid "Go to next page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:31
+#: templates/misago/thread/paginator.html:32
+msgid "Go to last page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:32
+#: templates/misago/admin/generic/paginator.html:36
+#: templates/misago/thread/toolbar-top.html:20
+msgid "Last"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:41
+#, python-format
+msgid "Page %(page)s of %(pages)s"
+msgstr ""
+
+#: templates/misago/admin/icons.html:8
+msgid "Favicon"
+msgstr ""
+
+#: templates/misago/admin/icons.html:11
+msgid ""
+"Favicon is small icon that internet browsers display next to your site in "
+"its interface."
+msgstr ""
+
+#: templates/misago/admin/icons.html:68
+msgid "Apple Touch Icon"
+msgstr ""
+
+#: templates/misago/admin/icons.html:71
+msgid ""
+"Apple devices and Safari web browser will use this image to represent the "
+"site in its interfaces."
+msgstr ""
+
+#: templates/misago/admin/login.html:6
+msgid "Log in"
+msgstr ""
+
+#: templates/misago/admin/login.html:6
+msgid "Django Administration"
+msgstr ""
+
+#: templates/misago/admin/login.html:24
+msgid "Administration"
+msgstr ""
+
+#: templates/misago/admin/login.html:29 users/captcha.py:19
+msgid "Please try again."
+msgstr ""
+
+#: templates/misago/admin/login.html:48 users/forms/auth.py:60
+msgid "Username or e-mail"
+msgstr ""
+
+#: templates/misago/admin/login.html:53 users/admin/forms.py:67
+#: users/forms/auth.py:63
+msgid "Password"
+msgstr ""
+
+#: templates/misago/admin/login.html:57 templates/misago/auth.html:5
+msgid "Sign in"
+msgstr ""
+
+#: templates/misago/admin/login.html:60
+msgid "Return to site"
+msgstr ""
+
+#: templates/misago/admin/menuitems/form.html:9
+#: templates/misago/admin/menuitems/form.html:33
+#: templates/misago/admin/menuitems/list.html:9
+msgid "New menu item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/form.html:31
+msgid "Edit menu item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/form.html:50
+msgid "Behavior and appearance"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:16
+msgid "Item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:18
+msgid "CSS Class"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:19
+msgid "Target"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:20
+msgid "Rel"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:40
+msgid "Is displayed on the forum navbar."
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:45
+msgid "Is displayed on the forum footer."
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:103
+msgid "Edit item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:108
+msgid "Remove item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:119
+msgid "No menu items are set."
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:129
+msgid "Are you sure you want to remove this menu item?"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:12
+msgid "GitHub"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:16
+msgid "Support forum"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:20
+msgid "Site index"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:24
+msgid "Your avatar"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:29
+msgid "Edit your account"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:35
+msgid "Close admin session"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:41
+msgid "Log out completely"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:9
+#: templates/misago/admin/ranks/form.html:40
+#: templates/misago/admin/ranks/list.html:9
+msgid "New rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:38
+#: templates/misago/admin/ranks/list.html:116
+msgid "Edit rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:48
+msgid "Name and description"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:66
+msgid "Display and visibility"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:17
+#: templates/misago/admin/users/list.html:19
+#: templates/misago/userslists/active_posters.html:112
+#: templates/misago/userslists/active_posters.html:123 users/admin/forms.py:238
+msgid "Rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:45
+msgid "Has dedicated page on users list"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:46
+msgid "Tab"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:50
+msgid "This is default rank assigned to new members"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:51
+msgid "Default"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:105
+msgid "List users"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:111
+msgid "Set as default"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:121
+msgid "Delete rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:132
+msgid "No user ranks are set."
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:141
+msgid "Are you sure you want to delete this rank?"
+msgstr ""
+
+#: templates/misago/admin/roles/list.html:39
+msgid "Users with role"
+msgstr ""
+
+#: templates/misago/admin/roles/list.html:58
+msgid "No user roles are set."
+msgstr ""
+
+#: templates/misago/admin/socialauth/form.html:17
+msgid "Edit social login"
+msgstr ""
+
+#: templates/misago/admin/socialauth/form.html:19
+msgid "Setup social login"
+msgstr ""
+
+#: templates/misago/admin/socialauth/form.html:40
+msgid "Button appearance"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:8
+msgid "Enabled login methods"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:15
+#: templates/misago/admin/socialauth/list.html:106
+msgid "Provider"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:68
+msgid "Disable login"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:79
+msgid "No social login methods are enabled."
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:88
+msgid "Are you sure you want to disable this social login provider?"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:100
+msgid "Setup new login method"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:119
+msgid "Setup login with this provider"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:120
+msgid "Setup"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:127
+msgid "No new login providers are available for setup at this time."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-editor-form.html:9
+#: templates/misago/admin/themes/assets/css-editor-form.html:41
+msgid "New CSS"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-editor-form.html:39
+msgid "Edit CSS"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-link-form.html:9
+#: templates/misago/admin/themes/assets/css-link-form.html:31
+msgid "New CSS link"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-link-form.html:29
+msgid "Edit CSS link"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:7
+msgid "CSS files"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:12
+#: templates/misago/admin/themes/assets/media.html:12
+#: templates/misago/admin/themes/assets/upload-css.html:21
+#: templates/misago/admin/themes/assets/upload-media.html:27
+msgid "Upload"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:22
+msgid "Create"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:33
+#: templates/misago/admin/themes/assets/media.html:23
+msgid "Size"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:80
+#: templates/misago/admin/themes/assets/css.html:84
+#: templates/misago/admin/users/list.html:95
+#: templates/misago/admin/warnings/list.html:105
+#: templates/misago/poll/results.html:69
+#: templates/misago/profile/details.html:25
+#: templates/misago/thread/posts/post/footer.html:31
+#: users/admin/djangoadmin.py:72
+msgid "Edit"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:94
+msgid "This theme has no CSS files."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:103
+#: templates/misago/admin/themes/assets/media.html:79
+msgid "Delete selected"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/list.html:6
+msgid "Assets"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/list.html:22
+#: templates/misago/admin/themes/form.html:38
+msgid "Edit theme"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/list.html:44
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/media.html:7
+msgid "Media"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/media.html:25
+msgid "Dimensions"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/media.html:70
+msgid "This theme has no media."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-css.html:6
+msgid "Upload CSS"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-css.html:15
+msgid "Select CSS files to upload"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:6
+msgid "Upload media"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:15
+msgid "Select media files to upload"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:18
+msgid ""
+"Media files are primarily image and font files that can be linked to from "
+"the CSS, but files of any type can be uploaded using this option."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:21
+msgid ""
+"Theme CSS that use the \"url()\" to point to media files will be updated "
+"automatically."
+msgstr ""
+
+#: templates/misago/admin/themes/form.html:9
+#: templates/misago/admin/themes/form.html:40
+msgid "New theme"
+msgstr ""
+
+#: templates/misago/admin/themes/form.html:29
+#: templates/misago/admin/themes/list.html:63
+msgid "Edit assets"
+msgstr ""
+
+#: templates/misago/admin/themes/form.html:57
+msgid "Additional information (optional)"
+msgstr ""
+
+#: templates/misago/admin/themes/import.html:6
+#: templates/misago/admin/themes/import.html:11
+#: templates/misago/admin/themes/list.html:9
+msgid "Import theme"
+msgstr ""
+
+#: templates/misago/admin/themes/import.html:23
+msgid "Import"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:15
+msgid "Create theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:22
+msgid "Theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:68
+msgid "Edit information"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:72
+msgid "Create child theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:86
+msgid "Export theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:94
+msgid "Delete theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:109
+msgid ""
+"Are you sure you want to delete this theme? Deleting theme will also delete "
+"its child themes."
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:6
+#: templates/misago/admin/users/ban.html:82 users/admin/views/users.py:74
+msgid "Ban users"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:11
+msgid "Ban selected users"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:29 users/admin/forms.py:314
+#: users/signals.py:30
+msgid "E-mail"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:30 users/models/ban.py:73
+msgid "IP address"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:51
+#: templates/misago/admin/users/list.html:85
+msgid "IP removed"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:31
+#: templates/misago/admin/users/list.html:94
+msgid "Edit user"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:44
+#: templates/misago/admin/users/list.html:47
+msgid "Can use admin control panel and manage other administrators"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:45
+#: templates/misago/admin/users/list.html:48
+msgid "Super Admin"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:48
+#: templates/misago/admin/users/list.html:51
+msgid "Can use admin control panel"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:49
+#: templates/misago/admin/users/list.html:52
+msgid "Admin"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:53
+#: templates/misago/admin/users/list.html:56
+msgid "Requires activation by administrator"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:54
+#: templates/misago/admin/users/edit.html:58
+#: templates/misago/admin/users/list.html:57
+#: templates/misago/admin/users/list.html:61
+msgid "Inactive"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:57
+#: templates/misago/admin/users/list.html:60
+msgid "Has to activate their account"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:62
+#: templates/misago/admin/users/list.html:65
+msgid "Account scheduled for deletion"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:63
+#: templates/misago/admin/users/list.html:66
+msgid "Deleted"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:66
+#: templates/misago/admin/users/list.html:69 users/admin/forms.py:317
+msgid "Account disabled"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:92
+#: templates/misago/categories/stats.html:12
+#: templates/misago/thread/posts/post/side.html:41
+#: templates/misago/thread/posts/post/side.html:49
+#: templates/misago/userslists/usercard.html:52
+#, python-format
+msgid "%(posts)s post"
+msgid_plural "%(posts)s posts"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/users/edit.html:99
+#: templates/misago/categories/stats.html:5
+#: templates/misago/userslists/usercard.html:59
+#, python-format
+msgid "%(threads)s thread"
+msgid_plural "%(threads)s threads"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/users/edit.html:110
+#: templates/misago/admin/users/new.html:18
+msgid "Basic account settings"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:129
+msgid "Administrator status"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:136
+msgid "Only superusers can change other users administrator status."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:180
+#: templates/misago/admin/users/new.html:37
+msgid "Sign-in credentials"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:184
+msgid ""
+"This user has not set account password and uses other service to "
+"authenticate."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:205
+msgid "Signature"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:228 users/apps.py:24
+msgid "Forum options"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:237
+msgid "Automatic subscription preferences"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:246
+msgid "Account status"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:250
+msgid ""
+"This user is deleting their account. It has been deactivated for the "
+"duration of the process."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:251
+msgid ""
+"No additional action is required. This account will be deleted automatically."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:294
+msgid "Agreements"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:301
+msgid "Accepted on"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:324
+msgid "This user didn't accept any agreements."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:9
+#: templates/misago/admin/users/new.html:6
+#: templates/misago/admin/users/new.html:11
+msgid "New user"
+msgstr ""
+
+#: templates/misago/admin/users/list.html:20
+msgid "Registration"
+msgstr ""
+
+#: templates/misago/admin/users/list.html:103
+msgid "No users matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:111
+msgid "You can include wildcard (\"*\") in username and email search:"
+msgstr ""
+
+#: templates/misago/admin/users/list.html:114
+msgid "\"admin*\" will find both \"admin\" and \"administrator\"."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:117
+msgid "\"*chan\" will match both \"chan\" and \"marichan\"."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:120
+msgid "\"*son*\" will match \"son\", \"song\", \"firstson\" and \"firstsong\"."
+msgstr ""
+
+#: templates/misago/admin/users/new.html:47
+msgid "Save user"
+msgstr ""
+
+#: templates/misago/admin/warnings/form.html:9
+#: templates/misago/admin/warnings/form.html:19
+#: templates/misago/admin/warnings/list.html:9
+msgid "New warning level"
+msgstr ""
+
+#: templates/misago/admin/warnings/form.html:41
+msgid "Restrictions"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:16
+msgid "Warning level"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:17
+msgid "Length"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:18
+msgid "Replying"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:19
+msgid "Starting threads"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:40
+msgid "Permanent"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:47
+#: templates/misago/admin/warnings/list.html:65
+msgid "Not restricted"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:52
+#: templates/misago/admin/warnings/list.html:70
+msgid "Moderated"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:57
+#: templates/misago/admin/warnings/list.html:75
+msgid "Forbidden"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:122
+msgid "No warning levels are set."
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:131
+msgid "Are you sure you want to delete this warning level?"
+msgstr ""
+
+#: templates/misago/auth.html:10
+msgid "Log out"
+msgstr ""
+
+#: templates/misago/categories/base.html:18
+#: templates/misago/categories/base.html:49
+#: templates/misago/categories/base.html:62
+#, python-format
+msgid ""
+"There is %(categories)s main category currenty available on the "
+"%(forum_name)s."
+msgid_plural ""
+"There are %(categories)s main categories currenty available on the "
+"%(forum_name)s."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/categories/body.html:15
+msgid "No categories exist or you don't have permission to see them."
+msgstr ""
+
+#: templates/misago/categories/icon.html:4
+msgid "This category has no new posts. (closed)"
+msgstr ""
+
+#: templates/misago/categories/icon.html:10
+msgid "This category has new posts. (closed)"
+msgstr ""
+
+#: templates/misago/categories/icon.html:18
+msgid "This category has no new posts."
+msgstr ""
+
+#: templates/misago/categories/icon.html:24
+msgid "This category has new posts."
+msgstr ""
+
+#: templates/misago/categories/last_thread.html:54
+msgid "This category is empty. No threads were posted within it so far."
+msgstr ""
+
+#: templates/misago/categories/last_thread.html:68
+msgid "This category is private. You can see only your own threads within it."
+msgstr ""
+
+#: templates/misago/categories/last_thread.html:82
+msgid "This category is protected. You can't browse it's contents."
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.html:6
+#: templates/misago/emails/activation/by_admin.txt:6
+#, python-format
+msgid "%(user)s, your account has been activated by forum administrator."
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.html:12
+#: templates/misago/emails/register/complete.html:18
+#: templates/misago/emails/register/inactive.html:31
+msgid "this form"
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.html:14
+#, python-format
+msgid "You can now sign in to it using %(login_form)s."
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.txt:10
+msgid "You can now sign in to it using the form below:"
+msgstr ""
+
+#: templates/misago/emails/activation/by_user.html:6
+#: templates/misago/emails/activation/by_user.txt:6
+#, python-format
+msgid "%(user)s, to activate your account click the below link:"
+msgstr ""
+
+#: templates/misago/emails/activation/by_user.html:11
+#: templates/misago/emails/register/inactive.html:27
+msgid "Activate my account!"
+msgstr ""
+
+#: templates/misago/emails/change_email.html:6
+#: templates/misago/emails/change_email.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because you have changed your e-"
+"mail address."
+msgstr ""
+
+#: templates/misago/emails/change_email.html:11
+#: templates/misago/emails/change_email.txt:10
+#: templates/misago/emails/change_password.html:11
+#: templates/misago/emails/change_password.txt:10
+msgid "To confirm this change, click the link below:"
+msgstr ""
+
+#: templates/misago/emails/change_password.html:6
+#: templates/misago/emails/change_password.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because you have changed your "
+"password."
+msgstr ""
+
+#: templates/misago/emails/change_password_form_link.html:6
+#: templates/misago/emails/change_password_form_link.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because you want to change "
+"forgotten password for your forum account."
+msgstr ""
+
+#: templates/misago/emails/change_password_form_link.html:11
+#: templates/misago/emails/change_password_form_link.txt:10
+msgid "To change your account password click the link below:"
+msgstr ""
+
+#: templates/misago/emails/change_password_form_link.html:16
+#: templates/misago/forgottenpassword/form.html:7
+#: templates/misago/forgottenpassword/form.html:20
+#: templates/misago/forgottenpassword/request.html:7
+#: templates/misago/forgottenpassword/request.html:20
+msgid "Set new password"
+msgstr ""
+
+#: templates/misago/emails/data_download.html:6
+#: templates/misago/emails/data_download.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because your data is ready for "
+"download."
+msgstr ""
+
+#: templates/misago/emails/data_download.html:11 users/apps.py:52
+msgid "Download data"
+msgstr ""
+
+#: templates/misago/emails/data_download.html:14
+#: templates/misago/emails/data_download.txt:15
+#, python-format
+msgid ""
+"This link will remain active for %(expires_in)s hour from the time this "
+"message has been sent."
+msgid_plural ""
+"This link will remain active for %(expires_in)s hours from the time this "
+"message has been sent."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/emails/data_download.txt:10
+msgid "To download your data, click the following link:"
+msgstr ""
+
+#: templates/misago/emails/privatethread/added.html:9
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has invited you "
+"to participate in private thread %(thread)s."
+msgstr ""
+
+#: templates/misago/emails/privatethread/added.html:14
+#: templates/misago/emails/privatethread/added.txt:10
+msgid "To read this thread click the link below:"
+msgstr ""
+
+#: templates/misago/emails/privatethread/added.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has invited you "
+"to participate in private thread \"%(thread)s\"."
+msgstr ""
+
+#: templates/misago/emails/register/complete.html:6
+#: templates/misago/emails/register/complete.txt:6
+#: templates/misago/emails/register/inactive.txt:6
+#, python-format
+msgid "%(user)s, thank you for joining us!"
+msgstr ""
+
+#: templates/misago/emails/register/complete.html:12
+#: templates/misago/emails/register/complete.txt:10
+msgid ""
+"You may now join discussion on our forums. Why not spend a minute or two to "
+"have a look around and share your opinions and knowledge with rest of "
+"community?"
+msgstr ""
+
+#: templates/misago/emails/register/complete.html:20
+#, python-format
+msgid "You can always sign in to your account using %(login_form)s."
+msgstr ""
+
+#: templates/misago/emails/register/complete.txt:14
+msgid "You can always sign in to your account using the form below:"
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:7
+#: templates/misago/emails/register/inactive.txt:10
+msgid ""
+"Before you will be able to join discussion on our forums, one of our "
+"administrators will have to activate your account."
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:12
+#: templates/misago/emails/register/inactive.txt:15
+msgid ""
+"This may take a while, but you will receive e-mail with notification once it "
+"happens."
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:17
+#: templates/misago/emails/register/inactive.txt:20
+msgid "Thank you for your patience and see you soon!"
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:22
+#: templates/misago/emails/register/inactive.txt:25
+msgid ""
+"Before you will be able to join discussion on our forums, you have to "
+"activate your account. To do so, simply click the link below:"
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:33
+#, python-format
+msgid ""
+"Once your account is activated, you can always sign in to it using "
+"%(login_form)s."
+msgstr ""
+
+#: templates/misago/emails/register/inactive.txt:30
+msgid ""
+"Once your account is activated, you can always sign in to it using the form "
+"below:"
+msgstr ""
+
+#: templates/misago/emails/thread/reply.html:9
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has replied to "
+"the thread %(thread)s that you are subscribed to."
+msgstr ""
+
+#: templates/misago/emails/thread/reply.html:14
+#: templates/misago/emails/thread/reply.txt:10
+msgid "To read this reply, click the below link:"
+msgstr ""
+
+#: templates/misago/emails/thread/reply.html:17
+msgid "Go to reply"
+msgstr ""
+
+#: templates/misago/emails/thread/reply.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has replied to "
+"the thread \"%(thread)s\" that you are subscribed to."
+msgstr ""
+
+#: templates/misago/errorpages/403.html:50
+msgid "This page is not available."
+msgstr ""
+
+#: templates/misago/errorpages/404.html:38
+msgid "Requested page could not be found."
+msgstr ""
+
+#: templates/misago/errorpages/404.html:39
+msgid ""
+"The link you followed was incorrect or the page has been moved or deleted."
+msgstr ""
+
+#: templates/misago/errorpages/405.html:5
+#: templates/misago/errorpages/405.html:13
+#: templates/misago/errorpages/405.html:14
+msgid "Wrong way"
+msgstr ""
+
+#: templates/misago/errorpages/405.html:9
+#: templates/misago/errorpages/405.html:18
+#: templates/misago/errorpages/405.html:23
+#: templates/misago/errorpages/405.html:39
+msgid "This page should be reached via form submission or pressing button."
+msgstr ""
+
+#: templates/misago/errorpages/405.html:38
+msgid "Page reached in wrong way."
+msgstr ""
+
+#: templates/misago/errorpages/ban_message.html:15
+#, python-format
+msgid "This ban expires on %(expires_on)s."
+msgstr ""
+
+#: templates/misago/errorpages/ban_message.html:19
+msgid "This ban is permanent."
+msgstr ""
+
+#: templates/misago/errorpages/banned.html:5
+msgid "You are banned"
+msgstr ""
+
+#: templates/misago/errorpages/banned.html:9
+msgid "You are banned from accessing this page."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:5
+#: templates/misago/errorpages/csrf_failure_authenticated.html:5
+msgid "Request blocked"
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:9
+msgid ""
+"This is usually caused by your browser not accepting or using outdated "
+"cookies. Check your browser configuration and try again."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:24
+#: templates/misago/errorpages/csrf_failure_authenticated.html:19
+msgid "Suspicious request blocked."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:25
+#: templates/misago/errorpages/csrf_failure_authenticated.html:20
+msgid ""
+"This is usually caused by your browser not accepting or using outdated "
+"cookies."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:26
+#: templates/misago/errorpages/csrf_failure_authenticated.html:21
+msgid "Check your browser configuration and try again."
+msgstr ""
+
+#: templates/misago/errorpages/social.html:5
+#: templates/misago/errorpages/social.html:11
+#: templates/misago/errorpages/social.html:12
+msgid "Problem with sign in"
+msgstr ""
+
+#: templates/misago/errorpages/social.html:38
+msgid ""
+"Please try again or use another method to sign in if the problem persists."
+msgstr ""
+
+#: templates/misago/footer.html:9
+msgid "For complete experience please enable JavaScript."
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:7
+msgid "Set new password error"
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:9
+msgid "Change forgotten password error"
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:26
+msgid "Can't set new password."
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:28
+msgid "Can't change forgotten password."
+msgstr ""
+
+#: templates/misago/forgottenpassword/form.html:9
+#: templates/misago/forgottenpassword/form.html:22
+#: templates/misago/forgottenpassword/request.html:9
+#: templates/misago/forgottenpassword/request.html:22
+msgid "Change forgotten password"
+msgstr ""
+
+#: templates/misago/forgottenpassword/form.html:42
+msgid "To reset your password please enable JavaScript."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:35
+msgid ""
+"Your user account has no password set for it because it was created with "
+"other service."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:36
+msgid ""
+"To set password for your account, you can use special secure form that will "
+"be available by special link valid only for your browser, for seven days or "
+"until your password is set."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:38
+msgid ""
+"Because user passwords are processed in an irreversible way before being "
+"saved to database, it is not possible for us to simply send you your "
+"password."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:39
+msgid ""
+"Instead, you can change your password using special secure form that will be "
+"available by special link valid only for your browser, for seven days or "
+"until your password is changed."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:42
+msgid ""
+"To receive this link, enter your account's e-mail addres in form and press "
+"the \"Send link\" button."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:60
+msgid "To request new password reset link please enable JavaScript."
+msgstr ""
+
+#: templates/misago/options/credentials_changed.html:5
+#: templates/misago/options/credentials_error.html:5
+msgid "Change sign-in credentials"
+msgstr ""
+
+#: templates/misago/options/credentials_changed.html:20
+msgid "From now you will need to use new credentials when signing in."
+msgstr ""
+
+#: templates/misago/options/credentials_error.html:19
+msgid "Change confirmation link is invalid."
+msgstr ""
+
+#: templates/misago/options/credentials_error.html:20
+msgid ""
+"The confirmation link belongs to other user, was already used, or has "
+"expired."
+msgstr ""
+
+#: templates/misago/options/noscript.html:5
+msgid "Change your options"
+msgstr ""
+
+#: templates/misago/options/noscript.html:20
+#: templates/misago/socialauth.html:22
+msgid "Enable JavaScript"
+msgstr ""
+
+#: templates/misago/options/noscript.html:21
+msgid "You need to enable JavaScript in your browser to change your options."
+msgstr ""
+
+#: templates/misago/participants.html:30
+msgid "Add participant"
+msgstr ""
+
+#: templates/misago/participants.html:36
+#, python-format
+msgid "This thread has %(users)s participant."
+msgid_plural "This thread has %(users)s participants."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/info.html:4
+#, python-format
+msgid "%(votes)s vote."
+msgid_plural "%(votes)s votes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/info.html:15
+#, python-format
+msgid "Voting ends on %(ends_on)s."
+msgstr ""
+
+#: templates/misago/poll/info.html:22
+msgid "Votes are public."
+msgstr ""
+
+#: templates/misago/poll/info.html:36
+#, python-format
+msgid "Posted by %(poster)s on %(posted_on)s."
+msgstr ""
+
+#: templates/misago/poll/results.html:21 templates/misago/poll/results.html:31
+#, python-format
+msgid "%(votes)s vote, %(proc)s%% of total."
+msgid_plural "%(votes)s votes, %(proc)s%% of total."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/results.html:41
+msgid "Your choice."
+msgstr ""
+
+#: templates/misago/poll/results.html:55
+msgid "Vote"
+msgstr ""
+
+#: templates/misago/poll/results.html:62
+msgid "See votes"
+msgstr ""
+
+#: templates/misago/poll/voting.html:24
+#, python-format
+msgid "You can select %(choices)s choice."
+msgid_plural "You can select %(choices)s choices."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/voting.html:32
+msgid "You can change your vote later."
+msgstr ""
+
+#: templates/misago/poll/voting.html:36
+msgid "Votes are final."
+msgstr ""
+
+#: templates/misago/poll/voting.html:46
+msgid "Save your vote"
+msgstr ""
+
+#: templates/misago/poll/voting.html:51
+msgid "See results"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:5
+#: templates/misago/profile/ban_details.html:8
+#: templates/misago/profile/ban_details.html:9
+#: templates/misago/profile/ban_details.html:16 users/apps.py:128
+msgid "Ban details"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:22
+msgid "User-shown ban message"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:31
+msgid "Team-shown ban message"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:39
+msgid "Ban expiration"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:43
+#, python-format
+msgid "%(username)s's ban expires on %(expires_on)s."
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:47
+#, python-format
+msgid "%(username)s's ban is permanent."
+msgstr ""
+
+#: templates/misago/profile/base.html:9 templates/misago/profile/base.html:20
+#: templates/misago/profile/base.html:35
+#, python-format
+msgid "%(title)s, joined on %(joined_on)s."
+msgstr ""
+
+#: templates/misago/profile/base.html:22 templates/misago/profile/base.html:37
+#, python-format
+msgid "Wrote %(posts)s post."
+msgid_plural "Wrote %(posts)s posts."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/base.html:26 templates/misago/profile/base.html:41
+#, python-format
+msgid "Started %(threads)s thread."
+msgid_plural "Started %(threads)s threads."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/details.html:5
+#: templates/misago/profile/details.html:8
+#: templates/misago/profile/details.html:9
+#: templates/misago/profile/details.html:19 users/apps.py:115
+msgid "Details"
+msgstr ""
+
+#: templates/misago/profile/details.html:75
+msgid "You are not sharing any details with others."
+msgstr ""
+
+#: templates/misago/profile/details.html:77
+#, python-format
+msgid "%(username)s is not sharing any details with others."
+msgstr ""
+
+#: templates/misago/profile/feed.html:10
+msgid "See post"
+msgstr ""
+
+#: templates/misago/profile/feed.html:61
+#: templates/misago/thread/posts/post/body.html:10
+msgid "This post's contents cannot be displayed."
+msgstr ""
+
+#: templates/misago/profile/feed.html:62
+#: templates/misago/thread/posts/post/body.html:11
+msgid "This error is caused by invalid post content manipulation."
+msgstr ""
+
+#: templates/misago/profile/followers.html:5
+#: templates/misago/profile/followers.html:8
+#: templates/misago/profile/followers.html:9 users/apps.py:103
+msgid "Followers"
+msgstr ""
+
+#: templates/misago/profile/followers.html:18
+#, python-format
+msgid "You have %(users)s follower."
+msgid_plural "You have %(users)s followers."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/followers.html:24
+#, python-format
+msgid "%(username)s has %(users)s follower."
+msgid_plural "%(username)s has %(users)s followers."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/followers.html:49
+msgid "You have no followers."
+msgstr ""
+
+#: templates/misago/profile/followers.html:51
+#, python-format
+msgid "%(username)s has no followers."
+msgstr ""
+
+#: templates/misago/profile/follows.html:5
+#: templates/misago/profile/follows.html:8
+#: templates/misago/profile/follows.html:9 users/apps.py:109
+msgid "Follows"
+msgstr ""
+
+#: templates/misago/profile/follows.html:18
+#, python-format
+msgid "You are following %(users)s user."
+msgid_plural "You are following %(users)s users."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/follows.html:24
+#, python-format
+msgid "%(username)s is following %(users)s user."
+msgid_plural "%(username)s is following %(users)s users."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/follows.html:49
+msgid "You are not following any users."
+msgstr ""
+
+#: templates/misago/profile/follows.html:51
+#, python-format
+msgid "%(username)s is not following any users."
+msgstr ""
+
+#: templates/misago/profile/header.html:7
+msgid "This user is deleting their account."
+msgstr ""
+
+#: templates/misago/profile/header.html:9
+msgid "This user's account has been disabled by administrator."
+msgstr ""
+
+#: templates/misago/profile/header.html:46
+#, python-format
+msgid "Member since %(joined_on)s"
+msgstr ""
+
+#: templates/misago/profile/posts.html:20
+#, python-format
+msgid "You have posted %(posts)s message."
+msgid_plural "You have posted %(posts)s messages."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/posts.html:26
+#, python-format
+msgid "%(username)s has posted %(posts)s message."
+msgid_plural "%(username)s has posted %(posts)s messages."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/posts.html:40
+msgid "You have posted no messages"
+msgstr ""
+
+#: templates/misago/profile/posts.html:42
+#, python-format
+msgid "%(username)s posted no messages."
+msgstr ""
+
+#: templates/misago/profile/threads.html:20
+#, python-format
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/threads.html:26
+#, python-format
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/threads.html:40
+msgid "You have no started threads."
+msgstr ""
+
+#: templates/misago/profile/threads.html:42
+#, python-format
+msgid "%(username)s started no threads."
+msgstr ""
+
+#: templates/misago/profile/username_history.html:5
+#: templates/misago/profile/username_history.html:8
+#: templates/misago/profile/username_history.html:9 users/apps.py:121
+msgid "Username history"
+msgstr ""
+
+#: templates/misago/profile/username_history.html:18
+#, python-format
+msgid "Your username was changed %(changes)s time."
+msgid_plural "Your username was changed %(changes)s times."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/username_history.html:24
+#, python-format
+msgid "%(username)s's username was changed %(changes)s time."
+msgid_plural "%(username)s's username was changed %(changes)s times."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/username_history.html:79
+msgid "Your username was never changed."
+msgstr ""
+
+#: templates/misago/profile/username_history.html:81
+#, python-format
+msgid "%(username)s's username was never changed."
+msgstr ""
+
+#: templates/misago/required_agreement.html:9
+#, python-format
+msgid "Please review the updated %(agreement)s:"
+msgstr ""
+
+#: templates/misago/required_agreement.html:19
+msgid "here"
+msgstr ""
+
+#: templates/misago/required_agreement.html:21
+#, python-format
+msgid "Please review the updated %(agreement)s available %(link)s."
+msgstr ""
+
+#: templates/misago/search.html:5 templates/misago/search.html:8
+#: templates/misago/search.html:9
+msgid "Search site"
+msgstr ""
+
+#: templates/misago/search.html:47
+msgid "Loading search..."
+msgstr ""
+
+#: templates/misago/socialauth.html:5
+#, python-format
+msgid "Sign in with %(backend)s"
+msgstr ""
+
+#: templates/misago/socialauth.html:24
+#, python-format
+msgid ""
+"You need to enable JavaScript in your browser to complete the sign in with "
+"%(backend)s."
+msgstr ""
+
+#: templates/misago/thread/paginator.html:41
+#, python-format
+msgid "There is %(more)s more post in this thread."
+msgid_plural "There are %(more)s more posts in this thread."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/thread/paginator.html:47
+msgid "There are no more posts in this thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:48
+#, python-format
+msgid "Thread title has been changed from %(old_title)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:52
+msgid "Thread has been pinned globally."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:54
+msgid "Thread has been pinned locally."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:56
+msgid "Thread has been unpinned."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:61
+#, python-format
+msgid "Thread has been moved from %(from_category)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:68
+#, python-format
+msgid "The %(merged_thread)s thread has been merged into this thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:72
+msgid "Thread has been approved."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:74
+msgid "Thread has been opened."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:76
+msgid "Thread has been closed."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:78
+msgid "Thread has been revealed."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:80
+msgid "Thread has been made hidden."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:82
+msgid "Took thread over."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:84
+msgid "Owner has left thread. This thread is now closed."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:86
+msgid "Participant has left thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:91
+#, python-format
+msgid "Changed thread owner to %(user)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:98
+#, python-format
+msgid "Added %(user)s to thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:105
+#, python-format
+msgid "Removed %(user)s from thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/info.html:12
+#: templates/misago/thread/posts/post/body-hidden.html:14
+#, python-format
+msgid "Hidden by %(hidden_by)s on %(hidden_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/info.html:28
+#, python-format
+msgid "By %(event_by)s on %(event_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/attachments.html:33
+#, python-format
+msgid "%(filetype)s, %(size)s, uploaded by %(uploader)s on %(uploaded_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/body-hidden.html:4
+msgid "This post is hidden. You cannot not see its contents."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:7
+#, python-format
+msgid "Marked as best answer by you %(marked_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:13
+#, python-format
+msgid "Marked as best answer by %(marked_by)s %(marked_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:23
+msgid "This post is hidden. Only users with permission may see its contents."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:29
+msgid ""
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:35
+msgid "This post is protected. Only moderators may change it."
+msgstr ""
+
+#: templates/misago/thread/posts/post/footer.html:7
+msgid "Liked"
+msgstr ""
+
+#: templates/misago/thread/posts/post/footer.html:9
+msgid "Like"
+msgstr ""
+
+#: templates/misago/thread/posts/post/footer.html:26
+msgid "Reply"
+msgstr ""
+
+#: templates/misago/thread/posts/post/header.html:5
+msgid "New post"
+msgstr ""
+
+#: templates/misago/thread/posts/post/header.html:8
+#: templates/misago/thread/toolbar-top.html:7
+#: templates/misago/threadslist/tabs.html:17
+msgid "New"
+msgstr ""
+
+#: templates/misago/thread/posts/post/header.html:22
+#: templates/misago/thread/posts/post/side.html:4
+msgid "Post link"
+msgstr ""
+
+#: templates/misago/thread/posts/post/side.html:73
+msgid "Removed user"
+msgstr ""
+
+#: templates/misago/thread/stats.html:11
+#: templates/misago/threadslist/thread.html:21
+msgid "Pinned globally"
+msgstr ""
+
+#: templates/misago/thread/stats.html:20
+#: templates/misago/threadslist/thread.html:30
+msgid "Pinned locally"
+msgstr ""
+
+#: templates/misago/thread/stats.html:30
+#: templates/misago/thread/toolbar-top.html:14
+#: templates/misago/threadslist/tabs.html:33
+#: templates/misago/threadslist/thread.html:40
+msgid "Unapproved"
+msgstr ""
+
+#: templates/misago/thread/stats.html:39
+#: templates/misago/threadslist/thread.html:49
+msgid "Unapproved posts"
+msgstr ""
+
+#: templates/misago/thread/stats.html:49
+#: templates/misago/threadslist/thread.html:119
+msgid "Hidden"
+msgstr ""
+
+#: templates/misago/thread/stats.html:59
+#: templates/misago/threadslist/thread.html:129
+msgid "Closed"
+msgstr ""
+
+#: templates/misago/thread/stats.html:68
+#: templates/misago/threadslist/thread.html:153
+#, python-format
+msgid "%(replies)s reply"
+msgid_plural "%(replies)s replies"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/thread/stats.html:83
+#, python-format
+msgid "last reply by %(user)s %(date)s"
+msgstr ""
+
+#: templates/misago/thread/thread.html:19
+#: templates/misago/thread/thread.html:30
+#, python-format
+msgid "Started by %(starter)s on %(started_on)s in the %(category)s category."
+msgstr ""
+
+#: templates/misago/thread/thread.html:21
+#: templates/misago/thread/thread.html:32
+#, python-format
+msgid "%(replies)s reply, last one from %(last_post_on)s."
+msgid_plural "%(replies)s replies, last one from %(last_post_on)s."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/thread/thread.html:25
+#: templates/misago/thread/thread.html:36
+msgid "Answered."
+msgstr ""
+
+#: templates/misago/thread/thread.html:25
+#: templates/misago/thread/thread.html:36
+msgid "Closed."
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:6
+msgid "Go to first new post"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:13
+msgid "Go to first unapproved post"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:19
+msgid "Go to last post"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:25
+msgid "Go to best answers"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:26
+msgid "Best answer"
+msgstr ""
+
+#: templates/misago/threadslist/base.html:57
+msgid "There are no threads in this category."
+msgstr ""
+
+#: templates/misago/threadslist/base.html:59
+msgid "There are no threads on this forum... yet!"
+msgstr ""
+
+#: templates/misago/threadslist/base.html:63
+#: templates/misago/threadslist/private_threads.html:61
+msgid "Why not start one yourself?"
+msgstr ""
+
+#: templates/misago/threadslist/base.html:67
+#: templates/misago/threadslist/private_threads.html:64
+msgid "No threads matching specified criteria were found."
+msgstr ""
+
+#: templates/misago/threadslist/base.html:82
+msgid "Next page"
+msgstr ""
+
+#: templates/misago/threadslist/private_threads.html:42
+msgid ""
+"Private threads are threads which only those that started them and those "
+"they have invited may see and participate in."
+msgstr ""
+
+#: templates/misago/threadslist/private_threads.html:58
+msgid "You aren't participating in any private threads."
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:7 threads/admin/forms.py:27
+msgid "All"
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:12
+msgid "My"
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:22
+msgid "Unread"
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:27
+msgid "Subscribed"
+msgstr ""
+
+#: templates/misago/threadslist/thread.html:11
+msgid "New posts"
+msgstr ""
+
+#: templates/misago/threadslist/thread.html:59
+msgid "Answered"
+msgstr ""
+
+#: templates/misago/threadslist/thread.html:139
+msgid "Poll"
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:5
+#: templates/misago/userslists/active_posters.html:23
+#: templates/misago/userslists/active_posters.html:24 users/apps.py:72
+msgid "Top posters"
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:10
+#, python-format
+msgid "%(posters)s most active poster from last %(days)s days."
+msgid_plural "%(posters)s most active posters from last %(days)s days."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/userslists/active_posters.html:16
+#: templates/misago/userslists/active_posters.html:35
+#: templates/misago/userslists/active_posters.html:50
+#: templates/misago/userslists/active_posters.html:145
+#, python-format
+msgid "No users have posted any new messages during last %(days)s days."
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:29
+#: templates/misago/userslists/active_posters.html:44
+#: templates/misago/userslists/active_posters.html:69
+#, python-format
+msgid "%(posters)s top poster from last %(days)s days."
+msgid_plural "%(posters)s top posters from last %(days)s days."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/userslists/active_posters.html:116
+#: templates/misago/userslists/active_posters.html:128
+msgid "Ranked posts"
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:133
+msgid "Total posts"
+msgstr ""
+
+#: templates/misago/userslists/rank.html:9
+#: templates/misago/userslists/rank.html:41
+#: templates/misago/userslists/rank.html:52
+#, python-format
+msgid "%(users)s user have this rank."
+msgid_plural "%(users)s users have this rank."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/userslists/rank.html:130
+msgid "There are no users with this rank at the moment."
+msgstr ""
+
+#: templates/misago/userslists/usercard.html:42
+#: templates/misago/userslists/usercard.html:45
+#, python-format
+msgid "Joined on %(joined_on)s"
+msgstr ""
+
+#: templates/misago/userslists/usercard.html:66
+#, python-format
+msgid "%(followers)s follower"
+msgid_plural "%(followers)s followers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: themes/admin/__init__.py:94
+msgid "Themes"
+msgstr ""
+
+#: themes/admin/forms.py:20
+msgid "No parent"
+msgstr ""
+
+#: themes/admin/forms.py:27 themes/admin/forms.py:58
+msgid "Parent"
+msgstr ""
+
+#: themes/admin/forms.py:28
+msgid "Version"
+msgstr ""
+
+#: themes/admin/forms.py:29
+msgid "Author(s)"
+msgstr ""
+
+#: themes/admin/forms.py:30
+msgid "Url"
+msgstr ""
+
+#: themes/admin/forms.py:54
+msgid "Leave this field empty to use theme name from imported file."
+msgstr ""
+
+#: themes/admin/forms.py:60
+msgid "Theme file"
+msgstr ""
+
+#: themes/admin/forms.py:60
+msgid "Theme file should be a ZIP file."
+msgstr ""
+
+#: themes/admin/forms.py:65
+msgid "Uploaded file is not a valid ZIP file."
+msgstr ""
+
+#: themes/admin/forms.py:110
+msgid "No files have been uploaded."
+msgstr ""
+
+#: themes/admin/forms.py:137
+#, python-format
+msgid "File \"%(file)s\" content type \"%(content_type)s\" is not allowed."
+msgstr ""
+
+#: themes/admin/forms.py:149
+#, python-format
+msgid "File \"%(file)s\" extension is invalid."
+msgstr ""
+
+#: themes/admin/forms.py:176
+msgid ""
+"Should be an correct filename and include the .css extension. It will be "
+"lowercased."
+msgstr ""
+
+#: themes/admin/forms.py:194
+msgid "You need to enter CSS for this file."
+msgstr ""
+
+#: themes/admin/forms.py:221
+msgid "Link name"
+msgstr ""
+
+#: themes/admin/forms.py:222
+msgid "Can be descriptive (e.g. \"roboto from fonts.google.com\")."
+msgstr ""
+
+#: themes/admin/forms.py:224
+msgid "Remote CSS URL"
+msgstr ""
+
+#: themes/admin/importer.py:21
+msgid ""
+"\"manifest.json\" contained by ZIP file is not a valid theme manifest file."
+msgstr ""
+
+#: themes/admin/importer.py:61
+msgid "Uploaded ZIP file could not be extracted."
+msgstr ""
+
+#: themes/admin/importer.py:67
+msgid "Uploaded ZIP file is empty."
+msgstr ""
+
+#: themes/admin/importer.py:69
+msgid "Uploaded ZIP file should contain single directory."
+msgstr ""
+
+#: themes/admin/importer.py:71
+msgid "Uploaded ZIP file didn't contain a directory."
+msgstr ""
+
+#: themes/admin/importer.py:85
+msgid "Uploaded ZIP file didn't contain a \"manifest.json\"."
+msgstr ""
+
+#: themes/admin/importer.py:89
+msgid "\"manifest.json\" contained by ZIP file is not a valid JSON file."
+msgstr ""
+
+#: themes/admin/validators.py:12
+msgid "Name is missing an .css extension."
+msgstr ""
+
+#: themes/admin/validators.py:15
+msgid "Name can't start with period (\".\")."
+msgstr ""
+
+#: themes/admin/validators.py:20
+msgid ""
+"Name can contain only latin alphabet characters, digits, dots, underscores "
+"and dashes."
+msgstr ""
+
+#: themes/admin/validators.py:27
+msgid "Name has to contain at least one latin alphabet character or digit."
+msgstr ""
+
+#: themes/admin/validators.py:36
+msgid "This name is already in use by other asset."
+msgstr ""
+
+#: themes/admin/views.py:28
+msgid "Requested theme does not exist."
+msgstr ""
+
+#: themes/admin/views.py:36
+#, python-format
+msgid "New theme \"%(name)s\" has been saved."
+msgstr ""
+
+#: themes/admin/views.py:51
+#, python-format
+msgid "Theme \"%(name)s\" has been updated."
+msgstr ""
+
+#: themes/admin/views.py:55
+msgid "Default theme can't be edited."
+msgstr ""
+
+#: themes/admin/views.py:64
+#, python-format
+msgid "Theme \"%(name)s\" has been deleted."
+msgstr ""
+
+#: themes/admin/views.py:68
+msgid "Default theme can't be deleted."
+msgstr ""
+
+#: themes/admin/views.py:70
+msgid "Active theme can't be deleted."
+msgstr ""
+
+#: themes/admin/views.py:73
+#, python-format
+msgid ""
+"Theme \"%(name)s\" can't be deleted because one of its child themes is set "
+"as active."
+msgstr ""
+
+#: themes/admin/views.py:90
+#, python-format
+msgid "Active theme has been changed to \"%(name)s\"."
+msgstr ""
+
+#: themes/admin/views.py:103
+msgid "Default theme can't be exported."
+msgstr ""
+
+#: themes/admin/views.py:123
+#, python-format
+msgid "Theme \"%(name)s\" has been imported."
+msgstr ""
+
+#: themes/admin/views.py:130
+msgid "Default theme assets can't be edited."
+msgstr ""
+
+#: themes/admin/views.py:158
+msgid "Some css files could not have been added to the theme."
+msgstr ""
+
+#: themes/admin/views.py:182
+msgid "New CSS files have been added to the theme."
+msgstr ""
+
+#: themes/admin/views.py:187
+msgid "New media files have been added to the theme."
+msgstr ""
+
+#: themes/admin/views.py:218
+msgid "Selected CSS files have been deleted."
+msgstr ""
+
+#: themes/admin/views.py:227
+msgid "Selected media have been deleted."
+msgstr ""
+
+#: themes/admin/views.py:247
+msgid "Requested CSS could not be found in the theme."
+msgstr ""
+
+#: themes/admin/views.py:273
+#, python-format
+msgid "\"%s\" was moved up."
+msgstr ""
+
+#: themes/admin/views.py:282
+#, python-format
+msgid "\"%s\" was moved down."
+msgstr ""
+
+#: themes/admin/views.py:324
+#, python-format
+msgid "New CSS \"%(name)s\" has been saved."
+msgstr ""
+
+#: themes/admin/views.py:341
+#, python-format
+msgid "CSS \"%(name)s\" has been updated."
+msgstr ""
+
+#: themes/admin/views.py:364
+#, python-format
+msgid "No changes have been made to \"%(css)s\"."
+msgstr ""
+
+#: themes/admin/views.py:369
+#, python-format
+msgid "New CSS link \"%(name)s\" has been saved."
+msgstr ""
+
+#: themes/admin/views.py:392
+#, python-format
+msgid "CSS link \"%(name)s\" has been updated."
+msgstr ""
+
+#: themes/models.py:40
+msgid "Default Misago Theme"
+msgstr ""
+
+#: threads/admin/__init__.py:43
+msgid "Attachment types"
+msgstr ""
+
+#: threads/admin/__init__.py:44
+msgid "Specify what files may be uploaded on the forum."
+msgstr ""
+
+#: threads/admin/forms.py:14
+msgid "Uploader name contains"
+msgstr ""
+
+#: threads/admin/forms.py:15
+msgid "Filename contains"
+msgstr ""
+
+#: threads/admin/forms.py:17
+msgid "File type"
+msgstr ""
+
+#: threads/admin/forms.py:24 users/admin/forms.py:585
+msgid "State"
+msgstr ""
+
+#: threads/admin/forms.py:28
+msgid "Only orphaned"
+msgstr ""
+
+#: threads/admin/forms.py:29
+msgid "Not orphaned"
+msgstr ""
+
+#: threads/admin/forms.py:54
+msgid "Type name"
+msgstr ""
+
+#: threads/admin/forms.py:55
+msgid "File extensions"
+msgstr ""
+
+#: threads/admin/forms.py:57
+msgid "Maximum allowed uploaded file size"
+msgstr ""
+
+#: threads/admin/forms.py:59
+msgid "Limit uploads to"
+msgstr ""
+
+#: threads/admin/forms.py:60
+msgid "Limit downloads to"
+msgstr ""
+
+#: threads/admin/forms.py:64
+msgid ""
+"List of comma separated file extensions associated with this attachment type."
+msgstr ""
+
+#: threads/admin/forms.py:68
+msgid ""
+"Optional list of comma separated mime types associated with this attachment "
+"type."
+msgstr ""
+
+#: threads/admin/forms.py:72
+msgid ""
+"Maximum allowed uploaded file size for this type, in kb. May be overriden "
+"via user permission."
+msgstr ""
+
+#: threads/admin/forms.py:75
+msgid "Controls this attachment type availability on your site."
+msgstr ""
+
+#: threads/admin/forms.py:77
+msgid ""
+"If you wish to limit option to upload files of this type to users with "
+"specific roles, select them on this list. Otherwhise don't select any roles "
+"to allow all users with permission to upload attachments to be able to "
+"upload attachments of this type."
+msgstr ""
+
+#: threads/admin/forms.py:83
+msgid ""
+"If you wish to limit option to download files of this type to users with "
+"specific roles, select them on this list. Otherwhise don't select any roles "
+"to allow all users with permission to download attachments to be able to "
+"download attachments of this type."
+msgstr ""
+
+#: threads/admin/views/attachments.py:14
+msgid "Requested attachment could not be found."
+msgstr ""
+
+#: threads/admin/views/attachments.py:28 users/admin/views/bans.py:26
+#: users/admin/views/users.py:65
+msgid "A to z"
+msgstr ""
+
+#: threads/admin/views/attachments.py:29 users/admin/views/bans.py:27
+#: users/admin/views/users.py:66
+msgid "Z to a"
+msgstr ""
+
+#: threads/admin/views/attachments.py:30
+msgid "Smallest files"
+msgstr ""
+
+#: threads/admin/views/attachments.py:31
+msgid "Largest files"
+msgstr ""
+
+#: threads/admin/views/attachments.py:33
+msgid "With attachments: 0"
+msgstr ""
+
+#: threads/admin/views/attachments.py:34
+msgid "Select attachments"
+msgstr ""
+
+#: threads/admin/views/attachments.py:38
+msgid "Delete attachments"
+msgstr ""
+
+#: threads/admin/views/attachments.py:39
+msgid "Are you sure you want to delete selected attachments?"
+msgstr ""
+
+#: threads/admin/views/attachments.py:62
+msgid "Selected attachments have been deleted."
+msgstr ""
+
+#: threads/admin/views/attachments.py:83
+#, python-format
+msgid "Attachment \"%(filename)s\" has been deleted."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:15
+msgid "Requested attachment type could not be found."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:36
+#, python-format
+msgid "New type \"%(name)s\" has been saved."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:40
+#, python-format
+msgid "Attachment type \"%(name)s\" has been edited."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:47
+#, python-format
+msgid ""
+"Attachment type \"%(name)s\" has associated attachments and can't be deleted."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:54
+#, python-format
+msgid "Attachment type \"%(name)s\" has been deleted."
+msgstr ""
+
+#: threads/api/attachments.py:18
+msgid "You don't have permission to upload new files."
+msgstr ""
+
+#: threads/api/attachments.py:28
+msgid "No file has been uploaded."
+msgstr ""
+
+#: threads/api/attachments.py:48
+msgid "Uploaded image was corrupted or invalid."
+msgstr ""
+
+#: threads/api/attachments.py:86
+msgid "You can't upload files of this type."
+msgstr ""
+
+#: threads/api/attachments.py:92
+#, python-format
+msgid ""
+"You can't upload files larger than %(limit)s (your file has %(upload)s)."
+msgstr ""
+
+#: threads/api/attachments.py:104
+#, python-format
+msgid ""
+"You can't upload files of this type larger than %(limit)s (your file has "
+"%(upload)s)."
+msgstr ""
+
+#: threads/api/postendpoints/edits.py:87
+msgid "Edits record is unavailable for this post."
+msgstr ""
+
+#: threads/api/postendpoints/merge.py:11
+msgid "You can't merge posts in this thread."
+msgstr ""
+
+#: threads/api/postendpoints/move.py:10
+msgid "You can't move posts in this thread."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:36
+msgid "You can't like posts in this category."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:99
+#: threads/api/threadendpoints/patch.py:147
+msgid "Content approval can't be reversed."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:180
+msgid "One or more posts to update could not be found."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:198
+#, python-format
+msgid "No more than %(limit)s post can be updated at a single time."
+msgid_plural "No more than %(limit)s posts can be updated at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/postendpoints/split.py:12
+msgid "You can't split posts from this thread."
+msgstr ""
+
+#: threads/api/postingendpoint/attachments.py:63
+#, python-format
+msgid "You don't have permission to remove \"%(attachment)s\" attachment."
+msgstr ""
+
+#: threads/api/postingendpoint/attachments.py:132
+#, python-format
+msgid ""
+"You can't attach more than %(limit_value)s file to single post (added "
+"%(show_value)s)."
+msgid_plural ""
+"You can't attach more than %(limit_value)s flies to single post (added "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/postingendpoint/category.py:45
+msgid "You have to select category to post thread in."
+msgstr ""
+
+#: threads/api/postingendpoint/category.py:46
+#: threads/api/postingendpoint/category.py:65
+msgid "Selected category is invalid."
+msgstr ""
+
+#: threads/api/postingendpoint/category.py:71
+msgid ""
+"Selected category doesn't exist or you don't have permission to browse it."
+msgstr ""
+
+#: threads/api/postingendpoint/emailnotification.py:43
+#, python-format
+msgid "%(user)s has replied to your thread \"%(thread)s\""
+msgstr ""
+
+#: threads/api/postingendpoint/emailnotification.py:46
+#, python-format
+msgid "%(user)s has replied to thread \"%(thread)s\" that you are watching"
+msgstr ""
+
+#: threads/api/postingendpoint/floodprotection.py:25
+msgid "You can't post message so quickly after previous one."
+msgstr ""
+
+#: threads/api/postingendpoint/floodprotection.py:35
+msgid "Your account has exceed an hourly post limit."
+msgstr ""
+
+#: threads/api/postingendpoint/floodprotection.py:41
+msgid "Your account has exceed a daily post limit."
+msgstr ""
+
+#: threads/api/postingendpoint/participants.py:52
+msgid ""
+"You can't include yourself on the list of users to invite to new thread."
+msgstr ""
+
+#: threads/api/postingendpoint/participants.py:61
+msgid "You have to enter user names."
+msgstr ""
+
+#: threads/api/postingendpoint/participants.py:67
+#, python-format
+msgid ""
+"You can't add more than %(users)s user to private thread (you've added "
+"%(added)s)."
+msgid_plural ""
+"You can't add more than %(users)s users to private thread (you've added "
+"%(added)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/postingendpoint/participants.py:93
+#, python-format
+msgid "One or more users could not be found: %(usernames)s"
+msgstr ""
+
+#: threads/api/postingendpoint/reply.py:81 threads/validators.py:77
+msgid "You have to enter a message."
+msgstr ""
+
+#: threads/api/postingendpoint/reply.py:106
+msgid "You have to enter thread title."
+msgstr ""
+
+#: threads/api/threadendpoints/editor.py:14
+msgid "You need to be signed in to start threads."
+msgstr ""
+
+#: threads/api/threadendpoints/editor.py:60
+msgid ""
+"No categories that allow new threads are available to you at the moment."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:65
+msgid "Not a valid string."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:86
+msgid "You can't change globally pinned threads weights in this category."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:94
+msgid "You can't pin threads globally in this category."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:122
+msgid "You can't move thread to the category it's already in."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:170
+msgid "You don't have permission to close this thread."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:172
+msgid "You don't have permission to open this thread."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:225
+#: threads/api/threadendpoints/patch.py:264
+#: threads/api/threadendpoints/patch.py:327
+#: threads/api/threadendpoints/patch.py:355
+msgid "A valid integer is required."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:238
+msgid "This post is already marked as thread's best answer."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:273
+msgid ""
+"This post can't be unmarked because it's not currently marked as best answer."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:301
+msgid "You have to enter new participant's username."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:304
+msgid "No user with such name exists."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:307
+msgid "This user is already thread participant."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:333
+#: threads/api/threadendpoints/patch.py:364
+msgid "Participant doesn't exist."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:360
+msgid "This user already is thread owner."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:479
+msgid "One or more threads to update could not be found."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:496
+#, python-format
+msgid "No more than %(limit)s thread can be updated at a single time."
+msgid_plural "No more than %(limit)s threads can be updated at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/threadpoll.py:60
+msgid "There's already a poll in this thread."
+msgstr ""
+
+#: threads/api/threadposts.py:210
+msgid "You can't reply to events."
+msgstr ""
+
+#: threads/api/threadposts.py:212
+msgid "You can't reply to hidden posts."
+msgstr ""
+
+#: threads/api/threadposts.py:245
+msgid "You can't see who liked this post."
+msgstr ""
+
+#: threads/api/threads.py:120
+msgid "You can't start private threads."
+msgstr ""
+
+#: threads/mergeconflict.py:56
+msgid "Unmark all best answers"
+msgstr ""
+
+#: threads/mergeconflict.py:75
+msgid "Delete all polls"
+msgstr ""
+
+#: threads/mergeconflict.py:126 threads/serializers/moderation.py:475
+#: threads/serializers/moderation.py:478 threads/serializers/moderation.py:545
+#: threads/serializers/moderation.py:548
+msgid "Invalid choice."
+msgstr ""
+
+#: threads/models/attachmenttype.py:17
+msgid "Allow uploads and downloads"
+msgstr ""
+
+#: threads/models/attachmenttype.py:18
+msgid "Allow downloads only"
+msgstr ""
+
+#: threads/models/attachmenttype.py:19
+msgid "Disallow both uploading and downloading"
+msgstr ""
+
+#: threads/models/thread.py:17
+msgid "Don't pin thread"
+msgstr ""
+
+#: threads/models/thread.py:18
+msgid "Pin thread within category"
+msgstr ""
+
+#: threads/models/thread.py:19
+msgid "Pin thread globally"
+msgstr ""
+
+#: threads/moderation/posts.py:53
+msgid "You can't make original post visible without revealing thread."
+msgstr ""
+
+#: threads/moderation/posts.py:66
+msgid "You can't hide original post without hiding thread."
+msgstr ""
+
+#: threads/moderation/posts.py:92
+msgid "You can't delete original post without deleting thread."
+msgstr ""
+
+#: threads/participants.py:142
+#, python-format
+msgid ""
+"%(user)s has invited you to participate in private thread \"%(thread)s\""
+msgstr ""
+
+#: threads/permissions/attachments.py:14
+msgid "Max attached file size (in kb)"
+msgstr ""
+
+#: threads/permissions/attachments.py:15
+msgid "Enter 0 to don't allow uploading end deleting attachments."
+msgstr ""
+
+#: threads/permissions/attachments.py:21
+msgid "Can download other users attachments"
+msgstr ""
+
+#: threads/permissions/attachments.py:24
+msgid "Can delete other users attachments"
+msgstr ""
+
+#: threads/permissions/attachments.py:32
+msgid "Can download attachments"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:28
+msgid "Best answers"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:31
+msgid "Can mark posts as best answers"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:34 threads/permissions/bestanswers.py:40
+#: threads/permissions/polls.py:34 threads/permissions/threads.py:120
+msgid "Own threads"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:34 threads/permissions/bestanswers.py:40
+#: threads/permissions/polls.py:34 threads/permissions/threads.py:110
+#: threads/permissions/threads.py:120
+msgid "All threads"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:37
+msgid "Can change marked answers"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:44
+msgid "Time limit for changing marked best answer in owned thread, in minutes"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:47
+msgid ""
+"Enter 0 to don't limit time for changing marked best answer in owned thread."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:134
+#: threads/permissions/bestanswers.py:293
+msgid "You have to sign in to mark best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:141
+#: threads/permissions/bestanswers.py:303
+#, python-format
+msgid ""
+"You don't have permission to mark best answers in the \"%(category)s\" "
+"category."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:153
+#: threads/permissions/bestanswers.py:315
+msgid ""
+"You don't have permission to mark best answer in this thread because you "
+"didn't start it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:162
+#, python-format
+msgid ""
+"You don't have permission to mark best answer in this thread because its "
+"category \"%(category)s\" is closed."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:170
+msgid ""
+"You can't mark best answer in this thread because it's closed and you don't "
+"have permission to open it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:188
+#, python-format
+msgid ""
+"You don't have permission to change this thread's marked answer because it's "
+"in the \"%(category)s\" category."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:198
+msgid ""
+"You don't have permission to change this thread's marked answer because you "
+"are not a thread starter."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:205
+#, python-format
+msgid ""
+"You don't have permission to change best answer that was marked for more "
+"than %(minutes)s minute."
+msgid_plural ""
+"You don't have permission to change best answer that was marked for more "
+"than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/bestanswers.py:216
+msgid ""
+"You don't have permission to change this thread's best answer because a "
+"moderator has protected it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:227
+msgid "You have to sign in to unmark best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:237
+#, python-format
+msgid ""
+"You don't have permission to unmark threads answers in the \"%(category)s\" "
+"category."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:247
+msgid ""
+"You don't have permission to unmark this best answer because you are not a "
+"thread starter."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:254
+#, python-format
+msgid ""
+"You don't have permission to unmark best answer that was marked for more "
+"than %(minutes)s minute."
+msgid_plural ""
+"You don't have permission to unmark best answer that was marked for more "
+"than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/bestanswers.py:266
+#, python-format
+msgid ""
+"You don't have permission to unmark this best answer because its category "
+"\"%(category)s\" is closed."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:274
+msgid ""
+"You can't unmark this thread's best answer because it's closed and you don't "
+"have permission to open it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:282
+msgid ""
+"You don't have permission to unmark this thread's best answer because a "
+"moderator has protected it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:296
+msgid "Events can't be marked as best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:322
+msgid "First post in a thread can't be marked as best answer."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:326
+msgid "Hidden posts can't be marked as best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:329
+msgid "Unapproved posts can't be marked as best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:334
+msgid ""
+"You don't have permission to mark this post as best answer because a "
+"moderator has protected it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:346
+msgid "You can't hide this post because its marked as best answer."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:356
+msgid "You can't delete this post because its marked as best answer."
+msgstr ""
+
+#: threads/permissions/polls.py:28
+msgid "Polls"
+msgstr ""
+
+#: threads/permissions/polls.py:31
+msgid "Can start polls"
+msgstr ""
+
+#: threads/permissions/polls.py:37
+msgid "Can edit polls"
+msgstr ""
+
+#: threads/permissions/polls.py:40 threads/permissions/polls.py:46
+msgid "Own polls"
+msgstr ""
+
+#: threads/permissions/polls.py:40 threads/permissions/polls.py:46
+msgid "All polls"
+msgstr ""
+
+#: threads/permissions/polls.py:43
+msgid "Can delete polls"
+msgstr ""
+
+#: threads/permissions/polls.py:49
+msgid "Time limit for own polls edits, in minutes"
+msgstr ""
+
+#: threads/permissions/polls.py:50
+msgid "Enter 0 to don't limit time for editing own polls."
+msgstr ""
+
+#: threads/permissions/polls.py:55
+msgid "Can always see polls voters"
+msgstr ""
+
+#: threads/permissions/polls.py:57
+msgid "Allows users to see who voted in poll even if poll votes are secret."
+msgstr ""
+
+#: threads/permissions/polls.py:112
+msgid "You have to sign in to start polls."
+msgstr ""
+
+#: threads/permissions/polls.py:119
+msgid "You can't start polls."
+msgstr ""
+
+#: threads/permissions/polls.py:121
+msgid "You can't start polls in other users threads."
+msgstr ""
+
+#: threads/permissions/polls.py:126
+msgid "This category is closed. You can't start polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:130
+msgid "This thread is closed. You can't start polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:139
+msgid "You have to sign in to edit polls."
+msgstr ""
+
+#: threads/permissions/polls.py:146
+msgid "You can't edit polls."
+msgstr ""
+
+#: threads/permissions/polls.py:151
+msgid "You can't edit other users polls in this category."
+msgstr ""
+
+#: threads/permissions/polls.py:155
+#, python-format
+msgid "You can't edit polls that are older than %(minutes)s minute."
+msgid_plural "You can't edit polls that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/polls.py:162
+msgid "This poll is over. You can't edit it."
+msgstr ""
+
+#: threads/permissions/polls.py:167
+msgid "This category is closed. You can't edit polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:171
+msgid "This thread is closed. You can't edit polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:180
+msgid "You have to sign in to delete polls."
+msgstr ""
+
+#: threads/permissions/polls.py:187
+msgid "You can't delete polls."
+msgstr ""
+
+#: threads/permissions/polls.py:192
+msgid "You can't delete other users polls in this category."
+msgstr ""
+
+#: threads/permissions/polls.py:196
+#, python-format
+msgid "You can't delete polls that are older than %(minutes)s minute."
+msgid_plural "You can't delete polls that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/polls.py:202
+msgid "This poll is over. You can't delete it."
+msgstr ""
+
+#: threads/permissions/polls.py:207
+msgid "This category is closed. You can't delete polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:211
+msgid "This thread is closed. You can't delete polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:220
+msgid "You have to sign in to vote in polls."
+msgstr ""
+
+#: threads/permissions/polls.py:223
+msgid "You have already voted in this poll."
+msgstr ""
+
+#: threads/permissions/polls.py:225
+msgid "This poll is over. You can't vote in it."
+msgstr ""
+
+#: threads/permissions/polls.py:233
+msgid "This category is closed. You can't vote in it."
+msgstr ""
+
+#: threads/permissions/polls.py:235
+msgid "This thread is closed. You can't vote in it."
+msgstr ""
+
+#: threads/permissions/polls.py:243
+msgid "You dont have permission to this poll's voters."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:35
+msgid "Can use private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:36
+msgid "Can start private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:38
+msgid "Max number of users invited to private thread"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:39
+msgid "Enter 0 to don't limit number of participants."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:44
+msgid "Can add everyone to threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:46
+msgid "Allows user to add users that are blocking them to private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:50
+msgid "Can report private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:52
+msgid ""
+"Allows user to report private threads they are participating in, making them "
+"accessible to moderators."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:57
+msgid "Can moderate private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:59
+msgid ""
+"Allows user to read, reply, edit and delete content in reported private "
+"threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:179
+msgid "You have to sign in to use private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:181
+msgid "You can't use private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:210
+msgid "Only thread owner and moderators can change threads owners."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:214
+msgid "Only moderators can change closed threads owners."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:226
+msgid "You have to be thread owner to add new participants to it."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:231
+msgid "Only moderators can add participants to closed threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:238
+msgid "You can't add any more new users to this thread."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:253
+msgid "Only moderators can remove participants from closed threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:258
+msgid "You have to be thread owner to remove participants from it."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:270
+#, python-format
+msgid "%(user)s can't participate in private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:277
+#, python-format
+msgid "%(user)s is blocking you."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:281
+#, python-format
+msgid "%(user)s is not allowing invitations to private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:288
+#, python-format
+msgid "%(user)s limits invitations to private threads to followed users."
+msgstr ""
+
+#: threads/permissions/threads.py:76
+msgid "Can see unapproved content list"
+msgstr ""
+
+#: threads/permissions/threads.py:78
+msgid ""
+"Allows access to \"unapproved\" tab on threads lists for easy listing of "
+"threads that are unapproved or contain unapproved posts. Despite the tab "
+"being available on all threads lists, it will only display threads belonging "
+"to categories in which the user has permission to approve content."
+msgstr ""
+
+#: threads/permissions/threads.py:87
+msgid "Can see reported content list"
+msgstr ""
+
+#: threads/permissions/threads.py:89
+msgid ""
+"Allows access to \"reported\" tab on threads lists for easy listing of "
+"threads that contain reported posts. Despite the tab being available on all "
+"categories threads lists, it will only display threads belonging to "
+"categories in which the user has permission to see posts reports."
+msgstr ""
+
+#: threads/permissions/threads.py:98
+msgid "Can omit flood protection"
+msgstr ""
+
+#: threads/permissions/threads.py:99
+msgid "Allows posting more frequently than flood protection would."
+msgstr ""
+
+#: threads/permissions/threads.py:107
+msgid "Can see threads"
+msgstr ""
+
+#: threads/permissions/threads.py:113
+msgid "Can start threads"
+msgstr ""
+
+#: threads/permissions/threads.py:114
+msgid "Can reply to threads"
+msgstr ""
+
+#: threads/permissions/threads.py:117
+msgid "Can edit threads"
+msgstr ""
+
+#: threads/permissions/threads.py:123
+msgid "Can hide own threads"
+msgstr ""
+
+#: threads/permissions/threads.py:125
+msgid ""
+"Only threads started within time limit and with no replies can be hidden."
+msgstr ""
+
+#: threads/permissions/threads.py:130 threads/permissions/threads.py:142
+msgid "Hide threads"
+msgstr ""
+
+#: threads/permissions/threads.py:130 threads/permissions/threads.py:142
+msgid "Delete threads"
+msgstr ""
+
+#: threads/permissions/threads.py:133
+msgid "Time limit for own threads edits, in minutes"
+msgstr ""
+
+#: threads/permissions/threads.py:134
+msgid "Enter 0 to don't limit time for editing own threads."
+msgstr ""
+
+#: threads/permissions/threads.py:139
+msgid "Can hide all threads"
+msgstr ""
+
+#: threads/permissions/threads.py:146
+msgid "Can pin threads"
+msgstr ""
+
+#: threads/permissions/threads.py:149
+msgid "Locally"
+msgstr ""
+
+#: threads/permissions/threads.py:149
+msgid "Globally"
+msgstr ""
+
+#: threads/permissions/threads.py:151
+msgid "Can close threads"
+msgstr ""
+
+#: threads/permissions/threads.py:152
+msgid "Can move threads"
+msgstr ""
+
+#: threads/permissions/threads.py:153
+msgid "Can merge threads"
+msgstr ""
+
+#: threads/permissions/threads.py:156
+msgid "Can edit posts"
+msgstr ""
+
+#: threads/permissions/threads.py:159
+msgid "Own posts"
+msgstr ""
+
+#: threads/permissions/threads.py:159
+msgid "All posts"
+msgstr ""
+
+#: threads/permissions/threads.py:162
+msgid "Can hide own posts"
+msgstr ""
+
+#: threads/permissions/threads.py:164
+msgid "Only last posts to thread made within edit time limit can be hidden."
+msgstr ""
+
+#: threads/permissions/threads.py:168 threads/permissions/threads.py:180
+msgid "Hide posts"
+msgstr ""
+
+#: threads/permissions/threads.py:168 threads/permissions/threads.py:180
+msgid "Delete posts"
+msgstr ""
+
+#: threads/permissions/threads.py:171
+msgid "Time limit for own post edits, in minutes"
+msgstr ""
+
+#: threads/permissions/threads.py:172
+msgid "Enter 0 to don't limit time for editing own posts."
+msgstr ""
+
+#: threads/permissions/threads.py:177
+msgid "Can hide all posts"
+msgstr ""
+
+#: threads/permissions/threads.py:184
+msgid "Can see posts likes"
+msgstr ""
+
+#: threads/permissions/threads.py:189
+msgid "Number only"
+msgstr ""
+
+#: threads/permissions/threads.py:190
+msgid "Number and list of likers"
+msgstr ""
+
+#: threads/permissions/threads.py:194
+msgid "Can like posts"
+msgstr ""
+
+#: threads/permissions/threads.py:195
+msgid "Only users with this permission to see likes can like posts."
+msgstr ""
+
+#: threads/permissions/threads.py:199
+msgid "Can protect posts"
+msgstr ""
+
+#: threads/permissions/threads.py:200
+msgid "Only users with this permission can edit protected posts."
+msgstr ""
+
+#: threads/permissions/threads.py:203
+msgid "Can move posts"
+msgstr ""
+
+#: threads/permissions/threads.py:204
+msgid "Will be able to move posts to other threads."
+msgstr ""
+
+#: threads/permissions/threads.py:206
+msgid "Can merge posts"
+msgstr ""
+
+#: threads/permissions/threads.py:208
+msgid "Can approve content"
+msgstr ""
+
+#: threads/permissions/threads.py:209
+msgid "Will be able to see and approve unapproved content."
+msgstr ""
+
+#: threads/permissions/threads.py:211
+msgid "Can report posts"
+msgstr ""
+
+#: threads/permissions/threads.py:212
+msgid "Can see reports"
+msgstr ""
+
+#: threads/permissions/threads.py:215
+msgid "Can hide events"
+msgstr ""
+
+#: threads/permissions/threads.py:218
+msgid "Hide events"
+msgstr ""
+
+#: threads/permissions/threads.py:218
+msgid "Delete events"
+msgstr ""
+
+#: threads/permissions/threads.py:221
+msgid "Require threads approval"
+msgstr ""
+
+#: threads/permissions/threads.py:222
+msgid "Require replies approval"
+msgstr ""
+
+#: threads/permissions/threads.py:223
+msgid "Require edits approval"
+msgstr ""
+
+#: threads/permissions/threads.py:539
+msgid "You have to sign in to start threads."
+msgstr ""
+
+#: threads/permissions/threads.py:545
+msgid "You don't have permission to start new threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:550
+msgid "This category is closed. You can't start new threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:559
+msgid "You have to sign in to reply threads."
+msgstr ""
+
+#: threads/permissions/threads.py:566
+msgid "You can't reply to threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:571
+msgid "This category is closed. You can't reply to threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:575
+msgid "You can't reply to closed threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:584
+msgid "You have to sign in to edit threads."
+msgstr ""
+
+#: threads/permissions/threads.py:591
+msgid "You can't edit threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:596
+msgid "You can't edit other users threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:601
+#, python-format
+msgid "You can't edit threads that are older than %(minutes)s minute."
+msgid_plural "You can't edit threads that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:612
+msgid "This category is closed. You can't edit threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:615
+msgid "This thread is closed. You can't edit it."
+msgstr ""
+
+#: threads/permissions/threads.py:623
+msgid "You have to sign in to change threads weights."
+msgstr ""
+
+#: threads/permissions/threads.py:630
+msgid "You can't change threads weights in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:635
+msgid "This category is closed. You can't change threads weights in it."
+msgstr ""
+
+#: threads/permissions/threads.py:639
+msgid "This thread is closed. You can't change its weight."
+msgstr ""
+
+#: threads/permissions/threads.py:648 threads/permissions/threads.py:668
+msgid "You have to sign in to hide threads."
+msgstr ""
+
+#: threads/permissions/threads.py:657
+msgid "This category is closed. You can't reveal threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:660
+msgid "This thread is closed. You can't reveal it."
+msgstr ""
+
+#: threads/permissions/threads.py:678
+msgid "You can't hide threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:683
+msgid "You can't hide other users theads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:688
+#, python-format
+msgid "You can't hide threads that are older than %(minutes)s minute."
+msgid_plural "You can't hide threads that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:699
+msgid "This category is closed. You can't hide threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:702
+msgid "This thread is closed. You can't hide it."
+msgstr ""
+
+#: threads/permissions/threads.py:710
+msgid "You have to sign in to delete threads."
+msgstr ""
+
+#: threads/permissions/threads.py:720
+msgid "You can't delete threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:728
+msgid "You can't delete other users theads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:733
+#, python-format
+msgid "You can't delete threads that are older than %(minutes)s minute."
+msgid_plural ""
+"You can't delete threads that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:744
+msgid "This category is closed. You can't delete threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:747
+msgid "This thread is closed. You can't delete it."
+msgstr ""
+
+#: threads/permissions/threads.py:755
+msgid "You have to sign in to move threads."
+msgstr ""
+
+#: threads/permissions/threads.py:762
+msgid "You can't move threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:767
+msgid "This category is closed. You can't move it's threads."
+msgstr ""
+
+#: threads/permissions/threads.py:770
+msgid "This thread is closed. You can't move it."
+msgstr ""
+
+#: threads/permissions/threads.py:778
+msgid "You have to sign in to merge threads."
+msgstr ""
+
+#: threads/permissions/threads.py:786
+msgid "Other thread can't be merged with."
+msgstr ""
+
+#: threads/permissions/threads.py:787
+msgid "You can't merge threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:793
+msgid "Other thread's category is closed. You can't merge with it."
+msgstr ""
+
+#: threads/permissions/threads.py:796
+msgid "This category is closed. You can't merge it's threads."
+msgstr ""
+
+#: threads/permissions/threads.py:801
+msgid "Other thread is closed and can't be merged with."
+msgstr ""
+
+#: threads/permissions/threads.py:804
+msgid "This thread is closed. You can't merge it with other threads."
+msgstr ""
+
+#: threads/permissions/threads.py:813
+msgid "You have to sign in to approve threads."
+msgstr ""
+
+#: threads/permissions/threads.py:820
+msgid "You can't approve threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:825
+msgid "This category is closed. You can't approve threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:828
+msgid "This thread is closed. You can't approve it."
+msgstr ""
+
+#: threads/permissions/threads.py:858
+msgid "You have to sign in to edit posts."
+msgstr ""
+
+#: threads/permissions/threads.py:861
+msgid "Events can't be edited."
+msgstr ""
+
+#: threads/permissions/threads.py:868
+msgid "You can't edit posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:875
+msgid "This post is hidden, you can't edit it."
+msgstr ""
+
+#: threads/permissions/threads.py:880
+msgid "You can't edit other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:884
+msgid "This post is protected. You can't edit it."
+msgstr ""
+
+#: threads/permissions/threads.py:888
+#, python-format
+msgid "You can't edit posts that are older than %(minutes)s minute."
+msgid_plural "You can't edit posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:899
+msgid "This category is closed. You can't edit posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:903
+msgid "This thread is closed. You can't edit posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:912
+msgid "You have to sign in to reveal posts."
+msgstr ""
+
+#: threads/permissions/threads.py:920
+msgid "You can't reveal posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:924
+msgid "You can't reveal other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:928
+msgid "This post is protected. You can't reveal it."
+msgstr ""
+
+#: threads/permissions/threads.py:932
+#, python-format
+msgid "You can't reveal posts that are older than %(minutes)s minute."
+msgid_plural "You can't reveal posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:941
+msgid "You can't reveal thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:946
+msgid "This category is closed. You can't reveal posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:950
+msgid "This thread is closed. You can't reveal posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:959
+msgid "You have to sign in to hide posts."
+msgstr ""
+
+#: threads/permissions/threads.py:967
+msgid "You can't hide posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:971
+msgid "You can't hide other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:975
+msgid "This post is protected. You can't hide it."
+msgstr ""
+
+#: threads/permissions/threads.py:979
+#, python-format
+msgid "You can't hide posts that are older than %(minutes)s minute."
+msgid_plural "You can't hide posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:988
+msgid "You can't hide thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:993
+msgid "This category is closed. You can't hide posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:997
+msgid "This thread is closed. You can't hide posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1006
+msgid "You have to sign in to delete posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1014
+msgid "You can't delete posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1018
+msgid "You can't delete other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1022
+msgid "This post is protected. You can't delete it."
+msgstr ""
+
+#: threads/permissions/threads.py:1026
+#, python-format
+msgid "You can't delete posts that are older than %(minutes)s minute."
+msgid_plural "You can't delete posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:1035
+msgid "You can't delete thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1040
+msgid "This category is closed. You can't delete posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1044
+msgid "This thread is closed. You can't delete posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1053
+msgid "You have to sign in to protect posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1060
+msgid "You can't protect posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1062
+msgid "You can't protect posts you can't edit."
+msgstr ""
+
+#: threads/permissions/threads.py:1070
+msgid "You have to sign in to approve posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1077
+msgid "You can't approve posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1079
+msgid "You can't approve thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1085
+msgid "You can't approve posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1090
+msgid "This category is closed. You can't approve posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1094
+msgid "This thread is closed. You can't approve posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1103
+msgid "You have to sign in to move posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1110
+msgid "You can't move posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1112
+msgid "Events can't be moved."
+msgstr ""
+
+#: threads/permissions/threads.py:1114
+msgid "You can't move thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1116
+msgid "You can't move posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1121
+msgid "This category is closed. You can't move posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1125
+msgid "This thread is closed. You can't move posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1134
+msgid "You have to sign in to merge posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1141
+msgid "You can't merge posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1143
+msgid "Events can't be merged."
+msgstr ""
+
+#: threads/permissions/threads.py:1149
+msgid "You can't merge posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1154
+msgid "This category is closed. You can't merge posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1158
+msgid "This thread is closed. You can't merge posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1167
+msgid "You have to sign in to split posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1174
+msgid "You can't split posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1176
+msgid "Events can't be split."
+msgstr ""
+
+#: threads/permissions/threads.py:1178
+msgid "You can't split thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1180
+msgid "You can't split posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1185
+msgid "This category is closed. You can't split posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1189
+msgid "This thread is closed. You can't split posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1198
+msgid "You have to sign in to reveal events."
+msgstr ""
+
+#: threads/permissions/threads.py:1205
+msgid "You can't reveal events in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1210
+msgid "This category is closed. You can't reveal events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1214
+msgid "This thread is closed. You can't reveal events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1223
+msgid "You have to sign in to hide events."
+msgstr ""
+
+#: threads/permissions/threads.py:1230
+msgid "You can't hide events in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1235
+msgid "This category is closed. You can't hide events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1239
+msgid "This thread is closed. You can't hide events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1248
+msgid "You have to sign in to delete events."
+msgstr ""
+
+#: threads/permissions/threads.py:1255
+msgid "You can't delete events in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1260
+msgid "This category is closed. You can't delete events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1264
+msgid "This thread is closed. You can't delete events in it."
+msgstr ""
+
+#: threads/serializers/moderation.py:49
+msgid "You have to specify at least one post to delete."
+msgstr ""
+
+#: threads/serializers/moderation.py:56 threads/serializers/moderation.py:111
+#: threads/serializers/moderation.py:205 threads/serializers/moderation.py:363
+msgid "One or more post ids received were invalid."
+msgstr ""
+
+#: threads/serializers/moderation.py:70
+#, python-format
+msgid "No more than %(limit)s post can be deleted at a single time."
+msgid_plural "No more than %(limit)s posts can be deleted at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:98
+msgid "One or more posts to delete could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:105
+msgid "You have to select at least two posts to merge."
+msgstr ""
+
+#: threads/serializers/moderation.py:128
+#, python-format
+msgid "No more than %(limit)s post can be merged at a single time."
+msgid_plural "No more than %(limit)s posts can be merged at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:156
+msgid "Posts made by different users can't be merged."
+msgstr ""
+
+#: threads/serializers/moderation.py:169
+msgid "Post marked as best answer can't be merged with thread's first post."
+msgstr ""
+
+#: threads/serializers/moderation.py:180
+msgid "Posts with different visibility can't be merged."
+msgstr ""
+
+#: threads/serializers/moderation.py:187
+msgid "One or more posts to merge could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:195
+msgid "You have to specify at least one post to move."
+msgstr ""
+
+#: threads/serializers/moderation.py:199 threads/serializers/moderation.py:472
+msgid "Enter link to new thread."
+msgstr ""
+
+#: threads/serializers/moderation.py:222 threads/serializers/moderation.py:488
+msgid "This is not a valid thread link."
+msgstr ""
+
+#: threads/serializers/moderation.py:225
+msgid "Thread to move posts to is same as current one."
+msgstr ""
+
+#: threads/serializers/moderation.py:233 threads/serializers/moderation.py:500
+msgid ""
+"The thread you have entered link to doesn't exist or you don't have "
+"permission to see it."
+msgstr ""
+
+#: threads/serializers/moderation.py:240
+msgid "You can't move posts to threads you can't reply."
+msgstr ""
+
+#: threads/serializers/moderation.py:250
+#, python-format
+msgid "No more than %(limit)s post can be moved at a single time."
+msgid_plural "No more than %(limit)s posts can be moved at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:277
+msgid "One or more posts to move could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:305
+msgid "You can't create new threads in selected category."
+msgstr ""
+
+#: threads/serializers/moderation.py:319
+msgid "You don't have permission to pin threads globally in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:325
+msgid "You don't have permission to pin threads in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:337
+msgid "You don't have permission to hide threads in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:349
+msgid "You don't have permission to close threads in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:356
+msgid "You have to specify at least one post to split."
+msgstr ""
+
+#: threads/serializers/moderation.py:377
+#, python-format
+msgid "No more than %(limit)s post can be split at a single time."
+msgid_plural "No more than %(limit)s posts can be split at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:404
+msgid "One or more posts to split could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:411
+msgid "You have to specify at least one thread to delete."
+msgstr ""
+
+#: threads/serializers/moderation.py:418 threads/serializers/moderation.py:534
+msgid "One or more thread ids received were invalid."
+msgstr ""
+
+#: threads/serializers/moderation.py:432
+#, python-format
+msgid "No more than %(limit)s thread can be deleted at a single time."
+msgid_plural "No more than %(limit)s threads can be deleted at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:464
+msgid "One or more threads to delete could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:490
+msgid "You can't merge thread with itself."
+msgstr ""
+
+#: threads/serializers/moderation.py:507
+msgid "You can't merge this thread into thread you can't reply."
+msgstr ""
+
+#: threads/serializers/moderation.py:526
+msgid "You have to select at least two threads to merge."
+msgstr ""
+
+#: threads/serializers/moderation.py:555
+#, python-format
+msgid "No more than %(limit)s thread can be merged at a single time."
+msgid_plural "No more than %(limit)s threads can be merged at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:578
+msgid "One or more threads to merge could not be found."
+msgstr ""
+
+#: threads/serializers/poll.py:106
+msgid "One or more poll choices are invalid."
+msgstr ""
+
+#: threads/serializers/poll.py:116
+msgid "You need to add at least two choices to a poll."
+msgstr ""
+
+#: threads/serializers/poll.py:122
+#, python-format
+msgid ""
+"You can't add more than %(limit_value)s option to a single poll (added "
+"%(show_value)s)."
+msgid_plural ""
+"You can't add more than %(limit_value)s options to a single poll (added "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/poll.py:134
+msgid "Number of allowed choices can't be greater than number of all choices."
+msgstr ""
+
+#: threads/serializers/pollvote.py:15
+#, python-format
+msgid "This poll disallows voting for more than %(choices)s choice."
+msgid_plural "This poll disallows voting for more than %(choices)s choices."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/pollvote.py:32
+msgid "One or more of poll choices were invalid."
+msgstr ""
+
+#: threads/serializers/pollvote.py:36
+msgid "You have to make a choice."
+msgstr ""
+
+#: threads/signals.py:168
+msgid "Question"
+msgstr ""
+
+#: threads/signals.py:169
+msgid "Choices"
+msgstr ""
+
+#: threads/templatetags/misago_poststags.py:17
+#, python-format
+msgid "%(user)s likes this."
+msgstr ""
+
+#: threads/templatetags/misago_poststags.py:26
+#, python-format
+msgid "%(users)s like this."
+msgstr ""
+
+#: threads/templatetags/misago_poststags.py:29
+#, python-format
+msgid "%(users)s and %(likes)s other user like this."
+msgid_plural "%(users)s and %(likes)s other users like this."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/templatetags/misago_poststags.py:41
+#, python-format
+msgid "%(users)s and %(last_user)s"
+msgstr ""
+
+#: threads/threadtypes/thread.py:14
+msgid "None (will become top level category)"
+msgstr ""
+
+#: threads/validators.py:27
+msgid "Requested category could not be found."
+msgstr ""
+
+#: threads/validators.py:30
+msgid "You don't have permission to access this category."
+msgstr ""
+
+#: threads/validators.py:37
+msgid "Thread title should contain alpha-numeric characters."
+msgstr ""
+
+#: threads/validators.py:38
+msgid "Thread title is too long."
+msgstr ""
+
+#: threads/validators.py:46
+msgid "You have to enter an thread title."
+msgstr ""
+
+#: threads/validators.py:51
+#, python-format
+msgid ""
+"Thread title should be at least %(limit_value)s character long (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Thread title should be at least %(limit_value)s characters long (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/validators.py:63
+#, python-format
+msgid ""
+"Thread title cannot be longer than %(limit_value)s character (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Thread title cannot be longer than %(limit_value)s characters (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/validators.py:82
+#, python-format
+msgid ""
+"Posted message should be at least %(limit_value)s character long (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Posted message should be at least %(limit_value)s characters long (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/validators.py:93
+#, python-format
+msgid ""
+"Posted message cannot be longer than %(limit_value)s character (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Posted message cannot be longer than %(limit_value)s characters (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/viewmodels/threads.py:23
+msgid "Your threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:24
+msgid "New threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:25
+msgid "Unread threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:26
+msgid "Subscribed threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:27
+msgid "Unapproved content"
+msgstr ""
+
+#: threads/viewmodels/threads.py:32
+msgid "You have to sign in to see list of threads that you have started."
+msgstr ""
+
+#: threads/viewmodels/threads.py:34
+msgid "You have to sign in to see list of threads you haven't read."
+msgstr ""
+
+#: threads/viewmodels/threads.py:36
+msgid "You have to sign in to see list of threads with new replies."
+msgstr ""
+
+#: threads/viewmodels/threads.py:39
+msgid "You have to sign in to see list of threads you are subscribing."
+msgstr ""
+
+#: threads/viewmodels/threads.py:42
+msgid "You have to sign in to see list of threads with unapproved posts."
+msgstr ""
+
+#: threads/viewmodels/threads.py:113
+msgid "You don't have permission to see unapproved content lists."
+msgstr ""
+
+#: threads/views/goto.py:130
+msgid ""
+"You need permission to approve content to be able to go to first unapproved "
+"post."
+msgstr ""
+
+#: users/admin/__init__.py:77
+msgid "Bans"
+msgstr ""
+
+#: users/admin/__init__.py:87
+msgid "Ranks"
+msgstr ""
+
+#: users/admin/djangoadmin.py:42
+msgid "Misago user data"
+msgstr ""
+
+#: users/admin/djangoadmin.py:56
+msgid "Edit permissions and groups"
+msgstr ""
+
+#: users/admin/djangoadmin.py:76
+msgid "Edit the user from Misago admin panel"
+msgstr ""
+
+#: users/admin/forms.py:22 users/admin/forms.py:313 users/models/ban.py:71
+#: users/signals.py:29
+msgid "Username"
+msgstr ""
+
+#: users/admin/forms.py:23
+msgid "Custom title"
+msgstr ""
+
+#: users/admin/forms.py:24 users/models/ban.py:72
+msgid "E-mail address"
+msgstr ""
+
+#: users/admin/forms.py:59
+msgid "All registered members must have a \"Member\" role."
+msgstr ""
+
+#: users/admin/forms.py:76
+msgid "Is administrator"
+msgstr ""
+
+#: users/admin/forms.py:78
+msgid ""
+"Designates whether the user can log into admin sites. If Django admin site "
+"is enabled, this user will need additional permissions assigned within it to "
+"admin Django modules."
+msgstr ""
+
+#: users/admin/forms.py:84
+msgid "Is superuser"
+msgstr ""
+
+#: users/admin/forms.py:86
+msgid ""
+"Only administrators can access admin sites. In addition to admin site "
+"access, superadmins can also change other members admin levels."
+msgstr ""
+
+#: users/admin/forms.py:91
+msgid "Is active"
+msgstr ""
+
+#: users/admin/forms.py:93
+msgid ""
+"Designates whether this user should be treated as active. Turning this off "
+"is non-destructible way to remove user accounts."
+msgstr ""
+
+#: users/admin/forms.py:97 users/admin/forms.py:128 users/admin/forms.py:158
+msgid "Staff message"
+msgstr ""
+
+#: users/admin/forms.py:99
+msgid ""
+"Optional message for forum team members explaining why user's account has "
+"been disabled."
+msgstr ""
+
+#: users/admin/forms.py:104
+msgid "Change password to"
+msgstr ""
+
+#: users/admin/forms.py:111
+msgid "Lock avatar"
+msgstr ""
+
+#: users/admin/forms.py:113
+msgid ""
+"Setting this to yes will stop user from changing his/her avatar, and will "
+"reset his/her avatar to procedurally generated one."
+msgstr ""
+
+#: users/admin/forms.py:119 users/admin/forms.py:150 users/admin/forms.py:457
+#: users/admin/forms.py:524
+msgid "User message"
+msgstr ""
+
+#: users/admin/forms.py:121
+msgid ""
+"Optional message for user explaining why he/she is banned form changing "
+"avatar."
+msgstr ""
+
+#: users/admin/forms.py:130
+msgid ""
+"Optional message for forum team members explaining why user is banned form "
+"changing avatar."
+msgstr ""
+
+#: users/admin/forms.py:138
+msgid "Signature contents"
+msgstr ""
+
+#: users/admin/forms.py:143
+msgid "Lock signature"
+msgstr ""
+
+#: users/admin/forms.py:145
+msgid ""
+"Setting this to yes will stop user from making changes to his/her signature."
+msgstr ""
+
+#: users/admin/forms.py:152
+msgid "Optional message to user explaining why his/hers signature is locked."
+msgstr ""
+
+#: users/admin/forms.py:160
+msgid ""
+"Optional message to team members explaining why user signature is locked."
+msgstr ""
+
+#: users/admin/forms.py:166
+msgid "Hides presence"
+msgstr ""
+
+#: users/admin/forms.py:169
+msgid "Who can add user to private threads"
+msgstr ""
+
+#: users/admin/forms.py:178
+msgid "Replid threads"
+msgstr ""
+
+#: users/admin/forms.py:221 users/serializers/moderation.py:36
+#, python-format
+msgid "Signature can't be longer than %(limit)s character."
+msgid_plural "Signature can't be longer than %(limit)s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/admin/forms.py:240
+msgid ""
+"Ranks are used to group and distinguish users. They are also used to add "
+"permissions to groups of users."
+msgstr ""
+
+#: users/admin/forms.py:252
+msgid "Individual roles of this user. All users must have a \"Member\" role."
+msgstr ""
+
+#: users/admin/forms.py:315
+msgid "Profile fields contain"
+msgstr ""
+
+#: users/admin/forms.py:316
+msgid "Requires activation"
+msgstr ""
+
+#: users/admin/forms.py:318
+msgid "Administrator"
+msgstr ""
+
+#: users/admin/forms.py:319
+msgid "Deletes their account"
+msgstr ""
+
+#: users/admin/forms.py:364
+msgid "All ranks"
+msgstr ""
+
+#: users/admin/forms.py:368
+msgid "All roles"
+msgstr ""
+
+#: users/admin/forms.py:374
+msgid "Has rank"
+msgstr ""
+
+#: users/admin/forms.py:377
+msgid "Has role"
+msgstr ""
+
+#: users/admin/forms.py:389
+msgid ""
+"Short and descriptive name of all users with this rank. \"The Team\" or "
+"\"Game Masters\" are good examples."
+msgstr ""
+
+#: users/admin/forms.py:394
+msgid "User title"
+msgstr ""
+
+#: users/admin/forms.py:397
+msgid ""
+"Optional, singular version of rank name displayed by user names. For example "
+"\"GM\" or \"Dev\"."
+msgstr ""
+
+#: users/admin/forms.py:407
+msgid ""
+"Optional description explaining function or status of members distincted "
+"with this rank."
+msgstr ""
+
+#: users/admin/forms.py:412
+msgid "User roles"
+msgstr ""
+
+#: users/admin/forms.py:416
+msgid "Rank can give additional roles to users with it."
+msgstr ""
+
+#: users/admin/forms.py:422
+msgid "Optional css class added to content belonging to this rank owner."
+msgstr ""
+
+#: users/admin/forms.py:426
+msgid "Give rank dedicated tab on users list"
+msgstr ""
+
+#: users/admin/forms.py:429
+msgid ""
+"Selecting this option will make users with this rank easily discoverable by "
+"others through dedicated page on forum users list."
+msgstr ""
+
+#: users/admin/forms.py:447
+msgid "This name collides with other rank."
+msgstr ""
+
+#: users/admin/forms.py:454
+msgid "Values to ban"
+msgstr ""
+
+#: users/admin/forms.py:460
+msgid "Optional message displayed to users instead of default one."
+msgstr ""
+
+#: users/admin/forms.py:463 users/admin/forms.py:473 users/admin/forms.py:530
+#: users/admin/forms.py:540
+msgid "Message can't be longer than 1000 characters."
+msgstr ""
+
+#: users/admin/forms.py:467 users/admin/forms.py:534
+msgid "Team message"
+msgstr ""
+
+#: users/admin/forms.py:470 users/admin/forms.py:537
+msgid "Optional ban message for moderators and administrators."
+msgstr ""
+
+#: users/admin/forms.py:476 users/admin/forms.py:543
+msgid "Expiration date"
+msgstr ""
+
+#: users/admin/forms.py:485 users/admin/forms.py:574
+msgid "E-mails"
+msgstr ""
+
+#: users/admin/forms.py:486
+msgid "E-mail domains"
+msgstr ""
+
+#: users/admin/forms.py:493
+msgid "First segment of IP addresses"
+msgstr ""
+
+#: users/admin/forms.py:494
+msgid "First two segments of IP addresses"
+msgstr ""
+
+#: users/admin/forms.py:500
+msgid "Check type"
+msgstr ""
+
+#: users/admin/forms.py:503
+msgid "Restrict this ban to registrations"
+msgstr ""
+
+#: users/admin/forms.py:505
+msgid ""
+"Changing this to yes will make this ban check be only performed on "
+"registration step. This is good if you want to block certain registrations "
+"like ones from recently comprimised e-mail providers, without harming "
+"existing users."
+msgstr ""
+
+#: users/admin/forms.py:512
+msgid "Banned value"
+msgstr ""
+
+#: users/admin/forms.py:515
+msgid ""
+"This value is case-insensitive and accepts asterisk (*) for rought matches. "
+"For example, making IP ban for value \"83.*\" will ban all IP addresses "
+"beginning with \"83.\"."
+msgstr ""
+
+#: users/admin/forms.py:520
+msgid "Banned value can't be longer than 250 characters."
+msgstr ""
+
+#: users/admin/forms.py:527
+msgid "Optional message displayed to user instead of default one."
+msgstr ""
+
+#: users/admin/forms.py:562
+msgid "Banned value is too vague."
+msgstr ""
+
+#: users/admin/forms.py:572
+msgid "All bans"
+msgstr ""
+
+#: users/admin/forms.py:575
+msgid "IPs"
+msgstr ""
+
+#: users/admin/forms.py:578
+msgid "Banned value begins with"
+msgstr ""
+
+#: users/admin/forms.py:582 users/admin/forms.py:587
+msgid "Any"
+msgstr ""
+
+#: users/admin/forms.py:622
+msgid "Usernames or emails"
+msgstr ""
+
+#: users/admin/forms.py:624
+msgid ""
+"Enter every item in new line. Duplicates will be ignored. This field is case "
+"insensitive. Depending on site configuration and amount of data to archive "
+"it may take up to few days for requests to complete. E-mail will "
+"notification will be sent to every user once their download is ready."
+msgstr ""
+
+#: users/admin/forms.py:641
+#, python-format
+msgid ""
+"You may not enter more than 20 items at a single time (You have entered "
+"%(show_value)s)."
+msgstr ""
+
+#: users/admin/forms.py:660
+msgid "One or more specified users could not be found."
+msgstr ""
+
+#: users/admin/views/bans.py:14
+msgid "Requested ban does not exist."
+msgstr ""
+
+#: users/admin/views/bans.py:30
+msgid "With bans: 0"
+msgstr ""
+
+#: users/admin/views/bans.py:31
+msgid "Select bans"
+msgstr ""
+
+#: users/admin/views/bans.py:35
+msgid "Remove bans"
+msgstr ""
+
+#: users/admin/views/bans.py:36
+msgid "Are you sure you want to remove those bans?"
+msgstr ""
+
+#: users/admin/views/bans.py:43
+msgid "Selected bans have been removed."
+msgstr ""
+
+#: users/admin/views/bans.py:47
+#, python-format
+msgid "New ban \"%(name)s\" has been saved."
+msgstr ""
+
+#: users/admin/views/bans.py:51
+#, python-format
+msgid "Ban \"%(name)s\" has been edited."
+msgstr ""
+
+#: users/admin/views/bans.py:58
+#, python-format
+msgid "Ban \"%(name)s\" has been removed."
+msgstr ""
+
+#: users/admin/views/datadownloads.py:23
+msgid "With data downloads: 0"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:24
+msgid "Select data downloads"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:28
+msgid "Expire downloads"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:30
+msgid "Are you sure you want to set selected data downloads as expired?"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:35
+msgid "Delete downloads"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:37
+msgid "Are you sure you want to delete selected data downloads?"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:52
+msgid "Selected data downloads have been set as expired."
+msgstr ""
+
+#: users/admin/views/datadownloads.py:59
+msgid "Selected data downloads have been deleted."
+msgstr ""
+
+#: users/admin/views/datadownloads.py:71
+msgid "Data downloads have been requested for specified users."
+msgstr ""
+
+#: users/admin/views/ranks.py:16
+msgid "Requested rank does not exist."
+msgstr ""
+
+#: users/admin/views/ranks.py:33
+#, python-format
+msgid "New rank \"%(name)s\" has been saved."
+msgstr ""
+
+#: users/admin/views/ranks.py:37
+#, python-format
+msgid "Rank \"%(name)s\" has been edited."
+msgstr ""
+
+#: users/admin/views/ranks.py:44
+#, python-format
+msgid "Rank \"%(name)s\" is default rank and can't be deleted."
+msgstr ""
+
+#: users/admin/views/ranks.py:47
+#, python-format
+msgid "Rank \"%(name)s\" is assigned to users and can't be deleted."
+msgstr ""
+
+#: users/admin/views/ranks.py:52
+#, python-format
+msgid "Rank \"%(name)s\" has been deleted."
+msgstr ""
+
+#: users/admin/views/ranks.py:69
+#, python-format
+msgid "Rank \"%(name)s\" has been moved below \"%(other)s\"."
+msgstr ""
+
+#: users/admin/views/ranks.py:87
+#, python-format
+msgid "Rank \"%(name)s\" has been moved above \"%(other)s\"."
+msgstr ""
+
+#: users/admin/views/ranks.py:101
+#, python-format
+msgid "Rank \"%(name)s\" is already default."
+msgstr ""
+
+#: users/admin/views/ranks.py:106
+#, python-format
+msgid "Rank \"%(name)s\" has been made default."
+msgstr ""
+
+#: users/admin/views/users.py:67
+msgid "Biggest posters"
+msgstr ""
+
+#: users/admin/views/users.py:68
+msgid "Smallest posters"
+msgstr ""
+
+#: users/admin/views/users.py:70
+msgid "With users: 0"
+msgstr ""
+
+#: users/admin/views/users.py:71
+msgid "Select users"
+msgstr ""
+
+#: users/admin/views/users.py:73
+msgid "Activate accounts"
+msgstr ""
+
+#: users/admin/views/users.py:75
+msgid "Request data download"
+msgstr ""
+
+#: users/admin/views/users.py:78
+msgid "Delete accounts"
+msgstr ""
+
+#: users/admin/views/users.py:79
+msgid "Are you sure you want to delete selected users?"
+msgstr ""
+
+#: users/admin/views/users.py:83
+msgid "Delete with content"
+msgstr ""
+
+#: users/admin/views/users.py:85
+msgid ""
+"Are you sure you want to delete selected users? This will also delete all "
+"content associated with their accounts."
+msgstr ""
+
+#: users/admin/views/users.py:106
+msgid "You have to select inactive users."
+msgstr ""
+
+#: users/admin/views/users.py:113
+#, python-format
+msgid "Your account on %(forum_name)s forums has been activated"
+msgstr ""
+
+#: users/admin/views/users.py:123
+msgid "Selected users accounts have been activated."
+msgstr ""
+
+#: users/admin/views/users.py:131
+#, python-format
+msgid "%(user)s is super admin and can't be banned."
+msgstr ""
+
+#: users/admin/views/users.py:193
+msgid "Selected users have been banned."
+msgstr ""
+
+#: users/admin/views/users.py:208
+msgid "Data download requests have been placed for selected users."
+msgstr ""
+
+#: users/admin/views/users.py:214 users/admin/views/users.py:230
+msgid "You can't delete yourself."
+msgstr ""
+
+#: users/admin/views/users.py:216 users/admin/views/users.py:232
+#, python-format
+msgid "%(user)s is admin and can't be deleted."
+msgstr ""
+
+#: users/admin/views/users.py:225
+msgid "Selected users have been deleted."
+msgstr ""
+
+#: users/admin/views/users.py:246
+msgid ""
+"Selected users have been disabled and queued for deletion together with "
+"their content."
+msgstr ""
+
+#: users/admin/views/users.py:255
+#, python-format
+msgid "New user \"%(user)s\" has been registered."
+msgstr ""
+
+#: users/admin/views/users.py:287
+#, python-format
+msgid "User \"%(user)s\" has been edited."
+msgstr ""
+
+#: users/api/auth.py:94
+#, python-format
+msgid "Activate %(user)s account on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/auth.py:129
+#, python-format
+msgid "Change %(user)s password on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/auth.py:164
+msgid "Form link is invalid. Please try again."
+msgstr ""
+
+#: users/api/auth.py:165
+msgid "Your link has expired. Please request new one."
+msgstr ""
+
+#: users/api/rest_permissions.py:30
+msgid "This action is not available to signed in users."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:26
+msgid "Your avatar is locked. You can't change it."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:109
+msgid "This avatar type is not allowed."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:116
+msgid "Unknown avatar type."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:137
+msgid "New avatar based on your account was set."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:143
+msgid "Gravatar was downloaded and set as new avatar."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:145
+msgid "No Gravatar is associated with your e-mail address."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:147
+msgid "Failed to connect to Gravatar servers."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:157
+msgid "Avatar from gallery was set."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:159
+msgid "Incorrect image."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:165
+msgid "No file was sent."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:178
+msgid "Avatar was re-cropped."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:183
+msgid "Uploaded avatar was set."
+msgstr ""
+
+#: users/api/userendpoints/changeemail.py:22
+#, python-format
+msgid "Confirm e-mail change on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/userendpoints/changeemail.py:35
+msgid "E-mail change confirmation link was sent to new address."
+msgstr ""
+
+#: users/api/userendpoints/changepassword.py:22
+#, python-format
+msgid "Confirm password change on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/userendpoints/changepassword.py:33
+msgid "Password change confirmation link was sent to your address."
+msgstr ""
+
+#: users/api/userendpoints/create.py:25
+msgid "New users registrations are currently closed."
+msgstr ""
+
+#: users/api/userendpoints/signature.py:13
+msgid "You don't have permission to change signature."
+msgstr ""
+
+#: users/api/userendpoints/signature.py:25
+msgid "Your signature is locked. You can't change it."
+msgstr ""
+
+#: users/api/userendpoints/username.py:32
+msgid "You can't change your username now."
+msgstr ""
+
+#: users/api/userendpoints/username.py:60
+#: users/api/userendpoints/username.py:82
+msgid "Error changing username. Please try again."
+msgstr ""
+
+#: users/api/usernamechanges.py:28
+msgid "You don't have permission to see other users name history."
+msgstr ""
+
+#: users/api/users.py:64
+msgid "You have to sign in to perform this action."
+msgstr ""
+
+#: users/api/users.py:110
+msgid "You can't change other users avatars."
+msgstr ""
+
+#: users/api/users.py:122
+msgid "You can't change other users options."
+msgstr ""
+
+#: users/api/users.py:127
+msgid "Your forum options have been changed."
+msgstr ""
+
+#: users/api/users.py:133
+msgid "You can't change other users names."
+msgstr ""
+
+#: users/api/users.py:140
+msgid "You can't change other users signatures."
+msgstr ""
+
+#: users/api/users.py:152
+msgid "You can't change other users passwords."
+msgstr ""
+
+#: users/api/users.py:162
+msgid "You can't change other users e-mail addresses."
+msgstr ""
+
+#: users/api/users.py:269
+msgid "You can't request data downloads for other users."
+msgstr ""
+
+#: users/api/users.py:273
+msgid "You can't download your data."
+msgstr ""
+
+#: users/api/users.py:278
+msgid "You can't have more than one data download request at a single time."
+msgstr ""
+
+#: users/api/users.py:335
+msgid "You can't see other users data downloads."
+msgstr ""
+
+#: users/apps.py:30
+msgid "Edit details"
+msgstr ""
+
+#: users/apps.py:36
+msgid "Change username"
+msgstr ""
+
+#: users/apps.py:42
+msgid "Change email or password"
+msgstr ""
+
+#: users/apps.py:63
+msgid "Delete account"
+msgstr ""
+
+#: users/avatars/uploaded.py:38
+msgid "Uploaded file is too big."
+msgstr ""
+
+#: users/avatars/uploaded.py:46 users/avatars/uploaded.py:51
+msgid "Uploaded file type is not allowed."
+msgstr ""
+
+#: users/avatars/uploaded.py:59
+#, python-format
+msgid "Uploaded image should be at least %(size)s pixels tall and wide."
+msgstr ""
+
+#: users/avatars/uploaded.py:63
+msgid "Uploaded image is too big."
+msgstr ""
+
+#: users/avatars/uploaded.py:68
+msgid "Uploaded image ratio cannot be greater than 16:9."
+msgstr ""
+
+#: users/avatars/uploaded.py:74
+msgid "Crop data is invalid. Please try again."
+msgstr ""
+
+#: users/captcha.py:21
+msgid "Failed to contact reCAPTCHA API."
+msgstr ""
+
+#: users/captcha.py:28
+msgid "Entered answer is incorrect."
+msgstr ""
+
+#: users/decorators.py:14
+msgid "This page is not available to signed in users."
+msgstr ""
+
+#: users/decorators.py:26
+msgid "You have to sign in to access this page."
+msgstr ""
+
+#: users/forms/auth.py:15
+msgid "Fill out both fields."
+msgstr ""
+
+#: users/forms/auth.py:16
+msgid "Login or password is incorrect."
+msgstr ""
+
+#: users/forms/auth.py:18
+msgid "You have to activate your account before you will be able to sign in."
+msgstr ""
+
+#: users/forms/auth.py:21
+msgid ""
+"Your account has to be activated by site administrator before you will be "
+"able to sign in."
+msgstr ""
+
+#: users/forms/auth.py:98
+msgid "Your account does not have admin privileges."
+msgstr ""
+
+#: users/forms/auth.py:118
+msgid "Enter e-mail address."
+msgstr ""
+
+#: users/forms/auth.py:124
+msgid "Entered e-mail is invalid."
+msgstr ""
+
+#: users/forms/auth.py:134
+msgid "No user with this e-mail exists."
+msgstr ""
+
+#: users/forms/auth.py:150 users/views/activation.py:46
+#, python-format
+msgid "%(user)s, your account is already active."
+msgstr ""
+
+#: users/forms/auth.py:156
+#, python-format
+msgid "%(user)s, only administrator may activate your account."
+msgstr ""
+
+#: users/forms/auth.py:165
+msgid ""
+"You have to activate your account before you will be able to request new "
+"password."
+msgstr ""
+
+#: users/forms/auth.py:169
+msgid ""
+"Administrator has to activate your account before you will be able to "
+"request new password."
+msgstr ""
+
+#: users/forms/register.py:34 users/validators.py:80
+msgid "This username is not allowed."
+msgstr ""
+
+#: users/forms/register.py:45 users/validators.py:52
+msgid "This e-mail address is not allowed."
+msgstr ""
+
+#: users/forms/register.py:51
+msgid "This agreement is required."
+msgstr ""
+
+#: users/forms/register.py:61
+msgid "New registrations from this IP address are not allowed."
+msgstr ""
+
+#: users/management/commands/prepareuserdatadownloads.py:38
+#, python-format
+msgid "%(user)s, your data download is ready"
+msgstr ""
+
+#: users/migrations/0004_default_ranks.py:13
+#: users/migrations/0004_default_ranks.py:14 users/models/user.py:77
+msgid "Forum team"
+msgstr ""
+
+#: users/migrations/0004_default_ranks.py:15
+msgid "Team"
+msgstr ""
+
+#: users/migrations/0004_default_ranks.py:22
+#: users/migrations/0004_default_ranks.py:23
+msgid "Members"
+msgstr ""
+
+#: users/models/datadownload.py:26
+msgid "Pending"
+msgstr ""
+
+#: users/models/datadownload.py:27
+msgid "Processing"
+msgstr ""
+
+#: users/models/datadownload.py:28
+msgid "Ready"
+msgstr ""
+
+#: users/models/deleteduser.py:12
+msgid "By self"
+msgstr ""
+
+#: users/models/deleteduser.py:13
+msgid "By staff"
+msgstr ""
+
+#: users/models/deleteduser.py:14
+msgid "By system"
+msgstr ""
+
+#: users/models/user.py:106
+msgid "Notify"
+msgstr ""
+
+#: users/models/user.py:107
+msgid "Notify with e-mail"
+msgstr ""
+
+#: users/models/user.py:115
+msgid "Everybody"
+msgstr ""
+
+#: users/models/user.py:116
+msgid "Users I follow"
+msgstr ""
+
+#: users/models/user.py:117
+msgid "Nobody"
+msgstr ""
+
+#: users/models/user.py:136
+msgid "joined on"
+msgstr ""
+
+#: users/models/user.py:148
+msgid "staff status"
+msgstr ""
+
+#: users/models/user.py:150
+msgid "Designates whether the user can log into admin sites."
+msgstr ""
+
+#: users/models/user.py:157
+msgid "active"
+msgstr ""
+
+#: users/models/user.py:161
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+
+#: users/permissions/account.py:10
+msgid "Account settings"
+msgstr ""
+
+#: users/permissions/account.py:13
+msgid "Allowed username changes number"
+msgstr ""
+
+#: users/permissions/account.py:16
+msgid "Don't count username changes older than"
+msgstr ""
+
+#: users/permissions/account.py:18
+msgid ""
+"Number of days since name change that makes that change no longer count to "
+"limit. Enter zero to make all changes count."
+msgstr ""
+
+#: users/permissions/account.py:25
+msgid "Can have signature"
+msgstr ""
+
+#: users/permissions/account.py:26
+msgid "Can put links in signature"
+msgstr ""
+
+#: users/permissions/account.py:27
+msgid "Can put images in signature"
+msgstr ""
+
+#: users/permissions/account.py:29
+msgid "Can use text blocks in signature"
+msgstr ""
+
+#: users/permissions/account.py:31
+msgid ""
+"Controls whether or not users can put quote, code, spoiler blocks and "
+"horizontal lines in signatures."
+msgstr ""
+
+#: users/permissions/decorators.py:10
+msgid "You have to sig in to perform this action."
+msgstr ""
+
+#: users/permissions/decorators.py:19
+msgid "Only guests can perform this action."
+msgstr ""
+
+#: users/permissions/delete.py:26
+msgid "Maximum age of deleted account (in days)"
+msgstr ""
+
+#: users/permissions/delete.py:27 users/permissions/delete.py:33
+msgid "Enter zero to disable this check."
+msgstr ""
+
+#: users/permissions/delete.py:32
+msgid "Maximum number of posts on deleted account"
+msgstr ""
+
+#: users/permissions/delete.py:74
+msgid "You can't delete users."
+msgstr ""
+
+#: users/permissions/delete.py:77 users/permissions/delete.py:106
+msgid "You can't delete your account."
+msgstr ""
+
+#: users/permissions/delete.py:79
+msgid "You can't delete administrators."
+msgstr ""
+
+#: users/permissions/delete.py:84
+#, python-format
+msgid "You can't delete users that are members for more than %(days)s day."
+msgid_plural ""
+"You can't delete users that are members for more than %(days)s days."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/permissions/delete.py:92
+#, python-format
+msgid "You can't delete users that made more than %(posts)s post."
+msgid_plural "You can't delete users that made more than %(posts)s posts."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/permissions/delete.py:104
+msgid "You can't delete other users accounts."
+msgstr ""
+
+#: users/permissions/delete.py:109
+msgid "You can't delete your account because you are an administrator."
+msgstr ""
+
+#: users/permissions/moderation.py:33
+msgid "Users moderation"
+msgstr ""
+
+#: users/permissions/moderation.py:35
+msgid "Can rename users"
+msgstr ""
+
+#: users/permissions/moderation.py:36
+msgid "Can moderate avatars"
+msgstr ""
+
+#: users/permissions/moderation.py:37
+msgid "Can moderate signatures"
+msgstr ""
+
+#: users/permissions/moderation.py:38
+msgid "Can moderate profile details"
+msgstr ""
+
+#: users/permissions/moderation.py:39
+msgid "Can ban users"
+msgstr ""
+
+#: users/permissions/moderation.py:41
+msgid "Max length, in days, of imposed ban"
+msgstr ""
+
+#: users/permissions/moderation.py:42
+msgid "Enter zero to let moderators impose permanent bans."
+msgstr ""
+
+#: users/permissions/moderation.py:46
+msgid "Can lift bans"
+msgstr ""
+
+#: users/permissions/moderation.py:48
+msgid "Max length, in days, of lifted ban"
+msgstr ""
+
+#: users/permissions/moderation.py:49
+msgid "Enter zero to let moderators lift permanent bans."
+msgstr ""
+
+#: users/permissions/moderation.py:111
+msgid "You can't rename users."
+msgstr ""
+
+#: users/permissions/moderation.py:113
+msgid "You can't rename administrators."
+msgstr ""
+
+#: users/permissions/moderation.py:121
+msgid "You can't moderate avatars."
+msgstr ""
+
+#: users/permissions/moderation.py:123
+msgid "You can't moderate administrators avatars."
+msgstr ""
+
+#: users/permissions/moderation.py:131
+msgid "You can't moderate signatures."
+msgstr ""
+
+#: users/permissions/moderation.py:133
+msgid "You can't moderate administrators signatures."
+msgstr ""
+
+#: users/permissions/moderation.py:142
+msgid "You have to sign in to edit profile details."
+msgstr ""
+
+#: users/permissions/moderation.py:147
+msgid "You can't edit other users details."
+msgstr ""
+
+#: users/permissions/moderation.py:149
+msgid "You can't edit administrators details."
+msgstr ""
+
+#: users/permissions/moderation.py:158
+msgid "You can't ban users."
+msgstr ""
+
+#: users/permissions/moderation.py:160
+msgid "You can't ban administrators."
+msgstr ""
+
+#: users/permissions/moderation.py:168
+msgid "You can't lift bans."
+msgstr ""
+
+#: users/permissions/moderation.py:171
+msgid "This user is not banned."
+msgstr ""
+
+#: users/permissions/moderation.py:176
+msgid "You can't lift permanent bans."
+msgstr ""
+
+#: users/permissions/moderation.py:178
+#, python-format
+msgid "You can't lift bans that expire after %(expiration)s."
+msgstr ""
+
+#: users/permissions/profiles.py:23
+msgid "Can browse users list"
+msgstr ""
+
+#: users/permissions/profiles.py:24
+msgid "Can search user profiles"
+msgstr ""
+
+#: users/permissions/profiles.py:25
+msgid "Can see other members name history"
+msgstr ""
+
+#: users/permissions/profiles.py:27
+msgid "Can see members bans details"
+msgstr ""
+
+#: users/permissions/profiles.py:29
+msgid "Allows users with this permission to see user and staff ban messages."
+msgstr ""
+
+#: users/permissions/profiles.py:35
+msgid "User profiles"
+msgstr ""
+
+#: users/permissions/profiles.py:46
+msgid "Can follow other users"
+msgstr ""
+
+#: users/permissions/profiles.py:47
+msgid "Can be blocked by other users"
+msgstr ""
+
+#: users/permissions/profiles.py:50
+msgid "Can see members e-mails"
+msgstr ""
+
+#: users/permissions/profiles.py:51
+msgid "Can see members IPs"
+msgstr ""
+
+#: users/permissions/profiles.py:53
+msgid "Can see members that hide their presence"
+msgstr ""
+
+#: users/permissions/profiles.py:113
+msgid "You can't browse users list."
+msgstr ""
+
+#: users/permissions/profiles.py:122
+msgid "You can't follow other users."
+msgstr ""
+
+#: users/permissions/profiles.py:124
+msgid "You can't add yourself to followed."
+msgstr ""
+
+#: users/permissions/profiles.py:133
+msgid "You can't block administrators."
+msgstr ""
+
+#: users/permissions/profiles.py:135
+msgid "You can't block yourself."
+msgstr ""
+
+#: users/permissions/profiles.py:145
+msgid "You can't see users bans details."
+msgstr ""
+
+#: users/profilefields/default.py:12
+msgid "Bio"
+msgstr ""
+
+#: users/profilefields/default.py:17
+msgid "Real name"
+msgstr ""
+
+#: users/profilefields/default.py:22
+msgid "Location"
+msgstr ""
+
+#: users/profilefields/default.py:27
+msgid "Gender"
+msgstr ""
+
+#: users/profilefields/default.py:30
+msgid "Not specified"
+msgstr ""
+
+#: users/profilefields/default.py:31
+msgid "Not telling"
+msgstr ""
+
+#: users/profilefields/default.py:32
+msgid "Female"
+msgstr ""
+
+#: users/profilefields/default.py:33
+msgid "Male"
+msgstr ""
+
+#: users/profilefields/default.py:39
+msgid "Website"
+msgstr ""
+
+#: users/profilefields/default.py:41
+msgid ""
+"If you own website in the internet you wish to share on your profile you may "
+"enter its address here. Remember to for it to be valid http address starting "
+"with either \"http://\" or \"https://\"."
+msgstr ""
+
+#: users/profilefields/default.py:49
+msgid "Skype ID"
+msgstr ""
+
+#: users/profilefields/default.py:51
+msgid ""
+"Entering your Skype ID in this field may invite other users to contact you "
+"over the Skype instead of via private threads."
+msgstr ""
+
+#: users/profilefields/default.py:58
+msgid "Twitter handle"
+msgstr ""
+
+#: users/profilefields/default.py:62
+#, python-format
+msgid ""
+"If you own Twitter account, here you may enter your Twitter handle for other "
+"users to find you. Starting your handle with \"@\" sign is optional. Either "
+"\"@%(slug)s\" or \"%(slug)s\" are valid values."
+msgstr ""
+
+#: users/profilefields/default.py:73
+msgid "This is not a valid twitter handle."
+msgstr ""
+
+#: users/profilefields/default.py:79
+msgid "Join IP"
+msgstr ""
+
+#: users/registration.py:12
+#, python-format
+msgid "Welcome on %(forum_name)s forums!"
+msgstr ""
+
+#: users/search.py:22
+msgid "You don't have permission to search users."
+msgstr ""
+
+#: users/serializers/ban.py:26
+msgid "Your IP address is banned."
+msgstr ""
+
+#: users/serializers/ban.py:28
+msgid "You are banned."
+msgstr ""
+
+#: users/serializers/options.py:46
+msgid "Signature is too long."
+msgstr ""
+
+#: users/serializers/options.py:57
+msgid "Enter new username."
+msgstr ""
+
+#: users/serializers/options.py:61
+msgid "New username is same as current one."
+msgstr ""
+
+#: users/serializers/options.py:80 users/serializers/options.py:94
+#: users/serializers/options.py:116
+msgid "Entered password is invalid."
+msgstr ""
+
+#: users/serializers/options.py:100
+msgid "You have to enter new e-mail address."
+msgstr ""
+
+#: users/serializers/options.py:104
+msgid "New e-mail is same as current one."
+msgstr ""
+
+#: users/signals.py:31
+msgid "Joined on"
+msgstr ""
+
+#: users/signals.py:32
+msgid "Joined from ip"
+msgstr ""
+
+#: users/signals.py:74
+msgid "New username"
+msgstr ""
+
+#: users/signals.py:75
+msgid "Old username"
+msgstr ""
+
+#: users/validators.py:40
+msgid "This e-mail address is not available."
+msgstr ""
+
+#: users/validators.py:68
+msgid "This username is not available."
+msgstr ""
+
+#: users/validators.py:86
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr ""
+
+#: users/validators.py:93
+#, python-format
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/validators.py:101
+#, python-format
+msgid "Username cannot be longer than %(limit_value)s characters."
+msgid_plural "Username cannot be longer than %(limit_value)s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/validators.py:137
+msgid "Data entered was found in spammers database."
+msgstr ""
+
+#: users/validators.py:147
+msgid "This email is not allowed."
+msgstr ""
+
+#: users/views/activation.py:51
+#, python-format
+msgid ""
+"%(user)s, your activation link is invalid. Try again or request new "
+"activation link."
+msgstr ""
+
+#: users/views/activation.py:69
+#, python-format
+msgid "%(user)s, your account has been activated!"
+msgstr ""
+
+#: users/views/forgottenpassword.py:31
+#, python-format
+msgid "%(user)s, your link has expired. Please request new link and try again."
+msgstr ""
+
+#: users/views/forgottenpassword.py:38
+#, python-format
+msgid "%(user)s, your link is invalid. Please try again or request new link."
+msgstr ""
+
+#: users/views/options.py:56
+#, python-format
+msgid "%(user)s, your e-mail has been changed."
+msgstr ""
+
+#: users/views/options.py:74
+#, python-format
+msgid "%(user)s, your password has been changed."
+msgstr ""

BIN
misago/locale/et/LC_MESSAGES/djangojs.mo


+ 50 - 53
misago/locale/et/LC_MESSAGES/djangojs.po

@@ -2,23 +2,23 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # Rivo Zängov <eraser@eraser.ee>, 2018
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Rivo Zängov <eraser@eraser.ee>, 2018\n"
 "Language-Team: Estonian (https://www.transifex.com/misago/teams/65369/et/)\n"
+"Language: et\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: et\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #: static/misago/admin/index.js:16
@@ -377,8 +377,8 @@ msgstr "Parim vastus"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Please select the best answer for your newly merged thread. No posts will be"
-" deleted during the merge."
+"Please select the best answer for your newly merged thread. No posts will be "
+"deleted during the merge."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -468,8 +468,8 @@ msgstr "Kustuta konto"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You are going to delete your account. This action is nonreversible, and will"
-" result in following data being deleted:"
+"You are going to delete your account. This action is nonreversible, and will "
+"result in following data being deleted:"
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -490,8 +490,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"All your posted content will NOT be deleted, but username associated with it"
-" will be changed to one shared by all deleted accounts."
+"All your posted content will NOT be deleted, but username associated with it "
+"will be changed to one shared by all deleted accounts."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -682,6 +682,10 @@ msgid "Change forgotten password"
 msgstr ""
 
 #: static/misago/js/misago.js:1
+msgid "%(user)s has been made new thread owner."
+msgstr ""
+
+#: static/misago/js/misago.js:1
 msgid "You have left this thread."
 msgstr "Sa lahkusid sellest teemast."
 
@@ -690,10 +694,6 @@ msgid "%(user)s has been removed from this thread."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "%(user)s has been made new thread owner."
-msgstr ""
-
-#: static/misago/js/misago.js:1
 msgid "See profile"
 msgstr "Vaata profiili"
 
@@ -949,8 +949,7 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you with to revert this post to the state from before this "
-"edit?"
+"Are you sure you with to revert this post to the state from before this edit?"
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -1360,13 +1359,13 @@ msgid "This post is hidden. Only users with permission may see its contents."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+msgid "This post is protected. Only moderators may change it."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "This post is protected. Only moderators may change it."
+msgid ""
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -1468,22 +1467,22 @@ msgid "%(username)s's details have been updated."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "You have no started threads."
+msgid "You have posted no messages."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s started no threads."
+msgid "%(username)s posted no messages."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "You have started %(threads)s thread."
-msgid_plural "You have started %(threads)s threads."
+msgid "You have posted %(posts)s message."
+msgid_plural "You have posted %(posts)s messages."
 msgstr[0] ""
 msgstr[1] ""
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s has started %(threads)s thread."
-msgid_plural "%(username)s has started %(threads)s threads."
+msgid "%(username)s has posted %(posts)s message."
+msgid_plural "%(username)s has posted %(posts)s messages."
 msgstr[0] ""
 msgstr[1] ""
 
@@ -1492,32 +1491,32 @@ msgid "Loading..."
 msgstr "aadimine..."
 
 #: static/misago/js/misago.js:1
-msgid "Threads"
-msgstr "Teemad"
+msgid "Posts"
+msgstr "Postitused"
 
 #: static/misago/js/misago.js:1
-msgid "You have posted no messages."
+msgid "You have no started threads."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s posted no messages."
+msgid "%(username)s started no threads."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "You have posted %(posts)s message."
-msgid_plural "You have posted %(posts)s messages."
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
 msgstr[0] ""
 msgstr[1] ""
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s has posted %(posts)s message."
-msgid_plural "%(username)s has posted %(posts)s messages."
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
 msgstr[0] ""
 msgstr[1] ""
 
 #: static/misago/js/misago.js:1
-msgid "Posts"
-msgstr "Postitused"
+msgid "Threads"
+msgstr "Teemad"
 
 #: static/misago/js/misago.js:1
 msgid "Show older activity"
@@ -1983,8 +1982,7 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you want to merge selected posts? This action is not "
-"reversible!"
+"Are you sure you want to merge selected posts? This action is not reversible!"
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -2322,8 +2320,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You need permission to start threads in category to be able to merge threads"
-" to it."
+"You need permission to start threads in category to be able to merge threads "
+"to it."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -2581,18 +2579,22 @@ msgid "You are banned"
 msgstr "Sa oled bännitud"
 
 #: static/misago/js/misago.js:1
-msgid "You have to accept the terms of service."
-msgstr ""
+msgid "Valid password must be at least %(limit_value)s character long."
+msgid_plural "Valid password must be at least %(limit_value)s characters long."
+msgstr[0] ""
+msgstr[1] ""
 
 #: static/misago/js/misago.js:1
 msgid "You have to accept the privacy policy."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "Username must be at least %(limit_value)s character long."
-msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] ""
-msgstr[1] ""
+msgid "You have to accept the terms of service."
+msgstr ""
+
+#: static/misago/js/misago.js:1
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid "Username cannot be longer than %(limit_value)s character."
@@ -2601,13 +2603,8 @@ msgstr[0] ""
 msgstr[1] ""
 
 #: static/misago/js/misago.js:1
-msgid "Username can only contain latin alphabet letters and digits."
-msgstr ""
-
-#: static/misago/js/misago.js:1
-msgid "Valid password must be at least %(limit_value)s character long."
-msgid_plural ""
-"Valid password must be at least %(limit_value)s characters long."
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
 msgstr[0] ""
 msgstr[1] ""
 

BIN
misago/locale/fr/LC_MESSAGES/django.mo


+ 241 - 365
misago/locale/fr/LC_MESSAGES/django.po

@@ -2,7 +2,7 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # Simon Veron <veron.simon@hotmail.fr>, 2017
 # Guy Cronimus <guy.cronimus@orange.fr>, 2017
@@ -12,20 +12,20 @@
 # Olivier Cortès <olive@deep-ocean.net>, 2018
 # Palimpseste, 2018
 # Jorg722, 2019
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-13 18:22+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Jorg722, 2019\n"
 "Language-Team: French (https://www.transifex.com/misago/teams/65369/fr/)\n"
+"Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: fr\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 #: acl/admin/__init__.py:24 templates/misago/acl_debug.html:16
@@ -221,7 +221,7 @@ msgstr "Catégorie fermée"
 msgid "Only members with valid permissions can post in closed categories."
 msgstr "Seul les membres autorisés peuvent écrire dans une catégorie close."
 
-#: categories/admin/forms.py:70 conf/admin/__init__.py:93
+#: categories/admin/forms.py:70 conf/admin/__init__.py:79
 #: templates/misago/admin/categories/list.html:19
 #: templates/misago/admin/dashboard/totals.html:19
 #: templates/misago/navbar.html:20 templates/misago/navbar.html:36
@@ -235,7 +235,7 @@ msgstr "Seul les membres autorisés peuvent écrire dans une catégorie close."
 #: templates/misago/threadslist/threads.html:42
 #: templates/misago/threadslist/threads.html:66
 #: threads/permissions/threads.py:73 threads/permissions/threads.py:104
-#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:106
+#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:97
 msgid "Threads"
 msgstr "Fils de discussion"
 
@@ -273,11 +273,11 @@ msgstr "Ancienneté du fil de discussion"
 
 #: categories/admin/forms.py:95
 msgid ""
-"Prune thread if number of days since its creation is greater than specified."
-" Enter 0 to disable this pruning criteria."
+"Prune thread if number of days since its creation is greater than specified. "
+"Enter 0 to disable this pruning criteria."
 msgstr ""
-"Le fil de discussion est retiré si le nombre de jours depuis sa création est"
-" supérieur à celui spécifié ci-contre. Entrez 0 pour désactiver ce critère."
+"Le fil de discussion est retiré si le nombre de jours depuis sa création est "
+"supérieur à celui spécifié ci-contre. Entrez 0 pour désactiver ce critère."
 
 #: categories/admin/forms.py:100
 msgid "Last reply"
@@ -328,8 +328,7 @@ msgstr "Archiver"
 
 #: categories/admin/forms.py:173
 msgid ""
-"Instead of being deleted, pruned threads can be moved to designated "
-"category."
+"Instead of being deleted, pruned threads can be moved to designated category."
 msgstr ""
 "Au lieu d'être supprimés, les fils de discussion obsolètes peuvent être "
 "déplacés vers une catégorie."
@@ -341,8 +340,8 @@ msgstr "Ne pas archiver les fils de discussion obsolètes."
 #: categories/admin/forms.py:194
 msgid "You are trying to move this category threads to itself."
 msgstr ""
-"Vous essayez de déplacer les fils de discussion de cette catégorie vers "
-"elle-même."
+"Vous essayez de déplacer les fils de discussion de cette catégorie vers elle-"
+"même."
 
 #: categories/admin/forms.py:200
 msgid ""
@@ -365,8 +364,7 @@ msgid "Move child categories to"
 msgstr "Déplacer les catégories filles vers"
 
 #: categories/admin/forms.py:249 categories/admin/forms.py:264
-#: templates/misago/acl_debug.html:15
-#: templates/misago/admin/roles/list.html:16
+#: templates/misago/acl_debug.html:15 templates/misago/admin/roles/list.html:16
 msgid "Role"
 msgstr "Rôle"
 
@@ -475,23 +473,23 @@ msgstr "Peut voir le contenu d'une catégorie"
 #, python-format
 msgid "You don't have permission to browse \"%(category)s\" contents."
 msgstr ""
-"Vous n'avez pas le permission de parcourir le contenu de la catégorie « "
-"%(category)s »."
+"Vous n'avez pas le permission de parcourir le contenu de la catégorie "
+"« %(category)s »."
 
-#: conf/admin/__init__.py:45 templates/misago/admin/conf/index.html:5
+#: conf/admin/__init__.py:41 templates/misago/admin/conf/index.html:5
 #: templates/misago/admin/themes/form.html:48
 msgid "Settings"
 msgstr "Paramètres"
 
-#: conf/admin/__init__.py:52 templates/misago/admin/socialauth/form.html:27
+#: conf/admin/__init__.py:48 templates/misago/admin/socialauth/form.html:27
 msgid "General"
 msgstr "Général"
 
-#: conf/admin/__init__.py:53
+#: conf/admin/__init__.py:49
 msgid "Change forum details like name, description or footer."
 msgstr ""
 
-#: conf/admin/__init__.py:58 templates/misago/admin/dashboard/totals.html:7
+#: conf/admin/__init__.py:54 templates/misago/admin/dashboard/totals.html:7
 #: templates/misago/admin/users/ban.html:22 templates/misago/navbar.html:42
 #: templates/misago/userslists/base.html:5
 #: templates/misago/userslists/base.html:14 users/admin/__init__.py:74
@@ -499,38 +497,28 @@ msgstr ""
 msgid "Users"
 msgstr "Utilisateurs"
 
-#: conf/admin/__init__.py:60
+#: conf/admin/__init__.py:56
 msgid "Customize user accounts default behavior and features availability."
 msgstr ""
 
-#: conf/admin/__init__.py:67
+#: conf/admin/__init__.py:63
 msgid "Captcha"
 msgstr ""
 
-#: conf/admin/__init__.py:69
+#: conf/admin/__init__.py:65
 msgid "Setup protection against automatic registrations on the site."
 msgstr ""
 
-#: conf/admin/__init__.py:76
-msgid "Single Sign-On"
-msgstr ""
-
-#: conf/admin/__init__.py:78
-msgid ""
-"SSO enables you to delegate user login and registration from Misago tothe "
-"third party site."
-msgstr ""
-
-#: conf/admin/__init__.py:86 templates/misago/admin/dashboard/analytics.html:7
+#: conf/admin/__init__.py:72 templates/misago/admin/dashboard/analytics.html:7
 #: templates/misago/admin/dashboard/index.html:40
 msgid "Analytics"
 msgstr ""
 
-#: conf/admin/__init__.py:87
+#: conf/admin/__init__.py:73
 msgid "Enable Google Analytics or setup Google Site Verification."
 msgstr ""
 
-#: conf/admin/__init__.py:94
+#: conf/admin/__init__.py:80
 msgid "Threads, posts, polls and attachments options."
 msgstr ""
 
@@ -550,8 +538,8 @@ msgstr ""
 
 #: conf/admin/forms/analytics.py:27
 msgid ""
-"This token was extracted from uploaded site verification file. To change it,"
-" upload new verification file."
+"This token was extracted from uploaded site verification file. To change it, "
+"upload new verification file."
 msgstr ""
 
 #: conf/admin/forms/analytics.py:34
@@ -768,39 +756,6 @@ msgid ""
 "Address under which site is running appears to be \"%(address)s\"."
 msgstr ""
 
-#: conf/admin/forms/sso.py:13
-msgid "Enable Single Sign-On"
-msgstr ""
-
-#: conf/admin/forms/sso.py:15
-msgid ""
-"Enabling SSO will make login option redirect users to the server URL "
-"configured below. It will also disable option to register on forum, change "
-"username, email or passward, as those features will be delegated to the 3rd "
-"party site."
-msgstr ""
-
-#: conf/admin/forms/sso.py:22
-msgid "Public key"
-msgstr ""
-
-#: conf/admin/forms/sso.py:24 conf/admin/forms/sso.py:32
-msgid ""
-"Leave this field empty for Misago to generate this key on form submission."
-msgstr ""
-
-#: conf/admin/forms/sso.py:30
-msgid "Private key"
-msgstr ""
-
-#: conf/admin/forms/sso.py:37
-msgid "Server URL"
-msgstr ""
-
-#: conf/admin/forms/sso.py:50
-msgid "You need to enter server URL to enable SSO."
-msgstr ""
-
 #: conf/admin/forms/threads.py:27
 msgid "Daily post limit per user"
 msgstr ""
@@ -859,10 +814,10 @@ msgstr ""
 
 #: conf/admin/forms/threads.py:71
 msgid ""
-"Controls amount of data used by read-tracking system. All content older than"
-" number of days specified in this setting is considered old and read, even "
-"if the opposite is true for the user. Active forums can try lowering this "
-"value while less active ones may wish to increase it instead. "
+"Controls amount of data used by read-tracking system. All content older than "
+"number of days specified in this setting is considered old and read, even if "
+"the opposite is true for the user. Active forums can try lowering this value "
+"while less active ones may wish to increase it instead. "
 msgstr ""
 
 #: conf/admin/forms/threads.py:80
@@ -942,8 +897,8 @@ msgstr ""
 
 #: conf/admin/forms/users.py:48
 msgid ""
-"Delete new inactive accounts if they weren't activated within this number of"
-" days"
+"Delete new inactive accounts if they weren't activated within this number of "
+"days"
 msgstr ""
 
 #: conf/admin/forms/users.py:51
@@ -999,8 +954,8 @@ msgstr "Rétrograder vers l’avatar universel par défaut"
 
 #: conf/admin/forms/users.py:86
 msgid ""
-"Select which avatar to use when user has no gravatar associated with their "
-"e-mail address."
+"Select which avatar to use when user has no gravatar associated with their e-"
+"mail address."
 msgstr ""
 
 #: conf/admin/forms/users.py:96
@@ -1038,8 +993,8 @@ msgstr "Mettre sur la liste des fils de discussion surveillés"
 #: conf/admin/forms/users.py:119 conf/admin/forms/users.py:131
 msgid "Put on watched threads list and e-mail user when somebody replies"
 msgstr ""
-"Mettre sur la liste des fils de discussion surveillés et envoyer un courriel"
-" à l'utilisateur quand quelqu'un répond"
+"Mettre sur la liste des fils de discussion surveillés et envoyer un courriel "
+"à l'utilisateur quand quelqu'un répond"
 
 #: conf/admin/forms/users.py:125
 msgid "Replied threads"
@@ -1112,44 +1067,44 @@ msgstr ""
 msgid "This value must be lower than number of users per page."
 msgstr ""
 
-#: conf/admin/views.py:40
+#: conf/admin/views.py:39
 msgid "Settings have been saved."
 msgstr ""
 
-#: core/errorpages.py:42
+#: core/errorpages.py:51
 msgid "Permission denied."
 msgstr "Autorisation refusée."
 
-#: core/errorpages.py:71
+#: core/errorpages.py:80
 msgid ""
 "A problem was encountered when disconnecting your account from the remote "
 "site."
 msgstr ""
 
-#: core/errorpages.py:75
+#: core/errorpages.py:84
 msgid ""
 "You are not allowed to disconnect your account from the other site, because "
 "currently it's the only way to sign in to your account."
 msgstr ""
 
-#: core/errorpages.py:80
+#: core/errorpages.py:89
 #, python-format
 msgid "A problem was encountered when signing you in using %(backend)s."
 msgstr ""
 
-#: core/errorpages.py:84
+#: core/errorpages.py:93
 msgid "The sign in process has been canceled by user."
 msgstr ""
 
-#: core/errorpages.py:86
+#: core/errorpages.py:95
 msgid "The other service could not be reached."
 msgstr ""
 
-#: core/errorpages.py:92
+#: core/errorpages.py:101
 msgid "Unexpected problem has been encountered during sign in process."
 msgstr ""
 
-#: core/errorpages.py:113
+#: core/errorpages.py:122
 msgid ""
 "Your request was rejected because your browser didn't send the CSRF cookie, "
 "or the cookie sent was invalid."
@@ -1196,8 +1151,8 @@ msgstr ""
 #: templates/misago/admin/dashboard/checks.html:17
 #: templates/misago/admin/dashboard/index.html:33
 msgid ""
-"Version check feature relies on the API operated by the Python Package Index"
-" (pypi.org) API to retrieve latest Misago release version."
+"Version check feature relies on the API operated by the Python Package Index "
+"(pypi.org) API to retrieve latest Misago release version."
 msgstr ""
 
 #: graphql/admin/versioncheck.py:70
@@ -1524,11 +1479,11 @@ msgstr "Rechercher"
 msgid "Can search site"
 msgstr "Peut rechercher sur le site"
 
-#: socialauth/admin/__init__.py:42
+#: socialauth/admin/__init__.py:40
 msgid "Social login"
 msgstr ""
 
-#: socialauth/admin/__init__.py:44
+#: socialauth/admin/__init__.py:42
 msgid "Enable users to sign on and login using their social profile."
 msgstr ""
 
@@ -1551,9 +1506,9 @@ msgstr ""
 #: socialauth/admin/forms/base.py:39
 msgid ""
 "Enabling this option will result in the user being signed in if their forum "
-"account was registered using same e-mail address as used on the social site."
-" Otherwise they will be asked to specify a different e-mail to continue sign"
-" in using social site."
+"account was registered using same e-mail address as used on the social site. "
+"Otherwise they will be asked to specify a different e-mail to continue sign "
+"in using social site."
 msgstr ""
 
 #: socialauth/admin/forms/base.py:51 socialauth/admin/forms/base.py:53
@@ -1612,8 +1567,8 @@ msgstr ""
 #: socialauth/pipeline.py:88
 #, python-format
 msgid ""
-"The e-mail address associated with your %(backend)s account is not available"
-" for use on this site."
+"The e-mail address associated with your %(backend)s account is not available "
+"for use on this site."
 msgstr ""
 
 #: socialauth/pipeline.py:98
@@ -1627,18 +1582,6 @@ msgstr ""
 msgid "Please try resubmitting the form."
 msgstr "Veuillez resoumettre le formulaire."
 
-#: socialauth/views.py:23
-msgid "Please use the 3rd party site to login."
-msgstr ""
-
-#: sso/validators.py:24 users/forms/register.py:34 users/validators.py:80
-msgid "This username is not allowed."
-msgstr "Ce nom d'utilisateur n'est pas autorisé."
-
-#: sso/validators.py:33 users/forms/register.py:45 users/validators.py:52
-msgid "This e-mail address is not allowed."
-msgstr "Ce courriel n'est pas autorisé."
-
 #: templates/misago/acl_debug.html:5
 #, python-format
 msgid ""
@@ -1691,8 +1634,8 @@ msgstr "Demandez un lien d'activation"
 
 #: templates/misago/activation/request.html:25
 msgid ""
-"The site administrator may impose a requirement on newly registered accounts"
-" to be activated before users will be able to sign in."
+"The site administrator may impose a requirement on newly registered accounts "
+"to be activated before users will be able to sign in."
 msgstr ""
 
 #: templates/misago/activation/request.html:28
@@ -2063,7 +2006,7 @@ msgstr "Catégorie"
 #: templates/misago/admin/dashboard/totals.html:31
 #: templates/misago/admin/users/list.html:21
 #: templates/misago/profile/posts.html:5 templates/misago/profile/posts.html:8
-#: templates/misago/profile/posts.html:9 users/apps.py:102
+#: templates/misago/profile/posts.html:9 users/apps.py:93
 msgid "Posts"
 msgstr "Messages"
 
@@ -2207,56 +2150,45 @@ msgstr ""
 msgid "Attachment error images"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:9
-#: templates/misago/admin/socialauth/list.html:97
-msgid "Note"
-msgstr ""
-
-#: templates/misago/admin/conf/users_settings.html:9
-msgid ""
-"Single Sign-On is enabled. Site's registration, password and deletion "
-"features have been disabled and delegated to the third-party site."
-msgstr ""
-
-#: templates/misago/admin/conf/users_settings.html:14
+#: templates/misago/admin/conf/users_settings.html:8
 msgid "New accounts"
 msgstr "Nouveaux comptes"
 
-#: templates/misago/admin/conf/users_settings.html:23 users/admin/forms.py:484
+#: templates/misago/admin/conf/users_settings.html:17 users/admin/forms.py:484
 #: users/admin/forms.py:573
 msgid "Usernames"
 msgstr "Noms d'utilisateurs"
 
-#: templates/misago/admin/conf/users_settings.html:33
+#: templates/misago/admin/conf/users_settings.html:27
 msgid "Avatars"
 msgstr "Avatars"
 
-#: templates/misago/admin/conf/users_settings.html:49
+#: templates/misago/admin/conf/users_settings.html:43
 msgid "Signatures"
 msgstr "Signatures"
 
-#: templates/misago/admin/conf/users_settings.html:57
+#: templates/misago/admin/conf/users_settings.html:51
 #: users/admin/__init__.py:80
 msgid "Data downloads"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:66
+#: templates/misago/admin/conf/users_settings.html:60
 msgid "Own account deletion"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:74 users/admin/forms.py:492
+#: templates/misago/admin/conf/users_settings.html:68 users/admin/forms.py:492
 msgid "IP addresses"
 msgstr "Adresses IP"
 
-#: templates/misago/admin/conf/users_settings.html:82
+#: templates/misago/admin/conf/users_settings.html:76
 msgid "Default subscription preferences"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:91
+#: templates/misago/admin/conf/users_settings.html:85
 msgid "Users lists"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:100
+#: templates/misago/admin/conf/users_settings.html:94
 msgid "Top posters ranking"
 msgstr ""
 
@@ -2379,9 +2311,8 @@ msgstr ""
 msgid "Site analytics are currently unavailable due to an error."
 msgstr ""
 
-#: templates/misago/admin/dashboard/totals.html:43
-#: threads/admin/__init__.py:38 threads/permissions/attachments.py:11
-#: threads/permissions/attachments.py:29
+#: templates/misago/admin/dashboard/totals.html:43 threads/admin/__init__.py:36
+#: threads/permissions/attachments.py:11 threads/permissions/attachments.py:29
 msgid "Attachments"
 msgstr "Pièces jointes"
 
@@ -2500,20 +2431,20 @@ msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:12
 msgid ""
-"The form was sent after being opened in the browser for a long time (eg. few"
-" days) and cookie token has expired."
+"The form was sent after being opened in the browser for a long time (eg. few "
+"days) and cookie token has expired."
 msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:15
 msgid ""
-"The site is configured to use the HTTPS, but this form was sent over the the"
-" HTTP."
+"The site is configured to use the HTTPS, but this form was sent over the the "
+"HTTP."
 msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:16
 msgid ""
-"If you are an owner of this site, please check if the HTTPS certificate used"
-" by the site is valid and accepted by the browser."
+"If you are an owner of this site, please check if the HTTPS certificate used "
+"by the site is valid and accepted by the browser."
 msgstr ""
 
 #: templates/misago/admin/generic/filter_form.html:7
@@ -2770,8 +2701,7 @@ msgstr "Affichage et visibilité"
 #: templates/misago/admin/ranks/list.html:17
 #: templates/misago/admin/users/list.html:19
 #: templates/misago/userslists/active_posters.html:112
-#: templates/misago/userslists/active_posters.html:123
-#: users/admin/forms.py:238
+#: templates/misago/userslists/active_posters.html:123 users/admin/forms.py:238
 msgid "Rank"
 msgstr "Rang"
 
@@ -2836,7 +2766,7 @@ msgid "Enabled login methods"
 msgstr ""
 
 #: templates/misago/admin/socialauth/list.html:15
-#: templates/misago/admin/socialauth/list.html:112
+#: templates/misago/admin/socialauth/list.html:106
 msgid "Provider"
 msgstr ""
 
@@ -2852,25 +2782,19 @@ msgstr ""
 msgid "Are you sure you want to disable this social login provider?"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:97
-msgid ""
-"Single Sign-On is enabled. Social authentication has been disabled and "
-"delegated to the third-party site."
-msgstr ""
-
-#: templates/misago/admin/socialauth/list.html:106
+#: templates/misago/admin/socialauth/list.html:100
 msgid "Setup new login method"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:125
+#: templates/misago/admin/socialauth/list.html:119
 msgid "Setup login with this provider"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:126
+#: templates/misago/admin/socialauth/list.html:120
 msgid "Setup"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:133
+#: templates/misago/admin/socialauth/list.html:127
 msgid "No new login providers are available for setup at this time."
 msgstr ""
 
@@ -3169,7 +3093,7 @@ msgstr ""
 msgid "Signature"
 msgstr "Signature"
 
-#: templates/misago/admin/users/edit.html:228 users/apps.py:27
+#: templates/misago/admin/users/edit.html:228 users/apps.py:24
 msgid "Forum options"
 msgstr "Options du forum"
 
@@ -3189,8 +3113,7 @@ msgstr ""
 
 #: templates/misago/admin/users/edit.html:251
 msgid ""
-"No additional action is required. This account will be deleted "
-"automatically."
+"No additional action is required. This account will be deleted automatically."
 msgstr ""
 
 #: templates/misago/admin/users/edit.html:294
@@ -3370,8 +3293,7 @@ msgstr "Vous pouvez maintenant vous connecter à l'aide de %(login_form)s."
 #: templates/misago/emails/activation/by_admin.txt:10
 msgid "You can now sign in to it using the form below:"
 msgstr ""
-"Vous pouvez maintenant vous connecter en utilisant le formulaire ci-dessous "
-":"
+"Vous pouvez maintenant vous connecter en utilisant le formulaire ci-dessous :"
 
 #: templates/misago/emails/activation/by_user.html:6
 #: templates/misago/emails/activation/by_user.txt:6
@@ -3388,8 +3310,8 @@ msgstr "Activer mon compte !"
 #: templates/misago/emails/change_email.txt:6
 #, python-format
 msgid ""
-"%(user)s, you are receiving this message because you have changed your "
-"e-mail address."
+"%(user)s, you are receiving this message because you have changed your e-"
+"mail address."
 msgstr ""
 "%(user)s, vous recevez ce message car vous avez changé votre adresse e-mail."
 
@@ -3423,8 +3345,8 @@ msgstr ""
 #: templates/misago/emails/change_password_form_link.txt:10
 msgid "To change your account password click the link below:"
 msgstr ""
-"Pour changer le mot de passe de votre compte, cliquez sur le lien ci-dessous"
-" :"
+"Pour changer le mot de passe de votre compte, cliquez sur le lien ci-"
+"dessous :"
 
 #: templates/misago/emails/change_password_form_link.html:16
 #: templates/misago/forgottenpassword/form.html:7
@@ -3442,7 +3364,7 @@ msgid ""
 "download."
 msgstr ""
 
-#: templates/misago/emails/data_download.html:11 users/apps.py:57
+#: templates/misago/emails/data_download.html:11 users/apps.py:52
 msgid "Download data"
 msgstr ""
 
@@ -3528,11 +3450,11 @@ msgstr ""
 #: templates/misago/emails/register/inactive.html:12
 #: templates/misago/emails/register/inactive.txt:15
 msgid ""
-"This may take a while, but you will receive e-mail with notification once it"
-" happens."
+"This may take a while, but you will receive e-mail with notification once it "
+"happens."
 msgstr ""
-"Cela peut prendre un certain temps, vous recevrez une notification par "
-"e-mail une fois la tâche effectuée."
+"Cela peut prendre un certain temps, vous recevrez une notification par e-"
+"mail une fois la tâche effectuée."
 
 #: templates/misago/emails/register/inactive.html:17
 #: templates/misago/emails/register/inactive.txt:20
@@ -3739,8 +3661,8 @@ msgstr ""
 
 #: templates/misago/forgottenpassword/request.html:39
 msgid ""
-"Instead, you can change your password using special secure form that will be"
-" available by special link valid only for your browser, for seven days or "
+"Instead, you can change your password using special secure form that will be "
+"available by special link valid only for your browser, for seven days or "
 "until your password is changed."
 msgstr ""
 "Vous pouvez sinon modifier votre mot de passe via un formulaire sécurisé, "
@@ -3876,7 +3798,7 @@ msgstr "Voir les résultats"
 #: templates/misago/profile/ban_details.html:5
 #: templates/misago/profile/ban_details.html:8
 #: templates/misago/profile/ban_details.html:9
-#: templates/misago/profile/ban_details.html:16 users/apps.py:137
+#: templates/misago/profile/ban_details.html:16 users/apps.py:128
 msgid "Ban details"
 msgstr "Details de l'interdiction"
 
@@ -3925,7 +3847,7 @@ msgstr[1] "A initié %(threads)s fils de discussion"
 #: templates/misago/profile/details.html:5
 #: templates/misago/profile/details.html:8
 #: templates/misago/profile/details.html:9
-#: templates/misago/profile/details.html:19 users/apps.py:124
+#: templates/misago/profile/details.html:19 users/apps.py:115
 msgid "Details"
 msgstr "Détails"
 
@@ -3956,7 +3878,7 @@ msgstr ""
 
 #: templates/misago/profile/followers.html:5
 #: templates/misago/profile/followers.html:8
-#: templates/misago/profile/followers.html:9 users/apps.py:112
+#: templates/misago/profile/followers.html:9 users/apps.py:103
 msgid "Followers"
 msgstr "Suiveurs"
 
@@ -3985,7 +3907,7 @@ msgstr "Personne ne suit %(username)s."
 
 #: templates/misago/profile/follows.html:5
 #: templates/misago/profile/follows.html:8
-#: templates/misago/profile/follows.html:9 users/apps.py:118
+#: templates/misago/profile/follows.html:9 users/apps.py:109
 msgid "Follows"
 msgstr "Suit"
 
@@ -4073,7 +3995,7 @@ msgstr "%(username)s n'a démarré aucun fil de discussion."
 
 #: templates/misago/profile/username_history.html:5
 #: templates/misago/profile/username_history.html:8
-#: templates/misago/profile/username_history.html:9 users/apps.py:130
+#: templates/misago/profile/username_history.html:9 users/apps.py:121
 msgid "Username history"
 msgstr "Historique du nom d'utilisateur"
 
@@ -4166,8 +4088,7 @@ msgstr "Le fil de discussion n'est plus épinglé."
 #: templates/misago/thread/posts/event/index.html:61
 #, python-format
 msgid "Thread has been moved from %(from_category)s."
-msgstr ""
-"Le fil de discussion a été déplacé de la catégorie %(from_category)s. "
+msgstr "Le fil de discussion a été déplacé de la catégorie %(from_category)s. "
 
 #: templates/misago/thread/posts/event/index.html:68
 #, python-format
@@ -4262,8 +4183,8 @@ msgstr ""
 
 #: templates/misago/thread/posts/post/flags.html:29
 msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
 "Ce message n'a pas été approuvé. Seuls les utilisateurs disposant des "
 "autorisations nécessaires et son auteur peuvent voir son contenu."
@@ -4458,7 +4379,7 @@ msgstr "Sondage"
 
 #: templates/misago/userslists/active_posters.html:5
 #: templates/misago/userslists/active_posters.html:23
-#: templates/misago/userslists/active_posters.html:24 users/apps.py:81
+#: templates/misago/userslists/active_posters.html:24 users/apps.py:72
 msgid "Top posters"
 msgstr ""
 
@@ -4769,11 +4690,11 @@ msgstr ""
 msgid "Default Misago Theme"
 msgstr ""
 
-#: threads/admin/__init__.py:45
+#: threads/admin/__init__.py:43
 msgid "Attachment types"
 msgstr "Types de pièces jointes"
 
-#: threads/admin/__init__.py:46
+#: threads/admin/__init__.py:44
 msgid "Specify what files may be uploaded on the forum."
 msgstr ""
 
@@ -4823,8 +4744,7 @@ msgstr "Limiter les téléchargements à"
 
 #: threads/admin/forms.py:64
 msgid ""
-"List of comma separated file extensions associated with this attachment "
-"type."
+"List of comma separated file extensions associated with this attachment type."
 msgstr ""
 "Liste des extensions de fichiers séparées par des virgules associées à ce "
 "type de pièce jointe."
@@ -4858,8 +4778,8 @@ msgid ""
 "upload attachments of this type."
 msgstr ""
 "Si vous souhaitez limiter les options possibles pour télédéposer ce type de "
-"fichiers aux utilisateurs ayant des rôles spécifiques, sélectionnez-les dans"
-" cette liste. Autrement, si vous ne choisissez aucun rôle, tous les "
+"fichiers aux utilisateurs ayant des rôles spécifiques, sélectionnez-les dans "
+"cette liste. Autrement, si vous ne choisissez aucun rôle, tous les "
 "utilisateurs disposant de l'autorisation de télédéposer des fichiers "
 "pourront télédéposer des pièces jointes de ce type de fichier."
 
@@ -4871,8 +4791,8 @@ msgid ""
 "download attachments of this type."
 msgstr ""
 "Si vous souhaitez limiter les options possibles pour télécharger ce type de "
-"fichiers aux utilisateurs ayant des rôles spécifiques, sélectionnez-les dans"
-" cette liste. Autrement, si vous ne choisissez aucun rôle, tous les "
+"fichiers aux utilisateurs ayant des rôles spécifiques, sélectionnez-les dans "
+"cette liste. Autrement, si vous ne choisissez aucun rôle, tous les "
 "utilisateurs disposant de l'autorisation de télécharger des fichiers "
 "pourront télécharger des pièces jointes de ce type de fichier."
 
@@ -4940,8 +4860,7 @@ msgstr "le type de pièce jointe  « %(name)s » a été modifié."
 #: threads/admin/views/attachmenttypes.py:47
 #, python-format
 msgid ""
-"Attachment type \"%(name)s\" has associated attachments and can't be "
-"deleted."
+"Attachment type \"%(name)s\" has associated attachments and can't be deleted."
 msgstr ""
 "Le type de pièce jointe  « %(name)s » est associé à d'autres pièces jointes "
 "et ne peut être supprimé."
@@ -4972,8 +4891,8 @@ msgstr "Vous ne pouvez pas télédéposer de fichiers de ce type."
 msgid ""
 "You can't upload files larger than %(limit)s (your file has %(upload)s)."
 msgstr ""
-"Vous ne pouvez pas télédéposer des fichiers plus larges que %(limit)s (votre"
-" fichier fait %(upload)s)"
+"Vous ne pouvez pas télédéposer des fichiers plus larges que %(limit)s (votre "
+"fichier fait %(upload)s)"
 
 #: threads/api/attachments.py:104
 #, python-format
@@ -4981,8 +4900,8 @@ msgid ""
 "You can't upload files of this type larger than %(limit)s (your file has "
 "%(upload)s)."
 msgstr ""
-"Vous ne pouvez pas télédéposer de fichiers de ce type plus larges "
-"que%(limit)s(votre fichier fait %(upload)s)"
+"Vous ne pouvez pas télédéposer de fichiers de ce type plus larges que"
+"%(limit)s(votre fichier fait %(upload)s)"
 
 #: threads/api/postendpoints/edits.py:87
 msgid "Edits record is unavailable for this post."
@@ -5024,8 +4943,8 @@ msgstr "Vous ne pouvez pas séparer les messages de ce fil de discussion."
 #, python-format
 msgid "You don't have permission to remove \"%(attachment)s\" attachment."
 msgstr ""
-"Vous n'avez pas la permission de supprimer la pièce-jointe « %(attachment)s "
-"»."
+"Vous n'avez pas la permission de supprimer la pièce-jointe "
+"« %(attachment)s »."
 
 #: threads/api/postingendpoint/attachments.py:132
 #, python-format
@@ -5066,8 +4985,7 @@ msgstr "%(user)s a répondu à votre fil de discussion « %(thread)s »"
 #: threads/api/postingendpoint/emailnotification.py:46
 #, python-format
 msgid "%(user)s has replied to thread \"%(thread)s\" that you are watching"
-msgstr ""
-"%(user)s a répondu au fil de discussion « %(thread)s » que vous suivez"
+msgstr "%(user)s a répondu au fil de discussion « %(thread)s » que vous suivez"
 
 #: threads/api/postingendpoint/floodprotection.py:25
 msgid "You can't post message so quickly after previous one."
@@ -5175,8 +5093,7 @@ msgstr ""
 
 #: threads/api/threadendpoints/patch.py:273
 msgid ""
-"This post can't be unmarked because it's not currently marked as best "
-"answer."
+"This post can't be unmarked because it's not currently marked as best answer."
 msgstr ""
 
 #: threads/api/threadendpoints/patch.py:301
@@ -5289,10 +5206,10 @@ msgstr ""
 
 #: threads/participants.py:142
 #, python-format
-msgid "%(user)s has invited you to participate in private thread \"%(thread)s\""
+msgid ""
+"%(user)s has invited you to participate in private thread \"%(thread)s\""
 msgstr ""
-"%(user)s vous a invité à participer au fil de discussion privé « %(thread)s "
-"»"
+"%(user)s vous a invité à participer au fil de discussion privé « %(thread)s »"
 
 #: threads/permissions/attachments.py:14
 msgid "Max attached file size (in kb)"
@@ -5384,8 +5301,8 @@ msgstr ""
 #: threads/permissions/bestanswers.py:188
 #, python-format
 msgid ""
-"You don't have permission to change this thread's marked answer because it's"
-" in the \"%(category)s\" category."
+"You don't have permission to change this thread's marked answer because it's "
+"in the \"%(category)s\" category."
 msgstr ""
 
 #: threads/permissions/bestanswers.py:198
@@ -5448,8 +5365,8 @@ msgstr ""
 
 #: threads/permissions/bestanswers.py:274
 msgid ""
-"You can't unmark this thread's best answer because it's closed and you don't"
-" have permission to open it."
+"You can't unmark this thread's best answer because it's closed and you don't "
+"have permission to open it."
 msgstr ""
 
 #: threads/permissions/bestanswers.py:282
@@ -5623,8 +5540,7 @@ msgstr "Le sondage est clos. Vous ne pouvez pas le supprimer."
 
 #: threads/permissions/polls.py:207
 msgid "This category is closed. You can't delete polls in it."
-msgstr ""
-"Cette catégorie est close. Vous ne pouvez pas y supprimer de sondages."
+msgstr "Cette catégorie est close. Vous ne pouvez pas y supprimer de sondages."
 
 #: threads/permissions/polls.py:211
 msgid "This thread is closed. You can't delete polls in it."
@@ -5687,11 +5603,11 @@ msgstr "Peut signaler des fils de discussion privés"
 
 #: threads/permissions/privatethreads.py:52
 msgid ""
-"Allows user to report private threads they are participating in, making them"
-" accessible to moderators."
+"Allows user to report private threads they are participating in, making them "
+"accessible to moderators."
 msgstr ""
-"Permet à l'utilisateur de signaler des fils de discussion privés auxquels il"
-" participe, le rendant accessible aux modérateurs."
+"Permet à l'utilisateur de signaler des fils de discussion privés auxquels il "
+"participe, le rendant accessible aux modérateurs."
 
 #: threads/permissions/privatethreads.py:57
 msgid "Can moderate private threads"
@@ -5717,8 +5633,8 @@ msgstr "Vous ne pouvez pas utiliser de fils de discussion privés."
 #: threads/permissions/privatethreads.py:210
 msgid "Only thread owner and moderators can change threads owners."
 msgstr ""
-"Seul le propriétaire du fil de discussion et les modérateurs peuvent changer"
-" la propriété d'un fil de discussion."
+"Seul le propriétaire du fil de discussion et les modérateurs peuvent changer "
+"la propriété d'un fil de discussion."
 
 #: threads/permissions/privatethreads.py:214
 msgid "Only moderators can change closed threads owners."
@@ -5775,8 +5691,7 @@ msgstr ""
 #, python-format
 msgid "%(user)s limits invitations to private threads to followed users."
 msgstr ""
-"%(user)s limite les invitations aux fils privés pour les utilisateurs "
-"suivis."
+"%(user)s limite les invitations aux fils privés pour les utilisateurs suivis."
 
 #: threads/permissions/threads.py:76
 msgid "Can see unapproved content list"
@@ -5786,15 +5701,15 @@ msgstr "Peut voir la liste de contenu non approuvé"
 msgid ""
 "Allows access to \"unapproved\" tab on threads lists for easy listing of "
 "threads that are unapproved or contain unapproved posts. Despite the tab "
-"being available on all threads lists, it will only display threads belonging"
-" to categories in which the user has permission to approve content."
+"being available on all threads lists, it will only display threads belonging "
+"to categories in which the user has permission to approve content."
 msgstr ""
 "Permet l'accès à des onglets « non approuvés » dans les listes de "
 "discussions, pour lister facilement les fils de discussion qui ne sont pas "
 "approuvés ou qui contiennent des messages non approuvés. Bien que l'onglet "
 "soit disponible sur toutes les listes de discussion, il ne montrera que les "
-"fils de discussions appartenant aux catégories dans lesquelles l'utilisateur"
-" a la permission d'approuver du contenu."
+"fils de discussions appartenant aux catégories dans lesquelles l'utilisateur "
+"a la permission d'approuver du contenu."
 
 #: threads/permissions/threads.py:87
 msgid "Can see reported content list"
@@ -5868,8 +5783,8 @@ msgstr ""
 #: threads/permissions/threads.py:134
 msgid "Enter 0 to don't limit time for editing own threads."
 msgstr ""
-"Entrer 0 pour ne pas limiter la durée de modification de ses propres fils de"
-" discussion."
+"Entrer 0 pour ne pas limiter la durée de modification de ses propres fils de "
+"discussion."
 
 #: threads/permissions/threads.py:139
 msgid "Can hide all threads"
@@ -5918,8 +5833,7 @@ msgstr "Peut masquer ses propres messages"
 #: threads/permissions/threads.py:164
 msgid "Only last posts to thread made within edit time limit can be hidden."
 msgstr ""
-"Seuls les messages écrits avant le délai de modification peuvent être "
-"cachés."
+"Seuls les messages écrits avant le délai de modification peuvent être cachés."
 
 #: threads/permissions/threads.py:168 threads/permissions/threads.py:180
 msgid "Hide posts"
@@ -6087,8 +6001,7 @@ msgstr ""
 #, python-format
 msgid "You can't edit threads that are older than %(minutes)s minute."
 msgid_plural "You can't edit threads that are older than %(minutes)s minutes."
-msgstr[0] ""
-"Vous ne pouvez pas éditer des fils antérieurs à %(minutes)s minute."
+msgstr[0] "Vous ne pouvez pas éditer des fils antérieurs à %(minutes)s minute."
 msgstr[1] ""
 "Vous ne pouvez pas modifier des fils de discussion antérieurs à %(minutes)s "
 "minutes."
@@ -6261,8 +6174,8 @@ msgstr ""
 #: threads/permissions/threads.py:804
 msgid "This thread is closed. You can't merge it with other threads."
 msgstr ""
-"Ce fil de discussion est clos. Vous ne pouvez pas le fusionner avec d'autres"
-" fils."
+"Ce fil de discussion est clos. Vous ne pouvez pas le fusionner avec d'autres "
+"fils."
 
 #: threads/permissions/threads.py:813
 msgid "You have to sign in to approve threads."
@@ -6435,11 +6348,11 @@ msgstr "Le message est protégé. Vous ne pouvez pas le supprimer."
 msgid "You can't delete posts that are older than %(minutes)s minute."
 msgid_plural "You can't delete posts that are older than %(minutes)s minutes."
 msgstr[0] ""
-"Vous ne pouvez pas supprimer les publications plus anciennes que %(minutes)s"
-" minute."
+"Vous ne pouvez pas supprimer les publications plus anciennes que %(minutes)s "
+"minute."
 msgstr[1] ""
-"Vous ne pouvez pas supprimer les publications plus anciennes que %(minutes)s"
-" minutes."
+"Vous ne pouvez pas supprimer les publications plus anciennes que %(minutes)s "
+"minutes."
 
 #: threads/permissions/threads.py:1035
 msgid "You can't delete thread's first post."
@@ -6448,8 +6361,7 @@ msgstr ""
 
 #: threads/permissions/threads.py:1040
 msgid "This category is closed. You can't delete posts in it."
-msgstr ""
-"Cette catégorie est close. Vous ne pouvez pas y supprimer de messages."
+msgstr "Cette catégorie est close. Vous ne pouvez pas y supprimer de messages."
 
 #: threads/permissions/threads.py:1044
 msgid "This thread is closed. You can't delete posts in it."
@@ -6490,8 +6402,7 @@ msgstr ""
 
 #: threads/permissions/threads.py:1090
 msgid "This category is closed. You can't approve posts in it."
-msgstr ""
-"Cette catégorie est close. Vous ne pouvez pas y approuver de messages."
+msgstr "Cette catégorie est close. Vous ne pouvez pas y approuver de messages."
 
 #: threads/permissions/threads.py:1094
 msgid "This thread is closed. You can't approve posts in it."
@@ -6518,8 +6429,7 @@ msgstr ""
 #: threads/permissions/threads.py:1116
 msgid "You can't move posts the content you can't see."
 msgstr ""
-"Vous ne pouvez pas déplacer des messages dont vous ne pouvez voir le "
-"contenu."
+"Vous ne pouvez pas déplacer des messages dont vous ne pouvez voir le contenu."
 
 #: threads/permissions/threads.py:1121
 msgid "This category is closed. You can't move posts in it."
@@ -6674,8 +6584,7 @@ msgstr[1] ""
 #: threads/serializers/moderation.py:156
 msgid "Posts made by different users can't be merged."
 msgstr ""
-"Des messages écrits par différents utilisateurs ne peuvent pas être "
-"fusionnés"
+"Des messages écrits par différents utilisateurs ne peuvent pas être fusionnés"
 
 #: threads/serializers/moderation.py:169
 msgid "Post marked as best answer can't be merged with thread's first post."
@@ -6843,14 +6752,13 @@ msgstr[0] ""
 "Vous ne pouvez pas ajouter plus de %(limit_value)soption à un seul sondage "
 "(%(show_value)s ajoutées)."
 msgstr[1] ""
-"Vous ne pouvez pas ajouter plus de %(limit_value)s options à un seul sondage"
-" (%(show_value)s ajoutées)."
+"Vous ne pouvez pas ajouter plus de %(limit_value)s options à un seul sondage "
+"(%(show_value)s ajoutées)."
 
 #: threads/serializers/poll.py:134
 msgid "Number of allowed choices can't be greater than number of all choices."
 msgstr ""
-"Le nombre de choix autorisés ne peut être supérieur au nombre de choix "
-"totaux"
+"Le nombre de choix autorisés ne peut être supérieur au nombre de choix totaux"
 
 #: threads/serializers/pollvote.py:15
 #, python-format
@@ -6946,8 +6854,8 @@ msgid_plural ""
 "Thread title cannot be longer than %(limit_value)s characters (it has "
 "%(show_value)s)."
 msgstr[0] ""
-"Le titre du fil ne peut pas dépasser %(limit_value)s caractère (Actuellement"
-" %(show_value)s)."
+"Le titre du fil ne peut pas dépasser %(limit_value)s caractère (Actuellement "
+"%(show_value)s)."
 msgstr[1] ""
 "Le titre du fil ne peut pas dépasser %(limit_value)s caractères "
 "(actuellement %(show_value)s)."
@@ -7005,8 +6913,8 @@ msgstr "Contenu non approuvé"
 #: threads/viewmodels/threads.py:32
 msgid "You have to sign in to see list of threads that you have started."
 msgstr ""
-"Vous devez vous identifier pour accéder aux fils de discussion que vous avez"
-" débutés"
+"Vous devez vous identifier pour accéder aux fils de discussion que vous avez "
+"débutés"
 
 #: threads/viewmodels/threads.py:34
 msgid "You have to sign in to see list of threads you haven't read."
@@ -7017,14 +6925,14 @@ msgstr ""
 #: threads/viewmodels/threads.py:36
 msgid "You have to sign in to see list of threads with new replies."
 msgstr ""
-"Vous devez vous identifier pour accéder aux fils de discussion comportant de"
-" nouvelles réponses"
+"Vous devez vous identifier pour accéder aux fils de discussion comportant de "
+"nouvelles réponses"
 
 #: threads/viewmodels/threads.py:39
 msgid "You have to sign in to see list of threads you are subscribing."
 msgstr ""
-"Vous devez vous identifier pour accéder aux fils de discussion auxquels vous"
-" êtes abonnés"
+"Vous devez vous identifier pour accéder aux fils de discussion auxquels vous "
+"êtes abonnés"
 
 #: threads/viewmodels/threads.py:42
 msgid "You have to sign in to see list of threads with unapproved posts."
@@ -7091,8 +6999,8 @@ msgstr "Est administrateur"
 #: users/admin/forms.py:78
 msgid ""
 "Designates whether the user can log into admin sites. If Django admin site "
-"is enabled, this user will need additional permissions assigned within it to"
-" admin Django modules."
+"is enabled, this user will need additional permissions assigned within it to "
+"admin Django modules."
 msgstr ""
 "Indique si l'utilisateur peut se connecter aux sites d'administration.Si le "
 "site d'administration de Django est activé, cet utilisateur aura besoin "
@@ -7120,8 +7028,8 @@ msgid ""
 "Designates whether this user should be treated as active. Turning this off "
 "is non-destructible way to remove user accounts."
 msgstr ""
-"indique si cet utilisateur doit être considéré comme actif. Désactiver cette"
-" option est un moyen non destructif de supprimer les comptes utilisateurs."
+"indique si cet utilisateur doit être considéré comme actif. Désactiver cette "
+"option est un moyen non destructif de supprimer les comptes utilisateurs."
 
 #: users/admin/forms.py:97 users/admin/forms.py:128 users/admin/forms.py:158
 msgid "Staff message"
@@ -7161,8 +7069,8 @@ msgid ""
 "Optional message for user explaining why he/she is banned form changing "
 "avatar."
 msgstr ""
-"Message optionnel à l'attention d'un utilisateur pour lui expliquer pourquoi"
-" il ou elle a été empêche de changer d'avatar"
+"Message optionnel à l'attention d'un utilisateur pour lui expliquer pourquoi "
+"il ou elle a été empêche de changer d'avatar"
 
 #: users/admin/forms.py:130
 msgid ""
@@ -7175,8 +7083,8 @@ msgstr ""
 #: users/admin/forms.py:138
 msgid "Signature contents"
 msgstr ""
-"Indique si cet utilisateur doit être considéré comme actif. Désactiver cette"
-" option est un moyen non destructif de supprimer les comptes utilisateurs."
+"Indique si cet utilisateur doit être considéré comme actif. Désactiver cette "
+"option est un moyen non destructif de supprimer les comptes utilisateurs."
 
 #: users/admin/forms.py:143
 msgid "Lock signature"
@@ -7280,11 +7188,11 @@ msgstr "Titre d'un utilisateur"
 
 #: users/admin/forms.py:397
 msgid ""
-"Optional, singular version of rank name displayed by user names. For example"
-" \"GM\" or \"Dev\"."
+"Optional, singular version of rank name displayed by user names. For example "
+"\"GM\" or \"Dev\"."
 msgstr ""
-"Version unique et optionnelle du rang affiché par les noms utilisateurs. Par"
-" exemple « GM » OU « Dev »."
+"Version unique et optionnelle du rang affiché par les noms utilisateurs. Par "
+"exemple « GM » OU « Dev »."
 
 #: users/admin/forms.py:407
 msgid ""
@@ -7300,14 +7208,13 @@ msgstr " Rôles d'utilisateurs"
 
 #: users/admin/forms.py:416
 msgid "Rank can give additional roles to users with it."
-msgstr ""
-"Les rangs peuvent conférer des rôles supplémentaires aux utilisateurs."
+msgstr "Les rangs peuvent conférer des rôles supplémentaires aux utilisateurs."
 
 #: users/admin/forms.py:422
 msgid "Optional css class added to content belonging to this rank owner."
 msgstr ""
-"La classe CSS optionnelle est ajoutée au contenu possédé par le propriétaire"
-" de ce rang."
+"La classe CSS optionnelle est ajoutée au contenu possédé par le propriétaire "
+"de ce rang."
 
 #: users/admin/forms.py:426
 msgid "Give rank dedicated tab on users list"
@@ -7319,8 +7226,8 @@ msgid ""
 "others through dedicated page on forum users list."
 msgstr ""
 "Sélectionner cette option permettra de rendre les utilisateurs avec ce rang "
-"plus facilement détectable par les autres via une page dédiée sur le forum à"
-" la liste des utilisateurs."
+"plus facilement détectable par les autres via une page dédiée sur le forum à "
+"la liste des utilisateurs."
 
 #: users/admin/forms.py:447
 msgid "This name collides with other rank."
@@ -7401,8 +7308,8 @@ msgid ""
 "beginning with \"83.\"."
 msgstr ""
 "Cette valeur est insensible à la casse et accepte l'astérisque (*) pour les "
-"résultats bruts. Par exemple, interdire IP pour la valeur « 83.* » interdira"
-" toutes les adresses IP commençant par « 83. »."
+"résultats bruts. Par exemple, interdire IP pour la valeur « 83.* » interdira "
+"toutes les adresses IP commençant par « 83. »."
 
 #: users/admin/forms.py:520
 msgid "Banned value can't be longer than 250 characters."
@@ -7441,8 +7348,8 @@ msgstr ""
 
 #: users/admin/forms.py:624
 msgid ""
-"Enter every item in new line. Duplicates will be ignored. This field is case"
-" insensitive. Depending on site configuration and amount of data to archive "
+"Enter every item in new line. Duplicates will be ignored. This field is case "
+"insensitive. Depending on site configuration and amount of data to archive "
 "it may take up to few days for requests to complete. E-mail will "
 "notification will be sent to every user once their download is ready."
 msgstr ""
@@ -7683,27 +7590,22 @@ msgstr "Le nouvel utilisateur « %(user)s » a été enregistré."
 msgid "User \"%(user)s\" has been edited."
 msgstr "L'utilisateur « %(user)s » a été modifié."
 
-#: users/api/auth.py:42 users/api/auth.py:92 users/api/auth.py:130
-#: users/api/auth.py:174
-msgid "Please use the 3rd party site to authenticate."
-msgstr ""
-
-#: users/api/auth.py:100
+#: users/api/auth.py:94
 #, python-format
 msgid "Activate %(user)s account on %(forum_name)s forums"
 msgstr "Activer  %(user)s  sur les forums  %(forum_name)s "
 
-#: users/api/auth.py:138
+#: users/api/auth.py:129
 #, python-format
 msgid "Change %(user)s password on %(forum_name)s forums"
 msgstr ""
 "Changer les mots de passe de  %(user)s  sur les forums  %(forum_name)s "
 
-#: users/api/auth.py:176
+#: users/api/auth.py:164
 msgid "Form link is invalid. Please try again."
 msgstr "Le lien associé à ce formulaire est non valide. Veuillez réessayer."
 
-#: users/api/auth.py:177
+#: users/api/auth.py:165
 msgid "Your link has expired. Please request new one."
 msgstr "votre lien a expiré. veuillez en demander un nouveau."
 
@@ -7802,8 +7704,8 @@ msgstr "Vous ne pouvez pas changer votre nom d'utilisateur maintenant."
 #: users/api/userendpoints/username.py:82
 msgid "Error changing username. Please try again."
 msgstr ""
-"Une erreur est survenue pendant le changement de nom d'utilisateur. Veuillez"
-" réessayer."
+"Une erreur est survenue pendant le changement de nom d'utilisateur. Veuillez "
+"réessayer."
 
 #: users/api/usernamechanges.py:28
 msgid "You don't have permission to see other users name history."
@@ -7814,83 +7716,63 @@ msgstr ""
 msgid "You have to sign in to perform this action."
 msgstr "Vous devez vous identifier pour réaliser cette action."
 
-#: users/api/users.py:90
-msgid "Please use the 3rd party site to register."
-msgstr ""
-
-#: users/api/users.py:113
+#: users/api/users.py:110
 msgid "You can't change other users avatars."
 msgstr "Vous ne pouvez modifier les avatars des autres utilisateurs."
 
-#: users/api/users.py:125
+#: users/api/users.py:122
 msgid "You can't change other users options."
 msgstr "Vous ne pouvez modifier les options des autres utilisateurs."
 
-#: users/api/users.py:130
+#: users/api/users.py:127
 msgid "Your forum options have been changed."
 msgstr "Les options de votre forum ont été modifiées."
 
-#: users/api/users.py:137
-msgid "Please use the 3rd party site to change your username."
-msgstr ""
-
-#: users/api/users.py:141
+#: users/api/users.py:133
 msgid "You can't change other users names."
 msgstr "Vous ne pouvez modifier les noms des autres utilisateurs."
 
-#: users/api/users.py:148
+#: users/api/users.py:140
 msgid "You can't change other users signatures."
 msgstr "Vous ne pouvez modifier les identifiants des autres utilisateurs."
 
-#: users/api/users.py:161
-msgid "Please use the 3rd party site to change your password."
-msgstr ""
-
-#: users/api/users.py:165
+#: users/api/users.py:152
 msgid "You can't change other users passwords."
 msgstr "Vous ne pouvez modifier les mots de passe des autres utilisateurs."
 
-#: users/api/users.py:175
-msgid "Please use the 3rd party site to change your e-mail."
-msgstr ""
-
-#: users/api/users.py:180
+#: users/api/users.py:162
 msgid "You can't change other users e-mail addresses."
 msgstr "Vous ne pouvez modifier les courriels des autres utilisateurs."
 
-#: users/api/users.py:211
-msgid "Please use the 3rd party site to delete account."
-msgstr ""
-
-#: users/api/users.py:292
+#: users/api/users.py:269
 msgid "You can't request data downloads for other users."
 msgstr ""
 
-#: users/api/users.py:296
+#: users/api/users.py:273
 msgid "You can't download your data."
 msgstr ""
 
-#: users/api/users.py:301
+#: users/api/users.py:278
 msgid "You can't have more than one data download request at a single time."
 msgstr ""
 
-#: users/api/users.py:358
+#: users/api/users.py:335
 msgid "You can't see other users data downloads."
 msgstr ""
 
-#: users/apps.py:33
+#: users/apps.py:30
 msgid "Edit details"
 msgstr "Modifier les détails"
 
-#: users/apps.py:39
+#: users/apps.py:36
 msgid "Change username"
 msgstr "Changer de nom d'utilisateur"
 
-#: users/apps.py:46
+#: users/apps.py:42
 msgid "Change email or password"
 msgstr "Changer le courriel ou le mot de passe"
 
-#: users/apps.py:71
+#: users/apps.py:63
 msgid "Delete account"
 msgstr "Supprimer le compte"
 
@@ -7971,7 +7853,7 @@ msgstr "Le courriel est invalide"
 msgid "No user with this e-mail exists."
 msgstr "Il n'existe pas d'utilisateur avec ce courriel."
 
-#: users/forms/auth.py:150 users/views/activation.py:51
+#: users/forms/auth.py:150 users/views/activation.py:46
 #, python-format
 msgid "%(user)s, your account is already active."
 msgstr "%(user)s, votre compte est déjà actif."
@@ -7997,6 +7879,14 @@ msgstr ""
 "Un administrateur doit d'abord activer votre compte pour que vous puissiez "
 "demander un nouveau mot de passe"
 
+#: users/forms/register.py:34 users/validators.py:80
+msgid "This username is not allowed."
+msgstr "Ce nom d'utilisateur n'est pas autorisé."
+
+#: users/forms/register.py:45 users/validators.py:52
+msgid "This e-mail address is not allowed."
+msgstr "Ce courriel n'est pas autorisé."
+
 #: users/forms/register.py:51
 msgid "This agreement is required."
 msgstr ""
@@ -8114,8 +8004,8 @@ msgid ""
 "limit. Enter zero to make all changes count."
 msgstr ""
 "Nombre de jours pour la comptabilisation d'un changement de nom. Au delà de "
-"cette limite, le changement n'est plus pris en compte, i.e. un changement de"
-" nom supplémentaire est autorisé. Entrez zéro pour aucune limite en temps."
+"cette limite, le changement n'est plus pris en compte, i.e. un changement de "
+"nom supplémentaire est autorisé. Entrez zéro pour aucune limite en temps."
 
 #: users/permissions/account.py:25
 msgid "Can have signature"
@@ -8425,14 +8315,14 @@ msgstr "Site internet"
 
 #: users/profilefields/default.py:41
 msgid ""
-"If you own website in the internet you wish to share on your profile you may"
-" enter its address here. Remember to for it to be valid http address "
-"starting with either \"http://\" or \"https://\"."
+"If you own website in the internet you wish to share on your profile you may "
+"enter its address here. Remember to for it to be valid http address starting "
+"with either \"http://\" or \"https://\"."
 msgstr ""
 "Si vous disposez d'un site internet que vous souhaitez partager sur votre "
 "profil, vous pouvez renseigner son adresse ici. Ne pas oublier de débuter "
-"l'adresse http soit par « http:// » soit par  « https:// » pour qu'elle soit"
-" valide."
+"l'adresse http soit par « http:// » soit par  « https:// » pour qu'elle soit "
+"valide."
 
 #: users/profilefields/default.py:49
 msgid "Skype ID"
@@ -8454,14 +8344,14 @@ msgstr "Pseudo twitter"
 #: users/profilefields/default.py:62
 #, python-format
 msgid ""
-"If you own Twitter account, here you may enter your Twitter handle for other"
-" users to find you. Starting your handle with \"@\" sign is optional. Either"
-" \"@%(slug)s\" or \"%(slug)s\" are valid values."
+"If you own Twitter account, here you may enter your Twitter handle for other "
+"users to find you. Starting your handle with \"@\" sign is optional. Either "
+"\"@%(slug)s\" or \"%(slug)s\" are valid values."
 msgstr ""
-"Si vous avez un compte Twitter, vous pouvez renseigner ici votre identifiant"
-" Twitter pour que d'autres utilisateurs puissent vous trouver.  Faire "
-"débuter votre identifiant par le signe « @ » sign n'est pas obligatoire. "
-"Soit « @%(slug)s » soit « %(slug)s » sont des valeurs acceptables."
+"Si vous avez un compte Twitter, vous pouvez renseigner ici votre identifiant "
+"Twitter pour que d'autres utilisateurs puissent vous trouver.  Faire débuter "
+"votre identifiant par le signe « @ » sign n'est pas obligatoire. Soit « @"
+"%(slug)s » soit « %(slug)s » sont des valeurs acceptables."
 
 #: users/profilefields/default.py:73
 msgid "This is not a valid twitter handle."
@@ -8571,11 +8461,7 @@ msgstr ""
 msgid "This email is not allowed."
 msgstr "Ce courriel n'est pas autorisé."
 
-#: users/views/activation.py:21
-msgid "Please use the 3rd party site to activate your account."
-msgstr ""
-
-#: users/views/activation.py:56
+#: users/views/activation.py:51
 #, python-format
 msgid ""
 "%(user)s, your activation link is invalid. Try again or request new "
@@ -8584,40 +8470,30 @@ msgstr ""
 "%(user)s, votre lien d'activation est invalide. Veuillez réessayer ou "
 "demander un nouveau lien d'activation. "
 
-#: users/views/activation.py:74
+#: users/views/activation.py:69
 #, python-format
 msgid "%(user)s, your account has been activated!"
 msgstr "%(user)s, votre compte a été activé !"
 
-#: users/views/forgottenpassword.py:18 users/views/options.py:70
-msgid "Please use the 3rd party site to change password."
-msgstr ""
-
-#: users/views/forgottenpassword.py:45
+#: users/views/forgottenpassword.py:31
 #, python-format
-msgid ""
-"%(user)s, your link has expired. Please request new link and try again."
+msgid "%(user)s, your link has expired. Please request new link and try again."
 msgstr ""
-"%(user)s, votre lien a expiré. Veuillez demande un nouveau lien et "
-"réessayer."
+"%(user)s, votre lien a expiré. Veuillez demande un nouveau lien et réessayer."
 
-#: users/views/forgottenpassword.py:52
+#: users/views/forgottenpassword.py:38
 #, python-format
 msgid "%(user)s, your link is invalid. Please try again or request new link."
 msgstr ""
-"%(user)s, votre lien est invalide. Veuillez réessayer et demander un nouveau"
-" lien."
-
-#: users/views/options.py:47
-msgid "Please use the 3rd party site to change e-mail."
-msgstr ""
+"%(user)s, votre lien est invalide. Veuillez réessayer et demander un nouveau "
+"lien."
 
-#: users/views/options.py:59
+#: users/views/options.py:56
 #, python-format
 msgid "%(user)s, your e-mail has been changed."
 msgstr "%(user)s, votre courriel a été modifié."
 
-#: users/views/options.py:80
+#: users/views/options.py:74
 #, python-format
 msgid "%(user)s, your password has been changed."
 msgstr "%(user)s, votre mot de passe a été modifié."

BIN
misago/locale/fr/LC_MESSAGES/djangojs.mo


+ 89 - 93
misago/locale/fr/LC_MESSAGES/djangojs.po

@@ -2,26 +2,26 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # Amandine G <amandyfriendly@msn.com>, 2017
 # Olivier Cortès <olive@deep-ocean.net>, 2018
 # Palimpseste, 2018
 # Jorg722, 2019
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Jorg722, 2019\n"
 "Language-Team: French (https://www.transifex.com/misago/teams/65369/fr/)\n"
+"Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: fr\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 #: static/misago/admin/index.js:16
@@ -83,8 +83,8 @@ msgid ""
 "You have signed in as %(username)s. Please refresh the page before "
 "continuing."
 msgstr ""
-"Vous êtes identifié comme %(username)s. Merci de rafraichir la page avant de"
-" continuer."
+"Vous êtes identifié comme %(username)s. Merci de rafraichir la page avant de "
+"continuer."
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -142,8 +142,8 @@ msgstr "Cette catégorie a de nouvelles publications."
 #: static/misago/js/misago.js:1
 msgid "This category is empty. No threads were posted within it so far."
 msgstr ""
-"Cette catégorie est vide. Pour l'instant, aucun fils de discussion n'y a été"
-" créé."
+"Cette catégorie est vide. Pour l'instant, aucun fils de discussion n'y a été "
+"créé."
 
 #: static/misago/js/misago.js:1
 msgid "This category is private. You can see only your own threads within it."
@@ -391,8 +391,8 @@ msgstr "Meilleure réponse"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Please select the best answer for your newly merged thread. No posts will be"
-" deleted during the merge."
+"Please select the best answer for your newly merged thread. No posts will be "
+"deleted during the merge."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -491,8 +491,8 @@ msgstr "Supprimer le compte"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You are going to delete your account. This action is nonreversible, and will"
-" result in following data being deleted:"
+"You are going to delete your account. This action is nonreversible, and will "
+"result in following data being deleted:"
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -513,8 +513,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"All your posted content will NOT be deleted, but username associated with it"
-" will be changed to one shared by all deleted accounts."
+"All your posted content will NOT be deleted, but username associated with it "
+"will be changed to one shared by all deleted accounts."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -707,6 +707,11 @@ msgid "Change forgotten password"
 msgstr "Changer le mot de passe oublié"
 
 #: static/misago/js/misago.js:1
+msgid "%(user)s has been made new thread owner."
+msgstr ""
+"%(user)s est désormais le nouveau propriétaire de ce fil de discussion."
+
+#: static/misago/js/misago.js:1
 msgid "You have left this thread."
 msgstr "Vous avez quitté ce fils de discussion"
 
@@ -715,11 +720,6 @@ msgid "%(user)s has been removed from this thread."
 msgstr "%(user)s a été évincé du fil de discussion."
 
 #: static/misago/js/misago.js:1
-msgid "%(user)s has been made new thread owner."
-msgstr ""
-"%(user)s est désormais le nouveau propriétaire de ce fil de discussion."
-
-#: static/misago/js/misago.js:1
 msgid "See profile"
 msgstr "Voir le profil"
 
@@ -982,11 +982,10 @@ msgstr "Rétablir"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you with to revert this post to the state from before this "
-"edit?"
+"Are you sure you with to revert this post to the state from before this edit?"
 msgstr ""
-"Êtes-vous sûr de vouloir rétablir la version précédente de cette publication"
-" ?"
+"Êtes-vous sûr de vouloir rétablir la version précédente de cette "
+"publication ?"
 
 #: static/misago/js/misago.js:1
 msgid "Post has been reverted to previous state."
@@ -1417,21 +1416,21 @@ msgstr ""
 #: static/misago/js/misago.js:1
 msgid "This post is hidden. Only users with permission may see its contents."
 msgstr ""
-"Cette publication est masquée. Seuls les utilisateurs autorisés peuvent voir"
-" son contenu."
+"Cette publication est masquée. Seuls les utilisateurs autorisés peuvent voir "
+"son contenu."
 
 #: static/misago/js/misago.js:1
-msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+msgid "This post is protected. Only moderators may change it."
 msgstr ""
-"Cette publication n'est pas approuvée. Seuls son auteur et les utilisateurs "
-"autorisés peuvent voir son contenu."
+"Cette publication est protégée. Seuls les modérateurs peuvent la modifier."
 
 #: static/misago/js/misago.js:1
-msgid "This post is protected. Only moderators may change it."
+msgid ""
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
-"Cette publication est protégée. Seuls les modérateurs peuvent la modifier."
+"Cette publication n'est pas approuvée. Seuls son auteur et les utilisateurs "
+"autorisés peuvent voir son contenu."
 
 #: static/misago/js/misago.js:1
 msgid "Liked"
@@ -1532,34 +1531,6 @@ msgid "%(username)s's details have been updated."
 msgstr "Les informations de %(username)s ont été mises à jour."
 
 #: static/misago/js/misago.js:1
-msgid "You have no started threads."
-msgstr "Vous n'avez démarré aucun fil de discussion."
-
-#: static/misago/js/misago.js:1
-msgid "%(username)s started no threads."
-msgstr "%(username)s n'a démarré aucun fil de discussion."
-
-#: static/misago/js/misago.js:1
-msgid "You have started %(threads)s thread."
-msgid_plural "You have started %(threads)s threads."
-msgstr[0] "Vous avez démarré %(threads)s fil de discussion."
-msgstr[1] "Vous avez démarré %(threads)s fils de discussion."
-
-#: static/misago/js/misago.js:1
-msgid "%(username)s has started %(threads)s thread."
-msgid_plural "%(username)s has started %(threads)s threads."
-msgstr[0] "%(username)s a démarré %(threads)s fil de discussion."
-msgstr[1] "%(username)s a démarré %(threads)s fils de discussion."
-
-#: static/misago/js/misago.js:1
-msgid "Loading..."
-msgstr "Chargement…"
-
-#: static/misago/js/misago.js:1
-msgid "Threads"
-msgstr "Fils de discussion"
-
-#: static/misago/js/misago.js:1
 msgid "You have posted no messages."
 msgstr "Vous n'avez posté aucun message."
 
@@ -1580,10 +1551,38 @@ msgstr[0] "%(username)s a posté %(posts)s message."
 msgstr[1] "%(username)s a posté %(posts)s messages."
 
 #: static/misago/js/misago.js:1
+msgid "Loading..."
+msgstr "Chargement…"
+
+#: static/misago/js/misago.js:1
 msgid "Posts"
 msgstr "Publications"
 
 #: static/misago/js/misago.js:1
+msgid "You have no started threads."
+msgstr "Vous n'avez démarré aucun fil de discussion."
+
+#: static/misago/js/misago.js:1
+msgid "%(username)s started no threads."
+msgstr "%(username)s n'a démarré aucun fil de discussion."
+
+#: static/misago/js/misago.js:1
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
+msgstr[0] "Vous avez démarré %(threads)s fil de discussion."
+msgstr[1] "Vous avez démarré %(threads)s fils de discussion."
+
+#: static/misago/js/misago.js:1
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
+msgstr[0] "%(username)s a démarré %(threads)s fil de discussion."
+msgstr[1] "%(username)s a démarré %(threads)s fils de discussion."
+
+#: static/misago/js/misago.js:1
+msgid "Threads"
+msgstr "Fils de discussion"
+
+#: static/misago/js/misago.js:1
 msgid "Show older activity"
 msgstr ""
 
@@ -1732,8 +1731,8 @@ msgid ""
 "Optional message for forum team members explaining why user is prohibited "
 "form changing avatar."
 msgstr ""
-"Message facultatif pour les membres de l'équipe du forum expliquant pourquoi"
-" l'utilisateur ne peut modifier son avatar."
+"Message facultatif pour les membres de l'équipe du forum expliquant pourquoi "
+"l'utilisateur ne peut modifier son avatar."
 
 #: static/misago/js/misago.js:1
 msgid "Avatar controls"
@@ -1950,8 +1949,8 @@ msgstr "%(username)s, votre mot de passe a été modifié avec succes."
 #: static/misago/js/misago.js:1
 msgid "You will have to sign in using new password before continuing."
 msgstr ""
-"Vous devez vous authentifier en utilisant votre nouveau mot de passe afin de"
-" continuer."
+"Vous devez vous authentifier en utilisant votre nouveau mot de passe afin de "
+"continuer."
 
 #: static/misago/js/misago.js:1
 msgid "Sign in"
@@ -2071,8 +2070,7 @@ msgstr "Dernière réponse par %(user)s  le %(date)s"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you want to merge selected posts? This action is not "
-"reversible!"
+"Are you sure you want to merge selected posts? This action is not reversible!"
 msgstr ""
 "Êtes-vous sûr de vouloir fusionner les publications sélectionnées ? Cette "
 "action est irréversible !"
@@ -2424,11 +2422,11 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You need permission to start threads in category to be able to merge threads"
-" to it."
+"You need permission to start threads in category to be able to merge threads "
+"to it."
 msgstr ""
-"Vous devez disposer des droits de création de fils dans cette catégorie afin"
-" de pouvoir les fusionner."
+"Vous devez disposer des droits de création de fils dans cette catégorie afin "
+"de pouvoir les fusionner."
 
 #: static/misago/js/misago.js:1
 msgid "Selected threads were moved."
@@ -2439,8 +2437,8 @@ msgid ""
 "You need permission to start threads in category to be able to move threads "
 "to it."
 msgstr ""
-"Vous devez disposer des droits de création de fils dans cette catégorie afin"
-" de pouvoir les déplacer."
+"Vous devez disposer des droits de création de fils dans cette catégorie afin "
+"de pouvoir les déplacer."
 
 #: static/misago/js/misago.js:1
 msgid "Select all"
@@ -2497,8 +2495,7 @@ msgstr "Vous naviguez en tant qu'invité."
 #: static/misago/js/misago.js:1
 msgid "Sign in or register to start and participate in discussions."
 msgstr ""
-"Connectez-vous ou inscrivez-vous pour commencer et participer aux "
-"discussions"
+"Connectez-vous ou inscrivez-vous pour commencer et participer aux discussions"
 
 #: static/misago/js/misago.js:1
 msgid "Are you sure you want to sign out?"
@@ -2695,20 +2692,26 @@ msgid "You are banned"
 msgstr "Vous êtes banni⋅e"
 
 #: static/misago/js/misago.js:1
-msgid "You have to accept the terms of service."
-msgstr ""
+msgid "Valid password must be at least %(limit_value)s character long."
+msgid_plural "Valid password must be at least %(limit_value)s characters long."
+msgstr[0] ""
+"Un mot de passe valide doit comporter au moins %(limit_value)s caractère."
+msgstr[1] ""
+"Un mot de passe valide doit comporter au moins %(limit_value)s caractères."
 
 #: static/misago/js/misago.js:1
 msgid "You have to accept the privacy policy."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "Username must be at least %(limit_value)s character long."
-msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] ""
-"Le nom d'utilisateur doit comporter au moins %(limit_value)s caractère."
-msgstr[1] ""
-"Le nom d'utilisateur doit comporter au moins %(limit_value)s caractères."
+msgid "You have to accept the terms of service."
+msgstr ""
+
+#: static/misago/js/misago.js:1
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr ""
+"Le nom d'utilisateur ne peut contenir que des lettres et des chiffres de "
+"l'alphabet latin."
 
 #: static/misago/js/misago.js:1
 msgid "Username cannot be longer than %(limit_value)s character."
@@ -2719,19 +2722,12 @@ msgstr[1] ""
 "Le nom d'utilisateur peut comporter au plus %(limit_value)s caractères."
 
 #: static/misago/js/misago.js:1
-msgid "Username can only contain latin alphabet letters and digits."
-msgstr ""
-"Le nom d'utilisateur ne peut contenir que des lettres et des chiffres de "
-"l'alphabet latin."
-
-#: static/misago/js/misago.js:1
-msgid "Valid password must be at least %(limit_value)s character long."
-msgid_plural ""
-"Valid password must be at least %(limit_value)s characters long."
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
 msgstr[0] ""
-"Un mot de passe valide doit comporter au moins %(limit_value)s caractère."
+"Le nom d'utilisateur doit comporter au moins %(limit_value)s caractère."
 msgstr[1] ""
-"Un mot de passe valide doit comporter au moins %(limit_value)s caractères."
+"Le nom d'utilisateur doit comporter au moins %(limit_value)s caractères."
 
 #: static/misago/js/misago.js:1
 msgid "This field is required."

BIN
misago/locale/ko/LC_MESSAGES/django.mo


+ 7963 - 0
misago/locale/ko/LC_MESSAGES/django.po

@@ -0,0 +1,7963 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: acl/admin/__init__.py:24 templates/misago/acl_debug.html:16
+#: templates/misago/admin/ranks/form.html:58
+msgid "Permissions"
+msgstr ""
+
+#: acl/admin/forms.py:9 categories/admin/forms.py:238
+msgid "Role name"
+msgstr ""
+
+#: acl/admin/views.py:15 categories/admin/views/perms.py:23
+msgid "Requested role does not exist."
+msgstr ""
+
+#: acl/admin/views.py:51 categories/admin/views/perms.py:62
+msgid "Form contains errors."
+msgstr ""
+
+#: acl/admin/views.py:62 categories/admin/views/perms.py:73
+#, python-format
+msgid "New role \"%(name)s\" has been saved."
+msgstr ""
+
+#: acl/admin/views.py:66 categories/admin/views/perms.py:77
+#, python-format
+msgid "Role \"%(name)s\" has been changed."
+msgstr ""
+
+#: acl/admin/views.py:72 categories/admin/views/perms.py:83
+#, python-format
+msgid "Role \"%(name)s\" is special role and can't be deleted."
+msgstr ""
+
+#: acl/admin/views.py:77 categories/admin/views/perms.py:88
+#, python-format
+msgid "Role \"%(name)s\" has been deleted."
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:10
+msgid "Member"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:48
+msgid "Guest"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:78
+#: categories/migrations/0003_categories_roles.py:71
+#: categories/migrations/0003_categories_roles.py:117
+#: users/migrations/0004_default_ranks.py:30
+msgid "Moderator"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:133
+msgid "Renaming users"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:141
+msgid "Banning users"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:155
+#: users/migrations/0004_default_ranks.py:33 users/permissions/delete.py:23
+msgid "Deleting users"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:166
+msgid "Can't be blocked"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:174
+#: threads/permissions/privatethreads.py:33
+#: threads/threadtypes/privatethread.py:12 threads/viewmodels/thread.py:147
+#: users/migrations/0004_default_ranks.py:31
+#: users/migrations/0004_default_ranks.py:35
+msgid "Private threads"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:189
+#: users/migrations/0004_default_ranks.py:32
+msgid "Private threads moderator"
+msgstr ""
+
+#: acl/panels.py:8
+msgid "Misago User ACL"
+msgstr ""
+
+#: acl/panels.py:17
+msgid "Anonymous user"
+msgstr ""
+
+#: admin/admin.py:6 templates/misago/admin/dashboard/index.html:5
+#: templates/misago/admin/dashboard/index.html:11
+msgid "Dashboard"
+msgstr ""
+
+#: admin/auth.py:29
+msgid "Your admin session has expired."
+msgstr ""
+
+#: admin/forms.py:46
+msgid ""
+"Value must be a 7-character string specifying an RGB color in a hexadecimal "
+"format."
+msgstr ""
+
+#: admin/forms.py:67 templates/misago/admin/users/edit.html:145
+#: templates/misago/admin/users/edit.html:163
+#: templates/misago/admin/users/edit.html:265 users/admin/forms.py:582
+msgid "Yes"
+msgstr ""
+
+#: admin/forms.py:68 templates/misago/admin/users/edit.html:149
+#: templates/misago/admin/users/edit.html:167
+#: templates/misago/admin/users/edit.html:269
+#: threads/permissions/bestanswers.py:34 threads/permissions/bestanswers.py:40
+#: threads/permissions/polls.py:34 threads/permissions/polls.py:40
+#: threads/permissions/polls.py:46 threads/permissions/threads.py:120
+#: threads/permissions/threads.py:130 threads/permissions/threads.py:142
+#: threads/permissions/threads.py:149 threads/permissions/threads.py:159
+#: threads/permissions/threads.py:168 threads/permissions/threads.py:180
+#: threads/permissions/threads.py:188 threads/permissions/threads.py:218
+#: users/admin/forms.py:582 users/models/user.py:105
+msgid "No"
+msgstr ""
+
+#: admin/views/auth.py:39
+msgid "Your admin session has been closed."
+msgstr ""
+
+#: admin/views/generic/list.py:39
+msgid "Selected: 0"
+msgstr ""
+
+#: admin/views/generic/list.py:40
+msgid "Select items"
+msgstr ""
+
+#: admin/views/generic/list.py:288 admin/views/generic/list.py:293
+msgid "You have to select one or more items."
+msgstr ""
+
+#: admin/views/generic/list.py:307
+msgid "Action is not allowed."
+msgstr ""
+
+#: categories/admin/__init__.py:65 templates/misago/categories/base.html:7
+#: templates/misago/categories/base.html:29
+#: templates/misago/categories/base.html:38
+#: templates/misago/categories/header.html:8 templates/misago/navbar.html:25
+#: templates/misago/navbar.html:31
+msgid "Categories"
+msgstr ""
+
+#: categories/admin/__init__.py:72
+msgid "Category permissions"
+msgstr ""
+
+#: categories/admin/forms.py:46
+#: templates/misago/admin/themes/assets/css.html:31
+#: templates/misago/admin/themes/assets/media.html:21 themes/admin/forms.py:26
+#: themes/admin/forms.py:53 themes/admin/forms.py:174 users/admin/forms.py:386
+msgid "Name"
+msgstr ""
+
+#: categories/admin/forms.py:48 users/admin/forms.py:402
+msgid "Description"
+msgstr ""
+
+#: categories/admin/forms.py:52
+msgid "Optional description explaining category intented purpose."
+msgstr ""
+
+#: categories/admin/forms.py:55 menus/admin/forms.py:20
+#: templates/misago/admin/categories/list.html:18
+#: templates/misago/admin/ranks/list.html:20 users/admin/forms.py:419
+msgid "CSS class"
+msgstr ""
+
+#: categories/admin/forms.py:58
+msgid ""
+"Optional CSS class used to customize this category's appearance from "
+"templates."
+msgstr ""
+
+#: categories/admin/forms.py:63
+msgid "Closed category"
+msgstr ""
+
+#: categories/admin/forms.py:66
+msgid "Only members with valid permissions can post in closed categories."
+msgstr ""
+
+#: categories/admin/forms.py:70 conf/admin/__init__.py:79
+#: templates/misago/admin/categories/list.html:19
+#: templates/misago/admin/dashboard/totals.html:19
+#: templates/misago/navbar.html:20 templates/misago/navbar.html:36
+#: templates/misago/profile/threads.html:5
+#: templates/misago/profile/threads.html:8
+#: templates/misago/profile/threads.html:9
+#: templates/misago/threadslist/category.html:68
+#: templates/misago/threadslist/threads.html:14
+#: templates/misago/threadslist/threads.html:16
+#: templates/misago/threadslist/threads.html:33
+#: templates/misago/threadslist/threads.html:42
+#: templates/misago/threadslist/threads.html:66
+#: threads/permissions/threads.py:73 threads/permissions/threads.py:104
+#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:97
+msgid "Threads"
+msgstr ""
+
+#: categories/admin/forms.py:73
+msgid "All threads started in this category will require moderator approval."
+msgstr ""
+
+#: categories/admin/forms.py:77
+msgid "Replies"
+msgstr ""
+
+#: categories/admin/forms.py:80
+msgid "All replies posted in this category will require moderator approval."
+msgstr ""
+
+#: categories/admin/forms.py:84
+msgid "Edits"
+msgstr ""
+
+#: categories/admin/forms.py:87
+msgid ""
+"Will make all edited replies return to unapproved state for moderator to "
+"review."
+msgstr ""
+
+#: categories/admin/forms.py:92
+msgid "Thread age"
+msgstr ""
+
+#: categories/admin/forms.py:95
+msgid ""
+"Prune thread if number of days since its creation is greater than specified. "
+"Enter 0 to disable this pruning criteria."
+msgstr ""
+
+#: categories/admin/forms.py:100
+msgid "Last reply"
+msgstr ""
+
+#: categories/admin/forms.py:103
+msgid ""
+"Prune thread if number of days since last reply is greater than specified. "
+"Enter 0 to disable this pruning criteria."
+msgstr ""
+
+#: categories/admin/forms.py:126
+msgid "Permissions cannot be copied from category into itself."
+msgstr ""
+
+#: categories/admin/forms.py:133
+msgid "Category cannot act as archive for itself."
+msgstr ""
+
+#: categories/admin/forms.py:155
+msgid "Parent category"
+msgstr ""
+
+#: categories/admin/forms.py:161
+msgid "Copy permissions"
+msgstr ""
+
+#: categories/admin/forms.py:163
+msgid ""
+"You can replace this category permissions with permissions copied from "
+"category selected here."
+msgstr ""
+
+#: categories/admin/forms.py:167
+msgid "Don't copy permissions"
+msgstr ""
+
+#: categories/admin/forms.py:171
+msgid "Archive"
+msgstr ""
+
+#: categories/admin/forms.py:173
+msgid ""
+"Instead of being deleted, pruned threads can be moved to designated category."
+msgstr ""
+
+#: categories/admin/forms.py:177
+msgid "Don't archive pruned threads"
+msgstr ""
+
+#: categories/admin/forms.py:194
+msgid "You are trying to move this category threads to itself."
+msgstr ""
+
+#: categories/admin/forms.py:200
+msgid ""
+"You are trying to move this category threads to a child category that will "
+"be deleted together with this category."
+msgstr ""
+
+#: categories/admin/forms.py:213
+msgid "Move category threads to"
+msgstr ""
+
+#: categories/admin/forms.py:216 categories/admin/forms.py:230
+msgid "Delete with category"
+msgstr ""
+
+#: categories/admin/forms.py:228
+msgid "Move child categories to"
+msgstr ""
+
+#: categories/admin/forms.py:249 categories/admin/forms.py:264
+#: templates/misago/acl_debug.html:15 templates/misago/admin/roles/list.html:16
+msgid "Role"
+msgstr ""
+
+#: categories/admin/forms.py:253 categories/admin/forms.py:268
+msgid "No access"
+msgstr ""
+
+#: categories/admin/views/categories.py:17
+msgid "Requested category does not exist."
+msgstr ""
+
+#: categories/admin/views/categories.py:96
+#, python-format
+msgid "New category \"%(name)s\" has been saved."
+msgstr ""
+
+#: categories/admin/views/categories.py:100
+#, python-format
+msgid "Category \"%(name)s\" has been edited."
+msgstr ""
+
+#: categories/admin/views/categories.py:104
+#, python-format
+msgid "Category \"%(name)s\" has been deleted."
+msgstr ""
+
+#: categories/admin/views/categories.py:154
+#, python-format
+msgid "Category \"%(name)s\" has been moved below \"%(other)s\"."
+msgstr ""
+
+#: categories/admin/views/categories.py:170
+#, python-format
+msgid "Category \"%(name)s\" has been moved above \"%(other)s\"."
+msgstr ""
+
+#: categories/admin/views/perms.py:134
+#, python-format
+msgid "Category %(name)s permissions have been changed."
+msgstr ""
+
+#: categories/admin/views/perms.py:145
+#: templates/misago/admin/categoryroles/categoryroles.html:37
+#: templates/misago/admin/categoryroles/rolecategories.html:31
+msgid "Change permissions"
+msgstr ""
+
+#: categories/admin/views/perms.py:158
+msgid "No categories exist."
+msgstr ""
+
+#: categories/admin/views/perms.py:197
+#, python-format
+msgid "Category permissions for role %(name)s have been changed."
+msgstr ""
+
+#: categories/admin/views/perms.py:208
+msgid "Categories permissions"
+msgstr ""
+
+#: categories/migrations/0002_default_categories.py:31
+msgid "First category"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:10
+msgid "See only"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:18
+msgid "Read only"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:33
+msgid "Reply to threads"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:51
+msgid "Start and reply threads"
+msgstr ""
+
+#: categories/migrations/0006_moderation_queue_roles.py:10
+msgid "In moderation queue"
+msgstr ""
+
+#: categories/migrations/0007_best_answers_roles.py:11
+msgid "Q&A user"
+msgstr ""
+
+#: categories/migrations/0007_best_answers_roles.py:23
+msgid "Q&A moderator"
+msgstr ""
+
+#: categories/permissions.py:13
+msgid "Category access"
+msgstr ""
+
+#: categories/permissions.py:15
+msgid "Can see category"
+msgstr ""
+
+#: categories/permissions.py:16
+msgid "Can see category contents"
+msgstr ""
+
+#: categories/permissions.py:119
+#, python-format
+msgid "You don't have permission to browse \"%(category)s\" contents."
+msgstr ""
+
+#: conf/admin/__init__.py:41 templates/misago/admin/conf/index.html:5
+#: templates/misago/admin/themes/form.html:48
+msgid "Settings"
+msgstr ""
+
+#: conf/admin/__init__.py:48 templates/misago/admin/socialauth/form.html:27
+msgid "General"
+msgstr ""
+
+#: conf/admin/__init__.py:49
+msgid "Change forum details like name, description or footer."
+msgstr ""
+
+#: conf/admin/__init__.py:54 templates/misago/admin/dashboard/totals.html:7
+#: templates/misago/admin/users/ban.html:22 templates/misago/navbar.html:42
+#: templates/misago/userslists/base.html:5
+#: templates/misago/userslists/base.html:14 users/admin/__init__.py:74
+#: users/search.py:16
+msgid "Users"
+msgstr ""
+
+#: conf/admin/__init__.py:56
+msgid "Customize user accounts default behavior and features availability."
+msgstr ""
+
+#: conf/admin/__init__.py:63
+msgid "Captcha"
+msgstr ""
+
+#: conf/admin/__init__.py:65
+msgid "Setup protection against automatic registrations on the site."
+msgstr ""
+
+#: conf/admin/__init__.py:72 templates/misago/admin/dashboard/analytics.html:7
+#: templates/misago/admin/dashboard/index.html:40
+msgid "Analytics"
+msgstr ""
+
+#: conf/admin/__init__.py:73
+msgid "Enable Google Analytics or setup Google Site Verification."
+msgstr ""
+
+#: conf/admin/__init__.py:80
+msgid "Threads, posts, polls and attachments options."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:17
+msgid "Tracking ID"
+msgstr ""
+
+#: conf/admin/forms/analytics.py:19
+msgid ""
+"Setting the Tracking ID will result in gtag.js file being included in your "
+"site's HTML markup, enabling Google Analytics integration."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:25
+msgid "Site verification token"
+msgstr ""
+
+#: conf/admin/forms/analytics.py:27
+msgid ""
+"This token was extracted from uploaded site verification file. To change it, "
+"upload new verification file."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:34
+msgid "Upload site verification file"
+msgstr ""
+
+#: conf/admin/forms/analytics.py:36
+msgid ""
+"Site verification file can be downloaded from Search Console's \"Ownership "
+"verification\" page."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:48
+msgid "Submitted file type is not HTML."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:54
+msgid "Submitted file doesn't contain a verification code."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:21
+msgid "Enable CAPTCHA"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:23
+msgid "No CAPTCHA"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:24
+msgid "reCaptcha"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:25
+#: templates/misago/admin/conf/captcha_settings.html:25
+msgid "Question and answer"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:31
+msgid "Site key"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:34
+msgid "Secret key"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:38
+msgid "Test question"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:41
+msgid "Question help text"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:44
+msgid "Valid answers"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:45
+msgid "Enter each answer in new line. Answers are case-insensitive."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:52
+msgid "Validate new registrations against SFS database"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:54
+msgid ""
+"Turning this option on will result in Misago validating new user's e-mail "
+"and IP address against SFS database."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:59
+msgid "Minimum SFS confidence required"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:61
+msgid ""
+"SFS compares user e-mail and IP address with database of known spammers and "
+"assigns the confidence score in range of 0 to 100 that user is a spammer "
+"themselves. If this score is equal or higher than specified, Misago will "
+"block user from registering and ban their IP address for 24 hours."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:79
+msgid "You need to enter site key if selected CAPTCHA type is reCaptcha."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:88
+msgid "You need to enter secret key if selected CAPTCHA type is reCaptcha."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:97
+msgid "You need to set question if selected CAPTCHA type is Q&A."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:104
+msgid "You need to set question answers if selected CAPTCHA type is Q&A."
+msgstr ""
+
+#: conf/admin/forms/general.py:25
+msgid "Forum name"
+msgstr ""
+
+#: conf/admin/forms/general.py:26
+msgid "Forum address"
+msgstr ""
+
+#: conf/admin/forms/general.py:29
+msgid "Header text"
+msgstr ""
+
+#: conf/admin/forms/general.py:30
+msgid "This text will replace forum name in page header."
+msgstr ""
+
+#: conf/admin/forms/general.py:34
+msgid "Page title"
+msgstr ""
+
+#: conf/admin/forms/general.py:36
+msgid "Meta Description"
+msgstr ""
+
+#: conf/admin/forms/general.py:38
+msgid ""
+"Short description of your forum that search and social sites may display "
+"next to link to your forum's index."
+msgstr ""
+
+#: conf/admin/forms/general.py:46
+#: templates/misago/admin/conf/general_settings.html:17
+msgid "Logo"
+msgstr ""
+
+#: conf/admin/forms/general.py:47
+msgid "Image that will displayed in forum navbar."
+msgstr ""
+
+#: conf/admin/forms/general.py:50
+msgid "Delete logo image"
+msgstr ""
+
+#: conf/admin/forms/general.py:52
+msgid "Small logo"
+msgstr ""
+
+#: conf/admin/forms/general.py:54
+msgid ""
+"Image that will be displayed in compact forum navbar. When set, it will "
+"replace icon pointing to forum index."
+msgstr ""
+
+#: conf/admin/forms/general.py:60
+msgid "Delete small logo image"
+msgstr ""
+
+#: conf/admin/forms/general.py:63 legal/admin/forms.py:34
+msgid "Text"
+msgstr ""
+
+#: conf/admin/forms/general.py:65
+msgid ""
+"Text displayed in forum navbar. If logo image was uploaded, text will be "
+"displayed right next to it. Never displayed by the compact navbar."
+msgstr ""
+
+#: conf/admin/forms/general.py:73
+msgid "Image"
+msgstr ""
+
+#: conf/admin/forms/general.py:75
+msgid ""
+"Custom image that will appear next to links to your forum posted on social "
+"sites. Facebook recommends that this image should be 1200 pixels wide and "
+"630 pixels tall."
+msgstr ""
+
+#: conf/admin/forms/general.py:81
+msgid "Delete image"
+msgstr ""
+
+#: conf/admin/forms/general.py:83
+msgid "Replace image with avatar on user profiles"
+msgstr ""
+
+#: conf/admin/forms/general.py:86
+msgid "Replace image with avatar on threads"
+msgstr ""
+
+#: conf/admin/forms/general.py:90
+#: templates/misago/admin/conf/general_settings.html:59
+msgid "Forum footnote"
+msgstr ""
+
+#: conf/admin/forms/general.py:91
+msgid "Short message displayed in forum footer."
+msgstr ""
+
+#: conf/admin/forms/general.py:96
+msgid "E-mails footer"
+msgstr ""
+
+#: conf/admin/forms/general.py:98
+msgid "Optional short message included at the end of e-mails sent by forum."
+msgstr ""
+
+#: conf/admin/forms/general.py:109
+#, python-format
+msgid ""
+"Misago uses this setting to build links in e-mails sent to site users. "
+"Address under which site is running appears to be \"%(address)s\"."
+msgstr ""
+
+#: conf/admin/forms/threads.py:27
+msgid "Daily post limit per user"
+msgstr ""
+
+#: conf/admin/forms/threads.py:29
+msgid ""
+"Daily limit of posts that may be posted by single user. Fail-safe for "
+"situations when forum is flooded by spam bots. Change to 0 to remove the "
+"limit."
+msgstr ""
+
+#: conf/admin/forms/threads.py:36
+msgid "Hourly post limit per user"
+msgstr ""
+
+#: conf/admin/forms/threads.py:38
+msgid ""
+"Hourly limit of posts that may be posted by single user. Fail-safe for "
+"situations when forum is flooded by spam bots. Change to 0 to remove the "
+"limit."
+msgstr ""
+
+#: conf/admin/forms/threads.py:45
+msgid "Maximum number of attachments per post"
+msgstr ""
+
+#: conf/admin/forms/threads.py:48
+msgid "Maximum allowed post length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:51
+msgid "Minimum required post length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:54
+msgid "Maximum allowed thread title length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:57
+msgid "Minimum required thread title length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:60
+msgid "Unused attachments lifetime"
+msgstr ""
+
+#: conf/admin/forms/threads.py:62
+msgid ""
+"Period of time (in hours) after which user-uploaded files that weren't "
+"attached to any post are deleted from disk."
+msgstr ""
+
+#: conf/admin/forms/threads.py:69
+msgid "Read-tracker cutoff"
+msgstr ""
+
+#: conf/admin/forms/threads.py:71
+msgid ""
+"Controls amount of data used by read-tracking system. All content older than "
+"number of days specified in this setting is considered old and read, even if "
+"the opposite is true for the user. Active forums can try lowering this value "
+"while less active ones may wish to increase it instead. "
+msgstr ""
+
+#: conf/admin/forms/threads.py:80
+msgid "Number of threads displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/threads.py:84
+msgid "Number of posts displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/threads.py:87 conf/admin/forms/users.py:141
+msgid "Maximum orphans"
+msgstr ""
+
+#: conf/admin/forms/threads.py:89
+msgid ""
+"If number of posts to be displayed on the last page is less or equal to "
+"number specified in this setting, those posts will instead be displayed on "
+"previous page, reducing the total number of pages in thread."
+msgstr ""
+
+#: conf/admin/forms/threads.py:96
+msgid "Maximum number of events displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/threads.py:100
+msgid "Permission denied"
+msgstr ""
+
+#: conf/admin/forms/threads.py:102
+msgid ""
+"Attachments proxy will display this image in place of default one when user "
+"tries to access attachment they have no permission to see."
+msgstr ""
+
+#: conf/admin/forms/threads.py:108
+msgid "Delete custom permission denied image"
+msgstr ""
+
+#: conf/admin/forms/threads.py:111
+msgid "Not found"
+msgstr ""
+
+#: conf/admin/forms/threads.py:113
+msgid ""
+"Attachments proxy will display this image in place of default one when user "
+"tries to access attachment that doesn't exist."
+msgstr ""
+
+#: conf/admin/forms/threads.py:119
+msgid "Delete custom not found image"
+msgstr ""
+
+#: conf/admin/forms/threads.py:129
+msgid "This value must be lower than number of posts per page."
+msgstr ""
+
+#: conf/admin/forms/users.py:37
+msgid "Require new accounts activation"
+msgstr ""
+
+#: conf/admin/forms/users.py:39
+msgid "No activation required"
+msgstr ""
+
+#: conf/admin/forms/users.py:40
+msgid "Activation token sent to user e-mail"
+msgstr ""
+
+#: conf/admin/forms/users.py:41
+msgid "Activation by administrator"
+msgstr ""
+
+#: conf/admin/forms/users.py:42
+msgid "Disable new registrations"
+msgstr ""
+
+#: conf/admin/forms/users.py:48
+msgid ""
+"Delete new inactive accounts if they weren't activated within this number of "
+"days"
+msgstr ""
+
+#: conf/admin/forms/users.py:51
+msgid "Enter 0 to never delete inactive new accounts."
+msgstr ""
+
+#: conf/admin/forms/users.py:56
+msgid "Minimum allowed username length"
+msgstr ""
+
+#: conf/admin/forms/users.py:59
+msgid "Maximum allowed username length"
+msgstr ""
+
+#: conf/admin/forms/users.py:63
+msgid "Allow custom avatar uploads"
+msgstr ""
+
+#: conf/admin/forms/users.py:65
+msgid ""
+"Turning this option off will forbid forum users from uploading custom "
+"avatars. Good for forums adressed at young users."
+msgstr ""
+
+#: conf/admin/forms/users.py:70
+msgid "Maximum size of uploaded avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:71
+msgid "Enter maximum allowed file size (in KB) for avatar uploads."
+msgstr ""
+
+#: conf/admin/forms/users.py:75
+msgid "Default avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:77 conf/admin/forms/users.py:90
+msgid "Individual"
+msgstr ""
+
+#: conf/admin/forms/users.py:78
+msgid "Gravatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:79 conf/admin/forms/users.py:91
+msgid "Random avatar from gallery"
+msgstr ""
+
+#: conf/admin/forms/users.py:84
+msgid "Fallback for default gravatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:86
+msgid ""
+"Select which avatar to use when user has no gravatar associated with their e-"
+"mail address."
+msgstr ""
+
+#: conf/admin/forms/users.py:96
+msgid "Blank avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:98
+msgid ""
+"Blank avatar is displayed in the interface when user's avatar is not "
+"available: when user was deleted or is guest. Uploaded image should be a "
+"square."
+msgstr ""
+
+#: conf/admin/forms/users.py:105
+msgid "Delete custom blank avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:109
+msgid "Maximum allowed signature length"
+msgstr ""
+
+#: conf/admin/forms/users.py:113 threads/permissions/threads.py:110
+#: users/admin/forms.py:175
+msgid "Started threads"
+msgstr ""
+
+#: conf/admin/forms/users.py:115 conf/admin/forms/users.py:127
+msgid "Don't watch"
+msgstr ""
+
+#: conf/admin/forms/users.py:116 conf/admin/forms/users.py:128
+msgid "Put on watched threads list"
+msgstr ""
+
+#: conf/admin/forms/users.py:119 conf/admin/forms/users.py:131
+msgid "Put on watched threads list and e-mail user when somebody replies"
+msgstr ""
+
+#: conf/admin/forms/users.py:125
+msgid "Replied threads"
+msgstr ""
+
+#: conf/admin/forms/users.py:138
+msgid "Number of users displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/users.py:143
+msgid ""
+"If number of users to be displayed on the last page is less or equal to "
+"number specified in this setting, those users will instead be displayed on "
+"previous page, reducing the total number of pages on the list."
+msgstr ""
+
+#: conf/admin/forms/users.py:151
+msgid "Maximum age in days of posts that should count to the ranking"
+msgstr ""
+
+#: conf/admin/forms/users.py:155
+msgid "Maximum number of ranked users"
+msgstr ""
+
+#: conf/admin/forms/users.py:158
+msgid "Allow users to download their data"
+msgstr ""
+
+#: conf/admin/forms/users.py:160
+msgid "Maximum age in hours of data downloads before they expire"
+msgstr ""
+
+#: conf/admin/forms/users.py:162
+msgid ""
+"Data downloads older than specified will have their files deleted and will "
+"be marked as expired."
+msgstr ""
+
+#: conf/admin/forms/users.py:169
+msgid "Allow users to delete their own accounts"
+msgstr ""
+
+#: conf/admin/forms/users.py:173
+msgid "IP storage time"
+msgstr ""
+
+#: conf/admin/forms/users.py:175
+msgid ""
+"Number of days for which users IP addresses are stored in forum database. "
+"Enter zero to store registered IP addresses forever. Deleting user account "
+"always deletes the IP addresses associated with it."
+msgstr ""
+
+#: conf/admin/forms/users.py:183
+msgid "Anonymous username"
+msgstr ""
+
+#: conf/admin/forms/users.py:185
+msgid ""
+"This username is displayed instead of delete user's actual name next to "
+"their content."
+msgstr ""
+
+#: conf/admin/forms/users.py:202 icons/admin/forms.py:117
+#, python-format
+msgid "Uploaded image's edge should be at least %(size)s pixels long."
+msgstr ""
+
+#: conf/admin/forms/users.py:215
+msgid "This value must be lower than number of users per page."
+msgstr ""
+
+#: conf/admin/views.py:39
+msgid "Settings have been saved."
+msgstr ""
+
+#: core/errorpages.py:51
+msgid "Permission denied."
+msgstr ""
+
+#: core/errorpages.py:80
+msgid ""
+"A problem was encountered when disconnecting your account from the remote "
+"site."
+msgstr ""
+
+#: core/errorpages.py:84
+msgid ""
+"You are not allowed to disconnect your account from the other site, because "
+"currently it's the only way to sign in to your account."
+msgstr ""
+
+#: core/errorpages.py:89
+#, python-format
+msgid "A problem was encountered when signing you in using %(backend)s."
+msgstr ""
+
+#: core/errorpages.py:93
+msgid "The sign in process has been canceled by user."
+msgstr ""
+
+#: core/errorpages.py:95
+msgid "The other service could not be reached."
+msgstr ""
+
+#: core/errorpages.py:101
+msgid "Unexpected problem has been encountered during sign in process."
+msgstr ""
+
+#: core/errorpages.py:122
+msgid ""
+"Your request was rejected because your browser didn't send the CSRF cookie, "
+"or the cookie sent was invalid."
+msgstr ""
+
+#: core/rest_permissions.py:9
+msgid "This action is not available to guests."
+msgstr ""
+
+#: core/templatetags/misago_pagetitle.py:10
+#: templates/misago/thread/private_thread.html:7
+#: templates/misago/thread/thread.html:7
+#, python-format
+msgid "page: %(page)s"
+msgstr ""
+
+#: core/validators.py:10
+msgid "Value has to contain alpha-numerical characters."
+msgstr ""
+
+#: core/validators.py:12
+msgid "Value is too long."
+msgstr ""
+
+#: core/validators.py:26
+msgid "Uploaded image is not a square."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:27
+msgid "The site is running using unreleased version of Misago."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:29
+msgid ""
+"Unreleased versions of Misago can lack security features and there is no "
+"supported way to upgrade them to release versions later."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:42
+msgid "Failed to connect to pypi.org API. Try again later."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:44
+#: templates/misago/admin/dashboard/checks.html:17
+#: templates/misago/admin/dashboard/index.html:33
+msgid ""
+"Version check feature relies on the API operated by the Python Package Index "
+"(pypi.org) API to retrieve latest Misago release version."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:70
+msgid "The site is running updated version of Misago."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:71
+#, python-format
+msgid "Misago %(version)s is latest release."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:77
+msgid "The site is running outdated version of Misago."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:79
+#, python-format
+msgid ""
+"The site is running Misago version %(version)s while version %(latest)s is "
+"available."
+msgstr ""
+
+#: icons/admin/__init__.py:15
+msgid "Icons"
+msgstr ""
+
+#: icons/admin/__init__.py:16
+msgid "Upload favicon and application icon for the site."
+msgstr ""
+
+#: icons/admin/forms.py:21 icons/admin/forms.py:28
+msgid "Upload image"
+msgstr ""
+
+#: icons/admin/forms.py:22
+msgid "Uploaded image should be a square that is 48px wide and tall."
+msgstr ""
+
+#: icons/admin/forms.py:25 icons/admin/forms.py:33
+msgid "Delete custom icon"
+msgstr ""
+
+#: icons/admin/forms.py:29
+msgid "Uploaded image should be square at least 180px wide and tall."
+msgstr ""
+
+#: icons/admin/forms.py:124
+msgid "Uploaded image was not gif, jpeg or png."
+msgstr ""
+
+#: icons/admin/views.py:17
+msgid "Icons have been updated."
+msgstr ""
+
+#: legal/admin/__init__.py:35
+msgid "Legal agreements"
+msgstr ""
+
+#: legal/admin/__init__.py:36
+msgid "Set terms of service and privacy policy contents."
+msgstr ""
+
+#: legal/admin/forms.py:11 legal/admin/forms.py:64
+#: templates/misago/admin/agreements/list.html:19
+#: templates/misago/admin/attachmenttypes/list.html:16
+#: templates/misago/admin/bans/list.html:18
+#: templates/misago/admin/themes/assets/media.html:24
+#: templates/misago/admin/users/edit.html:300 users/admin/forms.py:569
+msgid "Type"
+msgstr ""
+
+#: legal/admin/forms.py:13 menus/admin/forms.py:10
+#: templates/misago/admin/ranks/list.html:19
+msgid "Title"
+msgstr ""
+
+#: legal/admin/forms.py:14
+msgid "Optional, leave empty for agreement to be named after its type."
+msgstr ""
+
+#: legal/admin/forms.py:18
+msgid "Active for its type"
+msgstr ""
+
+#: legal/admin/forms.py:20
+msgid ""
+"If other agreement is already active for this type, it will be unset and "
+"replaced with this one. Misago will ask users who didn't accept this "
+"agreement to do so before allowing them to continue using the site."
+msgstr ""
+
+#: legal/admin/forms.py:27 templates/misago/admin/themes/assets/css.html:17
+msgid "Link"
+msgstr ""
+
+#: legal/admin/forms.py:29
+msgid "If your agreement is located on other page, enter here a link to it."
+msgstr ""
+
+#: legal/admin/forms.py:35
+msgid "You can use Markdown syntax for rich text elements."
+msgstr ""
+
+#: legal/admin/forms.py:48
+msgid "Please fill in agreement link or text."
+msgstr ""
+
+#: legal/admin/forms.py:66 threads/admin/forms.py:8
+msgid "All types"
+msgstr ""
+
+#: legal/admin/forms.py:68
+msgid "Content"
+msgstr ""
+
+#: legal/admin/views.py:16
+msgid "Requested agreement does not exist."
+msgstr ""
+
+#: legal/admin/views.py:29 threads/admin/views/attachments.py:26
+#: users/admin/views/bans.py:24 users/admin/views/datadownloads.py:22
+#: users/admin/views/users.py:63
+msgid "From newest"
+msgstr ""
+
+#: legal/admin/views.py:29 threads/admin/views/attachments.py:27
+#: users/admin/views/bans.py:25 users/admin/views/datadownloads.py:22
+#: users/admin/views/users.py:64
+msgid "From oldest"
+msgstr ""
+
+#: legal/admin/views.py:31
+msgid "With agreements: 0"
+msgstr ""
+
+#: legal/admin/views.py:32
+msgid "Select agreements"
+msgstr ""
+
+#: legal/admin/views.py:36
+msgid "Delete agreements"
+msgstr ""
+
+#: legal/admin/views.py:37
+msgid "Are you sure you want to delete those agreements?"
+msgstr ""
+
+#: legal/admin/views.py:48
+msgid "Selected agreements have been deleted."
+msgstr ""
+
+#: legal/admin/views.py:52
+#, python-format
+msgid "New agreement \"%(title)s\" has been saved."
+msgstr ""
+
+#: legal/admin/views.py:63
+#, python-format
+msgid "Agreement \"%(title)s\" has been edited."
+msgstr ""
+
+#: legal/admin/views.py:78
+#, python-format
+msgid "Agreement \"%(title)s\" has been deleted."
+msgstr ""
+
+#: legal/admin/views.py:86
+#, python-format
+msgid "Agreement \"%(title)s\" has been set as active for type \"%(type)s\"."
+msgstr ""
+
+#: legal/admin/views.py:98
+#, python-format
+msgid "Agreement \"%(title)s\" has been disabled."
+msgstr ""
+
+#: legal/api.py:17
+msgid "You have already accepted this agreement."
+msgstr ""
+
+#: legal/api.py:26
+msgid "You need to submit a valid choice."
+msgstr ""
+
+#: legal/models.py:42 templates/misago/footer.html:29
+msgid "Terms of service"
+msgstr ""
+
+#: legal/models.py:43 templates/misago/footer.html:34
+msgid "Privacy policy"
+msgstr ""
+
+#: markup/finalize.py:24
+#, python-format
+msgid "%(title)s has written:"
+msgstr ""
+
+#: markup/finalize.py:26
+msgid "Quoted message:"
+msgstr ""
+
+#: markup/finalize.py:33
+#, python-format
+msgid "%(title)s:"
+msgstr ""
+
+#: markup/finalize.py:35
+msgid "Spoiler:"
+msgstr ""
+
+#: markup/finalize.py:40
+msgid "Reveal spoiler"
+msgstr ""
+
+#: menus/admin/__init__.py:31
+msgid "Menu items"
+msgstr ""
+
+#: menus/admin/__init__.py:33
+msgid "Use those options to add custom items to the navbar and footer menus."
+msgstr ""
+
+#: menus/admin/forms.py:12
+msgid "URL"
+msgstr ""
+
+#: menus/admin/forms.py:12
+msgid "URL where this item will point to."
+msgstr ""
+
+#: menus/admin/forms.py:15
+msgid "Menu"
+msgstr ""
+
+#: menus/admin/forms.py:17
+msgid "Menu in which this item will be displayed."
+msgstr ""
+
+#: menus/admin/forms.py:21
+msgid "If you want to set custom value for link's \"class\"."
+msgstr ""
+
+#: menus/admin/forms.py:25
+msgid "Open this link in new window"
+msgstr ""
+
+#: menus/admin/forms.py:27
+msgid ""
+"Enabling this option will result in the target=\"_blank\" attribute being "
+"added to this link's HTML element."
+msgstr ""
+
+#: menus/admin/forms.py:33
+msgid "Rel attribute"
+msgstr ""
+
+#: menus/admin/forms.py:35
+msgid "Optional \"rel\" attribute that this item will use (ex. \"nofollow\")."
+msgstr ""
+
+#: menus/admin/views.py:16
+msgid "Requested menu item does not exist."
+msgstr ""
+
+#: menus/admin/views.py:30
+msgid "Delete items"
+msgstr ""
+
+#: menus/admin/views.py:31
+msgid "Are you sure you want to delete those menu items?"
+msgstr ""
+
+#: menus/admin/views.py:38
+msgid "Selected menu items have been deleted."
+msgstr ""
+
+#: menus/admin/views.py:42
+#, python-format
+msgid "New menu item %(item)s has been saved."
+msgstr ""
+
+#: menus/admin/views.py:52
+#, python-format
+msgid "Menu item %(item)s has been edited."
+msgstr ""
+
+#: menus/admin/views.py:64
+#, python-format
+msgid "Menu item %(item)s has been deleted."
+msgstr ""
+
+#: menus/admin/views.py:82
+#, python-format
+msgid "Menu item %(item)s has been moved after %(other)s."
+msgstr ""
+
+#: menus/admin/views.py:101
+#, python-format
+msgid "Menu item %(item)s has been moved before %(other)s."
+msgstr ""
+
+#: menus/models.py:10
+msgid "Navbar and footer"
+msgstr ""
+
+#: menus/models.py:11 templates/misago/admin/menuitems/list.html:41
+msgid "Navbar"
+msgstr ""
+
+#: menus/models.py:12 templates/misago/admin/menuitems/list.html:46
+msgid "Footer"
+msgstr ""
+
+#: search/api.py:17 search/views.py:12 search/views.py:21
+msgid "You don't have permission to search site."
+msgstr ""
+
+#: search/permissions.py:10 templates/misago/search.html:23
+#: templates/misago/search.html:34
+msgid "Search"
+msgstr ""
+
+#: search/permissions.py:12
+msgid "Can search site"
+msgstr ""
+
+#: socialauth/admin/__init__.py:40
+msgid "Social login"
+msgstr ""
+
+#: socialauth/admin/__init__.py:42
+msgid "Enable users to sign on and login using their social profile."
+msgstr ""
+
+#: socialauth/admin/forms/base.py:10
+msgid "Button text"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:11
+msgid "Button color"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:12
+msgid "Enable this provider"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:37
+msgid "Associate existing users by email"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:39
+msgid ""
+"Enabling this option will result in the user being signed in if their forum "
+"account was registered using same e-mail address as used on the social site. "
+"Otherwise they will be asked to specify a different e-mail to continue sign "
+"in using social site."
+msgstr ""
+
+#: socialauth/admin/forms/base.py:51 socialauth/admin/forms/base.py:53
+#: threads/admin/forms.py:97
+msgid "This field is required."
+msgstr ""
+
+#: socialauth/admin/forms/facebook.py:8
+msgid "App ID"
+msgstr ""
+
+#: socialauth/admin/forms/facebook.py:9
+msgid "App Secret"
+msgstr ""
+
+#: socialauth/admin/forms/github.py:8 socialauth/admin/forms/google.py:8
+msgid "Client ID"
+msgstr ""
+
+#: socialauth/admin/forms/github.py:9 socialauth/admin/forms/google.py:9
+msgid "Client Secret"
+msgstr ""
+
+#: socialauth/admin/forms/twitter.py:8
+msgid "Consumer API key"
+msgstr ""
+
+#: socialauth/admin/forms/twitter.py:9
+msgid "Consumer API secret key"
+msgstr ""
+
+#: socialauth/admin/views.py:15
+msgid "Requested social login provider does not exist."
+msgstr ""
+
+#: socialauth/admin/views.py:61
+#, python-format
+msgid "Login with %(provider)s has been updated."
+msgstr ""
+
+#: socialauth/admin/views.py:71
+#, python-format
+msgid "Login with %(provider)s has been disabled."
+msgstr ""
+
+#: socialauth/admin/views.py:91
+#, python-format
+msgid "Login with %(provider)s has been moved after %(other)s."
+msgstr ""
+
+#: socialauth/admin/views.py:112
+#, python-format
+msgid "Login with %(provider)s has been moved before %(other)s."
+msgstr ""
+
+#: socialauth/pipeline.py:88
+#, python-format
+msgid ""
+"The e-mail address associated with your %(backend)s account is not available "
+"for use on this site."
+msgstr ""
+
+#: socialauth/pipeline.py:98
+#, python-format
+msgid ""
+"Your account has to be activated by site administrator before you will be "
+"able to sign in with %(backend)s."
+msgstr ""
+
+#: socialauth/pipeline.py:223 users/api/userendpoints/create.py:60
+msgid "Please try resubmitting the form."
+msgstr ""
+
+#: templates/misago/acl_debug.html:5
+#, python-format
+msgid ""
+"\n"
+"    %(user)s roles\n"
+"    "
+msgstr ""
+
+#: templates/misago/acl_debug.html:9
+msgid "Anonymous roles"
+msgstr ""
+
+#: templates/misago/acl_debug.html:30
+msgid "Current ACL"
+msgstr ""
+
+#: templates/misago/acl_debug.html:34
+msgid "Key"
+msgstr ""
+
+#: templates/misago/acl_debug.html:35
+msgid "Value"
+msgstr ""
+
+#: templates/misago/activation/done.html:5
+msgid "Account activated"
+msgstr ""
+
+#: templates/misago/activation/done.html:20
+msgid ""
+"You can now sign in to finish setting up your account and to participate in "
+"or start new discussions."
+msgstr ""
+
+#: templates/misago/activation/error.html:5
+msgid "Activation error"
+msgstr ""
+
+#: templates/misago/activation/error.html:19
+msgid "Can't activate account."
+msgstr ""
+
+#: templates/misago/activation/request.html:5
+#: templates/misago/activation/request.html:13
+msgid "Request activation link"
+msgstr ""
+
+#: templates/misago/activation/request.html:25
+msgid ""
+"The site administrator may impose a requirement on newly registered accounts "
+"to be activated before users will be able to sign in."
+msgstr ""
+
+#: templates/misago/activation/request.html:28
+msgid ""
+"Depending on the time of registration, you will be able to activate your "
+"account by clicking a special activation link. This link will be valid only "
+"for your browser, for seven days or until your account is activated."
+msgstr ""
+
+#: templates/misago/activation/request.html:31
+msgid ""
+"To receive this link, enter your account's e-mail address in the form and "
+"press the \"Send link\" button."
+msgstr ""
+
+#: templates/misago/activation/request.html:49
+msgid "To request a new activation link please enable JavaScript."
+msgstr ""
+
+#: templates/misago/activation/stopped.html:5
+msgid "Activation failed"
+msgstr ""
+
+#: templates/misago/activation/stopped.html:20
+msgid "Your account can't be activated at this time."
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:9
+#: templates/misago/admin/agreements/form.html:40
+#: templates/misago/admin/agreements/list.html:9
+msgid "New agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:29
+#: templates/misago/admin/categories/form.html:35
+#: templates/misago/admin/categoryroles/categoryroles.html:30
+#: templates/misago/admin/ranks/form.html:29
+#: templates/misago/admin/users/edit.html:23
+msgid "View on site"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:38
+#: templates/misago/admin/agreements/list.html:107
+msgid "Edit agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:48
+#: templates/misago/admin/categoryroles/form.html:36
+#: templates/misago/admin/conf/captcha_settings.html:8
+#: templates/misago/admin/menuitems/form.html:41
+#: templates/misago/admin/roles/form.html:36
+msgid "Basic settings"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:58
+msgid "Agreement contents"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:61
+msgid "Fill in one of the fields."
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:17
+#: templates/misago/admin/users/edit.html:299
+msgid "Agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:20
+msgid "Created"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:21
+#: templates/misago/admin/themes/assets/css.html:32
+#: templates/misago/admin/themes/assets/media.html:22
+msgid "Modified"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:41
+msgid "Users are required to accept this agreement to use the site"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:42
+#: templates/misago/admin/themes/list.html:51 users/admin/forms.py:587
+msgid "Active"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:60
+#, python-format
+msgid "%(created_on)s by %(created_by)s"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:78
+#, python-format
+msgid "%(last_modified_on)s by %(last_modified_by)s"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:82
+msgid "never"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:95
+#: templates/misago/admin/themes/list.html:78
+msgid "Set as active"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:102
+msgid "Disable agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:112
+msgid "Remove agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:124
+msgid "No agreements matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:126
+msgid "No agreements are set."
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:137
+msgid "Are you sure you want to set this agreement as active for its type?"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:141
+msgid "Are you sure you want to disable this agreement?"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:145
+msgid "Are you sure you want to remove this agreement?"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:7
+msgid "Attachment"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:8
+msgid "Thread"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:48
+#, python-format
+msgid "%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s."
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:59
+msgid "None"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:66
+#: templates/misago/admin/warnings/list.html:112
+#: templates/misago/poll/results.html:76
+msgid "Delete"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:76
+msgid "No attachments matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:78
+msgid "No attachments exist."
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:113
+msgid "Are you sure you want to delete this attachment?"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:9
+#: templates/misago/admin/attachmenttypes/list.html:9
+msgid "New type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:26
+msgid "Edit attachment type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:28
+msgid "New attachment type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:36
+#: templates/misago/admin/warnings/form.html:34
+msgid "Basic options"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:47
+msgid "Availability"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:18
+msgid "Extensions"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:19
+#: threads/admin/forms.py:56
+msgid "Mimetypes"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:20
+msgid "Files"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:33
+msgid "Uploading new files of this type is disabled"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:34
+msgid "Limited"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:37
+msgid "Uploading and downloading files of this type is disabled"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:38
+#: templates/misago/admin/users/edit.html:67
+#: templates/misago/admin/users/list.html:70
+msgid "Disabled"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:57
+#: templates/misago/admin/categories/list.html:45
+#: templates/misago/admin/menuitems/list.html:54
+#: templates/misago/admin/ranks/list.html:59
+#: templates/misago/admin/ranks/list.html:66
+msgid "Not set"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:70
+msgid "Edit type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:75
+msgid "Delete type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:86
+msgid "No attachment types are set."
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:95
+msgid "Are you sure you want to delete this attachment type?"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:9
+#: templates/misago/admin/bans/form.html:28
+#: templates/misago/admin/bans/list.html:9
+msgid "New ban"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:26
+#: templates/misago/admin/bans/list.html:65
+msgid "Edit ban"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:36
+#: templates/misago/admin/users/ban.html:62
+msgid "Ban settings"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:47
+#: templates/misago/admin/users/ban.html:71
+msgid "Messages"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:61
+#: templates/misago/admin/bans/list.html:54
+#: templates/misago/admin/users/ban.html:90
+msgid "Never"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:62
+#: templates/misago/admin/users/ban.html:91
+msgid "Set date"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:16
+msgid "Ban"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:19
+msgid "Expires on"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:36 users/admin/forms.py:580
+msgid "Registration only"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:41 users/admin/forms.py:587
+#: users/models/datadownload.py:29
+msgid "Expired"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:70
+msgid "Remove ban"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:82
+msgid "No bans matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:84
+msgid "No bans are set."
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:95
+msgid "Are you sure you want to remove this ban?"
+msgstr ""
+
+#: templates/misago/admin/base.html:7 templates/misago/admin/login.html:6
+msgid "Misago Administration"
+msgstr ""
+
+#: templates/misago/admin/categories/delete.html:6
+#, python-format
+msgid "Delete category: %(category)s"
+msgstr ""
+
+#: templates/misago/admin/categories/delete.html:21
+#: templates/misago/admin/categories/delete.html:39
+#: templates/misago/admin/categories/list.html:97
+msgid "Delete category"
+msgstr ""
+
+#: templates/misago/admin/categories/delete.html:27
+msgid "Category contents"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:9
+#: templates/misago/admin/categories/form.html:46
+#: templates/misago/admin/categories/list.html:9
+msgid "New category"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:29
+msgid "Edit permissions"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:44
+#: templates/misago/admin/categories/list.html:94
+#: templates/misago/admin/categoryroles/categoryroles.html:24
+msgid "Edit category"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:54
+msgid "Display and position"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:65
+msgid "Behaviour"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:74
+msgid "Content approval"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:84
+msgid "Prune threads"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:17
+msgid "Category"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:20
+#: templates/misago/admin/dashboard/index.html:45
+#: templates/misago/admin/dashboard/totals.html:31
+#: templates/misago/admin/users/list.html:21
+#: templates/misago/profile/posts.html:5 templates/misago/profile/posts.html:8
+#: templates/misago/profile/posts.html:9 users/apps.py:93
+msgid "Posts"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:58
+#: templates/misago/admin/menuitems/list.html:72
+#: templates/misago/admin/ranks/list.html:74
+#: templates/misago/admin/socialauth/list.html:32
+#: templates/misago/admin/themes/assets/css.html:68
+#: templates/misago/admin/warnings/list.html:84
+msgid "Move down"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:72
+#: templates/misago/admin/menuitems/list.html:86
+#: templates/misago/admin/ranks/list.html:88
+#: templates/misago/admin/socialauth/list.html:46
+#: templates/misago/admin/themes/assets/css.html:73
+#: templates/misago/admin/warnings/list.html:96
+msgid "Move up"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:107
+msgid "No categories are set."
+msgstr ""
+
+#: templates/misago/admin/categoryroles/categoryroles.html:6
+#, python-format
+msgid "%(category)s: Permissions"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/categoryroles.html:59
+#: templates/misago/admin/categoryroles/rolecategories.html:56
+msgid "Are you sure you want to abandon changes?"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/form.html:9
+#: templates/misago/admin/categoryroles/form.html:28
+msgid "New category role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/form.html:26
+msgid "Edit category role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:9
+#: templates/misago/admin/roles/form.html:9
+#: templates/misago/admin/roles/form.html:28
+#: templates/misago/admin/roles/list.html:9
+msgid "New role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:16 users/admin/forms.py:250
+msgid "Roles"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:34
+#: templates/misago/admin/categoryroles/rolecategories.html:24
+#: templates/misago/admin/roles/form.html:26
+#: templates/misago/admin/roles/list.html:42
+msgid "Edit role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:39
+#: templates/misago/admin/roles/list.html:47
+msgid "Delete role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:50
+msgid "No category roles are set."
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:59
+#: templates/misago/admin/roles/list.html:67
+msgid "Are you sure you want to delete this role?"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/rolecategories.html:6
+#, python-format
+msgid "%(role)s: Category permissions"
+msgstr ""
+
+#: templates/misago/admin/conf/analytics_settings.html:8
+msgid "Google Analytics and Search Console"
+msgstr ""
+
+#: templates/misago/admin/conf/captcha_settings.html:16
+msgid "reCAPTCHA"
+msgstr ""
+
+#: templates/misago/admin/conf/captcha_settings.html:35
+msgid "Stop Forum Spam"
+msgstr ""
+
+#: templates/misago/admin/conf/form.html:16
+#: templates/misago/admin/socialauth/list.html:63
+msgid "Change settings"
+msgstr ""
+
+#: templates/misago/admin/conf/form.html:27
+#: templates/misago/admin/generic/form.html:25
+msgid "Form was completed with errors."
+msgstr ""
+
+#: templates/misago/admin/conf/form.html:37
+#: templates/misago/admin/generic/form.html:45
+#: templates/misago/admin/themes/assets/css-editor-form.html:60
+#: templates/misago/emails/change_email.html:16
+#: templates/misago/emails/change_password.html:16
+msgid "Save changes"
+msgstr ""
+
+#: templates/misago/admin/conf/general_settings.html:8
+msgid "Site details"
+msgstr ""
+
+#: templates/misago/admin/conf/general_settings.html:35
+msgid "Open Graph image"
+msgstr ""
+
+#: templates/misago/admin/conf/general_settings.html:49
+msgid "Forum index"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:8
+msgid "Posting"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:26
+msgid "Threads lists"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:34
+msgid "Thread pages"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:44
+msgid "Read-tracker"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:52
+msgid "Attachment error images"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:8
+msgid "New accounts"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:17 users/admin/forms.py:484
+#: users/admin/forms.py:573
+msgid "Usernames"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:27
+msgid "Avatars"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:43
+msgid "Signatures"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:51
+#: users/admin/__init__.py:80
+msgid "Data downloads"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:60
+msgid "Own account deletion"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:68 users/admin/forms.py:492
+msgid "IP addresses"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:76
+msgid "Default subscription preferences"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:85
+msgid "Users lists"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:94
+msgid "Top posters ranking"
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:5
+msgid "System checks"
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:16
+#: templates/misago/admin/dashboard/index.html:32
+msgid "Checking Misago version used by the site..."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:30
+msgid "The site is running in DEBUG mode."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:31
+msgid ""
+"Error pages displayed in DEBUG mode will expose site configuration details "
+"like secrets and tokens to all visitors. This is MAJOR security risk."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:48
+msgid "Forum address is not configured."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:49
+msgid "Links in e-mails sent by Misago will be broken."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:69
+msgid "Configured forum address appears to be incorrect."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:77
+#, python-format
+msgid ""
+"Your forum address is set to %(configured_address)s while correct value "
+"appears to be %(correct_address)s."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:82
+msgid "Links in e-mails sentby Misagoill be broken."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:102
+msgid "The site is not running over HTTPS."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:103
+msgid ""
+"Browsers may warn users visiting the site about it being insecure. Search "
+"engines will lower its position in search results."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:117
+msgid "Cache is disabled."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:118
+msgid ""
+"This will cause degraded performance and increased CPU usage by the site, "
+"possibly leading to increased hosting costs."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:133
+#, python-format
+msgid "There is %(downloads)s unprocessed data download request."
+msgid_plural "There are %(downloads)s unprocessed data download requests."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/dashboard/checks.html:139
+msgid ""
+"Cron task that should process user data download requests is not running."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:156
+#, python-format
+msgid "There is %(users)s inactive user accounts."
+msgid_plural "There are %(users)s inactive users accounts."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/dashboard/checks.html:162
+msgid ""
+"The site may be targeted by bots, is not sending activation e-mails, or is "
+"not configured to delete inactive user accounts."
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:28
+msgid "Version check is currently unavailable due to an error."
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:29
+msgid "Misago admin API did not answer or answered with an error."
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:42
+msgid "User registrations"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:43
+msgid "User deletions"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:44
+msgid "Threads started"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:46
+msgid "Attachments uploaded"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:47
+msgid "Data download requests"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:49
+msgid "Site analytics are currently unavailable due to an error."
+msgstr ""
+
+#: templates/misago/admin/dashboard/totals.html:43 threads/admin/__init__.py:36
+#: threads/permissions/attachments.py:11 threads/permissions/attachments.py:29
+msgid "Attachments"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/form.html:6
+#: templates/misago/admin/datadownloads/form.html:11
+msgid "Request new data downloads"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:9
+msgid "New downloads"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:17
+#: templates/misago/admin/users/ban.html:28
+#: templates/misago/admin/users/list.html:17 users/admin/forms.py:670
+msgid "User"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:18 threads/admin/forms.py:58
+#: users/admin/forms.py:668
+msgid "Status"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:19
+msgid "Requested on"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:21 users/admin/forms.py:671
+msgid "Requested by"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:32
+#: templates/misago/admin/datadownloads/list.html:51
+#: templates/misago/admin/datadownloads/list.html:54
+#: templates/misago/admin/users/ban.html:38
+#: templates/misago/admin/users/edit.html:38
+#: templates/misago/admin/users/edit.html:195
+#: templates/misago/admin/users/list.html:32
+#: templates/misago/userslists/active_posters.html:83
+msgid "Avatar"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:70
+#: templates/misago/admin/datadownloads/list.html:74
+msgid "Download"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:84
+msgid "No data downloads matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:86
+msgid "No data downloads exist."
+msgstr ""
+
+#: templates/misago/admin/errorpages/403.html:5
+#: templates/misago/errorpages/403.html:5
+msgid "Page not available"
+msgstr ""
+
+#: templates/misago/admin/errorpages/403.html:12
+msgid "Requested page is not available"
+msgstr ""
+
+#: templates/misago/admin/errorpages/403.html:18
+#: templates/misago/errorpages/403.html:12
+#: templates/misago/errorpages/403.html:25
+#: templates/misago/errorpages/403.html:34
+#: templates/misago/errorpages/403.html:54
+msgid "You don't have permission to access this page."
+msgstr ""
+
+#: templates/misago/admin/errorpages/404.html:5
+#: templates/misago/errorpages/403.html:17
+#: templates/misago/errorpages/403.html:18
+#: templates/misago/errorpages/404.html:5
+#: templates/misago/errorpages/404.html:13
+#: templates/misago/errorpages/404.html:14
+msgid "Page not found"
+msgstr ""
+
+#: templates/misago/admin/errorpages/404.html:12
+msgid "Requested page could not be found"
+msgstr ""
+
+#: templates/misago/admin/errorpages/404.html:16
+#: templates/misago/errorpages/404.html:9
+#: templates/misago/errorpages/404.html:18
+#: templates/misago/errorpages/404.html:23
+msgid ""
+"The link you clicked was incorrect or the page has been moved or deleted."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure.html:5
+#: templates/misago/admin/errorpages/csrf_failure.html:14
+#: templates/misago/admin/errorpages/csrf_failure_authenticated.html:5
+#: templates/misago/admin/errorpages/csrf_failure_authenticated.html:12
+msgid "Form submission rejected"
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:3
+msgid ""
+"Your form submission was rejected because your browser didn't send the CSRF "
+"cookie, or the cookie sent was invalid."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:6
+msgid "This is usually a result of one of following problems:"
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:9
+msgid "Your browser is configured to don't accept or send any cookies."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:12
+msgid ""
+"The form was sent after being opened in the browser for a long time (eg. few "
+"days) and cookie token has expired."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:15
+msgid ""
+"The site is configured to use the HTTPS, but this form was sent over the the "
+"HTTP."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:16
+msgid ""
+"If you are an owner of this site, please check if the HTTPS certificate used "
+"by the site is valid and accepted by the browser."
+msgstr ""
+
+#: templates/misago/admin/generic/filter_form.html:7
+msgid "Filter"
+msgstr ""
+
+#: templates/misago/admin/generic/filter_form.html:17
+msgid "Clear filters"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:36
+#: templates/misago/admin/themes/assets/css-editor-form.html:69
+#: templates/misago/admin/themes/assets/css-link-form.html:44
+#: templates/misago/admin/themes/assets/upload-css.html:20
+#: templates/misago/admin/themes/assets/upload-media.html:26
+msgid "Cancel"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:42
+#: templates/misago/admin/themes/assets/css-editor-form.html:58
+msgid "Save and keep editing"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:49
+msgid "Save and add another"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:52
+#: templates/misago/admin/themes/assets/css-editor-form.html:62
+msgid "Save"
+msgstr ""
+
+#: templates/misago/admin/generic/list.html:87
+msgid "Filters"
+msgstr ""
+
+#: templates/misago/admin/generic/list.html:90
+#: templates/misago/admin/generic/list.html:105
+#: templates/misago/admin/themes/assets/upload-css.html:7
+#: templates/misago/admin/themes/assets/upload-media.html:7
+msgid "Close"
+msgstr ""
+
+#: templates/misago/admin/generic/list.html:108
+msgid "Done"
+msgstr ""
+
+#: templates/misago/admin/generic/mass_actions.html:10
+msgid "With selected:"
+msgstr ""
+
+#: templates/misago/admin/generic/order_by.html:5
+msgid "Sort:"
+msgstr ""
+
+#: templates/misago/admin/generic/order_by.html:10
+msgid "Change sorting to:"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:4
+#: templates/misago/thread/paginator.html:7
+msgid "Go to first page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:5
+#: templates/misago/admin/generic/paginator.html:9
+msgid "First"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:13
+#: templates/misago/thread/paginator.html:13
+#: templates/misago/thread/paginator.html:19
+#: templates/misago/userslists/rank.html:99
+#: templates/misago/userslists/rank.html:107
+msgid "Go to previous page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:22
+#: templates/misago/thread/paginator.html:27
+#: templates/misago/userslists/rank.html:116
+msgid "Go to next page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:31
+#: templates/misago/thread/paginator.html:32
+msgid "Go to last page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:32
+#: templates/misago/admin/generic/paginator.html:36
+#: templates/misago/thread/toolbar-top.html:20
+msgid "Last"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:41
+#, python-format
+msgid "Page %(page)s of %(pages)s"
+msgstr ""
+
+#: templates/misago/admin/icons.html:8
+msgid "Favicon"
+msgstr ""
+
+#: templates/misago/admin/icons.html:11
+msgid ""
+"Favicon is small icon that internet browsers display next to your site in "
+"its interface."
+msgstr ""
+
+#: templates/misago/admin/icons.html:68
+msgid "Apple Touch Icon"
+msgstr ""
+
+#: templates/misago/admin/icons.html:71
+msgid ""
+"Apple devices and Safari web browser will use this image to represent the "
+"site in its interfaces."
+msgstr ""
+
+#: templates/misago/admin/login.html:6
+msgid "Log in"
+msgstr ""
+
+#: templates/misago/admin/login.html:6
+msgid "Django Administration"
+msgstr ""
+
+#: templates/misago/admin/login.html:24
+msgid "Administration"
+msgstr ""
+
+#: templates/misago/admin/login.html:29 users/captcha.py:19
+msgid "Please try again."
+msgstr ""
+
+#: templates/misago/admin/login.html:48 users/forms/auth.py:60
+msgid "Username or e-mail"
+msgstr ""
+
+#: templates/misago/admin/login.html:53 users/admin/forms.py:67
+#: users/forms/auth.py:63
+msgid "Password"
+msgstr ""
+
+#: templates/misago/admin/login.html:57 templates/misago/auth.html:5
+msgid "Sign in"
+msgstr ""
+
+#: templates/misago/admin/login.html:60
+msgid "Return to site"
+msgstr ""
+
+#: templates/misago/admin/menuitems/form.html:9
+#: templates/misago/admin/menuitems/form.html:33
+#: templates/misago/admin/menuitems/list.html:9
+msgid "New menu item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/form.html:31
+msgid "Edit menu item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/form.html:50
+msgid "Behavior and appearance"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:16
+msgid "Item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:18
+msgid "CSS Class"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:19
+msgid "Target"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:20
+msgid "Rel"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:40
+msgid "Is displayed on the forum navbar."
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:45
+msgid "Is displayed on the forum footer."
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:103
+msgid "Edit item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:108
+msgid "Remove item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:119
+msgid "No menu items are set."
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:129
+msgid "Are you sure you want to remove this menu item?"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:12
+msgid "GitHub"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:16
+msgid "Support forum"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:20
+msgid "Site index"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:24
+msgid "Your avatar"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:29
+msgid "Edit your account"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:35
+msgid "Close admin session"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:41
+msgid "Log out completely"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:9
+#: templates/misago/admin/ranks/form.html:40
+#: templates/misago/admin/ranks/list.html:9
+msgid "New rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:38
+#: templates/misago/admin/ranks/list.html:116
+msgid "Edit rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:48
+msgid "Name and description"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:66
+msgid "Display and visibility"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:17
+#: templates/misago/admin/users/list.html:19
+#: templates/misago/userslists/active_posters.html:112
+#: templates/misago/userslists/active_posters.html:123 users/admin/forms.py:238
+msgid "Rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:45
+msgid "Has dedicated page on users list"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:46
+msgid "Tab"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:50
+msgid "This is default rank assigned to new members"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:51
+msgid "Default"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:105
+msgid "List users"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:111
+msgid "Set as default"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:121
+msgid "Delete rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:132
+msgid "No user ranks are set."
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:141
+msgid "Are you sure you want to delete this rank?"
+msgstr ""
+
+#: templates/misago/admin/roles/list.html:39
+msgid "Users with role"
+msgstr ""
+
+#: templates/misago/admin/roles/list.html:58
+msgid "No user roles are set."
+msgstr ""
+
+#: templates/misago/admin/socialauth/form.html:17
+msgid "Edit social login"
+msgstr ""
+
+#: templates/misago/admin/socialauth/form.html:19
+msgid "Setup social login"
+msgstr ""
+
+#: templates/misago/admin/socialauth/form.html:40
+msgid "Button appearance"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:8
+msgid "Enabled login methods"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:15
+#: templates/misago/admin/socialauth/list.html:106
+msgid "Provider"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:68
+msgid "Disable login"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:79
+msgid "No social login methods are enabled."
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:88
+msgid "Are you sure you want to disable this social login provider?"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:100
+msgid "Setup new login method"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:119
+msgid "Setup login with this provider"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:120
+msgid "Setup"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:127
+msgid "No new login providers are available for setup at this time."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-editor-form.html:9
+#: templates/misago/admin/themes/assets/css-editor-form.html:41
+msgid "New CSS"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-editor-form.html:39
+msgid "Edit CSS"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-link-form.html:9
+#: templates/misago/admin/themes/assets/css-link-form.html:31
+msgid "New CSS link"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-link-form.html:29
+msgid "Edit CSS link"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:7
+msgid "CSS files"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:12
+#: templates/misago/admin/themes/assets/media.html:12
+#: templates/misago/admin/themes/assets/upload-css.html:21
+#: templates/misago/admin/themes/assets/upload-media.html:27
+msgid "Upload"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:22
+msgid "Create"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:33
+#: templates/misago/admin/themes/assets/media.html:23
+msgid "Size"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:80
+#: templates/misago/admin/themes/assets/css.html:84
+#: templates/misago/admin/users/list.html:95
+#: templates/misago/admin/warnings/list.html:105
+#: templates/misago/poll/results.html:69
+#: templates/misago/profile/details.html:25
+#: templates/misago/thread/posts/post/footer.html:31
+#: users/admin/djangoadmin.py:72
+msgid "Edit"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:94
+msgid "This theme has no CSS files."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:103
+#: templates/misago/admin/themes/assets/media.html:79
+msgid "Delete selected"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/list.html:6
+msgid "Assets"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/list.html:22
+#: templates/misago/admin/themes/form.html:38
+msgid "Edit theme"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/list.html:44
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/media.html:7
+msgid "Media"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/media.html:25
+msgid "Dimensions"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/media.html:70
+msgid "This theme has no media."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-css.html:6
+msgid "Upload CSS"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-css.html:15
+msgid "Select CSS files to upload"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:6
+msgid "Upload media"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:15
+msgid "Select media files to upload"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:18
+msgid ""
+"Media files are primarily image and font files that can be linked to from "
+"the CSS, but files of any type can be uploaded using this option."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:21
+msgid ""
+"Theme CSS that use the \"url()\" to point to media files will be updated "
+"automatically."
+msgstr ""
+
+#: templates/misago/admin/themes/form.html:9
+#: templates/misago/admin/themes/form.html:40
+msgid "New theme"
+msgstr ""
+
+#: templates/misago/admin/themes/form.html:29
+#: templates/misago/admin/themes/list.html:63
+msgid "Edit assets"
+msgstr ""
+
+#: templates/misago/admin/themes/form.html:57
+msgid "Additional information (optional)"
+msgstr ""
+
+#: templates/misago/admin/themes/import.html:6
+#: templates/misago/admin/themes/import.html:11
+#: templates/misago/admin/themes/list.html:9
+msgid "Import theme"
+msgstr ""
+
+#: templates/misago/admin/themes/import.html:23
+msgid "Import"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:15
+msgid "Create theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:22
+msgid "Theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:68
+msgid "Edit information"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:72
+msgid "Create child theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:86
+msgid "Export theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:94
+msgid "Delete theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:109
+msgid ""
+"Are you sure you want to delete this theme? Deleting theme will also delete "
+"its child themes."
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:6
+#: templates/misago/admin/users/ban.html:82 users/admin/views/users.py:74
+msgid "Ban users"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:11
+msgid "Ban selected users"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:29 users/admin/forms.py:314
+#: users/signals.py:30
+msgid "E-mail"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:30 users/models/ban.py:73
+msgid "IP address"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:51
+#: templates/misago/admin/users/list.html:85
+msgid "IP removed"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:31
+#: templates/misago/admin/users/list.html:94
+msgid "Edit user"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:44
+#: templates/misago/admin/users/list.html:47
+msgid "Can use admin control panel and manage other administrators"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:45
+#: templates/misago/admin/users/list.html:48
+msgid "Super Admin"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:48
+#: templates/misago/admin/users/list.html:51
+msgid "Can use admin control panel"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:49
+#: templates/misago/admin/users/list.html:52
+msgid "Admin"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:53
+#: templates/misago/admin/users/list.html:56
+msgid "Requires activation by administrator"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:54
+#: templates/misago/admin/users/edit.html:58
+#: templates/misago/admin/users/list.html:57
+#: templates/misago/admin/users/list.html:61
+msgid "Inactive"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:57
+#: templates/misago/admin/users/list.html:60
+msgid "Has to activate their account"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:62
+#: templates/misago/admin/users/list.html:65
+msgid "Account scheduled for deletion"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:63
+#: templates/misago/admin/users/list.html:66
+msgid "Deleted"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:66
+#: templates/misago/admin/users/list.html:69 users/admin/forms.py:317
+msgid "Account disabled"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:92
+#: templates/misago/categories/stats.html:12
+#: templates/misago/thread/posts/post/side.html:41
+#: templates/misago/thread/posts/post/side.html:49
+#: templates/misago/userslists/usercard.html:52
+#, python-format
+msgid "%(posts)s post"
+msgid_plural "%(posts)s posts"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/users/edit.html:99
+#: templates/misago/categories/stats.html:5
+#: templates/misago/userslists/usercard.html:59
+#, python-format
+msgid "%(threads)s thread"
+msgid_plural "%(threads)s threads"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/users/edit.html:110
+#: templates/misago/admin/users/new.html:18
+msgid "Basic account settings"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:129
+msgid "Administrator status"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:136
+msgid "Only superusers can change other users administrator status."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:180
+#: templates/misago/admin/users/new.html:37
+msgid "Sign-in credentials"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:184
+msgid ""
+"This user has not set account password and uses other service to "
+"authenticate."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:205
+msgid "Signature"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:228 users/apps.py:24
+msgid "Forum options"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:237
+msgid "Automatic subscription preferences"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:246
+msgid "Account status"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:250
+msgid ""
+"This user is deleting their account. It has been deactivated for the "
+"duration of the process."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:251
+msgid ""
+"No additional action is required. This account will be deleted automatically."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:294
+msgid "Agreements"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:301
+msgid "Accepted on"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:324
+msgid "This user didn't accept any agreements."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:9
+#: templates/misago/admin/users/new.html:6
+#: templates/misago/admin/users/new.html:11
+msgid "New user"
+msgstr ""
+
+#: templates/misago/admin/users/list.html:20
+msgid "Registration"
+msgstr ""
+
+#: templates/misago/admin/users/list.html:103
+msgid "No users matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:111
+msgid "You can include wildcard (\"*\") in username and email search:"
+msgstr ""
+
+#: templates/misago/admin/users/list.html:114
+msgid "\"admin*\" will find both \"admin\" and \"administrator\"."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:117
+msgid "\"*chan\" will match both \"chan\" and \"marichan\"."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:120
+msgid "\"*son*\" will match \"son\", \"song\", \"firstson\" and \"firstsong\"."
+msgstr ""
+
+#: templates/misago/admin/users/new.html:47
+msgid "Save user"
+msgstr ""
+
+#: templates/misago/admin/warnings/form.html:9
+#: templates/misago/admin/warnings/form.html:19
+#: templates/misago/admin/warnings/list.html:9
+msgid "New warning level"
+msgstr ""
+
+#: templates/misago/admin/warnings/form.html:41
+msgid "Restrictions"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:16
+msgid "Warning level"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:17
+msgid "Length"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:18
+msgid "Replying"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:19
+msgid "Starting threads"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:40
+msgid "Permanent"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:47
+#: templates/misago/admin/warnings/list.html:65
+msgid "Not restricted"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:52
+#: templates/misago/admin/warnings/list.html:70
+msgid "Moderated"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:57
+#: templates/misago/admin/warnings/list.html:75
+msgid "Forbidden"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:122
+msgid "No warning levels are set."
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:131
+msgid "Are you sure you want to delete this warning level?"
+msgstr ""
+
+#: templates/misago/auth.html:10
+msgid "Log out"
+msgstr ""
+
+#: templates/misago/categories/base.html:18
+#: templates/misago/categories/base.html:49
+#: templates/misago/categories/base.html:62
+#, python-format
+msgid ""
+"There is %(categories)s main category currenty available on the "
+"%(forum_name)s."
+msgid_plural ""
+"There are %(categories)s main categories currenty available on the "
+"%(forum_name)s."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/categories/body.html:15
+msgid "No categories exist or you don't have permission to see them."
+msgstr ""
+
+#: templates/misago/categories/icon.html:4
+msgid "This category has no new posts. (closed)"
+msgstr ""
+
+#: templates/misago/categories/icon.html:10
+msgid "This category has new posts. (closed)"
+msgstr ""
+
+#: templates/misago/categories/icon.html:18
+msgid "This category has no new posts."
+msgstr ""
+
+#: templates/misago/categories/icon.html:24
+msgid "This category has new posts."
+msgstr ""
+
+#: templates/misago/categories/last_thread.html:54
+msgid "This category is empty. No threads were posted within it so far."
+msgstr ""
+
+#: templates/misago/categories/last_thread.html:68
+msgid "This category is private. You can see only your own threads within it."
+msgstr ""
+
+#: templates/misago/categories/last_thread.html:82
+msgid "This category is protected. You can't browse it's contents."
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.html:6
+#: templates/misago/emails/activation/by_admin.txt:6
+#, python-format
+msgid "%(user)s, your account has been activated by forum administrator."
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.html:12
+#: templates/misago/emails/register/complete.html:18
+#: templates/misago/emails/register/inactive.html:31
+msgid "this form"
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.html:14
+#, python-format
+msgid "You can now sign in to it using %(login_form)s."
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.txt:10
+msgid "You can now sign in to it using the form below:"
+msgstr ""
+
+#: templates/misago/emails/activation/by_user.html:6
+#: templates/misago/emails/activation/by_user.txt:6
+#, python-format
+msgid "%(user)s, to activate your account click the below link:"
+msgstr ""
+
+#: templates/misago/emails/activation/by_user.html:11
+#: templates/misago/emails/register/inactive.html:27
+msgid "Activate my account!"
+msgstr ""
+
+#: templates/misago/emails/change_email.html:6
+#: templates/misago/emails/change_email.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because you have changed your e-"
+"mail address."
+msgstr ""
+
+#: templates/misago/emails/change_email.html:11
+#: templates/misago/emails/change_email.txt:10
+#: templates/misago/emails/change_password.html:11
+#: templates/misago/emails/change_password.txt:10
+msgid "To confirm this change, click the link below:"
+msgstr ""
+
+#: templates/misago/emails/change_password.html:6
+#: templates/misago/emails/change_password.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because you have changed your "
+"password."
+msgstr ""
+
+#: templates/misago/emails/change_password_form_link.html:6
+#: templates/misago/emails/change_password_form_link.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because you want to change "
+"forgotten password for your forum account."
+msgstr ""
+
+#: templates/misago/emails/change_password_form_link.html:11
+#: templates/misago/emails/change_password_form_link.txt:10
+msgid "To change your account password click the link below:"
+msgstr ""
+
+#: templates/misago/emails/change_password_form_link.html:16
+#: templates/misago/forgottenpassword/form.html:7
+#: templates/misago/forgottenpassword/form.html:20
+#: templates/misago/forgottenpassword/request.html:7
+#: templates/misago/forgottenpassword/request.html:20
+msgid "Set new password"
+msgstr ""
+
+#: templates/misago/emails/data_download.html:6
+#: templates/misago/emails/data_download.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because your data is ready for "
+"download."
+msgstr ""
+
+#: templates/misago/emails/data_download.html:11 users/apps.py:52
+msgid "Download data"
+msgstr ""
+
+#: templates/misago/emails/data_download.html:14
+#: templates/misago/emails/data_download.txt:15
+#, python-format
+msgid ""
+"This link will remain active for %(expires_in)s hour from the time this "
+"message has been sent."
+msgid_plural ""
+"This link will remain active for %(expires_in)s hours from the time this "
+"message has been sent."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/emails/data_download.txt:10
+msgid "To download your data, click the following link:"
+msgstr ""
+
+#: templates/misago/emails/privatethread/added.html:9
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has invited you "
+"to participate in private thread %(thread)s."
+msgstr ""
+
+#: templates/misago/emails/privatethread/added.html:14
+#: templates/misago/emails/privatethread/added.txt:10
+msgid "To read this thread click the link below:"
+msgstr ""
+
+#: templates/misago/emails/privatethread/added.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has invited you "
+"to participate in private thread \"%(thread)s\"."
+msgstr ""
+
+#: templates/misago/emails/register/complete.html:6
+#: templates/misago/emails/register/complete.txt:6
+#: templates/misago/emails/register/inactive.txt:6
+#, python-format
+msgid "%(user)s, thank you for joining us!"
+msgstr ""
+
+#: templates/misago/emails/register/complete.html:12
+#: templates/misago/emails/register/complete.txt:10
+msgid ""
+"You may now join discussion on our forums. Why not spend a minute or two to "
+"have a look around and share your opinions and knowledge with rest of "
+"community?"
+msgstr ""
+
+#: templates/misago/emails/register/complete.html:20
+#, python-format
+msgid "You can always sign in to your account using %(login_form)s."
+msgstr ""
+
+#: templates/misago/emails/register/complete.txt:14
+msgid "You can always sign in to your account using the form below:"
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:7
+#: templates/misago/emails/register/inactive.txt:10
+msgid ""
+"Before you will be able to join discussion on our forums, one of our "
+"administrators will have to activate your account."
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:12
+#: templates/misago/emails/register/inactive.txt:15
+msgid ""
+"This may take a while, but you will receive e-mail with notification once it "
+"happens."
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:17
+#: templates/misago/emails/register/inactive.txt:20
+msgid "Thank you for your patience and see you soon!"
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:22
+#: templates/misago/emails/register/inactive.txt:25
+msgid ""
+"Before you will be able to join discussion on our forums, you have to "
+"activate your account. To do so, simply click the link below:"
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:33
+#, python-format
+msgid ""
+"Once your account is activated, you can always sign in to it using "
+"%(login_form)s."
+msgstr ""
+
+#: templates/misago/emails/register/inactive.txt:30
+msgid ""
+"Once your account is activated, you can always sign in to it using the form "
+"below:"
+msgstr ""
+
+#: templates/misago/emails/thread/reply.html:9
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has replied to "
+"the thread %(thread)s that you are subscribed to."
+msgstr ""
+
+#: templates/misago/emails/thread/reply.html:14
+#: templates/misago/emails/thread/reply.txt:10
+msgid "To read this reply, click the below link:"
+msgstr ""
+
+#: templates/misago/emails/thread/reply.html:17
+msgid "Go to reply"
+msgstr ""
+
+#: templates/misago/emails/thread/reply.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has replied to "
+"the thread \"%(thread)s\" that you are subscribed to."
+msgstr ""
+
+#: templates/misago/errorpages/403.html:50
+msgid "This page is not available."
+msgstr ""
+
+#: templates/misago/errorpages/404.html:38
+msgid "Requested page could not be found."
+msgstr ""
+
+#: templates/misago/errorpages/404.html:39
+msgid ""
+"The link you followed was incorrect or the page has been moved or deleted."
+msgstr ""
+
+#: templates/misago/errorpages/405.html:5
+#: templates/misago/errorpages/405.html:13
+#: templates/misago/errorpages/405.html:14
+msgid "Wrong way"
+msgstr ""
+
+#: templates/misago/errorpages/405.html:9
+#: templates/misago/errorpages/405.html:18
+#: templates/misago/errorpages/405.html:23
+#: templates/misago/errorpages/405.html:39
+msgid "This page should be reached via form submission or pressing button."
+msgstr ""
+
+#: templates/misago/errorpages/405.html:38
+msgid "Page reached in wrong way."
+msgstr ""
+
+#: templates/misago/errorpages/ban_message.html:15
+#, python-format
+msgid "This ban expires on %(expires_on)s."
+msgstr ""
+
+#: templates/misago/errorpages/ban_message.html:19
+msgid "This ban is permanent."
+msgstr ""
+
+#: templates/misago/errorpages/banned.html:5
+msgid "You are banned"
+msgstr ""
+
+#: templates/misago/errorpages/banned.html:9
+msgid "You are banned from accessing this page."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:5
+#: templates/misago/errorpages/csrf_failure_authenticated.html:5
+msgid "Request blocked"
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:9
+msgid ""
+"This is usually caused by your browser not accepting or using outdated "
+"cookies. Check your browser configuration and try again."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:24
+#: templates/misago/errorpages/csrf_failure_authenticated.html:19
+msgid "Suspicious request blocked."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:25
+#: templates/misago/errorpages/csrf_failure_authenticated.html:20
+msgid ""
+"This is usually caused by your browser not accepting or using outdated "
+"cookies."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:26
+#: templates/misago/errorpages/csrf_failure_authenticated.html:21
+msgid "Check your browser configuration and try again."
+msgstr ""
+
+#: templates/misago/errorpages/social.html:5
+#: templates/misago/errorpages/social.html:11
+#: templates/misago/errorpages/social.html:12
+msgid "Problem with sign in"
+msgstr ""
+
+#: templates/misago/errorpages/social.html:38
+msgid ""
+"Please try again or use another method to sign in if the problem persists."
+msgstr ""
+
+#: templates/misago/footer.html:9
+msgid "For complete experience please enable JavaScript."
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:7
+msgid "Set new password error"
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:9
+msgid "Change forgotten password error"
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:26
+msgid "Can't set new password."
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:28
+msgid "Can't change forgotten password."
+msgstr ""
+
+#: templates/misago/forgottenpassword/form.html:9
+#: templates/misago/forgottenpassword/form.html:22
+#: templates/misago/forgottenpassword/request.html:9
+#: templates/misago/forgottenpassword/request.html:22
+msgid "Change forgotten password"
+msgstr ""
+
+#: templates/misago/forgottenpassword/form.html:42
+msgid "To reset your password please enable JavaScript."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:35
+msgid ""
+"Your user account has no password set for it because it was created with "
+"other service."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:36
+msgid ""
+"To set password for your account, you can use special secure form that will "
+"be available by special link valid only for your browser, for seven days or "
+"until your password is set."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:38
+msgid ""
+"Because user passwords are processed in an irreversible way before being "
+"saved to database, it is not possible for us to simply send you your "
+"password."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:39
+msgid ""
+"Instead, you can change your password using special secure form that will be "
+"available by special link valid only for your browser, for seven days or "
+"until your password is changed."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:42
+msgid ""
+"To receive this link, enter your account's e-mail addres in form and press "
+"the \"Send link\" button."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:60
+msgid "To request new password reset link please enable JavaScript."
+msgstr ""
+
+#: templates/misago/options/credentials_changed.html:5
+#: templates/misago/options/credentials_error.html:5
+msgid "Change sign-in credentials"
+msgstr ""
+
+#: templates/misago/options/credentials_changed.html:20
+msgid "From now you will need to use new credentials when signing in."
+msgstr ""
+
+#: templates/misago/options/credentials_error.html:19
+msgid "Change confirmation link is invalid."
+msgstr ""
+
+#: templates/misago/options/credentials_error.html:20
+msgid ""
+"The confirmation link belongs to other user, was already used, or has "
+"expired."
+msgstr ""
+
+#: templates/misago/options/noscript.html:5
+msgid "Change your options"
+msgstr ""
+
+#: templates/misago/options/noscript.html:20
+#: templates/misago/socialauth.html:22
+msgid "Enable JavaScript"
+msgstr ""
+
+#: templates/misago/options/noscript.html:21
+msgid "You need to enable JavaScript in your browser to change your options."
+msgstr ""
+
+#: templates/misago/participants.html:30
+msgid "Add participant"
+msgstr ""
+
+#: templates/misago/participants.html:36
+#, python-format
+msgid "This thread has %(users)s participant."
+msgid_plural "This thread has %(users)s participants."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/info.html:4
+#, python-format
+msgid "%(votes)s vote."
+msgid_plural "%(votes)s votes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/info.html:15
+#, python-format
+msgid "Voting ends on %(ends_on)s."
+msgstr ""
+
+#: templates/misago/poll/info.html:22
+msgid "Votes are public."
+msgstr ""
+
+#: templates/misago/poll/info.html:36
+#, python-format
+msgid "Posted by %(poster)s on %(posted_on)s."
+msgstr ""
+
+#: templates/misago/poll/results.html:21 templates/misago/poll/results.html:31
+#, python-format
+msgid "%(votes)s vote, %(proc)s%% of total."
+msgid_plural "%(votes)s votes, %(proc)s%% of total."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/results.html:41
+msgid "Your choice."
+msgstr ""
+
+#: templates/misago/poll/results.html:55
+msgid "Vote"
+msgstr ""
+
+#: templates/misago/poll/results.html:62
+msgid "See votes"
+msgstr ""
+
+#: templates/misago/poll/voting.html:24
+#, python-format
+msgid "You can select %(choices)s choice."
+msgid_plural "You can select %(choices)s choices."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/voting.html:32
+msgid "You can change your vote later."
+msgstr ""
+
+#: templates/misago/poll/voting.html:36
+msgid "Votes are final."
+msgstr ""
+
+#: templates/misago/poll/voting.html:46
+msgid "Save your vote"
+msgstr ""
+
+#: templates/misago/poll/voting.html:51
+msgid "See results"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:5
+#: templates/misago/profile/ban_details.html:8
+#: templates/misago/profile/ban_details.html:9
+#: templates/misago/profile/ban_details.html:16 users/apps.py:128
+msgid "Ban details"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:22
+msgid "User-shown ban message"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:31
+msgid "Team-shown ban message"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:39
+msgid "Ban expiration"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:43
+#, python-format
+msgid "%(username)s's ban expires on %(expires_on)s."
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:47
+#, python-format
+msgid "%(username)s's ban is permanent."
+msgstr ""
+
+#: templates/misago/profile/base.html:9 templates/misago/profile/base.html:20
+#: templates/misago/profile/base.html:35
+#, python-format
+msgid "%(title)s, joined on %(joined_on)s."
+msgstr ""
+
+#: templates/misago/profile/base.html:22 templates/misago/profile/base.html:37
+#, python-format
+msgid "Wrote %(posts)s post."
+msgid_plural "Wrote %(posts)s posts."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/base.html:26 templates/misago/profile/base.html:41
+#, python-format
+msgid "Started %(threads)s thread."
+msgid_plural "Started %(threads)s threads."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/details.html:5
+#: templates/misago/profile/details.html:8
+#: templates/misago/profile/details.html:9
+#: templates/misago/profile/details.html:19 users/apps.py:115
+msgid "Details"
+msgstr ""
+
+#: templates/misago/profile/details.html:75
+msgid "You are not sharing any details with others."
+msgstr ""
+
+#: templates/misago/profile/details.html:77
+#, python-format
+msgid "%(username)s is not sharing any details with others."
+msgstr ""
+
+#: templates/misago/profile/feed.html:10
+msgid "See post"
+msgstr ""
+
+#: templates/misago/profile/feed.html:61
+#: templates/misago/thread/posts/post/body.html:10
+msgid "This post's contents cannot be displayed."
+msgstr ""
+
+#: templates/misago/profile/feed.html:62
+#: templates/misago/thread/posts/post/body.html:11
+msgid "This error is caused by invalid post content manipulation."
+msgstr ""
+
+#: templates/misago/profile/followers.html:5
+#: templates/misago/profile/followers.html:8
+#: templates/misago/profile/followers.html:9 users/apps.py:103
+msgid "Followers"
+msgstr ""
+
+#: templates/misago/profile/followers.html:18
+#, python-format
+msgid "You have %(users)s follower."
+msgid_plural "You have %(users)s followers."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/followers.html:24
+#, python-format
+msgid "%(username)s has %(users)s follower."
+msgid_plural "%(username)s has %(users)s followers."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/followers.html:49
+msgid "You have no followers."
+msgstr ""
+
+#: templates/misago/profile/followers.html:51
+#, python-format
+msgid "%(username)s has no followers."
+msgstr ""
+
+#: templates/misago/profile/follows.html:5
+#: templates/misago/profile/follows.html:8
+#: templates/misago/profile/follows.html:9 users/apps.py:109
+msgid "Follows"
+msgstr ""
+
+#: templates/misago/profile/follows.html:18
+#, python-format
+msgid "You are following %(users)s user."
+msgid_plural "You are following %(users)s users."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/follows.html:24
+#, python-format
+msgid "%(username)s is following %(users)s user."
+msgid_plural "%(username)s is following %(users)s users."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/follows.html:49
+msgid "You are not following any users."
+msgstr ""
+
+#: templates/misago/profile/follows.html:51
+#, python-format
+msgid "%(username)s is not following any users."
+msgstr ""
+
+#: templates/misago/profile/header.html:7
+msgid "This user is deleting their account."
+msgstr ""
+
+#: templates/misago/profile/header.html:9
+msgid "This user's account has been disabled by administrator."
+msgstr ""
+
+#: templates/misago/profile/header.html:46
+#, python-format
+msgid "Member since %(joined_on)s"
+msgstr ""
+
+#: templates/misago/profile/posts.html:20
+#, python-format
+msgid "You have posted %(posts)s message."
+msgid_plural "You have posted %(posts)s messages."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/posts.html:26
+#, python-format
+msgid "%(username)s has posted %(posts)s message."
+msgid_plural "%(username)s has posted %(posts)s messages."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/posts.html:40
+msgid "You have posted no messages"
+msgstr ""
+
+#: templates/misago/profile/posts.html:42
+#, python-format
+msgid "%(username)s posted no messages."
+msgstr ""
+
+#: templates/misago/profile/threads.html:20
+#, python-format
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/threads.html:26
+#, python-format
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/threads.html:40
+msgid "You have no started threads."
+msgstr ""
+
+#: templates/misago/profile/threads.html:42
+#, python-format
+msgid "%(username)s started no threads."
+msgstr ""
+
+#: templates/misago/profile/username_history.html:5
+#: templates/misago/profile/username_history.html:8
+#: templates/misago/profile/username_history.html:9 users/apps.py:121
+msgid "Username history"
+msgstr ""
+
+#: templates/misago/profile/username_history.html:18
+#, python-format
+msgid "Your username was changed %(changes)s time."
+msgid_plural "Your username was changed %(changes)s times."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/username_history.html:24
+#, python-format
+msgid "%(username)s's username was changed %(changes)s time."
+msgid_plural "%(username)s's username was changed %(changes)s times."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/username_history.html:79
+msgid "Your username was never changed."
+msgstr ""
+
+#: templates/misago/profile/username_history.html:81
+#, python-format
+msgid "%(username)s's username was never changed."
+msgstr ""
+
+#: templates/misago/required_agreement.html:9
+#, python-format
+msgid "Please review the updated %(agreement)s:"
+msgstr ""
+
+#: templates/misago/required_agreement.html:19
+msgid "here"
+msgstr ""
+
+#: templates/misago/required_agreement.html:21
+#, python-format
+msgid "Please review the updated %(agreement)s available %(link)s."
+msgstr ""
+
+#: templates/misago/search.html:5 templates/misago/search.html:8
+#: templates/misago/search.html:9
+msgid "Search site"
+msgstr ""
+
+#: templates/misago/search.html:47
+msgid "Loading search..."
+msgstr ""
+
+#: templates/misago/socialauth.html:5
+#, python-format
+msgid "Sign in with %(backend)s"
+msgstr ""
+
+#: templates/misago/socialauth.html:24
+#, python-format
+msgid ""
+"You need to enable JavaScript in your browser to complete the sign in with "
+"%(backend)s."
+msgstr ""
+
+#: templates/misago/thread/paginator.html:41
+#, python-format
+msgid "There is %(more)s more post in this thread."
+msgid_plural "There are %(more)s more posts in this thread."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/thread/paginator.html:47
+msgid "There are no more posts in this thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:48
+#, python-format
+msgid "Thread title has been changed from %(old_title)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:52
+msgid "Thread has been pinned globally."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:54
+msgid "Thread has been pinned locally."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:56
+msgid "Thread has been unpinned."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:61
+#, python-format
+msgid "Thread has been moved from %(from_category)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:68
+#, python-format
+msgid "The %(merged_thread)s thread has been merged into this thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:72
+msgid "Thread has been approved."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:74
+msgid "Thread has been opened."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:76
+msgid "Thread has been closed."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:78
+msgid "Thread has been revealed."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:80
+msgid "Thread has been made hidden."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:82
+msgid "Took thread over."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:84
+msgid "Owner has left thread. This thread is now closed."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:86
+msgid "Participant has left thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:91
+#, python-format
+msgid "Changed thread owner to %(user)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:98
+#, python-format
+msgid "Added %(user)s to thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:105
+#, python-format
+msgid "Removed %(user)s from thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/info.html:12
+#: templates/misago/thread/posts/post/body-hidden.html:14
+#, python-format
+msgid "Hidden by %(hidden_by)s on %(hidden_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/info.html:28
+#, python-format
+msgid "By %(event_by)s on %(event_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/attachments.html:33
+#, python-format
+msgid "%(filetype)s, %(size)s, uploaded by %(uploader)s on %(uploaded_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/body-hidden.html:4
+msgid "This post is hidden. You cannot not see its contents."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:7
+#, python-format
+msgid "Marked as best answer by you %(marked_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:13
+#, python-format
+msgid "Marked as best answer by %(marked_by)s %(marked_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:23
+msgid "This post is hidden. Only users with permission may see its contents."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:29
+msgid ""
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:35
+msgid "This post is protected. Only moderators may change it."
+msgstr ""
+
+#: templates/misago/thread/posts/post/footer.html:7
+msgid "Liked"
+msgstr ""
+
+#: templates/misago/thread/posts/post/footer.html:9
+msgid "Like"
+msgstr ""
+
+#: templates/misago/thread/posts/post/footer.html:26
+msgid "Reply"
+msgstr ""
+
+#: templates/misago/thread/posts/post/header.html:5
+msgid "New post"
+msgstr ""
+
+#: templates/misago/thread/posts/post/header.html:8
+#: templates/misago/thread/toolbar-top.html:7
+#: templates/misago/threadslist/tabs.html:17
+msgid "New"
+msgstr ""
+
+#: templates/misago/thread/posts/post/header.html:22
+#: templates/misago/thread/posts/post/side.html:4
+msgid "Post link"
+msgstr ""
+
+#: templates/misago/thread/posts/post/side.html:73
+msgid "Removed user"
+msgstr ""
+
+#: templates/misago/thread/stats.html:11
+#: templates/misago/threadslist/thread.html:21
+msgid "Pinned globally"
+msgstr ""
+
+#: templates/misago/thread/stats.html:20
+#: templates/misago/threadslist/thread.html:30
+msgid "Pinned locally"
+msgstr ""
+
+#: templates/misago/thread/stats.html:30
+#: templates/misago/thread/toolbar-top.html:14
+#: templates/misago/threadslist/tabs.html:33
+#: templates/misago/threadslist/thread.html:40
+msgid "Unapproved"
+msgstr ""
+
+#: templates/misago/thread/stats.html:39
+#: templates/misago/threadslist/thread.html:49
+msgid "Unapproved posts"
+msgstr ""
+
+#: templates/misago/thread/stats.html:49
+#: templates/misago/threadslist/thread.html:119
+msgid "Hidden"
+msgstr ""
+
+#: templates/misago/thread/stats.html:59
+#: templates/misago/threadslist/thread.html:129
+msgid "Closed"
+msgstr ""
+
+#: templates/misago/thread/stats.html:68
+#: templates/misago/threadslist/thread.html:153
+#, python-format
+msgid "%(replies)s reply"
+msgid_plural "%(replies)s replies"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/thread/stats.html:83
+#, python-format
+msgid "last reply by %(user)s %(date)s"
+msgstr ""
+
+#: templates/misago/thread/thread.html:19
+#: templates/misago/thread/thread.html:30
+#, python-format
+msgid "Started by %(starter)s on %(started_on)s in the %(category)s category."
+msgstr ""
+
+#: templates/misago/thread/thread.html:21
+#: templates/misago/thread/thread.html:32
+#, python-format
+msgid "%(replies)s reply, last one from %(last_post_on)s."
+msgid_plural "%(replies)s replies, last one from %(last_post_on)s."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/thread/thread.html:25
+#: templates/misago/thread/thread.html:36
+msgid "Answered."
+msgstr ""
+
+#: templates/misago/thread/thread.html:25
+#: templates/misago/thread/thread.html:36
+msgid "Closed."
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:6
+msgid "Go to first new post"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:13
+msgid "Go to first unapproved post"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:19
+msgid "Go to last post"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:25
+msgid "Go to best answers"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:26
+msgid "Best answer"
+msgstr ""
+
+#: templates/misago/threadslist/base.html:57
+msgid "There are no threads in this category."
+msgstr ""
+
+#: templates/misago/threadslist/base.html:59
+msgid "There are no threads on this forum... yet!"
+msgstr ""
+
+#: templates/misago/threadslist/base.html:63
+#: templates/misago/threadslist/private_threads.html:61
+msgid "Why not start one yourself?"
+msgstr ""
+
+#: templates/misago/threadslist/base.html:67
+#: templates/misago/threadslist/private_threads.html:64
+msgid "No threads matching specified criteria were found."
+msgstr ""
+
+#: templates/misago/threadslist/base.html:82
+msgid "Next page"
+msgstr ""
+
+#: templates/misago/threadslist/private_threads.html:42
+msgid ""
+"Private threads are threads which only those that started them and those "
+"they have invited may see and participate in."
+msgstr ""
+
+#: templates/misago/threadslist/private_threads.html:58
+msgid "You aren't participating in any private threads."
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:7 threads/admin/forms.py:27
+msgid "All"
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:12
+msgid "My"
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:22
+msgid "Unread"
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:27
+msgid "Subscribed"
+msgstr ""
+
+#: templates/misago/threadslist/thread.html:11
+msgid "New posts"
+msgstr ""
+
+#: templates/misago/threadslist/thread.html:59
+msgid "Answered"
+msgstr ""
+
+#: templates/misago/threadslist/thread.html:139
+msgid "Poll"
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:5
+#: templates/misago/userslists/active_posters.html:23
+#: templates/misago/userslists/active_posters.html:24 users/apps.py:72
+msgid "Top posters"
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:10
+#, python-format
+msgid "%(posters)s most active poster from last %(days)s days."
+msgid_plural "%(posters)s most active posters from last %(days)s days."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/userslists/active_posters.html:16
+#: templates/misago/userslists/active_posters.html:35
+#: templates/misago/userslists/active_posters.html:50
+#: templates/misago/userslists/active_posters.html:145
+#, python-format
+msgid "No users have posted any new messages during last %(days)s days."
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:29
+#: templates/misago/userslists/active_posters.html:44
+#: templates/misago/userslists/active_posters.html:69
+#, python-format
+msgid "%(posters)s top poster from last %(days)s days."
+msgid_plural "%(posters)s top posters from last %(days)s days."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/userslists/active_posters.html:116
+#: templates/misago/userslists/active_posters.html:128
+msgid "Ranked posts"
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:133
+msgid "Total posts"
+msgstr ""
+
+#: templates/misago/userslists/rank.html:9
+#: templates/misago/userslists/rank.html:41
+#: templates/misago/userslists/rank.html:52
+#, python-format
+msgid "%(users)s user have this rank."
+msgid_plural "%(users)s users have this rank."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/userslists/rank.html:130
+msgid "There are no users with this rank at the moment."
+msgstr ""
+
+#: templates/misago/userslists/usercard.html:42
+#: templates/misago/userslists/usercard.html:45
+#, python-format
+msgid "Joined on %(joined_on)s"
+msgstr ""
+
+#: templates/misago/userslists/usercard.html:66
+#, python-format
+msgid "%(followers)s follower"
+msgid_plural "%(followers)s followers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: themes/admin/__init__.py:94
+msgid "Themes"
+msgstr ""
+
+#: themes/admin/forms.py:20
+msgid "No parent"
+msgstr ""
+
+#: themes/admin/forms.py:27 themes/admin/forms.py:58
+msgid "Parent"
+msgstr ""
+
+#: themes/admin/forms.py:28
+msgid "Version"
+msgstr ""
+
+#: themes/admin/forms.py:29
+msgid "Author(s)"
+msgstr ""
+
+#: themes/admin/forms.py:30
+msgid "Url"
+msgstr ""
+
+#: themes/admin/forms.py:54
+msgid "Leave this field empty to use theme name from imported file."
+msgstr ""
+
+#: themes/admin/forms.py:60
+msgid "Theme file"
+msgstr ""
+
+#: themes/admin/forms.py:60
+msgid "Theme file should be a ZIP file."
+msgstr ""
+
+#: themes/admin/forms.py:65
+msgid "Uploaded file is not a valid ZIP file."
+msgstr ""
+
+#: themes/admin/forms.py:110
+msgid "No files have been uploaded."
+msgstr ""
+
+#: themes/admin/forms.py:137
+#, python-format
+msgid "File \"%(file)s\" content type \"%(content_type)s\" is not allowed."
+msgstr ""
+
+#: themes/admin/forms.py:149
+#, python-format
+msgid "File \"%(file)s\" extension is invalid."
+msgstr ""
+
+#: themes/admin/forms.py:176
+msgid ""
+"Should be an correct filename and include the .css extension. It will be "
+"lowercased."
+msgstr ""
+
+#: themes/admin/forms.py:194
+msgid "You need to enter CSS for this file."
+msgstr ""
+
+#: themes/admin/forms.py:221
+msgid "Link name"
+msgstr ""
+
+#: themes/admin/forms.py:222
+msgid "Can be descriptive (e.g. \"roboto from fonts.google.com\")."
+msgstr ""
+
+#: themes/admin/forms.py:224
+msgid "Remote CSS URL"
+msgstr ""
+
+#: themes/admin/importer.py:21
+msgid ""
+"\"manifest.json\" contained by ZIP file is not a valid theme manifest file."
+msgstr ""
+
+#: themes/admin/importer.py:61
+msgid "Uploaded ZIP file could not be extracted."
+msgstr ""
+
+#: themes/admin/importer.py:67
+msgid "Uploaded ZIP file is empty."
+msgstr ""
+
+#: themes/admin/importer.py:69
+msgid "Uploaded ZIP file should contain single directory."
+msgstr ""
+
+#: themes/admin/importer.py:71
+msgid "Uploaded ZIP file didn't contain a directory."
+msgstr ""
+
+#: themes/admin/importer.py:85
+msgid "Uploaded ZIP file didn't contain a \"manifest.json\"."
+msgstr ""
+
+#: themes/admin/importer.py:89
+msgid "\"manifest.json\" contained by ZIP file is not a valid JSON file."
+msgstr ""
+
+#: themes/admin/validators.py:12
+msgid "Name is missing an .css extension."
+msgstr ""
+
+#: themes/admin/validators.py:15
+msgid "Name can't start with period (\".\")."
+msgstr ""
+
+#: themes/admin/validators.py:20
+msgid ""
+"Name can contain only latin alphabet characters, digits, dots, underscores "
+"and dashes."
+msgstr ""
+
+#: themes/admin/validators.py:27
+msgid "Name has to contain at least one latin alphabet character or digit."
+msgstr ""
+
+#: themes/admin/validators.py:36
+msgid "This name is already in use by other asset."
+msgstr ""
+
+#: themes/admin/views.py:28
+msgid "Requested theme does not exist."
+msgstr ""
+
+#: themes/admin/views.py:36
+#, python-format
+msgid "New theme \"%(name)s\" has been saved."
+msgstr ""
+
+#: themes/admin/views.py:51
+#, python-format
+msgid "Theme \"%(name)s\" has been updated."
+msgstr ""
+
+#: themes/admin/views.py:55
+msgid "Default theme can't be edited."
+msgstr ""
+
+#: themes/admin/views.py:64
+#, python-format
+msgid "Theme \"%(name)s\" has been deleted."
+msgstr ""
+
+#: themes/admin/views.py:68
+msgid "Default theme can't be deleted."
+msgstr ""
+
+#: themes/admin/views.py:70
+msgid "Active theme can't be deleted."
+msgstr ""
+
+#: themes/admin/views.py:73
+#, python-format
+msgid ""
+"Theme \"%(name)s\" can't be deleted because one of its child themes is set "
+"as active."
+msgstr ""
+
+#: themes/admin/views.py:90
+#, python-format
+msgid "Active theme has been changed to \"%(name)s\"."
+msgstr ""
+
+#: themes/admin/views.py:103
+msgid "Default theme can't be exported."
+msgstr ""
+
+#: themes/admin/views.py:123
+#, python-format
+msgid "Theme \"%(name)s\" has been imported."
+msgstr ""
+
+#: themes/admin/views.py:130
+msgid "Default theme assets can't be edited."
+msgstr ""
+
+#: themes/admin/views.py:158
+msgid "Some css files could not have been added to the theme."
+msgstr ""
+
+#: themes/admin/views.py:182
+msgid "New CSS files have been added to the theme."
+msgstr ""
+
+#: themes/admin/views.py:187
+msgid "New media files have been added to the theme."
+msgstr ""
+
+#: themes/admin/views.py:218
+msgid "Selected CSS files have been deleted."
+msgstr ""
+
+#: themes/admin/views.py:227
+msgid "Selected media have been deleted."
+msgstr ""
+
+#: themes/admin/views.py:247
+msgid "Requested CSS could not be found in the theme."
+msgstr ""
+
+#: themes/admin/views.py:273
+#, python-format
+msgid "\"%s\" was moved up."
+msgstr ""
+
+#: themes/admin/views.py:282
+#, python-format
+msgid "\"%s\" was moved down."
+msgstr ""
+
+#: themes/admin/views.py:324
+#, python-format
+msgid "New CSS \"%(name)s\" has been saved."
+msgstr ""
+
+#: themes/admin/views.py:341
+#, python-format
+msgid "CSS \"%(name)s\" has been updated."
+msgstr ""
+
+#: themes/admin/views.py:364
+#, python-format
+msgid "No changes have been made to \"%(css)s\"."
+msgstr ""
+
+#: themes/admin/views.py:369
+#, python-format
+msgid "New CSS link \"%(name)s\" has been saved."
+msgstr ""
+
+#: themes/admin/views.py:392
+#, python-format
+msgid "CSS link \"%(name)s\" has been updated."
+msgstr ""
+
+#: themes/models.py:40
+msgid "Default Misago Theme"
+msgstr ""
+
+#: threads/admin/__init__.py:43
+msgid "Attachment types"
+msgstr ""
+
+#: threads/admin/__init__.py:44
+msgid "Specify what files may be uploaded on the forum."
+msgstr ""
+
+#: threads/admin/forms.py:14
+msgid "Uploader name contains"
+msgstr ""
+
+#: threads/admin/forms.py:15
+msgid "Filename contains"
+msgstr ""
+
+#: threads/admin/forms.py:17
+msgid "File type"
+msgstr ""
+
+#: threads/admin/forms.py:24 users/admin/forms.py:585
+msgid "State"
+msgstr ""
+
+#: threads/admin/forms.py:28
+msgid "Only orphaned"
+msgstr ""
+
+#: threads/admin/forms.py:29
+msgid "Not orphaned"
+msgstr ""
+
+#: threads/admin/forms.py:54
+msgid "Type name"
+msgstr ""
+
+#: threads/admin/forms.py:55
+msgid "File extensions"
+msgstr ""
+
+#: threads/admin/forms.py:57
+msgid "Maximum allowed uploaded file size"
+msgstr ""
+
+#: threads/admin/forms.py:59
+msgid "Limit uploads to"
+msgstr ""
+
+#: threads/admin/forms.py:60
+msgid "Limit downloads to"
+msgstr ""
+
+#: threads/admin/forms.py:64
+msgid ""
+"List of comma separated file extensions associated with this attachment type."
+msgstr ""
+
+#: threads/admin/forms.py:68
+msgid ""
+"Optional list of comma separated mime types associated with this attachment "
+"type."
+msgstr ""
+
+#: threads/admin/forms.py:72
+msgid ""
+"Maximum allowed uploaded file size for this type, in kb. May be overriden "
+"via user permission."
+msgstr ""
+
+#: threads/admin/forms.py:75
+msgid "Controls this attachment type availability on your site."
+msgstr ""
+
+#: threads/admin/forms.py:77
+msgid ""
+"If you wish to limit option to upload files of this type to users with "
+"specific roles, select them on this list. Otherwhise don't select any roles "
+"to allow all users with permission to upload attachments to be able to "
+"upload attachments of this type."
+msgstr ""
+
+#: threads/admin/forms.py:83
+msgid ""
+"If you wish to limit option to download files of this type to users with "
+"specific roles, select them on this list. Otherwhise don't select any roles "
+"to allow all users with permission to download attachments to be able to "
+"download attachments of this type."
+msgstr ""
+
+#: threads/admin/views/attachments.py:14
+msgid "Requested attachment could not be found."
+msgstr ""
+
+#: threads/admin/views/attachments.py:28 users/admin/views/bans.py:26
+#: users/admin/views/users.py:65
+msgid "A to z"
+msgstr ""
+
+#: threads/admin/views/attachments.py:29 users/admin/views/bans.py:27
+#: users/admin/views/users.py:66
+msgid "Z to a"
+msgstr ""
+
+#: threads/admin/views/attachments.py:30
+msgid "Smallest files"
+msgstr ""
+
+#: threads/admin/views/attachments.py:31
+msgid "Largest files"
+msgstr ""
+
+#: threads/admin/views/attachments.py:33
+msgid "With attachments: 0"
+msgstr ""
+
+#: threads/admin/views/attachments.py:34
+msgid "Select attachments"
+msgstr ""
+
+#: threads/admin/views/attachments.py:38
+msgid "Delete attachments"
+msgstr ""
+
+#: threads/admin/views/attachments.py:39
+msgid "Are you sure you want to delete selected attachments?"
+msgstr ""
+
+#: threads/admin/views/attachments.py:62
+msgid "Selected attachments have been deleted."
+msgstr ""
+
+#: threads/admin/views/attachments.py:83
+#, python-format
+msgid "Attachment \"%(filename)s\" has been deleted."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:15
+msgid "Requested attachment type could not be found."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:36
+#, python-format
+msgid "New type \"%(name)s\" has been saved."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:40
+#, python-format
+msgid "Attachment type \"%(name)s\" has been edited."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:47
+#, python-format
+msgid ""
+"Attachment type \"%(name)s\" has associated attachments and can't be deleted."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:54
+#, python-format
+msgid "Attachment type \"%(name)s\" has been deleted."
+msgstr ""
+
+#: threads/api/attachments.py:18
+msgid "You don't have permission to upload new files."
+msgstr ""
+
+#: threads/api/attachments.py:28
+msgid "No file has been uploaded."
+msgstr ""
+
+#: threads/api/attachments.py:48
+msgid "Uploaded image was corrupted or invalid."
+msgstr ""
+
+#: threads/api/attachments.py:86
+msgid "You can't upload files of this type."
+msgstr ""
+
+#: threads/api/attachments.py:92
+#, python-format
+msgid ""
+"You can't upload files larger than %(limit)s (your file has %(upload)s)."
+msgstr ""
+
+#: threads/api/attachments.py:104
+#, python-format
+msgid ""
+"You can't upload files of this type larger than %(limit)s (your file has "
+"%(upload)s)."
+msgstr ""
+
+#: threads/api/postendpoints/edits.py:87
+msgid "Edits record is unavailable for this post."
+msgstr ""
+
+#: threads/api/postendpoints/merge.py:11
+msgid "You can't merge posts in this thread."
+msgstr ""
+
+#: threads/api/postendpoints/move.py:10
+msgid "You can't move posts in this thread."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:36
+msgid "You can't like posts in this category."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:99
+#: threads/api/threadendpoints/patch.py:147
+msgid "Content approval can't be reversed."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:180
+msgid "One or more posts to update could not be found."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:198
+#, python-format
+msgid "No more than %(limit)s post can be updated at a single time."
+msgid_plural "No more than %(limit)s posts can be updated at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/postendpoints/split.py:12
+msgid "You can't split posts from this thread."
+msgstr ""
+
+#: threads/api/postingendpoint/attachments.py:63
+#, python-format
+msgid "You don't have permission to remove \"%(attachment)s\" attachment."
+msgstr ""
+
+#: threads/api/postingendpoint/attachments.py:132
+#, python-format
+msgid ""
+"You can't attach more than %(limit_value)s file to single post (added "
+"%(show_value)s)."
+msgid_plural ""
+"You can't attach more than %(limit_value)s flies to single post (added "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/postingendpoint/category.py:45
+msgid "You have to select category to post thread in."
+msgstr ""
+
+#: threads/api/postingendpoint/category.py:46
+#: threads/api/postingendpoint/category.py:65
+msgid "Selected category is invalid."
+msgstr ""
+
+#: threads/api/postingendpoint/category.py:71
+msgid ""
+"Selected category doesn't exist or you don't have permission to browse it."
+msgstr ""
+
+#: threads/api/postingendpoint/emailnotification.py:43
+#, python-format
+msgid "%(user)s has replied to your thread \"%(thread)s\""
+msgstr ""
+
+#: threads/api/postingendpoint/emailnotification.py:46
+#, python-format
+msgid "%(user)s has replied to thread \"%(thread)s\" that you are watching"
+msgstr ""
+
+#: threads/api/postingendpoint/floodprotection.py:25
+msgid "You can't post message so quickly after previous one."
+msgstr ""
+
+#: threads/api/postingendpoint/floodprotection.py:35
+msgid "Your account has exceed an hourly post limit."
+msgstr ""
+
+#: threads/api/postingendpoint/floodprotection.py:41
+msgid "Your account has exceed a daily post limit."
+msgstr ""
+
+#: threads/api/postingendpoint/participants.py:52
+msgid ""
+"You can't include yourself on the list of users to invite to new thread."
+msgstr ""
+
+#: threads/api/postingendpoint/participants.py:61
+msgid "You have to enter user names."
+msgstr ""
+
+#: threads/api/postingendpoint/participants.py:67
+#, python-format
+msgid ""
+"You can't add more than %(users)s user to private thread (you've added "
+"%(added)s)."
+msgid_plural ""
+"You can't add more than %(users)s users to private thread (you've added "
+"%(added)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/postingendpoint/participants.py:93
+#, python-format
+msgid "One or more users could not be found: %(usernames)s"
+msgstr ""
+
+#: threads/api/postingendpoint/reply.py:81 threads/validators.py:77
+msgid "You have to enter a message."
+msgstr ""
+
+#: threads/api/postingendpoint/reply.py:106
+msgid "You have to enter thread title."
+msgstr ""
+
+#: threads/api/threadendpoints/editor.py:14
+msgid "You need to be signed in to start threads."
+msgstr ""
+
+#: threads/api/threadendpoints/editor.py:60
+msgid ""
+"No categories that allow new threads are available to you at the moment."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:65
+msgid "Not a valid string."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:86
+msgid "You can't change globally pinned threads weights in this category."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:94
+msgid "You can't pin threads globally in this category."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:122
+msgid "You can't move thread to the category it's already in."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:170
+msgid "You don't have permission to close this thread."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:172
+msgid "You don't have permission to open this thread."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:225
+#: threads/api/threadendpoints/patch.py:264
+#: threads/api/threadendpoints/patch.py:327
+#: threads/api/threadendpoints/patch.py:355
+msgid "A valid integer is required."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:238
+msgid "This post is already marked as thread's best answer."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:273
+msgid ""
+"This post can't be unmarked because it's not currently marked as best answer."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:301
+msgid "You have to enter new participant's username."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:304
+msgid "No user with such name exists."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:307
+msgid "This user is already thread participant."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:333
+#: threads/api/threadendpoints/patch.py:364
+msgid "Participant doesn't exist."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:360
+msgid "This user already is thread owner."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:479
+msgid "One or more threads to update could not be found."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:496
+#, python-format
+msgid "No more than %(limit)s thread can be updated at a single time."
+msgid_plural "No more than %(limit)s threads can be updated at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/threadpoll.py:60
+msgid "There's already a poll in this thread."
+msgstr ""
+
+#: threads/api/threadposts.py:210
+msgid "You can't reply to events."
+msgstr ""
+
+#: threads/api/threadposts.py:212
+msgid "You can't reply to hidden posts."
+msgstr ""
+
+#: threads/api/threadposts.py:245
+msgid "You can't see who liked this post."
+msgstr ""
+
+#: threads/api/threads.py:120
+msgid "You can't start private threads."
+msgstr ""
+
+#: threads/mergeconflict.py:56
+msgid "Unmark all best answers"
+msgstr ""
+
+#: threads/mergeconflict.py:75
+msgid "Delete all polls"
+msgstr ""
+
+#: threads/mergeconflict.py:126 threads/serializers/moderation.py:475
+#: threads/serializers/moderation.py:478 threads/serializers/moderation.py:545
+#: threads/serializers/moderation.py:548
+msgid "Invalid choice."
+msgstr ""
+
+#: threads/models/attachmenttype.py:17
+msgid "Allow uploads and downloads"
+msgstr ""
+
+#: threads/models/attachmenttype.py:18
+msgid "Allow downloads only"
+msgstr ""
+
+#: threads/models/attachmenttype.py:19
+msgid "Disallow both uploading and downloading"
+msgstr ""
+
+#: threads/models/thread.py:17
+msgid "Don't pin thread"
+msgstr ""
+
+#: threads/models/thread.py:18
+msgid "Pin thread within category"
+msgstr ""
+
+#: threads/models/thread.py:19
+msgid "Pin thread globally"
+msgstr ""
+
+#: threads/moderation/posts.py:53
+msgid "You can't make original post visible without revealing thread."
+msgstr ""
+
+#: threads/moderation/posts.py:66
+msgid "You can't hide original post without hiding thread."
+msgstr ""
+
+#: threads/moderation/posts.py:92
+msgid "You can't delete original post without deleting thread."
+msgstr ""
+
+#: threads/participants.py:142
+#, python-format
+msgid ""
+"%(user)s has invited you to participate in private thread \"%(thread)s\""
+msgstr ""
+
+#: threads/permissions/attachments.py:14
+msgid "Max attached file size (in kb)"
+msgstr ""
+
+#: threads/permissions/attachments.py:15
+msgid "Enter 0 to don't allow uploading end deleting attachments."
+msgstr ""
+
+#: threads/permissions/attachments.py:21
+msgid "Can download other users attachments"
+msgstr ""
+
+#: threads/permissions/attachments.py:24
+msgid "Can delete other users attachments"
+msgstr ""
+
+#: threads/permissions/attachments.py:32
+msgid "Can download attachments"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:28
+msgid "Best answers"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:31
+msgid "Can mark posts as best answers"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:34 threads/permissions/bestanswers.py:40
+#: threads/permissions/polls.py:34 threads/permissions/threads.py:120
+msgid "Own threads"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:34 threads/permissions/bestanswers.py:40
+#: threads/permissions/polls.py:34 threads/permissions/threads.py:110
+#: threads/permissions/threads.py:120
+msgid "All threads"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:37
+msgid "Can change marked answers"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:44
+msgid "Time limit for changing marked best answer in owned thread, in minutes"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:47
+msgid ""
+"Enter 0 to don't limit time for changing marked best answer in owned thread."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:134
+#: threads/permissions/bestanswers.py:293
+msgid "You have to sign in to mark best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:141
+#: threads/permissions/bestanswers.py:303
+#, python-format
+msgid ""
+"You don't have permission to mark best answers in the \"%(category)s\" "
+"category."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:153
+#: threads/permissions/bestanswers.py:315
+msgid ""
+"You don't have permission to mark best answer in this thread because you "
+"didn't start it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:162
+#, python-format
+msgid ""
+"You don't have permission to mark best answer in this thread because its "
+"category \"%(category)s\" is closed."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:170
+msgid ""
+"You can't mark best answer in this thread because it's closed and you don't "
+"have permission to open it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:188
+#, python-format
+msgid ""
+"You don't have permission to change this thread's marked answer because it's "
+"in the \"%(category)s\" category."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:198
+msgid ""
+"You don't have permission to change this thread's marked answer because you "
+"are not a thread starter."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:205
+#, python-format
+msgid ""
+"You don't have permission to change best answer that was marked for more "
+"than %(minutes)s minute."
+msgid_plural ""
+"You don't have permission to change best answer that was marked for more "
+"than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/bestanswers.py:216
+msgid ""
+"You don't have permission to change this thread's best answer because a "
+"moderator has protected it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:227
+msgid "You have to sign in to unmark best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:237
+#, python-format
+msgid ""
+"You don't have permission to unmark threads answers in the \"%(category)s\" "
+"category."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:247
+msgid ""
+"You don't have permission to unmark this best answer because you are not a "
+"thread starter."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:254
+#, python-format
+msgid ""
+"You don't have permission to unmark best answer that was marked for more "
+"than %(minutes)s minute."
+msgid_plural ""
+"You don't have permission to unmark best answer that was marked for more "
+"than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/bestanswers.py:266
+#, python-format
+msgid ""
+"You don't have permission to unmark this best answer because its category "
+"\"%(category)s\" is closed."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:274
+msgid ""
+"You can't unmark this thread's best answer because it's closed and you don't "
+"have permission to open it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:282
+msgid ""
+"You don't have permission to unmark this thread's best answer because a "
+"moderator has protected it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:296
+msgid "Events can't be marked as best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:322
+msgid "First post in a thread can't be marked as best answer."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:326
+msgid "Hidden posts can't be marked as best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:329
+msgid "Unapproved posts can't be marked as best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:334
+msgid ""
+"You don't have permission to mark this post as best answer because a "
+"moderator has protected it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:346
+msgid "You can't hide this post because its marked as best answer."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:356
+msgid "You can't delete this post because its marked as best answer."
+msgstr ""
+
+#: threads/permissions/polls.py:28
+msgid "Polls"
+msgstr ""
+
+#: threads/permissions/polls.py:31
+msgid "Can start polls"
+msgstr ""
+
+#: threads/permissions/polls.py:37
+msgid "Can edit polls"
+msgstr ""
+
+#: threads/permissions/polls.py:40 threads/permissions/polls.py:46
+msgid "Own polls"
+msgstr ""
+
+#: threads/permissions/polls.py:40 threads/permissions/polls.py:46
+msgid "All polls"
+msgstr ""
+
+#: threads/permissions/polls.py:43
+msgid "Can delete polls"
+msgstr ""
+
+#: threads/permissions/polls.py:49
+msgid "Time limit for own polls edits, in minutes"
+msgstr ""
+
+#: threads/permissions/polls.py:50
+msgid "Enter 0 to don't limit time for editing own polls."
+msgstr ""
+
+#: threads/permissions/polls.py:55
+msgid "Can always see polls voters"
+msgstr ""
+
+#: threads/permissions/polls.py:57
+msgid "Allows users to see who voted in poll even if poll votes are secret."
+msgstr ""
+
+#: threads/permissions/polls.py:112
+msgid "You have to sign in to start polls."
+msgstr ""
+
+#: threads/permissions/polls.py:119
+msgid "You can't start polls."
+msgstr ""
+
+#: threads/permissions/polls.py:121
+msgid "You can't start polls in other users threads."
+msgstr ""
+
+#: threads/permissions/polls.py:126
+msgid "This category is closed. You can't start polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:130
+msgid "This thread is closed. You can't start polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:139
+msgid "You have to sign in to edit polls."
+msgstr ""
+
+#: threads/permissions/polls.py:146
+msgid "You can't edit polls."
+msgstr ""
+
+#: threads/permissions/polls.py:151
+msgid "You can't edit other users polls in this category."
+msgstr ""
+
+#: threads/permissions/polls.py:155
+#, python-format
+msgid "You can't edit polls that are older than %(minutes)s minute."
+msgid_plural "You can't edit polls that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/polls.py:162
+msgid "This poll is over. You can't edit it."
+msgstr ""
+
+#: threads/permissions/polls.py:167
+msgid "This category is closed. You can't edit polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:171
+msgid "This thread is closed. You can't edit polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:180
+msgid "You have to sign in to delete polls."
+msgstr ""
+
+#: threads/permissions/polls.py:187
+msgid "You can't delete polls."
+msgstr ""
+
+#: threads/permissions/polls.py:192
+msgid "You can't delete other users polls in this category."
+msgstr ""
+
+#: threads/permissions/polls.py:196
+#, python-format
+msgid "You can't delete polls that are older than %(minutes)s minute."
+msgid_plural "You can't delete polls that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/polls.py:202
+msgid "This poll is over. You can't delete it."
+msgstr ""
+
+#: threads/permissions/polls.py:207
+msgid "This category is closed. You can't delete polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:211
+msgid "This thread is closed. You can't delete polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:220
+msgid "You have to sign in to vote in polls."
+msgstr ""
+
+#: threads/permissions/polls.py:223
+msgid "You have already voted in this poll."
+msgstr ""
+
+#: threads/permissions/polls.py:225
+msgid "This poll is over. You can't vote in it."
+msgstr ""
+
+#: threads/permissions/polls.py:233
+msgid "This category is closed. You can't vote in it."
+msgstr ""
+
+#: threads/permissions/polls.py:235
+msgid "This thread is closed. You can't vote in it."
+msgstr ""
+
+#: threads/permissions/polls.py:243
+msgid "You dont have permission to this poll's voters."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:35
+msgid "Can use private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:36
+msgid "Can start private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:38
+msgid "Max number of users invited to private thread"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:39
+msgid "Enter 0 to don't limit number of participants."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:44
+msgid "Can add everyone to threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:46
+msgid "Allows user to add users that are blocking them to private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:50
+msgid "Can report private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:52
+msgid ""
+"Allows user to report private threads they are participating in, making them "
+"accessible to moderators."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:57
+msgid "Can moderate private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:59
+msgid ""
+"Allows user to read, reply, edit and delete content in reported private "
+"threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:179
+msgid "You have to sign in to use private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:181
+msgid "You can't use private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:210
+msgid "Only thread owner and moderators can change threads owners."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:214
+msgid "Only moderators can change closed threads owners."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:226
+msgid "You have to be thread owner to add new participants to it."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:231
+msgid "Only moderators can add participants to closed threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:238
+msgid "You can't add any more new users to this thread."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:253
+msgid "Only moderators can remove participants from closed threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:258
+msgid "You have to be thread owner to remove participants from it."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:270
+#, python-format
+msgid "%(user)s can't participate in private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:277
+#, python-format
+msgid "%(user)s is blocking you."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:281
+#, python-format
+msgid "%(user)s is not allowing invitations to private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:288
+#, python-format
+msgid "%(user)s limits invitations to private threads to followed users."
+msgstr ""
+
+#: threads/permissions/threads.py:76
+msgid "Can see unapproved content list"
+msgstr ""
+
+#: threads/permissions/threads.py:78
+msgid ""
+"Allows access to \"unapproved\" tab on threads lists for easy listing of "
+"threads that are unapproved or contain unapproved posts. Despite the tab "
+"being available on all threads lists, it will only display threads belonging "
+"to categories in which the user has permission to approve content."
+msgstr ""
+
+#: threads/permissions/threads.py:87
+msgid "Can see reported content list"
+msgstr ""
+
+#: threads/permissions/threads.py:89
+msgid ""
+"Allows access to \"reported\" tab on threads lists for easy listing of "
+"threads that contain reported posts. Despite the tab being available on all "
+"categories threads lists, it will only display threads belonging to "
+"categories in which the user has permission to see posts reports."
+msgstr ""
+
+#: threads/permissions/threads.py:98
+msgid "Can omit flood protection"
+msgstr ""
+
+#: threads/permissions/threads.py:99
+msgid "Allows posting more frequently than flood protection would."
+msgstr ""
+
+#: threads/permissions/threads.py:107
+msgid "Can see threads"
+msgstr ""
+
+#: threads/permissions/threads.py:113
+msgid "Can start threads"
+msgstr ""
+
+#: threads/permissions/threads.py:114
+msgid "Can reply to threads"
+msgstr ""
+
+#: threads/permissions/threads.py:117
+msgid "Can edit threads"
+msgstr ""
+
+#: threads/permissions/threads.py:123
+msgid "Can hide own threads"
+msgstr ""
+
+#: threads/permissions/threads.py:125
+msgid ""
+"Only threads started within time limit and with no replies can be hidden."
+msgstr ""
+
+#: threads/permissions/threads.py:130 threads/permissions/threads.py:142
+msgid "Hide threads"
+msgstr ""
+
+#: threads/permissions/threads.py:130 threads/permissions/threads.py:142
+msgid "Delete threads"
+msgstr ""
+
+#: threads/permissions/threads.py:133
+msgid "Time limit for own threads edits, in minutes"
+msgstr ""
+
+#: threads/permissions/threads.py:134
+msgid "Enter 0 to don't limit time for editing own threads."
+msgstr ""
+
+#: threads/permissions/threads.py:139
+msgid "Can hide all threads"
+msgstr ""
+
+#: threads/permissions/threads.py:146
+msgid "Can pin threads"
+msgstr ""
+
+#: threads/permissions/threads.py:149
+msgid "Locally"
+msgstr ""
+
+#: threads/permissions/threads.py:149
+msgid "Globally"
+msgstr ""
+
+#: threads/permissions/threads.py:151
+msgid "Can close threads"
+msgstr ""
+
+#: threads/permissions/threads.py:152
+msgid "Can move threads"
+msgstr ""
+
+#: threads/permissions/threads.py:153
+msgid "Can merge threads"
+msgstr ""
+
+#: threads/permissions/threads.py:156
+msgid "Can edit posts"
+msgstr ""
+
+#: threads/permissions/threads.py:159
+msgid "Own posts"
+msgstr ""
+
+#: threads/permissions/threads.py:159
+msgid "All posts"
+msgstr ""
+
+#: threads/permissions/threads.py:162
+msgid "Can hide own posts"
+msgstr ""
+
+#: threads/permissions/threads.py:164
+msgid "Only last posts to thread made within edit time limit can be hidden."
+msgstr ""
+
+#: threads/permissions/threads.py:168 threads/permissions/threads.py:180
+msgid "Hide posts"
+msgstr ""
+
+#: threads/permissions/threads.py:168 threads/permissions/threads.py:180
+msgid "Delete posts"
+msgstr ""
+
+#: threads/permissions/threads.py:171
+msgid "Time limit for own post edits, in minutes"
+msgstr ""
+
+#: threads/permissions/threads.py:172
+msgid "Enter 0 to don't limit time for editing own posts."
+msgstr ""
+
+#: threads/permissions/threads.py:177
+msgid "Can hide all posts"
+msgstr ""
+
+#: threads/permissions/threads.py:184
+msgid "Can see posts likes"
+msgstr ""
+
+#: threads/permissions/threads.py:189
+msgid "Number only"
+msgstr ""
+
+#: threads/permissions/threads.py:190
+msgid "Number and list of likers"
+msgstr ""
+
+#: threads/permissions/threads.py:194
+msgid "Can like posts"
+msgstr ""
+
+#: threads/permissions/threads.py:195
+msgid "Only users with this permission to see likes can like posts."
+msgstr ""
+
+#: threads/permissions/threads.py:199
+msgid "Can protect posts"
+msgstr ""
+
+#: threads/permissions/threads.py:200
+msgid "Only users with this permission can edit protected posts."
+msgstr ""
+
+#: threads/permissions/threads.py:203
+msgid "Can move posts"
+msgstr ""
+
+#: threads/permissions/threads.py:204
+msgid "Will be able to move posts to other threads."
+msgstr ""
+
+#: threads/permissions/threads.py:206
+msgid "Can merge posts"
+msgstr ""
+
+#: threads/permissions/threads.py:208
+msgid "Can approve content"
+msgstr ""
+
+#: threads/permissions/threads.py:209
+msgid "Will be able to see and approve unapproved content."
+msgstr ""
+
+#: threads/permissions/threads.py:211
+msgid "Can report posts"
+msgstr ""
+
+#: threads/permissions/threads.py:212
+msgid "Can see reports"
+msgstr ""
+
+#: threads/permissions/threads.py:215
+msgid "Can hide events"
+msgstr ""
+
+#: threads/permissions/threads.py:218
+msgid "Hide events"
+msgstr ""
+
+#: threads/permissions/threads.py:218
+msgid "Delete events"
+msgstr ""
+
+#: threads/permissions/threads.py:221
+msgid "Require threads approval"
+msgstr ""
+
+#: threads/permissions/threads.py:222
+msgid "Require replies approval"
+msgstr ""
+
+#: threads/permissions/threads.py:223
+msgid "Require edits approval"
+msgstr ""
+
+#: threads/permissions/threads.py:539
+msgid "You have to sign in to start threads."
+msgstr ""
+
+#: threads/permissions/threads.py:545
+msgid "You don't have permission to start new threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:550
+msgid "This category is closed. You can't start new threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:559
+msgid "You have to sign in to reply threads."
+msgstr ""
+
+#: threads/permissions/threads.py:566
+msgid "You can't reply to threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:571
+msgid "This category is closed. You can't reply to threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:575
+msgid "You can't reply to closed threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:584
+msgid "You have to sign in to edit threads."
+msgstr ""
+
+#: threads/permissions/threads.py:591
+msgid "You can't edit threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:596
+msgid "You can't edit other users threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:601
+#, python-format
+msgid "You can't edit threads that are older than %(minutes)s minute."
+msgid_plural "You can't edit threads that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:612
+msgid "This category is closed. You can't edit threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:615
+msgid "This thread is closed. You can't edit it."
+msgstr ""
+
+#: threads/permissions/threads.py:623
+msgid "You have to sign in to change threads weights."
+msgstr ""
+
+#: threads/permissions/threads.py:630
+msgid "You can't change threads weights in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:635
+msgid "This category is closed. You can't change threads weights in it."
+msgstr ""
+
+#: threads/permissions/threads.py:639
+msgid "This thread is closed. You can't change its weight."
+msgstr ""
+
+#: threads/permissions/threads.py:648 threads/permissions/threads.py:668
+msgid "You have to sign in to hide threads."
+msgstr ""
+
+#: threads/permissions/threads.py:657
+msgid "This category is closed. You can't reveal threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:660
+msgid "This thread is closed. You can't reveal it."
+msgstr ""
+
+#: threads/permissions/threads.py:678
+msgid "You can't hide threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:683
+msgid "You can't hide other users theads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:688
+#, python-format
+msgid "You can't hide threads that are older than %(minutes)s minute."
+msgid_plural "You can't hide threads that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:699
+msgid "This category is closed. You can't hide threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:702
+msgid "This thread is closed. You can't hide it."
+msgstr ""
+
+#: threads/permissions/threads.py:710
+msgid "You have to sign in to delete threads."
+msgstr ""
+
+#: threads/permissions/threads.py:720
+msgid "You can't delete threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:728
+msgid "You can't delete other users theads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:733
+#, python-format
+msgid "You can't delete threads that are older than %(minutes)s minute."
+msgid_plural ""
+"You can't delete threads that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:744
+msgid "This category is closed. You can't delete threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:747
+msgid "This thread is closed. You can't delete it."
+msgstr ""
+
+#: threads/permissions/threads.py:755
+msgid "You have to sign in to move threads."
+msgstr ""
+
+#: threads/permissions/threads.py:762
+msgid "You can't move threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:767
+msgid "This category is closed. You can't move it's threads."
+msgstr ""
+
+#: threads/permissions/threads.py:770
+msgid "This thread is closed. You can't move it."
+msgstr ""
+
+#: threads/permissions/threads.py:778
+msgid "You have to sign in to merge threads."
+msgstr ""
+
+#: threads/permissions/threads.py:786
+msgid "Other thread can't be merged with."
+msgstr ""
+
+#: threads/permissions/threads.py:787
+msgid "You can't merge threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:793
+msgid "Other thread's category is closed. You can't merge with it."
+msgstr ""
+
+#: threads/permissions/threads.py:796
+msgid "This category is closed. You can't merge it's threads."
+msgstr ""
+
+#: threads/permissions/threads.py:801
+msgid "Other thread is closed and can't be merged with."
+msgstr ""
+
+#: threads/permissions/threads.py:804
+msgid "This thread is closed. You can't merge it with other threads."
+msgstr ""
+
+#: threads/permissions/threads.py:813
+msgid "You have to sign in to approve threads."
+msgstr ""
+
+#: threads/permissions/threads.py:820
+msgid "You can't approve threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:825
+msgid "This category is closed. You can't approve threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:828
+msgid "This thread is closed. You can't approve it."
+msgstr ""
+
+#: threads/permissions/threads.py:858
+msgid "You have to sign in to edit posts."
+msgstr ""
+
+#: threads/permissions/threads.py:861
+msgid "Events can't be edited."
+msgstr ""
+
+#: threads/permissions/threads.py:868
+msgid "You can't edit posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:875
+msgid "This post is hidden, you can't edit it."
+msgstr ""
+
+#: threads/permissions/threads.py:880
+msgid "You can't edit other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:884
+msgid "This post is protected. You can't edit it."
+msgstr ""
+
+#: threads/permissions/threads.py:888
+#, python-format
+msgid "You can't edit posts that are older than %(minutes)s minute."
+msgid_plural "You can't edit posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:899
+msgid "This category is closed. You can't edit posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:903
+msgid "This thread is closed. You can't edit posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:912
+msgid "You have to sign in to reveal posts."
+msgstr ""
+
+#: threads/permissions/threads.py:920
+msgid "You can't reveal posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:924
+msgid "You can't reveal other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:928
+msgid "This post is protected. You can't reveal it."
+msgstr ""
+
+#: threads/permissions/threads.py:932
+#, python-format
+msgid "You can't reveal posts that are older than %(minutes)s minute."
+msgid_plural "You can't reveal posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:941
+msgid "You can't reveal thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:946
+msgid "This category is closed. You can't reveal posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:950
+msgid "This thread is closed. You can't reveal posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:959
+msgid "You have to sign in to hide posts."
+msgstr ""
+
+#: threads/permissions/threads.py:967
+msgid "You can't hide posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:971
+msgid "You can't hide other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:975
+msgid "This post is protected. You can't hide it."
+msgstr ""
+
+#: threads/permissions/threads.py:979
+#, python-format
+msgid "You can't hide posts that are older than %(minutes)s minute."
+msgid_plural "You can't hide posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:988
+msgid "You can't hide thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:993
+msgid "This category is closed. You can't hide posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:997
+msgid "This thread is closed. You can't hide posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1006
+msgid "You have to sign in to delete posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1014
+msgid "You can't delete posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1018
+msgid "You can't delete other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1022
+msgid "This post is protected. You can't delete it."
+msgstr ""
+
+#: threads/permissions/threads.py:1026
+#, python-format
+msgid "You can't delete posts that are older than %(minutes)s minute."
+msgid_plural "You can't delete posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:1035
+msgid "You can't delete thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1040
+msgid "This category is closed. You can't delete posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1044
+msgid "This thread is closed. You can't delete posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1053
+msgid "You have to sign in to protect posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1060
+msgid "You can't protect posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1062
+msgid "You can't protect posts you can't edit."
+msgstr ""
+
+#: threads/permissions/threads.py:1070
+msgid "You have to sign in to approve posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1077
+msgid "You can't approve posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1079
+msgid "You can't approve thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1085
+msgid "You can't approve posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1090
+msgid "This category is closed. You can't approve posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1094
+msgid "This thread is closed. You can't approve posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1103
+msgid "You have to sign in to move posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1110
+msgid "You can't move posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1112
+msgid "Events can't be moved."
+msgstr ""
+
+#: threads/permissions/threads.py:1114
+msgid "You can't move thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1116
+msgid "You can't move posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1121
+msgid "This category is closed. You can't move posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1125
+msgid "This thread is closed. You can't move posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1134
+msgid "You have to sign in to merge posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1141
+msgid "You can't merge posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1143
+msgid "Events can't be merged."
+msgstr ""
+
+#: threads/permissions/threads.py:1149
+msgid "You can't merge posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1154
+msgid "This category is closed. You can't merge posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1158
+msgid "This thread is closed. You can't merge posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1167
+msgid "You have to sign in to split posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1174
+msgid "You can't split posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1176
+msgid "Events can't be split."
+msgstr ""
+
+#: threads/permissions/threads.py:1178
+msgid "You can't split thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1180
+msgid "You can't split posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1185
+msgid "This category is closed. You can't split posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1189
+msgid "This thread is closed. You can't split posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1198
+msgid "You have to sign in to reveal events."
+msgstr ""
+
+#: threads/permissions/threads.py:1205
+msgid "You can't reveal events in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1210
+msgid "This category is closed. You can't reveal events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1214
+msgid "This thread is closed. You can't reveal events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1223
+msgid "You have to sign in to hide events."
+msgstr ""
+
+#: threads/permissions/threads.py:1230
+msgid "You can't hide events in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1235
+msgid "This category is closed. You can't hide events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1239
+msgid "This thread is closed. You can't hide events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1248
+msgid "You have to sign in to delete events."
+msgstr ""
+
+#: threads/permissions/threads.py:1255
+msgid "You can't delete events in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1260
+msgid "This category is closed. You can't delete events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1264
+msgid "This thread is closed. You can't delete events in it."
+msgstr ""
+
+#: threads/serializers/moderation.py:49
+msgid "You have to specify at least one post to delete."
+msgstr ""
+
+#: threads/serializers/moderation.py:56 threads/serializers/moderation.py:111
+#: threads/serializers/moderation.py:205 threads/serializers/moderation.py:363
+msgid "One or more post ids received were invalid."
+msgstr ""
+
+#: threads/serializers/moderation.py:70
+#, python-format
+msgid "No more than %(limit)s post can be deleted at a single time."
+msgid_plural "No more than %(limit)s posts can be deleted at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:98
+msgid "One or more posts to delete could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:105
+msgid "You have to select at least two posts to merge."
+msgstr ""
+
+#: threads/serializers/moderation.py:128
+#, python-format
+msgid "No more than %(limit)s post can be merged at a single time."
+msgid_plural "No more than %(limit)s posts can be merged at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:156
+msgid "Posts made by different users can't be merged."
+msgstr ""
+
+#: threads/serializers/moderation.py:169
+msgid "Post marked as best answer can't be merged with thread's first post."
+msgstr ""
+
+#: threads/serializers/moderation.py:180
+msgid "Posts with different visibility can't be merged."
+msgstr ""
+
+#: threads/serializers/moderation.py:187
+msgid "One or more posts to merge could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:195
+msgid "You have to specify at least one post to move."
+msgstr ""
+
+#: threads/serializers/moderation.py:199 threads/serializers/moderation.py:472
+msgid "Enter link to new thread."
+msgstr ""
+
+#: threads/serializers/moderation.py:222 threads/serializers/moderation.py:488
+msgid "This is not a valid thread link."
+msgstr ""
+
+#: threads/serializers/moderation.py:225
+msgid "Thread to move posts to is same as current one."
+msgstr ""
+
+#: threads/serializers/moderation.py:233 threads/serializers/moderation.py:500
+msgid ""
+"The thread you have entered link to doesn't exist or you don't have "
+"permission to see it."
+msgstr ""
+
+#: threads/serializers/moderation.py:240
+msgid "You can't move posts to threads you can't reply."
+msgstr ""
+
+#: threads/serializers/moderation.py:250
+#, python-format
+msgid "No more than %(limit)s post can be moved at a single time."
+msgid_plural "No more than %(limit)s posts can be moved at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:277
+msgid "One or more posts to move could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:305
+msgid "You can't create new threads in selected category."
+msgstr ""
+
+#: threads/serializers/moderation.py:319
+msgid "You don't have permission to pin threads globally in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:325
+msgid "You don't have permission to pin threads in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:337
+msgid "You don't have permission to hide threads in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:349
+msgid "You don't have permission to close threads in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:356
+msgid "You have to specify at least one post to split."
+msgstr ""
+
+#: threads/serializers/moderation.py:377
+#, python-format
+msgid "No more than %(limit)s post can be split at a single time."
+msgid_plural "No more than %(limit)s posts can be split at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:404
+msgid "One or more posts to split could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:411
+msgid "You have to specify at least one thread to delete."
+msgstr ""
+
+#: threads/serializers/moderation.py:418 threads/serializers/moderation.py:534
+msgid "One or more thread ids received were invalid."
+msgstr ""
+
+#: threads/serializers/moderation.py:432
+#, python-format
+msgid "No more than %(limit)s thread can be deleted at a single time."
+msgid_plural "No more than %(limit)s threads can be deleted at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:464
+msgid "One or more threads to delete could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:490
+msgid "You can't merge thread with itself."
+msgstr ""
+
+#: threads/serializers/moderation.py:507
+msgid "You can't merge this thread into thread you can't reply."
+msgstr ""
+
+#: threads/serializers/moderation.py:526
+msgid "You have to select at least two threads to merge."
+msgstr ""
+
+#: threads/serializers/moderation.py:555
+#, python-format
+msgid "No more than %(limit)s thread can be merged at a single time."
+msgid_plural "No more than %(limit)s threads can be merged at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:578
+msgid "One or more threads to merge could not be found."
+msgstr ""
+
+#: threads/serializers/poll.py:106
+msgid "One or more poll choices are invalid."
+msgstr ""
+
+#: threads/serializers/poll.py:116
+msgid "You need to add at least two choices to a poll."
+msgstr ""
+
+#: threads/serializers/poll.py:122
+#, python-format
+msgid ""
+"You can't add more than %(limit_value)s option to a single poll (added "
+"%(show_value)s)."
+msgid_plural ""
+"You can't add more than %(limit_value)s options to a single poll (added "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/poll.py:134
+msgid "Number of allowed choices can't be greater than number of all choices."
+msgstr ""
+
+#: threads/serializers/pollvote.py:15
+#, python-format
+msgid "This poll disallows voting for more than %(choices)s choice."
+msgid_plural "This poll disallows voting for more than %(choices)s choices."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/pollvote.py:32
+msgid "One or more of poll choices were invalid."
+msgstr ""
+
+#: threads/serializers/pollvote.py:36
+msgid "You have to make a choice."
+msgstr ""
+
+#: threads/signals.py:168
+msgid "Question"
+msgstr ""
+
+#: threads/signals.py:169
+msgid "Choices"
+msgstr ""
+
+#: threads/templatetags/misago_poststags.py:17
+#, python-format
+msgid "%(user)s likes this."
+msgstr ""
+
+#: threads/templatetags/misago_poststags.py:26
+#, python-format
+msgid "%(users)s like this."
+msgstr ""
+
+#: threads/templatetags/misago_poststags.py:29
+#, python-format
+msgid "%(users)s and %(likes)s other user like this."
+msgid_plural "%(users)s and %(likes)s other users like this."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/templatetags/misago_poststags.py:41
+#, python-format
+msgid "%(users)s and %(last_user)s"
+msgstr ""
+
+#: threads/threadtypes/thread.py:14
+msgid "None (will become top level category)"
+msgstr ""
+
+#: threads/validators.py:27
+msgid "Requested category could not be found."
+msgstr ""
+
+#: threads/validators.py:30
+msgid "You don't have permission to access this category."
+msgstr ""
+
+#: threads/validators.py:37
+msgid "Thread title should contain alpha-numeric characters."
+msgstr ""
+
+#: threads/validators.py:38
+msgid "Thread title is too long."
+msgstr ""
+
+#: threads/validators.py:46
+msgid "You have to enter an thread title."
+msgstr ""
+
+#: threads/validators.py:51
+#, python-format
+msgid ""
+"Thread title should be at least %(limit_value)s character long (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Thread title should be at least %(limit_value)s characters long (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/validators.py:63
+#, python-format
+msgid ""
+"Thread title cannot be longer than %(limit_value)s character (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Thread title cannot be longer than %(limit_value)s characters (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/validators.py:82
+#, python-format
+msgid ""
+"Posted message should be at least %(limit_value)s character long (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Posted message should be at least %(limit_value)s characters long (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/validators.py:93
+#, python-format
+msgid ""
+"Posted message cannot be longer than %(limit_value)s character (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Posted message cannot be longer than %(limit_value)s characters (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/viewmodels/threads.py:23
+msgid "Your threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:24
+msgid "New threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:25
+msgid "Unread threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:26
+msgid "Subscribed threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:27
+msgid "Unapproved content"
+msgstr ""
+
+#: threads/viewmodels/threads.py:32
+msgid "You have to sign in to see list of threads that you have started."
+msgstr ""
+
+#: threads/viewmodels/threads.py:34
+msgid "You have to sign in to see list of threads you haven't read."
+msgstr ""
+
+#: threads/viewmodels/threads.py:36
+msgid "You have to sign in to see list of threads with new replies."
+msgstr ""
+
+#: threads/viewmodels/threads.py:39
+msgid "You have to sign in to see list of threads you are subscribing."
+msgstr ""
+
+#: threads/viewmodels/threads.py:42
+msgid "You have to sign in to see list of threads with unapproved posts."
+msgstr ""
+
+#: threads/viewmodels/threads.py:113
+msgid "You don't have permission to see unapproved content lists."
+msgstr ""
+
+#: threads/views/goto.py:130
+msgid ""
+"You need permission to approve content to be able to go to first unapproved "
+"post."
+msgstr ""
+
+#: users/admin/__init__.py:77
+msgid "Bans"
+msgstr ""
+
+#: users/admin/__init__.py:87
+msgid "Ranks"
+msgstr ""
+
+#: users/admin/djangoadmin.py:42
+msgid "Misago user data"
+msgstr ""
+
+#: users/admin/djangoadmin.py:56
+msgid "Edit permissions and groups"
+msgstr ""
+
+#: users/admin/djangoadmin.py:76
+msgid "Edit the user from Misago admin panel"
+msgstr ""
+
+#: users/admin/forms.py:22 users/admin/forms.py:313 users/models/ban.py:71
+#: users/signals.py:29
+msgid "Username"
+msgstr ""
+
+#: users/admin/forms.py:23
+msgid "Custom title"
+msgstr ""
+
+#: users/admin/forms.py:24 users/models/ban.py:72
+msgid "E-mail address"
+msgstr ""
+
+#: users/admin/forms.py:59
+msgid "All registered members must have a \"Member\" role."
+msgstr ""
+
+#: users/admin/forms.py:76
+msgid "Is administrator"
+msgstr ""
+
+#: users/admin/forms.py:78
+msgid ""
+"Designates whether the user can log into admin sites. If Django admin site "
+"is enabled, this user will need additional permissions assigned within it to "
+"admin Django modules."
+msgstr ""
+
+#: users/admin/forms.py:84
+msgid "Is superuser"
+msgstr ""
+
+#: users/admin/forms.py:86
+msgid ""
+"Only administrators can access admin sites. In addition to admin site "
+"access, superadmins can also change other members admin levels."
+msgstr ""
+
+#: users/admin/forms.py:91
+msgid "Is active"
+msgstr ""
+
+#: users/admin/forms.py:93
+msgid ""
+"Designates whether this user should be treated as active. Turning this off "
+"is non-destructible way to remove user accounts."
+msgstr ""
+
+#: users/admin/forms.py:97 users/admin/forms.py:128 users/admin/forms.py:158
+msgid "Staff message"
+msgstr ""
+
+#: users/admin/forms.py:99
+msgid ""
+"Optional message for forum team members explaining why user's account has "
+"been disabled."
+msgstr ""
+
+#: users/admin/forms.py:104
+msgid "Change password to"
+msgstr ""
+
+#: users/admin/forms.py:111
+msgid "Lock avatar"
+msgstr ""
+
+#: users/admin/forms.py:113
+msgid ""
+"Setting this to yes will stop user from changing his/her avatar, and will "
+"reset his/her avatar to procedurally generated one."
+msgstr ""
+
+#: users/admin/forms.py:119 users/admin/forms.py:150 users/admin/forms.py:457
+#: users/admin/forms.py:524
+msgid "User message"
+msgstr ""
+
+#: users/admin/forms.py:121
+msgid ""
+"Optional message for user explaining why he/she is banned form changing "
+"avatar."
+msgstr ""
+
+#: users/admin/forms.py:130
+msgid ""
+"Optional message for forum team members explaining why user is banned form "
+"changing avatar."
+msgstr ""
+
+#: users/admin/forms.py:138
+msgid "Signature contents"
+msgstr ""
+
+#: users/admin/forms.py:143
+msgid "Lock signature"
+msgstr ""
+
+#: users/admin/forms.py:145
+msgid ""
+"Setting this to yes will stop user from making changes to his/her signature."
+msgstr ""
+
+#: users/admin/forms.py:152
+msgid "Optional message to user explaining why his/hers signature is locked."
+msgstr ""
+
+#: users/admin/forms.py:160
+msgid ""
+"Optional message to team members explaining why user signature is locked."
+msgstr ""
+
+#: users/admin/forms.py:166
+msgid "Hides presence"
+msgstr ""
+
+#: users/admin/forms.py:169
+msgid "Who can add user to private threads"
+msgstr ""
+
+#: users/admin/forms.py:178
+msgid "Replid threads"
+msgstr ""
+
+#: users/admin/forms.py:221 users/serializers/moderation.py:36
+#, python-format
+msgid "Signature can't be longer than %(limit)s character."
+msgid_plural "Signature can't be longer than %(limit)s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/admin/forms.py:240
+msgid ""
+"Ranks are used to group and distinguish users. They are also used to add "
+"permissions to groups of users."
+msgstr ""
+
+#: users/admin/forms.py:252
+msgid "Individual roles of this user. All users must have a \"Member\" role."
+msgstr ""
+
+#: users/admin/forms.py:315
+msgid "Profile fields contain"
+msgstr ""
+
+#: users/admin/forms.py:316
+msgid "Requires activation"
+msgstr ""
+
+#: users/admin/forms.py:318
+msgid "Administrator"
+msgstr ""
+
+#: users/admin/forms.py:319
+msgid "Deletes their account"
+msgstr ""
+
+#: users/admin/forms.py:364
+msgid "All ranks"
+msgstr ""
+
+#: users/admin/forms.py:368
+msgid "All roles"
+msgstr ""
+
+#: users/admin/forms.py:374
+msgid "Has rank"
+msgstr ""
+
+#: users/admin/forms.py:377
+msgid "Has role"
+msgstr ""
+
+#: users/admin/forms.py:389
+msgid ""
+"Short and descriptive name of all users with this rank. \"The Team\" or "
+"\"Game Masters\" are good examples."
+msgstr ""
+
+#: users/admin/forms.py:394
+msgid "User title"
+msgstr ""
+
+#: users/admin/forms.py:397
+msgid ""
+"Optional, singular version of rank name displayed by user names. For example "
+"\"GM\" or \"Dev\"."
+msgstr ""
+
+#: users/admin/forms.py:407
+msgid ""
+"Optional description explaining function or status of members distincted "
+"with this rank."
+msgstr ""
+
+#: users/admin/forms.py:412
+msgid "User roles"
+msgstr ""
+
+#: users/admin/forms.py:416
+msgid "Rank can give additional roles to users with it."
+msgstr ""
+
+#: users/admin/forms.py:422
+msgid "Optional css class added to content belonging to this rank owner."
+msgstr ""
+
+#: users/admin/forms.py:426
+msgid "Give rank dedicated tab on users list"
+msgstr ""
+
+#: users/admin/forms.py:429
+msgid ""
+"Selecting this option will make users with this rank easily discoverable by "
+"others through dedicated page on forum users list."
+msgstr ""
+
+#: users/admin/forms.py:447
+msgid "This name collides with other rank."
+msgstr ""
+
+#: users/admin/forms.py:454
+msgid "Values to ban"
+msgstr ""
+
+#: users/admin/forms.py:460
+msgid "Optional message displayed to users instead of default one."
+msgstr ""
+
+#: users/admin/forms.py:463 users/admin/forms.py:473 users/admin/forms.py:530
+#: users/admin/forms.py:540
+msgid "Message can't be longer than 1000 characters."
+msgstr ""
+
+#: users/admin/forms.py:467 users/admin/forms.py:534
+msgid "Team message"
+msgstr ""
+
+#: users/admin/forms.py:470 users/admin/forms.py:537
+msgid "Optional ban message for moderators and administrators."
+msgstr ""
+
+#: users/admin/forms.py:476 users/admin/forms.py:543
+msgid "Expiration date"
+msgstr ""
+
+#: users/admin/forms.py:485 users/admin/forms.py:574
+msgid "E-mails"
+msgstr ""
+
+#: users/admin/forms.py:486
+msgid "E-mail domains"
+msgstr ""
+
+#: users/admin/forms.py:493
+msgid "First segment of IP addresses"
+msgstr ""
+
+#: users/admin/forms.py:494
+msgid "First two segments of IP addresses"
+msgstr ""
+
+#: users/admin/forms.py:500
+msgid "Check type"
+msgstr ""
+
+#: users/admin/forms.py:503
+msgid "Restrict this ban to registrations"
+msgstr ""
+
+#: users/admin/forms.py:505
+msgid ""
+"Changing this to yes will make this ban check be only performed on "
+"registration step. This is good if you want to block certain registrations "
+"like ones from recently comprimised e-mail providers, without harming "
+"existing users."
+msgstr ""
+
+#: users/admin/forms.py:512
+msgid "Banned value"
+msgstr ""
+
+#: users/admin/forms.py:515
+msgid ""
+"This value is case-insensitive and accepts asterisk (*) for rought matches. "
+"For example, making IP ban for value \"83.*\" will ban all IP addresses "
+"beginning with \"83.\"."
+msgstr ""
+
+#: users/admin/forms.py:520
+msgid "Banned value can't be longer than 250 characters."
+msgstr ""
+
+#: users/admin/forms.py:527
+msgid "Optional message displayed to user instead of default one."
+msgstr ""
+
+#: users/admin/forms.py:562
+msgid "Banned value is too vague."
+msgstr ""
+
+#: users/admin/forms.py:572
+msgid "All bans"
+msgstr ""
+
+#: users/admin/forms.py:575
+msgid "IPs"
+msgstr ""
+
+#: users/admin/forms.py:578
+msgid "Banned value begins with"
+msgstr ""
+
+#: users/admin/forms.py:582 users/admin/forms.py:587
+msgid "Any"
+msgstr ""
+
+#: users/admin/forms.py:622
+msgid "Usernames or emails"
+msgstr ""
+
+#: users/admin/forms.py:624
+msgid ""
+"Enter every item in new line. Duplicates will be ignored. This field is case "
+"insensitive. Depending on site configuration and amount of data to archive "
+"it may take up to few days for requests to complete. E-mail will "
+"notification will be sent to every user once their download is ready."
+msgstr ""
+
+#: users/admin/forms.py:641
+#, python-format
+msgid ""
+"You may not enter more than 20 items at a single time (You have entered "
+"%(show_value)s)."
+msgstr ""
+
+#: users/admin/forms.py:660
+msgid "One or more specified users could not be found."
+msgstr ""
+
+#: users/admin/views/bans.py:14
+msgid "Requested ban does not exist."
+msgstr ""
+
+#: users/admin/views/bans.py:30
+msgid "With bans: 0"
+msgstr ""
+
+#: users/admin/views/bans.py:31
+msgid "Select bans"
+msgstr ""
+
+#: users/admin/views/bans.py:35
+msgid "Remove bans"
+msgstr ""
+
+#: users/admin/views/bans.py:36
+msgid "Are you sure you want to remove those bans?"
+msgstr ""
+
+#: users/admin/views/bans.py:43
+msgid "Selected bans have been removed."
+msgstr ""
+
+#: users/admin/views/bans.py:47
+#, python-format
+msgid "New ban \"%(name)s\" has been saved."
+msgstr ""
+
+#: users/admin/views/bans.py:51
+#, python-format
+msgid "Ban \"%(name)s\" has been edited."
+msgstr ""
+
+#: users/admin/views/bans.py:58
+#, python-format
+msgid "Ban \"%(name)s\" has been removed."
+msgstr ""
+
+#: users/admin/views/datadownloads.py:23
+msgid "With data downloads: 0"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:24
+msgid "Select data downloads"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:28
+msgid "Expire downloads"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:30
+msgid "Are you sure you want to set selected data downloads as expired?"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:35
+msgid "Delete downloads"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:37
+msgid "Are you sure you want to delete selected data downloads?"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:52
+msgid "Selected data downloads have been set as expired."
+msgstr ""
+
+#: users/admin/views/datadownloads.py:59
+msgid "Selected data downloads have been deleted."
+msgstr ""
+
+#: users/admin/views/datadownloads.py:71
+msgid "Data downloads have been requested for specified users."
+msgstr ""
+
+#: users/admin/views/ranks.py:16
+msgid "Requested rank does not exist."
+msgstr ""
+
+#: users/admin/views/ranks.py:33
+#, python-format
+msgid "New rank \"%(name)s\" has been saved."
+msgstr ""
+
+#: users/admin/views/ranks.py:37
+#, python-format
+msgid "Rank \"%(name)s\" has been edited."
+msgstr ""
+
+#: users/admin/views/ranks.py:44
+#, python-format
+msgid "Rank \"%(name)s\" is default rank and can't be deleted."
+msgstr ""
+
+#: users/admin/views/ranks.py:47
+#, python-format
+msgid "Rank \"%(name)s\" is assigned to users and can't be deleted."
+msgstr ""
+
+#: users/admin/views/ranks.py:52
+#, python-format
+msgid "Rank \"%(name)s\" has been deleted."
+msgstr ""
+
+#: users/admin/views/ranks.py:69
+#, python-format
+msgid "Rank \"%(name)s\" has been moved below \"%(other)s\"."
+msgstr ""
+
+#: users/admin/views/ranks.py:87
+#, python-format
+msgid "Rank \"%(name)s\" has been moved above \"%(other)s\"."
+msgstr ""
+
+#: users/admin/views/ranks.py:101
+#, python-format
+msgid "Rank \"%(name)s\" is already default."
+msgstr ""
+
+#: users/admin/views/ranks.py:106
+#, python-format
+msgid "Rank \"%(name)s\" has been made default."
+msgstr ""
+
+#: users/admin/views/users.py:67
+msgid "Biggest posters"
+msgstr ""
+
+#: users/admin/views/users.py:68
+msgid "Smallest posters"
+msgstr ""
+
+#: users/admin/views/users.py:70
+msgid "With users: 0"
+msgstr ""
+
+#: users/admin/views/users.py:71
+msgid "Select users"
+msgstr ""
+
+#: users/admin/views/users.py:73
+msgid "Activate accounts"
+msgstr ""
+
+#: users/admin/views/users.py:75
+msgid "Request data download"
+msgstr ""
+
+#: users/admin/views/users.py:78
+msgid "Delete accounts"
+msgstr ""
+
+#: users/admin/views/users.py:79
+msgid "Are you sure you want to delete selected users?"
+msgstr ""
+
+#: users/admin/views/users.py:83
+msgid "Delete with content"
+msgstr ""
+
+#: users/admin/views/users.py:85
+msgid ""
+"Are you sure you want to delete selected users? This will also delete all "
+"content associated with their accounts."
+msgstr ""
+
+#: users/admin/views/users.py:106
+msgid "You have to select inactive users."
+msgstr ""
+
+#: users/admin/views/users.py:113
+#, python-format
+msgid "Your account on %(forum_name)s forums has been activated"
+msgstr ""
+
+#: users/admin/views/users.py:123
+msgid "Selected users accounts have been activated."
+msgstr ""
+
+#: users/admin/views/users.py:131
+#, python-format
+msgid "%(user)s is super admin and can't be banned."
+msgstr ""
+
+#: users/admin/views/users.py:193
+msgid "Selected users have been banned."
+msgstr ""
+
+#: users/admin/views/users.py:208
+msgid "Data download requests have been placed for selected users."
+msgstr ""
+
+#: users/admin/views/users.py:214 users/admin/views/users.py:230
+msgid "You can't delete yourself."
+msgstr ""
+
+#: users/admin/views/users.py:216 users/admin/views/users.py:232
+#, python-format
+msgid "%(user)s is admin and can't be deleted."
+msgstr ""
+
+#: users/admin/views/users.py:225
+msgid "Selected users have been deleted."
+msgstr ""
+
+#: users/admin/views/users.py:246
+msgid ""
+"Selected users have been disabled and queued for deletion together with "
+"their content."
+msgstr ""
+
+#: users/admin/views/users.py:255
+#, python-format
+msgid "New user \"%(user)s\" has been registered."
+msgstr ""
+
+#: users/admin/views/users.py:287
+#, python-format
+msgid "User \"%(user)s\" has been edited."
+msgstr ""
+
+#: users/api/auth.py:94
+#, python-format
+msgid "Activate %(user)s account on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/auth.py:129
+#, python-format
+msgid "Change %(user)s password on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/auth.py:164
+msgid "Form link is invalid. Please try again."
+msgstr ""
+
+#: users/api/auth.py:165
+msgid "Your link has expired. Please request new one."
+msgstr ""
+
+#: users/api/rest_permissions.py:30
+msgid "This action is not available to signed in users."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:26
+msgid "Your avatar is locked. You can't change it."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:109
+msgid "This avatar type is not allowed."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:116
+msgid "Unknown avatar type."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:137
+msgid "New avatar based on your account was set."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:143
+msgid "Gravatar was downloaded and set as new avatar."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:145
+msgid "No Gravatar is associated with your e-mail address."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:147
+msgid "Failed to connect to Gravatar servers."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:157
+msgid "Avatar from gallery was set."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:159
+msgid "Incorrect image."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:165
+msgid "No file was sent."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:178
+msgid "Avatar was re-cropped."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:183
+msgid "Uploaded avatar was set."
+msgstr ""
+
+#: users/api/userendpoints/changeemail.py:22
+#, python-format
+msgid "Confirm e-mail change on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/userendpoints/changeemail.py:35
+msgid "E-mail change confirmation link was sent to new address."
+msgstr ""
+
+#: users/api/userendpoints/changepassword.py:22
+#, python-format
+msgid "Confirm password change on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/userendpoints/changepassword.py:33
+msgid "Password change confirmation link was sent to your address."
+msgstr ""
+
+#: users/api/userendpoints/create.py:25
+msgid "New users registrations are currently closed."
+msgstr ""
+
+#: users/api/userendpoints/signature.py:13
+msgid "You don't have permission to change signature."
+msgstr ""
+
+#: users/api/userendpoints/signature.py:25
+msgid "Your signature is locked. You can't change it."
+msgstr ""
+
+#: users/api/userendpoints/username.py:32
+msgid "You can't change your username now."
+msgstr ""
+
+#: users/api/userendpoints/username.py:60
+#: users/api/userendpoints/username.py:82
+msgid "Error changing username. Please try again."
+msgstr ""
+
+#: users/api/usernamechanges.py:28
+msgid "You don't have permission to see other users name history."
+msgstr ""
+
+#: users/api/users.py:64
+msgid "You have to sign in to perform this action."
+msgstr ""
+
+#: users/api/users.py:110
+msgid "You can't change other users avatars."
+msgstr ""
+
+#: users/api/users.py:122
+msgid "You can't change other users options."
+msgstr ""
+
+#: users/api/users.py:127
+msgid "Your forum options have been changed."
+msgstr ""
+
+#: users/api/users.py:133
+msgid "You can't change other users names."
+msgstr ""
+
+#: users/api/users.py:140
+msgid "You can't change other users signatures."
+msgstr ""
+
+#: users/api/users.py:152
+msgid "You can't change other users passwords."
+msgstr ""
+
+#: users/api/users.py:162
+msgid "You can't change other users e-mail addresses."
+msgstr ""
+
+#: users/api/users.py:269
+msgid "You can't request data downloads for other users."
+msgstr ""
+
+#: users/api/users.py:273
+msgid "You can't download your data."
+msgstr ""
+
+#: users/api/users.py:278
+msgid "You can't have more than one data download request at a single time."
+msgstr ""
+
+#: users/api/users.py:335
+msgid "You can't see other users data downloads."
+msgstr ""
+
+#: users/apps.py:30
+msgid "Edit details"
+msgstr ""
+
+#: users/apps.py:36
+msgid "Change username"
+msgstr ""
+
+#: users/apps.py:42
+msgid "Change email or password"
+msgstr ""
+
+#: users/apps.py:63
+msgid "Delete account"
+msgstr ""
+
+#: users/avatars/uploaded.py:38
+msgid "Uploaded file is too big."
+msgstr ""
+
+#: users/avatars/uploaded.py:46 users/avatars/uploaded.py:51
+msgid "Uploaded file type is not allowed."
+msgstr ""
+
+#: users/avatars/uploaded.py:59
+#, python-format
+msgid "Uploaded image should be at least %(size)s pixels tall and wide."
+msgstr ""
+
+#: users/avatars/uploaded.py:63
+msgid "Uploaded image is too big."
+msgstr ""
+
+#: users/avatars/uploaded.py:68
+msgid "Uploaded image ratio cannot be greater than 16:9."
+msgstr ""
+
+#: users/avatars/uploaded.py:74
+msgid "Crop data is invalid. Please try again."
+msgstr ""
+
+#: users/captcha.py:21
+msgid "Failed to contact reCAPTCHA API."
+msgstr ""
+
+#: users/captcha.py:28
+msgid "Entered answer is incorrect."
+msgstr ""
+
+#: users/decorators.py:14
+msgid "This page is not available to signed in users."
+msgstr ""
+
+#: users/decorators.py:26
+msgid "You have to sign in to access this page."
+msgstr ""
+
+#: users/forms/auth.py:15
+msgid "Fill out both fields."
+msgstr ""
+
+#: users/forms/auth.py:16
+msgid "Login or password is incorrect."
+msgstr ""
+
+#: users/forms/auth.py:18
+msgid "You have to activate your account before you will be able to sign in."
+msgstr ""
+
+#: users/forms/auth.py:21
+msgid ""
+"Your account has to be activated by site administrator before you will be "
+"able to sign in."
+msgstr ""
+
+#: users/forms/auth.py:98
+msgid "Your account does not have admin privileges."
+msgstr ""
+
+#: users/forms/auth.py:118
+msgid "Enter e-mail address."
+msgstr ""
+
+#: users/forms/auth.py:124
+msgid "Entered e-mail is invalid."
+msgstr ""
+
+#: users/forms/auth.py:134
+msgid "No user with this e-mail exists."
+msgstr ""
+
+#: users/forms/auth.py:150 users/views/activation.py:46
+#, python-format
+msgid "%(user)s, your account is already active."
+msgstr ""
+
+#: users/forms/auth.py:156
+#, python-format
+msgid "%(user)s, only administrator may activate your account."
+msgstr ""
+
+#: users/forms/auth.py:165
+msgid ""
+"You have to activate your account before you will be able to request new "
+"password."
+msgstr ""
+
+#: users/forms/auth.py:169
+msgid ""
+"Administrator has to activate your account before you will be able to "
+"request new password."
+msgstr ""
+
+#: users/forms/register.py:34 users/validators.py:80
+msgid "This username is not allowed."
+msgstr ""
+
+#: users/forms/register.py:45 users/validators.py:52
+msgid "This e-mail address is not allowed."
+msgstr ""
+
+#: users/forms/register.py:51
+msgid "This agreement is required."
+msgstr ""
+
+#: users/forms/register.py:61
+msgid "New registrations from this IP address are not allowed."
+msgstr ""
+
+#: users/management/commands/prepareuserdatadownloads.py:38
+#, python-format
+msgid "%(user)s, your data download is ready"
+msgstr ""
+
+#: users/migrations/0004_default_ranks.py:13
+#: users/migrations/0004_default_ranks.py:14 users/models/user.py:77
+msgid "Forum team"
+msgstr ""
+
+#: users/migrations/0004_default_ranks.py:15
+msgid "Team"
+msgstr ""
+
+#: users/migrations/0004_default_ranks.py:22
+#: users/migrations/0004_default_ranks.py:23
+msgid "Members"
+msgstr ""
+
+#: users/models/datadownload.py:26
+msgid "Pending"
+msgstr ""
+
+#: users/models/datadownload.py:27
+msgid "Processing"
+msgstr ""
+
+#: users/models/datadownload.py:28
+msgid "Ready"
+msgstr ""
+
+#: users/models/deleteduser.py:12
+msgid "By self"
+msgstr ""
+
+#: users/models/deleteduser.py:13
+msgid "By staff"
+msgstr ""
+
+#: users/models/deleteduser.py:14
+msgid "By system"
+msgstr ""
+
+#: users/models/user.py:106
+msgid "Notify"
+msgstr ""
+
+#: users/models/user.py:107
+msgid "Notify with e-mail"
+msgstr ""
+
+#: users/models/user.py:115
+msgid "Everybody"
+msgstr ""
+
+#: users/models/user.py:116
+msgid "Users I follow"
+msgstr ""
+
+#: users/models/user.py:117
+msgid "Nobody"
+msgstr ""
+
+#: users/models/user.py:136
+msgid "joined on"
+msgstr ""
+
+#: users/models/user.py:148
+msgid "staff status"
+msgstr ""
+
+#: users/models/user.py:150
+msgid "Designates whether the user can log into admin sites."
+msgstr ""
+
+#: users/models/user.py:157
+msgid "active"
+msgstr ""
+
+#: users/models/user.py:161
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+
+#: users/permissions/account.py:10
+msgid "Account settings"
+msgstr ""
+
+#: users/permissions/account.py:13
+msgid "Allowed username changes number"
+msgstr ""
+
+#: users/permissions/account.py:16
+msgid "Don't count username changes older than"
+msgstr ""
+
+#: users/permissions/account.py:18
+msgid ""
+"Number of days since name change that makes that change no longer count to "
+"limit. Enter zero to make all changes count."
+msgstr ""
+
+#: users/permissions/account.py:25
+msgid "Can have signature"
+msgstr ""
+
+#: users/permissions/account.py:26
+msgid "Can put links in signature"
+msgstr ""
+
+#: users/permissions/account.py:27
+msgid "Can put images in signature"
+msgstr ""
+
+#: users/permissions/account.py:29
+msgid "Can use text blocks in signature"
+msgstr ""
+
+#: users/permissions/account.py:31
+msgid ""
+"Controls whether or not users can put quote, code, spoiler blocks and "
+"horizontal lines in signatures."
+msgstr ""
+
+#: users/permissions/decorators.py:10
+msgid "You have to sig in to perform this action."
+msgstr ""
+
+#: users/permissions/decorators.py:19
+msgid "Only guests can perform this action."
+msgstr ""
+
+#: users/permissions/delete.py:26
+msgid "Maximum age of deleted account (in days)"
+msgstr ""
+
+#: users/permissions/delete.py:27 users/permissions/delete.py:33
+msgid "Enter zero to disable this check."
+msgstr ""
+
+#: users/permissions/delete.py:32
+msgid "Maximum number of posts on deleted account"
+msgstr ""
+
+#: users/permissions/delete.py:74
+msgid "You can't delete users."
+msgstr ""
+
+#: users/permissions/delete.py:77 users/permissions/delete.py:106
+msgid "You can't delete your account."
+msgstr ""
+
+#: users/permissions/delete.py:79
+msgid "You can't delete administrators."
+msgstr ""
+
+#: users/permissions/delete.py:84
+#, python-format
+msgid "You can't delete users that are members for more than %(days)s day."
+msgid_plural ""
+"You can't delete users that are members for more than %(days)s days."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/permissions/delete.py:92
+#, python-format
+msgid "You can't delete users that made more than %(posts)s post."
+msgid_plural "You can't delete users that made more than %(posts)s posts."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/permissions/delete.py:104
+msgid "You can't delete other users accounts."
+msgstr ""
+
+#: users/permissions/delete.py:109
+msgid "You can't delete your account because you are an administrator."
+msgstr ""
+
+#: users/permissions/moderation.py:33
+msgid "Users moderation"
+msgstr ""
+
+#: users/permissions/moderation.py:35
+msgid "Can rename users"
+msgstr ""
+
+#: users/permissions/moderation.py:36
+msgid "Can moderate avatars"
+msgstr ""
+
+#: users/permissions/moderation.py:37
+msgid "Can moderate signatures"
+msgstr ""
+
+#: users/permissions/moderation.py:38
+msgid "Can moderate profile details"
+msgstr ""
+
+#: users/permissions/moderation.py:39
+msgid "Can ban users"
+msgstr ""
+
+#: users/permissions/moderation.py:41
+msgid "Max length, in days, of imposed ban"
+msgstr ""
+
+#: users/permissions/moderation.py:42
+msgid "Enter zero to let moderators impose permanent bans."
+msgstr ""
+
+#: users/permissions/moderation.py:46
+msgid "Can lift bans"
+msgstr ""
+
+#: users/permissions/moderation.py:48
+msgid "Max length, in days, of lifted ban"
+msgstr ""
+
+#: users/permissions/moderation.py:49
+msgid "Enter zero to let moderators lift permanent bans."
+msgstr ""
+
+#: users/permissions/moderation.py:111
+msgid "You can't rename users."
+msgstr ""
+
+#: users/permissions/moderation.py:113
+msgid "You can't rename administrators."
+msgstr ""
+
+#: users/permissions/moderation.py:121
+msgid "You can't moderate avatars."
+msgstr ""
+
+#: users/permissions/moderation.py:123
+msgid "You can't moderate administrators avatars."
+msgstr ""
+
+#: users/permissions/moderation.py:131
+msgid "You can't moderate signatures."
+msgstr ""
+
+#: users/permissions/moderation.py:133
+msgid "You can't moderate administrators signatures."
+msgstr ""
+
+#: users/permissions/moderation.py:142
+msgid "You have to sign in to edit profile details."
+msgstr ""
+
+#: users/permissions/moderation.py:147
+msgid "You can't edit other users details."
+msgstr ""
+
+#: users/permissions/moderation.py:149
+msgid "You can't edit administrators details."
+msgstr ""
+
+#: users/permissions/moderation.py:158
+msgid "You can't ban users."
+msgstr ""
+
+#: users/permissions/moderation.py:160
+msgid "You can't ban administrators."
+msgstr ""
+
+#: users/permissions/moderation.py:168
+msgid "You can't lift bans."
+msgstr ""
+
+#: users/permissions/moderation.py:171
+msgid "This user is not banned."
+msgstr ""
+
+#: users/permissions/moderation.py:176
+msgid "You can't lift permanent bans."
+msgstr ""
+
+#: users/permissions/moderation.py:178
+#, python-format
+msgid "You can't lift bans that expire after %(expiration)s."
+msgstr ""
+
+#: users/permissions/profiles.py:23
+msgid "Can browse users list"
+msgstr ""
+
+#: users/permissions/profiles.py:24
+msgid "Can search user profiles"
+msgstr ""
+
+#: users/permissions/profiles.py:25
+msgid "Can see other members name history"
+msgstr ""
+
+#: users/permissions/profiles.py:27
+msgid "Can see members bans details"
+msgstr ""
+
+#: users/permissions/profiles.py:29
+msgid "Allows users with this permission to see user and staff ban messages."
+msgstr ""
+
+#: users/permissions/profiles.py:35
+msgid "User profiles"
+msgstr ""
+
+#: users/permissions/profiles.py:46
+msgid "Can follow other users"
+msgstr ""
+
+#: users/permissions/profiles.py:47
+msgid "Can be blocked by other users"
+msgstr ""
+
+#: users/permissions/profiles.py:50
+msgid "Can see members e-mails"
+msgstr ""
+
+#: users/permissions/profiles.py:51
+msgid "Can see members IPs"
+msgstr ""
+
+#: users/permissions/profiles.py:53
+msgid "Can see members that hide their presence"
+msgstr ""
+
+#: users/permissions/profiles.py:113
+msgid "You can't browse users list."
+msgstr ""
+
+#: users/permissions/profiles.py:122
+msgid "You can't follow other users."
+msgstr ""
+
+#: users/permissions/profiles.py:124
+msgid "You can't add yourself to followed."
+msgstr ""
+
+#: users/permissions/profiles.py:133
+msgid "You can't block administrators."
+msgstr ""
+
+#: users/permissions/profiles.py:135
+msgid "You can't block yourself."
+msgstr ""
+
+#: users/permissions/profiles.py:145
+msgid "You can't see users bans details."
+msgstr ""
+
+#: users/profilefields/default.py:12
+msgid "Bio"
+msgstr ""
+
+#: users/profilefields/default.py:17
+msgid "Real name"
+msgstr ""
+
+#: users/profilefields/default.py:22
+msgid "Location"
+msgstr ""
+
+#: users/profilefields/default.py:27
+msgid "Gender"
+msgstr ""
+
+#: users/profilefields/default.py:30
+msgid "Not specified"
+msgstr ""
+
+#: users/profilefields/default.py:31
+msgid "Not telling"
+msgstr ""
+
+#: users/profilefields/default.py:32
+msgid "Female"
+msgstr ""
+
+#: users/profilefields/default.py:33
+msgid "Male"
+msgstr ""
+
+#: users/profilefields/default.py:39
+msgid "Website"
+msgstr ""
+
+#: users/profilefields/default.py:41
+msgid ""
+"If you own website in the internet you wish to share on your profile you may "
+"enter its address here. Remember to for it to be valid http address starting "
+"with either \"http://\" or \"https://\"."
+msgstr ""
+
+#: users/profilefields/default.py:49
+msgid "Skype ID"
+msgstr ""
+
+#: users/profilefields/default.py:51
+msgid ""
+"Entering your Skype ID in this field may invite other users to contact you "
+"over the Skype instead of via private threads."
+msgstr ""
+
+#: users/profilefields/default.py:58
+msgid "Twitter handle"
+msgstr ""
+
+#: users/profilefields/default.py:62
+#, python-format
+msgid ""
+"If you own Twitter account, here you may enter your Twitter handle for other "
+"users to find you. Starting your handle with \"@\" sign is optional. Either "
+"\"@%(slug)s\" or \"%(slug)s\" are valid values."
+msgstr ""
+
+#: users/profilefields/default.py:73
+msgid "This is not a valid twitter handle."
+msgstr ""
+
+#: users/profilefields/default.py:79
+msgid "Join IP"
+msgstr ""
+
+#: users/registration.py:12
+#, python-format
+msgid "Welcome on %(forum_name)s forums!"
+msgstr ""
+
+#: users/search.py:22
+msgid "You don't have permission to search users."
+msgstr ""
+
+#: users/serializers/ban.py:26
+msgid "Your IP address is banned."
+msgstr ""
+
+#: users/serializers/ban.py:28
+msgid "You are banned."
+msgstr ""
+
+#: users/serializers/options.py:46
+msgid "Signature is too long."
+msgstr ""
+
+#: users/serializers/options.py:57
+msgid "Enter new username."
+msgstr ""
+
+#: users/serializers/options.py:61
+msgid "New username is same as current one."
+msgstr ""
+
+#: users/serializers/options.py:80 users/serializers/options.py:94
+#: users/serializers/options.py:116
+msgid "Entered password is invalid."
+msgstr ""
+
+#: users/serializers/options.py:100
+msgid "You have to enter new e-mail address."
+msgstr ""
+
+#: users/serializers/options.py:104
+msgid "New e-mail is same as current one."
+msgstr ""
+
+#: users/signals.py:31
+msgid "Joined on"
+msgstr ""
+
+#: users/signals.py:32
+msgid "Joined from ip"
+msgstr ""
+
+#: users/signals.py:74
+msgid "New username"
+msgstr ""
+
+#: users/signals.py:75
+msgid "Old username"
+msgstr ""
+
+#: users/validators.py:40
+msgid "This e-mail address is not available."
+msgstr ""
+
+#: users/validators.py:68
+msgid "This username is not available."
+msgstr ""
+
+#: users/validators.py:86
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr ""
+
+#: users/validators.py:93
+#, python-format
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/validators.py:101
+#, python-format
+msgid "Username cannot be longer than %(limit_value)s characters."
+msgid_plural "Username cannot be longer than %(limit_value)s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/validators.py:137
+msgid "Data entered was found in spammers database."
+msgstr ""
+
+#: users/validators.py:147
+msgid "This email is not allowed."
+msgstr ""
+
+#: users/views/activation.py:51
+#, python-format
+msgid ""
+"%(user)s, your activation link is invalid. Try again or request new "
+"activation link."
+msgstr ""
+
+#: users/views/activation.py:69
+#, python-format
+msgid "%(user)s, your account has been activated!"
+msgstr ""
+
+#: users/views/forgottenpassword.py:31
+#, python-format
+msgid "%(user)s, your link has expired. Please request new link and try again."
+msgstr ""
+
+#: users/views/forgottenpassword.py:38
+#, python-format
+msgid "%(user)s, your link is invalid. Please try again or request new link."
+msgstr ""
+
+#: users/views/options.py:56
+#, python-format
+msgid "%(user)s, your e-mail has been changed."
+msgstr ""
+
+#: users/views/options.py:74
+#, python-format
+msgid "%(user)s, your password has been changed."
+msgstr ""

BIN
misago/locale/ko/LC_MESSAGES/djangojs.mo


+ 141 - 94
misago/locale/ko/LC_MESSAGES/djangojs.po

@@ -2,23 +2,23 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # miiiji <alwldmsrk@gmail.com>, 2020
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: miiiji <alwldmsrk@gmail.com>, 2020\n"
 "Language-Team: Korean (https://www.transifex.com/misago/teams/65369/ko/)\n"
+"Language: ko\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: ko\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #: static/misago/admin/index.js:16
@@ -41,7 +41,8 @@ msgstr "%(agreement)s 읽고 동의합니다."
 msgid ""
 "Declining will result in immediate deactivation and deletion of your "
 "account. This action is not reversible."
-msgstr "거절하면 계정이 즉시 비활성화되고 삭제됩니다. 이 작업은 되돌릴 수 없습니다."
+msgstr ""
+"거절하면 계정이 즉시 비활성화되고 삭제됩니다. 이 작업은 되돌릴 수 없습니다."
 
 #: static/misago/js/misago.js:1
 msgid "Decline"
@@ -303,7 +304,8 @@ msgstr "테두리 삽입"
 
 #: static/misago/js/misago.js:1
 msgid "%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s."
-msgstr " %(filetype)s, %(size)s, %(uploader)s사용자가 %(uploaded_on)s에 업로드 함."
+msgstr ""
+" %(filetype)s, %(size)s, %(uploader)s사용자가 %(uploaded_on)s에 업로드 함."
 
 #: static/misago/js/misago.js:1
 msgid "Insert"
@@ -375,9 +377,11 @@ msgstr "Best 답변"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Please select the best answer for your newly merged thread. No posts will be"
-" deleted during the merge."
-msgstr "새로 병합 된 스레드에 대한 최고의 답변을 선택하세요. 병합 중에는 게시물이 삭제되지 않습니다."
+"Please select the best answer for your newly merged thread. No posts will be "
+"deleted during the merge."
+msgstr ""
+"새로 병합 된 스레드에 대한 최고의 답변을 선택하세요. 병합 중에는 게시물이 삭"
+"제되지 않습니다."
 
 #: static/misago/js/misago.js:1
 msgid "Poll"
@@ -387,7 +391,9 @@ msgstr "설문조사"
 msgid ""
 "Please select the poll for your newly merged thread. Rejected polls will be "
 "permanently deleted and cannot be recovered."
-msgstr "새로 병합 된 스레드에 대한 설문조사를 선택하세요. 거부 된 설문 조사는 영구적으로 삭제되며 복구 할 수 없습니다."
+msgstr ""
+"새로 병합 된 스레드에 대한 설문조사를 선택하세요. 거부 된 설문 조사는 영구적"
+"으로 삭제되며 복구 할 수 없습니다."
 
 #: static/misago/js/misago.js:1
 msgid "Search returned no results."
@@ -463,9 +469,11 @@ msgstr "계정삭제"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You are going to delete your account. This action is nonreversible, and will"
-" result in following data being deleted:"
-msgstr "계정을 삭제하려는 경우, 이 작업은 복구할 수 없으며 다음과 같은 데이터들은 삭제됩니다:"
+"You are going to delete your account. This action is nonreversible, and will "
+"result in following data being deleted:"
+msgstr ""
+"계정을 삭제하려는 경우, 이 작업은 복구할 수 없으며 다음과 같은 데이터들은 삭"
+"제됩니다:"
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -477,7 +485,9 @@ msgstr "게시한 글과 연관된 IP주소가 삭제됩니다."
 msgid ""
 "Your username will become available for other user to rename to or for new "
 "user to register their account with."
-msgstr "유저 이름은 다른 사용자가 자신의 계정을 등록하거나 새 사용자가 자신의 계정을 등록하는데 사용됩니다."
+msgstr ""
+"유저 이름은 다른 사용자가 자신의 계정을 등록하거나 새 사용자가 자신의 계정을 "
+"등록하는데 사용됩니다."
 
 #: static/misago/js/misago.js:1
 msgid "Your e-mail will become available for use in new account registration."
@@ -485,10 +495,11 @@ msgstr "귀하의 이메일은 새 계정 등록에 사용할 수 있습니다."
 
 #: static/misago/js/misago.js:1
 msgid ""
-"All your posted content will NOT be deleted, but username associated with it"
-" will be changed to one shared by all deleted accounts."
+"All your posted content will NOT be deleted, but username associated with it "
+"will be changed to one shared by all deleted accounts."
 msgstr ""
-"게시된 모든 글들은 삭제되지 않지만, 게시된 콘텐츠와 관련된 사용자 이름은 삭제된 모든 계정에서 공유하는 사용자 이름으로 변경됩니다."
+"게시된 모든 글들은 삭제되지 않지만, 게시된 콘텐츠와 관련된 사용자 이름은 삭제"
+"된 모든 계정에서 공유하는 사용자 이름으로 변경됩니다."
 
 #: static/misago/js/misago.js:1
 msgid "Delete my account"
@@ -510,14 +521,18 @@ msgid ""
 "your download to be prepared. An e-mail with notification will be sent to "
 "you when your data is ready to be downloaded."
 msgstr ""
-"사이트에서 다운로드를 하려면, \"데이터 다운로드 요청\" 버튼을 클릭하세요. 보관할 데이터의 양과 동시에 다운로드하려는 사용자 수에 "
-"따라 다운로드가 준비되는 데 최대 며칠이 걸릴 수 있습니다. 데이터가 다운로드 될 준비가 되면 이메일이 전송됩니다."
+"사이트에서 다운로드를 하려면, \"데이터 다운로드 요청\" 버튼을 클릭하세요. 보"
+"관할 데이터의 양과 동시에 다운로드하려는 사용자 수에 따라 다운로드가 준비되"
+"는 데 최대 며칠이 걸릴 수 있습니다. 데이터가 다운로드 될 준비가 되면 이메일"
+"이 전송됩니다."
 
 #: static/misago/js/misago.js:1
 msgid ""
 "The download will only be available for limited amount of time, after which "
 "it will be deleted from the site and marked as expired."
-msgstr "다운로드는 제한된 시간 동안만 사용할 수 있으며, 그 후에는 사이트에서 삭제되고 만료됨으로 표시됩니다."
+msgstr ""
+"다운로드는 제한된 시간 동안만 사용할 수 있으며, 그 후에는 사이트에서 삭제되"
+"고 만료됨으로 표시됩니다."
 
 #: static/misago/js/misago.js:1
 msgid "Requested on"
@@ -599,7 +614,9 @@ msgstr "내 상태 숨기기"
 msgid ""
 "If you hide your presence, only members with permission to see hidden users "
 "will see when you are online."
-msgstr "만약 현재 상태를 숨기면, 숨겨진 사용자를 볼 수있는 권한이있는 구성원만 온라인 상태일 때 볼 수 있습니다."
+msgstr ""
+"만약 현재 상태를 숨기면, 숨겨진 사용자를 볼 수있는 권한이있는 구성원만 온라"
+"인 상태일 때 볼 수 있습니다."
 
 #: static/misago/js/misago.js:1
 msgid "Hide my presence from other users"
@@ -680,6 +697,10 @@ msgid "Change forgotten password"
 msgstr "비밀번호 변경"
 
 #: static/misago/js/misago.js:1
+msgid "%(user)s has been made new thread owner."
+msgstr "%(user)s 사용자는 새 스레드 소유자로 지정되었습니다."
+
+#: static/misago/js/misago.js:1
 msgid "You have left this thread."
 msgstr "이 스레드에서 나갔습니다. "
 
@@ -688,10 +709,6 @@ msgid "%(user)s has been removed from this thread."
 msgstr "%(user)s 사용자는 이 스레드에서 삭제되었습니다."
 
 #: static/misago/js/misago.js:1
-msgid "%(user)s has been made new thread owner."
-msgstr "%(user)s 사용자는 새 스레드 소유자로 지정되었습니다."
-
-#: static/misago/js/misago.js:1
 msgid "See profile"
 msgstr "프로필 보기"
 
@@ -800,7 +817,9 @@ msgstr "설문조사 길이"
 msgid ""
 "Enter number of days for which voting in this poll should be possible or "
 "zero to run this poll indefinitely."
-msgstr "이 설문조사에 투표 가능한 일 수를 입력하거나 무기한으로 투표하려면 0을 입력하십시오."
+msgstr ""
+"이 설문조사에 투표 가능한 일 수를 입력하거나 무기한으로 투표하려면 0을 입력하"
+"십시오."
 
 #: static/misago/js/misago.js:1
 msgid "Allowed choices"
@@ -833,8 +852,10 @@ msgid ""
 "can't be changed after poll's creation. Moderators may see voting details "
 "for all polls."
 msgstr ""
-"투표를 공개하면 투표 목록에 접근한 모든 사용자에게 어떤 사용자가 어떤 선택을,  어떤 시간에 투표하였는지 표시할 수 있게 허용됩니다. "
-"이 옵션은 설문 조사를 만든 후에는 변경할 수 없습니다. 중재자는 모든 투표에 대한 투표 세부 정보를 볼 수 있습니다."
+"투표를 공개하면 투표 목록에 접근한 모든 사용자에게 어떤 사용자가 어떤 선택"
+"을,  어떤 시간에 투표하였는지 표시할 수 있게 허용됩니다. 이 옵션은 설문 조사"
+"를 만든 후에는 변경할 수 없습니다. 중재자는 모든 투표에 대한 투표 세부 정보"
+"를 볼 수 있습니다."
 
 #: static/misago/js/misago.js:1
 msgid "Votes are public"
@@ -943,8 +964,7 @@ msgstr "되돌리기"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you with to revert this post to the state from before this "
-"edit?"
+"Are you sure you with to revert this post to the state from before this edit?"
 msgstr "편집하기 전의 상태로 되돌리시겠습니까?"
 
 #: static/misago/js/misago.js:1
@@ -1095,7 +1115,9 @@ msgid ""
 msgid_plural ""
 "Thread title should be at least %(limit_value)s characters long (it has "
 "%(show_value)s)."
-msgstr[0] "스레드의 제목은 () 글자 이상이어야 합니다. ( %(show_value)s 를 포함 해야합니다.)"
+msgstr[0] ""
+"스레드의 제목은 () 글자 이상이어야 합니다. ( %(show_value)s 를 포함 해야합니"
+"다.)"
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -1104,7 +1126,9 @@ msgid ""
 msgid_plural ""
 "Thread title cannot be longer than %(limit_value)s characters (it has "
 "%(show_value)s)."
-msgstr[0] "스레드의 제목은 %(limit_value)s글자 이하여야 합니다. (%(show_value)s를 포함 해야합니다.) "
+msgstr[0] ""
+"스레드의 제목은 %(limit_value)s글자 이하여야 합니다. (%(show_value)s를 포함 "
+"해야합니다.) "
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -1113,7 +1137,9 @@ msgid ""
 msgid_plural ""
 "Posted message should be at least %(limit_value)s characters long (it has "
 "%(show_value)s)."
-msgstr[0] "등록된 메시지는 %(limit_value)s글자 이상이어야 합니다. (%(show_value)s를 포함 해야합니다.)"
+msgstr[0] ""
+"등록된 메시지는 %(limit_value)s글자 이상이어야 합니다. (%(show_value)s를 포"
+"함 해야합니다.)"
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -1122,7 +1148,9 @@ msgid ""
 msgid_plural ""
 "Posted message cannot be longer than %(limit_value)s characters (it has "
 "%(show_value)s)."
-msgstr[0] "등록된 메시지는 %(limit_value)s이하여야 합니다.(%(show_value)s를 포함 해야합니다.)"
+msgstr[0] ""
+"등록된 메시지는 %(limit_value)s이하여야 합니다.(%(show_value)s를 포함 해야합"
+"니다.)"
 
 #: static/misago/js/misago.js:1
 msgid "Hide"
@@ -1348,16 +1376,18 @@ msgid "This post is hidden. Only users with permission may see its contents."
 msgstr "이 게시글은 비공개입니다. 허가된 사용자만 볼 수 있습니다."
 
 #: static/misago/js/misago.js:1
-msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
-msgstr "이 게시글은 승인되지 않았습니다. 게시글 승인에 권한이 있는 사용자와 작성자만 볼 수 있습니다."
-
-#: static/misago/js/misago.js:1
 msgid "This post is protected. Only moderators may change it."
 msgstr "이 게시글은 보호되고있습니다. 중재자만이 수정할 수 있습니다. "
 
 #: static/misago/js/misago.js:1
+msgid ""
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
+msgstr ""
+"이 게시글은 승인되지 않았습니다. 게시글 승인에 권한이 있는 사용자와 작성자만 "
+"볼 수 있습니다."
+
+#: static/misago/js/misago.js:1
 msgid "Liked"
 msgstr "좋아요"
 
@@ -1453,52 +1483,52 @@ msgid "%(username)s's details have been updated."
 msgstr "%(username)s사용자의 세부정보가 업데이트 되었습니다."
 
 #: static/misago/js/misago.js:1
-msgid "You have no started threads."
-msgstr "시작된 스레드가 없습니다."
+msgid "You have posted no messages."
+msgstr "작성한 메시지가 없습니다. "
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s started no threads."
-msgstr "%(username)s사용자의 시작된 스레드가 없습니다."
+msgid "%(username)s posted no messages."
+msgstr "%(username)s사용자가 작성한 메시지가 없습니다."
 
 #: static/misago/js/misago.js:1
-msgid "You have started %(threads)s thread."
-msgid_plural "You have started %(threads)s threads."
-msgstr[0] "습%(threads)s스레드를 시작 했습니다."
+msgid "You have posted %(posts)s message."
+msgid_plural "You have posted %(posts)s messages."
+msgstr[0] "%(posts)s개의 메시지를 작성하셨습니다."
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s has started %(threads)s thread."
-msgid_plural "%(username)s has started %(threads)s threads."
-msgstr[0] "%(username)s사용자가 %(threads)s스레드를 시작했습니다."
+msgid "%(username)s has posted %(posts)s message."
+msgid_plural "%(username)s has posted %(posts)s messages."
+msgstr[0] "%(username)s사용자는 %(posts)s개의 메시지를 작성하셨습니다."
 
 #: static/misago/js/misago.js:1
 msgid "Loading..."
 msgstr "Loading..."
 
 #: static/misago/js/misago.js:1
-msgid "Threads"
-msgstr "스레드"
+msgid "Posts"
+msgstr "게시글"
 
 #: static/misago/js/misago.js:1
-msgid "You have posted no messages."
-msgstr "작성한 메시지가 없습니다. "
+msgid "You have no started threads."
+msgstr "시작된 스레드가 없습니다."
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s posted no messages."
-msgstr "%(username)s사용자가 작성한 메시지가 없습니다."
+msgid "%(username)s started no threads."
+msgstr "%(username)s사용자의 시작된 스레드가 없습니다."
 
 #: static/misago/js/misago.js:1
-msgid "You have posted %(posts)s message."
-msgid_plural "You have posted %(posts)s messages."
-msgstr[0] "%(posts)s개의 메시지를 작성하셨습니다."
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
+msgstr[0] "습%(threads)s스레드를 시작 했습니다."
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s has posted %(posts)s message."
-msgid_plural "%(username)s has posted %(posts)s messages."
-msgstr[0] "%(username)s사용자는 %(posts)s개의 메시지를 작성하셨습니다."
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
+msgstr[0] "%(username)s사용자가 %(threads)s스레드를 시작했습니다."
 
 #: static/misago/js/misago.js:1
-msgid "Posts"
-msgstr "게시글"
+msgid "Threads"
+msgstr "스레드"
 
 #: static/misago/js/misago.js:1
 msgid "Show older activity"
@@ -1609,7 +1639,9 @@ msgstr "아바타 잠금"
 msgid ""
 "Locking user avatar will prohibit user from changing his avatar and will "
 "reset his/her avatar to default one."
-msgstr "사용자 아바타를 잠그면 사용자가 자신의 아바타를 변경할 수 없으며 기본 아바타로 재설정됩니다."
+msgstr ""
+"사용자 아바타를 잠그면 사용자가 자신의 아바타를 변경할 수 없으며 기본 아바타"
+"로 재설정됩니다."
 
 #: static/misago/js/misago.js:1
 msgid "Disallow user from changing avatar"
@@ -1637,7 +1669,9 @@ msgstr "스태프 메시지"
 msgid ""
 "Optional message for forum team members explaining why user is prohibited "
 "form changing avatar."
-msgstr "사용자가 아바타 변경할 수 없는 이유를 포럼팀 멤버들에게 설명하는 선택적인 메시지"
+msgstr ""
+"사용자가 아바타 변경할 수 없는 이유를 포럼팀 멤버들에게 설명하는 선택적인 메"
+"시지"
 
 #: static/misago/js/misago.js:1
 msgid "Avatar controls"
@@ -1650,7 +1684,8 @@ msgstr "사용자 이름이 변경되었습니다."
 #: static/misago/js/misago.js:1
 msgid ""
 "%(username)s's account, threads, posts and other content has been deleted."
-msgstr "%(username)s사용자의 계정, 스레드, 게시물 및 기타 컨텐츠가 삭제되었습니다."
+msgstr ""
+"%(username)s사용자의 계정, 스레드, 게시물 및 기타 컨텐츠가 삭제되었습니다."
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -1768,19 +1803,24 @@ msgstr "계정등록"
 msgid ""
 "%(username)s, your account has been created but you need to activate it "
 "before you will be able to sign in."
-msgstr "%(username)s사용자의 계정이 생성되었지만, 로그인하려면 활성화해야 합니다."
+msgstr ""
+"%(username)s사용자의 계정이 생성되었지만, 로그인하려면 활성화해야 합니다."
 
 #: static/misago/js/misago.js:1
 msgid ""
 "%(username)s, your account has been created but board administrator will "
 "have to activate it before you will be able to sign in."
-msgstr "%(username)s사용자의 계정이 생성되었지만, 보드 관리자가 활성화해야 로그인할 수 있습니다."
+msgstr ""
+"%(username)s사용자의 계정이 생성되었지만, 보드 관리자가 활성화해야 로그인할 "
+"수 있습니다."
 
 #: static/misago/js/misago.js:1
 msgid ""
 "We have sent an e-mail to %(email)s with link that you have to click to "
 "activate your account."
-msgstr "귀하의 계정을 활성화하기 위해 클릭해야하는 링크가 포함된 메일을 %(email)s로 보냈습니다."
+msgstr ""
+"귀하의 계정을 활성화하기 위해 클릭해야하는 링크가 포함된 메일을 %(email)s로 "
+"보냈습니다."
 
 #: static/misago/js/misago.js:1
 msgid "We will send an e-mail to %(email)s when this takes place."
@@ -1955,8 +1995,7 @@ msgstr "%(user)s사용자의 마지막 답글 %(date)s"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you want to merge selected posts? This action is not "
-"reversible!"
+"Are you sure you want to merge selected posts? This action is not reversible!"
 msgstr "선택한 게시물을 병합하시겠습니까? 이 작업은 되돌릴 수 없습니다!"
 
 #: static/misago/js/misago.js:1
@@ -2049,7 +2088,8 @@ msgstr "병합하기 원하는 스레드에 연결"
 msgid ""
 "Merge will delete current thread and move its contents to the thread "
 "specified here."
-msgstr "병합하면 현재 스레드가 삭제되고 그 내용이 여기에 지정된 스레드로 이동된다."
+msgstr ""
+"병합하면 현재 스레드가 삭제되고 그 내용이 여기에 지정된 스레드로 이동된다."
 
 #: static/misago/js/misago.js:1
 msgid "Merge thread"
@@ -2154,7 +2194,9 @@ msgid ""
 msgid_plural ""
 "There are %(threads)s new or updated threads. Click this message to show "
 "them."
-msgstr[0] "%(threads)s개의 새 스레드 또는 업데이트 된 스레드가 있습니다. 확인하려면 이 메시지를 클릭하세요."
+msgstr[0] ""
+"%(threads)s개의 새 스레드 또는 업데이트 된 스레드가 있습니다. 확인하려면 이 "
+"메시지를 클릭하세요."
 
 #: static/misago/js/misago.js:1
 msgid "New posts"
@@ -2292,9 +2334,10 @@ msgstr "스레드를 이동할 카테고리가 없기 때문에 스레드를 이
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You need permission to start threads in category to be able to merge threads"
-" to it."
-msgstr "카테고리에 스레드를 병합하려면, 스레드를 시작할 수 있는 권한이 있어야합니다."
+"You need permission to start threads in category to be able to merge threads "
+"to it."
+msgstr ""
+"카테고리에 스레드를 병합하려면, 스레드를 시작할 수 있는 권한이 있어야합니다."
 
 #: static/misago/js/misago.js:1
 msgid "Selected threads were moved."
@@ -2304,7 +2347,8 @@ msgstr "선택한 스레드가 이동되었습니다."
 msgid ""
 "You need permission to start threads in category to be able to move threads "
 "to it."
-msgstr "카테고리로 스레드를 이동하려면, 스레드를 시작할 수 있는 권한이 있어야합니다."
+msgstr ""
+"카테고리로 스레드를 이동하려면, 스레드를 시작할 수 있는 권한이 있어야합니다."
 
 #: static/misago/js/misago.js:1
 msgid "Select all"
@@ -2493,7 +2537,8 @@ msgstr "아니요"
 msgid ""
 "Private threads are threads which only those that started them and those "
 "they have invited may see and participate in."
-msgstr "비공개 스레드는 시작한 사람과 초대받은 사람만이 보고 참여할 수 있습니다."
+msgstr ""
+"비공개 스레드는 시작한 사람과 초대받은 사람만이 보고 참여할 수 있습니다."
 
 #: static/misago/js/misago.js:1
 msgid "You aren't participating in any private threads."
@@ -2548,17 +2593,21 @@ msgid "You are banned"
 msgstr "금지되었습니다."
 
 #: static/misago/js/misago.js:1
-msgid "You have to accept the terms of service."
-msgstr "서비스 약관에 동의해야합니다."
+msgid "Valid password must be at least %(limit_value)s character long."
+msgid_plural "Valid password must be at least %(limit_value)s characters long."
+msgstr[0] "비밀번호는 최소한 %(limit_value)s글자보다 길어야합니다."
 
 #: static/misago/js/misago.js:1
 msgid "You have to accept the privacy policy."
 msgstr "개인 정보 보호 정책에 동의해야합니다"
 
 #: static/misago/js/misago.js:1
-msgid "Username must be at least %(limit_value)s character long."
-msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] "사용자 이름은 %(limit_value)s글자 이상이어야합니다."
+msgid "You have to accept the terms of service."
+msgstr "서비스 약관에 동의해야합니다."
+
+#: static/misago/js/misago.js:1
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr "사용자이름은 알파벳 문자와 숫자만 포함할 수 있습니다."
 
 #: static/misago/js/misago.js:1
 msgid "Username cannot be longer than %(limit_value)s character."
@@ -2566,14 +2615,9 @@ msgid_plural "Username cannot be longer than %(limit_value)s characters."
 msgstr[0] "사용자 이름은 %(limit_value)s글자 이하여야합니다."
 
 #: static/misago/js/misago.js:1
-msgid "Username can only contain latin alphabet letters and digits."
-msgstr "사용자이름은 알파벳 문자와 숫자만 포함할 수 있습니다."
-
-#: static/misago/js/misago.js:1
-msgid "Valid password must be at least %(limit_value)s character long."
-msgid_plural ""
-"Valid password must be at least %(limit_value)s characters long."
-msgstr[0] "비밀번호는 최소한 %(limit_value)s글자보다 길어야합니다."
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
+msgstr[0] "사용자 이름은 %(limit_value)s글자 이상이어야합니다."
 
 #: static/misago/js/misago.js:1
 msgid "This field is required."
@@ -2586,7 +2630,9 @@ msgid ""
 msgid_plural ""
 "Ensure this value has at least %(limit_value)s characters (it has "
 "%(show_value)s)."
-msgstr[0] "이 값은 %(limit_value)s 글자 이상이어야 합니다. (%(show_value)s를 포함 해야합니다.)"
+msgstr[0] ""
+"이 값은 %(limit_value)s 글자 이상이어야 합니다. (%(show_value)s를 포함 해야합"
+"니다.)"
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -2596,4 +2642,5 @@ msgid_plural ""
 "Ensure this value has at most %(limit_value)s characters (it has "
 "%(show_value)s)."
 msgstr[0] ""
-"스레드의 제목은 %(limit_value)s 글자 이상이어야 합니다. ( %(show_value)s 를 포함 해야합니다.)"
+"스레드의 제목은 %(limit_value)s 글자 이상이어야 합니다. ( %(show_value)s 를 "
+"포함 해야합니다.)"

BIN
misago/locale/nl/LC_MESSAGES/django.mo


+ 7963 - 0
misago/locale/nl/LC_MESSAGES/django.po

@@ -0,0 +1,7963 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: acl/admin/__init__.py:24 templates/misago/acl_debug.html:16
+#: templates/misago/admin/ranks/form.html:58
+msgid "Permissions"
+msgstr ""
+
+#: acl/admin/forms.py:9 categories/admin/forms.py:238
+msgid "Role name"
+msgstr ""
+
+#: acl/admin/views.py:15 categories/admin/views/perms.py:23
+msgid "Requested role does not exist."
+msgstr ""
+
+#: acl/admin/views.py:51 categories/admin/views/perms.py:62
+msgid "Form contains errors."
+msgstr ""
+
+#: acl/admin/views.py:62 categories/admin/views/perms.py:73
+#, python-format
+msgid "New role \"%(name)s\" has been saved."
+msgstr ""
+
+#: acl/admin/views.py:66 categories/admin/views/perms.py:77
+#, python-format
+msgid "Role \"%(name)s\" has been changed."
+msgstr ""
+
+#: acl/admin/views.py:72 categories/admin/views/perms.py:83
+#, python-format
+msgid "Role \"%(name)s\" is special role and can't be deleted."
+msgstr ""
+
+#: acl/admin/views.py:77 categories/admin/views/perms.py:88
+#, python-format
+msgid "Role \"%(name)s\" has been deleted."
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:10
+msgid "Member"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:48
+msgid "Guest"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:78
+#: categories/migrations/0003_categories_roles.py:71
+#: categories/migrations/0003_categories_roles.py:117
+#: users/migrations/0004_default_ranks.py:30
+msgid "Moderator"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:133
+msgid "Renaming users"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:141
+msgid "Banning users"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:155
+#: users/migrations/0004_default_ranks.py:33 users/permissions/delete.py:23
+msgid "Deleting users"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:166
+msgid "Can't be blocked"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:174
+#: threads/permissions/privatethreads.py:33
+#: threads/threadtypes/privatethread.py:12 threads/viewmodels/thread.py:147
+#: users/migrations/0004_default_ranks.py:31
+#: users/migrations/0004_default_ranks.py:35
+msgid "Private threads"
+msgstr ""
+
+#: acl/migrations/0003_default_roles.py:189
+#: users/migrations/0004_default_ranks.py:32
+msgid "Private threads moderator"
+msgstr ""
+
+#: acl/panels.py:8
+msgid "Misago User ACL"
+msgstr ""
+
+#: acl/panels.py:17
+msgid "Anonymous user"
+msgstr ""
+
+#: admin/admin.py:6 templates/misago/admin/dashboard/index.html:5
+#: templates/misago/admin/dashboard/index.html:11
+msgid "Dashboard"
+msgstr ""
+
+#: admin/auth.py:29
+msgid "Your admin session has expired."
+msgstr ""
+
+#: admin/forms.py:46
+msgid ""
+"Value must be a 7-character string specifying an RGB color in a hexadecimal "
+"format."
+msgstr ""
+
+#: admin/forms.py:67 templates/misago/admin/users/edit.html:145
+#: templates/misago/admin/users/edit.html:163
+#: templates/misago/admin/users/edit.html:265 users/admin/forms.py:582
+msgid "Yes"
+msgstr ""
+
+#: admin/forms.py:68 templates/misago/admin/users/edit.html:149
+#: templates/misago/admin/users/edit.html:167
+#: templates/misago/admin/users/edit.html:269
+#: threads/permissions/bestanswers.py:34 threads/permissions/bestanswers.py:40
+#: threads/permissions/polls.py:34 threads/permissions/polls.py:40
+#: threads/permissions/polls.py:46 threads/permissions/threads.py:120
+#: threads/permissions/threads.py:130 threads/permissions/threads.py:142
+#: threads/permissions/threads.py:149 threads/permissions/threads.py:159
+#: threads/permissions/threads.py:168 threads/permissions/threads.py:180
+#: threads/permissions/threads.py:188 threads/permissions/threads.py:218
+#: users/admin/forms.py:582 users/models/user.py:105
+msgid "No"
+msgstr ""
+
+#: admin/views/auth.py:39
+msgid "Your admin session has been closed."
+msgstr ""
+
+#: admin/views/generic/list.py:39
+msgid "Selected: 0"
+msgstr ""
+
+#: admin/views/generic/list.py:40
+msgid "Select items"
+msgstr ""
+
+#: admin/views/generic/list.py:288 admin/views/generic/list.py:293
+msgid "You have to select one or more items."
+msgstr ""
+
+#: admin/views/generic/list.py:307
+msgid "Action is not allowed."
+msgstr ""
+
+#: categories/admin/__init__.py:65 templates/misago/categories/base.html:7
+#: templates/misago/categories/base.html:29
+#: templates/misago/categories/base.html:38
+#: templates/misago/categories/header.html:8 templates/misago/navbar.html:25
+#: templates/misago/navbar.html:31
+msgid "Categories"
+msgstr ""
+
+#: categories/admin/__init__.py:72
+msgid "Category permissions"
+msgstr ""
+
+#: categories/admin/forms.py:46
+#: templates/misago/admin/themes/assets/css.html:31
+#: templates/misago/admin/themes/assets/media.html:21 themes/admin/forms.py:26
+#: themes/admin/forms.py:53 themes/admin/forms.py:174 users/admin/forms.py:386
+msgid "Name"
+msgstr ""
+
+#: categories/admin/forms.py:48 users/admin/forms.py:402
+msgid "Description"
+msgstr ""
+
+#: categories/admin/forms.py:52
+msgid "Optional description explaining category intented purpose."
+msgstr ""
+
+#: categories/admin/forms.py:55 menus/admin/forms.py:20
+#: templates/misago/admin/categories/list.html:18
+#: templates/misago/admin/ranks/list.html:20 users/admin/forms.py:419
+msgid "CSS class"
+msgstr ""
+
+#: categories/admin/forms.py:58
+msgid ""
+"Optional CSS class used to customize this category's appearance from "
+"templates."
+msgstr ""
+
+#: categories/admin/forms.py:63
+msgid "Closed category"
+msgstr ""
+
+#: categories/admin/forms.py:66
+msgid "Only members with valid permissions can post in closed categories."
+msgstr ""
+
+#: categories/admin/forms.py:70 conf/admin/__init__.py:79
+#: templates/misago/admin/categories/list.html:19
+#: templates/misago/admin/dashboard/totals.html:19
+#: templates/misago/navbar.html:20 templates/misago/navbar.html:36
+#: templates/misago/profile/threads.html:5
+#: templates/misago/profile/threads.html:8
+#: templates/misago/profile/threads.html:9
+#: templates/misago/threadslist/category.html:68
+#: templates/misago/threadslist/threads.html:14
+#: templates/misago/threadslist/threads.html:16
+#: templates/misago/threadslist/threads.html:33
+#: templates/misago/threadslist/threads.html:42
+#: templates/misago/threadslist/threads.html:66
+#: threads/permissions/threads.py:73 threads/permissions/threads.py:104
+#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:97
+msgid "Threads"
+msgstr ""
+
+#: categories/admin/forms.py:73
+msgid "All threads started in this category will require moderator approval."
+msgstr ""
+
+#: categories/admin/forms.py:77
+msgid "Replies"
+msgstr ""
+
+#: categories/admin/forms.py:80
+msgid "All replies posted in this category will require moderator approval."
+msgstr ""
+
+#: categories/admin/forms.py:84
+msgid "Edits"
+msgstr ""
+
+#: categories/admin/forms.py:87
+msgid ""
+"Will make all edited replies return to unapproved state for moderator to "
+"review."
+msgstr ""
+
+#: categories/admin/forms.py:92
+msgid "Thread age"
+msgstr ""
+
+#: categories/admin/forms.py:95
+msgid ""
+"Prune thread if number of days since its creation is greater than specified. "
+"Enter 0 to disable this pruning criteria."
+msgstr ""
+
+#: categories/admin/forms.py:100
+msgid "Last reply"
+msgstr ""
+
+#: categories/admin/forms.py:103
+msgid ""
+"Prune thread if number of days since last reply is greater than specified. "
+"Enter 0 to disable this pruning criteria."
+msgstr ""
+
+#: categories/admin/forms.py:126
+msgid "Permissions cannot be copied from category into itself."
+msgstr ""
+
+#: categories/admin/forms.py:133
+msgid "Category cannot act as archive for itself."
+msgstr ""
+
+#: categories/admin/forms.py:155
+msgid "Parent category"
+msgstr ""
+
+#: categories/admin/forms.py:161
+msgid "Copy permissions"
+msgstr ""
+
+#: categories/admin/forms.py:163
+msgid ""
+"You can replace this category permissions with permissions copied from "
+"category selected here."
+msgstr ""
+
+#: categories/admin/forms.py:167
+msgid "Don't copy permissions"
+msgstr ""
+
+#: categories/admin/forms.py:171
+msgid "Archive"
+msgstr ""
+
+#: categories/admin/forms.py:173
+msgid ""
+"Instead of being deleted, pruned threads can be moved to designated category."
+msgstr ""
+
+#: categories/admin/forms.py:177
+msgid "Don't archive pruned threads"
+msgstr ""
+
+#: categories/admin/forms.py:194
+msgid "You are trying to move this category threads to itself."
+msgstr ""
+
+#: categories/admin/forms.py:200
+msgid ""
+"You are trying to move this category threads to a child category that will "
+"be deleted together with this category."
+msgstr ""
+
+#: categories/admin/forms.py:213
+msgid "Move category threads to"
+msgstr ""
+
+#: categories/admin/forms.py:216 categories/admin/forms.py:230
+msgid "Delete with category"
+msgstr ""
+
+#: categories/admin/forms.py:228
+msgid "Move child categories to"
+msgstr ""
+
+#: categories/admin/forms.py:249 categories/admin/forms.py:264
+#: templates/misago/acl_debug.html:15 templates/misago/admin/roles/list.html:16
+msgid "Role"
+msgstr ""
+
+#: categories/admin/forms.py:253 categories/admin/forms.py:268
+msgid "No access"
+msgstr ""
+
+#: categories/admin/views/categories.py:17
+msgid "Requested category does not exist."
+msgstr ""
+
+#: categories/admin/views/categories.py:96
+#, python-format
+msgid "New category \"%(name)s\" has been saved."
+msgstr ""
+
+#: categories/admin/views/categories.py:100
+#, python-format
+msgid "Category \"%(name)s\" has been edited."
+msgstr ""
+
+#: categories/admin/views/categories.py:104
+#, python-format
+msgid "Category \"%(name)s\" has been deleted."
+msgstr ""
+
+#: categories/admin/views/categories.py:154
+#, python-format
+msgid "Category \"%(name)s\" has been moved below \"%(other)s\"."
+msgstr ""
+
+#: categories/admin/views/categories.py:170
+#, python-format
+msgid "Category \"%(name)s\" has been moved above \"%(other)s\"."
+msgstr ""
+
+#: categories/admin/views/perms.py:134
+#, python-format
+msgid "Category %(name)s permissions have been changed."
+msgstr ""
+
+#: categories/admin/views/perms.py:145
+#: templates/misago/admin/categoryroles/categoryroles.html:37
+#: templates/misago/admin/categoryroles/rolecategories.html:31
+msgid "Change permissions"
+msgstr ""
+
+#: categories/admin/views/perms.py:158
+msgid "No categories exist."
+msgstr ""
+
+#: categories/admin/views/perms.py:197
+#, python-format
+msgid "Category permissions for role %(name)s have been changed."
+msgstr ""
+
+#: categories/admin/views/perms.py:208
+msgid "Categories permissions"
+msgstr ""
+
+#: categories/migrations/0002_default_categories.py:31
+msgid "First category"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:10
+msgid "See only"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:18
+msgid "Read only"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:33
+msgid "Reply to threads"
+msgstr ""
+
+#: categories/migrations/0003_categories_roles.py:51
+msgid "Start and reply threads"
+msgstr ""
+
+#: categories/migrations/0006_moderation_queue_roles.py:10
+msgid "In moderation queue"
+msgstr ""
+
+#: categories/migrations/0007_best_answers_roles.py:11
+msgid "Q&A user"
+msgstr ""
+
+#: categories/migrations/0007_best_answers_roles.py:23
+msgid "Q&A moderator"
+msgstr ""
+
+#: categories/permissions.py:13
+msgid "Category access"
+msgstr ""
+
+#: categories/permissions.py:15
+msgid "Can see category"
+msgstr ""
+
+#: categories/permissions.py:16
+msgid "Can see category contents"
+msgstr ""
+
+#: categories/permissions.py:119
+#, python-format
+msgid "You don't have permission to browse \"%(category)s\" contents."
+msgstr ""
+
+#: conf/admin/__init__.py:41 templates/misago/admin/conf/index.html:5
+#: templates/misago/admin/themes/form.html:48
+msgid "Settings"
+msgstr ""
+
+#: conf/admin/__init__.py:48 templates/misago/admin/socialauth/form.html:27
+msgid "General"
+msgstr ""
+
+#: conf/admin/__init__.py:49
+msgid "Change forum details like name, description or footer."
+msgstr ""
+
+#: conf/admin/__init__.py:54 templates/misago/admin/dashboard/totals.html:7
+#: templates/misago/admin/users/ban.html:22 templates/misago/navbar.html:42
+#: templates/misago/userslists/base.html:5
+#: templates/misago/userslists/base.html:14 users/admin/__init__.py:74
+#: users/search.py:16
+msgid "Users"
+msgstr ""
+
+#: conf/admin/__init__.py:56
+msgid "Customize user accounts default behavior and features availability."
+msgstr ""
+
+#: conf/admin/__init__.py:63
+msgid "Captcha"
+msgstr ""
+
+#: conf/admin/__init__.py:65
+msgid "Setup protection against automatic registrations on the site."
+msgstr ""
+
+#: conf/admin/__init__.py:72 templates/misago/admin/dashboard/analytics.html:7
+#: templates/misago/admin/dashboard/index.html:40
+msgid "Analytics"
+msgstr ""
+
+#: conf/admin/__init__.py:73
+msgid "Enable Google Analytics or setup Google Site Verification."
+msgstr ""
+
+#: conf/admin/__init__.py:80
+msgid "Threads, posts, polls and attachments options."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:17
+msgid "Tracking ID"
+msgstr ""
+
+#: conf/admin/forms/analytics.py:19
+msgid ""
+"Setting the Tracking ID will result in gtag.js file being included in your "
+"site's HTML markup, enabling Google Analytics integration."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:25
+msgid "Site verification token"
+msgstr ""
+
+#: conf/admin/forms/analytics.py:27
+msgid ""
+"This token was extracted from uploaded site verification file. To change it, "
+"upload new verification file."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:34
+msgid "Upload site verification file"
+msgstr ""
+
+#: conf/admin/forms/analytics.py:36
+msgid ""
+"Site verification file can be downloaded from Search Console's \"Ownership "
+"verification\" page."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:48
+msgid "Submitted file type is not HTML."
+msgstr ""
+
+#: conf/admin/forms/analytics.py:54
+msgid "Submitted file doesn't contain a verification code."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:21
+msgid "Enable CAPTCHA"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:23
+msgid "No CAPTCHA"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:24
+msgid "reCaptcha"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:25
+#: templates/misago/admin/conf/captcha_settings.html:25
+msgid "Question and answer"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:31
+msgid "Site key"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:34
+msgid "Secret key"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:38
+msgid "Test question"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:41
+msgid "Question help text"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:44
+msgid "Valid answers"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:45
+msgid "Enter each answer in new line. Answers are case-insensitive."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:52
+msgid "Validate new registrations against SFS database"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:54
+msgid ""
+"Turning this option on will result in Misago validating new user's e-mail "
+"and IP address against SFS database."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:59
+msgid "Minimum SFS confidence required"
+msgstr ""
+
+#: conf/admin/forms/captcha.py:61
+msgid ""
+"SFS compares user e-mail and IP address with database of known spammers and "
+"assigns the confidence score in range of 0 to 100 that user is a spammer "
+"themselves. If this score is equal or higher than specified, Misago will "
+"block user from registering and ban their IP address for 24 hours."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:79
+msgid "You need to enter site key if selected CAPTCHA type is reCaptcha."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:88
+msgid "You need to enter secret key if selected CAPTCHA type is reCaptcha."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:97
+msgid "You need to set question if selected CAPTCHA type is Q&A."
+msgstr ""
+
+#: conf/admin/forms/captcha.py:104
+msgid "You need to set question answers if selected CAPTCHA type is Q&A."
+msgstr ""
+
+#: conf/admin/forms/general.py:25
+msgid "Forum name"
+msgstr ""
+
+#: conf/admin/forms/general.py:26
+msgid "Forum address"
+msgstr ""
+
+#: conf/admin/forms/general.py:29
+msgid "Header text"
+msgstr ""
+
+#: conf/admin/forms/general.py:30
+msgid "This text will replace forum name in page header."
+msgstr ""
+
+#: conf/admin/forms/general.py:34
+msgid "Page title"
+msgstr ""
+
+#: conf/admin/forms/general.py:36
+msgid "Meta Description"
+msgstr ""
+
+#: conf/admin/forms/general.py:38
+msgid ""
+"Short description of your forum that search and social sites may display "
+"next to link to your forum's index."
+msgstr ""
+
+#: conf/admin/forms/general.py:46
+#: templates/misago/admin/conf/general_settings.html:17
+msgid "Logo"
+msgstr ""
+
+#: conf/admin/forms/general.py:47
+msgid "Image that will displayed in forum navbar."
+msgstr ""
+
+#: conf/admin/forms/general.py:50
+msgid "Delete logo image"
+msgstr ""
+
+#: conf/admin/forms/general.py:52
+msgid "Small logo"
+msgstr ""
+
+#: conf/admin/forms/general.py:54
+msgid ""
+"Image that will be displayed in compact forum navbar. When set, it will "
+"replace icon pointing to forum index."
+msgstr ""
+
+#: conf/admin/forms/general.py:60
+msgid "Delete small logo image"
+msgstr ""
+
+#: conf/admin/forms/general.py:63 legal/admin/forms.py:34
+msgid "Text"
+msgstr ""
+
+#: conf/admin/forms/general.py:65
+msgid ""
+"Text displayed in forum navbar. If logo image was uploaded, text will be "
+"displayed right next to it. Never displayed by the compact navbar."
+msgstr ""
+
+#: conf/admin/forms/general.py:73
+msgid "Image"
+msgstr ""
+
+#: conf/admin/forms/general.py:75
+msgid ""
+"Custom image that will appear next to links to your forum posted on social "
+"sites. Facebook recommends that this image should be 1200 pixels wide and "
+"630 pixels tall."
+msgstr ""
+
+#: conf/admin/forms/general.py:81
+msgid "Delete image"
+msgstr ""
+
+#: conf/admin/forms/general.py:83
+msgid "Replace image with avatar on user profiles"
+msgstr ""
+
+#: conf/admin/forms/general.py:86
+msgid "Replace image with avatar on threads"
+msgstr ""
+
+#: conf/admin/forms/general.py:90
+#: templates/misago/admin/conf/general_settings.html:59
+msgid "Forum footnote"
+msgstr ""
+
+#: conf/admin/forms/general.py:91
+msgid "Short message displayed in forum footer."
+msgstr ""
+
+#: conf/admin/forms/general.py:96
+msgid "E-mails footer"
+msgstr ""
+
+#: conf/admin/forms/general.py:98
+msgid "Optional short message included at the end of e-mails sent by forum."
+msgstr ""
+
+#: conf/admin/forms/general.py:109
+#, python-format
+msgid ""
+"Misago uses this setting to build links in e-mails sent to site users. "
+"Address under which site is running appears to be \"%(address)s\"."
+msgstr ""
+
+#: conf/admin/forms/threads.py:27
+msgid "Daily post limit per user"
+msgstr ""
+
+#: conf/admin/forms/threads.py:29
+msgid ""
+"Daily limit of posts that may be posted by single user. Fail-safe for "
+"situations when forum is flooded by spam bots. Change to 0 to remove the "
+"limit."
+msgstr ""
+
+#: conf/admin/forms/threads.py:36
+msgid "Hourly post limit per user"
+msgstr ""
+
+#: conf/admin/forms/threads.py:38
+msgid ""
+"Hourly limit of posts that may be posted by single user. Fail-safe for "
+"situations when forum is flooded by spam bots. Change to 0 to remove the "
+"limit."
+msgstr ""
+
+#: conf/admin/forms/threads.py:45
+msgid "Maximum number of attachments per post"
+msgstr ""
+
+#: conf/admin/forms/threads.py:48
+msgid "Maximum allowed post length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:51
+msgid "Minimum required post length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:54
+msgid "Maximum allowed thread title length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:57
+msgid "Minimum required thread title length"
+msgstr ""
+
+#: conf/admin/forms/threads.py:60
+msgid "Unused attachments lifetime"
+msgstr ""
+
+#: conf/admin/forms/threads.py:62
+msgid ""
+"Period of time (in hours) after which user-uploaded files that weren't "
+"attached to any post are deleted from disk."
+msgstr ""
+
+#: conf/admin/forms/threads.py:69
+msgid "Read-tracker cutoff"
+msgstr ""
+
+#: conf/admin/forms/threads.py:71
+msgid ""
+"Controls amount of data used by read-tracking system. All content older than "
+"number of days specified in this setting is considered old and read, even if "
+"the opposite is true for the user. Active forums can try lowering this value "
+"while less active ones may wish to increase it instead. "
+msgstr ""
+
+#: conf/admin/forms/threads.py:80
+msgid "Number of threads displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/threads.py:84
+msgid "Number of posts displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/threads.py:87 conf/admin/forms/users.py:141
+msgid "Maximum orphans"
+msgstr ""
+
+#: conf/admin/forms/threads.py:89
+msgid ""
+"If number of posts to be displayed on the last page is less or equal to "
+"number specified in this setting, those posts will instead be displayed on "
+"previous page, reducing the total number of pages in thread."
+msgstr ""
+
+#: conf/admin/forms/threads.py:96
+msgid "Maximum number of events displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/threads.py:100
+msgid "Permission denied"
+msgstr ""
+
+#: conf/admin/forms/threads.py:102
+msgid ""
+"Attachments proxy will display this image in place of default one when user "
+"tries to access attachment they have no permission to see."
+msgstr ""
+
+#: conf/admin/forms/threads.py:108
+msgid "Delete custom permission denied image"
+msgstr ""
+
+#: conf/admin/forms/threads.py:111
+msgid "Not found"
+msgstr ""
+
+#: conf/admin/forms/threads.py:113
+msgid ""
+"Attachments proxy will display this image in place of default one when user "
+"tries to access attachment that doesn't exist."
+msgstr ""
+
+#: conf/admin/forms/threads.py:119
+msgid "Delete custom not found image"
+msgstr ""
+
+#: conf/admin/forms/threads.py:129
+msgid "This value must be lower than number of posts per page."
+msgstr ""
+
+#: conf/admin/forms/users.py:37
+msgid "Require new accounts activation"
+msgstr ""
+
+#: conf/admin/forms/users.py:39
+msgid "No activation required"
+msgstr ""
+
+#: conf/admin/forms/users.py:40
+msgid "Activation token sent to user e-mail"
+msgstr ""
+
+#: conf/admin/forms/users.py:41
+msgid "Activation by administrator"
+msgstr ""
+
+#: conf/admin/forms/users.py:42
+msgid "Disable new registrations"
+msgstr ""
+
+#: conf/admin/forms/users.py:48
+msgid ""
+"Delete new inactive accounts if they weren't activated within this number of "
+"days"
+msgstr ""
+
+#: conf/admin/forms/users.py:51
+msgid "Enter 0 to never delete inactive new accounts."
+msgstr ""
+
+#: conf/admin/forms/users.py:56
+msgid "Minimum allowed username length"
+msgstr ""
+
+#: conf/admin/forms/users.py:59
+msgid "Maximum allowed username length"
+msgstr ""
+
+#: conf/admin/forms/users.py:63
+msgid "Allow custom avatar uploads"
+msgstr ""
+
+#: conf/admin/forms/users.py:65
+msgid ""
+"Turning this option off will forbid forum users from uploading custom "
+"avatars. Good for forums adressed at young users."
+msgstr ""
+
+#: conf/admin/forms/users.py:70
+msgid "Maximum size of uploaded avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:71
+msgid "Enter maximum allowed file size (in KB) for avatar uploads."
+msgstr ""
+
+#: conf/admin/forms/users.py:75
+msgid "Default avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:77 conf/admin/forms/users.py:90
+msgid "Individual"
+msgstr ""
+
+#: conf/admin/forms/users.py:78
+msgid "Gravatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:79 conf/admin/forms/users.py:91
+msgid "Random avatar from gallery"
+msgstr ""
+
+#: conf/admin/forms/users.py:84
+msgid "Fallback for default gravatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:86
+msgid ""
+"Select which avatar to use when user has no gravatar associated with their e-"
+"mail address."
+msgstr ""
+
+#: conf/admin/forms/users.py:96
+msgid "Blank avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:98
+msgid ""
+"Blank avatar is displayed in the interface when user's avatar is not "
+"available: when user was deleted or is guest. Uploaded image should be a "
+"square."
+msgstr ""
+
+#: conf/admin/forms/users.py:105
+msgid "Delete custom blank avatar"
+msgstr ""
+
+#: conf/admin/forms/users.py:109
+msgid "Maximum allowed signature length"
+msgstr ""
+
+#: conf/admin/forms/users.py:113 threads/permissions/threads.py:110
+#: users/admin/forms.py:175
+msgid "Started threads"
+msgstr ""
+
+#: conf/admin/forms/users.py:115 conf/admin/forms/users.py:127
+msgid "Don't watch"
+msgstr ""
+
+#: conf/admin/forms/users.py:116 conf/admin/forms/users.py:128
+msgid "Put on watched threads list"
+msgstr ""
+
+#: conf/admin/forms/users.py:119 conf/admin/forms/users.py:131
+msgid "Put on watched threads list and e-mail user when somebody replies"
+msgstr ""
+
+#: conf/admin/forms/users.py:125
+msgid "Replied threads"
+msgstr ""
+
+#: conf/admin/forms/users.py:138
+msgid "Number of users displayed on a single page"
+msgstr ""
+
+#: conf/admin/forms/users.py:143
+msgid ""
+"If number of users to be displayed on the last page is less or equal to "
+"number specified in this setting, those users will instead be displayed on "
+"previous page, reducing the total number of pages on the list."
+msgstr ""
+
+#: conf/admin/forms/users.py:151
+msgid "Maximum age in days of posts that should count to the ranking"
+msgstr ""
+
+#: conf/admin/forms/users.py:155
+msgid "Maximum number of ranked users"
+msgstr ""
+
+#: conf/admin/forms/users.py:158
+msgid "Allow users to download their data"
+msgstr ""
+
+#: conf/admin/forms/users.py:160
+msgid "Maximum age in hours of data downloads before they expire"
+msgstr ""
+
+#: conf/admin/forms/users.py:162
+msgid ""
+"Data downloads older than specified will have their files deleted and will "
+"be marked as expired."
+msgstr ""
+
+#: conf/admin/forms/users.py:169
+msgid "Allow users to delete their own accounts"
+msgstr ""
+
+#: conf/admin/forms/users.py:173
+msgid "IP storage time"
+msgstr ""
+
+#: conf/admin/forms/users.py:175
+msgid ""
+"Number of days for which users IP addresses are stored in forum database. "
+"Enter zero to store registered IP addresses forever. Deleting user account "
+"always deletes the IP addresses associated with it."
+msgstr ""
+
+#: conf/admin/forms/users.py:183
+msgid "Anonymous username"
+msgstr ""
+
+#: conf/admin/forms/users.py:185
+msgid ""
+"This username is displayed instead of delete user's actual name next to "
+"their content."
+msgstr ""
+
+#: conf/admin/forms/users.py:202 icons/admin/forms.py:117
+#, python-format
+msgid "Uploaded image's edge should be at least %(size)s pixels long."
+msgstr ""
+
+#: conf/admin/forms/users.py:215
+msgid "This value must be lower than number of users per page."
+msgstr ""
+
+#: conf/admin/views.py:39
+msgid "Settings have been saved."
+msgstr ""
+
+#: core/errorpages.py:51
+msgid "Permission denied."
+msgstr ""
+
+#: core/errorpages.py:80
+msgid ""
+"A problem was encountered when disconnecting your account from the remote "
+"site."
+msgstr ""
+
+#: core/errorpages.py:84
+msgid ""
+"You are not allowed to disconnect your account from the other site, because "
+"currently it's the only way to sign in to your account."
+msgstr ""
+
+#: core/errorpages.py:89
+#, python-format
+msgid "A problem was encountered when signing you in using %(backend)s."
+msgstr ""
+
+#: core/errorpages.py:93
+msgid "The sign in process has been canceled by user."
+msgstr ""
+
+#: core/errorpages.py:95
+msgid "The other service could not be reached."
+msgstr ""
+
+#: core/errorpages.py:101
+msgid "Unexpected problem has been encountered during sign in process."
+msgstr ""
+
+#: core/errorpages.py:122
+msgid ""
+"Your request was rejected because your browser didn't send the CSRF cookie, "
+"or the cookie sent was invalid."
+msgstr ""
+
+#: core/rest_permissions.py:9
+msgid "This action is not available to guests."
+msgstr ""
+
+#: core/templatetags/misago_pagetitle.py:10
+#: templates/misago/thread/private_thread.html:7
+#: templates/misago/thread/thread.html:7
+#, python-format
+msgid "page: %(page)s"
+msgstr ""
+
+#: core/validators.py:10
+msgid "Value has to contain alpha-numerical characters."
+msgstr ""
+
+#: core/validators.py:12
+msgid "Value is too long."
+msgstr ""
+
+#: core/validators.py:26
+msgid "Uploaded image is not a square."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:27
+msgid "The site is running using unreleased version of Misago."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:29
+msgid ""
+"Unreleased versions of Misago can lack security features and there is no "
+"supported way to upgrade them to release versions later."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:42
+msgid "Failed to connect to pypi.org API. Try again later."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:44
+#: templates/misago/admin/dashboard/checks.html:17
+#: templates/misago/admin/dashboard/index.html:33
+msgid ""
+"Version check feature relies on the API operated by the Python Package Index "
+"(pypi.org) API to retrieve latest Misago release version."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:70
+msgid "The site is running updated version of Misago."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:71
+#, python-format
+msgid "Misago %(version)s is latest release."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:77
+msgid "The site is running outdated version of Misago."
+msgstr ""
+
+#: graphql/admin/versioncheck.py:79
+#, python-format
+msgid ""
+"The site is running Misago version %(version)s while version %(latest)s is "
+"available."
+msgstr ""
+
+#: icons/admin/__init__.py:15
+msgid "Icons"
+msgstr ""
+
+#: icons/admin/__init__.py:16
+msgid "Upload favicon and application icon for the site."
+msgstr ""
+
+#: icons/admin/forms.py:21 icons/admin/forms.py:28
+msgid "Upload image"
+msgstr ""
+
+#: icons/admin/forms.py:22
+msgid "Uploaded image should be a square that is 48px wide and tall."
+msgstr ""
+
+#: icons/admin/forms.py:25 icons/admin/forms.py:33
+msgid "Delete custom icon"
+msgstr ""
+
+#: icons/admin/forms.py:29
+msgid "Uploaded image should be square at least 180px wide and tall."
+msgstr ""
+
+#: icons/admin/forms.py:124
+msgid "Uploaded image was not gif, jpeg or png."
+msgstr ""
+
+#: icons/admin/views.py:17
+msgid "Icons have been updated."
+msgstr ""
+
+#: legal/admin/__init__.py:35
+msgid "Legal agreements"
+msgstr ""
+
+#: legal/admin/__init__.py:36
+msgid "Set terms of service and privacy policy contents."
+msgstr ""
+
+#: legal/admin/forms.py:11 legal/admin/forms.py:64
+#: templates/misago/admin/agreements/list.html:19
+#: templates/misago/admin/attachmenttypes/list.html:16
+#: templates/misago/admin/bans/list.html:18
+#: templates/misago/admin/themes/assets/media.html:24
+#: templates/misago/admin/users/edit.html:300 users/admin/forms.py:569
+msgid "Type"
+msgstr ""
+
+#: legal/admin/forms.py:13 menus/admin/forms.py:10
+#: templates/misago/admin/ranks/list.html:19
+msgid "Title"
+msgstr ""
+
+#: legal/admin/forms.py:14
+msgid "Optional, leave empty for agreement to be named after its type."
+msgstr ""
+
+#: legal/admin/forms.py:18
+msgid "Active for its type"
+msgstr ""
+
+#: legal/admin/forms.py:20
+msgid ""
+"If other agreement is already active for this type, it will be unset and "
+"replaced with this one. Misago will ask users who didn't accept this "
+"agreement to do so before allowing them to continue using the site."
+msgstr ""
+
+#: legal/admin/forms.py:27 templates/misago/admin/themes/assets/css.html:17
+msgid "Link"
+msgstr ""
+
+#: legal/admin/forms.py:29
+msgid "If your agreement is located on other page, enter here a link to it."
+msgstr ""
+
+#: legal/admin/forms.py:35
+msgid "You can use Markdown syntax for rich text elements."
+msgstr ""
+
+#: legal/admin/forms.py:48
+msgid "Please fill in agreement link or text."
+msgstr ""
+
+#: legal/admin/forms.py:66 threads/admin/forms.py:8
+msgid "All types"
+msgstr ""
+
+#: legal/admin/forms.py:68
+msgid "Content"
+msgstr ""
+
+#: legal/admin/views.py:16
+msgid "Requested agreement does not exist."
+msgstr ""
+
+#: legal/admin/views.py:29 threads/admin/views/attachments.py:26
+#: users/admin/views/bans.py:24 users/admin/views/datadownloads.py:22
+#: users/admin/views/users.py:63
+msgid "From newest"
+msgstr ""
+
+#: legal/admin/views.py:29 threads/admin/views/attachments.py:27
+#: users/admin/views/bans.py:25 users/admin/views/datadownloads.py:22
+#: users/admin/views/users.py:64
+msgid "From oldest"
+msgstr ""
+
+#: legal/admin/views.py:31
+msgid "With agreements: 0"
+msgstr ""
+
+#: legal/admin/views.py:32
+msgid "Select agreements"
+msgstr ""
+
+#: legal/admin/views.py:36
+msgid "Delete agreements"
+msgstr ""
+
+#: legal/admin/views.py:37
+msgid "Are you sure you want to delete those agreements?"
+msgstr ""
+
+#: legal/admin/views.py:48
+msgid "Selected agreements have been deleted."
+msgstr ""
+
+#: legal/admin/views.py:52
+#, python-format
+msgid "New agreement \"%(title)s\" has been saved."
+msgstr ""
+
+#: legal/admin/views.py:63
+#, python-format
+msgid "Agreement \"%(title)s\" has been edited."
+msgstr ""
+
+#: legal/admin/views.py:78
+#, python-format
+msgid "Agreement \"%(title)s\" has been deleted."
+msgstr ""
+
+#: legal/admin/views.py:86
+#, python-format
+msgid "Agreement \"%(title)s\" has been set as active for type \"%(type)s\"."
+msgstr ""
+
+#: legal/admin/views.py:98
+#, python-format
+msgid "Agreement \"%(title)s\" has been disabled."
+msgstr ""
+
+#: legal/api.py:17
+msgid "You have already accepted this agreement."
+msgstr ""
+
+#: legal/api.py:26
+msgid "You need to submit a valid choice."
+msgstr ""
+
+#: legal/models.py:42 templates/misago/footer.html:29
+msgid "Terms of service"
+msgstr ""
+
+#: legal/models.py:43 templates/misago/footer.html:34
+msgid "Privacy policy"
+msgstr ""
+
+#: markup/finalize.py:24
+#, python-format
+msgid "%(title)s has written:"
+msgstr ""
+
+#: markup/finalize.py:26
+msgid "Quoted message:"
+msgstr ""
+
+#: markup/finalize.py:33
+#, python-format
+msgid "%(title)s:"
+msgstr ""
+
+#: markup/finalize.py:35
+msgid "Spoiler:"
+msgstr ""
+
+#: markup/finalize.py:40
+msgid "Reveal spoiler"
+msgstr ""
+
+#: menus/admin/__init__.py:31
+msgid "Menu items"
+msgstr ""
+
+#: menus/admin/__init__.py:33
+msgid "Use those options to add custom items to the navbar and footer menus."
+msgstr ""
+
+#: menus/admin/forms.py:12
+msgid "URL"
+msgstr ""
+
+#: menus/admin/forms.py:12
+msgid "URL where this item will point to."
+msgstr ""
+
+#: menus/admin/forms.py:15
+msgid "Menu"
+msgstr ""
+
+#: menus/admin/forms.py:17
+msgid "Menu in which this item will be displayed."
+msgstr ""
+
+#: menus/admin/forms.py:21
+msgid "If you want to set custom value for link's \"class\"."
+msgstr ""
+
+#: menus/admin/forms.py:25
+msgid "Open this link in new window"
+msgstr ""
+
+#: menus/admin/forms.py:27
+msgid ""
+"Enabling this option will result in the target=\"_blank\" attribute being "
+"added to this link's HTML element."
+msgstr ""
+
+#: menus/admin/forms.py:33
+msgid "Rel attribute"
+msgstr ""
+
+#: menus/admin/forms.py:35
+msgid "Optional \"rel\" attribute that this item will use (ex. \"nofollow\")."
+msgstr ""
+
+#: menus/admin/views.py:16
+msgid "Requested menu item does not exist."
+msgstr ""
+
+#: menus/admin/views.py:30
+msgid "Delete items"
+msgstr ""
+
+#: menus/admin/views.py:31
+msgid "Are you sure you want to delete those menu items?"
+msgstr ""
+
+#: menus/admin/views.py:38
+msgid "Selected menu items have been deleted."
+msgstr ""
+
+#: menus/admin/views.py:42
+#, python-format
+msgid "New menu item %(item)s has been saved."
+msgstr ""
+
+#: menus/admin/views.py:52
+#, python-format
+msgid "Menu item %(item)s has been edited."
+msgstr ""
+
+#: menus/admin/views.py:64
+#, python-format
+msgid "Menu item %(item)s has been deleted."
+msgstr ""
+
+#: menus/admin/views.py:82
+#, python-format
+msgid "Menu item %(item)s has been moved after %(other)s."
+msgstr ""
+
+#: menus/admin/views.py:101
+#, python-format
+msgid "Menu item %(item)s has been moved before %(other)s."
+msgstr ""
+
+#: menus/models.py:10
+msgid "Navbar and footer"
+msgstr ""
+
+#: menus/models.py:11 templates/misago/admin/menuitems/list.html:41
+msgid "Navbar"
+msgstr ""
+
+#: menus/models.py:12 templates/misago/admin/menuitems/list.html:46
+msgid "Footer"
+msgstr ""
+
+#: search/api.py:17 search/views.py:12 search/views.py:21
+msgid "You don't have permission to search site."
+msgstr ""
+
+#: search/permissions.py:10 templates/misago/search.html:23
+#: templates/misago/search.html:34
+msgid "Search"
+msgstr ""
+
+#: search/permissions.py:12
+msgid "Can search site"
+msgstr ""
+
+#: socialauth/admin/__init__.py:40
+msgid "Social login"
+msgstr ""
+
+#: socialauth/admin/__init__.py:42
+msgid "Enable users to sign on and login using their social profile."
+msgstr ""
+
+#: socialauth/admin/forms/base.py:10
+msgid "Button text"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:11
+msgid "Button color"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:12
+msgid "Enable this provider"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:37
+msgid "Associate existing users by email"
+msgstr ""
+
+#: socialauth/admin/forms/base.py:39
+msgid ""
+"Enabling this option will result in the user being signed in if their forum "
+"account was registered using same e-mail address as used on the social site. "
+"Otherwise they will be asked to specify a different e-mail to continue sign "
+"in using social site."
+msgstr ""
+
+#: socialauth/admin/forms/base.py:51 socialauth/admin/forms/base.py:53
+#: threads/admin/forms.py:97
+msgid "This field is required."
+msgstr ""
+
+#: socialauth/admin/forms/facebook.py:8
+msgid "App ID"
+msgstr ""
+
+#: socialauth/admin/forms/facebook.py:9
+msgid "App Secret"
+msgstr ""
+
+#: socialauth/admin/forms/github.py:8 socialauth/admin/forms/google.py:8
+msgid "Client ID"
+msgstr ""
+
+#: socialauth/admin/forms/github.py:9 socialauth/admin/forms/google.py:9
+msgid "Client Secret"
+msgstr ""
+
+#: socialauth/admin/forms/twitter.py:8
+msgid "Consumer API key"
+msgstr ""
+
+#: socialauth/admin/forms/twitter.py:9
+msgid "Consumer API secret key"
+msgstr ""
+
+#: socialauth/admin/views.py:15
+msgid "Requested social login provider does not exist."
+msgstr ""
+
+#: socialauth/admin/views.py:61
+#, python-format
+msgid "Login with %(provider)s has been updated."
+msgstr ""
+
+#: socialauth/admin/views.py:71
+#, python-format
+msgid "Login with %(provider)s has been disabled."
+msgstr ""
+
+#: socialauth/admin/views.py:91
+#, python-format
+msgid "Login with %(provider)s has been moved after %(other)s."
+msgstr ""
+
+#: socialauth/admin/views.py:112
+#, python-format
+msgid "Login with %(provider)s has been moved before %(other)s."
+msgstr ""
+
+#: socialauth/pipeline.py:88
+#, python-format
+msgid ""
+"The e-mail address associated with your %(backend)s account is not available "
+"for use on this site."
+msgstr ""
+
+#: socialauth/pipeline.py:98
+#, python-format
+msgid ""
+"Your account has to be activated by site administrator before you will be "
+"able to sign in with %(backend)s."
+msgstr ""
+
+#: socialauth/pipeline.py:223 users/api/userendpoints/create.py:60
+msgid "Please try resubmitting the form."
+msgstr ""
+
+#: templates/misago/acl_debug.html:5
+#, python-format
+msgid ""
+"\n"
+"    %(user)s roles\n"
+"    "
+msgstr ""
+
+#: templates/misago/acl_debug.html:9
+msgid "Anonymous roles"
+msgstr ""
+
+#: templates/misago/acl_debug.html:30
+msgid "Current ACL"
+msgstr ""
+
+#: templates/misago/acl_debug.html:34
+msgid "Key"
+msgstr ""
+
+#: templates/misago/acl_debug.html:35
+msgid "Value"
+msgstr ""
+
+#: templates/misago/activation/done.html:5
+msgid "Account activated"
+msgstr ""
+
+#: templates/misago/activation/done.html:20
+msgid ""
+"You can now sign in to finish setting up your account and to participate in "
+"or start new discussions."
+msgstr ""
+
+#: templates/misago/activation/error.html:5
+msgid "Activation error"
+msgstr ""
+
+#: templates/misago/activation/error.html:19
+msgid "Can't activate account."
+msgstr ""
+
+#: templates/misago/activation/request.html:5
+#: templates/misago/activation/request.html:13
+msgid "Request activation link"
+msgstr ""
+
+#: templates/misago/activation/request.html:25
+msgid ""
+"The site administrator may impose a requirement on newly registered accounts "
+"to be activated before users will be able to sign in."
+msgstr ""
+
+#: templates/misago/activation/request.html:28
+msgid ""
+"Depending on the time of registration, you will be able to activate your "
+"account by clicking a special activation link. This link will be valid only "
+"for your browser, for seven days or until your account is activated."
+msgstr ""
+
+#: templates/misago/activation/request.html:31
+msgid ""
+"To receive this link, enter your account's e-mail address in the form and "
+"press the \"Send link\" button."
+msgstr ""
+
+#: templates/misago/activation/request.html:49
+msgid "To request a new activation link please enable JavaScript."
+msgstr ""
+
+#: templates/misago/activation/stopped.html:5
+msgid "Activation failed"
+msgstr ""
+
+#: templates/misago/activation/stopped.html:20
+msgid "Your account can't be activated at this time."
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:9
+#: templates/misago/admin/agreements/form.html:40
+#: templates/misago/admin/agreements/list.html:9
+msgid "New agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:29
+#: templates/misago/admin/categories/form.html:35
+#: templates/misago/admin/categoryroles/categoryroles.html:30
+#: templates/misago/admin/ranks/form.html:29
+#: templates/misago/admin/users/edit.html:23
+msgid "View on site"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:38
+#: templates/misago/admin/agreements/list.html:107
+msgid "Edit agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:48
+#: templates/misago/admin/categoryroles/form.html:36
+#: templates/misago/admin/conf/captcha_settings.html:8
+#: templates/misago/admin/menuitems/form.html:41
+#: templates/misago/admin/roles/form.html:36
+msgid "Basic settings"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:58
+msgid "Agreement contents"
+msgstr ""
+
+#: templates/misago/admin/agreements/form.html:61
+msgid "Fill in one of the fields."
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:17
+#: templates/misago/admin/users/edit.html:299
+msgid "Agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:20
+msgid "Created"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:21
+#: templates/misago/admin/themes/assets/css.html:32
+#: templates/misago/admin/themes/assets/media.html:22
+msgid "Modified"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:41
+msgid "Users are required to accept this agreement to use the site"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:42
+#: templates/misago/admin/themes/list.html:51 users/admin/forms.py:587
+msgid "Active"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:60
+#, python-format
+msgid "%(created_on)s by %(created_by)s"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:78
+#, python-format
+msgid "%(last_modified_on)s by %(last_modified_by)s"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:82
+msgid "never"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:95
+#: templates/misago/admin/themes/list.html:78
+msgid "Set as active"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:102
+msgid "Disable agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:112
+msgid "Remove agreement"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:124
+msgid "No agreements matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:126
+msgid "No agreements are set."
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:137
+msgid "Are you sure you want to set this agreement as active for its type?"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:141
+msgid "Are you sure you want to disable this agreement?"
+msgstr ""
+
+#: templates/misago/admin/agreements/list.html:145
+msgid "Are you sure you want to remove this agreement?"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:7
+msgid "Attachment"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:8
+msgid "Thread"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:48
+#, python-format
+msgid "%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s."
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:59
+msgid "None"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:66
+#: templates/misago/admin/warnings/list.html:112
+#: templates/misago/poll/results.html:76
+msgid "Delete"
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:76
+msgid "No attachments matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:78
+msgid "No attachments exist."
+msgstr ""
+
+#: templates/misago/admin/attachments/list.html:113
+msgid "Are you sure you want to delete this attachment?"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:9
+#: templates/misago/admin/attachmenttypes/list.html:9
+msgid "New type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:26
+msgid "Edit attachment type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:28
+msgid "New attachment type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:36
+#: templates/misago/admin/warnings/form.html:34
+msgid "Basic options"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/form.html:47
+msgid "Availability"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:18
+msgid "Extensions"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:19
+#: threads/admin/forms.py:56
+msgid "Mimetypes"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:20
+msgid "Files"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:33
+msgid "Uploading new files of this type is disabled"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:34
+msgid "Limited"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:37
+msgid "Uploading and downloading files of this type is disabled"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:38
+#: templates/misago/admin/users/edit.html:67
+#: templates/misago/admin/users/list.html:70
+msgid "Disabled"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:57
+#: templates/misago/admin/categories/list.html:45
+#: templates/misago/admin/menuitems/list.html:54
+#: templates/misago/admin/ranks/list.html:59
+#: templates/misago/admin/ranks/list.html:66
+msgid "Not set"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:70
+msgid "Edit type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:75
+msgid "Delete type"
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:86
+msgid "No attachment types are set."
+msgstr ""
+
+#: templates/misago/admin/attachmenttypes/list.html:95
+msgid "Are you sure you want to delete this attachment type?"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:9
+#: templates/misago/admin/bans/form.html:28
+#: templates/misago/admin/bans/list.html:9
+msgid "New ban"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:26
+#: templates/misago/admin/bans/list.html:65
+msgid "Edit ban"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:36
+#: templates/misago/admin/users/ban.html:62
+msgid "Ban settings"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:47
+#: templates/misago/admin/users/ban.html:71
+msgid "Messages"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:61
+#: templates/misago/admin/bans/list.html:54
+#: templates/misago/admin/users/ban.html:90
+msgid "Never"
+msgstr ""
+
+#: templates/misago/admin/bans/form.html:62
+#: templates/misago/admin/users/ban.html:91
+msgid "Set date"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:16
+msgid "Ban"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:19
+msgid "Expires on"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:36 users/admin/forms.py:580
+msgid "Registration only"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:41 users/admin/forms.py:587
+#: users/models/datadownload.py:29
+msgid "Expired"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:70
+msgid "Remove ban"
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:82
+msgid "No bans matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:84
+msgid "No bans are set."
+msgstr ""
+
+#: templates/misago/admin/bans/list.html:95
+msgid "Are you sure you want to remove this ban?"
+msgstr ""
+
+#: templates/misago/admin/base.html:7 templates/misago/admin/login.html:6
+msgid "Misago Administration"
+msgstr ""
+
+#: templates/misago/admin/categories/delete.html:6
+#, python-format
+msgid "Delete category: %(category)s"
+msgstr ""
+
+#: templates/misago/admin/categories/delete.html:21
+#: templates/misago/admin/categories/delete.html:39
+#: templates/misago/admin/categories/list.html:97
+msgid "Delete category"
+msgstr ""
+
+#: templates/misago/admin/categories/delete.html:27
+msgid "Category contents"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:9
+#: templates/misago/admin/categories/form.html:46
+#: templates/misago/admin/categories/list.html:9
+msgid "New category"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:29
+msgid "Edit permissions"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:44
+#: templates/misago/admin/categories/list.html:94
+#: templates/misago/admin/categoryroles/categoryroles.html:24
+msgid "Edit category"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:54
+msgid "Display and position"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:65
+msgid "Behaviour"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:74
+msgid "Content approval"
+msgstr ""
+
+#: templates/misago/admin/categories/form.html:84
+msgid "Prune threads"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:17
+msgid "Category"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:20
+#: templates/misago/admin/dashboard/index.html:45
+#: templates/misago/admin/dashboard/totals.html:31
+#: templates/misago/admin/users/list.html:21
+#: templates/misago/profile/posts.html:5 templates/misago/profile/posts.html:8
+#: templates/misago/profile/posts.html:9 users/apps.py:93
+msgid "Posts"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:58
+#: templates/misago/admin/menuitems/list.html:72
+#: templates/misago/admin/ranks/list.html:74
+#: templates/misago/admin/socialauth/list.html:32
+#: templates/misago/admin/themes/assets/css.html:68
+#: templates/misago/admin/warnings/list.html:84
+msgid "Move down"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:72
+#: templates/misago/admin/menuitems/list.html:86
+#: templates/misago/admin/ranks/list.html:88
+#: templates/misago/admin/socialauth/list.html:46
+#: templates/misago/admin/themes/assets/css.html:73
+#: templates/misago/admin/warnings/list.html:96
+msgid "Move up"
+msgstr ""
+
+#: templates/misago/admin/categories/list.html:107
+msgid "No categories are set."
+msgstr ""
+
+#: templates/misago/admin/categoryroles/categoryroles.html:6
+#, python-format
+msgid "%(category)s: Permissions"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/categoryroles.html:59
+#: templates/misago/admin/categoryroles/rolecategories.html:56
+msgid "Are you sure you want to abandon changes?"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/form.html:9
+#: templates/misago/admin/categoryroles/form.html:28
+msgid "New category role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/form.html:26
+msgid "Edit category role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:9
+#: templates/misago/admin/roles/form.html:9
+#: templates/misago/admin/roles/form.html:28
+#: templates/misago/admin/roles/list.html:9
+msgid "New role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:16 users/admin/forms.py:250
+msgid "Roles"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:34
+#: templates/misago/admin/categoryroles/rolecategories.html:24
+#: templates/misago/admin/roles/form.html:26
+#: templates/misago/admin/roles/list.html:42
+msgid "Edit role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:39
+#: templates/misago/admin/roles/list.html:47
+msgid "Delete role"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:50
+msgid "No category roles are set."
+msgstr ""
+
+#: templates/misago/admin/categoryroles/list.html:59
+#: templates/misago/admin/roles/list.html:67
+msgid "Are you sure you want to delete this role?"
+msgstr ""
+
+#: templates/misago/admin/categoryroles/rolecategories.html:6
+#, python-format
+msgid "%(role)s: Category permissions"
+msgstr ""
+
+#: templates/misago/admin/conf/analytics_settings.html:8
+msgid "Google Analytics and Search Console"
+msgstr ""
+
+#: templates/misago/admin/conf/captcha_settings.html:16
+msgid "reCAPTCHA"
+msgstr ""
+
+#: templates/misago/admin/conf/captcha_settings.html:35
+msgid "Stop Forum Spam"
+msgstr ""
+
+#: templates/misago/admin/conf/form.html:16
+#: templates/misago/admin/socialauth/list.html:63
+msgid "Change settings"
+msgstr ""
+
+#: templates/misago/admin/conf/form.html:27
+#: templates/misago/admin/generic/form.html:25
+msgid "Form was completed with errors."
+msgstr ""
+
+#: templates/misago/admin/conf/form.html:37
+#: templates/misago/admin/generic/form.html:45
+#: templates/misago/admin/themes/assets/css-editor-form.html:60
+#: templates/misago/emails/change_email.html:16
+#: templates/misago/emails/change_password.html:16
+msgid "Save changes"
+msgstr ""
+
+#: templates/misago/admin/conf/general_settings.html:8
+msgid "Site details"
+msgstr ""
+
+#: templates/misago/admin/conf/general_settings.html:35
+msgid "Open Graph image"
+msgstr ""
+
+#: templates/misago/admin/conf/general_settings.html:49
+msgid "Forum index"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:8
+msgid "Posting"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:26
+msgid "Threads lists"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:34
+msgid "Thread pages"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:44
+msgid "Read-tracker"
+msgstr ""
+
+#: templates/misago/admin/conf/threads_settings.html:52
+msgid "Attachment error images"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:8
+msgid "New accounts"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:17 users/admin/forms.py:484
+#: users/admin/forms.py:573
+msgid "Usernames"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:27
+msgid "Avatars"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:43
+msgid "Signatures"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:51
+#: users/admin/__init__.py:80
+msgid "Data downloads"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:60
+msgid "Own account deletion"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:68 users/admin/forms.py:492
+msgid "IP addresses"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:76
+msgid "Default subscription preferences"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:85
+msgid "Users lists"
+msgstr ""
+
+#: templates/misago/admin/conf/users_settings.html:94
+msgid "Top posters ranking"
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:5
+msgid "System checks"
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:16
+#: templates/misago/admin/dashboard/index.html:32
+msgid "Checking Misago version used by the site..."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:30
+msgid "The site is running in DEBUG mode."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:31
+msgid ""
+"Error pages displayed in DEBUG mode will expose site configuration details "
+"like secrets and tokens to all visitors. This is MAJOR security risk."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:48
+msgid "Forum address is not configured."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:49
+msgid "Links in e-mails sent by Misago will be broken."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:69
+msgid "Configured forum address appears to be incorrect."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:77
+#, python-format
+msgid ""
+"Your forum address is set to %(configured_address)s while correct value "
+"appears to be %(correct_address)s."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:82
+msgid "Links in e-mails sentby Misagoill be broken."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:102
+msgid "The site is not running over HTTPS."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:103
+msgid ""
+"Browsers may warn users visiting the site about it being insecure. Search "
+"engines will lower its position in search results."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:117
+msgid "Cache is disabled."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:118
+msgid ""
+"This will cause degraded performance and increased CPU usage by the site, "
+"possibly leading to increased hosting costs."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:133
+#, python-format
+msgid "There is %(downloads)s unprocessed data download request."
+msgid_plural "There are %(downloads)s unprocessed data download requests."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/dashboard/checks.html:139
+msgid ""
+"Cron task that should process user data download requests is not running."
+msgstr ""
+
+#: templates/misago/admin/dashboard/checks.html:156
+#, python-format
+msgid "There is %(users)s inactive user accounts."
+msgid_plural "There are %(users)s inactive users accounts."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/dashboard/checks.html:162
+msgid ""
+"The site may be targeted by bots, is not sending activation e-mails, or is "
+"not configured to delete inactive user accounts."
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:28
+msgid "Version check is currently unavailable due to an error."
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:29
+msgid "Misago admin API did not answer or answered with an error."
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:42
+msgid "User registrations"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:43
+msgid "User deletions"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:44
+msgid "Threads started"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:46
+msgid "Attachments uploaded"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:47
+msgid "Data download requests"
+msgstr ""
+
+#: templates/misago/admin/dashboard/index.html:49
+msgid "Site analytics are currently unavailable due to an error."
+msgstr ""
+
+#: templates/misago/admin/dashboard/totals.html:43 threads/admin/__init__.py:36
+#: threads/permissions/attachments.py:11 threads/permissions/attachments.py:29
+msgid "Attachments"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/form.html:6
+#: templates/misago/admin/datadownloads/form.html:11
+msgid "Request new data downloads"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:9
+msgid "New downloads"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:17
+#: templates/misago/admin/users/ban.html:28
+#: templates/misago/admin/users/list.html:17 users/admin/forms.py:670
+msgid "User"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:18 threads/admin/forms.py:58
+#: users/admin/forms.py:668
+msgid "Status"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:19
+msgid "Requested on"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:21 users/admin/forms.py:671
+msgid "Requested by"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:32
+#: templates/misago/admin/datadownloads/list.html:51
+#: templates/misago/admin/datadownloads/list.html:54
+#: templates/misago/admin/users/ban.html:38
+#: templates/misago/admin/users/edit.html:38
+#: templates/misago/admin/users/edit.html:195
+#: templates/misago/admin/users/list.html:32
+#: templates/misago/userslists/active_posters.html:83
+msgid "Avatar"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:70
+#: templates/misago/admin/datadownloads/list.html:74
+msgid "Download"
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:84
+msgid "No data downloads matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/datadownloads/list.html:86
+msgid "No data downloads exist."
+msgstr ""
+
+#: templates/misago/admin/errorpages/403.html:5
+#: templates/misago/errorpages/403.html:5
+msgid "Page not available"
+msgstr ""
+
+#: templates/misago/admin/errorpages/403.html:12
+msgid "Requested page is not available"
+msgstr ""
+
+#: templates/misago/admin/errorpages/403.html:18
+#: templates/misago/errorpages/403.html:12
+#: templates/misago/errorpages/403.html:25
+#: templates/misago/errorpages/403.html:34
+#: templates/misago/errorpages/403.html:54
+msgid "You don't have permission to access this page."
+msgstr ""
+
+#: templates/misago/admin/errorpages/404.html:5
+#: templates/misago/errorpages/403.html:17
+#: templates/misago/errorpages/403.html:18
+#: templates/misago/errorpages/404.html:5
+#: templates/misago/errorpages/404.html:13
+#: templates/misago/errorpages/404.html:14
+msgid "Page not found"
+msgstr ""
+
+#: templates/misago/admin/errorpages/404.html:12
+msgid "Requested page could not be found"
+msgstr ""
+
+#: templates/misago/admin/errorpages/404.html:16
+#: templates/misago/errorpages/404.html:9
+#: templates/misago/errorpages/404.html:18
+#: templates/misago/errorpages/404.html:23
+msgid ""
+"The link you clicked was incorrect or the page has been moved or deleted."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure.html:5
+#: templates/misago/admin/errorpages/csrf_failure.html:14
+#: templates/misago/admin/errorpages/csrf_failure_authenticated.html:5
+#: templates/misago/admin/errorpages/csrf_failure_authenticated.html:12
+msgid "Form submission rejected"
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:3
+msgid ""
+"Your form submission was rejected because your browser didn't send the CSRF "
+"cookie, or the cookie sent was invalid."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:6
+msgid "This is usually a result of one of following problems:"
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:9
+msgid "Your browser is configured to don't accept or send any cookies."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:12
+msgid ""
+"The form was sent after being opened in the browser for a long time (eg. few "
+"days) and cookie token has expired."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:15
+msgid ""
+"The site is configured to use the HTTPS, but this form was sent over the the "
+"HTTP."
+msgstr ""
+
+#: templates/misago/admin/errorpages/csrf_failure_message.html:16
+msgid ""
+"If you are an owner of this site, please check if the HTTPS certificate used "
+"by the site is valid and accepted by the browser."
+msgstr ""
+
+#: templates/misago/admin/generic/filter_form.html:7
+msgid "Filter"
+msgstr ""
+
+#: templates/misago/admin/generic/filter_form.html:17
+msgid "Clear filters"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:36
+#: templates/misago/admin/themes/assets/css-editor-form.html:69
+#: templates/misago/admin/themes/assets/css-link-form.html:44
+#: templates/misago/admin/themes/assets/upload-css.html:20
+#: templates/misago/admin/themes/assets/upload-media.html:26
+msgid "Cancel"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:42
+#: templates/misago/admin/themes/assets/css-editor-form.html:58
+msgid "Save and keep editing"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:49
+msgid "Save and add another"
+msgstr ""
+
+#: templates/misago/admin/generic/form.html:52
+#: templates/misago/admin/themes/assets/css-editor-form.html:62
+msgid "Save"
+msgstr ""
+
+#: templates/misago/admin/generic/list.html:87
+msgid "Filters"
+msgstr ""
+
+#: templates/misago/admin/generic/list.html:90
+#: templates/misago/admin/generic/list.html:105
+#: templates/misago/admin/themes/assets/upload-css.html:7
+#: templates/misago/admin/themes/assets/upload-media.html:7
+msgid "Close"
+msgstr ""
+
+#: templates/misago/admin/generic/list.html:108
+msgid "Done"
+msgstr ""
+
+#: templates/misago/admin/generic/mass_actions.html:10
+msgid "With selected:"
+msgstr ""
+
+#: templates/misago/admin/generic/order_by.html:5
+msgid "Sort:"
+msgstr ""
+
+#: templates/misago/admin/generic/order_by.html:10
+msgid "Change sorting to:"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:4
+#: templates/misago/thread/paginator.html:7
+msgid "Go to first page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:5
+#: templates/misago/admin/generic/paginator.html:9
+msgid "First"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:13
+#: templates/misago/thread/paginator.html:13
+#: templates/misago/thread/paginator.html:19
+#: templates/misago/userslists/rank.html:99
+#: templates/misago/userslists/rank.html:107
+msgid "Go to previous page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:22
+#: templates/misago/thread/paginator.html:27
+#: templates/misago/userslists/rank.html:116
+msgid "Go to next page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:31
+#: templates/misago/thread/paginator.html:32
+msgid "Go to last page"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:32
+#: templates/misago/admin/generic/paginator.html:36
+#: templates/misago/thread/toolbar-top.html:20
+msgid "Last"
+msgstr ""
+
+#: templates/misago/admin/generic/paginator.html:41
+#, python-format
+msgid "Page %(page)s of %(pages)s"
+msgstr ""
+
+#: templates/misago/admin/icons.html:8
+msgid "Favicon"
+msgstr ""
+
+#: templates/misago/admin/icons.html:11
+msgid ""
+"Favicon is small icon that internet browsers display next to your site in "
+"its interface."
+msgstr ""
+
+#: templates/misago/admin/icons.html:68
+msgid "Apple Touch Icon"
+msgstr ""
+
+#: templates/misago/admin/icons.html:71
+msgid ""
+"Apple devices and Safari web browser will use this image to represent the "
+"site in its interfaces."
+msgstr ""
+
+#: templates/misago/admin/login.html:6
+msgid "Log in"
+msgstr ""
+
+#: templates/misago/admin/login.html:6
+msgid "Django Administration"
+msgstr ""
+
+#: templates/misago/admin/login.html:24
+msgid "Administration"
+msgstr ""
+
+#: templates/misago/admin/login.html:29 users/captcha.py:19
+msgid "Please try again."
+msgstr ""
+
+#: templates/misago/admin/login.html:48 users/forms/auth.py:60
+msgid "Username or e-mail"
+msgstr ""
+
+#: templates/misago/admin/login.html:53 users/admin/forms.py:67
+#: users/forms/auth.py:63
+msgid "Password"
+msgstr ""
+
+#: templates/misago/admin/login.html:57 templates/misago/auth.html:5
+msgid "Sign in"
+msgstr ""
+
+#: templates/misago/admin/login.html:60
+msgid "Return to site"
+msgstr ""
+
+#: templates/misago/admin/menuitems/form.html:9
+#: templates/misago/admin/menuitems/form.html:33
+#: templates/misago/admin/menuitems/list.html:9
+msgid "New menu item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/form.html:31
+msgid "Edit menu item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/form.html:50
+msgid "Behavior and appearance"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:16
+msgid "Item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:18
+msgid "CSS Class"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:19
+msgid "Target"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:20
+msgid "Rel"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:40
+msgid "Is displayed on the forum navbar."
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:45
+msgid "Is displayed on the forum footer."
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:103
+msgid "Edit item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:108
+msgid "Remove item"
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:119
+msgid "No menu items are set."
+msgstr ""
+
+#: templates/misago/admin/menuitems/list.html:129
+msgid "Are you sure you want to remove this menu item?"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:12
+msgid "GitHub"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:16
+msgid "Support forum"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:20
+msgid "Site index"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:24
+msgid "Your avatar"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:29
+msgid "Edit your account"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:35
+msgid "Close admin session"
+msgstr ""
+
+#: templates/misago/admin/navbar.html:41
+msgid "Log out completely"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:9
+#: templates/misago/admin/ranks/form.html:40
+#: templates/misago/admin/ranks/list.html:9
+msgid "New rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:38
+#: templates/misago/admin/ranks/list.html:116
+msgid "Edit rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:48
+msgid "Name and description"
+msgstr ""
+
+#: templates/misago/admin/ranks/form.html:66
+msgid "Display and visibility"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:17
+#: templates/misago/admin/users/list.html:19
+#: templates/misago/userslists/active_posters.html:112
+#: templates/misago/userslists/active_posters.html:123 users/admin/forms.py:238
+msgid "Rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:45
+msgid "Has dedicated page on users list"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:46
+msgid "Tab"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:50
+msgid "This is default rank assigned to new members"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:51
+msgid "Default"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:105
+msgid "List users"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:111
+msgid "Set as default"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:121
+msgid "Delete rank"
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:132
+msgid "No user ranks are set."
+msgstr ""
+
+#: templates/misago/admin/ranks/list.html:141
+msgid "Are you sure you want to delete this rank?"
+msgstr ""
+
+#: templates/misago/admin/roles/list.html:39
+msgid "Users with role"
+msgstr ""
+
+#: templates/misago/admin/roles/list.html:58
+msgid "No user roles are set."
+msgstr ""
+
+#: templates/misago/admin/socialauth/form.html:17
+msgid "Edit social login"
+msgstr ""
+
+#: templates/misago/admin/socialauth/form.html:19
+msgid "Setup social login"
+msgstr ""
+
+#: templates/misago/admin/socialauth/form.html:40
+msgid "Button appearance"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:8
+msgid "Enabled login methods"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:15
+#: templates/misago/admin/socialauth/list.html:106
+msgid "Provider"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:68
+msgid "Disable login"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:79
+msgid "No social login methods are enabled."
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:88
+msgid "Are you sure you want to disable this social login provider?"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:100
+msgid "Setup new login method"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:119
+msgid "Setup login with this provider"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:120
+msgid "Setup"
+msgstr ""
+
+#: templates/misago/admin/socialauth/list.html:127
+msgid "No new login providers are available for setup at this time."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-editor-form.html:9
+#: templates/misago/admin/themes/assets/css-editor-form.html:41
+msgid "New CSS"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-editor-form.html:39
+msgid "Edit CSS"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-link-form.html:9
+#: templates/misago/admin/themes/assets/css-link-form.html:31
+msgid "New CSS link"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css-link-form.html:29
+msgid "Edit CSS link"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:7
+msgid "CSS files"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:12
+#: templates/misago/admin/themes/assets/media.html:12
+#: templates/misago/admin/themes/assets/upload-css.html:21
+#: templates/misago/admin/themes/assets/upload-media.html:27
+msgid "Upload"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:22
+msgid "Create"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:33
+#: templates/misago/admin/themes/assets/media.html:23
+msgid "Size"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:80
+#: templates/misago/admin/themes/assets/css.html:84
+#: templates/misago/admin/users/list.html:95
+#: templates/misago/admin/warnings/list.html:105
+#: templates/misago/poll/results.html:69
+#: templates/misago/profile/details.html:25
+#: templates/misago/thread/posts/post/footer.html:31
+#: users/admin/djangoadmin.py:72
+msgid "Edit"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:94
+msgid "This theme has no CSS files."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/css.html:103
+#: templates/misago/admin/themes/assets/media.html:79
+msgid "Delete selected"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/list.html:6
+msgid "Assets"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/list.html:22
+#: templates/misago/admin/themes/form.html:38
+msgid "Edit theme"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/list.html:44
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/media.html:7
+msgid "Media"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/media.html:25
+msgid "Dimensions"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/media.html:70
+msgid "This theme has no media."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-css.html:6
+msgid "Upload CSS"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-css.html:15
+msgid "Select CSS files to upload"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:6
+msgid "Upload media"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:15
+msgid "Select media files to upload"
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:18
+msgid ""
+"Media files are primarily image and font files that can be linked to from "
+"the CSS, but files of any type can be uploaded using this option."
+msgstr ""
+
+#: templates/misago/admin/themes/assets/upload-media.html:21
+msgid ""
+"Theme CSS that use the \"url()\" to point to media files will be updated "
+"automatically."
+msgstr ""
+
+#: templates/misago/admin/themes/form.html:9
+#: templates/misago/admin/themes/form.html:40
+msgid "New theme"
+msgstr ""
+
+#: templates/misago/admin/themes/form.html:29
+#: templates/misago/admin/themes/list.html:63
+msgid "Edit assets"
+msgstr ""
+
+#: templates/misago/admin/themes/form.html:57
+msgid "Additional information (optional)"
+msgstr ""
+
+#: templates/misago/admin/themes/import.html:6
+#: templates/misago/admin/themes/import.html:11
+#: templates/misago/admin/themes/list.html:9
+msgid "Import theme"
+msgstr ""
+
+#: templates/misago/admin/themes/import.html:23
+msgid "Import"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:15
+msgid "Create theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:22
+msgid "Theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:68
+msgid "Edit information"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:72
+msgid "Create child theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:86
+msgid "Export theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:94
+msgid "Delete theme"
+msgstr ""
+
+#: templates/misago/admin/themes/list.html:109
+msgid ""
+"Are you sure you want to delete this theme? Deleting theme will also delete "
+"its child themes."
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:6
+#: templates/misago/admin/users/ban.html:82 users/admin/views/users.py:74
+msgid "Ban users"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:11
+msgid "Ban selected users"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:29 users/admin/forms.py:314
+#: users/signals.py:30
+msgid "E-mail"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:30 users/models/ban.py:73
+msgid "IP address"
+msgstr ""
+
+#: templates/misago/admin/users/ban.html:51
+#: templates/misago/admin/users/list.html:85
+msgid "IP removed"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:31
+#: templates/misago/admin/users/list.html:94
+msgid "Edit user"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:44
+#: templates/misago/admin/users/list.html:47
+msgid "Can use admin control panel and manage other administrators"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:45
+#: templates/misago/admin/users/list.html:48
+msgid "Super Admin"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:48
+#: templates/misago/admin/users/list.html:51
+msgid "Can use admin control panel"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:49
+#: templates/misago/admin/users/list.html:52
+msgid "Admin"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:53
+#: templates/misago/admin/users/list.html:56
+msgid "Requires activation by administrator"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:54
+#: templates/misago/admin/users/edit.html:58
+#: templates/misago/admin/users/list.html:57
+#: templates/misago/admin/users/list.html:61
+msgid "Inactive"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:57
+#: templates/misago/admin/users/list.html:60
+msgid "Has to activate their account"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:62
+#: templates/misago/admin/users/list.html:65
+msgid "Account scheduled for deletion"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:63
+#: templates/misago/admin/users/list.html:66
+msgid "Deleted"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:66
+#: templates/misago/admin/users/list.html:69 users/admin/forms.py:317
+msgid "Account disabled"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:92
+#: templates/misago/categories/stats.html:12
+#: templates/misago/thread/posts/post/side.html:41
+#: templates/misago/thread/posts/post/side.html:49
+#: templates/misago/userslists/usercard.html:52
+#, python-format
+msgid "%(posts)s post"
+msgid_plural "%(posts)s posts"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/users/edit.html:99
+#: templates/misago/categories/stats.html:5
+#: templates/misago/userslists/usercard.html:59
+#, python-format
+msgid "%(threads)s thread"
+msgid_plural "%(threads)s threads"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/admin/users/edit.html:110
+#: templates/misago/admin/users/new.html:18
+msgid "Basic account settings"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:129
+msgid "Administrator status"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:136
+msgid "Only superusers can change other users administrator status."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:180
+#: templates/misago/admin/users/new.html:37
+msgid "Sign-in credentials"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:184
+msgid ""
+"This user has not set account password and uses other service to "
+"authenticate."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:205
+msgid "Signature"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:228 users/apps.py:24
+msgid "Forum options"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:237
+msgid "Automatic subscription preferences"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:246
+msgid "Account status"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:250
+msgid ""
+"This user is deleting their account. It has been deactivated for the "
+"duration of the process."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:251
+msgid ""
+"No additional action is required. This account will be deleted automatically."
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:294
+msgid "Agreements"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:301
+msgid "Accepted on"
+msgstr ""
+
+#: templates/misago/admin/users/edit.html:324
+msgid "This user didn't accept any agreements."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:9
+#: templates/misago/admin/users/new.html:6
+#: templates/misago/admin/users/new.html:11
+msgid "New user"
+msgstr ""
+
+#: templates/misago/admin/users/list.html:20
+msgid "Registration"
+msgstr ""
+
+#: templates/misago/admin/users/list.html:103
+msgid "No users matching criteria exist."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:111
+msgid "You can include wildcard (\"*\") in username and email search:"
+msgstr ""
+
+#: templates/misago/admin/users/list.html:114
+msgid "\"admin*\" will find both \"admin\" and \"administrator\"."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:117
+msgid "\"*chan\" will match both \"chan\" and \"marichan\"."
+msgstr ""
+
+#: templates/misago/admin/users/list.html:120
+msgid "\"*son*\" will match \"son\", \"song\", \"firstson\" and \"firstsong\"."
+msgstr ""
+
+#: templates/misago/admin/users/new.html:47
+msgid "Save user"
+msgstr ""
+
+#: templates/misago/admin/warnings/form.html:9
+#: templates/misago/admin/warnings/form.html:19
+#: templates/misago/admin/warnings/list.html:9
+msgid "New warning level"
+msgstr ""
+
+#: templates/misago/admin/warnings/form.html:41
+msgid "Restrictions"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:16
+msgid "Warning level"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:17
+msgid "Length"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:18
+msgid "Replying"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:19
+msgid "Starting threads"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:40
+msgid "Permanent"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:47
+#: templates/misago/admin/warnings/list.html:65
+msgid "Not restricted"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:52
+#: templates/misago/admin/warnings/list.html:70
+msgid "Moderated"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:57
+#: templates/misago/admin/warnings/list.html:75
+msgid "Forbidden"
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:122
+msgid "No warning levels are set."
+msgstr ""
+
+#: templates/misago/admin/warnings/list.html:131
+msgid "Are you sure you want to delete this warning level?"
+msgstr ""
+
+#: templates/misago/auth.html:10
+msgid "Log out"
+msgstr ""
+
+#: templates/misago/categories/base.html:18
+#: templates/misago/categories/base.html:49
+#: templates/misago/categories/base.html:62
+#, python-format
+msgid ""
+"There is %(categories)s main category currenty available on the "
+"%(forum_name)s."
+msgid_plural ""
+"There are %(categories)s main categories currenty available on the "
+"%(forum_name)s."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/categories/body.html:15
+msgid "No categories exist or you don't have permission to see them."
+msgstr ""
+
+#: templates/misago/categories/icon.html:4
+msgid "This category has no new posts. (closed)"
+msgstr ""
+
+#: templates/misago/categories/icon.html:10
+msgid "This category has new posts. (closed)"
+msgstr ""
+
+#: templates/misago/categories/icon.html:18
+msgid "This category has no new posts."
+msgstr ""
+
+#: templates/misago/categories/icon.html:24
+msgid "This category has new posts."
+msgstr ""
+
+#: templates/misago/categories/last_thread.html:54
+msgid "This category is empty. No threads were posted within it so far."
+msgstr ""
+
+#: templates/misago/categories/last_thread.html:68
+msgid "This category is private. You can see only your own threads within it."
+msgstr ""
+
+#: templates/misago/categories/last_thread.html:82
+msgid "This category is protected. You can't browse it's contents."
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.html:6
+#: templates/misago/emails/activation/by_admin.txt:6
+#, python-format
+msgid "%(user)s, your account has been activated by forum administrator."
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.html:12
+#: templates/misago/emails/register/complete.html:18
+#: templates/misago/emails/register/inactive.html:31
+msgid "this form"
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.html:14
+#, python-format
+msgid "You can now sign in to it using %(login_form)s."
+msgstr ""
+
+#: templates/misago/emails/activation/by_admin.txt:10
+msgid "You can now sign in to it using the form below:"
+msgstr ""
+
+#: templates/misago/emails/activation/by_user.html:6
+#: templates/misago/emails/activation/by_user.txt:6
+#, python-format
+msgid "%(user)s, to activate your account click the below link:"
+msgstr ""
+
+#: templates/misago/emails/activation/by_user.html:11
+#: templates/misago/emails/register/inactive.html:27
+msgid "Activate my account!"
+msgstr ""
+
+#: templates/misago/emails/change_email.html:6
+#: templates/misago/emails/change_email.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because you have changed your e-"
+"mail address."
+msgstr ""
+
+#: templates/misago/emails/change_email.html:11
+#: templates/misago/emails/change_email.txt:10
+#: templates/misago/emails/change_password.html:11
+#: templates/misago/emails/change_password.txt:10
+msgid "To confirm this change, click the link below:"
+msgstr ""
+
+#: templates/misago/emails/change_password.html:6
+#: templates/misago/emails/change_password.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because you have changed your "
+"password."
+msgstr ""
+
+#: templates/misago/emails/change_password_form_link.html:6
+#: templates/misago/emails/change_password_form_link.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because you want to change "
+"forgotten password for your forum account."
+msgstr ""
+
+#: templates/misago/emails/change_password_form_link.html:11
+#: templates/misago/emails/change_password_form_link.txt:10
+msgid "To change your account password click the link below:"
+msgstr ""
+
+#: templates/misago/emails/change_password_form_link.html:16
+#: templates/misago/forgottenpassword/form.html:7
+#: templates/misago/forgottenpassword/form.html:20
+#: templates/misago/forgottenpassword/request.html:7
+#: templates/misago/forgottenpassword/request.html:20
+msgid "Set new password"
+msgstr ""
+
+#: templates/misago/emails/data_download.html:6
+#: templates/misago/emails/data_download.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because your data is ready for "
+"download."
+msgstr ""
+
+#: templates/misago/emails/data_download.html:11 users/apps.py:52
+msgid "Download data"
+msgstr ""
+
+#: templates/misago/emails/data_download.html:14
+#: templates/misago/emails/data_download.txt:15
+#, python-format
+msgid ""
+"This link will remain active for %(expires_in)s hour from the time this "
+"message has been sent."
+msgid_plural ""
+"This link will remain active for %(expires_in)s hours from the time this "
+"message has been sent."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/emails/data_download.txt:10
+msgid "To download your data, click the following link:"
+msgstr ""
+
+#: templates/misago/emails/privatethread/added.html:9
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has invited you "
+"to participate in private thread %(thread)s."
+msgstr ""
+
+#: templates/misago/emails/privatethread/added.html:14
+#: templates/misago/emails/privatethread/added.txt:10
+msgid "To read this thread click the link below:"
+msgstr ""
+
+#: templates/misago/emails/privatethread/added.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has invited you "
+"to participate in private thread \"%(thread)s\"."
+msgstr ""
+
+#: templates/misago/emails/register/complete.html:6
+#: templates/misago/emails/register/complete.txt:6
+#: templates/misago/emails/register/inactive.txt:6
+#, python-format
+msgid "%(user)s, thank you for joining us!"
+msgstr ""
+
+#: templates/misago/emails/register/complete.html:12
+#: templates/misago/emails/register/complete.txt:10
+msgid ""
+"You may now join discussion on our forums. Why not spend a minute or two to "
+"have a look around and share your opinions and knowledge with rest of "
+"community?"
+msgstr ""
+
+#: templates/misago/emails/register/complete.html:20
+#, python-format
+msgid "You can always sign in to your account using %(login_form)s."
+msgstr ""
+
+#: templates/misago/emails/register/complete.txt:14
+msgid "You can always sign in to your account using the form below:"
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:7
+#: templates/misago/emails/register/inactive.txt:10
+msgid ""
+"Before you will be able to join discussion on our forums, one of our "
+"administrators will have to activate your account."
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:12
+#: templates/misago/emails/register/inactive.txt:15
+msgid ""
+"This may take a while, but you will receive e-mail with notification once it "
+"happens."
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:17
+#: templates/misago/emails/register/inactive.txt:20
+msgid "Thank you for your patience and see you soon!"
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:22
+#: templates/misago/emails/register/inactive.txt:25
+msgid ""
+"Before you will be able to join discussion on our forums, you have to "
+"activate your account. To do so, simply click the link below:"
+msgstr ""
+
+#: templates/misago/emails/register/inactive.html:33
+#, python-format
+msgid ""
+"Once your account is activated, you can always sign in to it using "
+"%(login_form)s."
+msgstr ""
+
+#: templates/misago/emails/register/inactive.txt:30
+msgid ""
+"Once your account is activated, you can always sign in to it using the form "
+"below:"
+msgstr ""
+
+#: templates/misago/emails/thread/reply.html:9
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has replied to "
+"the thread %(thread)s that you are subscribed to."
+msgstr ""
+
+#: templates/misago/emails/thread/reply.html:14
+#: templates/misago/emails/thread/reply.txt:10
+msgid "To read this reply, click the below link:"
+msgstr ""
+
+#: templates/misago/emails/thread/reply.html:17
+msgid "Go to reply"
+msgstr ""
+
+#: templates/misago/emails/thread/reply.txt:6
+#, python-format
+msgid ""
+"%(user)s, you are receiving this message because %(sender)s has replied to "
+"the thread \"%(thread)s\" that you are subscribed to."
+msgstr ""
+
+#: templates/misago/errorpages/403.html:50
+msgid "This page is not available."
+msgstr ""
+
+#: templates/misago/errorpages/404.html:38
+msgid "Requested page could not be found."
+msgstr ""
+
+#: templates/misago/errorpages/404.html:39
+msgid ""
+"The link you followed was incorrect or the page has been moved or deleted."
+msgstr ""
+
+#: templates/misago/errorpages/405.html:5
+#: templates/misago/errorpages/405.html:13
+#: templates/misago/errorpages/405.html:14
+msgid "Wrong way"
+msgstr ""
+
+#: templates/misago/errorpages/405.html:9
+#: templates/misago/errorpages/405.html:18
+#: templates/misago/errorpages/405.html:23
+#: templates/misago/errorpages/405.html:39
+msgid "This page should be reached via form submission or pressing button."
+msgstr ""
+
+#: templates/misago/errorpages/405.html:38
+msgid "Page reached in wrong way."
+msgstr ""
+
+#: templates/misago/errorpages/ban_message.html:15
+#, python-format
+msgid "This ban expires on %(expires_on)s."
+msgstr ""
+
+#: templates/misago/errorpages/ban_message.html:19
+msgid "This ban is permanent."
+msgstr ""
+
+#: templates/misago/errorpages/banned.html:5
+msgid "You are banned"
+msgstr ""
+
+#: templates/misago/errorpages/banned.html:9
+msgid "You are banned from accessing this page."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:5
+#: templates/misago/errorpages/csrf_failure_authenticated.html:5
+msgid "Request blocked"
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:9
+msgid ""
+"This is usually caused by your browser not accepting or using outdated "
+"cookies. Check your browser configuration and try again."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:24
+#: templates/misago/errorpages/csrf_failure_authenticated.html:19
+msgid "Suspicious request blocked."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:25
+#: templates/misago/errorpages/csrf_failure_authenticated.html:20
+msgid ""
+"This is usually caused by your browser not accepting or using outdated "
+"cookies."
+msgstr ""
+
+#: templates/misago/errorpages/csrf_failure.html:26
+#: templates/misago/errorpages/csrf_failure_authenticated.html:21
+msgid "Check your browser configuration and try again."
+msgstr ""
+
+#: templates/misago/errorpages/social.html:5
+#: templates/misago/errorpages/social.html:11
+#: templates/misago/errorpages/social.html:12
+msgid "Problem with sign in"
+msgstr ""
+
+#: templates/misago/errorpages/social.html:38
+msgid ""
+"Please try again or use another method to sign in if the problem persists."
+msgstr ""
+
+#: templates/misago/footer.html:9
+msgid "For complete experience please enable JavaScript."
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:7
+msgid "Set new password error"
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:9
+msgid "Change forgotten password error"
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:26
+msgid "Can't set new password."
+msgstr ""
+
+#: templates/misago/forgottenpassword/error.html:28
+msgid "Can't change forgotten password."
+msgstr ""
+
+#: templates/misago/forgottenpassword/form.html:9
+#: templates/misago/forgottenpassword/form.html:22
+#: templates/misago/forgottenpassword/request.html:9
+#: templates/misago/forgottenpassword/request.html:22
+msgid "Change forgotten password"
+msgstr ""
+
+#: templates/misago/forgottenpassword/form.html:42
+msgid "To reset your password please enable JavaScript."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:35
+msgid ""
+"Your user account has no password set for it because it was created with "
+"other service."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:36
+msgid ""
+"To set password for your account, you can use special secure form that will "
+"be available by special link valid only for your browser, for seven days or "
+"until your password is set."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:38
+msgid ""
+"Because user passwords are processed in an irreversible way before being "
+"saved to database, it is not possible for us to simply send you your "
+"password."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:39
+msgid ""
+"Instead, you can change your password using special secure form that will be "
+"available by special link valid only for your browser, for seven days or "
+"until your password is changed."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:42
+msgid ""
+"To receive this link, enter your account's e-mail addres in form and press "
+"the \"Send link\" button."
+msgstr ""
+
+#: templates/misago/forgottenpassword/request.html:60
+msgid "To request new password reset link please enable JavaScript."
+msgstr ""
+
+#: templates/misago/options/credentials_changed.html:5
+#: templates/misago/options/credentials_error.html:5
+msgid "Change sign-in credentials"
+msgstr ""
+
+#: templates/misago/options/credentials_changed.html:20
+msgid "From now you will need to use new credentials when signing in."
+msgstr ""
+
+#: templates/misago/options/credentials_error.html:19
+msgid "Change confirmation link is invalid."
+msgstr ""
+
+#: templates/misago/options/credentials_error.html:20
+msgid ""
+"The confirmation link belongs to other user, was already used, or has "
+"expired."
+msgstr ""
+
+#: templates/misago/options/noscript.html:5
+msgid "Change your options"
+msgstr ""
+
+#: templates/misago/options/noscript.html:20
+#: templates/misago/socialauth.html:22
+msgid "Enable JavaScript"
+msgstr ""
+
+#: templates/misago/options/noscript.html:21
+msgid "You need to enable JavaScript in your browser to change your options."
+msgstr ""
+
+#: templates/misago/participants.html:30
+msgid "Add participant"
+msgstr ""
+
+#: templates/misago/participants.html:36
+#, python-format
+msgid "This thread has %(users)s participant."
+msgid_plural "This thread has %(users)s participants."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/info.html:4
+#, python-format
+msgid "%(votes)s vote."
+msgid_plural "%(votes)s votes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/info.html:15
+#, python-format
+msgid "Voting ends on %(ends_on)s."
+msgstr ""
+
+#: templates/misago/poll/info.html:22
+msgid "Votes are public."
+msgstr ""
+
+#: templates/misago/poll/info.html:36
+#, python-format
+msgid "Posted by %(poster)s on %(posted_on)s."
+msgstr ""
+
+#: templates/misago/poll/results.html:21 templates/misago/poll/results.html:31
+#, python-format
+msgid "%(votes)s vote, %(proc)s%% of total."
+msgid_plural "%(votes)s votes, %(proc)s%% of total."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/results.html:41
+msgid "Your choice."
+msgstr ""
+
+#: templates/misago/poll/results.html:55
+msgid "Vote"
+msgstr ""
+
+#: templates/misago/poll/results.html:62
+msgid "See votes"
+msgstr ""
+
+#: templates/misago/poll/voting.html:24
+#, python-format
+msgid "You can select %(choices)s choice."
+msgid_plural "You can select %(choices)s choices."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/poll/voting.html:32
+msgid "You can change your vote later."
+msgstr ""
+
+#: templates/misago/poll/voting.html:36
+msgid "Votes are final."
+msgstr ""
+
+#: templates/misago/poll/voting.html:46
+msgid "Save your vote"
+msgstr ""
+
+#: templates/misago/poll/voting.html:51
+msgid "See results"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:5
+#: templates/misago/profile/ban_details.html:8
+#: templates/misago/profile/ban_details.html:9
+#: templates/misago/profile/ban_details.html:16 users/apps.py:128
+msgid "Ban details"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:22
+msgid "User-shown ban message"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:31
+msgid "Team-shown ban message"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:39
+msgid "Ban expiration"
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:43
+#, python-format
+msgid "%(username)s's ban expires on %(expires_on)s."
+msgstr ""
+
+#: templates/misago/profile/ban_details.html:47
+#, python-format
+msgid "%(username)s's ban is permanent."
+msgstr ""
+
+#: templates/misago/profile/base.html:9 templates/misago/profile/base.html:20
+#: templates/misago/profile/base.html:35
+#, python-format
+msgid "%(title)s, joined on %(joined_on)s."
+msgstr ""
+
+#: templates/misago/profile/base.html:22 templates/misago/profile/base.html:37
+#, python-format
+msgid "Wrote %(posts)s post."
+msgid_plural "Wrote %(posts)s posts."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/base.html:26 templates/misago/profile/base.html:41
+#, python-format
+msgid "Started %(threads)s thread."
+msgid_plural "Started %(threads)s threads."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/details.html:5
+#: templates/misago/profile/details.html:8
+#: templates/misago/profile/details.html:9
+#: templates/misago/profile/details.html:19 users/apps.py:115
+msgid "Details"
+msgstr ""
+
+#: templates/misago/profile/details.html:75
+msgid "You are not sharing any details with others."
+msgstr ""
+
+#: templates/misago/profile/details.html:77
+#, python-format
+msgid "%(username)s is not sharing any details with others."
+msgstr ""
+
+#: templates/misago/profile/feed.html:10
+msgid "See post"
+msgstr ""
+
+#: templates/misago/profile/feed.html:61
+#: templates/misago/thread/posts/post/body.html:10
+msgid "This post's contents cannot be displayed."
+msgstr ""
+
+#: templates/misago/profile/feed.html:62
+#: templates/misago/thread/posts/post/body.html:11
+msgid "This error is caused by invalid post content manipulation."
+msgstr ""
+
+#: templates/misago/profile/followers.html:5
+#: templates/misago/profile/followers.html:8
+#: templates/misago/profile/followers.html:9 users/apps.py:103
+msgid "Followers"
+msgstr ""
+
+#: templates/misago/profile/followers.html:18
+#, python-format
+msgid "You have %(users)s follower."
+msgid_plural "You have %(users)s followers."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/followers.html:24
+#, python-format
+msgid "%(username)s has %(users)s follower."
+msgid_plural "%(username)s has %(users)s followers."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/followers.html:49
+msgid "You have no followers."
+msgstr ""
+
+#: templates/misago/profile/followers.html:51
+#, python-format
+msgid "%(username)s has no followers."
+msgstr ""
+
+#: templates/misago/profile/follows.html:5
+#: templates/misago/profile/follows.html:8
+#: templates/misago/profile/follows.html:9 users/apps.py:109
+msgid "Follows"
+msgstr ""
+
+#: templates/misago/profile/follows.html:18
+#, python-format
+msgid "You are following %(users)s user."
+msgid_plural "You are following %(users)s users."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/follows.html:24
+#, python-format
+msgid "%(username)s is following %(users)s user."
+msgid_plural "%(username)s is following %(users)s users."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/follows.html:49
+msgid "You are not following any users."
+msgstr ""
+
+#: templates/misago/profile/follows.html:51
+#, python-format
+msgid "%(username)s is not following any users."
+msgstr ""
+
+#: templates/misago/profile/header.html:7
+msgid "This user is deleting their account."
+msgstr ""
+
+#: templates/misago/profile/header.html:9
+msgid "This user's account has been disabled by administrator."
+msgstr ""
+
+#: templates/misago/profile/header.html:46
+#, python-format
+msgid "Member since %(joined_on)s"
+msgstr ""
+
+#: templates/misago/profile/posts.html:20
+#, python-format
+msgid "You have posted %(posts)s message."
+msgid_plural "You have posted %(posts)s messages."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/posts.html:26
+#, python-format
+msgid "%(username)s has posted %(posts)s message."
+msgid_plural "%(username)s has posted %(posts)s messages."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/posts.html:40
+msgid "You have posted no messages"
+msgstr ""
+
+#: templates/misago/profile/posts.html:42
+#, python-format
+msgid "%(username)s posted no messages."
+msgstr ""
+
+#: templates/misago/profile/threads.html:20
+#, python-format
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/threads.html:26
+#, python-format
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/threads.html:40
+msgid "You have no started threads."
+msgstr ""
+
+#: templates/misago/profile/threads.html:42
+#, python-format
+msgid "%(username)s started no threads."
+msgstr ""
+
+#: templates/misago/profile/username_history.html:5
+#: templates/misago/profile/username_history.html:8
+#: templates/misago/profile/username_history.html:9 users/apps.py:121
+msgid "Username history"
+msgstr ""
+
+#: templates/misago/profile/username_history.html:18
+#, python-format
+msgid "Your username was changed %(changes)s time."
+msgid_plural "Your username was changed %(changes)s times."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/username_history.html:24
+#, python-format
+msgid "%(username)s's username was changed %(changes)s time."
+msgid_plural "%(username)s's username was changed %(changes)s times."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/profile/username_history.html:79
+msgid "Your username was never changed."
+msgstr ""
+
+#: templates/misago/profile/username_history.html:81
+#, python-format
+msgid "%(username)s's username was never changed."
+msgstr ""
+
+#: templates/misago/required_agreement.html:9
+#, python-format
+msgid "Please review the updated %(agreement)s:"
+msgstr ""
+
+#: templates/misago/required_agreement.html:19
+msgid "here"
+msgstr ""
+
+#: templates/misago/required_agreement.html:21
+#, python-format
+msgid "Please review the updated %(agreement)s available %(link)s."
+msgstr ""
+
+#: templates/misago/search.html:5 templates/misago/search.html:8
+#: templates/misago/search.html:9
+msgid "Search site"
+msgstr ""
+
+#: templates/misago/search.html:47
+msgid "Loading search..."
+msgstr ""
+
+#: templates/misago/socialauth.html:5
+#, python-format
+msgid "Sign in with %(backend)s"
+msgstr ""
+
+#: templates/misago/socialauth.html:24
+#, python-format
+msgid ""
+"You need to enable JavaScript in your browser to complete the sign in with "
+"%(backend)s."
+msgstr ""
+
+#: templates/misago/thread/paginator.html:41
+#, python-format
+msgid "There is %(more)s more post in this thread."
+msgid_plural "There are %(more)s more posts in this thread."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/thread/paginator.html:47
+msgid "There are no more posts in this thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:48
+#, python-format
+msgid "Thread title has been changed from %(old_title)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:52
+msgid "Thread has been pinned globally."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:54
+msgid "Thread has been pinned locally."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:56
+msgid "Thread has been unpinned."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:61
+#, python-format
+msgid "Thread has been moved from %(from_category)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:68
+#, python-format
+msgid "The %(merged_thread)s thread has been merged into this thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:72
+msgid "Thread has been approved."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:74
+msgid "Thread has been opened."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:76
+msgid "Thread has been closed."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:78
+msgid "Thread has been revealed."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:80
+msgid "Thread has been made hidden."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:82
+msgid "Took thread over."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:84
+msgid "Owner has left thread. This thread is now closed."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:86
+msgid "Participant has left thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:91
+#, python-format
+msgid "Changed thread owner to %(user)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:98
+#, python-format
+msgid "Added %(user)s to thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/index.html:105
+#, python-format
+msgid "Removed %(user)s from thread."
+msgstr ""
+
+#: templates/misago/thread/posts/event/info.html:12
+#: templates/misago/thread/posts/post/body-hidden.html:14
+#, python-format
+msgid "Hidden by %(hidden_by)s on %(hidden_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/event/info.html:28
+#, python-format
+msgid "By %(event_by)s on %(event_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/attachments.html:33
+#, python-format
+msgid "%(filetype)s, %(size)s, uploaded by %(uploader)s on %(uploaded_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/body-hidden.html:4
+msgid "This post is hidden. You cannot not see its contents."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:7
+#, python-format
+msgid "Marked as best answer by you %(marked_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:13
+#, python-format
+msgid "Marked as best answer by %(marked_by)s %(marked_on)s."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:23
+msgid "This post is hidden. Only users with permission may see its contents."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:29
+msgid ""
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
+msgstr ""
+
+#: templates/misago/thread/posts/post/flags.html:35
+msgid "This post is protected. Only moderators may change it."
+msgstr ""
+
+#: templates/misago/thread/posts/post/footer.html:7
+msgid "Liked"
+msgstr ""
+
+#: templates/misago/thread/posts/post/footer.html:9
+msgid "Like"
+msgstr ""
+
+#: templates/misago/thread/posts/post/footer.html:26
+msgid "Reply"
+msgstr ""
+
+#: templates/misago/thread/posts/post/header.html:5
+msgid "New post"
+msgstr ""
+
+#: templates/misago/thread/posts/post/header.html:8
+#: templates/misago/thread/toolbar-top.html:7
+#: templates/misago/threadslist/tabs.html:17
+msgid "New"
+msgstr ""
+
+#: templates/misago/thread/posts/post/header.html:22
+#: templates/misago/thread/posts/post/side.html:4
+msgid "Post link"
+msgstr ""
+
+#: templates/misago/thread/posts/post/side.html:73
+msgid "Removed user"
+msgstr ""
+
+#: templates/misago/thread/stats.html:11
+#: templates/misago/threadslist/thread.html:21
+msgid "Pinned globally"
+msgstr ""
+
+#: templates/misago/thread/stats.html:20
+#: templates/misago/threadslist/thread.html:30
+msgid "Pinned locally"
+msgstr ""
+
+#: templates/misago/thread/stats.html:30
+#: templates/misago/thread/toolbar-top.html:14
+#: templates/misago/threadslist/tabs.html:33
+#: templates/misago/threadslist/thread.html:40
+msgid "Unapproved"
+msgstr ""
+
+#: templates/misago/thread/stats.html:39
+#: templates/misago/threadslist/thread.html:49
+msgid "Unapproved posts"
+msgstr ""
+
+#: templates/misago/thread/stats.html:49
+#: templates/misago/threadslist/thread.html:119
+msgid "Hidden"
+msgstr ""
+
+#: templates/misago/thread/stats.html:59
+#: templates/misago/threadslist/thread.html:129
+msgid "Closed"
+msgstr ""
+
+#: templates/misago/thread/stats.html:68
+#: templates/misago/threadslist/thread.html:153
+#, python-format
+msgid "%(replies)s reply"
+msgid_plural "%(replies)s replies"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/thread/stats.html:83
+#, python-format
+msgid "last reply by %(user)s %(date)s"
+msgstr ""
+
+#: templates/misago/thread/thread.html:19
+#: templates/misago/thread/thread.html:30
+#, python-format
+msgid "Started by %(starter)s on %(started_on)s in the %(category)s category."
+msgstr ""
+
+#: templates/misago/thread/thread.html:21
+#: templates/misago/thread/thread.html:32
+#, python-format
+msgid "%(replies)s reply, last one from %(last_post_on)s."
+msgid_plural "%(replies)s replies, last one from %(last_post_on)s."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/thread/thread.html:25
+#: templates/misago/thread/thread.html:36
+msgid "Answered."
+msgstr ""
+
+#: templates/misago/thread/thread.html:25
+#: templates/misago/thread/thread.html:36
+msgid "Closed."
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:6
+msgid "Go to first new post"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:13
+msgid "Go to first unapproved post"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:19
+msgid "Go to last post"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:25
+msgid "Go to best answers"
+msgstr ""
+
+#: templates/misago/thread/toolbar-top.html:26
+msgid "Best answer"
+msgstr ""
+
+#: templates/misago/threadslist/base.html:57
+msgid "There are no threads in this category."
+msgstr ""
+
+#: templates/misago/threadslist/base.html:59
+msgid "There are no threads on this forum... yet!"
+msgstr ""
+
+#: templates/misago/threadslist/base.html:63
+#: templates/misago/threadslist/private_threads.html:61
+msgid "Why not start one yourself?"
+msgstr ""
+
+#: templates/misago/threadslist/base.html:67
+#: templates/misago/threadslist/private_threads.html:64
+msgid "No threads matching specified criteria were found."
+msgstr ""
+
+#: templates/misago/threadslist/base.html:82
+msgid "Next page"
+msgstr ""
+
+#: templates/misago/threadslist/private_threads.html:42
+msgid ""
+"Private threads are threads which only those that started them and those "
+"they have invited may see and participate in."
+msgstr ""
+
+#: templates/misago/threadslist/private_threads.html:58
+msgid "You aren't participating in any private threads."
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:7 threads/admin/forms.py:27
+msgid "All"
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:12
+msgid "My"
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:22
+msgid "Unread"
+msgstr ""
+
+#: templates/misago/threadslist/tabs.html:27
+msgid "Subscribed"
+msgstr ""
+
+#: templates/misago/threadslist/thread.html:11
+msgid "New posts"
+msgstr ""
+
+#: templates/misago/threadslist/thread.html:59
+msgid "Answered"
+msgstr ""
+
+#: templates/misago/threadslist/thread.html:139
+msgid "Poll"
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:5
+#: templates/misago/userslists/active_posters.html:23
+#: templates/misago/userslists/active_posters.html:24 users/apps.py:72
+msgid "Top posters"
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:10
+#, python-format
+msgid "%(posters)s most active poster from last %(days)s days."
+msgid_plural "%(posters)s most active posters from last %(days)s days."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/userslists/active_posters.html:16
+#: templates/misago/userslists/active_posters.html:35
+#: templates/misago/userslists/active_posters.html:50
+#: templates/misago/userslists/active_posters.html:145
+#, python-format
+msgid "No users have posted any new messages during last %(days)s days."
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:29
+#: templates/misago/userslists/active_posters.html:44
+#: templates/misago/userslists/active_posters.html:69
+#, python-format
+msgid "%(posters)s top poster from last %(days)s days."
+msgid_plural "%(posters)s top posters from last %(days)s days."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/userslists/active_posters.html:116
+#: templates/misago/userslists/active_posters.html:128
+msgid "Ranked posts"
+msgstr ""
+
+#: templates/misago/userslists/active_posters.html:133
+msgid "Total posts"
+msgstr ""
+
+#: templates/misago/userslists/rank.html:9
+#: templates/misago/userslists/rank.html:41
+#: templates/misago/userslists/rank.html:52
+#, python-format
+msgid "%(users)s user have this rank."
+msgid_plural "%(users)s users have this rank."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/misago/userslists/rank.html:130
+msgid "There are no users with this rank at the moment."
+msgstr ""
+
+#: templates/misago/userslists/usercard.html:42
+#: templates/misago/userslists/usercard.html:45
+#, python-format
+msgid "Joined on %(joined_on)s"
+msgstr ""
+
+#: templates/misago/userslists/usercard.html:66
+#, python-format
+msgid "%(followers)s follower"
+msgid_plural "%(followers)s followers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: themes/admin/__init__.py:94
+msgid "Themes"
+msgstr ""
+
+#: themes/admin/forms.py:20
+msgid "No parent"
+msgstr ""
+
+#: themes/admin/forms.py:27 themes/admin/forms.py:58
+msgid "Parent"
+msgstr ""
+
+#: themes/admin/forms.py:28
+msgid "Version"
+msgstr ""
+
+#: themes/admin/forms.py:29
+msgid "Author(s)"
+msgstr ""
+
+#: themes/admin/forms.py:30
+msgid "Url"
+msgstr ""
+
+#: themes/admin/forms.py:54
+msgid "Leave this field empty to use theme name from imported file."
+msgstr ""
+
+#: themes/admin/forms.py:60
+msgid "Theme file"
+msgstr ""
+
+#: themes/admin/forms.py:60
+msgid "Theme file should be a ZIP file."
+msgstr ""
+
+#: themes/admin/forms.py:65
+msgid "Uploaded file is not a valid ZIP file."
+msgstr ""
+
+#: themes/admin/forms.py:110
+msgid "No files have been uploaded."
+msgstr ""
+
+#: themes/admin/forms.py:137
+#, python-format
+msgid "File \"%(file)s\" content type \"%(content_type)s\" is not allowed."
+msgstr ""
+
+#: themes/admin/forms.py:149
+#, python-format
+msgid "File \"%(file)s\" extension is invalid."
+msgstr ""
+
+#: themes/admin/forms.py:176
+msgid ""
+"Should be an correct filename and include the .css extension. It will be "
+"lowercased."
+msgstr ""
+
+#: themes/admin/forms.py:194
+msgid "You need to enter CSS for this file."
+msgstr ""
+
+#: themes/admin/forms.py:221
+msgid "Link name"
+msgstr ""
+
+#: themes/admin/forms.py:222
+msgid "Can be descriptive (e.g. \"roboto from fonts.google.com\")."
+msgstr ""
+
+#: themes/admin/forms.py:224
+msgid "Remote CSS URL"
+msgstr ""
+
+#: themes/admin/importer.py:21
+msgid ""
+"\"manifest.json\" contained by ZIP file is not a valid theme manifest file."
+msgstr ""
+
+#: themes/admin/importer.py:61
+msgid "Uploaded ZIP file could not be extracted."
+msgstr ""
+
+#: themes/admin/importer.py:67
+msgid "Uploaded ZIP file is empty."
+msgstr ""
+
+#: themes/admin/importer.py:69
+msgid "Uploaded ZIP file should contain single directory."
+msgstr ""
+
+#: themes/admin/importer.py:71
+msgid "Uploaded ZIP file didn't contain a directory."
+msgstr ""
+
+#: themes/admin/importer.py:85
+msgid "Uploaded ZIP file didn't contain a \"manifest.json\"."
+msgstr ""
+
+#: themes/admin/importer.py:89
+msgid "\"manifest.json\" contained by ZIP file is not a valid JSON file."
+msgstr ""
+
+#: themes/admin/validators.py:12
+msgid "Name is missing an .css extension."
+msgstr ""
+
+#: themes/admin/validators.py:15
+msgid "Name can't start with period (\".\")."
+msgstr ""
+
+#: themes/admin/validators.py:20
+msgid ""
+"Name can contain only latin alphabet characters, digits, dots, underscores "
+"and dashes."
+msgstr ""
+
+#: themes/admin/validators.py:27
+msgid "Name has to contain at least one latin alphabet character or digit."
+msgstr ""
+
+#: themes/admin/validators.py:36
+msgid "This name is already in use by other asset."
+msgstr ""
+
+#: themes/admin/views.py:28
+msgid "Requested theme does not exist."
+msgstr ""
+
+#: themes/admin/views.py:36
+#, python-format
+msgid "New theme \"%(name)s\" has been saved."
+msgstr ""
+
+#: themes/admin/views.py:51
+#, python-format
+msgid "Theme \"%(name)s\" has been updated."
+msgstr ""
+
+#: themes/admin/views.py:55
+msgid "Default theme can't be edited."
+msgstr ""
+
+#: themes/admin/views.py:64
+#, python-format
+msgid "Theme \"%(name)s\" has been deleted."
+msgstr ""
+
+#: themes/admin/views.py:68
+msgid "Default theme can't be deleted."
+msgstr ""
+
+#: themes/admin/views.py:70
+msgid "Active theme can't be deleted."
+msgstr ""
+
+#: themes/admin/views.py:73
+#, python-format
+msgid ""
+"Theme \"%(name)s\" can't be deleted because one of its child themes is set "
+"as active."
+msgstr ""
+
+#: themes/admin/views.py:90
+#, python-format
+msgid "Active theme has been changed to \"%(name)s\"."
+msgstr ""
+
+#: themes/admin/views.py:103
+msgid "Default theme can't be exported."
+msgstr ""
+
+#: themes/admin/views.py:123
+#, python-format
+msgid "Theme \"%(name)s\" has been imported."
+msgstr ""
+
+#: themes/admin/views.py:130
+msgid "Default theme assets can't be edited."
+msgstr ""
+
+#: themes/admin/views.py:158
+msgid "Some css files could not have been added to the theme."
+msgstr ""
+
+#: themes/admin/views.py:182
+msgid "New CSS files have been added to the theme."
+msgstr ""
+
+#: themes/admin/views.py:187
+msgid "New media files have been added to the theme."
+msgstr ""
+
+#: themes/admin/views.py:218
+msgid "Selected CSS files have been deleted."
+msgstr ""
+
+#: themes/admin/views.py:227
+msgid "Selected media have been deleted."
+msgstr ""
+
+#: themes/admin/views.py:247
+msgid "Requested CSS could not be found in the theme."
+msgstr ""
+
+#: themes/admin/views.py:273
+#, python-format
+msgid "\"%s\" was moved up."
+msgstr ""
+
+#: themes/admin/views.py:282
+#, python-format
+msgid "\"%s\" was moved down."
+msgstr ""
+
+#: themes/admin/views.py:324
+#, python-format
+msgid "New CSS \"%(name)s\" has been saved."
+msgstr ""
+
+#: themes/admin/views.py:341
+#, python-format
+msgid "CSS \"%(name)s\" has been updated."
+msgstr ""
+
+#: themes/admin/views.py:364
+#, python-format
+msgid "No changes have been made to \"%(css)s\"."
+msgstr ""
+
+#: themes/admin/views.py:369
+#, python-format
+msgid "New CSS link \"%(name)s\" has been saved."
+msgstr ""
+
+#: themes/admin/views.py:392
+#, python-format
+msgid "CSS link \"%(name)s\" has been updated."
+msgstr ""
+
+#: themes/models.py:40
+msgid "Default Misago Theme"
+msgstr ""
+
+#: threads/admin/__init__.py:43
+msgid "Attachment types"
+msgstr ""
+
+#: threads/admin/__init__.py:44
+msgid "Specify what files may be uploaded on the forum."
+msgstr ""
+
+#: threads/admin/forms.py:14
+msgid "Uploader name contains"
+msgstr ""
+
+#: threads/admin/forms.py:15
+msgid "Filename contains"
+msgstr ""
+
+#: threads/admin/forms.py:17
+msgid "File type"
+msgstr ""
+
+#: threads/admin/forms.py:24 users/admin/forms.py:585
+msgid "State"
+msgstr ""
+
+#: threads/admin/forms.py:28
+msgid "Only orphaned"
+msgstr ""
+
+#: threads/admin/forms.py:29
+msgid "Not orphaned"
+msgstr ""
+
+#: threads/admin/forms.py:54
+msgid "Type name"
+msgstr ""
+
+#: threads/admin/forms.py:55
+msgid "File extensions"
+msgstr ""
+
+#: threads/admin/forms.py:57
+msgid "Maximum allowed uploaded file size"
+msgstr ""
+
+#: threads/admin/forms.py:59
+msgid "Limit uploads to"
+msgstr ""
+
+#: threads/admin/forms.py:60
+msgid "Limit downloads to"
+msgstr ""
+
+#: threads/admin/forms.py:64
+msgid ""
+"List of comma separated file extensions associated with this attachment type."
+msgstr ""
+
+#: threads/admin/forms.py:68
+msgid ""
+"Optional list of comma separated mime types associated with this attachment "
+"type."
+msgstr ""
+
+#: threads/admin/forms.py:72
+msgid ""
+"Maximum allowed uploaded file size for this type, in kb. May be overriden "
+"via user permission."
+msgstr ""
+
+#: threads/admin/forms.py:75
+msgid "Controls this attachment type availability on your site."
+msgstr ""
+
+#: threads/admin/forms.py:77
+msgid ""
+"If you wish to limit option to upload files of this type to users with "
+"specific roles, select them on this list. Otherwhise don't select any roles "
+"to allow all users with permission to upload attachments to be able to "
+"upload attachments of this type."
+msgstr ""
+
+#: threads/admin/forms.py:83
+msgid ""
+"If you wish to limit option to download files of this type to users with "
+"specific roles, select them on this list. Otherwhise don't select any roles "
+"to allow all users with permission to download attachments to be able to "
+"download attachments of this type."
+msgstr ""
+
+#: threads/admin/views/attachments.py:14
+msgid "Requested attachment could not be found."
+msgstr ""
+
+#: threads/admin/views/attachments.py:28 users/admin/views/bans.py:26
+#: users/admin/views/users.py:65
+msgid "A to z"
+msgstr ""
+
+#: threads/admin/views/attachments.py:29 users/admin/views/bans.py:27
+#: users/admin/views/users.py:66
+msgid "Z to a"
+msgstr ""
+
+#: threads/admin/views/attachments.py:30
+msgid "Smallest files"
+msgstr ""
+
+#: threads/admin/views/attachments.py:31
+msgid "Largest files"
+msgstr ""
+
+#: threads/admin/views/attachments.py:33
+msgid "With attachments: 0"
+msgstr ""
+
+#: threads/admin/views/attachments.py:34
+msgid "Select attachments"
+msgstr ""
+
+#: threads/admin/views/attachments.py:38
+msgid "Delete attachments"
+msgstr ""
+
+#: threads/admin/views/attachments.py:39
+msgid "Are you sure you want to delete selected attachments?"
+msgstr ""
+
+#: threads/admin/views/attachments.py:62
+msgid "Selected attachments have been deleted."
+msgstr ""
+
+#: threads/admin/views/attachments.py:83
+#, python-format
+msgid "Attachment \"%(filename)s\" has been deleted."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:15
+msgid "Requested attachment type could not be found."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:36
+#, python-format
+msgid "New type \"%(name)s\" has been saved."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:40
+#, python-format
+msgid "Attachment type \"%(name)s\" has been edited."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:47
+#, python-format
+msgid ""
+"Attachment type \"%(name)s\" has associated attachments and can't be deleted."
+msgstr ""
+
+#: threads/admin/views/attachmenttypes.py:54
+#, python-format
+msgid "Attachment type \"%(name)s\" has been deleted."
+msgstr ""
+
+#: threads/api/attachments.py:18
+msgid "You don't have permission to upload new files."
+msgstr ""
+
+#: threads/api/attachments.py:28
+msgid "No file has been uploaded."
+msgstr ""
+
+#: threads/api/attachments.py:48
+msgid "Uploaded image was corrupted or invalid."
+msgstr ""
+
+#: threads/api/attachments.py:86
+msgid "You can't upload files of this type."
+msgstr ""
+
+#: threads/api/attachments.py:92
+#, python-format
+msgid ""
+"You can't upload files larger than %(limit)s (your file has %(upload)s)."
+msgstr ""
+
+#: threads/api/attachments.py:104
+#, python-format
+msgid ""
+"You can't upload files of this type larger than %(limit)s (your file has "
+"%(upload)s)."
+msgstr ""
+
+#: threads/api/postendpoints/edits.py:87
+msgid "Edits record is unavailable for this post."
+msgstr ""
+
+#: threads/api/postendpoints/merge.py:11
+msgid "You can't merge posts in this thread."
+msgstr ""
+
+#: threads/api/postendpoints/move.py:10
+msgid "You can't move posts in this thread."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:36
+msgid "You can't like posts in this category."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:99
+#: threads/api/threadendpoints/patch.py:147
+msgid "Content approval can't be reversed."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:180
+msgid "One or more posts to update could not be found."
+msgstr ""
+
+#: threads/api/postendpoints/patch_post.py:198
+#, python-format
+msgid "No more than %(limit)s post can be updated at a single time."
+msgid_plural "No more than %(limit)s posts can be updated at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/postendpoints/split.py:12
+msgid "You can't split posts from this thread."
+msgstr ""
+
+#: threads/api/postingendpoint/attachments.py:63
+#, python-format
+msgid "You don't have permission to remove \"%(attachment)s\" attachment."
+msgstr ""
+
+#: threads/api/postingendpoint/attachments.py:132
+#, python-format
+msgid ""
+"You can't attach more than %(limit_value)s file to single post (added "
+"%(show_value)s)."
+msgid_plural ""
+"You can't attach more than %(limit_value)s flies to single post (added "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/postingendpoint/category.py:45
+msgid "You have to select category to post thread in."
+msgstr ""
+
+#: threads/api/postingendpoint/category.py:46
+#: threads/api/postingendpoint/category.py:65
+msgid "Selected category is invalid."
+msgstr ""
+
+#: threads/api/postingendpoint/category.py:71
+msgid ""
+"Selected category doesn't exist or you don't have permission to browse it."
+msgstr ""
+
+#: threads/api/postingendpoint/emailnotification.py:43
+#, python-format
+msgid "%(user)s has replied to your thread \"%(thread)s\""
+msgstr ""
+
+#: threads/api/postingendpoint/emailnotification.py:46
+#, python-format
+msgid "%(user)s has replied to thread \"%(thread)s\" that you are watching"
+msgstr ""
+
+#: threads/api/postingendpoint/floodprotection.py:25
+msgid "You can't post message so quickly after previous one."
+msgstr ""
+
+#: threads/api/postingendpoint/floodprotection.py:35
+msgid "Your account has exceed an hourly post limit."
+msgstr ""
+
+#: threads/api/postingendpoint/floodprotection.py:41
+msgid "Your account has exceed a daily post limit."
+msgstr ""
+
+#: threads/api/postingendpoint/participants.py:52
+msgid ""
+"You can't include yourself on the list of users to invite to new thread."
+msgstr ""
+
+#: threads/api/postingendpoint/participants.py:61
+msgid "You have to enter user names."
+msgstr ""
+
+#: threads/api/postingendpoint/participants.py:67
+#, python-format
+msgid ""
+"You can't add more than %(users)s user to private thread (you've added "
+"%(added)s)."
+msgid_plural ""
+"You can't add more than %(users)s users to private thread (you've added "
+"%(added)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/postingendpoint/participants.py:93
+#, python-format
+msgid "One or more users could not be found: %(usernames)s"
+msgstr ""
+
+#: threads/api/postingendpoint/reply.py:81 threads/validators.py:77
+msgid "You have to enter a message."
+msgstr ""
+
+#: threads/api/postingendpoint/reply.py:106
+msgid "You have to enter thread title."
+msgstr ""
+
+#: threads/api/threadendpoints/editor.py:14
+msgid "You need to be signed in to start threads."
+msgstr ""
+
+#: threads/api/threadendpoints/editor.py:60
+msgid ""
+"No categories that allow new threads are available to you at the moment."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:65
+msgid "Not a valid string."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:86
+msgid "You can't change globally pinned threads weights in this category."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:94
+msgid "You can't pin threads globally in this category."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:122
+msgid "You can't move thread to the category it's already in."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:170
+msgid "You don't have permission to close this thread."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:172
+msgid "You don't have permission to open this thread."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:225
+#: threads/api/threadendpoints/patch.py:264
+#: threads/api/threadendpoints/patch.py:327
+#: threads/api/threadendpoints/patch.py:355
+msgid "A valid integer is required."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:238
+msgid "This post is already marked as thread's best answer."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:273
+msgid ""
+"This post can't be unmarked because it's not currently marked as best answer."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:301
+msgid "You have to enter new participant's username."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:304
+msgid "No user with such name exists."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:307
+msgid "This user is already thread participant."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:333
+#: threads/api/threadendpoints/patch.py:364
+msgid "Participant doesn't exist."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:360
+msgid "This user already is thread owner."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:479
+msgid "One or more threads to update could not be found."
+msgstr ""
+
+#: threads/api/threadendpoints/patch.py:496
+#, python-format
+msgid "No more than %(limit)s thread can be updated at a single time."
+msgid_plural "No more than %(limit)s threads can be updated at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/api/threadpoll.py:60
+msgid "There's already a poll in this thread."
+msgstr ""
+
+#: threads/api/threadposts.py:210
+msgid "You can't reply to events."
+msgstr ""
+
+#: threads/api/threadposts.py:212
+msgid "You can't reply to hidden posts."
+msgstr ""
+
+#: threads/api/threadposts.py:245
+msgid "You can't see who liked this post."
+msgstr ""
+
+#: threads/api/threads.py:120
+msgid "You can't start private threads."
+msgstr ""
+
+#: threads/mergeconflict.py:56
+msgid "Unmark all best answers"
+msgstr ""
+
+#: threads/mergeconflict.py:75
+msgid "Delete all polls"
+msgstr ""
+
+#: threads/mergeconflict.py:126 threads/serializers/moderation.py:475
+#: threads/serializers/moderation.py:478 threads/serializers/moderation.py:545
+#: threads/serializers/moderation.py:548
+msgid "Invalid choice."
+msgstr ""
+
+#: threads/models/attachmenttype.py:17
+msgid "Allow uploads and downloads"
+msgstr ""
+
+#: threads/models/attachmenttype.py:18
+msgid "Allow downloads only"
+msgstr ""
+
+#: threads/models/attachmenttype.py:19
+msgid "Disallow both uploading and downloading"
+msgstr ""
+
+#: threads/models/thread.py:17
+msgid "Don't pin thread"
+msgstr ""
+
+#: threads/models/thread.py:18
+msgid "Pin thread within category"
+msgstr ""
+
+#: threads/models/thread.py:19
+msgid "Pin thread globally"
+msgstr ""
+
+#: threads/moderation/posts.py:53
+msgid "You can't make original post visible without revealing thread."
+msgstr ""
+
+#: threads/moderation/posts.py:66
+msgid "You can't hide original post without hiding thread."
+msgstr ""
+
+#: threads/moderation/posts.py:92
+msgid "You can't delete original post without deleting thread."
+msgstr ""
+
+#: threads/participants.py:142
+#, python-format
+msgid ""
+"%(user)s has invited you to participate in private thread \"%(thread)s\""
+msgstr ""
+
+#: threads/permissions/attachments.py:14
+msgid "Max attached file size (in kb)"
+msgstr ""
+
+#: threads/permissions/attachments.py:15
+msgid "Enter 0 to don't allow uploading end deleting attachments."
+msgstr ""
+
+#: threads/permissions/attachments.py:21
+msgid "Can download other users attachments"
+msgstr ""
+
+#: threads/permissions/attachments.py:24
+msgid "Can delete other users attachments"
+msgstr ""
+
+#: threads/permissions/attachments.py:32
+msgid "Can download attachments"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:28
+msgid "Best answers"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:31
+msgid "Can mark posts as best answers"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:34 threads/permissions/bestanswers.py:40
+#: threads/permissions/polls.py:34 threads/permissions/threads.py:120
+msgid "Own threads"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:34 threads/permissions/bestanswers.py:40
+#: threads/permissions/polls.py:34 threads/permissions/threads.py:110
+#: threads/permissions/threads.py:120
+msgid "All threads"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:37
+msgid "Can change marked answers"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:44
+msgid "Time limit for changing marked best answer in owned thread, in minutes"
+msgstr ""
+
+#: threads/permissions/bestanswers.py:47
+msgid ""
+"Enter 0 to don't limit time for changing marked best answer in owned thread."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:134
+#: threads/permissions/bestanswers.py:293
+msgid "You have to sign in to mark best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:141
+#: threads/permissions/bestanswers.py:303
+#, python-format
+msgid ""
+"You don't have permission to mark best answers in the \"%(category)s\" "
+"category."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:153
+#: threads/permissions/bestanswers.py:315
+msgid ""
+"You don't have permission to mark best answer in this thread because you "
+"didn't start it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:162
+#, python-format
+msgid ""
+"You don't have permission to mark best answer in this thread because its "
+"category \"%(category)s\" is closed."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:170
+msgid ""
+"You can't mark best answer in this thread because it's closed and you don't "
+"have permission to open it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:188
+#, python-format
+msgid ""
+"You don't have permission to change this thread's marked answer because it's "
+"in the \"%(category)s\" category."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:198
+msgid ""
+"You don't have permission to change this thread's marked answer because you "
+"are not a thread starter."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:205
+#, python-format
+msgid ""
+"You don't have permission to change best answer that was marked for more "
+"than %(minutes)s minute."
+msgid_plural ""
+"You don't have permission to change best answer that was marked for more "
+"than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/bestanswers.py:216
+msgid ""
+"You don't have permission to change this thread's best answer because a "
+"moderator has protected it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:227
+msgid "You have to sign in to unmark best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:237
+#, python-format
+msgid ""
+"You don't have permission to unmark threads answers in the \"%(category)s\" "
+"category."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:247
+msgid ""
+"You don't have permission to unmark this best answer because you are not a "
+"thread starter."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:254
+#, python-format
+msgid ""
+"You don't have permission to unmark best answer that was marked for more "
+"than %(minutes)s minute."
+msgid_plural ""
+"You don't have permission to unmark best answer that was marked for more "
+"than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/bestanswers.py:266
+#, python-format
+msgid ""
+"You don't have permission to unmark this best answer because its category "
+"\"%(category)s\" is closed."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:274
+msgid ""
+"You can't unmark this thread's best answer because it's closed and you don't "
+"have permission to open it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:282
+msgid ""
+"You don't have permission to unmark this thread's best answer because a "
+"moderator has protected it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:296
+msgid "Events can't be marked as best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:322
+msgid "First post in a thread can't be marked as best answer."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:326
+msgid "Hidden posts can't be marked as best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:329
+msgid "Unapproved posts can't be marked as best answers."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:334
+msgid ""
+"You don't have permission to mark this post as best answer because a "
+"moderator has protected it."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:346
+msgid "You can't hide this post because its marked as best answer."
+msgstr ""
+
+#: threads/permissions/bestanswers.py:356
+msgid "You can't delete this post because its marked as best answer."
+msgstr ""
+
+#: threads/permissions/polls.py:28
+msgid "Polls"
+msgstr ""
+
+#: threads/permissions/polls.py:31
+msgid "Can start polls"
+msgstr ""
+
+#: threads/permissions/polls.py:37
+msgid "Can edit polls"
+msgstr ""
+
+#: threads/permissions/polls.py:40 threads/permissions/polls.py:46
+msgid "Own polls"
+msgstr ""
+
+#: threads/permissions/polls.py:40 threads/permissions/polls.py:46
+msgid "All polls"
+msgstr ""
+
+#: threads/permissions/polls.py:43
+msgid "Can delete polls"
+msgstr ""
+
+#: threads/permissions/polls.py:49
+msgid "Time limit for own polls edits, in minutes"
+msgstr ""
+
+#: threads/permissions/polls.py:50
+msgid "Enter 0 to don't limit time for editing own polls."
+msgstr ""
+
+#: threads/permissions/polls.py:55
+msgid "Can always see polls voters"
+msgstr ""
+
+#: threads/permissions/polls.py:57
+msgid "Allows users to see who voted in poll even if poll votes are secret."
+msgstr ""
+
+#: threads/permissions/polls.py:112
+msgid "You have to sign in to start polls."
+msgstr ""
+
+#: threads/permissions/polls.py:119
+msgid "You can't start polls."
+msgstr ""
+
+#: threads/permissions/polls.py:121
+msgid "You can't start polls in other users threads."
+msgstr ""
+
+#: threads/permissions/polls.py:126
+msgid "This category is closed. You can't start polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:130
+msgid "This thread is closed. You can't start polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:139
+msgid "You have to sign in to edit polls."
+msgstr ""
+
+#: threads/permissions/polls.py:146
+msgid "You can't edit polls."
+msgstr ""
+
+#: threads/permissions/polls.py:151
+msgid "You can't edit other users polls in this category."
+msgstr ""
+
+#: threads/permissions/polls.py:155
+#, python-format
+msgid "You can't edit polls that are older than %(minutes)s minute."
+msgid_plural "You can't edit polls that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/polls.py:162
+msgid "This poll is over. You can't edit it."
+msgstr ""
+
+#: threads/permissions/polls.py:167
+msgid "This category is closed. You can't edit polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:171
+msgid "This thread is closed. You can't edit polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:180
+msgid "You have to sign in to delete polls."
+msgstr ""
+
+#: threads/permissions/polls.py:187
+msgid "You can't delete polls."
+msgstr ""
+
+#: threads/permissions/polls.py:192
+msgid "You can't delete other users polls in this category."
+msgstr ""
+
+#: threads/permissions/polls.py:196
+#, python-format
+msgid "You can't delete polls that are older than %(minutes)s minute."
+msgid_plural "You can't delete polls that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/polls.py:202
+msgid "This poll is over. You can't delete it."
+msgstr ""
+
+#: threads/permissions/polls.py:207
+msgid "This category is closed. You can't delete polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:211
+msgid "This thread is closed. You can't delete polls in it."
+msgstr ""
+
+#: threads/permissions/polls.py:220
+msgid "You have to sign in to vote in polls."
+msgstr ""
+
+#: threads/permissions/polls.py:223
+msgid "You have already voted in this poll."
+msgstr ""
+
+#: threads/permissions/polls.py:225
+msgid "This poll is over. You can't vote in it."
+msgstr ""
+
+#: threads/permissions/polls.py:233
+msgid "This category is closed. You can't vote in it."
+msgstr ""
+
+#: threads/permissions/polls.py:235
+msgid "This thread is closed. You can't vote in it."
+msgstr ""
+
+#: threads/permissions/polls.py:243
+msgid "You dont have permission to this poll's voters."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:35
+msgid "Can use private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:36
+msgid "Can start private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:38
+msgid "Max number of users invited to private thread"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:39
+msgid "Enter 0 to don't limit number of participants."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:44
+msgid "Can add everyone to threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:46
+msgid "Allows user to add users that are blocking them to private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:50
+msgid "Can report private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:52
+msgid ""
+"Allows user to report private threads they are participating in, making them "
+"accessible to moderators."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:57
+msgid "Can moderate private threads"
+msgstr ""
+
+#: threads/permissions/privatethreads.py:59
+msgid ""
+"Allows user to read, reply, edit and delete content in reported private "
+"threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:179
+msgid "You have to sign in to use private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:181
+msgid "You can't use private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:210
+msgid "Only thread owner and moderators can change threads owners."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:214
+msgid "Only moderators can change closed threads owners."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:226
+msgid "You have to be thread owner to add new participants to it."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:231
+msgid "Only moderators can add participants to closed threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:238
+msgid "You can't add any more new users to this thread."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:253
+msgid "Only moderators can remove participants from closed threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:258
+msgid "You have to be thread owner to remove participants from it."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:270
+#, python-format
+msgid "%(user)s can't participate in private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:277
+#, python-format
+msgid "%(user)s is blocking you."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:281
+#, python-format
+msgid "%(user)s is not allowing invitations to private threads."
+msgstr ""
+
+#: threads/permissions/privatethreads.py:288
+#, python-format
+msgid "%(user)s limits invitations to private threads to followed users."
+msgstr ""
+
+#: threads/permissions/threads.py:76
+msgid "Can see unapproved content list"
+msgstr ""
+
+#: threads/permissions/threads.py:78
+msgid ""
+"Allows access to \"unapproved\" tab on threads lists for easy listing of "
+"threads that are unapproved or contain unapproved posts. Despite the tab "
+"being available on all threads lists, it will only display threads belonging "
+"to categories in which the user has permission to approve content."
+msgstr ""
+
+#: threads/permissions/threads.py:87
+msgid "Can see reported content list"
+msgstr ""
+
+#: threads/permissions/threads.py:89
+msgid ""
+"Allows access to \"reported\" tab on threads lists for easy listing of "
+"threads that contain reported posts. Despite the tab being available on all "
+"categories threads lists, it will only display threads belonging to "
+"categories in which the user has permission to see posts reports."
+msgstr ""
+
+#: threads/permissions/threads.py:98
+msgid "Can omit flood protection"
+msgstr ""
+
+#: threads/permissions/threads.py:99
+msgid "Allows posting more frequently than flood protection would."
+msgstr ""
+
+#: threads/permissions/threads.py:107
+msgid "Can see threads"
+msgstr ""
+
+#: threads/permissions/threads.py:113
+msgid "Can start threads"
+msgstr ""
+
+#: threads/permissions/threads.py:114
+msgid "Can reply to threads"
+msgstr ""
+
+#: threads/permissions/threads.py:117
+msgid "Can edit threads"
+msgstr ""
+
+#: threads/permissions/threads.py:123
+msgid "Can hide own threads"
+msgstr ""
+
+#: threads/permissions/threads.py:125
+msgid ""
+"Only threads started within time limit and with no replies can be hidden."
+msgstr ""
+
+#: threads/permissions/threads.py:130 threads/permissions/threads.py:142
+msgid "Hide threads"
+msgstr ""
+
+#: threads/permissions/threads.py:130 threads/permissions/threads.py:142
+msgid "Delete threads"
+msgstr ""
+
+#: threads/permissions/threads.py:133
+msgid "Time limit for own threads edits, in minutes"
+msgstr ""
+
+#: threads/permissions/threads.py:134
+msgid "Enter 0 to don't limit time for editing own threads."
+msgstr ""
+
+#: threads/permissions/threads.py:139
+msgid "Can hide all threads"
+msgstr ""
+
+#: threads/permissions/threads.py:146
+msgid "Can pin threads"
+msgstr ""
+
+#: threads/permissions/threads.py:149
+msgid "Locally"
+msgstr ""
+
+#: threads/permissions/threads.py:149
+msgid "Globally"
+msgstr ""
+
+#: threads/permissions/threads.py:151
+msgid "Can close threads"
+msgstr ""
+
+#: threads/permissions/threads.py:152
+msgid "Can move threads"
+msgstr ""
+
+#: threads/permissions/threads.py:153
+msgid "Can merge threads"
+msgstr ""
+
+#: threads/permissions/threads.py:156
+msgid "Can edit posts"
+msgstr ""
+
+#: threads/permissions/threads.py:159
+msgid "Own posts"
+msgstr ""
+
+#: threads/permissions/threads.py:159
+msgid "All posts"
+msgstr ""
+
+#: threads/permissions/threads.py:162
+msgid "Can hide own posts"
+msgstr ""
+
+#: threads/permissions/threads.py:164
+msgid "Only last posts to thread made within edit time limit can be hidden."
+msgstr ""
+
+#: threads/permissions/threads.py:168 threads/permissions/threads.py:180
+msgid "Hide posts"
+msgstr ""
+
+#: threads/permissions/threads.py:168 threads/permissions/threads.py:180
+msgid "Delete posts"
+msgstr ""
+
+#: threads/permissions/threads.py:171
+msgid "Time limit for own post edits, in minutes"
+msgstr ""
+
+#: threads/permissions/threads.py:172
+msgid "Enter 0 to don't limit time for editing own posts."
+msgstr ""
+
+#: threads/permissions/threads.py:177
+msgid "Can hide all posts"
+msgstr ""
+
+#: threads/permissions/threads.py:184
+msgid "Can see posts likes"
+msgstr ""
+
+#: threads/permissions/threads.py:189
+msgid "Number only"
+msgstr ""
+
+#: threads/permissions/threads.py:190
+msgid "Number and list of likers"
+msgstr ""
+
+#: threads/permissions/threads.py:194
+msgid "Can like posts"
+msgstr ""
+
+#: threads/permissions/threads.py:195
+msgid "Only users with this permission to see likes can like posts."
+msgstr ""
+
+#: threads/permissions/threads.py:199
+msgid "Can protect posts"
+msgstr ""
+
+#: threads/permissions/threads.py:200
+msgid "Only users with this permission can edit protected posts."
+msgstr ""
+
+#: threads/permissions/threads.py:203
+msgid "Can move posts"
+msgstr ""
+
+#: threads/permissions/threads.py:204
+msgid "Will be able to move posts to other threads."
+msgstr ""
+
+#: threads/permissions/threads.py:206
+msgid "Can merge posts"
+msgstr ""
+
+#: threads/permissions/threads.py:208
+msgid "Can approve content"
+msgstr ""
+
+#: threads/permissions/threads.py:209
+msgid "Will be able to see and approve unapproved content."
+msgstr ""
+
+#: threads/permissions/threads.py:211
+msgid "Can report posts"
+msgstr ""
+
+#: threads/permissions/threads.py:212
+msgid "Can see reports"
+msgstr ""
+
+#: threads/permissions/threads.py:215
+msgid "Can hide events"
+msgstr ""
+
+#: threads/permissions/threads.py:218
+msgid "Hide events"
+msgstr ""
+
+#: threads/permissions/threads.py:218
+msgid "Delete events"
+msgstr ""
+
+#: threads/permissions/threads.py:221
+msgid "Require threads approval"
+msgstr ""
+
+#: threads/permissions/threads.py:222
+msgid "Require replies approval"
+msgstr ""
+
+#: threads/permissions/threads.py:223
+msgid "Require edits approval"
+msgstr ""
+
+#: threads/permissions/threads.py:539
+msgid "You have to sign in to start threads."
+msgstr ""
+
+#: threads/permissions/threads.py:545
+msgid "You don't have permission to start new threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:550
+msgid "This category is closed. You can't start new threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:559
+msgid "You have to sign in to reply threads."
+msgstr ""
+
+#: threads/permissions/threads.py:566
+msgid "You can't reply to threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:571
+msgid "This category is closed. You can't reply to threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:575
+msgid "You can't reply to closed threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:584
+msgid "You have to sign in to edit threads."
+msgstr ""
+
+#: threads/permissions/threads.py:591
+msgid "You can't edit threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:596
+msgid "You can't edit other users threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:601
+#, python-format
+msgid "You can't edit threads that are older than %(minutes)s minute."
+msgid_plural "You can't edit threads that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:612
+msgid "This category is closed. You can't edit threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:615
+msgid "This thread is closed. You can't edit it."
+msgstr ""
+
+#: threads/permissions/threads.py:623
+msgid "You have to sign in to change threads weights."
+msgstr ""
+
+#: threads/permissions/threads.py:630
+msgid "You can't change threads weights in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:635
+msgid "This category is closed. You can't change threads weights in it."
+msgstr ""
+
+#: threads/permissions/threads.py:639
+msgid "This thread is closed. You can't change its weight."
+msgstr ""
+
+#: threads/permissions/threads.py:648 threads/permissions/threads.py:668
+msgid "You have to sign in to hide threads."
+msgstr ""
+
+#: threads/permissions/threads.py:657
+msgid "This category is closed. You can't reveal threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:660
+msgid "This thread is closed. You can't reveal it."
+msgstr ""
+
+#: threads/permissions/threads.py:678
+msgid "You can't hide threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:683
+msgid "You can't hide other users theads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:688
+#, python-format
+msgid "You can't hide threads that are older than %(minutes)s minute."
+msgid_plural "You can't hide threads that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:699
+msgid "This category is closed. You can't hide threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:702
+msgid "This thread is closed. You can't hide it."
+msgstr ""
+
+#: threads/permissions/threads.py:710
+msgid "You have to sign in to delete threads."
+msgstr ""
+
+#: threads/permissions/threads.py:720
+msgid "You can't delete threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:728
+msgid "You can't delete other users theads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:733
+#, python-format
+msgid "You can't delete threads that are older than %(minutes)s minute."
+msgid_plural ""
+"You can't delete threads that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:744
+msgid "This category is closed. You can't delete threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:747
+msgid "This thread is closed. You can't delete it."
+msgstr ""
+
+#: threads/permissions/threads.py:755
+msgid "You have to sign in to move threads."
+msgstr ""
+
+#: threads/permissions/threads.py:762
+msgid "You can't move threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:767
+msgid "This category is closed. You can't move it's threads."
+msgstr ""
+
+#: threads/permissions/threads.py:770
+msgid "This thread is closed. You can't move it."
+msgstr ""
+
+#: threads/permissions/threads.py:778
+msgid "You have to sign in to merge threads."
+msgstr ""
+
+#: threads/permissions/threads.py:786
+msgid "Other thread can't be merged with."
+msgstr ""
+
+#: threads/permissions/threads.py:787
+msgid "You can't merge threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:793
+msgid "Other thread's category is closed. You can't merge with it."
+msgstr ""
+
+#: threads/permissions/threads.py:796
+msgid "This category is closed. You can't merge it's threads."
+msgstr ""
+
+#: threads/permissions/threads.py:801
+msgid "Other thread is closed and can't be merged with."
+msgstr ""
+
+#: threads/permissions/threads.py:804
+msgid "This thread is closed. You can't merge it with other threads."
+msgstr ""
+
+#: threads/permissions/threads.py:813
+msgid "You have to sign in to approve threads."
+msgstr ""
+
+#: threads/permissions/threads.py:820
+msgid "You can't approve threads in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:825
+msgid "This category is closed. You can't approve threads in it."
+msgstr ""
+
+#: threads/permissions/threads.py:828
+msgid "This thread is closed. You can't approve it."
+msgstr ""
+
+#: threads/permissions/threads.py:858
+msgid "You have to sign in to edit posts."
+msgstr ""
+
+#: threads/permissions/threads.py:861
+msgid "Events can't be edited."
+msgstr ""
+
+#: threads/permissions/threads.py:868
+msgid "You can't edit posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:875
+msgid "This post is hidden, you can't edit it."
+msgstr ""
+
+#: threads/permissions/threads.py:880
+msgid "You can't edit other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:884
+msgid "This post is protected. You can't edit it."
+msgstr ""
+
+#: threads/permissions/threads.py:888
+#, python-format
+msgid "You can't edit posts that are older than %(minutes)s minute."
+msgid_plural "You can't edit posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:899
+msgid "This category is closed. You can't edit posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:903
+msgid "This thread is closed. You can't edit posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:912
+msgid "You have to sign in to reveal posts."
+msgstr ""
+
+#: threads/permissions/threads.py:920
+msgid "You can't reveal posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:924
+msgid "You can't reveal other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:928
+msgid "This post is protected. You can't reveal it."
+msgstr ""
+
+#: threads/permissions/threads.py:932
+#, python-format
+msgid "You can't reveal posts that are older than %(minutes)s minute."
+msgid_plural "You can't reveal posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:941
+msgid "You can't reveal thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:946
+msgid "This category is closed. You can't reveal posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:950
+msgid "This thread is closed. You can't reveal posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:959
+msgid "You have to sign in to hide posts."
+msgstr ""
+
+#: threads/permissions/threads.py:967
+msgid "You can't hide posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:971
+msgid "You can't hide other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:975
+msgid "This post is protected. You can't hide it."
+msgstr ""
+
+#: threads/permissions/threads.py:979
+#, python-format
+msgid "You can't hide posts that are older than %(minutes)s minute."
+msgid_plural "You can't hide posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:988
+msgid "You can't hide thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:993
+msgid "This category is closed. You can't hide posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:997
+msgid "This thread is closed. You can't hide posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1006
+msgid "You have to sign in to delete posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1014
+msgid "You can't delete posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1018
+msgid "You can't delete other users posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1022
+msgid "This post is protected. You can't delete it."
+msgstr ""
+
+#: threads/permissions/threads.py:1026
+#, python-format
+msgid "You can't delete posts that are older than %(minutes)s minute."
+msgid_plural "You can't delete posts that are older than %(minutes)s minutes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/permissions/threads.py:1035
+msgid "You can't delete thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1040
+msgid "This category is closed. You can't delete posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1044
+msgid "This thread is closed. You can't delete posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1053
+msgid "You have to sign in to protect posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1060
+msgid "You can't protect posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1062
+msgid "You can't protect posts you can't edit."
+msgstr ""
+
+#: threads/permissions/threads.py:1070
+msgid "You have to sign in to approve posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1077
+msgid "You can't approve posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1079
+msgid "You can't approve thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1085
+msgid "You can't approve posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1090
+msgid "This category is closed. You can't approve posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1094
+msgid "This thread is closed. You can't approve posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1103
+msgid "You have to sign in to move posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1110
+msgid "You can't move posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1112
+msgid "Events can't be moved."
+msgstr ""
+
+#: threads/permissions/threads.py:1114
+msgid "You can't move thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1116
+msgid "You can't move posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1121
+msgid "This category is closed. You can't move posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1125
+msgid "This thread is closed. You can't move posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1134
+msgid "You have to sign in to merge posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1141
+msgid "You can't merge posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1143
+msgid "Events can't be merged."
+msgstr ""
+
+#: threads/permissions/threads.py:1149
+msgid "You can't merge posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1154
+msgid "This category is closed. You can't merge posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1158
+msgid "This thread is closed. You can't merge posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1167
+msgid "You have to sign in to split posts."
+msgstr ""
+
+#: threads/permissions/threads.py:1174
+msgid "You can't split posts in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1176
+msgid "Events can't be split."
+msgstr ""
+
+#: threads/permissions/threads.py:1178
+msgid "You can't split thread's first post."
+msgstr ""
+
+#: threads/permissions/threads.py:1180
+msgid "You can't split posts the content you can't see."
+msgstr ""
+
+#: threads/permissions/threads.py:1185
+msgid "This category is closed. You can't split posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1189
+msgid "This thread is closed. You can't split posts in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1198
+msgid "You have to sign in to reveal events."
+msgstr ""
+
+#: threads/permissions/threads.py:1205
+msgid "You can't reveal events in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1210
+msgid "This category is closed. You can't reveal events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1214
+msgid "This thread is closed. You can't reveal events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1223
+msgid "You have to sign in to hide events."
+msgstr ""
+
+#: threads/permissions/threads.py:1230
+msgid "You can't hide events in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1235
+msgid "This category is closed. You can't hide events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1239
+msgid "This thread is closed. You can't hide events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1248
+msgid "You have to sign in to delete events."
+msgstr ""
+
+#: threads/permissions/threads.py:1255
+msgid "You can't delete events in this category."
+msgstr ""
+
+#: threads/permissions/threads.py:1260
+msgid "This category is closed. You can't delete events in it."
+msgstr ""
+
+#: threads/permissions/threads.py:1264
+msgid "This thread is closed. You can't delete events in it."
+msgstr ""
+
+#: threads/serializers/moderation.py:49
+msgid "You have to specify at least one post to delete."
+msgstr ""
+
+#: threads/serializers/moderation.py:56 threads/serializers/moderation.py:111
+#: threads/serializers/moderation.py:205 threads/serializers/moderation.py:363
+msgid "One or more post ids received were invalid."
+msgstr ""
+
+#: threads/serializers/moderation.py:70
+#, python-format
+msgid "No more than %(limit)s post can be deleted at a single time."
+msgid_plural "No more than %(limit)s posts can be deleted at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:98
+msgid "One or more posts to delete could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:105
+msgid "You have to select at least two posts to merge."
+msgstr ""
+
+#: threads/serializers/moderation.py:128
+#, python-format
+msgid "No more than %(limit)s post can be merged at a single time."
+msgid_plural "No more than %(limit)s posts can be merged at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:156
+msgid "Posts made by different users can't be merged."
+msgstr ""
+
+#: threads/serializers/moderation.py:169
+msgid "Post marked as best answer can't be merged with thread's first post."
+msgstr ""
+
+#: threads/serializers/moderation.py:180
+msgid "Posts with different visibility can't be merged."
+msgstr ""
+
+#: threads/serializers/moderation.py:187
+msgid "One or more posts to merge could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:195
+msgid "You have to specify at least one post to move."
+msgstr ""
+
+#: threads/serializers/moderation.py:199 threads/serializers/moderation.py:472
+msgid "Enter link to new thread."
+msgstr ""
+
+#: threads/serializers/moderation.py:222 threads/serializers/moderation.py:488
+msgid "This is not a valid thread link."
+msgstr ""
+
+#: threads/serializers/moderation.py:225
+msgid "Thread to move posts to is same as current one."
+msgstr ""
+
+#: threads/serializers/moderation.py:233 threads/serializers/moderation.py:500
+msgid ""
+"The thread you have entered link to doesn't exist or you don't have "
+"permission to see it."
+msgstr ""
+
+#: threads/serializers/moderation.py:240
+msgid "You can't move posts to threads you can't reply."
+msgstr ""
+
+#: threads/serializers/moderation.py:250
+#, python-format
+msgid "No more than %(limit)s post can be moved at a single time."
+msgid_plural "No more than %(limit)s posts can be moved at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:277
+msgid "One or more posts to move could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:305
+msgid "You can't create new threads in selected category."
+msgstr ""
+
+#: threads/serializers/moderation.py:319
+msgid "You don't have permission to pin threads globally in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:325
+msgid "You don't have permission to pin threads in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:337
+msgid "You don't have permission to hide threads in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:349
+msgid "You don't have permission to close threads in this category."
+msgstr ""
+
+#: threads/serializers/moderation.py:356
+msgid "You have to specify at least one post to split."
+msgstr ""
+
+#: threads/serializers/moderation.py:377
+#, python-format
+msgid "No more than %(limit)s post can be split at a single time."
+msgid_plural "No more than %(limit)s posts can be split at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:404
+msgid "One or more posts to split could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:411
+msgid "You have to specify at least one thread to delete."
+msgstr ""
+
+#: threads/serializers/moderation.py:418 threads/serializers/moderation.py:534
+msgid "One or more thread ids received were invalid."
+msgstr ""
+
+#: threads/serializers/moderation.py:432
+#, python-format
+msgid "No more than %(limit)s thread can be deleted at a single time."
+msgid_plural "No more than %(limit)s threads can be deleted at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:464
+msgid "One or more threads to delete could not be found."
+msgstr ""
+
+#: threads/serializers/moderation.py:490
+msgid "You can't merge thread with itself."
+msgstr ""
+
+#: threads/serializers/moderation.py:507
+msgid "You can't merge this thread into thread you can't reply."
+msgstr ""
+
+#: threads/serializers/moderation.py:526
+msgid "You have to select at least two threads to merge."
+msgstr ""
+
+#: threads/serializers/moderation.py:555
+#, python-format
+msgid "No more than %(limit)s thread can be merged at a single time."
+msgid_plural "No more than %(limit)s threads can be merged at a single time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/moderation.py:578
+msgid "One or more threads to merge could not be found."
+msgstr ""
+
+#: threads/serializers/poll.py:106
+msgid "One or more poll choices are invalid."
+msgstr ""
+
+#: threads/serializers/poll.py:116
+msgid "You need to add at least two choices to a poll."
+msgstr ""
+
+#: threads/serializers/poll.py:122
+#, python-format
+msgid ""
+"You can't add more than %(limit_value)s option to a single poll (added "
+"%(show_value)s)."
+msgid_plural ""
+"You can't add more than %(limit_value)s options to a single poll (added "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/poll.py:134
+msgid "Number of allowed choices can't be greater than number of all choices."
+msgstr ""
+
+#: threads/serializers/pollvote.py:15
+#, python-format
+msgid "This poll disallows voting for more than %(choices)s choice."
+msgid_plural "This poll disallows voting for more than %(choices)s choices."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/serializers/pollvote.py:32
+msgid "One or more of poll choices were invalid."
+msgstr ""
+
+#: threads/serializers/pollvote.py:36
+msgid "You have to make a choice."
+msgstr ""
+
+#: threads/signals.py:168
+msgid "Question"
+msgstr ""
+
+#: threads/signals.py:169
+msgid "Choices"
+msgstr ""
+
+#: threads/templatetags/misago_poststags.py:17
+#, python-format
+msgid "%(user)s likes this."
+msgstr ""
+
+#: threads/templatetags/misago_poststags.py:26
+#, python-format
+msgid "%(users)s like this."
+msgstr ""
+
+#: threads/templatetags/misago_poststags.py:29
+#, python-format
+msgid "%(users)s and %(likes)s other user like this."
+msgid_plural "%(users)s and %(likes)s other users like this."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/templatetags/misago_poststags.py:41
+#, python-format
+msgid "%(users)s and %(last_user)s"
+msgstr ""
+
+#: threads/threadtypes/thread.py:14
+msgid "None (will become top level category)"
+msgstr ""
+
+#: threads/validators.py:27
+msgid "Requested category could not be found."
+msgstr ""
+
+#: threads/validators.py:30
+msgid "You don't have permission to access this category."
+msgstr ""
+
+#: threads/validators.py:37
+msgid "Thread title should contain alpha-numeric characters."
+msgstr ""
+
+#: threads/validators.py:38
+msgid "Thread title is too long."
+msgstr ""
+
+#: threads/validators.py:46
+msgid "You have to enter an thread title."
+msgstr ""
+
+#: threads/validators.py:51
+#, python-format
+msgid ""
+"Thread title should be at least %(limit_value)s character long (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Thread title should be at least %(limit_value)s characters long (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/validators.py:63
+#, python-format
+msgid ""
+"Thread title cannot be longer than %(limit_value)s character (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Thread title cannot be longer than %(limit_value)s characters (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/validators.py:82
+#, python-format
+msgid ""
+"Posted message should be at least %(limit_value)s character long (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Posted message should be at least %(limit_value)s characters long (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/validators.py:93
+#, python-format
+msgid ""
+"Posted message cannot be longer than %(limit_value)s character (it has "
+"%(show_value)s)."
+msgid_plural ""
+"Posted message cannot be longer than %(limit_value)s characters (it has "
+"%(show_value)s)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: threads/viewmodels/threads.py:23
+msgid "Your threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:24
+msgid "New threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:25
+msgid "Unread threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:26
+msgid "Subscribed threads"
+msgstr ""
+
+#: threads/viewmodels/threads.py:27
+msgid "Unapproved content"
+msgstr ""
+
+#: threads/viewmodels/threads.py:32
+msgid "You have to sign in to see list of threads that you have started."
+msgstr ""
+
+#: threads/viewmodels/threads.py:34
+msgid "You have to sign in to see list of threads you haven't read."
+msgstr ""
+
+#: threads/viewmodels/threads.py:36
+msgid "You have to sign in to see list of threads with new replies."
+msgstr ""
+
+#: threads/viewmodels/threads.py:39
+msgid "You have to sign in to see list of threads you are subscribing."
+msgstr ""
+
+#: threads/viewmodels/threads.py:42
+msgid "You have to sign in to see list of threads with unapproved posts."
+msgstr ""
+
+#: threads/viewmodels/threads.py:113
+msgid "You don't have permission to see unapproved content lists."
+msgstr ""
+
+#: threads/views/goto.py:130
+msgid ""
+"You need permission to approve content to be able to go to first unapproved "
+"post."
+msgstr ""
+
+#: users/admin/__init__.py:77
+msgid "Bans"
+msgstr ""
+
+#: users/admin/__init__.py:87
+msgid "Ranks"
+msgstr ""
+
+#: users/admin/djangoadmin.py:42
+msgid "Misago user data"
+msgstr ""
+
+#: users/admin/djangoadmin.py:56
+msgid "Edit permissions and groups"
+msgstr ""
+
+#: users/admin/djangoadmin.py:76
+msgid "Edit the user from Misago admin panel"
+msgstr ""
+
+#: users/admin/forms.py:22 users/admin/forms.py:313 users/models/ban.py:71
+#: users/signals.py:29
+msgid "Username"
+msgstr ""
+
+#: users/admin/forms.py:23
+msgid "Custom title"
+msgstr ""
+
+#: users/admin/forms.py:24 users/models/ban.py:72
+msgid "E-mail address"
+msgstr ""
+
+#: users/admin/forms.py:59
+msgid "All registered members must have a \"Member\" role."
+msgstr ""
+
+#: users/admin/forms.py:76
+msgid "Is administrator"
+msgstr ""
+
+#: users/admin/forms.py:78
+msgid ""
+"Designates whether the user can log into admin sites. If Django admin site "
+"is enabled, this user will need additional permissions assigned within it to "
+"admin Django modules."
+msgstr ""
+
+#: users/admin/forms.py:84
+msgid "Is superuser"
+msgstr ""
+
+#: users/admin/forms.py:86
+msgid ""
+"Only administrators can access admin sites. In addition to admin site "
+"access, superadmins can also change other members admin levels."
+msgstr ""
+
+#: users/admin/forms.py:91
+msgid "Is active"
+msgstr ""
+
+#: users/admin/forms.py:93
+msgid ""
+"Designates whether this user should be treated as active. Turning this off "
+"is non-destructible way to remove user accounts."
+msgstr ""
+
+#: users/admin/forms.py:97 users/admin/forms.py:128 users/admin/forms.py:158
+msgid "Staff message"
+msgstr ""
+
+#: users/admin/forms.py:99
+msgid ""
+"Optional message for forum team members explaining why user's account has "
+"been disabled."
+msgstr ""
+
+#: users/admin/forms.py:104
+msgid "Change password to"
+msgstr ""
+
+#: users/admin/forms.py:111
+msgid "Lock avatar"
+msgstr ""
+
+#: users/admin/forms.py:113
+msgid ""
+"Setting this to yes will stop user from changing his/her avatar, and will "
+"reset his/her avatar to procedurally generated one."
+msgstr ""
+
+#: users/admin/forms.py:119 users/admin/forms.py:150 users/admin/forms.py:457
+#: users/admin/forms.py:524
+msgid "User message"
+msgstr ""
+
+#: users/admin/forms.py:121
+msgid ""
+"Optional message for user explaining why he/she is banned form changing "
+"avatar."
+msgstr ""
+
+#: users/admin/forms.py:130
+msgid ""
+"Optional message for forum team members explaining why user is banned form "
+"changing avatar."
+msgstr ""
+
+#: users/admin/forms.py:138
+msgid "Signature contents"
+msgstr ""
+
+#: users/admin/forms.py:143
+msgid "Lock signature"
+msgstr ""
+
+#: users/admin/forms.py:145
+msgid ""
+"Setting this to yes will stop user from making changes to his/her signature."
+msgstr ""
+
+#: users/admin/forms.py:152
+msgid "Optional message to user explaining why his/hers signature is locked."
+msgstr ""
+
+#: users/admin/forms.py:160
+msgid ""
+"Optional message to team members explaining why user signature is locked."
+msgstr ""
+
+#: users/admin/forms.py:166
+msgid "Hides presence"
+msgstr ""
+
+#: users/admin/forms.py:169
+msgid "Who can add user to private threads"
+msgstr ""
+
+#: users/admin/forms.py:178
+msgid "Replid threads"
+msgstr ""
+
+#: users/admin/forms.py:221 users/serializers/moderation.py:36
+#, python-format
+msgid "Signature can't be longer than %(limit)s character."
+msgid_plural "Signature can't be longer than %(limit)s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/admin/forms.py:240
+msgid ""
+"Ranks are used to group and distinguish users. They are also used to add "
+"permissions to groups of users."
+msgstr ""
+
+#: users/admin/forms.py:252
+msgid "Individual roles of this user. All users must have a \"Member\" role."
+msgstr ""
+
+#: users/admin/forms.py:315
+msgid "Profile fields contain"
+msgstr ""
+
+#: users/admin/forms.py:316
+msgid "Requires activation"
+msgstr ""
+
+#: users/admin/forms.py:318
+msgid "Administrator"
+msgstr ""
+
+#: users/admin/forms.py:319
+msgid "Deletes their account"
+msgstr ""
+
+#: users/admin/forms.py:364
+msgid "All ranks"
+msgstr ""
+
+#: users/admin/forms.py:368
+msgid "All roles"
+msgstr ""
+
+#: users/admin/forms.py:374
+msgid "Has rank"
+msgstr ""
+
+#: users/admin/forms.py:377
+msgid "Has role"
+msgstr ""
+
+#: users/admin/forms.py:389
+msgid ""
+"Short and descriptive name of all users with this rank. \"The Team\" or "
+"\"Game Masters\" are good examples."
+msgstr ""
+
+#: users/admin/forms.py:394
+msgid "User title"
+msgstr ""
+
+#: users/admin/forms.py:397
+msgid ""
+"Optional, singular version of rank name displayed by user names. For example "
+"\"GM\" or \"Dev\"."
+msgstr ""
+
+#: users/admin/forms.py:407
+msgid ""
+"Optional description explaining function or status of members distincted "
+"with this rank."
+msgstr ""
+
+#: users/admin/forms.py:412
+msgid "User roles"
+msgstr ""
+
+#: users/admin/forms.py:416
+msgid "Rank can give additional roles to users with it."
+msgstr ""
+
+#: users/admin/forms.py:422
+msgid "Optional css class added to content belonging to this rank owner."
+msgstr ""
+
+#: users/admin/forms.py:426
+msgid "Give rank dedicated tab on users list"
+msgstr ""
+
+#: users/admin/forms.py:429
+msgid ""
+"Selecting this option will make users with this rank easily discoverable by "
+"others through dedicated page on forum users list."
+msgstr ""
+
+#: users/admin/forms.py:447
+msgid "This name collides with other rank."
+msgstr ""
+
+#: users/admin/forms.py:454
+msgid "Values to ban"
+msgstr ""
+
+#: users/admin/forms.py:460
+msgid "Optional message displayed to users instead of default one."
+msgstr ""
+
+#: users/admin/forms.py:463 users/admin/forms.py:473 users/admin/forms.py:530
+#: users/admin/forms.py:540
+msgid "Message can't be longer than 1000 characters."
+msgstr ""
+
+#: users/admin/forms.py:467 users/admin/forms.py:534
+msgid "Team message"
+msgstr ""
+
+#: users/admin/forms.py:470 users/admin/forms.py:537
+msgid "Optional ban message for moderators and administrators."
+msgstr ""
+
+#: users/admin/forms.py:476 users/admin/forms.py:543
+msgid "Expiration date"
+msgstr ""
+
+#: users/admin/forms.py:485 users/admin/forms.py:574
+msgid "E-mails"
+msgstr ""
+
+#: users/admin/forms.py:486
+msgid "E-mail domains"
+msgstr ""
+
+#: users/admin/forms.py:493
+msgid "First segment of IP addresses"
+msgstr ""
+
+#: users/admin/forms.py:494
+msgid "First two segments of IP addresses"
+msgstr ""
+
+#: users/admin/forms.py:500
+msgid "Check type"
+msgstr ""
+
+#: users/admin/forms.py:503
+msgid "Restrict this ban to registrations"
+msgstr ""
+
+#: users/admin/forms.py:505
+msgid ""
+"Changing this to yes will make this ban check be only performed on "
+"registration step. This is good if you want to block certain registrations "
+"like ones from recently comprimised e-mail providers, without harming "
+"existing users."
+msgstr ""
+
+#: users/admin/forms.py:512
+msgid "Banned value"
+msgstr ""
+
+#: users/admin/forms.py:515
+msgid ""
+"This value is case-insensitive and accepts asterisk (*) for rought matches. "
+"For example, making IP ban for value \"83.*\" will ban all IP addresses "
+"beginning with \"83.\"."
+msgstr ""
+
+#: users/admin/forms.py:520
+msgid "Banned value can't be longer than 250 characters."
+msgstr ""
+
+#: users/admin/forms.py:527
+msgid "Optional message displayed to user instead of default one."
+msgstr ""
+
+#: users/admin/forms.py:562
+msgid "Banned value is too vague."
+msgstr ""
+
+#: users/admin/forms.py:572
+msgid "All bans"
+msgstr ""
+
+#: users/admin/forms.py:575
+msgid "IPs"
+msgstr ""
+
+#: users/admin/forms.py:578
+msgid "Banned value begins with"
+msgstr ""
+
+#: users/admin/forms.py:582 users/admin/forms.py:587
+msgid "Any"
+msgstr ""
+
+#: users/admin/forms.py:622
+msgid "Usernames or emails"
+msgstr ""
+
+#: users/admin/forms.py:624
+msgid ""
+"Enter every item in new line. Duplicates will be ignored. This field is case "
+"insensitive. Depending on site configuration and amount of data to archive "
+"it may take up to few days for requests to complete. E-mail will "
+"notification will be sent to every user once their download is ready."
+msgstr ""
+
+#: users/admin/forms.py:641
+#, python-format
+msgid ""
+"You may not enter more than 20 items at a single time (You have entered "
+"%(show_value)s)."
+msgstr ""
+
+#: users/admin/forms.py:660
+msgid "One or more specified users could not be found."
+msgstr ""
+
+#: users/admin/views/bans.py:14
+msgid "Requested ban does not exist."
+msgstr ""
+
+#: users/admin/views/bans.py:30
+msgid "With bans: 0"
+msgstr ""
+
+#: users/admin/views/bans.py:31
+msgid "Select bans"
+msgstr ""
+
+#: users/admin/views/bans.py:35
+msgid "Remove bans"
+msgstr ""
+
+#: users/admin/views/bans.py:36
+msgid "Are you sure you want to remove those bans?"
+msgstr ""
+
+#: users/admin/views/bans.py:43
+msgid "Selected bans have been removed."
+msgstr ""
+
+#: users/admin/views/bans.py:47
+#, python-format
+msgid "New ban \"%(name)s\" has been saved."
+msgstr ""
+
+#: users/admin/views/bans.py:51
+#, python-format
+msgid "Ban \"%(name)s\" has been edited."
+msgstr ""
+
+#: users/admin/views/bans.py:58
+#, python-format
+msgid "Ban \"%(name)s\" has been removed."
+msgstr ""
+
+#: users/admin/views/datadownloads.py:23
+msgid "With data downloads: 0"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:24
+msgid "Select data downloads"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:28
+msgid "Expire downloads"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:30
+msgid "Are you sure you want to set selected data downloads as expired?"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:35
+msgid "Delete downloads"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:37
+msgid "Are you sure you want to delete selected data downloads?"
+msgstr ""
+
+#: users/admin/views/datadownloads.py:52
+msgid "Selected data downloads have been set as expired."
+msgstr ""
+
+#: users/admin/views/datadownloads.py:59
+msgid "Selected data downloads have been deleted."
+msgstr ""
+
+#: users/admin/views/datadownloads.py:71
+msgid "Data downloads have been requested for specified users."
+msgstr ""
+
+#: users/admin/views/ranks.py:16
+msgid "Requested rank does not exist."
+msgstr ""
+
+#: users/admin/views/ranks.py:33
+#, python-format
+msgid "New rank \"%(name)s\" has been saved."
+msgstr ""
+
+#: users/admin/views/ranks.py:37
+#, python-format
+msgid "Rank \"%(name)s\" has been edited."
+msgstr ""
+
+#: users/admin/views/ranks.py:44
+#, python-format
+msgid "Rank \"%(name)s\" is default rank and can't be deleted."
+msgstr ""
+
+#: users/admin/views/ranks.py:47
+#, python-format
+msgid "Rank \"%(name)s\" is assigned to users and can't be deleted."
+msgstr ""
+
+#: users/admin/views/ranks.py:52
+#, python-format
+msgid "Rank \"%(name)s\" has been deleted."
+msgstr ""
+
+#: users/admin/views/ranks.py:69
+#, python-format
+msgid "Rank \"%(name)s\" has been moved below \"%(other)s\"."
+msgstr ""
+
+#: users/admin/views/ranks.py:87
+#, python-format
+msgid "Rank \"%(name)s\" has been moved above \"%(other)s\"."
+msgstr ""
+
+#: users/admin/views/ranks.py:101
+#, python-format
+msgid "Rank \"%(name)s\" is already default."
+msgstr ""
+
+#: users/admin/views/ranks.py:106
+#, python-format
+msgid "Rank \"%(name)s\" has been made default."
+msgstr ""
+
+#: users/admin/views/users.py:67
+msgid "Biggest posters"
+msgstr ""
+
+#: users/admin/views/users.py:68
+msgid "Smallest posters"
+msgstr ""
+
+#: users/admin/views/users.py:70
+msgid "With users: 0"
+msgstr ""
+
+#: users/admin/views/users.py:71
+msgid "Select users"
+msgstr ""
+
+#: users/admin/views/users.py:73
+msgid "Activate accounts"
+msgstr ""
+
+#: users/admin/views/users.py:75
+msgid "Request data download"
+msgstr ""
+
+#: users/admin/views/users.py:78
+msgid "Delete accounts"
+msgstr ""
+
+#: users/admin/views/users.py:79
+msgid "Are you sure you want to delete selected users?"
+msgstr ""
+
+#: users/admin/views/users.py:83
+msgid "Delete with content"
+msgstr ""
+
+#: users/admin/views/users.py:85
+msgid ""
+"Are you sure you want to delete selected users? This will also delete all "
+"content associated with their accounts."
+msgstr ""
+
+#: users/admin/views/users.py:106
+msgid "You have to select inactive users."
+msgstr ""
+
+#: users/admin/views/users.py:113
+#, python-format
+msgid "Your account on %(forum_name)s forums has been activated"
+msgstr ""
+
+#: users/admin/views/users.py:123
+msgid "Selected users accounts have been activated."
+msgstr ""
+
+#: users/admin/views/users.py:131
+#, python-format
+msgid "%(user)s is super admin and can't be banned."
+msgstr ""
+
+#: users/admin/views/users.py:193
+msgid "Selected users have been banned."
+msgstr ""
+
+#: users/admin/views/users.py:208
+msgid "Data download requests have been placed for selected users."
+msgstr ""
+
+#: users/admin/views/users.py:214 users/admin/views/users.py:230
+msgid "You can't delete yourself."
+msgstr ""
+
+#: users/admin/views/users.py:216 users/admin/views/users.py:232
+#, python-format
+msgid "%(user)s is admin and can't be deleted."
+msgstr ""
+
+#: users/admin/views/users.py:225
+msgid "Selected users have been deleted."
+msgstr ""
+
+#: users/admin/views/users.py:246
+msgid ""
+"Selected users have been disabled and queued for deletion together with "
+"their content."
+msgstr ""
+
+#: users/admin/views/users.py:255
+#, python-format
+msgid "New user \"%(user)s\" has been registered."
+msgstr ""
+
+#: users/admin/views/users.py:287
+#, python-format
+msgid "User \"%(user)s\" has been edited."
+msgstr ""
+
+#: users/api/auth.py:94
+#, python-format
+msgid "Activate %(user)s account on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/auth.py:129
+#, python-format
+msgid "Change %(user)s password on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/auth.py:164
+msgid "Form link is invalid. Please try again."
+msgstr ""
+
+#: users/api/auth.py:165
+msgid "Your link has expired. Please request new one."
+msgstr ""
+
+#: users/api/rest_permissions.py:30
+msgid "This action is not available to signed in users."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:26
+msgid "Your avatar is locked. You can't change it."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:109
+msgid "This avatar type is not allowed."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:116
+msgid "Unknown avatar type."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:137
+msgid "New avatar based on your account was set."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:143
+msgid "Gravatar was downloaded and set as new avatar."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:145
+msgid "No Gravatar is associated with your e-mail address."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:147
+msgid "Failed to connect to Gravatar servers."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:157
+msgid "Avatar from gallery was set."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:159
+msgid "Incorrect image."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:165
+msgid "No file was sent."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:178
+msgid "Avatar was re-cropped."
+msgstr ""
+
+#: users/api/userendpoints/avatar.py:183
+msgid "Uploaded avatar was set."
+msgstr ""
+
+#: users/api/userendpoints/changeemail.py:22
+#, python-format
+msgid "Confirm e-mail change on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/userendpoints/changeemail.py:35
+msgid "E-mail change confirmation link was sent to new address."
+msgstr ""
+
+#: users/api/userendpoints/changepassword.py:22
+#, python-format
+msgid "Confirm password change on %(forum_name)s forums"
+msgstr ""
+
+#: users/api/userendpoints/changepassword.py:33
+msgid "Password change confirmation link was sent to your address."
+msgstr ""
+
+#: users/api/userendpoints/create.py:25
+msgid "New users registrations are currently closed."
+msgstr ""
+
+#: users/api/userendpoints/signature.py:13
+msgid "You don't have permission to change signature."
+msgstr ""
+
+#: users/api/userendpoints/signature.py:25
+msgid "Your signature is locked. You can't change it."
+msgstr ""
+
+#: users/api/userendpoints/username.py:32
+msgid "You can't change your username now."
+msgstr ""
+
+#: users/api/userendpoints/username.py:60
+#: users/api/userendpoints/username.py:82
+msgid "Error changing username. Please try again."
+msgstr ""
+
+#: users/api/usernamechanges.py:28
+msgid "You don't have permission to see other users name history."
+msgstr ""
+
+#: users/api/users.py:64
+msgid "You have to sign in to perform this action."
+msgstr ""
+
+#: users/api/users.py:110
+msgid "You can't change other users avatars."
+msgstr ""
+
+#: users/api/users.py:122
+msgid "You can't change other users options."
+msgstr ""
+
+#: users/api/users.py:127
+msgid "Your forum options have been changed."
+msgstr ""
+
+#: users/api/users.py:133
+msgid "You can't change other users names."
+msgstr ""
+
+#: users/api/users.py:140
+msgid "You can't change other users signatures."
+msgstr ""
+
+#: users/api/users.py:152
+msgid "You can't change other users passwords."
+msgstr ""
+
+#: users/api/users.py:162
+msgid "You can't change other users e-mail addresses."
+msgstr ""
+
+#: users/api/users.py:269
+msgid "You can't request data downloads for other users."
+msgstr ""
+
+#: users/api/users.py:273
+msgid "You can't download your data."
+msgstr ""
+
+#: users/api/users.py:278
+msgid "You can't have more than one data download request at a single time."
+msgstr ""
+
+#: users/api/users.py:335
+msgid "You can't see other users data downloads."
+msgstr ""
+
+#: users/apps.py:30
+msgid "Edit details"
+msgstr ""
+
+#: users/apps.py:36
+msgid "Change username"
+msgstr ""
+
+#: users/apps.py:42
+msgid "Change email or password"
+msgstr ""
+
+#: users/apps.py:63
+msgid "Delete account"
+msgstr ""
+
+#: users/avatars/uploaded.py:38
+msgid "Uploaded file is too big."
+msgstr ""
+
+#: users/avatars/uploaded.py:46 users/avatars/uploaded.py:51
+msgid "Uploaded file type is not allowed."
+msgstr ""
+
+#: users/avatars/uploaded.py:59
+#, python-format
+msgid "Uploaded image should be at least %(size)s pixels tall and wide."
+msgstr ""
+
+#: users/avatars/uploaded.py:63
+msgid "Uploaded image is too big."
+msgstr ""
+
+#: users/avatars/uploaded.py:68
+msgid "Uploaded image ratio cannot be greater than 16:9."
+msgstr ""
+
+#: users/avatars/uploaded.py:74
+msgid "Crop data is invalid. Please try again."
+msgstr ""
+
+#: users/captcha.py:21
+msgid "Failed to contact reCAPTCHA API."
+msgstr ""
+
+#: users/captcha.py:28
+msgid "Entered answer is incorrect."
+msgstr ""
+
+#: users/decorators.py:14
+msgid "This page is not available to signed in users."
+msgstr ""
+
+#: users/decorators.py:26
+msgid "You have to sign in to access this page."
+msgstr ""
+
+#: users/forms/auth.py:15
+msgid "Fill out both fields."
+msgstr ""
+
+#: users/forms/auth.py:16
+msgid "Login or password is incorrect."
+msgstr ""
+
+#: users/forms/auth.py:18
+msgid "You have to activate your account before you will be able to sign in."
+msgstr ""
+
+#: users/forms/auth.py:21
+msgid ""
+"Your account has to be activated by site administrator before you will be "
+"able to sign in."
+msgstr ""
+
+#: users/forms/auth.py:98
+msgid "Your account does not have admin privileges."
+msgstr ""
+
+#: users/forms/auth.py:118
+msgid "Enter e-mail address."
+msgstr ""
+
+#: users/forms/auth.py:124
+msgid "Entered e-mail is invalid."
+msgstr ""
+
+#: users/forms/auth.py:134
+msgid "No user with this e-mail exists."
+msgstr ""
+
+#: users/forms/auth.py:150 users/views/activation.py:46
+#, python-format
+msgid "%(user)s, your account is already active."
+msgstr ""
+
+#: users/forms/auth.py:156
+#, python-format
+msgid "%(user)s, only administrator may activate your account."
+msgstr ""
+
+#: users/forms/auth.py:165
+msgid ""
+"You have to activate your account before you will be able to request new "
+"password."
+msgstr ""
+
+#: users/forms/auth.py:169
+msgid ""
+"Administrator has to activate your account before you will be able to "
+"request new password."
+msgstr ""
+
+#: users/forms/register.py:34 users/validators.py:80
+msgid "This username is not allowed."
+msgstr ""
+
+#: users/forms/register.py:45 users/validators.py:52
+msgid "This e-mail address is not allowed."
+msgstr ""
+
+#: users/forms/register.py:51
+msgid "This agreement is required."
+msgstr ""
+
+#: users/forms/register.py:61
+msgid "New registrations from this IP address are not allowed."
+msgstr ""
+
+#: users/management/commands/prepareuserdatadownloads.py:38
+#, python-format
+msgid "%(user)s, your data download is ready"
+msgstr ""
+
+#: users/migrations/0004_default_ranks.py:13
+#: users/migrations/0004_default_ranks.py:14 users/models/user.py:77
+msgid "Forum team"
+msgstr ""
+
+#: users/migrations/0004_default_ranks.py:15
+msgid "Team"
+msgstr ""
+
+#: users/migrations/0004_default_ranks.py:22
+#: users/migrations/0004_default_ranks.py:23
+msgid "Members"
+msgstr ""
+
+#: users/models/datadownload.py:26
+msgid "Pending"
+msgstr ""
+
+#: users/models/datadownload.py:27
+msgid "Processing"
+msgstr ""
+
+#: users/models/datadownload.py:28
+msgid "Ready"
+msgstr ""
+
+#: users/models/deleteduser.py:12
+msgid "By self"
+msgstr ""
+
+#: users/models/deleteduser.py:13
+msgid "By staff"
+msgstr ""
+
+#: users/models/deleteduser.py:14
+msgid "By system"
+msgstr ""
+
+#: users/models/user.py:106
+msgid "Notify"
+msgstr ""
+
+#: users/models/user.py:107
+msgid "Notify with e-mail"
+msgstr ""
+
+#: users/models/user.py:115
+msgid "Everybody"
+msgstr ""
+
+#: users/models/user.py:116
+msgid "Users I follow"
+msgstr ""
+
+#: users/models/user.py:117
+msgid "Nobody"
+msgstr ""
+
+#: users/models/user.py:136
+msgid "joined on"
+msgstr ""
+
+#: users/models/user.py:148
+msgid "staff status"
+msgstr ""
+
+#: users/models/user.py:150
+msgid "Designates whether the user can log into admin sites."
+msgstr ""
+
+#: users/models/user.py:157
+msgid "active"
+msgstr ""
+
+#: users/models/user.py:161
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+
+#: users/permissions/account.py:10
+msgid "Account settings"
+msgstr ""
+
+#: users/permissions/account.py:13
+msgid "Allowed username changes number"
+msgstr ""
+
+#: users/permissions/account.py:16
+msgid "Don't count username changes older than"
+msgstr ""
+
+#: users/permissions/account.py:18
+msgid ""
+"Number of days since name change that makes that change no longer count to "
+"limit. Enter zero to make all changes count."
+msgstr ""
+
+#: users/permissions/account.py:25
+msgid "Can have signature"
+msgstr ""
+
+#: users/permissions/account.py:26
+msgid "Can put links in signature"
+msgstr ""
+
+#: users/permissions/account.py:27
+msgid "Can put images in signature"
+msgstr ""
+
+#: users/permissions/account.py:29
+msgid "Can use text blocks in signature"
+msgstr ""
+
+#: users/permissions/account.py:31
+msgid ""
+"Controls whether or not users can put quote, code, spoiler blocks and "
+"horizontal lines in signatures."
+msgstr ""
+
+#: users/permissions/decorators.py:10
+msgid "You have to sig in to perform this action."
+msgstr ""
+
+#: users/permissions/decorators.py:19
+msgid "Only guests can perform this action."
+msgstr ""
+
+#: users/permissions/delete.py:26
+msgid "Maximum age of deleted account (in days)"
+msgstr ""
+
+#: users/permissions/delete.py:27 users/permissions/delete.py:33
+msgid "Enter zero to disable this check."
+msgstr ""
+
+#: users/permissions/delete.py:32
+msgid "Maximum number of posts on deleted account"
+msgstr ""
+
+#: users/permissions/delete.py:74
+msgid "You can't delete users."
+msgstr ""
+
+#: users/permissions/delete.py:77 users/permissions/delete.py:106
+msgid "You can't delete your account."
+msgstr ""
+
+#: users/permissions/delete.py:79
+msgid "You can't delete administrators."
+msgstr ""
+
+#: users/permissions/delete.py:84
+#, python-format
+msgid "You can't delete users that are members for more than %(days)s day."
+msgid_plural ""
+"You can't delete users that are members for more than %(days)s days."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/permissions/delete.py:92
+#, python-format
+msgid "You can't delete users that made more than %(posts)s post."
+msgid_plural "You can't delete users that made more than %(posts)s posts."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/permissions/delete.py:104
+msgid "You can't delete other users accounts."
+msgstr ""
+
+#: users/permissions/delete.py:109
+msgid "You can't delete your account because you are an administrator."
+msgstr ""
+
+#: users/permissions/moderation.py:33
+msgid "Users moderation"
+msgstr ""
+
+#: users/permissions/moderation.py:35
+msgid "Can rename users"
+msgstr ""
+
+#: users/permissions/moderation.py:36
+msgid "Can moderate avatars"
+msgstr ""
+
+#: users/permissions/moderation.py:37
+msgid "Can moderate signatures"
+msgstr ""
+
+#: users/permissions/moderation.py:38
+msgid "Can moderate profile details"
+msgstr ""
+
+#: users/permissions/moderation.py:39
+msgid "Can ban users"
+msgstr ""
+
+#: users/permissions/moderation.py:41
+msgid "Max length, in days, of imposed ban"
+msgstr ""
+
+#: users/permissions/moderation.py:42
+msgid "Enter zero to let moderators impose permanent bans."
+msgstr ""
+
+#: users/permissions/moderation.py:46
+msgid "Can lift bans"
+msgstr ""
+
+#: users/permissions/moderation.py:48
+msgid "Max length, in days, of lifted ban"
+msgstr ""
+
+#: users/permissions/moderation.py:49
+msgid "Enter zero to let moderators lift permanent bans."
+msgstr ""
+
+#: users/permissions/moderation.py:111
+msgid "You can't rename users."
+msgstr ""
+
+#: users/permissions/moderation.py:113
+msgid "You can't rename administrators."
+msgstr ""
+
+#: users/permissions/moderation.py:121
+msgid "You can't moderate avatars."
+msgstr ""
+
+#: users/permissions/moderation.py:123
+msgid "You can't moderate administrators avatars."
+msgstr ""
+
+#: users/permissions/moderation.py:131
+msgid "You can't moderate signatures."
+msgstr ""
+
+#: users/permissions/moderation.py:133
+msgid "You can't moderate administrators signatures."
+msgstr ""
+
+#: users/permissions/moderation.py:142
+msgid "You have to sign in to edit profile details."
+msgstr ""
+
+#: users/permissions/moderation.py:147
+msgid "You can't edit other users details."
+msgstr ""
+
+#: users/permissions/moderation.py:149
+msgid "You can't edit administrators details."
+msgstr ""
+
+#: users/permissions/moderation.py:158
+msgid "You can't ban users."
+msgstr ""
+
+#: users/permissions/moderation.py:160
+msgid "You can't ban administrators."
+msgstr ""
+
+#: users/permissions/moderation.py:168
+msgid "You can't lift bans."
+msgstr ""
+
+#: users/permissions/moderation.py:171
+msgid "This user is not banned."
+msgstr ""
+
+#: users/permissions/moderation.py:176
+msgid "You can't lift permanent bans."
+msgstr ""
+
+#: users/permissions/moderation.py:178
+#, python-format
+msgid "You can't lift bans that expire after %(expiration)s."
+msgstr ""
+
+#: users/permissions/profiles.py:23
+msgid "Can browse users list"
+msgstr ""
+
+#: users/permissions/profiles.py:24
+msgid "Can search user profiles"
+msgstr ""
+
+#: users/permissions/profiles.py:25
+msgid "Can see other members name history"
+msgstr ""
+
+#: users/permissions/profiles.py:27
+msgid "Can see members bans details"
+msgstr ""
+
+#: users/permissions/profiles.py:29
+msgid "Allows users with this permission to see user and staff ban messages."
+msgstr ""
+
+#: users/permissions/profiles.py:35
+msgid "User profiles"
+msgstr ""
+
+#: users/permissions/profiles.py:46
+msgid "Can follow other users"
+msgstr ""
+
+#: users/permissions/profiles.py:47
+msgid "Can be blocked by other users"
+msgstr ""
+
+#: users/permissions/profiles.py:50
+msgid "Can see members e-mails"
+msgstr ""
+
+#: users/permissions/profiles.py:51
+msgid "Can see members IPs"
+msgstr ""
+
+#: users/permissions/profiles.py:53
+msgid "Can see members that hide their presence"
+msgstr ""
+
+#: users/permissions/profiles.py:113
+msgid "You can't browse users list."
+msgstr ""
+
+#: users/permissions/profiles.py:122
+msgid "You can't follow other users."
+msgstr ""
+
+#: users/permissions/profiles.py:124
+msgid "You can't add yourself to followed."
+msgstr ""
+
+#: users/permissions/profiles.py:133
+msgid "You can't block administrators."
+msgstr ""
+
+#: users/permissions/profiles.py:135
+msgid "You can't block yourself."
+msgstr ""
+
+#: users/permissions/profiles.py:145
+msgid "You can't see users bans details."
+msgstr ""
+
+#: users/profilefields/default.py:12
+msgid "Bio"
+msgstr ""
+
+#: users/profilefields/default.py:17
+msgid "Real name"
+msgstr ""
+
+#: users/profilefields/default.py:22
+msgid "Location"
+msgstr ""
+
+#: users/profilefields/default.py:27
+msgid "Gender"
+msgstr ""
+
+#: users/profilefields/default.py:30
+msgid "Not specified"
+msgstr ""
+
+#: users/profilefields/default.py:31
+msgid "Not telling"
+msgstr ""
+
+#: users/profilefields/default.py:32
+msgid "Female"
+msgstr ""
+
+#: users/profilefields/default.py:33
+msgid "Male"
+msgstr ""
+
+#: users/profilefields/default.py:39
+msgid "Website"
+msgstr ""
+
+#: users/profilefields/default.py:41
+msgid ""
+"If you own website in the internet you wish to share on your profile you may "
+"enter its address here. Remember to for it to be valid http address starting "
+"with either \"http://\" or \"https://\"."
+msgstr ""
+
+#: users/profilefields/default.py:49
+msgid "Skype ID"
+msgstr ""
+
+#: users/profilefields/default.py:51
+msgid ""
+"Entering your Skype ID in this field may invite other users to contact you "
+"over the Skype instead of via private threads."
+msgstr ""
+
+#: users/profilefields/default.py:58
+msgid "Twitter handle"
+msgstr ""
+
+#: users/profilefields/default.py:62
+#, python-format
+msgid ""
+"If you own Twitter account, here you may enter your Twitter handle for other "
+"users to find you. Starting your handle with \"@\" sign is optional. Either "
+"\"@%(slug)s\" or \"%(slug)s\" are valid values."
+msgstr ""
+
+#: users/profilefields/default.py:73
+msgid "This is not a valid twitter handle."
+msgstr ""
+
+#: users/profilefields/default.py:79
+msgid "Join IP"
+msgstr ""
+
+#: users/registration.py:12
+#, python-format
+msgid "Welcome on %(forum_name)s forums!"
+msgstr ""
+
+#: users/search.py:22
+msgid "You don't have permission to search users."
+msgstr ""
+
+#: users/serializers/ban.py:26
+msgid "Your IP address is banned."
+msgstr ""
+
+#: users/serializers/ban.py:28
+msgid "You are banned."
+msgstr ""
+
+#: users/serializers/options.py:46
+msgid "Signature is too long."
+msgstr ""
+
+#: users/serializers/options.py:57
+msgid "Enter new username."
+msgstr ""
+
+#: users/serializers/options.py:61
+msgid "New username is same as current one."
+msgstr ""
+
+#: users/serializers/options.py:80 users/serializers/options.py:94
+#: users/serializers/options.py:116
+msgid "Entered password is invalid."
+msgstr ""
+
+#: users/serializers/options.py:100
+msgid "You have to enter new e-mail address."
+msgstr ""
+
+#: users/serializers/options.py:104
+msgid "New e-mail is same as current one."
+msgstr ""
+
+#: users/signals.py:31
+msgid "Joined on"
+msgstr ""
+
+#: users/signals.py:32
+msgid "Joined from ip"
+msgstr ""
+
+#: users/signals.py:74
+msgid "New username"
+msgstr ""
+
+#: users/signals.py:75
+msgid "Old username"
+msgstr ""
+
+#: users/validators.py:40
+msgid "This e-mail address is not available."
+msgstr ""
+
+#: users/validators.py:68
+msgid "This username is not available."
+msgstr ""
+
+#: users/validators.py:86
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr ""
+
+#: users/validators.py:93
+#, python-format
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/validators.py:101
+#, python-format
+msgid "Username cannot be longer than %(limit_value)s characters."
+msgid_plural "Username cannot be longer than %(limit_value)s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: users/validators.py:137
+msgid "Data entered was found in spammers database."
+msgstr ""
+
+#: users/validators.py:147
+msgid "This email is not allowed."
+msgstr ""
+
+#: users/views/activation.py:51
+#, python-format
+msgid ""
+"%(user)s, your activation link is invalid. Try again or request new "
+"activation link."
+msgstr ""
+
+#: users/views/activation.py:69
+#, python-format
+msgid "%(user)s, your account has been activated!"
+msgstr ""
+
+#: users/views/forgottenpassword.py:31
+#, python-format
+msgid "%(user)s, your link has expired. Please request new link and try again."
+msgstr ""
+
+#: users/views/forgottenpassword.py:38
+#, python-format
+msgid "%(user)s, your link is invalid. Please try again or request new link."
+msgstr ""
+
+#: users/views/options.py:56
+#, python-format
+msgid "%(user)s, your e-mail has been changed."
+msgstr ""
+
+#: users/views/options.py:74
+#, python-format
+msgid "%(user)s, your password has been changed."
+msgstr ""

BIN
misago/locale/nl/LC_MESSAGES/djangojs.mo


+ 52 - 56
misago/locale/nl/LC_MESSAGES/djangojs.po

@@ -2,25 +2,25 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # Evelijn Saaltink <evelijnsaaltink@gmail.com>, 2017
 # Estefan Trabajo <mauro22.de.wit@gmail.com>, 2018
 # Sem Bauke <Sembauke@gmail.com>, 2018
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Sem Bauke <Sembauke@gmail.com>, 2018\n"
 "Language-Team: Dutch (https://www.transifex.com/misago/teams/65369/nl/)\n"
+"Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: nl\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #: static/misago/admin/index.js:16
@@ -88,8 +88,7 @@ msgstr ""
 msgid ""
 "%(username)s, you have been signed out. Please refresh the page before "
 "continuing."
-msgstr ""
-"%(username)s, Je bent uitgelogd. Herlaad de pagina om verder te gaan. "
+msgstr "%(username)s, Je bent uitgelogd. Herlaad de pagina om verder te gaan. "
 
 #: static/misago/js/misago.js:1
 msgid "Reload page"
@@ -382,8 +381,8 @@ msgstr "Beste Antwoord"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Please select the best answer for your newly merged thread. No posts will be"
-" deleted during the merge."
+"Please select the best answer for your newly merged thread. No posts will be "
+"deleted during the merge."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -473,8 +472,8 @@ msgstr "Verwijder account"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You are going to delete your account. This action is nonreversible, and will"
-" result in following data being deleted:"
+"You are going to delete your account. This action is nonreversible, and will "
+"result in following data being deleted:"
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -495,8 +494,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"All your posted content will NOT be deleted, but username associated with it"
-" will be changed to one shared by all deleted accounts."
+"All your posted content will NOT be deleted, but username associated with it "
+"will be changed to one shared by all deleted accounts."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -687,15 +686,15 @@ msgid "Change forgotten password"
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "You have left this thread."
+msgid "%(user)s has been made new thread owner."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "%(user)s has been removed from this thread."
+msgid "You have left this thread."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "%(user)s has been made new thread owner."
+msgid "%(user)s has been removed from this thread."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -953,8 +952,7 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you with to revert this post to the state from before this "
-"edit?"
+"Are you sure you with to revert this post to the state from before this edit?"
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -1364,13 +1362,13 @@ msgid "This post is hidden. Only users with permission may see its contents."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+msgid "This post is protected. Only moderators may change it."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "This post is protected. Only moderators may change it."
+msgid ""
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -1472,22 +1470,22 @@ msgid "%(username)s's details have been updated."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "You have no started threads."
-msgstr ""
+msgid "You have posted no messages."
+msgstr "Je hebt nog geen berichten geplaatst. "
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s started no threads."
+msgid "%(username)s posted no messages."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "You have started %(threads)s thread."
-msgid_plural "You have started %(threads)s threads."
+msgid "You have posted %(posts)s message."
+msgid_plural "You have posted %(posts)s messages."
 msgstr[0] ""
 msgstr[1] ""
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s has started %(threads)s thread."
-msgid_plural "%(username)s has started %(threads)s threads."
+msgid "%(username)s has posted %(posts)s message."
+msgid_plural "%(username)s has posted %(posts)s messages."
 msgstr[0] ""
 msgstr[1] ""
 
@@ -1496,32 +1494,32 @@ msgid "Loading..."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "Threads"
-msgstr ""
+msgid "Posts"
+msgstr "Posts"
 
 #: static/misago/js/misago.js:1
-msgid "You have posted no messages."
-msgstr "Je hebt nog geen berichten geplaatst. "
+msgid "You have no started threads."
+msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s posted no messages."
+msgid "%(username)s started no threads."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "You have posted %(posts)s message."
-msgid_plural "You have posted %(posts)s messages."
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
 msgstr[0] ""
 msgstr[1] ""
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s has posted %(posts)s message."
-msgid_plural "%(username)s has posted %(posts)s messages."
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
 msgstr[0] ""
 msgstr[1] ""
 
 #: static/misago/js/misago.js:1
-msgid "Posts"
-msgstr "Posts"
+msgid "Threads"
+msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid "Show older activity"
@@ -1987,8 +1985,7 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you want to merge selected posts? This action is not "
-"reversible!"
+"Are you sure you want to merge selected posts? This action is not reversible!"
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -2326,8 +2323,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You need permission to start threads in category to be able to merge threads"
-" to it."
+"You need permission to start threads in category to be able to merge threads "
+"to it."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -2585,18 +2582,22 @@ msgid "You are banned"
 msgstr "U bent verbannen."
 
 #: static/misago/js/misago.js:1
-msgid "You have to accept the terms of service."
-msgstr ""
+msgid "Valid password must be at least %(limit_value)s character long."
+msgid_plural "Valid password must be at least %(limit_value)s characters long."
+msgstr[0] ""
+msgstr[1] ""
 
 #: static/misago/js/misago.js:1
 msgid "You have to accept the privacy policy."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "Username must be at least %(limit_value)s character long."
-msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] ""
-msgstr[1] ""
+msgid "You have to accept the terms of service."
+msgstr ""
+
+#: static/misago/js/misago.js:1
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid "Username cannot be longer than %(limit_value)s character."
@@ -2605,13 +2606,8 @@ msgstr[0] ""
 msgstr[1] ""
 
 #: static/misago/js/misago.js:1
-msgid "Username can only contain latin alphabet letters and digits."
-msgstr ""
-
-#: static/misago/js/misago.js:1
-msgid "Valid password must be at least %(limit_value)s character long."
-msgid_plural ""
-"Valid password must be at least %(limit_value)s characters long."
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
 msgstr[0] ""
 msgstr[1] ""
 

BIN
misago/locale/pl/LC_MESSAGES/django.mo


+ 173 - 289
misago/locale/pl/LC_MESSAGES/django.po

@@ -2,28 +2,30 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # Dariusz Szuba <dariuszuba@gmail.com>, 2017
 # Maciej Schmidt <macsch15@gmail.com>, 2019
 # Sevos <sevosik@gmail.com>, 2019
 # a b, 2022
 # Rafał Pitoń <kontakt@rpiton.com>, 2022
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Rafał Pitoń <kontakt@rpiton.com>, 2022\n"
 "Language-Team: Polish (https://www.transifex.com/misago/teams/65369/pl/)\n"
+"Language: pl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: pl\n"
-"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n"
+"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n"
+"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
 
 #: acl/admin/__init__.py:24 templates/misago/acl_debug.html:16
 #: templates/misago/admin/ranks/form.html:58
@@ -221,7 +223,7 @@ msgstr ""
 "Tylko użytkownicy z wymaganymi uprawnieniami mogą pisać w zamkniętych "
 "kategoriach."
 
-#: categories/admin/forms.py:70 conf/admin/__init__.py:93
+#: categories/admin/forms.py:70 conf/admin/__init__.py:79
 #: templates/misago/admin/categories/list.html:19
 #: templates/misago/admin/dashboard/totals.html:19
 #: templates/misago/navbar.html:20 templates/misago/navbar.html:36
@@ -235,14 +237,13 @@ msgstr ""
 #: templates/misago/threadslist/threads.html:42
 #: templates/misago/threadslist/threads.html:66
 #: threads/permissions/threads.py:73 threads/permissions/threads.py:104
-#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:106
+#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:97
 msgid "Threads"
 msgstr "Tematy"
 
 #: categories/admin/forms.py:73
 msgid "All threads started in this category will require moderator approval."
-msgstr ""
-"Każdy temat stworzony w tym dziale jest weryfikowany przez moderatora."
+msgstr "Każdy temat stworzony w tym dziale jest weryfikowany przez moderatora."
 
 #: categories/admin/forms.py:77
 msgid "Replies"
@@ -268,11 +269,11 @@ msgstr "Wiek tematu"
 
 #: categories/admin/forms.py:95
 msgid ""
-"Prune thread if number of days since its creation is greater than specified."
-" Enter 0 to disable this pruning criteria."
+"Prune thread if number of days since its creation is greater than specified. "
+"Enter 0 to disable this pruning criteria."
 msgstr ""
-"Usuń temat jeśli liczba dni od jego założenia jest większa niż podana. Wpisz"
-" 0 aby wyłączyć ten warunek."
+"Usuń temat jeśli liczba dni od jego założenia jest większa niż podana. Wpisz "
+"0 aby wyłączyć ten warunek."
 
 #: categories/admin/forms.py:100
 msgid "Last reply"
@@ -283,8 +284,8 @@ msgid ""
 "Prune thread if number of days since last reply is greater than specified. "
 "Enter 0 to disable this pruning criteria."
 msgstr ""
-"Usuń temat jeśli liczba dni od ostatniej odpowiedzi jest większa niż podana."
-" Wpisz 0 aby wyłączyć ten warunek."
+"Usuń temat jeśli liczba dni od ostatniej odpowiedzi jest większa niż podana. "
+"Wpisz 0 aby wyłączyć ten warunek."
 
 #: categories/admin/forms.py:126
 msgid "Permissions cannot be copied from category into itself."
@@ -319,8 +320,7 @@ msgstr "Archiwum"
 
 #: categories/admin/forms.py:173
 msgid ""
-"Instead of being deleted, pruned threads can be moved to designated "
-"category."
+"Instead of being deleted, pruned threads can be moved to designated category."
 msgstr ""
 "Edytowane wątki zamiast być usuwane, mogą być przeniesione do wyznaczonej "
 "kategorii."
@@ -352,8 +352,7 @@ msgid "Move child categories to"
 msgstr "Przenieś podrzędne kategorie do"
 
 #: categories/admin/forms.py:249 categories/admin/forms.py:264
-#: templates/misago/acl_debug.html:15
-#: templates/misago/admin/roles/list.html:16
+#: templates/misago/acl_debug.html:15 templates/misago/admin/roles/list.html:16
 msgid "Role"
 msgstr "Rola."
 
@@ -462,23 +461,22 @@ msgstr "Można zobaczyć zawartość kategorii."
 #, python-format
 msgid "You don't have permission to browse \"%(category)s\" contents."
 msgstr ""
-"Nie posiadasz uprawnień, aby przeglądać zawartość kategorii "
-"\"%(category)s\"."
+"Nie posiadasz uprawnień, aby przeglądać zawartość kategorii \"%(category)s\"."
 
-#: conf/admin/__init__.py:45 templates/misago/admin/conf/index.html:5
+#: conf/admin/__init__.py:41 templates/misago/admin/conf/index.html:5
 #: templates/misago/admin/themes/form.html:48
 msgid "Settings"
 msgstr "Ustawienia"
 
-#: conf/admin/__init__.py:52 templates/misago/admin/socialauth/form.html:27
+#: conf/admin/__init__.py:48 templates/misago/admin/socialauth/form.html:27
 msgid "General"
 msgstr "Ogólne"
 
-#: conf/admin/__init__.py:53
+#: conf/admin/__init__.py:49
 msgid "Change forum details like name, description or footer."
 msgstr ""
 
-#: conf/admin/__init__.py:58 templates/misago/admin/dashboard/totals.html:7
+#: conf/admin/__init__.py:54 templates/misago/admin/dashboard/totals.html:7
 #: templates/misago/admin/users/ban.html:22 templates/misago/navbar.html:42
 #: templates/misago/userslists/base.html:5
 #: templates/misago/userslists/base.html:14 users/admin/__init__.py:74
@@ -486,38 +484,28 @@ msgstr ""
 msgid "Users"
 msgstr "Użytkownicy"
 
-#: conf/admin/__init__.py:60
+#: conf/admin/__init__.py:56
 msgid "Customize user accounts default behavior and features availability."
 msgstr ""
 
-#: conf/admin/__init__.py:67
+#: conf/admin/__init__.py:63
 msgid "Captcha"
 msgstr "Captcha"
 
-#: conf/admin/__init__.py:69
+#: conf/admin/__init__.py:65
 msgid "Setup protection against automatic registrations on the site."
 msgstr ""
 
-#: conf/admin/__init__.py:76
-msgid "Single Sign-On"
-msgstr ""
-
-#: conf/admin/__init__.py:78
-msgid ""
-"SSO enables you to delegate user login and registration from Misago tothe "
-"third party site."
-msgstr ""
-
-#: conf/admin/__init__.py:86 templates/misago/admin/dashboard/analytics.html:7
+#: conf/admin/__init__.py:72 templates/misago/admin/dashboard/analytics.html:7
 #: templates/misago/admin/dashboard/index.html:40
 msgid "Analytics"
 msgstr ""
 
-#: conf/admin/__init__.py:87
+#: conf/admin/__init__.py:73
 msgid "Enable Google Analytics or setup Google Site Verification."
 msgstr ""
 
-#: conf/admin/__init__.py:94
+#: conf/admin/__init__.py:80
 msgid "Threads, posts, polls and attachments options."
 msgstr ""
 
@@ -537,8 +525,8 @@ msgstr ""
 
 #: conf/admin/forms/analytics.py:27
 msgid ""
-"This token was extracted from uploaded site verification file. To change it,"
-" upload new verification file."
+"This token was extracted from uploaded site verification file. To change it, "
+"upload new verification file."
 msgstr ""
 
 #: conf/admin/forms/analytics.py:34
@@ -752,39 +740,6 @@ msgid ""
 "Address under which site is running appears to be \"%(address)s\"."
 msgstr ""
 
-#: conf/admin/forms/sso.py:13
-msgid "Enable Single Sign-On"
-msgstr ""
-
-#: conf/admin/forms/sso.py:15
-msgid ""
-"Enabling SSO will make login option redirect users to the server URL "
-"configured below. It will also disable option to register on forum, change "
-"username, email or passward, as those features will be delegated to the 3rd "
-"party site."
-msgstr ""
-
-#: conf/admin/forms/sso.py:22
-msgid "Public key"
-msgstr "Klucz publiczny"
-
-#: conf/admin/forms/sso.py:24 conf/admin/forms/sso.py:32
-msgid ""
-"Leave this field empty for Misago to generate this key on form submission."
-msgstr ""
-
-#: conf/admin/forms/sso.py:30
-msgid "Private key"
-msgstr "Klucz prywatny"
-
-#: conf/admin/forms/sso.py:37
-msgid "Server URL"
-msgstr "Server URL"
-
-#: conf/admin/forms/sso.py:50
-msgid "You need to enter server URL to enable SSO."
-msgstr ""
-
 #: conf/admin/forms/threads.py:27
 msgid "Daily post limit per user"
 msgstr ""
@@ -843,10 +798,10 @@ msgstr ""
 
 #: conf/admin/forms/threads.py:71
 msgid ""
-"Controls amount of data used by read-tracking system. All content older than"
-" number of days specified in this setting is considered old and read, even "
-"if the opposite is true for the user. Active forums can try lowering this "
-"value while less active ones may wish to increase it instead. "
+"Controls amount of data used by read-tracking system. All content older than "
+"number of days specified in this setting is considered old and read, even if "
+"the opposite is true for the user. Active forums can try lowering this value "
+"while less active ones may wish to increase it instead. "
 msgstr ""
 
 #: conf/admin/forms/threads.py:80
@@ -926,8 +881,8 @@ msgstr ""
 
 #: conf/admin/forms/users.py:48
 msgid ""
-"Delete new inactive accounts if they weren't activated within this number of"
-" days"
+"Delete new inactive accounts if they weren't activated within this number of "
+"days"
 msgstr ""
 
 #: conf/admin/forms/users.py:51
@@ -982,8 +937,8 @@ msgstr "Fallback dla domyślnego Gravatara"
 
 #: conf/admin/forms/users.py:86
 msgid ""
-"Select which avatar to use when user has no gravatar associated with their "
-"e-mail address."
+"Select which avatar to use when user has no gravatar associated with their e-"
+"mail address."
 msgstr ""
 
 #: conf/admin/forms/users.py:96
@@ -1093,22 +1048,22 @@ msgstr ""
 msgid "This value must be lower than number of users per page."
 msgstr ""
 
-#: conf/admin/views.py:40
+#: conf/admin/views.py:39
 msgid "Settings have been saved."
 msgstr ""
 
-#: core/errorpages.py:42
+#: core/errorpages.py:51
 msgid "Permission denied."
 msgstr "Dostęp zabroniony."
 
-#: core/errorpages.py:71
+#: core/errorpages.py:80
 msgid ""
 "A problem was encountered when disconnecting your account from the remote "
 "site."
 msgstr ""
 "Wystąpił problem podczas odłączania Twojego konta od zewnętrznego serwisu."
 
-#: core/errorpages.py:75
+#: core/errorpages.py:84
 msgid ""
 "You are not allowed to disconnect your account from the other site, because "
 "currently it's the only way to sign in to your account."
@@ -1116,24 +1071,24 @@ msgstr ""
 "Nie można odłączyć konta od zewnętrznego serwisu, ponieważ jest to Twoja "
 "jedyna metoda logowania."
 
-#: core/errorpages.py:80
+#: core/errorpages.py:89
 #, python-format
 msgid "A problem was encountered when signing you in using %(backend)s."
 msgstr "Wystąpił problem podczas próby zalogowania poprzez %(backend)s."
 
-#: core/errorpages.py:84
+#: core/errorpages.py:93
 msgid "The sign in process has been canceled by user."
 msgstr "Proces logowania został przerwany."
 
-#: core/errorpages.py:86
+#: core/errorpages.py:95
 msgid "The other service could not be reached."
 msgstr ""
 
-#: core/errorpages.py:92
+#: core/errorpages.py:101
 msgid "Unexpected problem has been encountered during sign in process."
 msgstr ""
 
-#: core/errorpages.py:113
+#: core/errorpages.py:122
 msgid ""
 "Your request was rejected because your browser didn't send the CSRF cookie, "
 "or the cookie sent was invalid."
@@ -1182,8 +1137,8 @@ msgstr ""
 #: templates/misago/admin/dashboard/checks.html:17
 #: templates/misago/admin/dashboard/index.html:33
 msgid ""
-"Version check feature relies on the API operated by the Python Package Index"
-" (pypi.org) API to retrieve latest Misago release version."
+"Version check feature relies on the API operated by the Python Package Index "
+"(pypi.org) API to retrieve latest Misago release version."
 msgstr ""
 
 #: graphql/admin/versioncheck.py:70
@@ -1510,11 +1465,11 @@ msgstr "Szukaj"
 msgid "Can search site"
 msgstr "Może używać wyszukiwarki"
 
-#: socialauth/admin/__init__.py:42
+#: socialauth/admin/__init__.py:40
 msgid "Social login"
 msgstr ""
 
-#: socialauth/admin/__init__.py:44
+#: socialauth/admin/__init__.py:42
 msgid "Enable users to sign on and login using their social profile."
 msgstr ""
 
@@ -1537,9 +1492,9 @@ msgstr ""
 #: socialauth/admin/forms/base.py:39
 msgid ""
 "Enabling this option will result in the user being signed in if their forum "
-"account was registered using same e-mail address as used on the social site."
-" Otherwise they will be asked to specify a different e-mail to continue sign"
-" in using social site."
+"account was registered using same e-mail address as used on the social site. "
+"Otherwise they will be asked to specify a different e-mail to continue sign "
+"in using social site."
 msgstr ""
 
 #: socialauth/admin/forms/base.py:51 socialauth/admin/forms/base.py:53
@@ -1598,8 +1553,8 @@ msgstr ""
 #: socialauth/pipeline.py:88
 #, python-format
 msgid ""
-"The e-mail address associated with your %(backend)s account is not available"
-" for use on this site."
+"The e-mail address associated with your %(backend)s account is not available "
+"for use on this site."
 msgstr ""
 
 #: socialauth/pipeline.py:98
@@ -1613,18 +1568,6 @@ msgstr ""
 msgid "Please try resubmitting the form."
 msgstr ""
 
-#: socialauth/views.py:23
-msgid "Please use the 3rd party site to login."
-msgstr ""
-
-#: sso/validators.py:24 users/forms/register.py:34 users/validators.py:80
-msgid "This username is not allowed."
-msgstr ""
-
-#: sso/validators.py:33 users/forms/register.py:45 users/validators.py:52
-msgid "This e-mail address is not allowed."
-msgstr "Ten email nie jest dozwolony."
-
 #: templates/misago/acl_debug.html:5
 #, python-format
 msgid ""
@@ -1674,8 +1617,8 @@ msgstr "Wyślij link aktywacyjny"
 
 #: templates/misago/activation/request.html:25
 msgid ""
-"The site administrator may impose a requirement on newly registered accounts"
-" to be activated before users will be able to sign in."
+"The site administrator may impose a requirement on newly registered accounts "
+"to be activated before users will be able to sign in."
 msgstr ""
 
 #: templates/misago/activation/request.html:28
@@ -2046,7 +1989,7 @@ msgstr "Kategoria"
 #: templates/misago/admin/dashboard/totals.html:31
 #: templates/misago/admin/users/list.html:21
 #: templates/misago/profile/posts.html:5 templates/misago/profile/posts.html:8
-#: templates/misago/profile/posts.html:9 users/apps.py:102
+#: templates/misago/profile/posts.html:9 users/apps.py:93
 msgid "Posts"
 msgstr "Posty"
 
@@ -2190,56 +2133,45 @@ msgstr ""
 msgid "Attachment error images"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:9
-#: templates/misago/admin/socialauth/list.html:97
-msgid "Note"
-msgstr "Notatka"
-
-#: templates/misago/admin/conf/users_settings.html:9
-msgid ""
-"Single Sign-On is enabled. Site's registration, password and deletion "
-"features have been disabled and delegated to the third-party site."
-msgstr ""
-
-#: templates/misago/admin/conf/users_settings.html:14
+#: templates/misago/admin/conf/users_settings.html:8
 msgid "New accounts"
 msgstr "Nowe profile"
 
-#: templates/misago/admin/conf/users_settings.html:23 users/admin/forms.py:484
+#: templates/misago/admin/conf/users_settings.html:17 users/admin/forms.py:484
 #: users/admin/forms.py:573
 msgid "Usernames"
 msgstr "Nazwy użytkownika"
 
-#: templates/misago/admin/conf/users_settings.html:33
+#: templates/misago/admin/conf/users_settings.html:27
 msgid "Avatars"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:49
+#: templates/misago/admin/conf/users_settings.html:43
 msgid "Signatures"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:57
+#: templates/misago/admin/conf/users_settings.html:51
 #: users/admin/__init__.py:80
 msgid "Data downloads"
 msgstr "Pobieranie danych"
 
-#: templates/misago/admin/conf/users_settings.html:66
+#: templates/misago/admin/conf/users_settings.html:60
 msgid "Own account deletion"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:74 users/admin/forms.py:492
+#: templates/misago/admin/conf/users_settings.html:68 users/admin/forms.py:492
 msgid "IP addresses"
 msgstr "Adresy IP"
 
-#: templates/misago/admin/conf/users_settings.html:82
+#: templates/misago/admin/conf/users_settings.html:76
 msgid "Default subscription preferences"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:91
+#: templates/misago/admin/conf/users_settings.html:85
 msgid "Users lists"
 msgstr "Listy użykowników"
 
-#: templates/misago/admin/conf/users_settings.html:100
+#: templates/misago/admin/conf/users_settings.html:94
 msgid "Top posters ranking"
 msgstr ""
 
@@ -2366,9 +2298,8 @@ msgstr ""
 msgid "Site analytics are currently unavailable due to an error."
 msgstr ""
 
-#: templates/misago/admin/dashboard/totals.html:43
-#: threads/admin/__init__.py:38 threads/permissions/attachments.py:11
-#: threads/permissions/attachments.py:29
+#: templates/misago/admin/dashboard/totals.html:43 threads/admin/__init__.py:36
+#: threads/permissions/attachments.py:11 threads/permissions/attachments.py:29
 msgid "Attachments"
 msgstr "Załączniki"
 
@@ -2485,20 +2416,20 @@ msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:12
 msgid ""
-"The form was sent after being opened in the browser for a long time (eg. few"
-" days) and cookie token has expired."
+"The form was sent after being opened in the browser for a long time (eg. few "
+"days) and cookie token has expired."
 msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:15
 msgid ""
-"The site is configured to use the HTTPS, but this form was sent over the the"
-" HTTP."
+"The site is configured to use the HTTPS, but this form was sent over the the "
+"HTTP."
 msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:16
 msgid ""
-"If you are an owner of this site, please check if the HTTPS certificate used"
-" by the site is valid and accepted by the browser."
+"If you are an owner of this site, please check if the HTTPS certificate used "
+"by the site is valid and accepted by the browser."
 msgstr ""
 
 #: templates/misago/admin/generic/filter_form.html:7
@@ -2755,8 +2686,7 @@ msgstr "Wygląd i widoczność"
 #: templates/misago/admin/ranks/list.html:17
 #: templates/misago/admin/users/list.html:19
 #: templates/misago/userslists/active_posters.html:112
-#: templates/misago/userslists/active_posters.html:123
-#: users/admin/forms.py:238
+#: templates/misago/userslists/active_posters.html:123 users/admin/forms.py:238
 msgid "Rank"
 msgstr "Ranga"
 
@@ -2821,7 +2751,7 @@ msgid "Enabled login methods"
 msgstr ""
 
 #: templates/misago/admin/socialauth/list.html:15
-#: templates/misago/admin/socialauth/list.html:112
+#: templates/misago/admin/socialauth/list.html:106
 msgid "Provider"
 msgstr "Dostawca"
 
@@ -2837,25 +2767,19 @@ msgstr ""
 msgid "Are you sure you want to disable this social login provider?"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:97
-msgid ""
-"Single Sign-On is enabled. Social authentication has been disabled and "
-"delegated to the third-party site."
-msgstr ""
-
-#: templates/misago/admin/socialauth/list.html:106
+#: templates/misago/admin/socialauth/list.html:100
 msgid "Setup new login method"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:125
+#: templates/misago/admin/socialauth/list.html:119
 msgid "Setup login with this provider"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:126
+#: templates/misago/admin/socialauth/list.html:120
 msgid "Setup"
 msgstr "Ustawienia"
 
-#: templates/misago/admin/socialauth/list.html:133
+#: templates/misago/admin/socialauth/list.html:127
 msgid "No new login providers are available for setup at this time."
 msgstr ""
 
@@ -3157,7 +3081,7 @@ msgstr ""
 msgid "Signature"
 msgstr "Sygnatura"
 
-#: templates/misago/admin/users/edit.html:228 users/apps.py:27
+#: templates/misago/admin/users/edit.html:228 users/apps.py:24
 msgid "Forum options"
 msgstr "Opcje forum"
 
@@ -3173,13 +3097,11 @@ msgstr "Status konta"
 msgid ""
 "This user is deleting their account. It has been deactivated for the "
 "duration of the process."
-msgstr ""
-"Ten użytkownik usuwa swoje konto. Do tego czasu zostało dezaktywowane."
+msgstr "Ten użytkownik usuwa swoje konto. Do tego czasu zostało dezaktywowane."
 
 #: templates/misago/admin/users/edit.html:251
 msgid ""
-"No additional action is required. This account will be deleted "
-"automatically."
+"No additional action is required. This account will be deleted automatically."
 msgstr ""
 
 #: templates/misago/admin/users/edit.html:294
@@ -3334,8 +3256,7 @@ msgstr ""
 
 #: templates/misago/categories/last_thread.html:82
 msgid "This category is protected. You can't browse it's contents."
-msgstr ""
-"Ta kategoria jest zabezpieczona. Nie możesz przeglądać jej zawartości."
+msgstr "Ta kategoria jest zabezpieczona. Nie możesz przeglądać jej zawartości."
 
 #: templates/misago/emails/activation/by_admin.html:6
 #: templates/misago/emails/activation/by_admin.txt:6
@@ -3373,8 +3294,8 @@ msgstr "Aktywuj moje konto!"
 #: templates/misago/emails/change_email.txt:6
 #, python-format
 msgid ""
-"%(user)s, you are receiving this message because you have changed your "
-"e-mail address."
+"%(user)s, you are receiving this message because you have changed your e-"
+"mail address."
 msgstr ""
 
 #: templates/misago/emails/change_email.html:11
@@ -3421,7 +3342,7 @@ msgid ""
 "download."
 msgstr ""
 
-#: templates/misago/emails/data_download.html:11 users/apps.py:57
+#: templates/misago/emails/data_download.html:11 users/apps.py:52
 msgid "Download data"
 msgstr "Pobierz dane"
 
@@ -3498,8 +3419,8 @@ msgstr ""
 #: templates/misago/emails/register/inactive.html:12
 #: templates/misago/emails/register/inactive.txt:15
 msgid ""
-"This may take a while, but you will receive e-mail with notification once it"
-" happens."
+"This may take a while, but you will receive e-mail with notification once it "
+"happens."
 msgstr ""
 
 #: templates/misago/emails/register/inactive.html:17
@@ -3562,8 +3483,7 @@ msgstr "Żądana strona nie została znaleziona."
 msgid ""
 "The link you followed was incorrect or the page has been moved or deleted."
 msgstr ""
-"Podany link jest nieprawidłowy lub strona została przeniesiona bądź "
-"usunięta."
+"Podany link jest nieprawidłowy lub strona została przeniesiona bądź usunięta."
 
 #: templates/misago/errorpages/405.html:5
 #: templates/misago/errorpages/405.html:13
@@ -3690,13 +3610,13 @@ msgid ""
 "saved to database, it is not possible for us to simply send you your "
 "password."
 msgstr ""
-"Ponieważ hasła użytkowników są przetwarzane w nieodwracalny sposób przed ich"
-" zapisaniem do bazy danych, nie jesteśmy w stanie wysłać Twojego hasła."
+"Ponieważ hasła użytkowników są przetwarzane w nieodwracalny sposób przed ich "
+"zapisaniem do bazy danych, nie jesteśmy w stanie wysłać Twojego hasła."
 
 #: templates/misago/forgottenpassword/request.html:39
 msgid ""
-"Instead, you can change your password using special secure form that will be"
-" available by special link valid only for your browser, for seven days or "
+"Instead, you can change your password using special secure form that will be "
+"available by special link valid only for your browser, for seven days or "
 "until your password is changed."
 msgstr ""
 
@@ -3827,7 +3747,7 @@ msgstr "Pokaż wyniki"
 #: templates/misago/profile/ban_details.html:5
 #: templates/misago/profile/ban_details.html:8
 #: templates/misago/profile/ban_details.html:9
-#: templates/misago/profile/ban_details.html:16 users/apps.py:137
+#: templates/misago/profile/ban_details.html:16 users/apps.py:128
 msgid "Ban details"
 msgstr "Szczegóły bana"
 
@@ -3880,7 +3800,7 @@ msgstr[3] ""
 #: templates/misago/profile/details.html:5
 #: templates/misago/profile/details.html:8
 #: templates/misago/profile/details.html:9
-#: templates/misago/profile/details.html:19 users/apps.py:124
+#: templates/misago/profile/details.html:19 users/apps.py:115
 msgid "Details"
 msgstr "Informacje"
 
@@ -3909,7 +3829,7 @@ msgstr "Ten błąd jest spowodowany nieprawidłową zmianą treści posta."
 
 #: templates/misago/profile/followers.html:5
 #: templates/misago/profile/followers.html:8
-#: templates/misago/profile/followers.html:9 users/apps.py:112
+#: templates/misago/profile/followers.html:9 users/apps.py:103
 msgid "Followers"
 msgstr "Obserwujące"
 
@@ -3942,7 +3862,7 @@ msgstr "Nikt nie obserwuje %(username)s."
 
 #: templates/misago/profile/follows.html:5
 #: templates/misago/profile/follows.html:8
-#: templates/misago/profile/follows.html:9 users/apps.py:118
+#: templates/misago/profile/follows.html:9 users/apps.py:109
 msgid "Follows"
 msgstr "Obserwuje"
 
@@ -4042,7 +3962,7 @@ msgstr "%(username)s nie ma żadnych tematów"
 
 #: templates/misago/profile/username_history.html:5
 #: templates/misago/profile/username_history.html:8
-#: templates/misago/profile/username_history.html:9 users/apps.py:130
+#: templates/misago/profile/username_history.html:9 users/apps.py:121
 msgid "Username history"
 msgstr "Historia nazwy"
 
@@ -4233,8 +4153,8 @@ msgstr ""
 
 #: templates/misago/thread/posts/post/flags.html:29
 msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
 "Ten post oczekuje na zatwierdzenie. Tylko osoba która go napisała i osoby z "
 "odpowiednim dostępem mogą widzieć jego zawartość."
@@ -4431,7 +4351,7 @@ msgstr "Akieta"
 
 #: templates/misago/userslists/active_posters.html:5
 #: templates/misago/userslists/active_posters.html:23
-#: templates/misago/userslists/active_posters.html:24 users/apps.py:81
+#: templates/misago/userslists/active_posters.html:24 users/apps.py:72
 msgid "Top posters"
 msgstr ""
 
@@ -4459,12 +4379,9 @@ msgstr "Nikt nie napisał nowych wiadomości w ciągu ostatnich %(days)s dni."
 msgid "%(posters)s top poster from last %(days)s days."
 msgid_plural "%(posters)s top posters from last %(days)s days."
 msgstr[0] "%(posters)s najaktywniejszy postujący z ostatnich %(days)s dni."
-msgstr[1] ""
-"%(posters)s najaktywniejszych postujących z ostatnich %(days)s dni."
-msgstr[2] ""
-"%(posters)s najaktywniejszych postujących z ostatnich %(days)s dni."
-msgstr[3] ""
-"%(posters)s najaktywniejszych postujących z ostatnich %(days)s dni."
+msgstr[1] "%(posters)s najaktywniejszych postujących z ostatnich %(days)s dni."
+msgstr[2] "%(posters)s najaktywniejszych postujących z ostatnich %(days)s dni."
+msgstr[3] "%(posters)s najaktywniejszych postujących z ostatnich %(days)s dni."
 
 #: templates/misago/userslists/active_posters.html:116
 #: templates/misago/userslists/active_posters.html:128
@@ -4751,11 +4668,11 @@ msgstr ""
 msgid "Default Misago Theme"
 msgstr "Domyślny szablon Misago"
 
-#: threads/admin/__init__.py:45
+#: threads/admin/__init__.py:43
 msgid "Attachment types"
 msgstr "Rodzaje załączników"
 
-#: threads/admin/__init__.py:46
+#: threads/admin/__init__.py:44
 msgid "Specify what files may be uploaded on the forum."
 msgstr ""
 
@@ -4805,8 +4722,7 @@ msgstr ""
 
 #: threads/admin/forms.py:64
 msgid ""
-"List of comma separated file extensions associated with this attachment "
-"type."
+"List of comma separated file extensions associated with this attachment type."
 msgstr ""
 
 #: threads/admin/forms.py:68
@@ -4905,8 +4821,7 @@ msgstr ""
 #: threads/admin/views/attachmenttypes.py:47
 #, python-format
 msgid ""
-"Attachment type \"%(name)s\" has associated attachments and can't be "
-"deleted."
+"Attachment type \"%(name)s\" has associated attachments and can't be deleted."
 msgstr ""
 
 #: threads/admin/views/attachmenttypes.py:54
@@ -5116,8 +5031,7 @@ msgstr ""
 
 #: threads/api/threadendpoints/patch.py:273
 msgid ""
-"This post can't be unmarked because it's not currently marked as best "
-"answer."
+"This post can't be unmarked because it's not currently marked as best answer."
 msgstr ""
 
 #: threads/api/threadendpoints/patch.py:301
@@ -5226,7 +5140,8 @@ msgstr ""
 
 #: threads/participants.py:142
 #, python-format
-msgid "%(user)s has invited you to participate in private thread \"%(thread)s\""
+msgid ""
+"%(user)s has invited you to participate in private thread \"%(thread)s\""
 msgstr ""
 
 #: threads/permissions/attachments.py:14
@@ -5317,8 +5232,8 @@ msgstr ""
 #: threads/permissions/bestanswers.py:188
 #, python-format
 msgid ""
-"You don't have permission to change this thread's marked answer because it's"
-" in the \"%(category)s\" category."
+"You don't have permission to change this thread's marked answer because it's "
+"in the \"%(category)s\" category."
 msgstr ""
 
 #: threads/permissions/bestanswers.py:198
@@ -5385,8 +5300,8 @@ msgstr ""
 
 #: threads/permissions/bestanswers.py:274
 msgid ""
-"You can't unmark this thread's best answer because it's closed and you don't"
-" have permission to open it."
+"You can't unmark this thread's best answer because it's closed and you don't "
+"have permission to open it."
 msgstr ""
 
 #: threads/permissions/bestanswers.py:282
@@ -5605,8 +5520,8 @@ msgstr ""
 
 #: threads/permissions/privatethreads.py:52
 msgid ""
-"Allows user to report private threads they are participating in, making them"
-" accessible to moderators."
+"Allows user to report private threads they are participating in, making them "
+"accessible to moderators."
 msgstr ""
 "Pozwól użytkownikowi zgłosić prywatny temat, w którym bierze udział, dając "
 "mu dostęp do moderatorów."
@@ -5685,8 +5600,8 @@ msgstr ""
 msgid ""
 "Allows access to \"unapproved\" tab on threads lists for easy listing of "
 "threads that are unapproved or contain unapproved posts. Despite the tab "
-"being available on all threads lists, it will only display threads belonging"
-" to categories in which the user has permission to approve content."
+"being available on all threads lists, it will only display threads belonging "
+"to categories in which the user has permission to approve content."
 msgstr ""
 
 #: threads/permissions/threads.py:87
@@ -6864,8 +6779,8 @@ msgstr "Jest administratorem"
 #: users/admin/forms.py:78
 msgid ""
 "Designates whether the user can log into admin sites. If Django admin site "
-"is enabled, this user will need additional permissions assigned within it to"
-" admin Django modules."
+"is enabled, this user will need additional permissions assigned within it to "
+"admin Django modules."
 msgstr ""
 
 #: users/admin/forms.py:84
@@ -7030,8 +6945,8 @@ msgstr ""
 
 #: users/admin/forms.py:397
 msgid ""
-"Optional, singular version of rank name displayed by user names. For example"
-" \"GM\" or \"Dev\"."
+"Optional, singular version of rank name displayed by user names. For example "
+"\"GM\" or \"Dev\"."
 msgstr ""
 
 #: users/admin/forms.py:407
@@ -7170,8 +7085,8 @@ msgstr ""
 
 #: users/admin/forms.py:624
 msgid ""
-"Enter every item in new line. Duplicates will be ignored. This field is case"
-" insensitive. Depending on site configuration and amount of data to archive "
+"Enter every item in new line. Duplicates will be ignored. This field is case "
+"insensitive. Depending on site configuration and amount of data to archive "
 "it may take up to few days for requests to complete. E-mail will "
 "notification will be sent to every user once their download is ready."
 msgstr ""
@@ -7408,26 +7323,21 @@ msgstr "Konto użytkownika \"%(user)s\" zostało zarejestrowane."
 msgid "User \"%(user)s\" has been edited."
 msgstr ""
 
-#: users/api/auth.py:42 users/api/auth.py:92 users/api/auth.py:130
-#: users/api/auth.py:174
-msgid "Please use the 3rd party site to authenticate."
-msgstr ""
-
-#: users/api/auth.py:100
+#: users/api/auth.py:94
 #, python-format
 msgid "Activate %(user)s account on %(forum_name)s forums"
 msgstr ""
 
-#: users/api/auth.py:138
+#: users/api/auth.py:129
 #, python-format
 msgid "Change %(user)s password on %(forum_name)s forums"
 msgstr ""
 
-#: users/api/auth.py:176
+#: users/api/auth.py:164
 msgid "Form link is invalid. Please try again."
 msgstr ""
 
-#: users/api/auth.py:177
+#: users/api/auth.py:165
 msgid "Your link has expired. Please request new one."
 msgstr ""
 
@@ -7530,83 +7440,63 @@ msgstr ""
 msgid "You have to sign in to perform this action."
 msgstr "Zaloguj się aby wykonać tą akcję."
 
-#: users/api/users.py:90
-msgid "Please use the 3rd party site to register."
-msgstr ""
-
-#: users/api/users.py:113
+#: users/api/users.py:110
 msgid "You can't change other users avatars."
 msgstr "Nie możesz zmieniać avatara innych użytkowników."
 
-#: users/api/users.py:125
+#: users/api/users.py:122
 msgid "You can't change other users options."
 msgstr ""
 
-#: users/api/users.py:130
+#: users/api/users.py:127
 msgid "Your forum options have been changed."
 msgstr "Ustawienia zostały zmienione."
 
-#: users/api/users.py:137
-msgid "Please use the 3rd party site to change your username."
-msgstr ""
-
-#: users/api/users.py:141
+#: users/api/users.py:133
 msgid "You can't change other users names."
 msgstr ""
 
-#: users/api/users.py:148
+#: users/api/users.py:140
 msgid "You can't change other users signatures."
 msgstr ""
 
-#: users/api/users.py:161
-msgid "Please use the 3rd party site to change your password."
-msgstr ""
-
-#: users/api/users.py:165
+#: users/api/users.py:152
 msgid "You can't change other users passwords."
 msgstr ""
 
-#: users/api/users.py:175
-msgid "Please use the 3rd party site to change your e-mail."
-msgstr ""
-
-#: users/api/users.py:180
+#: users/api/users.py:162
 msgid "You can't change other users e-mail addresses."
 msgstr ""
 
-#: users/api/users.py:211
-msgid "Please use the 3rd party site to delete account."
-msgstr ""
-
-#: users/api/users.py:292
+#: users/api/users.py:269
 msgid "You can't request data downloads for other users."
 msgstr ""
 
-#: users/api/users.py:296
+#: users/api/users.py:273
 msgid "You can't download your data."
 msgstr "Nie możesz pobrać swoich danych."
 
-#: users/api/users.py:301
+#: users/api/users.py:278
 msgid "You can't have more than one data download request at a single time."
 msgstr ""
 
-#: users/api/users.py:358
+#: users/api/users.py:335
 msgid "You can't see other users data downloads."
 msgstr ""
 
-#: users/apps.py:33
+#: users/apps.py:30
 msgid "Edit details"
 msgstr "Aktualizuj informacje"
 
-#: users/apps.py:39
+#: users/apps.py:36
 msgid "Change username"
 msgstr "Zmień nazwę użytkownika"
 
-#: users/apps.py:46
+#: users/apps.py:42
 msgid "Change email or password"
 msgstr "Zmień e-mail lub hasło"
 
-#: users/apps.py:71
+#: users/apps.py:63
 msgid "Delete account"
 msgstr "Usuń konto"
 
@@ -7685,7 +7575,7 @@ msgstr "Wprowadzony e-mail jest nieprawidłowy."
 msgid "No user with this e-mail exists."
 msgstr "Nie ma użytkownika z podanym e-mailem."
 
-#: users/forms/auth.py:150 users/views/activation.py:51
+#: users/forms/auth.py:150 users/views/activation.py:46
 #, python-format
 msgid "%(user)s, your account is already active."
 msgstr ""
@@ -7707,6 +7597,14 @@ msgid ""
 "request new password."
 msgstr ""
 
+#: users/forms/register.py:34 users/validators.py:80
+msgid "This username is not allowed."
+msgstr ""
+
+#: users/forms/register.py:45 users/validators.py:52
+msgid "This e-mail address is not allowed."
+msgstr "Ten email nie jest dozwolony."
+
 #: users/forms/register.py:51
 msgid "This agreement is required."
 msgstr ""
@@ -8110,9 +8008,9 @@ msgstr ""
 
 #: users/profilefields/default.py:41
 msgid ""
-"If you own website in the internet you wish to share on your profile you may"
-" enter its address here. Remember to for it to be valid http address "
-"starting with either \"http://\" or \"https://\"."
+"If you own website in the internet you wish to share on your profile you may "
+"enter its address here. Remember to for it to be valid http address starting "
+"with either \"http://\" or \"https://\"."
 msgstr ""
 
 #: users/profilefields/default.py:49
@@ -8132,9 +8030,9 @@ msgstr ""
 #: users/profilefields/default.py:62
 #, python-format
 msgid ""
-"If you own Twitter account, here you may enter your Twitter handle for other"
-" users to find you. Starting your handle with \"@\" sign is optional. Either"
-" \"@%(slug)s\" or \"%(slug)s\" are valid values."
+"If you own Twitter account, here you may enter your Twitter handle for other "
+"users to find you. Starting your handle with \"@\" sign is optional. Either "
+"\"@%(slug)s\" or \"%(slug)s\" are valid values."
 msgstr ""
 
 #: users/profilefields/default.py:73
@@ -8241,52 +8139,38 @@ msgstr "Wprowadzone dane znajdują się w bazie spamerów."
 msgid "This email is not allowed."
 msgstr "Ten e-mail nie jest dozwolony."
 
-#: users/views/activation.py:21
-msgid "Please use the 3rd party site to activate your account."
-msgstr ""
-
-#: users/views/activation.py:56
+#: users/views/activation.py:51
 #, python-format
 msgid ""
 "%(user)s, your activation link is invalid. Try again or request new "
 "activation link."
 msgstr ""
-"%(user)s, twój link aktywacyjny jest błędny. Spróbóuj ponownie albo poproś o"
-" nowy link aktywacyjny."
+"%(user)s, twój link aktywacyjny jest błędny. Spróbóuj ponownie albo poproś o "
+"nowy link aktywacyjny."
 
-#: users/views/activation.py:74
+#: users/views/activation.py:69
 #, python-format
 msgid "%(user)s, your account has been activated!"
 msgstr "%(user)s, twoje konto zostało aktywowane!"
 
-#: users/views/forgottenpassword.py:18 users/views/options.py:70
-msgid "Please use the 3rd party site to change password."
-msgstr "Aby zmienić hasło, użyj strony której użyłeś do utworzenia konta."
-
-#: users/views/forgottenpassword.py:45
+#: users/views/forgottenpassword.py:31
 #, python-format
-msgid ""
-"%(user)s, your link has expired. Please request new link and try again."
+msgid "%(user)s, your link has expired. Please request new link and try again."
 msgstr "%(user)s, twój link wygasł. Poproś o nowy link i spróbuj ponownie."
 
-#: users/views/forgottenpassword.py:52
+#: users/views/forgottenpassword.py:38
 #, python-format
 msgid "%(user)s, your link is invalid. Please try again or request new link."
 msgstr ""
 "%(user)s, twój link jest nieprawidłowy. Spróbuj ponownie albo poproś o nowy "
 "link."
 
-#: users/views/options.py:47
-msgid "Please use the 3rd party site to change e-mail."
-msgstr ""
-"Aby zmienić adres e-mail, użyj strony której użyłeś do utworzenia konta."
-
-#: users/views/options.py:59
+#: users/views/options.py:56
 #, python-format
 msgid "%(user)s, your e-mail has been changed."
 msgstr "%(user)s, twój e-mail został zmieniony."
 
-#: users/views/options.py:80
+#: users/views/options.py:74
 #, python-format
 msgid "%(user)s, your password has been changed."
 msgstr "%(user)s, twoje hasło zostało zmienione."

BIN
misago/locale/pl/LC_MESSAGES/djangojs.mo


+ 95 - 104
misago/locale/pl/LC_MESSAGES/djangojs.po

@@ -2,25 +2,27 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # Sevos <sevosik@gmail.com>, 2019
 # Rafał Pitoń <kontakt@rpiton.com>, 2022
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Rafał Pitoń <kontakt@rpiton.com>, 2022\n"
 "Language-Team: Polish (https://www.transifex.com/misago/teams/65369/pl/)\n"
+"Language: pl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: pl\n"
-"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n"
+"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n"
+"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
 
 #: static/misago/admin/index.js:16
 msgid "defineLocaleOverride"
@@ -152,8 +154,7 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid "This category is protected. You can't browse its contents."
-msgstr ""
-"Ta kategoria jest zabezpieczona. Nie możesz przeglądać jej zawartości."
+msgstr "Ta kategoria jest zabezpieczona. Nie możesz przeglądać jej zawartości."
 
 #: static/misago/js/misago.js:1
 msgid "%(threads)s thread"
@@ -393,8 +394,8 @@ msgstr "Najlepsza odpowiedź"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Please select the best answer for your newly merged thread. No posts will be"
-" deleted during the merge."
+"Please select the best answer for your newly merged thread. No posts will be "
+"deleted during the merge."
 msgstr ""
 "Wybierz najlepszą odpowiedź dla połączonego tematu. Żadne posty nie zostaną "
 "usunięte w wyniku połączenia."
@@ -464,12 +465,9 @@ msgid "Used changes become available again after %(name_changes_expire)s day."
 msgid_plural ""
 "Used changes become available again after %(name_changes_expire)s days."
 msgstr[0] "Zmiany nazwy stają się dostępne po %(name_changes_expire)s dniu. "
-msgstr[1] ""
-"Zmiany nazwy stają się dostępne po %(name_changes_expire)s dniach. "
-msgstr[2] ""
-"Zmiany nazwy stają się dostępne po %(name_changes_expire)s dniach. "
-msgstr[3] ""
-"Zmiany nazwy stają się dostępne po %(name_changes_expire)s dniach. "
+msgstr[1] "Zmiany nazwy stają się dostępne po %(name_changes_expire)s dniach. "
+msgstr[2] "Zmiany nazwy stają się dostępne po %(name_changes_expire)s dniach. "
+msgstr[3] "Zmiany nazwy stają się dostępne po %(name_changes_expire)s dniach. "
 
 #: static/misago/js/misago.js:1
 msgid "Your new username is same as current one."
@@ -497,8 +495,8 @@ msgstr "Usuń konto"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You are going to delete your account. This action is nonreversible, and will"
-" result in following data being deleted:"
+"You are going to delete your account. This action is nonreversible, and will "
+"result in following data being deleted:"
 msgstr ""
 "Zamierzasz usunąć swój profil. Ta akcja jest nieodwracalna. Wraz z twoim "
 "profilem zostaną usunięte następujące dane:"
@@ -525,8 +523,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"All your posted content will NOT be deleted, but username associated with it"
-" will be changed to one shared by all deleted accounts."
+"All your posted content will NOT be deleted, but username associated with it "
+"will be changed to one shared by all deleted accounts."
 msgstr ""
 "Twoje posty NIE zostaną usunięte, ale wyświetlana przy nich nazwa "
 "użytkownika zostanie zastąpiona wspólną dla wszystkich usuniętych kont."
@@ -729,6 +727,10 @@ msgid "Change forgotten password"
 msgstr "Zmień zapomniane hasło"
 
 #: static/misago/js/misago.js:1
+msgid "%(user)s has been made new thread owner."
+msgstr "Przekazano kontrolę nad tematem %(user)s"
+
+#: static/misago/js/misago.js:1
 msgid "You have left this thread."
 msgstr "Opuszczono temat."
 
@@ -737,10 +739,6 @@ msgid "%(user)s has been removed from this thread."
 msgstr "%(user)s usunięto z tematu."
 
 #: static/misago/js/misago.js:1
-msgid "%(user)s has been made new thread owner."
-msgstr "Przekazano kontrolę nad tematem %(user)s"
-
-#: static/misago/js/misago.js:1
 msgid "See profile"
 msgstr "Zobacz profil"
 
@@ -1011,8 +1009,7 @@ msgstr "Przywróć"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you with to revert this post to the state from before this "
-"edit?"
+"Are you sure you with to revert this post to the state from before this edit?"
 msgstr "Na pewno chcesz przywrócić ten post do stanu z przed tej zmiany?"
 
 #: static/misago/js/misago.js:1
@@ -1468,18 +1465,18 @@ msgstr ""
 "zawartość."
 
 #: static/misago/js/misago.js:1
+msgid "This post is protected. Only moderators may change it."
+msgstr "Ten post jest zabezpieczony. Tylko moderatorzy mogą go zmieniać."
+
+#: static/misago/js/misago.js:1
 msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
 "Ten post oczekuje na zatwierdzenie. Tylko osoba która go napisała i osoby z "
 "odpowiednim dostępem mogą widzieć jego zawartość."
 
 #: static/misago/js/misago.js:1
-msgid "This post is protected. Only moderators may change it."
-msgstr "Ten post jest zabezpieczony. Tylko moderatorzy mogą go zmieniać."
-
-#: static/misago/js/misago.js:1
 msgid "Liked"
 msgstr "Lubisz to"
 
@@ -1584,38 +1581,6 @@ msgid "%(username)s's details have been updated."
 msgstr "Informacje %(username)s zostały zaktualizowane."
 
 #: static/misago/js/misago.js:1
-msgid "You have no started threads."
-msgstr "Nie masz żadnych tematów."
-
-#: static/misago/js/misago.js:1
-msgid "%(username)s started no threads."
-msgstr "%(username)s nie ma żadnych tematów"
-
-#: static/misago/js/misago.js:1
-msgid "You have started %(threads)s thread."
-msgid_plural "You have started %(threads)s threads."
-msgstr[0] "Masz %(threads)s temat."
-msgstr[1] "Masz %(threads)s tematy."
-msgstr[2] "Masz %(threads)s tematów."
-msgstr[3] "Masz %(threads)s tematów."
-
-#: static/misago/js/misago.js:1
-msgid "%(username)s has started %(threads)s thread."
-msgid_plural "%(username)s has started %(threads)s threads."
-msgstr[0] "%(username)s ma %(threads)s temat."
-msgstr[1] "%(username)s ma %(threads)s tematy."
-msgstr[2] "%(username)s ma %(threads)s tematów."
-msgstr[3] "%(username)s ma %(threads)s tematów."
-
-#: static/misago/js/misago.js:1
-msgid "Loading..."
-msgstr "Ładuję..."
-
-#: static/misago/js/misago.js:1
-msgid "Threads"
-msgstr "Tematy"
-
-#: static/misago/js/misago.js:1
 msgid "You have posted no messages."
 msgstr "Nie masz żadnych postów."
 
@@ -1640,10 +1605,42 @@ msgstr[2] "%(username)s ma %(posts)s postów."
 msgstr[3] "%(username)s ma %(posts)s postów."
 
 #: static/misago/js/misago.js:1
+msgid "Loading..."
+msgstr "Ładuję..."
+
+#: static/misago/js/misago.js:1
 msgid "Posts"
 msgstr "Posty"
 
 #: static/misago/js/misago.js:1
+msgid "You have no started threads."
+msgstr "Nie masz żadnych tematów."
+
+#: static/misago/js/misago.js:1
+msgid "%(username)s started no threads."
+msgstr "%(username)s nie ma żadnych tematów"
+
+#: static/misago/js/misago.js:1
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
+msgstr[0] "Masz %(threads)s temat."
+msgstr[1] "Masz %(threads)s tematy."
+msgstr[2] "Masz %(threads)s tematów."
+msgstr[3] "Masz %(threads)s tematów."
+
+#: static/misago/js/misago.js:1
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
+msgstr[0] "%(username)s ma %(threads)s temat."
+msgstr[1] "%(username)s ma %(threads)s tematy."
+msgstr[2] "%(username)s ma %(threads)s tematów."
+msgstr[3] "%(username)s ma %(threads)s tematów."
+
+#: static/misago/js/misago.js:1
+msgid "Threads"
+msgstr "Tematy"
+
+#: static/misago/js/misago.js:1
 msgid "Show older activity"
 msgstr "Pokaż starszą aktywność"
 
@@ -1821,8 +1818,7 @@ msgstr ""
 #: static/misago/js/misago.js:1
 msgid ""
 "%(username)s's account has been deleted and other content has been hidden."
-msgstr ""
-"Konto %(username)s zostało usunięte a treści z niego utworzone ukryte."
+msgstr "Konto %(username)s zostało usunięte a treści z niego utworzone ukryte."
 
 #: static/misago/js/misago.js:1
 msgid "Delete %(username)s"
@@ -2141,8 +2137,7 @@ msgstr "ostatnia odpowiedź od %(user)s %(date)s"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you want to merge selected posts? This action is not "
-"reversible!"
+"Are you sure you want to merge selected posts? This action is not reversible!"
 msgstr "Na pewno chcesz połączyć wybrane posty? Tej akcji nie można cofnąć!"
 
 #: static/misago/js/misago.js:1
@@ -2236,8 +2231,8 @@ msgid ""
 "Merge will delete current thread and move its contents to the thread "
 "specified here."
 msgstr ""
-"Połączenie usunie ten temat i przeniesie jego zawartość do tematu wskazanego"
-" w tym polu."
+"Połączenie usunie ten temat i przeniesie jego zawartość do tematu wskazanego "
+"w tym polu."
 
 #: static/misago/js/misago.js:1
 msgid "Merge thread"
@@ -2491,13 +2486,13 @@ msgid ""
 "You can't move threads because there are no categories you are allowed to "
 "move them to."
 msgstr ""
-"Nie możesz przenieść tych tematów ponieważ nie istnieją żadne inne kategorie"
-" w których możesz umieścić te tematy."
+"Nie możesz przenieść tych tematów ponieważ nie istnieją żadne inne kategorie "
+"w których możesz umieścić te tematy."
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You need permission to start threads in category to be able to merge threads"
-" to it."
+"You need permission to start threads in category to be able to merge threads "
+"to it."
 msgstr ""
 "Musisz móc zakładać nowe tematy w kategorii w której chcesz umieścić "
 "połączony temat."
@@ -2674,12 +2669,9 @@ msgstr "Posty razem"
 msgid "%(posters)s top poster from last %(days)s days."
 msgid_plural "%(posters)s top posters from last %(days)s days."
 msgstr[0] "%(posters)s najaktywniejszy postujący z ostatnich %(days)s dni."
-msgstr[1] ""
-"%(posters)s najaktywniejszych postujących z ostatnich %(days)s dni."
-msgstr[2] ""
-"%(posters)s najaktywniejszych postujących z ostatnich %(days)s dni."
-msgstr[3] ""
-"%(posters)s najaktywniejszych postujących z ostatnich %(days)s dni."
+msgstr[1] "%(posters)s najaktywniejszych postujących z ostatnich %(days)s dni."
+msgstr[2] "%(posters)s najaktywniejszych postujących z ostatnich %(days)s dni."
+msgstr[3] "%(posters)s najaktywniejszych postujących z ostatnich %(days)s dni."
 
 #: static/misago/js/misago.js:1
 msgid "Users"
@@ -2770,20 +2762,28 @@ msgid "You are banned"
 msgstr "Jesteś zbanowany"
 
 #: static/misago/js/misago.js:1
-msgid "You have to accept the terms of service."
-msgstr "Musisz zaakceptować regulamin."
+msgid "Valid password must be at least %(limit_value)s character long."
+msgid_plural "Valid password must be at least %(limit_value)s characters long."
+msgstr[0] ""
+"Prawidłowe hasło powinno mieć przynajmniej %(limit_value)s znak długości."
+msgstr[1] ""
+"Prawidłowe hasło powinno mieć przynajmniej %(limit_value)s znaki długości."
+msgstr[2] ""
+"Prawidłowe hasło powinno mieć przynajmniej %(limit_value)s znaków długości."
+msgstr[3] ""
+"Prawidłowe hasło powinno mieć przynajmniej %(limit_value)s znaków długości."
 
 #: static/misago/js/misago.js:1
 msgid "You have to accept the privacy policy."
 msgstr "Musisz zaakceptować politykę prywatności."
 
 #: static/misago/js/misago.js:1
-msgid "Username must be at least %(limit_value)s character long."
-msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] "Nazwa musi mieć przynajmniej %(limit_value)s znak."
-msgstr[1] "Nazwa musi mieć przynajmniej %(limit_value)s znaki długości."
-msgstr[2] "Nazwa musi mieć przynajmniej %(limit_value)s znaków długości."
-msgstr[3] "Nazwa musi mieć przynajmniej %(limit_value)s znaków długości."
+msgid "You have to accept the terms of service."
+msgstr "Musisz zaakceptować regulamin."
+
+#: static/misago/js/misago.js:1
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr "Nazwa może zawierać wyłącznie znaki alfabetu łacińskiego i cyfry."
 
 #: static/misago/js/misago.js:1
 msgid "Username cannot be longer than %(limit_value)s character."
@@ -2794,21 +2794,12 @@ msgstr[2] "Nazwa nie może być dłuższa niż %(limit_value)s znaków."
 msgstr[3] "Nazwa nie może być dłuższa niż %(limit_value)s znaków."
 
 #: static/misago/js/misago.js:1
-msgid "Username can only contain latin alphabet letters and digits."
-msgstr "Nazwa może zawierać wyłącznie znaki alfabetu łacińskiego i cyfry."
-
-#: static/misago/js/misago.js:1
-msgid "Valid password must be at least %(limit_value)s character long."
-msgid_plural ""
-"Valid password must be at least %(limit_value)s characters long."
-msgstr[0] ""
-"Prawidłowe hasło powinno mieć przynajmniej %(limit_value)s znak długości."
-msgstr[1] ""
-"Prawidłowe hasło powinno mieć przynajmniej %(limit_value)s znaki długości."
-msgstr[2] ""
-"Prawidłowe hasło powinno mieć przynajmniej %(limit_value)s znaków długości."
-msgstr[3] ""
-"Prawidłowe hasło powinno mieć przynajmniej %(limit_value)s znaków długości."
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
+msgstr[0] "Nazwa musi mieć przynajmniej %(limit_value)s znak."
+msgstr[1] "Nazwa musi mieć przynajmniej %(limit_value)s znaki długości."
+msgstr[2] "Nazwa musi mieć przynajmniej %(limit_value)s znaków długości."
+msgstr[3] "Nazwa musi mieć przynajmniej %(limit_value)s znaków długości."
 
 #: static/misago/js/misago.js:1
 msgid "This field is required."
@@ -2825,8 +2816,8 @@ msgstr[0] ""
 "Zawartość tego pola powinna mieć przynajmniej %(limit_value)s znak długości "
 "(ma %(show_value)s)."
 msgstr[1] ""
-"Zawartość tego pola powinna mieć przynajmniej %(limit_value)s znaki długości"
-" (ma %(show_value)s)."
+"Zawartość tego pola powinna mieć przynajmniej %(limit_value)s znaki długości "
+"(ma %(show_value)s)."
 msgstr[2] ""
 "Zawartość tego pola powinna mieć przynajmniej %(limit_value)s znaków "
 "długości (ma %(show_value)s)."

BIN
misago/locale/pt_BR/LC_MESSAGES/django.mo


+ 250 - 389
misago/locale/pt_BR/LC_MESSAGES/django.po

@@ -2,26 +2,27 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # Kassio Cruz <kassiocs16@gmail.com>, 2017
 # Kayky de Brito dos Santos <true.kb@outlook.com>, 2018
 # Allan Souza <ironags18@gmail.com>, 2018
 # Kyodhan Hyakuya <Kyodhan@gmail.com>, 2019
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-11-10 16:42+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Kyodhan Hyakuya <Kyodhan@gmail.com>, 2019\n"
-"Language-Team: Portuguese (Brazil) (https://www.transifex.com/misago/teams/65369/pt_BR/)\n"
+"Language-Team: Portuguese (Brazil) (https://www.transifex.com/misago/"
+"teams/65369/pt_BR/)\n"
+"Language: pt_BR\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: pt_BR\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 #: acl/admin/__init__.py:24 templates/misago/acl_debug.html:16
@@ -221,7 +222,7 @@ msgid "Only members with valid permissions can post in closed categories."
 msgstr ""
 "Somente membros com permissões válidas podem postar em categorias fechadas."
 
-#: categories/admin/forms.py:70 conf/admin/__init__.py:93
+#: categories/admin/forms.py:70 conf/admin/__init__.py:79
 #: templates/misago/admin/categories/list.html:19
 #: templates/misago/admin/dashboard/totals.html:19
 #: templates/misago/navbar.html:20 templates/misago/navbar.html:36
@@ -235,15 +236,14 @@ msgstr ""
 #: templates/misago/threadslist/threads.html:42
 #: templates/misago/threadslist/threads.html:66
 #: threads/permissions/threads.py:73 threads/permissions/threads.py:104
-#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:106
+#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:97
 msgid "Threads"
 msgstr "Tópicos"
 
 #: categories/admin/forms.py:73
 msgid "All threads started in this category will require moderator approval."
 msgstr ""
-"Todos os tópicos iniciados nesta categoria exigirão a aprovação do "
-"moderador."
+"Todos os tópicos iniciados nesta categoria exigirão a aprovação do moderador."
 
 #: categories/admin/forms.py:77
 msgid "Replies"
@@ -273,8 +273,8 @@ msgstr "Tópicos por idade"
 
 #: categories/admin/forms.py:95
 msgid ""
-"Prune thread if number of days since its creation is greater than specified."
-" Enter 0 to disable this pruning criteria."
+"Prune thread if number of days since its creation is greater than specified. "
+"Enter 0 to disable this pruning criteria."
 msgstr ""
 "Poda o tópico se o número de dias desde de sua criação é maior que o "
 "especificado. Insira 0 para desabilitar este critério de poda."
@@ -325,11 +325,10 @@ msgstr "Arquivo"
 
 #: categories/admin/forms.py:173
 msgid ""
-"Instead of being deleted, pruned threads can be moved to designated "
-"category."
+"Instead of being deleted, pruned threads can be moved to designated category."
 msgstr ""
-"Em vez de excluídos, os tópicos parados podem ser movidos para uma categoria"
-" designada."
+"Em vez de excluídos, os tópicos parados podem ser movidos para uma categoria "
+"designada."
 
 #: categories/admin/forms.py:177
 msgid "Don't archive pruned threads"
@@ -344,8 +343,8 @@ msgid ""
 "You are trying to move this category threads to a child category that will "
 "be deleted together with this category."
 msgstr ""
-"Você está tentando mover os tópicos desta categoria para uma categoria filha"
-" que será deletada junta desta categoria."
+"Você está tentando mover os tópicos desta categoria para uma categoria filha "
+"que será deletada junta desta categoria."
 
 #: categories/admin/forms.py:213
 msgid "Move category threads to"
@@ -360,8 +359,7 @@ msgid "Move child categories to"
 msgstr "Mover categorias filhas para"
 
 #: categories/admin/forms.py:249 categories/admin/forms.py:264
-#: templates/misago/acl_debug.html:15
-#: templates/misago/admin/roles/list.html:16
+#: templates/misago/acl_debug.html:15 templates/misago/admin/roles/list.html:16
 msgid "Role"
 msgstr "Função"
 
@@ -471,20 +469,20 @@ msgstr "Pode ver o conteúdo da categoria"
 msgid "You don't have permission to browse \"%(category)s\" contents."
 msgstr "Você não tem permissão para navegar no conteúdo de \"%(category)s\"."
 
-#: conf/admin/__init__.py:45 templates/misago/admin/conf/index.html:5
+#: conf/admin/__init__.py:41 templates/misago/admin/conf/index.html:5
 #: templates/misago/admin/themes/form.html:48
 msgid "Settings"
 msgstr "Configurações"
 
-#: conf/admin/__init__.py:52 templates/misago/admin/socialauth/form.html:27
+#: conf/admin/__init__.py:48 templates/misago/admin/socialauth/form.html:27
 msgid "General"
 msgstr "Geral"
 
-#: conf/admin/__init__.py:53
+#: conf/admin/__init__.py:49
 msgid "Change forum details like name, description or footer."
 msgstr "Alterar detalhes de fórum, como nome, descrição ou rodapé."
 
-#: conf/admin/__init__.py:58 templates/misago/admin/dashboard/totals.html:7
+#: conf/admin/__init__.py:54 templates/misago/admin/dashboard/totals.html:7
 #: templates/misago/admin/users/ban.html:22 templates/misago/navbar.html:42
 #: templates/misago/userslists/base.html:5
 #: templates/misago/userslists/base.html:14 users/admin/__init__.py:74
@@ -492,42 +490,30 @@ msgstr "Alterar detalhes de fórum, como nome, descrição ou rodapé."
 msgid "Users"
 msgstr "Usuários"
 
-#: conf/admin/__init__.py:60
+#: conf/admin/__init__.py:56
 msgid "Customize user accounts default behavior and features availability."
 msgstr ""
 "Customize o comportamento padrão das contas de usuário e a disponibilidade "
 "de recursos."
 
-#: conf/admin/__init__.py:67
+#: conf/admin/__init__.py:63
 msgid "Captcha"
 msgstr "Captcha"
 
-#: conf/admin/__init__.py:69
+#: conf/admin/__init__.py:65
 msgid "Setup protection against automatic registrations on the site."
 msgstr "Configuração de proteção contra registros automáticos no site."
 
-#: conf/admin/__init__.py:76
-msgid "Single Sign-On"
-msgstr "Inscrição única"
-
-#: conf/admin/__init__.py:78
-msgid ""
-"SSO enables you to delegate user login and registration from Misago tothe "
-"third party site."
-msgstr ""
-"SSO permite você delegar o login e o registro de usuário a partir do misago "
-"para sites de terceiros."
-
-#: conf/admin/__init__.py:86 templates/misago/admin/dashboard/analytics.html:7
+#: conf/admin/__init__.py:72 templates/misago/admin/dashboard/analytics.html:7
 #: templates/misago/admin/dashboard/index.html:40
 msgid "Analytics"
 msgstr "Analítica"
 
-#: conf/admin/__init__.py:87
+#: conf/admin/__init__.py:73
 msgid "Enable Google Analytics or setup Google Site Verification."
 msgstr "Ativar Google Analytics ou configurar Google Site Verification."
 
-#: conf/admin/__init__.py:94
+#: conf/admin/__init__.py:80
 msgid "Threads, posts, polls and attachments options."
 msgstr "Discussões, publicações, enquetes e opções de anexos."
 
@@ -549,8 +535,8 @@ msgstr "Token de verificação de site"
 
 #: conf/admin/forms/analytics.py:27
 msgid ""
-"This token was extracted from uploaded site verification file. To change it,"
-" upload new verification file."
+"This token was extracted from uploaded site verification file. To change it, "
+"upload new verification file."
 msgstr ""
 "Este token foi extraído do arquivo de verificação. Para alterá-lo, envie um "
 "novo arquivo de verificação."
@@ -796,45 +782,6 @@ msgstr ""
 "usuários do site. O endereço no qual o site está executando aparece como "
 "\"%(address)s\"."
 
-#: conf/admin/forms/sso.py:13
-msgid "Enable Single Sign-On"
-msgstr "Habilitar inscrição única"
-
-#: conf/admin/forms/sso.py:15
-msgid ""
-"Enabling SSO will make login option redirect users to the server URL "
-"configured below. It will also disable option to register on forum, change "
-"username, email or passward, as those features will be delegated to the 3rd "
-"party site."
-msgstr ""
-"Habilitar o SSO faz a opção de login redirecionar os usuários para a URL do "
-"servidor configurada abaixo. Ele também desativa a opção de registro no "
-"fórum, alterar o nume de usuário, email ou senha, assim como todas as "
-"funções que serão incumbidas a sites de terceiros."
-
-#: conf/admin/forms/sso.py:22
-msgid "Public key"
-msgstr "Chave pública"
-
-#: conf/admin/forms/sso.py:24 conf/admin/forms/sso.py:32
-msgid ""
-"Leave this field empty for Misago to generate this key on form submission."
-msgstr ""
-"Deixe este campo em branco para que o misago gere esta chave na submissão de"
-" formulário."
-
-#: conf/admin/forms/sso.py:30
-msgid "Private key"
-msgstr "Chave privada"
-
-#: conf/admin/forms/sso.py:37
-msgid "Server URL"
-msgstr "URL do Servidor"
-
-#: conf/admin/forms/sso.py:50
-msgid "You need to enter server URL to enable SSO."
-msgstr "Você precisa colocar o URL do servidor para habilitar o SSO."
-
 #: conf/admin/forms/threads.py:27
 msgid "Daily post limit per user"
 msgstr "Limite de publicações diárias por usuário"
@@ -846,8 +793,8 @@ msgid ""
 "limit."
 msgstr ""
 "O limite de publicações que podem ser publicadas por um único usuário. Um "
-"plano B para quando o fórum for floodado por bots de spam. Alter para 0 para"
-" remover o limite."
+"plano B para quando o fórum for floodado por bots de spam. Alter para 0 para "
+"remover o limite."
 
 #: conf/admin/forms/threads.py:36
 msgid "Hourly post limit per user"
@@ -859,8 +806,8 @@ msgid ""
 "situations when forum is flooded by spam bots. Change to 0 to remove the "
 "limit."
 msgstr ""
-"Limite de publicações que podem ser feitas em uma hora por um único usuário."
-" Plano B para situações na qual o fórum é floodado por bots de spam. Altere "
+"Limite de publicações que podem ser feitas em uma hora por um único usuário. "
+"Plano B para situações na qual o fórum é floodado por bots de spam. Altere "
 "para 0 para remover o limite."
 
 #: conf/admin/forms/threads.py:45
@@ -901,10 +848,10 @@ msgstr "Limite do rastreador de leitura"
 
 #: conf/admin/forms/threads.py:71
 msgid ""
-"Controls amount of data used by read-tracking system. All content older than"
-" number of days specified in this setting is considered old and read, even "
-"if the opposite is true for the user. Active forums can try lowering this "
-"value while less active ones may wish to increase it instead. "
+"Controls amount of data used by read-tracking system. All content older than "
+"number of days specified in this setting is considered old and read, even if "
+"the opposite is true for the user. Active forums can try lowering this value "
+"while less active ones may wish to increase it instead. "
 msgstr ""
 "Controla a quantidade de dados usados pelo sistema de reastreamento de "
 "leitura. Todo o conteúdo mais velho que um número de dias especificados "
@@ -931,8 +878,8 @@ msgid ""
 "previous page, reducing the total number of pages in thread."
 msgstr ""
 "Se o número de publicações mostradas na última página for menor ou igual ao "
-"número especificado nesta configuração, estas publicações serão mostradas na"
-" página anterior, reduzindo o número total de páginas em uma discussão."
+"número especificado nesta configuração, estas publicações serão mostradas na "
+"página anterior, reduzindo o número total de páginas em uma discussão."
 
 #: conf/admin/forms/threads.py:96
 msgid "Maximum number of events displayed on a single page"
@@ -996,8 +943,8 @@ msgstr "Desativar novos registros"
 
 #: conf/admin/forms/users.py:48
 msgid ""
-"Delete new inactive accounts if they weren't activated within this number of"
-" days"
+"Delete new inactive accounts if they weren't activated within this number of "
+"days"
 msgstr ""
 "Desativar novas contas inativas se elas não foram ativadas dentro de um "
 "número de dias"
@@ -1056,8 +1003,8 @@ msgstr "Alternativa para o gravatar padrão"
 
 #: conf/admin/forms/users.py:86
 msgid ""
-"Select which avatar to use when user has no gravatar associated with their "
-"e-mail address."
+"Select which avatar to use when user has no gravatar associated with their e-"
+"mail address."
 msgstr ""
 "Selecione qual avatar usar quando o usuário não possuir gravatar associado "
 "ao seu endereço de e-mail."
@@ -1123,8 +1070,7 @@ msgstr ""
 
 #: conf/admin/forms/users.py:151
 msgid "Maximum age in days of posts that should count to the ranking"
-msgstr ""
-"Idade máxima em dias que as publicações devem contar na classificação."
+msgstr "Idade máxima em dias que as publicações devem contar na classificação."
 
 #: conf/admin/forms/users.py:155
 msgid "Maximum number of ranked users"
@@ -1185,22 +1131,22 @@ msgstr "A borda da imagem enviada deve ter pelo menos %(size)s pixels"
 msgid "This value must be lower than number of users per page."
 msgstr "Este valor deve ser menos que o número de usuários por página."
 
-#: conf/admin/views.py:40
+#: conf/admin/views.py:39
 msgid "Settings have been saved."
 msgstr "As configurações foram salvas"
 
-#: core/errorpages.py:42
+#: core/errorpages.py:51
 msgid "Permission denied."
 msgstr "Permissão negada."
 
-#: core/errorpages.py:71
+#: core/errorpages.py:80
 msgid ""
 "A problem was encountered when disconnecting your account from the remote "
 "site."
 msgstr ""
 "Um problema foi encontrado enquanto desconectava sua conta do site remoto."
 
-#: core/errorpages.py:75
+#: core/errorpages.py:84
 msgid ""
 "You are not allowed to disconnect your account from the other site, because "
 "currently it's the only way to sign in to your account."
@@ -1208,24 +1154,24 @@ msgstr ""
 "Você não pode desconectar sua conta de outro site, porque atualmente é a "
 "única forma de logar em sua conta."
 
-#: core/errorpages.py:80
+#: core/errorpages.py:89
 #, python-format
 msgid "A problem was encountered when signing you in using %(backend)s."
 msgstr "Um problema foi encontrado quando você entrou usando %(backend)s."
 
-#: core/errorpages.py:84
+#: core/errorpages.py:93
 msgid "The sign in process has been canceled by user."
 msgstr "O processo de login foi cancelado pelo usuário."
 
-#: core/errorpages.py:86
+#: core/errorpages.py:95
 msgid "The other service could not be reached."
 msgstr "O outro serviço não pôde ser alcançado."
 
-#: core/errorpages.py:92
+#: core/errorpages.py:101
 msgid "Unexpected problem has been encountered during sign in process."
 msgstr "Um problema inesperado foi encontrado durante o processo de login."
 
-#: core/errorpages.py:113
+#: core/errorpages.py:122
 msgid ""
 "Your request was rejected because your browser didn't send the CSRF cookie, "
 "or the cookie sent was invalid."
@@ -1276,11 +1222,11 @@ msgstr "Falha ao se conectar ao pypi.org API. Tente mais tarde"
 #: templates/misago/admin/dashboard/checks.html:17
 #: templates/misago/admin/dashboard/index.html:33
 msgid ""
-"Version check feature relies on the API operated by the Python Package Index"
-" (pypi.org) API to retrieve latest Misago release version."
+"Version check feature relies on the API operated by the Python Package Index "
+"(pypi.org) API to retrieve latest Misago release version."
 msgstr ""
-"A função de verificação de versão depende da API operada pelo Python Package"
-" Index (pypi.org) API para obter a última versão lançada do Misago."
+"A função de verificação de versão depende da API operada pelo Python Package "
+"Index (pypi.org) API para obter a última versão lançada do Misago."
 
 #: graphql/admin/versioncheck.py:70
 msgid "The site is running updated version of Misago."
@@ -1293,8 +1239,7 @@ msgstr "O Misago %(version)s é o último lançamento. "
 
 #: graphql/admin/versioncheck.py:77
 msgid "The site is running outdated version of Misago."
-msgstr ""
-"O site está sendo executado usando uma versão desatualizada do Misago."
+msgstr "O site está sendo executado usando uma versão desatualizada do Misago."
 
 #: graphql/admin/versioncheck.py:79
 #, python-format
@@ -1389,8 +1334,8 @@ msgstr "Link"
 #: legal/admin/forms.py:29
 msgid "If your agreement is located on other page, enter here a link to it."
 msgstr ""
-"Se o seu acordo estiver localizado em outra página, coloque aqui o link para"
-" ele."
+"Se o seu acordo estiver localizado em outra página, coloque aqui o link para "
+"ele."
 
 #: legal/admin/forms.py:35
 msgid "You can use Markdown syntax for rich text elements."
@@ -1463,7 +1408,8 @@ msgstr "O acordo \"%(title)s\" foi deletado."
 #: legal/admin/views.py:86
 #, python-format
 msgid "Agreement \"%(title)s\" has been set as active for type \"%(type)s\"."
-msgstr "O acordo \"%(title)s\" foi definido como ativo para o tipo \"%(type)s\"."
+msgstr ""
+"O acordo \"%(title)s\" foi definido como ativo para o tipo \"%(type)s\"."
 
 #: legal/admin/views.py:98
 #, python-format
@@ -1625,11 +1571,11 @@ msgstr "Buscar"
 msgid "Can search site"
 msgstr "Pode buscar no site"
 
-#: socialauth/admin/__init__.py:42
+#: socialauth/admin/__init__.py:40
 msgid "Social login"
 msgstr "Login social"
 
-#: socialauth/admin/__init__.py:44
+#: socialauth/admin/__init__.py:42
 msgid "Enable users to sign on and login using their social profile."
 msgstr ""
 "Permtiir que usuários se inscrevam e loguem usando seus perfis sociais."
@@ -1653,12 +1599,12 @@ msgstr "Associar usuários existentes por e-mail"
 #: socialauth/admin/forms/base.py:39
 msgid ""
 "Enabling this option will result in the user being signed in if their forum "
-"account was registered using same e-mail address as used on the social site."
-" Otherwise they will be asked to specify a different e-mail to continue sign"
-" in using social site."
+"account was registered using same e-mail address as used on the social site. "
+"Otherwise they will be asked to specify a different e-mail to continue sign "
+"in using social site."
 msgstr ""
-"Habilitar esta opção resultará no usuário sendo logado se sua conta de fórum"
-" for registrada usando o mesmo endereço de e-mail que foi usado na rede "
+"Habilitar esta opção resultará no usuário sendo logado se sua conta de fórum "
+"for registrada usando o mesmo endereço de e-mail que foi usado na rede "
 "social. Caso contrário, será solicitado que eles especifiquem um e-mail "
 "diferente para continuar logando usando a rede social."
 
@@ -1718,11 +1664,11 @@ msgstr "O login com %(provider)s foi movido antes de %(other)s."
 #: socialauth/pipeline.py:88
 #, python-format
 msgid ""
-"The e-mail address associated with your %(backend)s account is not available"
-" for use on this site."
+"The e-mail address associated with your %(backend)s account is not available "
+"for use on this site."
 msgstr ""
-"O endereço de e-mail associado com sua conta %(backend)s não está disponível"
-" para uso neste site."
+"O endereço de e-mail associado com sua conta %(backend)s não está disponível "
+"para uso neste site."
 
 #: socialauth/pipeline.py:98
 #, python-format
@@ -1730,25 +1676,13 @@ msgid ""
 "Your account has to be activated by site administrator before you will be "
 "able to sign in with %(backend)s."
 msgstr ""
-"Sua conta precisa ser ativada pelo adminsitrador do site antes de você poder"
-" logar com%(backend)s."
+"Sua conta precisa ser ativada pelo adminsitrador do site antes de você poder "
+"logar com%(backend)s."
 
 #: socialauth/pipeline.py:223 users/api/userendpoints/create.py:60
 msgid "Please try resubmitting the form."
 msgstr "Por favor, tente reenviar o formulário."
 
-#: socialauth/views.py:23
-msgid "Please use the 3rd party site to login."
-msgstr "Por favor, use o site de terceiros para logar."
-
-#: sso/validators.py:24 users/forms/register.py:34 users/validators.py:80
-msgid "This username is not allowed."
-msgstr "Este nome de usuário não está permitido."
-
-#: sso/validators.py:33 users/forms/register.py:45 users/validators.py:52
-msgid "This e-mail address is not allowed."
-msgstr "Este endereço de e-mail não é permitido."
-
 #: templates/misago/acl_debug.html:5
 #, python-format
 msgid ""
@@ -1802,12 +1736,11 @@ msgstr "Solicitar link de ativação"
 
 #: templates/misago/activation/request.html:25
 msgid ""
-"The site administrator may impose a requirement on newly registered accounts"
-" to be activated before users will be able to sign in."
+"The site administrator may impose a requirement on newly registered accounts "
+"to be activated before users will be able to sign in."
 msgstr ""
 "O administrador do site pode impor uma exigência na qual as novas contas "
-"registradas precisem ser ativadas antes dos usuários serem capazes de "
-"entrar."
+"registradas precisem ser ativadas antes dos usuários serem capazes de entrar."
 
 #: templates/misago/activation/request.html:28
 msgid ""
@@ -1816,8 +1749,8 @@ msgid ""
 "for your browser, for seven days or until your account is activated."
 msgstr ""
 "Dependendo do tempo do registro, você será capaz de ativar sua conta "
-"clicando em um link especial de ativação. Este link será válido somente para"
-" o seu navegador, por sete dias ou até sua conta ser ativada."
+"clicando em um link especial de ativação. Este link será válido somente para "
+"o seu navegador, por sete dias ou até sua conta ser ativada."
 
 #: templates/misago/activation/request.html:31
 msgid ""
@@ -2184,7 +2117,7 @@ msgstr "Categoria"
 #: templates/misago/admin/dashboard/totals.html:31
 #: templates/misago/admin/users/list.html:21
 #: templates/misago/profile/posts.html:5 templates/misago/profile/posts.html:8
-#: templates/misago/profile/posts.html:9 users/apps.py:102
+#: templates/misago/profile/posts.html:9 users/apps.py:93
 msgid "Posts"
 msgstr "Publicações"
 
@@ -2328,58 +2261,45 @@ msgstr "Rastreador de leitura"
 msgid "Attachment error images"
 msgstr "Imagens de erro de anexo"
 
-#: templates/misago/admin/conf/users_settings.html:9
-#: templates/misago/admin/socialauth/list.html:97
-msgid "Note"
-msgstr "Nota"
-
-#: templates/misago/admin/conf/users_settings.html:9
-msgid ""
-"Single Sign-On is enabled. Site's registration, password and deletion "
-"features have been disabled and delegated to the third-party site."
-msgstr ""
-"Inscrição única está ativada. As funções de registro, senha e deleção estão "
-"desativados do site e delegados a sites de terceiros."
-
-#: templates/misago/admin/conf/users_settings.html:14
+#: templates/misago/admin/conf/users_settings.html:8
 msgid "New accounts"
 msgstr "Contas novas"
 
-#: templates/misago/admin/conf/users_settings.html:23 users/admin/forms.py:484
+#: templates/misago/admin/conf/users_settings.html:17 users/admin/forms.py:484
 #: users/admin/forms.py:573
 msgid "Usernames"
 msgstr "Nomes de usuário"
 
-#: templates/misago/admin/conf/users_settings.html:33
+#: templates/misago/admin/conf/users_settings.html:27
 msgid "Avatars"
 msgstr "Avatares"
 
-#: templates/misago/admin/conf/users_settings.html:49
+#: templates/misago/admin/conf/users_settings.html:43
 msgid "Signatures"
 msgstr "Assinaturas"
 
-#: templates/misago/admin/conf/users_settings.html:57
+#: templates/misago/admin/conf/users_settings.html:51
 #: users/admin/__init__.py:80
 msgid "Data downloads"
 msgstr "Downloads de dados"
 
-#: templates/misago/admin/conf/users_settings.html:66
+#: templates/misago/admin/conf/users_settings.html:60
 msgid "Own account deletion"
 msgstr "Exclusão da própria conta"
 
-#: templates/misago/admin/conf/users_settings.html:74 users/admin/forms.py:492
+#: templates/misago/admin/conf/users_settings.html:68 users/admin/forms.py:492
 msgid "IP addresses"
 msgstr "Endereços de IP"
 
-#: templates/misago/admin/conf/users_settings.html:82
+#: templates/misago/admin/conf/users_settings.html:76
 msgid "Default subscription preferences"
 msgstr "Preferencias padrão de inscrição"
 
-#: templates/misago/admin/conf/users_settings.html:91
+#: templates/misago/admin/conf/users_settings.html:85
 msgid "Users lists"
 msgstr "Lista de usuários"
 
-#: templates/misago/admin/conf/users_settings.html:100
+#: templates/misago/admin/conf/users_settings.html:94
 msgid "Top posters ranking"
 msgstr "Ranking dos melhores publicadores"
 
@@ -2440,8 +2360,8 @@ msgid ""
 "engines will lower its position in search results."
 msgstr ""
 "Os navegadores podem alertar os usuários que visitarem o site sobre a "
-"insegurança. Mecanismos de pesquisa irão diminuir sua posição nos resultados"
-" de pesquisa."
+"insegurança. Mecanismos de pesquisa irão diminuir sua posição nos resultados "
+"de pesquisa."
 
 #: templates/misago/admin/dashboard/checks.html:117
 msgid "Cache is disabled."
@@ -2460,8 +2380,7 @@ msgstr ""
 msgid "There is %(downloads)s unprocessed data download request."
 msgid_plural "There are %(downloads)s unprocessed data download requests."
 msgstr[0] "Há %(downloads)s solicitação de download de dados não processada."
-msgstr[1] ""
-"Há %(downloads)s solicitações de download de dados não processadas."
+msgstr[1] "Há %(downloads)s solicitações de download de dados não processadas."
 
 #: templates/misago/admin/dashboard/checks.html:139
 msgid ""
@@ -2519,9 +2438,8 @@ msgid "Site analytics are currently unavailable due to an error."
 msgstr ""
 "Os dados de análise do site está atualmente indisponível devido um erro."
 
-#: templates/misago/admin/dashboard/totals.html:43
-#: threads/admin/__init__.py:38 threads/permissions/attachments.py:11
-#: threads/permissions/attachments.py:29
+#: templates/misago/admin/dashboard/totals.html:43 threads/admin/__init__.py:36
+#: threads/permissions/attachments.py:11 threads/permissions/attachments.py:29
 msgid "Attachments"
 msgstr "Anexos"
 
@@ -2641,24 +2559,24 @@ msgstr "Seu navegador está configurado para não aceitar ou enviar cookies."
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:12
 msgid ""
-"The form was sent after being opened in the browser for a long time (eg. few"
-" days) and cookie token has expired."
+"The form was sent after being opened in the browser for a long time (eg. few "
+"days) and cookie token has expired."
 msgstr ""
 "O formulário foi enviado depois de esta aberto no navegador por muito tempo "
 "(por exemplo, vários dias) e a token do cookie expirou."
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:15
 msgid ""
-"The site is configured to use the HTTPS, but this form was sent over the the"
-" HTTP."
+"The site is configured to use the HTTPS, but this form was sent over the the "
+"HTTP."
 msgstr ""
 "O site está configurado para usar HTTPS, mas o formulário foi enviado "
 "através de HTTP."
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:16
 msgid ""
-"If you are an owner of this site, please check if the HTTPS certificate used"
-" by the site is valid and accepted by the browser."
+"If you are an owner of this site, please check if the HTTPS certificate used "
+"by the site is valid and accepted by the browser."
 msgstr ""
 "Se você é o dono deste site, por favor, verifique se o certificado HTTPS "
 "usado pelo site é válido e aceitado pelo navegador."
@@ -2921,8 +2839,7 @@ msgstr "Mostrar e visibilidade"
 #: templates/misago/admin/ranks/list.html:17
 #: templates/misago/admin/users/list.html:19
 #: templates/misago/userslists/active_posters.html:112
-#: templates/misago/userslists/active_posters.html:123
-#: users/admin/forms.py:238
+#: templates/misago/userslists/active_posters.html:123 users/admin/forms.py:238
 msgid "Rank"
 msgstr "Classificação"
 
@@ -2987,7 +2904,7 @@ msgid "Enabled login methods"
 msgstr "Métodos de login habilitados"
 
 #: templates/misago/admin/socialauth/list.html:15
-#: templates/misago/admin/socialauth/list.html:112
+#: templates/misago/admin/socialauth/list.html:106
 msgid "Provider"
 msgstr "Provedor"
 
@@ -3003,27 +2920,19 @@ msgstr "Nenhum método de login social está habilitado."
 msgid "Are you sure you want to disable this social login provider?"
 msgstr "Você tem cereza que deseja desabilitar este provedor de login social?"
 
-#: templates/misago/admin/socialauth/list.html:97
-msgid ""
-"Single Sign-On is enabled. Social authentication has been disabled and "
-"delegated to the third-party site."
-msgstr ""
-"A inscrição única está habilitada. A autenticação social foi desabilitada e "
-"delegada para o site de terceiros."
-
-#: templates/misago/admin/socialauth/list.html:106
+#: templates/misago/admin/socialauth/list.html:100
 msgid "Setup new login method"
 msgstr "Configurar novo método de login"
 
-#: templates/misago/admin/socialauth/list.html:125
+#: templates/misago/admin/socialauth/list.html:119
 msgid "Setup login with this provider"
 msgstr "Configurar login com este provedor"
 
-#: templates/misago/admin/socialauth/list.html:126
+#: templates/misago/admin/socialauth/list.html:120
 msgid "Setup"
 msgstr "Configurar"
 
-#: templates/misago/admin/socialauth/list.html:133
+#: templates/misago/admin/socialauth/list.html:127
 msgid "No new login providers are available for setup at this time."
 msgstr ""
 "Nenhum novo provedor de login está disponível para configuração no momento."
@@ -3332,7 +3241,7 @@ msgstr ""
 msgid "Signature"
 msgstr "Assinatura"
 
-#: templates/misago/admin/users/edit.html:228 users/apps.py:27
+#: templates/misago/admin/users/edit.html:228 users/apps.py:24
 msgid "Forum options"
 msgstr "Opções do fórum"
 
@@ -3354,8 +3263,7 @@ msgstr ""
 
 #: templates/misago/admin/users/edit.html:251
 msgid ""
-"No additional action is required. This account will be deleted "
-"automatically."
+"No additional action is required. This account will be deleted automatically."
 msgstr ""
 "Nenhuma ação adicional é necessária. Esta conta será deletada "
 "automaticamente."
@@ -3401,7 +3309,9 @@ msgstr "\"*chan\" irá encontrar tanto \"chan' e \"marichan\"."
 
 #: templates/misago/admin/users/list.html:120
 msgid "\"*son*\" will match \"son\", \"song\", \"firstson\" and \"firstsong\"."
-msgstr "\"*son*\" irá encontrar tanto \"son\" quanto \"song\", \"firstson\" e \"firstsong\"."
+msgstr ""
+"\"*son*\" irá encontrar tanto \"son\" quanto \"song\", \"firstson\" e "
+"\"firstsong\"."
 
 #: templates/misago/admin/users/new.html:47
 msgid "Save user"
@@ -3551,11 +3461,11 @@ msgstr "Ativar minha conta!"
 #: templates/misago/emails/change_email.txt:6
 #, python-format
 msgid ""
-"%(user)s, you are receiving this message because you have changed your "
-"e-mail address."
+"%(user)s, you are receiving this message because you have changed your e-"
+"mail address."
 msgstr ""
-"%(user)s, você está recebendo esta mensagem porque você alterou seu endereço"
-" de e-mail. "
+"%(user)s, você está recebendo esta mensagem porque você alterou seu endereço "
+"de e-mail. "
 
 #: templates/misago/emails/change_email.html:11
 #: templates/misago/emails/change_email.txt:10
@@ -3606,7 +3516,7 @@ msgstr ""
 "%(user)s, você está recebendo esta mensagem porque seus dados estão prontos "
 "para download. "
 
-#: templates/misago/emails/data_download.html:11 users/apps.py:57
+#: templates/misago/emails/data_download.html:11 users/apps.py:52
 msgid "Download data"
 msgstr "Baixar dados"
 
@@ -3686,14 +3596,14 @@ msgid ""
 "Before you will be able to join discussion on our forums, one of our "
 "administrators will have to activate your account."
 msgstr ""
-"Antes de ser capaz de entrar em uma discussão em nossos fóruns, um de nossos"
-" administradores precisa ativar sua conta."
+"Antes de ser capaz de entrar em uma discussão em nossos fóruns, um de nossos "
+"administradores precisa ativar sua conta."
 
 #: templates/misago/emails/register/inactive.html:12
 #: templates/misago/emails/register/inactive.txt:15
 msgid ""
-"This may take a while, but you will receive e-mail with notification once it"
-" happens."
+"This may take a while, but you will receive e-mail with notification once it "
+"happens."
 msgstr ""
 "Isto pode demorar um pouco, mas você receberá um e-mail de notificação "
 "quando isto acontecer."
@@ -3913,8 +3823,8 @@ msgstr ""
 
 #: templates/misago/forgottenpassword/request.html:39
 msgid ""
-"Instead, you can change your password using special secure form that will be"
-" available by special link valid only for your browser, for seven days or "
+"Instead, you can change your password using special secure form that will be "
+"available by special link valid only for your browser, for seven days or "
 "until your password is changed."
 msgstr ""
 "Ao invés, você pode alterar sua senha usando um formulário de segurança "
@@ -3932,8 +3842,7 @@ msgstr ""
 #: templates/misago/forgottenpassword/request.html:60
 msgid "To request new password reset link please enable JavaScript."
 msgstr ""
-"Para solicitar reset de link de nova senha, por favor, habilite o "
-"JavaScript."
+"Para solicitar reset de link de nova senha, por favor, habilite o JavaScript."
 
 #: templates/misago/options/credentials_changed.html:5
 #: templates/misago/options/credentials_error.html:5
@@ -4047,7 +3956,7 @@ msgstr "Ver resultados"
 #: templates/misago/profile/ban_details.html:5
 #: templates/misago/profile/ban_details.html:8
 #: templates/misago/profile/ban_details.html:9
-#: templates/misago/profile/ban_details.html:16 users/apps.py:137
+#: templates/misago/profile/ban_details.html:16 users/apps.py:128
 msgid "Ban details"
 msgstr "Detalhes de banimento"
 
@@ -4096,7 +4005,7 @@ msgstr[1] "Iniciou %(threads)s discussões."
 #: templates/misago/profile/details.html:5
 #: templates/misago/profile/details.html:8
 #: templates/misago/profile/details.html:9
-#: templates/misago/profile/details.html:19 users/apps.py:124
+#: templates/misago/profile/details.html:19 users/apps.py:115
 msgid "Details"
 msgstr "Detalhes"
 
@@ -4126,7 +4035,7 @@ msgstr ""
 
 #: templates/misago/profile/followers.html:5
 #: templates/misago/profile/followers.html:8
-#: templates/misago/profile/followers.html:9 users/apps.py:112
+#: templates/misago/profile/followers.html:9 users/apps.py:103
 msgid "Followers"
 msgstr "Seguidores"
 
@@ -4155,7 +4064,7 @@ msgstr "O usuário %(username)s não possui seguidores."
 
 #: templates/misago/profile/follows.html:5
 #: templates/misago/profile/follows.html:8
-#: templates/misago/profile/follows.html:9 users/apps.py:118
+#: templates/misago/profile/follows.html:9 users/apps.py:109
 msgid "Follows"
 msgstr "Seguindo"
 
@@ -4243,7 +4152,7 @@ msgstr "O usuário %(username)s não iniciou nenhuma discussão."
 
 #: templates/misago/profile/username_history.html:5
 #: templates/misago/profile/username_history.html:8
-#: templates/misago/profile/username_history.html:9 users/apps.py:130
+#: templates/misago/profile/username_history.html:9 users/apps.py:121
 msgid "Username history"
 msgstr "Histórico de nome de usuário"
 
@@ -4433,11 +4342,11 @@ msgstr ""
 
 #: templates/misago/thread/posts/post/flags.html:29
 msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
-"Esta publicação foi desaprovada. Apenas usuários com permissões para aprovar"
-" publicações e seu autor podem ver seus conteúdos."
+"Esta publicação foi desaprovada. Apenas usuários com permissões para aprovar "
+"publicações e seu autor podem ver seus conteúdos."
 
 #: templates/misago/thread/posts/post/flags.html:35
 msgid "This post is protected. Only moderators may change it."
@@ -4627,7 +4536,7 @@ msgstr "Enquete"
 
 #: templates/misago/userslists/active_posters.html:5
 #: templates/misago/userslists/active_posters.html:23
-#: templates/misago/userslists/active_posters.html:24 users/apps.py:81
+#: templates/misago/userslists/active_posters.html:24 users/apps.py:72
 msgid "Top posters"
 msgstr "Top publicadores"
 
@@ -4804,7 +4713,8 @@ msgstr "O arquivo ZIP enviado não contém um \"manifest.json\"."
 
 #: themes/admin/importer.py:89
 msgid "\"manifest.json\" contained by ZIP file is not a valid JSON file."
-msgstr "\"manifest.json\" contido pelo arquivo ZIP não é um arquivo JSON válido."
+msgstr ""
+"\"manifest.json\" contido pelo arquivo ZIP não é um arquivo JSON válido."
 
 #: themes/admin/validators.py:12
 msgid "Name is missing an .css extension."
@@ -4869,8 +4779,8 @@ msgid ""
 "Theme \"%(name)s\" can't be deleted because one of its child themes is set "
 "as active."
 msgstr ""
-"O tema \"%(name)s\" não pode ser deletado porque um de seus temas filho está"
-" definido como ativo."
+"O tema \"%(name)s\" não pode ser deletado porque um de seus temas filho está "
+"definido como ativo."
 
 #: themes/admin/views.py:90
 #, python-format
@@ -4953,11 +4863,11 @@ msgstr "O link CSS \"%(name)s\" foi atualizado."
 msgid "Default Misago Theme"
 msgstr "Tema padrão do Misago."
 
-#: threads/admin/__init__.py:45
+#: threads/admin/__init__.py:43
 msgid "Attachment types"
 msgstr "Tipos de anexos"
 
-#: threads/admin/__init__.py:46
+#: threads/admin/__init__.py:44
 msgid "Specify what files may be uploaded on the forum."
 msgstr "Especifique quais arquivos podem ser enviados no fórum."
 
@@ -5007,8 +4917,7 @@ msgstr "Limitar downloads para"
 
 #: threads/admin/forms.py:64
 msgid ""
-"List of comma separated file extensions associated with this attachment "
-"type."
+"List of comma separated file extensions associated with this attachment type."
 msgstr ""
 "Lista separada por vírgula de extensões de arquivo associados com o este "
 "tipo de anexo."
@@ -5018,8 +4927,8 @@ msgid ""
 "Optional list of comma separated mime types associated with this attachment "
 "type."
 msgstr ""
-"Lista opcional separada por vírgula de mimetipos associados com este tipo de"
-" anexo."
+"Lista opcional separada por vírgula de mimetipos associados com este tipo de "
+"anexo."
 
 #: threads/admin/forms.py:72
 msgid ""
@@ -5121,8 +5030,7 @@ msgstr "O tipo de anexo \"%(name)s\" foi editado."
 #: threads/admin/views/attachmenttypes.py:47
 #, python-format
 msgid ""
-"Attachment type \"%(name)s\" has associated attachments and can't be "
-"deleted."
+"Attachment type \"%(name)s\" has associated attachments and can't be deleted."
 msgstr ""
 "O tipo de anexo \"%(name)s\" possui anexos associados e não pode ser "
 "deletado."
@@ -5320,8 +5228,7 @@ msgstr "Não é uma string válida."
 #: threads/api/threadendpoints/patch.py:86
 msgid "You can't change globally pinned threads weights in this category."
 msgstr ""
-"Você não pode alterar discussões pesadas fixadas globalmente nesta "
-"categoria."
+"Você não pode alterar discussões pesadas fixadas globalmente nesta categoria."
 
 #: threads/api/threadendpoints/patch.py:94
 msgid "You can't pin threads globally in this category."
@@ -5352,8 +5259,7 @@ msgstr "Esta publicação já está marcada como melhor resposta da discussão."
 
 #: threads/api/threadendpoints/patch.py:273
 msgid ""
-"This post can't be unmarked because it's not currently marked as best "
-"answer."
+"This post can't be unmarked because it's not currently marked as best answer."
 msgstr ""
 "Esta publicação não pode ser desmarcada porque ela não está marcada "
 "atualmente como a melhor resposta."
@@ -5455,8 +5361,7 @@ msgstr ""
 
 #: threads/moderation/posts.py:66
 msgid "You can't hide original post without hiding thread."
-msgstr ""
-"Você não pode esconder a publicação original sem esconder a discussão."
+msgstr "Você não pode esconder a publicação original sem esconder a discussão."
 
 #: threads/moderation/posts.py:92
 msgid "You can't delete original post without deleting thread."
@@ -5464,7 +5369,8 @@ msgstr "Você não pode deletar a publicação original sem deletar a discussão
 
 #: threads/participants.py:142
 #, python-format
-msgid "%(user)s has invited you to participate in private thread \"%(thread)s\""
+msgid ""
+"%(user)s has invited you to participate in private thread \"%(thread)s\""
 msgstr ""
 "O usuário %(user)s convidou você para participar da discussão privada "
 "\"%(thread)s\""
@@ -5522,8 +5428,8 @@ msgstr ""
 msgid ""
 "Enter 0 to don't limit time for changing marked best answer in owned thread."
 msgstr ""
-"Coloque 0 para não limitar o tempo para alterar a melhor resposta marcada em"
-" uma discussão própria."
+"Coloque 0 para não limitar o tempo para alterar a melhor resposta marcada em "
+"uma discussão própria."
 
 #: threads/permissions/bestanswers.py:134
 #: threads/permissions/bestanswers.py:293
@@ -5555,8 +5461,8 @@ msgid ""
 "You don't have permission to mark best answer in this thread because its "
 "category \"%(category)s\" is closed."
 msgstr ""
-"Você não tem permissão para marcar a melhor resposta nesta publicação porque"
-" sua categoria \"%(category)s\" está fechada."
+"Você não tem permissão para marcar a melhor resposta nesta publicação porque "
+"sua categoria \"%(category)s\" está fechada."
 
 #: threads/permissions/bestanswers.py:170
 msgid ""
@@ -5569,8 +5475,8 @@ msgstr ""
 #: threads/permissions/bestanswers.py:188
 #, python-format
 msgid ""
-"You don't have permission to change this thread's marked answer because it's"
-" in the \"%(category)s\" category."
+"You don't have permission to change this thread's marked answer because it's "
+"in the \"%(category)s\" category."
 msgstr ""
 "Você não tem permsisão para alterar esta resposta marcada da discussão "
 "porque el está na categoria \"%(category)s\"."
@@ -5624,8 +5530,8 @@ msgid ""
 "You don't have permission to unmark this best answer because you are not a "
 "thread starter."
 msgstr ""
-"Você não tem permissão para desmarcar esta melhor resposta porque você não é"
-" o iniciador da discussão."
+"Você não tem permissão para desmarcar esta melhor resposta porque você não é "
+"o iniciador da discussão."
 
 #: threads/permissions/bestanswers.py:254
 #, python-format
@@ -5653,8 +5559,8 @@ msgstr ""
 
 #: threads/permissions/bestanswers.py:274
 msgid ""
-"You can't unmark this thread's best answer because it's closed and you don't"
-" have permission to open it."
+"You can't unmark this thread's best answer because it's closed and you don't "
+"have permission to open it."
 msgstr ""
 "Você não pode desmarcar a melhor resposta desta discussão porque ela está "
 "fechada e você não tem permissão para abri-la."
@@ -5890,8 +5796,8 @@ msgstr "Pode reportar discussões privadas"
 
 #: threads/permissions/privatethreads.py:52
 msgid ""
-"Allows user to report private threads they are participating in, making them"
-" accessible to moderators."
+"Allows user to report private threads they are participating in, making them "
+"accessible to moderators."
 msgstr ""
 "Permitir usuário reportar discussões privadas que eles estão participando e "
 "fazê-las acessíveis para moderadores."
@@ -5929,8 +5835,7 @@ msgstr "Apenas moderadores podem alterar os donos de discussões fechadas."
 #: threads/permissions/privatethreads.py:226
 msgid "You have to be thread owner to add new participants to it."
 msgstr ""
-"Você precisa ser o dono da discussão para adicionar novos participantes "
-"nela."
+"Você precisa ser o dono da discussão para adicionar novos participantes nela."
 
 #: threads/permissions/privatethreads.py:231
 msgid "Only moderators can add participants to closed threads."
@@ -5979,13 +5884,13 @@ msgstr "Pode ver a lista de conteúdo não aprovado"
 msgid ""
 "Allows access to \"unapproved\" tab on threads lists for easy listing of "
 "threads that are unapproved or contain unapproved posts. Despite the tab "
-"being available on all threads lists, it will only display threads belonging"
-" to categories in which the user has permission to approve content."
+"being available on all threads lists, it will only display threads belonging "
+"to categories in which the user has permission to approve content."
 msgstr ""
 "Permitir acesso para a aba \"não apraovado\" nas listas de discussões para "
 "facilitar a listagem de discussões que não estão aprovadas ou contém "
-"publicações não aprovadas. Apesar da aba estar disponível em todas as listas"
-" de discussões, ela exibe apenas discussões pertencentes a categorias nas "
+"publicações não aprovadas. Apesar da aba estar disponível em todas as listas "
+"de discussões, ela exibe apenas discussões pertencentes a categorias nas "
 "quais o usuário possui permissão para aprovar conteúdo."
 
 #: threads/permissions/threads.py:87
@@ -6055,8 +5960,7 @@ msgstr "Tempo limte para editar discussões próprias, em minutos"
 
 #: threads/permissions/threads.py:134
 msgid "Enter 0 to don't limit time for editing own threads."
-msgstr ""
-"Coloque 0 para não limitar o tempo para edição de discussões próprias."
+msgstr "Coloque 0 para não limitar o tempo para edição de discussões próprias."
 
 #: threads/permissions/threads.py:139
 msgid "Can hide all threads"
@@ -6147,8 +6051,7 @@ msgstr "Pode curtir publicações"
 #: threads/permissions/threads.py:195
 msgid "Only users with this permission to see likes can like posts."
 msgstr ""
-"Apenas usuários com esta permissão pra ver curtidas podem curtir "
-"publicações."
+"Apenas usuários com esta permissão pra ver curtidas podem curtir publicações."
 
 #: threads/permissions/threads.py:199
 msgid "Can protect posts"
@@ -6259,8 +6162,7 @@ msgid_plural "You can't edit threads that are older than %(minutes)s minutes."
 msgstr[0] ""
 "Você não pode editar discussões que são mais antigas que %(minutes)s minuto."
 msgstr[1] ""
-"Você não pode editar discussões que são mais antigas que %(minutes)s "
-"minutos."
+"Você não pode editar discussões que são mais antigas que %(minutes)s minutos."
 
 #: threads/permissions/threads.py:612
 msgid "This category is closed. You can't edit threads in it."
@@ -6345,8 +6247,7 @@ msgid "You can't delete threads that are older than %(minutes)s minute."
 msgid_plural ""
 "You can't delete threads that are older than %(minutes)s minutes."
 msgstr[0] ""
-"Você não pode deletar discussões que são mais antigas que %(minutes)s "
-"minuto."
+"Você não pode deletar discussões que são mais antigas que %(minutes)s minuto."
 msgstr[1] ""
 "Você não pode deletar discussões que são mais antigas que %(minutes)s "
 "minutos."
@@ -6451,8 +6352,7 @@ msgstr "Esta publicação está protegida. Você não pode editá-la."
 msgid "You can't edit posts that are older than %(minutes)s minute."
 msgid_plural "You can't edit posts that are older than %(minutes)s minutes."
 msgstr[0] ""
-"Você não pode editar publicações que são mais antigas que %(minutes)s "
-"minuto."
+"Você não pode editar publicações que são mais antigas que %(minutes)s minuto."
 msgstr[1] ""
 "Você não pode editar publicações que são mais antigas que %(minutes)s "
 "minutos."
@@ -6514,8 +6414,7 @@ msgstr "Você não pode esconder publicações nesta categoria."
 
 #: threads/permissions/threads.py:971
 msgid "You can't hide other users posts in this category."
-msgstr ""
-"Você não pode esconder publicações de outros usuários nesta categoria."
+msgstr "Você não pode esconder publicações de outros usuários nesta categoria."
 
 #: threads/permissions/threads.py:975
 msgid "This post is protected. You can't hide it."
@@ -6661,8 +6560,7 @@ msgstr "Eventos não podem ser combinados."
 
 #: threads/permissions/threads.py:1149
 msgid "You can't merge posts the content you can't see."
-msgstr ""
-"Você não pode combinar publicações de conteúdos que você não pode ver."
+msgstr "Você não pode combinar publicações de conteúdos que você não pode ver."
 
 #: threads/permissions/threads.py:1154
 msgid "This category is closed. You can't merge posts in it."
@@ -7028,8 +6926,8 @@ msgstr[0] ""
 "O título da discussão precisa ter pelo menos %(limit_value)s caractere (ele "
 "possui %(show_value)s)."
 msgstr[1] ""
-"O título da discussão precisa ter pelo menos %(limit_value)s caracteres (ele"
-" possui %(show_value)s)."
+"O título da discussão precisa ter pelo menos %(limit_value)s caracteres (ele "
+"possui %(show_value)s)."
 
 #: threads/validators.py:63
 #, python-format
@@ -7106,8 +7004,7 @@ msgstr "Você precisa logar para ver a lista de discussões que você não leu."
 
 #: threads/viewmodels/threads.py:36
 msgid "You have to sign in to see list of threads with new replies."
-msgstr ""
-"Você precisa logar para ver a lista de discussões com novas respostas."
+msgstr "Você precisa logar para ver a lista de discussões com novas respostas."
 
 #: threads/viewmodels/threads.py:39
 msgid "You have to sign in to see list of threads you are subscribing."
@@ -7176,13 +7073,12 @@ msgstr "É administrador"
 #: users/admin/forms.py:78
 msgid ""
 "Designates whether the user can log into admin sites. If Django admin site "
-"is enabled, this user will need additional permissions assigned within it to"
-" admin Django modules."
+"is enabled, this user will need additional permissions assigned within it to "
+"admin Django modules."
 msgstr ""
 "Designa se o usuário pode logar em sites administrativos. Se o site "
 "administrativo do Django estiver habilitado, este usuário precisará de "
-"permissões adicionais atribuídas a ele para administrar os módulos do "
-"Django."
+"permissões adicionais atribuídas a ele para administrar os módulos do Django."
 
 #: users/admin/forms.py:84
 msgid "Is superuser"
@@ -7193,9 +7089,9 @@ msgid ""
 "Only administrators can access admin sites. In addition to admin site "
 "access, superadmins can also change other members admin levels."
 msgstr ""
-"Apenas administradores podem acessar sites administrativos. Além disso, para"
-" acessar sites administrativos, os super administradores podem também "
-"alterar os níveis administrativos de outros membros."
+"Apenas administradores podem acessar sites administrativos. Além disso, para "
+"acessar sites administrativos, os super administradores podem também alterar "
+"os níveis administrativos de outros membros."
 
 #: users/admin/forms.py:91
 msgid "Is active"
@@ -7206,8 +7102,8 @@ msgid ""
 "Designates whether this user should be treated as active. Turning this off "
 "is non-destructible way to remove user accounts."
 msgstr ""
-"Designa se este usuário deve ser tratado como um ativo. Desativar isto é uma"
-" forma não-destrutiva de remover contas de usuários."
+"Designa se este usuário deve ser tratado como um ativo. Desativar isto é uma "
+"forma não-destrutiva de remover contas de usuários."
 
 #: users/admin/forms.py:97 users/admin/forms.py:128 users/admin/forms.py:158
 msgid "Staff message"
@@ -7234,8 +7130,8 @@ msgid ""
 "Setting this to yes will stop user from changing his/her avatar, and will "
 "reset his/her avatar to procedurally generated one."
 msgstr ""
-"Definir isto irá proibir que o usuário altere seu avatar e também o resetará"
-" para o avatar gerado proceduralmente."
+"Definir isto irá proibir que o usuário altere seu avatar e também o resetará "
+"para o avatar gerado proceduralmente."
 
 #: users/admin/forms.py:119 users/admin/forms.py:150 users/admin/forms.py:457
 #: users/admin/forms.py:524
@@ -7364,8 +7260,8 @@ msgstr "Título de usuário"
 
 #: users/admin/forms.py:397
 msgid ""
-"Optional, singular version of rank name displayed by user names. For example"
-" \"GM\" or \"Dev\"."
+"Optional, singular version of rank name displayed by user names. For example "
+"\"GM\" or \"Dev\"."
 msgstr ""
 "Opcional, versão singular do nome do rank mostrado pelos nomes de usuários. "
 "Por exemplo \"GM\" ou \"DEV\"."
@@ -7375,8 +7271,8 @@ msgid ""
 "Optional description explaining function or status of members distincted "
 "with this rank."
 msgstr ""
-"Descrição opcional explicando a função ou estado de membros distinguidos com"
-" este rank."
+"Descrição opcional explicando a função ou estado de membros distinguidos com "
+"este rank."
 
 #: users/admin/forms.py:412
 msgid "User roles"
@@ -7402,8 +7298,8 @@ msgid ""
 "others through dedicated page on forum users list."
 msgstr ""
 "Selecionar esta opção fará os usuários com este rank serem facilmente "
-"percebidos por outros através de uma página dedicada na lista de usuários do"
-" fórum."
+"percebidos por outros através de uma página dedicada na lista de usuários do "
+"fórum."
 
 #: users/admin/forms.py:447
 msgid "This name collides with other rank."
@@ -7517,8 +7413,8 @@ msgstr "Nome de usuário ou emails"
 
 #: users/admin/forms.py:624
 msgid ""
-"Enter every item in new line. Duplicates will be ignored. This field is case"
-" insensitive. Depending on site configuration and amount of data to archive "
+"Enter every item in new line. Duplicates will be ignored. This field is case "
+"insensitive. Depending on site configuration and amount of data to archive "
 "it may take up to few days for requests to complete. E-mail will "
 "notification will be sent to every user once their download is ready."
 msgstr ""
@@ -7758,8 +7654,8 @@ msgid ""
 "Selected users have been disabled and queued for deletion together with "
 "their content."
 msgstr ""
-"Os usuários selecionados foram desativados e colocados na fila para exclusão"
-" junto com seus conteúdos."
+"Os usuários selecionados foram desativados e colocados na fila para exclusão "
+"junto com seus conteúdos."
 
 #: users/admin/views/users.py:255
 #, python-format
@@ -7771,26 +7667,21 @@ msgstr "O  novo usuário \"%(user)s\" acaba de se registrar"
 msgid "User \"%(user)s\" has been edited."
 msgstr "O usuário \"%(user)s\" foi editado."
 
-#: users/api/auth.py:42 users/api/auth.py:92 users/api/auth.py:130
-#: users/api/auth.py:174
-msgid "Please use the 3rd party site to authenticate."
-msgstr "Por favor, use o site de terceiros para se autenticar."
-
-#: users/api/auth.py:100
+#: users/api/auth.py:94
 #, python-format
 msgid "Activate %(user)s account on %(forum_name)s forums"
 msgstr "Ativar a conta do usuário %(user)s no fórum %(forum_name)s"
 
-#: users/api/auth.py:138
+#: users/api/auth.py:129
 #, python-format
 msgid "Change %(user)s password on %(forum_name)s forums"
 msgstr "Alterar a senha do usuário %(user)s no fórum %(forum_name)s"
 
-#: users/api/auth.py:176
+#: users/api/auth.py:164
 msgid "Form link is invalid. Please try again."
 msgstr "O link do formulário está inválido. Por favor, tente novamente."
 
-#: users/api/auth.py:177
+#: users/api/auth.py:165
 msgid "Your link has expired. Please request new one."
 msgstr "Seu link expirou. Por favor, solicite um novo."
 
@@ -7897,86 +7788,65 @@ msgstr ""
 msgid "You have to sign in to perform this action."
 msgstr "Você precisa logar para realizar esta ação."
 
-#: users/api/users.py:90
-msgid "Please use the 3rd party site to register."
-msgstr "Por favor, use o site de terceiros para se registrar."
-
-#: users/api/users.py:113
+#: users/api/users.py:110
 msgid "You can't change other users avatars."
 msgstr "Você não pode alterar o avatar de outros usuários."
 
-#: users/api/users.py:125
+#: users/api/users.py:122
 msgid "You can't change other users options."
 msgstr "Você não pode alterar as opções de outros usuários."
 
-#: users/api/users.py:130
+#: users/api/users.py:127
 msgid "Your forum options have been changed."
 msgstr "Suas opções do fórum foram alteradas."
 
-#: users/api/users.py:137
-msgid "Please use the 3rd party site to change your username."
-msgstr ""
-"Por favor, use o site de terceiros para alterar o seu nome de usuário."
-
-#: users/api/users.py:141
+#: users/api/users.py:133
 msgid "You can't change other users names."
 msgstr "Você não pode alterar outros nomes de usuários."
 
-#: users/api/users.py:148
+#: users/api/users.py:140
 msgid "You can't change other users signatures."
 msgstr "Você não pode alterar assinaturas de outros usuários."
 
-#: users/api/users.py:161
-msgid "Please use the 3rd party site to change your password."
-msgstr "Por favor, use o site de terceiros para alterar sua senha."
-
-#: users/api/users.py:165
+#: users/api/users.py:152
 msgid "You can't change other users passwords."
 msgstr "Você não pode alterar a senha de outros usuários."
 
-#: users/api/users.py:175
-msgid "Please use the 3rd party site to change your e-mail."
-msgstr "Por favor, use o site de terceiros para alterar seu e-mail."
-
-#: users/api/users.py:180
+#: users/api/users.py:162
 msgid "You can't change other users e-mail addresses."
 msgstr "Você não pode alterar o endereço de e-mail de outros usuários."
 
-#: users/api/users.py:211
-msgid "Please use the 3rd party site to delete account."
-msgstr "Por favor, use o site de terceiros para deletar a conta."
-
-#: users/api/users.py:292
+#: users/api/users.py:269
 msgid "You can't request data downloads for other users."
 msgstr "Você não pode solicitar download de dados de outros usuários."
 
-#: users/api/users.py:296
+#: users/api/users.py:273
 msgid "You can't download your data."
 msgstr "Você não pode baixar seus dados."
 
-#: users/api/users.py:301
+#: users/api/users.py:278
 msgid "You can't have more than one data download request at a single time."
 msgstr ""
 "Você não pode ter mais que uma solicitação de download de dados ao mesmo "
 "tempo."
 
-#: users/api/users.py:358
+#: users/api/users.py:335
 msgid "You can't see other users data downloads."
 msgstr "Você não pode ver os dados de download de outros usuários."
 
-#: users/apps.py:33
+#: users/apps.py:30
 msgid "Edit details"
 msgstr "Editar detalhes"
 
-#: users/apps.py:39
+#: users/apps.py:36
 msgid "Change username"
 msgstr "Alterar nome de usuário"
 
-#: users/apps.py:46
+#: users/apps.py:42
 msgid "Change email or password"
 msgstr "Alterar email ou senha"
 
-#: users/apps.py:71
+#: users/apps.py:63
 msgid "Delete account"
 msgstr "Deletar conta"
 
@@ -8058,7 +7928,7 @@ msgstr "O endereço de e-mail inserido é inválido."
 msgid "No user with this e-mail exists."
 msgstr "Nenhum usuário com este e-mail existe."
 
-#: users/forms/auth.py:150 users/views/activation.py:51
+#: users/forms/auth.py:150 users/views/activation.py:46
 #, python-format
 msgid "%(user)s, your account is already active."
 msgstr "%(user)s, sua conta já está ativa."
@@ -8073,8 +7943,7 @@ msgid ""
 "You have to activate your account before you will be able to request new "
 "password."
 msgstr ""
-"Você precisa ativar sua conta antes de ser capaz de solicitar uma nova "
-"senha."
+"Você precisa ativar sua conta antes de ser capaz de solicitar uma nova senha."
 
 #: users/forms/auth.py:169
 msgid ""
@@ -8084,6 +7953,14 @@ msgstr ""
 "O administrador precisa ativar sua conta antes de você ser capaz de "
 "solicitar uma nova senha."
 
+#: users/forms/register.py:34 users/validators.py:80
+msgid "This username is not allowed."
+msgstr "Este nome de usuário não está permitido."
+
+#: users/forms/register.py:45 users/validators.py:52
+msgid "This e-mail address is not allowed."
+msgstr "Este endereço de e-mail não é permitido."
+
 #: users/forms/register.py:51
 msgid "This agreement is required."
 msgstr "Este acordo é obrigatório."
@@ -8176,8 +8053,8 @@ msgid ""
 "Designates whether this user should be treated as active. Unselect this "
 "instead of deleting accounts."
 msgstr ""
-"Designa se este usuário deve ser tratado como ativo. Desmarque isso ao invés"
-" de deletar contas."
+"Designa se este usuário deve ser tratado como ativo. Desmarque isso ao invés "
+"de deletar contas."
 
 #: users/permissions/account.py:10
 msgid "Account settings"
@@ -8387,8 +8264,7 @@ msgstr "Você não pode retirar banimentos permanentes."
 #: users/permissions/moderation.py:178
 #, python-format
 msgid "You can't lift bans that expire after %(expiration)s."
-msgstr ""
-"Você não pode retirar banimentos que expiram depois de %(expiration)s."
+msgstr "Você não pode retirar banimentos que expiram depois de %(expiration)s."
 
 #: users/permissions/profiles.py:23
 msgid "Can browse users list"
@@ -8409,8 +8285,8 @@ msgstr "Pode ver detalhes de banimento de membros"
 #: users/permissions/profiles.py:29
 msgid "Allows users with this permission to see user and staff ban messages."
 msgstr ""
-"Permite usuários com esta permissão ver as mensagens de banimento do usuário"
-" e da equipe."
+"Permite usuários com esta permissão ver as mensagens de banimento do usuário "
+"e da equipe."
 
 #: users/permissions/profiles.py:35
 msgid "User profiles"
@@ -8498,13 +8374,13 @@ msgstr "Website"
 
 #: users/profilefields/default.py:41
 msgid ""
-"If you own website in the internet you wish to share on your profile you may"
-" enter its address here. Remember to for it to be valid http address "
-"starting with either \"http://\" or \"https://\"."
+"If you own website in the internet you wish to share on your profile you may "
+"enter its address here. Remember to for it to be valid http address starting "
+"with either \"http://\" or \"https://\"."
 msgstr ""
 "Se você possui um website na internet e deseja compartilhar em seu perfil "
-"você pode colocar o endereço dele qui. Lembre-se de colocar um endereço http"
-" válido começando com \"http://\" ou \"https://''."
+"você pode colocar o endereço dele qui. Lembre-se de colocar um endereço http "
+"válido começando com \"http://\" ou \"https://''."
 
 #: users/profilefields/default.py:49
 msgid "Skype ID"
@@ -8515,8 +8391,8 @@ msgid ""
 "Entering your Skype ID in this field may invite other users to contact you "
 "over the Skype instead of via private threads."
 msgstr ""
-"Colocar seu ID do Skype neste campo pode convidar outros usuários a contatar"
-" você pelo skype ao invés de discussões privadas."
+"Colocar seu ID do Skype neste campo pode convidar outros usuários a contatar "
+"você pelo skype ao invés de discussões privadas."
 
 #: users/profilefields/default.py:58
 msgid "Twitter handle"
@@ -8525,9 +8401,9 @@ msgstr "Nome de usuário do Twitter"
 #: users/profilefields/default.py:62
 #, python-format
 msgid ""
-"If you own Twitter account, here you may enter your Twitter handle for other"
-" users to find you. Starting your handle with \"@\" sign is optional. Either"
-" \"@%(slug)s\" or \"%(slug)s\" are valid values."
+"If you own Twitter account, here you may enter your Twitter handle for other "
+"users to find you. Starting your handle with \"@\" sign is optional. Either "
+"\"@%(slug)s\" or \"%(slug)s\" are valid values."
 msgstr ""
 "Se você possuir uma conta no Twitter, aqui você pode colocar seu nome de "
 "usuário do Twitter para outros usuários te encontrarem. Começar seu nome de "
@@ -8617,8 +8493,7 @@ msgstr ""
 #, python-format
 msgid "Username must be at least %(limit_value)s character long."
 msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] ""
-"O nome de usuário precisa ter pelo menos %(limit_value)s caractere."
+msgstr[0] "O nome de usuário precisa ter pelo menos %(limit_value)s caractere."
 msgstr[1] ""
 "O nome de usuário precisa ter pelo menos %(limit_value)s caracteres."
 
@@ -8627,8 +8502,7 @@ msgstr[1] ""
 msgid "Username cannot be longer than %(limit_value)s characters."
 msgid_plural "Username cannot be longer than %(limit_value)s characters."
 msgstr[0] "O nome de usuário não pode ter mais que %(limit_value)s caractere."
-msgstr[1] ""
-"O nome de usuário não pode ter mais que %(limit_value)s caracteres."
+msgstr[1] "O nome de usuário não pode ter mais que %(limit_value)s caracteres."
 
 #: users/validators.py:137
 msgid "Data entered was found in spammers database."
@@ -8638,11 +8512,7 @@ msgstr "Os dados inseridos foram encontrados no banco de dados de spammers."
 msgid "This email is not allowed."
 msgstr "Este email não está permitido."
 
-#: users/views/activation.py:21
-msgid "Please use the 3rd party site to activate your account."
-msgstr "Por favor, use o site de terceiros para ativar sua conta."
-
-#: users/views/activation.py:56
+#: users/views/activation.py:51
 #, python-format
 msgid ""
 "%(user)s, your activation link is invalid. Try again or request new "
@@ -8651,40 +8521,31 @@ msgstr ""
 "%(user)s, seu link de ativação é inválido. Tente novamente ou solicite um "
 "novo link de ativação."
 
-#: users/views/activation.py:74
+#: users/views/activation.py:69
 #, python-format
 msgid "%(user)s, your account has been activated!"
 msgstr "%(user)s, sua conta foi ativada!"
 
-#: users/views/forgottenpassword.py:18 users/views/options.py:70
-msgid "Please use the 3rd party site to change password."
-msgstr "Por favor, use o site de terceiros para alterar a senha."
-
-#: users/views/forgottenpassword.py:45
+#: users/views/forgottenpassword.py:31
 #, python-format
-msgid ""
-"%(user)s, your link has expired. Please request new link and try again."
+msgid "%(user)s, your link has expired. Please request new link and try again."
 msgstr ""
 "%(user)s, seu link expirou. Por favor, solicite um novo link e tente "
 "novamente."
 
-#: users/views/forgottenpassword.py:52
+#: users/views/forgottenpassword.py:38
 #, python-format
 msgid "%(user)s, your link is invalid. Please try again or request new link."
 msgstr ""
 "%(user)s, seu link é inválido. Por favor, tente novamente ou solicite um "
 "novo link."
 
-#: users/views/options.py:47
-msgid "Please use the 3rd party site to change e-mail."
-msgstr "Por favor, use o site de terceiros para altera p e-mail."
-
-#: users/views/options.py:59
+#: users/views/options.py:56
 #, python-format
 msgid "%(user)s, your e-mail has been changed."
 msgstr "%(user)s, seu e-mail foi alterado."
 
-#: users/views/options.py:80
+#: users/views/options.py:74
 #, python-format
 msgid "%(user)s, your password has been changed."
 msgstr "%(user)s, sua senha foi alterada."

BIN
misago/locale/pt_BR/LC_MESSAGES/djangojs.mo


+ 107 - 117
misago/locale/pt_BR/LC_MESSAGES/djangojs.po

@@ -2,7 +2,7 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # Kassio Cruz <kassiocs16@gmail.com>, 2017
 # Lucas Ferraz <ls.ferraz@outlook.com>, 2017
@@ -11,21 +11,23 @@
 # Nicolas Abril <nicolas.abril@gmail.com>, 2018
 # Kyodhan Hyakuya <Kyodhan@gmail.com>, 2019
 # Luk3 Masters <luk3@hotmail.com.br>, 2021
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Luk3 Masters <luk3@hotmail.com.br>, 2021\n"
-"Language-Team: Portuguese (Brazil) (https://www.transifex.com/misago/teams/65369/pt_BR/)\n"
+"Language-Team: Portuguese (Brazil) (https://www.transifex.com/misago/"
+"teams/65369/pt_BR/)\n"
+"Language: pt_BR\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: pt_BR\n"
-"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % "
+"1000000 == 0 ? 1 : 2;\n"
 
 #: static/misago/admin/index.js:16
 msgid "defineLocaleOverride"
@@ -48,8 +50,8 @@ msgid ""
 "Declining will result in immediate deactivation and deletion of your "
 "account. This action is not reversible."
 msgstr ""
-"Recusar resultará na desativação e exclusão imediata da sua conta. Esta ação"
-" não pode ser revertida."
+"Recusar resultará na desativação e exclusão imediata da sua conta. Esta ação "
+"não pode ser revertida."
 
 #: static/misago/js/misago.js:1
 msgid "Decline"
@@ -150,8 +152,7 @@ msgstr "Esta categoria está vazia. Nenhuma discussão foi publicada até agora.
 #: static/misago/js/misago.js:1
 msgid "This category is private. You can see only your own threads within it."
 msgstr ""
-"Esta categoria é privada. Você pode ver apenas suas próprias discussões "
-"nela."
+"Esta categoria é privada. Você pode ver apenas suas próprias discussões nela."
 
 #: static/misago/js/misago.js:1
 msgid "This category is protected. You can't browse its contents."
@@ -393,8 +394,8 @@ msgstr "Melhor resposta"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Please select the best answer for your newly merged thread. No posts will be"
-" deleted during the merge."
+"Please select the best answer for your newly merged thread. No posts will be "
+"deleted during the merge."
 msgstr ""
 "Por favor, selecione a melhor resposta para sua nova discussão combinada. "
 "Nenhuma publicação será deletada durante a combinação."
@@ -468,8 +469,7 @@ msgid "Used changes become available again after %(name_changes_expire)s day."
 msgid_plural ""
 "Used changes become available again after %(name_changes_expire)s days."
 msgstr[0] ""
-"Alterações utilizadas se tornam disponíveis após %(name_changes_expire)s "
-"dia."
+"Alterações utilizadas se tornam disponíveis após %(name_changes_expire)s dia."
 msgstr[1] ""
 "Alterações utilizadas se tornam disponíveis após %(name_changes_expire)s "
 "dias."
@@ -503,8 +503,8 @@ msgstr "Deletar conta"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You are going to delete your account. This action is nonreversible, and will"
-" result in following data being deleted:"
+"You are going to delete your account. This action is nonreversible, and will "
+"result in following data being deleted:"
 msgstr ""
 "Você vai deletar a sua conta. Esta ação é irreversível e resultará na "
 "exclusão dos dados a seguir:"
@@ -531,8 +531,8 @@ msgstr "Seu e-mail ficará disponível para uso em um novo registro de conta."
 
 #: static/misago/js/misago.js:1
 msgid ""
-"All your posted content will NOT be deleted, but username associated with it"
-" will be changed to one shared by all deleted accounts."
+"All your posted content will NOT be deleted, but username associated with it "
+"will be changed to one shared by all deleted accounts."
 msgstr ""
 "Todo seu conteúdo publicado NÃO será excluído, mas o nome de usuário "
 "assciado com ele será mudado para um nome compartilhado por todas as contas "
@@ -558,12 +558,12 @@ msgid ""
 "your download to be prepared. An e-mail with notification will be sent to "
 "you when your data is ready to be downloaded."
 msgstr ""
-"Para baixar seus dados do site, clique no botão \"Baixar dados\". Dependendo"
-" da quantidade de dados a serem arquivados e o número de usuários "
-"solicitando download de seus respectivos dados ao mesmo tempo pode fazer com"
-" que leve alguns dias para que seu download fique preparado. Um e-mail com a"
-" notificação será enviado para você quando seus dados estiverem prontos para"
-" serem baixados."
+"Para baixar seus dados do site, clique no botão \"Baixar dados\". Dependendo "
+"da quantidade de dados a serem arquivados e o número de usuários solicitando "
+"download de seus respectivos dados ao mesmo tempo pode fazer com que leve "
+"alguns dias para que seu download fique preparado. Um e-mail com a "
+"notificação será enviado para você quando seus dados estiverem prontos para "
+"serem baixados."
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -738,6 +738,10 @@ msgid "Change forgotten password"
 msgstr "Alterar senha esquecida"
 
 #: static/misago/js/misago.js:1
+msgid "%(user)s has been made new thread owner."
+msgstr "%(user)s é o novo dono da discussão."
+
+#: static/misago/js/misago.js:1
 msgid "You have left this thread."
 msgstr "Você deixou esta discussão."
 
@@ -746,10 +750,6 @@ msgid "%(user)s has been removed from this thread."
 msgstr "%(user)s foi removido desta discussão."
 
 #: static/misago/js/misago.js:1
-msgid "%(user)s has been made new thread owner."
-msgstr "%(user)s é o novo dono da discussão."
-
-#: static/misago/js/misago.js:1
 msgid "See profile"
 msgstr "Ver perfil"
 
@@ -899,8 +899,8 @@ msgid ""
 "for all polls."
 msgstr ""
 "Tornar a votação pública permite que todos acessem uma lista detalhada de "
-"votos, mostrando quais usuários votaram para quais escolhas e quantas vezes."
-" Esta opção não pode ser alterada depois da criação da votação. Moderadores "
+"votos, mostrando quais usuários votaram para quais escolhas e quantas vezes. "
+"Esta opção não pode ser alterada depois da criação da votação. Moderadores "
 "podem ver os detalhes da votação para todas as votações."
 
 #: static/misago/js/misago.js:1
@@ -1020,8 +1020,7 @@ msgstr "Reverter"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you with to revert this post to the state from before this "
-"edit?"
+"Are you sure you with to revert this post to the state from before this edit?"
 msgstr ""
 "Você tem certeza que deseja reverter esta publicação para o estado anterior "
 "a esta edição?"
@@ -1052,8 +1051,7 @@ msgstr "O conteúdo da publicação não pôde ser mostrada."
 
 #: static/misago/js/misago.js:1
 msgid "This error is caused by invalid post content manipulation."
-msgstr ""
-"Este erro é causado por manipulação inválida do conteúdo da publicação"
+msgstr "Este erro é causado por manipulação inválida do conteúdo da publicação"
 
 #: static/misago/js/misago.js:1
 msgid "posted %(posted_on)s"
@@ -1181,11 +1179,11 @@ msgstr[0] ""
 "O título da discussão deve ter pelo menos %(limit_value)s caractere (possui "
 "%(show_value)s)."
 msgstr[1] ""
-"O título da discussão deve ter pelo menos %(limit_value)s caracteres (possui"
-" %(show_value)s)."
+"O título da discussão deve ter pelo menos %(limit_value)s caracteres (possui "
+"%(show_value)s)."
 msgstr[2] ""
-"O título da discussão deve ter pelo menos %(limit_value)s caracteres (possui"
-" %(show_value)s)."
+"O título da discussão deve ter pelo menos %(limit_value)s caracteres (possui "
+"%(show_value)s)."
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -1215,11 +1213,11 @@ msgstr[0] ""
 "Mensagens publicadas devem ter pelo menos %(limit_value)s caractere (possui "
 "%(show_value)s)."
 msgstr[1] ""
-"Mensagens publicadas devem ter pelo menos %(limit_value)s caracteres (possui"
-" %(show_value)s)."
+"Mensagens publicadas devem ter pelo menos %(limit_value)s caracteres (possui "
+"%(show_value)s)."
 msgstr[2] ""
-"Mensagens publicadas devem ter pelo menos %(limit_value)s caracteres (possui"
-" %(show_value)s)."
+"Mensagens publicadas devem ter pelo menos %(limit_value)s caracteres (possui "
+"%(show_value)s)."
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -1464,22 +1462,22 @@ msgstr "Marcado como melhor resposta por %(marked_by)s às %(marked_on)s."
 #: static/misago/js/misago.js:1
 msgid "This post is hidden. Only users with permission may see its contents."
 msgstr ""
-"Esta publicação está escondida. Apenas usuários com permissão podem ver seus"
-" conteúdos."
+"Esta publicação está escondida. Apenas usuários com permissão podem ver seus "
+"conteúdos."
+
+#: static/misago/js/misago.js:1
+msgid "This post is protected. Only moderators may change it."
+msgstr "Esta publicação está protegida. Apenas moderadores podem alterá-la."
 
 #: static/misago/js/misago.js:1
 msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
 "A publicação não está aprovada. Apenas usuários com permissão para aprovar "
 "publicações e seu autor podem ver seus conteúdos."
 
 #: static/misago/js/misago.js:1
-msgid "This post is protected. Only moderators may change it."
-msgstr "Esta publicação está protegida. Apenas moderadores podem alterá-la."
-
-#: static/misago/js/misago.js:1
 msgid "Liked"
 msgstr "Curtido"
 
@@ -1581,36 +1579,6 @@ msgid "%(username)s's details have been updated."
 msgstr "Os detalhes do usuário %(username)s foram atualizados."
 
 #: static/misago/js/misago.js:1
-msgid "You have no started threads."
-msgstr "Você não tem nenhuma discussão iniciada."
-
-#: static/misago/js/misago.js:1
-msgid "%(username)s started no threads."
-msgstr "O usuário %(username)s não iniciou nenhuma discussão."
-
-#: static/misago/js/misago.js:1
-msgid "You have started %(threads)s thread."
-msgid_plural "You have started %(threads)s threads."
-msgstr[0] "Você já iniciou %(threads)s discussão."
-msgstr[1] "Você  já iniciou %(threads)s discussões."
-msgstr[2] "Você  já iniciou %(threads)s discussões."
-
-#: static/misago/js/misago.js:1
-msgid "%(username)s has started %(threads)s thread."
-msgid_plural "%(username)s has started %(threads)s threads."
-msgstr[0] "O usuário %(username)s já iniciou %(threads)s discussão."
-msgstr[1] "O usuário %(username)s  já iniciou %(threads)s discussões."
-msgstr[2] "O usuário %(username)s  já iniciou %(threads)s discussões."
-
-#: static/misago/js/misago.js:1
-msgid "Loading..."
-msgstr "Carregando..."
-
-#: static/misago/js/misago.js:1
-msgid "Threads"
-msgstr "Discussões"
-
-#: static/misago/js/misago.js:1
 msgid "You have posted no messages."
 msgstr "Você não publicou nenhuma mensagem."
 
@@ -1633,10 +1601,40 @@ msgstr[1] "O usuário %(username)s já publicou %(posts)s mensagens."
 msgstr[2] "O usuário %(username)s já publicou %(posts)s mensagens."
 
 #: static/misago/js/misago.js:1
+msgid "Loading..."
+msgstr "Carregando..."
+
+#: static/misago/js/misago.js:1
 msgid "Posts"
 msgstr "Publicações"
 
 #: static/misago/js/misago.js:1
+msgid "You have no started threads."
+msgstr "Você não tem nenhuma discussão iniciada."
+
+#: static/misago/js/misago.js:1
+msgid "%(username)s started no threads."
+msgstr "O usuário %(username)s não iniciou nenhuma discussão."
+
+#: static/misago/js/misago.js:1
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
+msgstr[0] "Você já iniciou %(threads)s discussão."
+msgstr[1] "Você  já iniciou %(threads)s discussões."
+msgstr[2] "Você  já iniciou %(threads)s discussões."
+
+#: static/misago/js/misago.js:1
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
+msgstr[0] "O usuário %(username)s já iniciou %(threads)s discussão."
+msgstr[1] "O usuário %(username)s  já iniciou %(threads)s discussões."
+msgstr[2] "O usuário %(username)s  já iniciou %(threads)s discussões."
+
+#: static/misago/js/misago.js:1
+msgid "Threads"
+msgstr "Discussões"
+
+#: static/misago/js/misago.js:1
 msgid "Show older activity"
 msgstr "Mostrar ativiadades antigas"
 
@@ -1778,8 +1776,8 @@ msgid ""
 "Optional message for user explaining why he/she is prohibited form changing "
 "avatar."
 msgstr ""
-"Mensagem opcional explicando o motivo do usuário estar proibido de mudar seu"
-" próprio avatar."
+"Mensagem opcional explicando o motivo do usuário estar proibido de mudar seu "
+"próprio avatar."
 
 #: static/misago/js/misago.js:1
 msgid "Staff message"
@@ -1864,8 +1862,7 @@ msgstr[2] "Seu nome de usuário foi alterado %(changes)s vezes."
 #: static/misago/js/misago.js:1
 msgid "%(username)s's username was changed %(changes)s time."
 msgid_plural "%(username)s's username was changed %(changes)s times."
-msgstr[0] ""
-"O usuário %(username)s alterou seu nome de usuário %(changes)s vez."
+msgstr[0] "O usuário %(username)s alterou seu nome de usuário %(changes)s vez."
 msgstr[1] ""
 "O usuário %(username)s alterou seu nome de usuário %(changes)s vezes."
 msgstr[2] ""
@@ -1874,8 +1871,8 @@ msgstr[2] ""
 #: static/misago/js/misago.js:1
 msgid "Search returned no username changes matching specified criteria."
 msgstr ""
-"A busca não encontrou nenhuma alteração de nome de usuário correspondente ao"
-" critério especificado."
+"A busca não encontrou nenhuma alteração de nome de usuário correspondente ao "
+"critério especificado."
 
 #: static/misago/js/misago.js:1
 msgid "No name changes have been recorded for your account."
@@ -1946,8 +1943,8 @@ msgid ""
 "%(username)s, your account has been created but board administrator will "
 "have to activate it before you will be able to sign in."
 msgstr ""
-"%(username)s, sua conta foi criada, mas um administrador do conselho precisa"
-" ativar ela antes de você poder se conectar."
+"%(username)s, sua conta foi criada, mas um administrador do conselho precisa "
+"ativar ela antes de você poder se conectar."
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -2132,8 +2129,7 @@ msgstr "Última resposta por %(user)s às %(date)s"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you want to merge selected posts? This action is not "
-"reversible!"
+"Are you sure you want to merge selected posts? This action is not reversible!"
 msgstr ""
 "Você tem certeza que deseja combinar as publicações selecionadas? Esta ação "
 "não é reversível!"
@@ -2489,8 +2485,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You need permission to start threads in category to be able to merge threads"
-" to it."
+"You need permission to start threads in category to be able to merge threads "
+"to it."
 msgstr ""
 "Você precisa de permissão para iniciar discussões na categoria para que "
 "possa combinar discussões nela."
@@ -2761,31 +2757,19 @@ msgid "You are banned"
 msgstr "Você está banido"
 
 #: static/misago/js/misago.js:1
-msgid "You have to accept the terms of service."
-msgstr "Você precisa aceitar os termos de serviço."
+msgid "Valid password must be at least %(limit_value)s character long."
+msgid_plural "Valid password must be at least %(limit_value)s characters long."
+msgstr[0] "Uma senha válida precisa ter pelo menos %(limit_value)s caractere."
+msgstr[1] "Uma senha válida precisa ter pelo menos %(limit_value)s caracteres."
+msgstr[2] "Uma senha válida precisa ter pelo menos %(limit_value)s caracteres."
 
 #: static/misago/js/misago.js:1
 msgid "You have to accept the privacy policy."
 msgstr "Você precisa aceitar os termos de privacidade."
 
 #: static/misago/js/misago.js:1
-msgid "Username must be at least %(limit_value)s character long."
-msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] ""
-"O nome de usuário precisa ter pelo menos %(limit_value)s caractere."
-msgstr[1] ""
-"O nome de usuário precisa ter pelo menos %(limit_value)s caracteres."
-msgstr[2] ""
-"O nome de usuário precisa ter pelo menos %(limit_value)s caracteres."
-
-#: static/misago/js/misago.js:1
-msgid "Username cannot be longer than %(limit_value)s character."
-msgid_plural "Username cannot be longer than %(limit_value)s characters."
-msgstr[0] "O nome de usuário não pode ter mais que %(limit_value)s caractere."
-msgstr[1] ""
-"O nome de usuário não pode ter mais que %(limit_value)s caracteres."
-msgstr[2] ""
-"O nome de usuário não pode ter mais que %(limit_value)s caracteres."
+msgid "You have to accept the terms of service."
+msgstr "Você precisa aceitar os termos de serviço."
 
 #: static/misago/js/misago.js:1
 msgid "Username can only contain latin alphabet letters and digits."
@@ -2793,14 +2777,20 @@ msgstr ""
 "O nome de usuário pode conter apenas letras e dígitos do alfabeto latino."
 
 #: static/misago/js/misago.js:1
-msgid "Valid password must be at least %(limit_value)s character long."
-msgid_plural ""
-"Valid password must be at least %(limit_value)s characters long."
-msgstr[0] "Uma senha válida precisa ter pelo menos %(limit_value)s caractere."
+msgid "Username cannot be longer than %(limit_value)s character."
+msgid_plural "Username cannot be longer than %(limit_value)s characters."
+msgstr[0] "O nome de usuário não pode ter mais que %(limit_value)s caractere."
+msgstr[1] "O nome de usuário não pode ter mais que %(limit_value)s caracteres."
+msgstr[2] "O nome de usuário não pode ter mais que %(limit_value)s caracteres."
+
+#: static/misago/js/misago.js:1
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
+msgstr[0] "O nome de usuário precisa ter pelo menos %(limit_value)s caractere."
 msgstr[1] ""
-"Uma senha válida precisa ter pelo menos %(limit_value)s caracteres."
+"O nome de usuário precisa ter pelo menos %(limit_value)s caracteres."
 msgstr[2] ""
-"Uma senha válida precisa ter pelo menos %(limit_value)s caracteres."
+"O nome de usuário precisa ter pelo menos %(limit_value)s caracteres."
 
 #: static/misago/js/misago.js:1
 msgid "This field is required."

BIN
misago/locale/ru/LC_MESSAGES/django.mo


+ 212 - 328
misago/locale/ru/LC_MESSAGES/django.po

@@ -2,28 +2,30 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # Filipp Zhuravlev <shiningfinger@list.ru>, 2017
 # musindmitriy <dmitry.musin@phystech.edu>, 2017
 # Ivan Khomutov <iskhomutov@gmail.com>, 2017
 # Katrin Kutepova <blackkatelv@gmail.com>, 2018
 # alff0x1f <alff3one@gmail.com>, 2018
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-13 18:22+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: alff0x1f <alff3one@gmail.com>, 2018\n"
 "Language-Team: Russian (https://www.transifex.com/misago/teams/65369/ru/)\n"
+"Language: ru\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: ru\n"
-"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
+"%100>=11 && n%100<=14)? 2 : 3);\n"
 
 #: acl/admin/__init__.py:24 templates/misago/acl_debug.html:16
 #: templates/misago/admin/ranks/form.html:58
@@ -219,7 +221,7 @@ msgstr ""
 "Только пользователи с соответствующими правами могут оставлять сообщения в "
 "закрытых категориях."
 
-#: categories/admin/forms.py:70 conf/admin/__init__.py:93
+#: categories/admin/forms.py:70 conf/admin/__init__.py:79
 #: templates/misago/admin/categories/list.html:19
 #: templates/misago/admin/dashboard/totals.html:19
 #: templates/misago/navbar.html:20 templates/misago/navbar.html:36
@@ -233,7 +235,7 @@ msgstr ""
 #: templates/misago/threadslist/threads.html:42
 #: templates/misago/threadslist/threads.html:66
 #: threads/permissions/threads.py:73 threads/permissions/threads.py:104
-#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:106
+#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:97
 msgid "Threads"
 msgstr "Темы"
 
@@ -267,8 +269,8 @@ msgstr "Возраст темы"
 
 #: categories/admin/forms.py:95
 msgid ""
-"Prune thread if number of days since its creation is greater than specified."
-" Enter 0 to disable this pruning criteria."
+"Prune thread if number of days since its creation is greater than specified. "
+"Enter 0 to disable this pruning criteria."
 msgstr ""
 "Удалять темы старше заданного количества дней. Установите значение, равное "
 "0, чтобы отключить этот критерий."
@@ -319,8 +321,7 @@ msgstr "Архив"
 
 #: categories/admin/forms.py:173
 msgid ""
-"Instead of being deleted, pruned threads can be moved to designated "
-"category."
+"Instead of being deleted, pruned threads can be moved to designated category."
 msgstr ""
 "Вместо безвозвратного удаления, удаляемые темы могут быть перемещены в "
 "соответствующую категорию."
@@ -354,8 +355,7 @@ msgid "Move child categories to"
 msgstr "Переместить дочерние категории в"
 
 #: categories/admin/forms.py:249 categories/admin/forms.py:264
-#: templates/misago/acl_debug.html:15
-#: templates/misago/admin/roles/list.html:16
+#: templates/misago/acl_debug.html:15 templates/misago/admin/roles/list.html:16
 msgid "Role"
 msgstr "Роль"
 
@@ -465,20 +465,20 @@ msgstr "Можно смотреть содержимое категории"
 msgid "You don't have permission to browse \"%(category)s\" contents."
 msgstr "У вас нет разрешения просматривать содержимое \"%(category)s\"."
 
-#: conf/admin/__init__.py:45 templates/misago/admin/conf/index.html:5
+#: conf/admin/__init__.py:41 templates/misago/admin/conf/index.html:5
 #: templates/misago/admin/themes/form.html:48
 msgid "Settings"
 msgstr "Настройки"
 
-#: conf/admin/__init__.py:52 templates/misago/admin/socialauth/form.html:27
+#: conf/admin/__init__.py:48 templates/misago/admin/socialauth/form.html:27
 msgid "General"
 msgstr "Общее"
 
-#: conf/admin/__init__.py:53
+#: conf/admin/__init__.py:49
 msgid "Change forum details like name, description or footer."
 msgstr ""
 
-#: conf/admin/__init__.py:58 templates/misago/admin/dashboard/totals.html:7
+#: conf/admin/__init__.py:54 templates/misago/admin/dashboard/totals.html:7
 #: templates/misago/admin/users/ban.html:22 templates/misago/navbar.html:42
 #: templates/misago/userslists/base.html:5
 #: templates/misago/userslists/base.html:14 users/admin/__init__.py:74
@@ -486,38 +486,28 @@ msgstr ""
 msgid "Users"
 msgstr "Пользователи"
 
-#: conf/admin/__init__.py:60
+#: conf/admin/__init__.py:56
 msgid "Customize user accounts default behavior and features availability."
 msgstr ""
 
-#: conf/admin/__init__.py:67
+#: conf/admin/__init__.py:63
 msgid "Captcha"
 msgstr ""
 
-#: conf/admin/__init__.py:69
+#: conf/admin/__init__.py:65
 msgid "Setup protection against automatic registrations on the site."
 msgstr ""
 
-#: conf/admin/__init__.py:76
-msgid "Single Sign-On"
-msgstr ""
-
-#: conf/admin/__init__.py:78
-msgid ""
-"SSO enables you to delegate user login and registration from Misago tothe "
-"third party site."
-msgstr ""
-
-#: conf/admin/__init__.py:86 templates/misago/admin/dashboard/analytics.html:7
+#: conf/admin/__init__.py:72 templates/misago/admin/dashboard/analytics.html:7
 #: templates/misago/admin/dashboard/index.html:40
 msgid "Analytics"
 msgstr ""
 
-#: conf/admin/__init__.py:87
+#: conf/admin/__init__.py:73
 msgid "Enable Google Analytics or setup Google Site Verification."
 msgstr ""
 
-#: conf/admin/__init__.py:94
+#: conf/admin/__init__.py:80
 msgid "Threads, posts, polls and attachments options."
 msgstr ""
 
@@ -537,8 +527,8 @@ msgstr ""
 
 #: conf/admin/forms/analytics.py:27
 msgid ""
-"This token was extracted from uploaded site verification file. To change it,"
-" upload new verification file."
+"This token was extracted from uploaded site verification file. To change it, "
+"upload new verification file."
 msgstr ""
 
 #: conf/admin/forms/analytics.py:34
@@ -754,39 +744,6 @@ msgid ""
 "Address under which site is running appears to be \"%(address)s\"."
 msgstr ""
 
-#: conf/admin/forms/sso.py:13
-msgid "Enable Single Sign-On"
-msgstr ""
-
-#: conf/admin/forms/sso.py:15
-msgid ""
-"Enabling SSO will make login option redirect users to the server URL "
-"configured below. It will also disable option to register on forum, change "
-"username, email or passward, as those features will be delegated to the 3rd "
-"party site."
-msgstr ""
-
-#: conf/admin/forms/sso.py:22
-msgid "Public key"
-msgstr ""
-
-#: conf/admin/forms/sso.py:24 conf/admin/forms/sso.py:32
-msgid ""
-"Leave this field empty for Misago to generate this key on form submission."
-msgstr ""
-
-#: conf/admin/forms/sso.py:30
-msgid "Private key"
-msgstr ""
-
-#: conf/admin/forms/sso.py:37
-msgid "Server URL"
-msgstr ""
-
-#: conf/admin/forms/sso.py:50
-msgid "You need to enter server URL to enable SSO."
-msgstr ""
-
 #: conf/admin/forms/threads.py:27
 msgid "Daily post limit per user"
 msgstr ""
@@ -845,10 +802,10 @@ msgstr ""
 
 #: conf/admin/forms/threads.py:71
 msgid ""
-"Controls amount of data used by read-tracking system. All content older than"
-" number of days specified in this setting is considered old and read, even "
-"if the opposite is true for the user. Active forums can try lowering this "
-"value while less active ones may wish to increase it instead. "
+"Controls amount of data used by read-tracking system. All content older than "
+"number of days specified in this setting is considered old and read, even if "
+"the opposite is true for the user. Active forums can try lowering this value "
+"while less active ones may wish to increase it instead. "
 msgstr ""
 
 #: conf/admin/forms/threads.py:80
@@ -928,8 +885,8 @@ msgstr ""
 
 #: conf/admin/forms/users.py:48
 msgid ""
-"Delete new inactive accounts if they weren't activated within this number of"
-" days"
+"Delete new inactive accounts if they weren't activated within this number of "
+"days"
 msgstr ""
 
 #: conf/admin/forms/users.py:51
@@ -984,8 +941,8 @@ msgstr "Вернуться к стандартному gravatar"
 
 #: conf/admin/forms/users.py:86
 msgid ""
-"Select which avatar to use when user has no gravatar associated with their "
-"e-mail address."
+"Select which avatar to use when user has no gravatar associated with their e-"
+"mail address."
 msgstr ""
 
 #: conf/admin/forms/users.py:96
@@ -1097,44 +1054,44 @@ msgstr ""
 msgid "This value must be lower than number of users per page."
 msgstr ""
 
-#: conf/admin/views.py:40
+#: conf/admin/views.py:39
 msgid "Settings have been saved."
 msgstr ""
 
-#: core/errorpages.py:42
+#: core/errorpages.py:51
 msgid "Permission denied."
 msgstr "Доступ запрещён."
 
-#: core/errorpages.py:71
+#: core/errorpages.py:80
 msgid ""
 "A problem was encountered when disconnecting your account from the remote "
 "site."
 msgstr ""
 
-#: core/errorpages.py:75
+#: core/errorpages.py:84
 msgid ""
 "You are not allowed to disconnect your account from the other site, because "
 "currently it's the only way to sign in to your account."
 msgstr ""
 
-#: core/errorpages.py:80
+#: core/errorpages.py:89
 #, python-format
 msgid "A problem was encountered when signing you in using %(backend)s."
 msgstr ""
 
-#: core/errorpages.py:84
+#: core/errorpages.py:93
 msgid "The sign in process has been canceled by user."
 msgstr ""
 
-#: core/errorpages.py:86
+#: core/errorpages.py:95
 msgid "The other service could not be reached."
 msgstr ""
 
-#: core/errorpages.py:92
+#: core/errorpages.py:101
 msgid "Unexpected problem has been encountered during sign in process."
 msgstr ""
 
-#: core/errorpages.py:113
+#: core/errorpages.py:122
 msgid ""
 "Your request was rejected because your browser didn't send the CSRF cookie, "
 "or the cookie sent was invalid."
@@ -1181,8 +1138,8 @@ msgstr ""
 #: templates/misago/admin/dashboard/checks.html:17
 #: templates/misago/admin/dashboard/index.html:33
 msgid ""
-"Version check feature relies on the API operated by the Python Package Index"
-" (pypi.org) API to retrieve latest Misago release version."
+"Version check feature relies on the API operated by the Python Package Index "
+"(pypi.org) API to retrieve latest Misago release version."
 msgstr ""
 
 #: graphql/admin/versioncheck.py:70
@@ -1509,11 +1466,11 @@ msgstr "Поиск"
 msgid "Can search site"
 msgstr "Может искать на сайте"
 
-#: socialauth/admin/__init__.py:42
+#: socialauth/admin/__init__.py:40
 msgid "Social login"
 msgstr ""
 
-#: socialauth/admin/__init__.py:44
+#: socialauth/admin/__init__.py:42
 msgid "Enable users to sign on and login using their social profile."
 msgstr ""
 
@@ -1536,9 +1493,9 @@ msgstr ""
 #: socialauth/admin/forms/base.py:39
 msgid ""
 "Enabling this option will result in the user being signed in if their forum "
-"account was registered using same e-mail address as used on the social site."
-" Otherwise they will be asked to specify a different e-mail to continue sign"
-" in using social site."
+"account was registered using same e-mail address as used on the social site. "
+"Otherwise they will be asked to specify a different e-mail to continue sign "
+"in using social site."
 msgstr ""
 
 #: socialauth/admin/forms/base.py:51 socialauth/admin/forms/base.py:53
@@ -1597,8 +1554,8 @@ msgstr ""
 #: socialauth/pipeline.py:88
 #, python-format
 msgid ""
-"The e-mail address associated with your %(backend)s account is not available"
-" for use on this site."
+"The e-mail address associated with your %(backend)s account is not available "
+"for use on this site."
 msgstr ""
 
 #: socialauth/pipeline.py:98
@@ -1612,18 +1569,6 @@ msgstr ""
 msgid "Please try resubmitting the form."
 msgstr "Пожалуйста, попробуйте повторно отправить эту форму."
 
-#: socialauth/views.py:23
-msgid "Please use the 3rd party site to login."
-msgstr ""
-
-#: sso/validators.py:24 users/forms/register.py:34 users/validators.py:80
-msgid "This username is not allowed."
-msgstr "Данное имя пользователя запрещено."
-
-#: sso/validators.py:33 users/forms/register.py:45 users/validators.py:52
-msgid "This e-mail address is not allowed."
-msgstr "Этот e-mail адрес недоступен."
-
 #: templates/misago/acl_debug.html:5
 #, python-format
 msgid ""
@@ -1675,8 +1620,8 @@ msgstr "Запросить ссылку для активации"
 
 #: templates/misago/activation/request.html:25
 msgid ""
-"The site administrator may impose a requirement on newly registered accounts"
-" to be activated before users will be able to sign in."
+"The site administrator may impose a requirement on newly registered accounts "
+"to be activated before users will be able to sign in."
 msgstr ""
 
 #: templates/misago/activation/request.html:28
@@ -2047,7 +1992,7 @@ msgstr "Категория"
 #: templates/misago/admin/dashboard/totals.html:31
 #: templates/misago/admin/users/list.html:21
 #: templates/misago/profile/posts.html:5 templates/misago/profile/posts.html:8
-#: templates/misago/profile/posts.html:9 users/apps.py:102
+#: templates/misago/profile/posts.html:9 users/apps.py:93
 msgid "Posts"
 msgstr "Сообщения"
 
@@ -2191,56 +2136,45 @@ msgstr ""
 msgid "Attachment error images"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:9
-#: templates/misago/admin/socialauth/list.html:97
-msgid "Note"
-msgstr ""
-
-#: templates/misago/admin/conf/users_settings.html:9
-msgid ""
-"Single Sign-On is enabled. Site's registration, password and deletion "
-"features have been disabled and delegated to the third-party site."
-msgstr ""
-
-#: templates/misago/admin/conf/users_settings.html:14
+#: templates/misago/admin/conf/users_settings.html:8
 msgid "New accounts"
 msgstr "Новые аккаунты"
 
-#: templates/misago/admin/conf/users_settings.html:23 users/admin/forms.py:484
+#: templates/misago/admin/conf/users_settings.html:17 users/admin/forms.py:484
 #: users/admin/forms.py:573
 msgid "Usernames"
 msgstr "Имена пользователя"
 
-#: templates/misago/admin/conf/users_settings.html:33
+#: templates/misago/admin/conf/users_settings.html:27
 msgid "Avatars"
 msgstr "Аватары"
 
-#: templates/misago/admin/conf/users_settings.html:49
+#: templates/misago/admin/conf/users_settings.html:43
 msgid "Signatures"
 msgstr "Подписи"
 
-#: templates/misago/admin/conf/users_settings.html:57
+#: templates/misago/admin/conf/users_settings.html:51
 #: users/admin/__init__.py:80
 msgid "Data downloads"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:66
+#: templates/misago/admin/conf/users_settings.html:60
 msgid "Own account deletion"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:74 users/admin/forms.py:492
+#: templates/misago/admin/conf/users_settings.html:68 users/admin/forms.py:492
 msgid "IP addresses"
 msgstr "IP адреса"
 
-#: templates/misago/admin/conf/users_settings.html:82
+#: templates/misago/admin/conf/users_settings.html:76
 msgid "Default subscription preferences"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:91
+#: templates/misago/admin/conf/users_settings.html:85
 msgid "Users lists"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:100
+#: templates/misago/admin/conf/users_settings.html:94
 msgid "Top posters ranking"
 msgstr ""
 
@@ -2367,9 +2301,8 @@ msgstr ""
 msgid "Site analytics are currently unavailable due to an error."
 msgstr ""
 
-#: templates/misago/admin/dashboard/totals.html:43
-#: threads/admin/__init__.py:38 threads/permissions/attachments.py:11
-#: threads/permissions/attachments.py:29
+#: templates/misago/admin/dashboard/totals.html:43 threads/admin/__init__.py:36
+#: threads/permissions/attachments.py:11 threads/permissions/attachments.py:29
 msgid "Attachments"
 msgstr "Вложения"
 
@@ -2488,20 +2421,20 @@ msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:12
 msgid ""
-"The form was sent after being opened in the browser for a long time (eg. few"
-" days) and cookie token has expired."
+"The form was sent after being opened in the browser for a long time (eg. few "
+"days) and cookie token has expired."
 msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:15
 msgid ""
-"The site is configured to use the HTTPS, but this form was sent over the the"
-" HTTP."
+"The site is configured to use the HTTPS, but this form was sent over the the "
+"HTTP."
 msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:16
 msgid ""
-"If you are an owner of this site, please check if the HTTPS certificate used"
-" by the site is valid and accepted by the browser."
+"If you are an owner of this site, please check if the HTTPS certificate used "
+"by the site is valid and accepted by the browser."
 msgstr ""
 
 #: templates/misago/admin/generic/filter_form.html:7
@@ -2758,8 +2691,7 @@ msgstr "Отображение и видимость"
 #: templates/misago/admin/ranks/list.html:17
 #: templates/misago/admin/users/list.html:19
 #: templates/misago/userslists/active_posters.html:112
-#: templates/misago/userslists/active_posters.html:123
-#: users/admin/forms.py:238
+#: templates/misago/userslists/active_posters.html:123 users/admin/forms.py:238
 msgid "Rank"
 msgstr "Ранг"
 
@@ -2824,7 +2756,7 @@ msgid "Enabled login methods"
 msgstr ""
 
 #: templates/misago/admin/socialauth/list.html:15
-#: templates/misago/admin/socialauth/list.html:112
+#: templates/misago/admin/socialauth/list.html:106
 msgid "Provider"
 msgstr ""
 
@@ -2840,25 +2772,19 @@ msgstr ""
 msgid "Are you sure you want to disable this social login provider?"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:97
-msgid ""
-"Single Sign-On is enabled. Social authentication has been disabled and "
-"delegated to the third-party site."
-msgstr ""
-
-#: templates/misago/admin/socialauth/list.html:106
+#: templates/misago/admin/socialauth/list.html:100
 msgid "Setup new login method"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:125
+#: templates/misago/admin/socialauth/list.html:119
 msgid "Setup login with this provider"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:126
+#: templates/misago/admin/socialauth/list.html:120
 msgid "Setup"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:133
+#: templates/misago/admin/socialauth/list.html:127
 msgid "No new login providers are available for setup at this time."
 msgstr ""
 
@@ -3161,7 +3087,7 @@ msgstr ""
 msgid "Signature"
 msgstr "Подпись"
 
-#: templates/misago/admin/users/edit.html:228 users/apps.py:27
+#: templates/misago/admin/users/edit.html:228 users/apps.py:24
 msgid "Forum options"
 msgstr "Опции форума"
 
@@ -3181,8 +3107,7 @@ msgstr ""
 
 #: templates/misago/admin/users/edit.html:251
 msgid ""
-"No additional action is required. This account will be deleted "
-"automatically."
+"No additional action is required. This account will be deleted automatically."
 msgstr ""
 
 #: templates/misago/admin/users/edit.html:294
@@ -3371,11 +3296,10 @@ msgstr "Активировать мой аккаунт!"
 #: templates/misago/emails/change_email.txt:6
 #, python-format
 msgid ""
-"%(user)s, you are receiving this message because you have changed your "
-"e-mail address."
+"%(user)s, you are receiving this message because you have changed your e-"
+"mail address."
 msgstr ""
-"%(user)s, вы получили это сообщение, потому что вы изменили ваш e-mail "
-"адрес."
+"%(user)s, вы получили это сообщение, потому что вы изменили ваш e-mail адрес."
 
 #: templates/misago/emails/change_email.html:11
 #: templates/misago/emails/change_email.txt:10
@@ -3424,7 +3348,7 @@ msgid ""
 "download."
 msgstr ""
 
-#: templates/misago/emails/data_download.html:11 users/apps.py:57
+#: templates/misago/emails/data_download.html:11 users/apps.py:52
 msgid "Download data"
 msgstr ""
 
@@ -3508,8 +3432,8 @@ msgstr ""
 #: templates/misago/emails/register/inactive.html:12
 #: templates/misago/emails/register/inactive.txt:15
 msgid ""
-"This may take a while, but you will receive e-mail with notification once it"
-" happens."
+"This may take a while, but you will receive e-mail with notification once it "
+"happens."
 msgstr ""
 "Это может занять некоторое время, но вы получите e-mail с уведомлением, "
 "когда это случится."
@@ -3534,16 +3458,16 @@ msgid ""
 "Once your account is activated, you can always sign in to it using "
 "%(login_form)s."
 msgstr ""
-"Как только ваш аккаунт активирован, вы можете всегда войти в него, используя"
-" %(login_form)s."
+"Как только ваш аккаунт активирован, вы можете всегда войти в него, используя "
+"%(login_form)s."
 
 #: templates/misago/emails/register/inactive.txt:30
 msgid ""
 "Once your account is activated, you can always sign in to it using the form "
 "below:"
 msgstr ""
-"Как только ваш аккаунт активирован, вы можете всегда войти в него, используя"
-" форму, находящуюся ниже."
+"Как только ваш аккаунт активирован, вы можете всегда войти в него, используя "
+"форму, находящуюся ниже."
 
 #: templates/misago/emails/thread/reply.html:9
 #, python-format
@@ -3719,14 +3643,13 @@ msgstr ""
 
 #: templates/misago/forgottenpassword/request.html:39
 msgid ""
-"Instead, you can change your password using special secure form that will be"
-" available by special link valid only for your browser, for seven days or "
+"Instead, you can change your password using special secure form that will be "
+"available by special link valid only for your browser, for seven days or "
 "until your password is changed."
 msgstr ""
 "Вместо этого, вы можете изменить ваш пароль, используя специальную "
-"защищённую форму, которая доступна при помощи специальной ссылки, работающей"
-" только в вашем браузере, семь дней или до того, как ваш пароль будет "
-"изменён."
+"защищённую форму, которая доступна при помощи специальной ссылки, работающей "
+"только в вашем браузере, семь дней или до того, как ваш пароль будет изменён."
 
 #: templates/misago/forgottenpassword/request.html:42
 msgid ""
@@ -3864,7 +3787,7 @@ msgstr "Смотреть результаты"
 #: templates/misago/profile/ban_details.html:5
 #: templates/misago/profile/ban_details.html:8
 #: templates/misago/profile/ban_details.html:9
-#: templates/misago/profile/ban_details.html:16 users/apps.py:137
+#: templates/misago/profile/ban_details.html:16 users/apps.py:128
 msgid "Ban details"
 msgstr "Детали блокировки"
 
@@ -3917,7 +3840,7 @@ msgstr[3] "Начал %(threads)s тем."
 #: templates/misago/profile/details.html:5
 #: templates/misago/profile/details.html:8
 #: templates/misago/profile/details.html:9
-#: templates/misago/profile/details.html:19 users/apps.py:124
+#: templates/misago/profile/details.html:19 users/apps.py:115
 msgid "Details"
 msgstr "Детали"
 
@@ -3947,7 +3870,7 @@ msgstr ""
 
 #: templates/misago/profile/followers.html:5
 #: templates/misago/profile/followers.html:8
-#: templates/misago/profile/followers.html:9 users/apps.py:112
+#: templates/misago/profile/followers.html:9 users/apps.py:103
 msgid "Followers"
 msgstr "Последователи"
 
@@ -3980,7 +3903,7 @@ msgstr "У %(username)s нет последователей."
 
 #: templates/misago/profile/follows.html:5
 #: templates/misago/profile/follows.html:8
-#: templates/misago/profile/follows.html:9 users/apps.py:118
+#: templates/misago/profile/follows.html:9 users/apps.py:109
 msgid "Follows"
 msgstr "Следить"
 
@@ -4080,7 +4003,7 @@ msgstr "У %(username)s нет начатых тем."
 
 #: templates/misago/profile/username_history.html:5
 #: templates/misago/profile/username_history.html:8
-#: templates/misago/profile/username_history.html:9 users/apps.py:130
+#: templates/misago/profile/username_history.html:9 users/apps.py:121
 msgid "Username history"
 msgstr "История имени пользователя"
 
@@ -4271,11 +4194,11 @@ msgstr ""
 
 #: templates/misago/thread/posts/post/flags.html:29
 msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
-"Эта публикация не одобрена. Только пользователи с разрешением  и автор могут"
-" одобрять публикации и смотреть содержимое темы."
+"Эта публикация не одобрена. Только пользователи с разрешением  и автор могут "
+"одобрять публикации и смотреть содержимое темы."
 
 #: templates/misago/thread/posts/post/flags.html:35
 msgid "This post is protected. Only moderators may change it."
@@ -4469,7 +4392,7 @@ msgstr "Опрос"
 
 #: templates/misago/userslists/active_posters.html:5
 #: templates/misago/userslists/active_posters.html:23
-#: templates/misago/userslists/active_posters.html:24 users/apps.py:81
+#: templates/misago/userslists/active_posters.html:24 users/apps.py:72
 msgid "Top posters"
 msgstr ""
 
@@ -4489,8 +4412,8 @@ msgstr[3] "%(posters)s самый активный постер за после
 #, python-format
 msgid "No users have posted any new messages during last %(days)s days."
 msgstr ""
-"Нет пользователей опубликовавших никаких новых сообщение в течение последних"
-" %(days)s дней."
+"Нет пользователей опубликовавших никаких новых сообщение в течение последних "
+"%(days)s дней."
 
 #: templates/misago/userslists/active_posters.html:29
 #: templates/misago/userslists/active_posters.html:44
@@ -4788,11 +4711,11 @@ msgstr ""
 msgid "Default Misago Theme"
 msgstr ""
 
-#: threads/admin/__init__.py:45
+#: threads/admin/__init__.py:43
 msgid "Attachment types"
 msgstr "Типы вложений"
 
-#: threads/admin/__init__.py:46
+#: threads/admin/__init__.py:44
 msgid "Specify what files may be uploaded on the forum."
 msgstr ""
 
@@ -4842,8 +4765,7 @@ msgstr "Лимит скачивания в"
 
 #: threads/admin/forms.py:64
 msgid ""
-"List of comma separated file extensions associated with this attachment "
-"type."
+"List of comma separated file extensions associated with this attachment type."
 msgstr ""
 "Список разделённых через запятую расширений файлов, ассоциированых с этим "
 "типом вложения."
@@ -4853,8 +4775,8 @@ msgid ""
 "Optional list of comma separated mime types associated with this attachment "
 "type."
 msgstr ""
-"Необязательный список разделённых через запятую mime-типов, ассоциированых с"
-" этим типом вложения."
+"Необязательный список разделённых через запятую mime-типов, ассоциированых с "
+"этим типом вложения."
 
 #: threads/admin/forms.py:72
 msgid ""
@@ -4955,8 +4877,7 @@ msgstr "Тип вложений \"%(name)s\" был отредактирован
 #: threads/admin/views/attachmenttypes.py:47
 #, python-format
 msgid ""
-"Attachment type \"%(name)s\" has associated attachments and can't be "
-"deleted."
+"Attachment type \"%(name)s\" has associated attachments and can't be deleted."
 msgstr ""
 "Тип вложений \"%(name)s\" имеет ассоциированные с ним вложения и не может "
 "быть удалён."
@@ -5054,11 +4975,11 @@ msgstr[0] ""
 "Вы не можете прикрепить больше чем %(limit_value)s файл к одной публикации "
 "(добавлено %(show_value)s)."
 msgstr[1] ""
-"Вы не можете прикрепить больше чем %(limit_value)s файлов к одной публикации"
-" (добавлено %(show_value)s)."
+"Вы не можете прикрепить больше чем %(limit_value)s файлов к одной публикации "
+"(добавлено %(show_value)s)."
 msgstr[2] ""
-"Вы не можете прикрепить больше чем %(limit_value)s файлов к одной публикации"
-" (добавлено %(show_value)s)."
+"Вы не можете прикрепить больше чем %(limit_value)s файлов к одной публикации "
+"(добавлено %(show_value)s)."
 msgstr[3] ""
 "Вы не можете прикрепить больше чем %(limit_value)s файла к одной публикации "
 "(добавлено %(show_value)s)."
@@ -5152,8 +5073,7 @@ msgstr "Вы должны войти в аккаунт, чтобы начина
 #: threads/api/threadendpoints/editor.py:60
 msgid ""
 "No categories that allow new threads are available to you at the moment."
-msgstr ""
-"На данный момент нет категорий, в которых для вас доступны новые темы."
+msgstr "На данный момент нет категорий, в которых для вас доступны новые темы."
 
 #: threads/api/threadendpoints/patch.py:65
 msgid "Not a valid string."
@@ -5194,8 +5114,7 @@ msgstr ""
 
 #: threads/api/threadendpoints/patch.py:273
 msgid ""
-"This post can't be unmarked because it's not currently marked as best "
-"answer."
+"This post can't be unmarked because it's not currently marked as best answer."
 msgstr ""
 
 #: threads/api/threadendpoints/patch.py:301
@@ -5305,8 +5224,10 @@ msgstr "Вы не можете удалить оригинальную публ
 
 #: threads/participants.py:142
 #, python-format
-msgid "%(user)s has invited you to participate in private thread \"%(thread)s\""
-msgstr "%(user)s пригласил вас стать участником в приватную тему \"%(thread)s\""
+msgid ""
+"%(user)s has invited you to participate in private thread \"%(thread)s\""
+msgstr ""
+"%(user)s пригласил вас стать участником в приватную тему \"%(thread)s\""
 
 #: threads/permissions/attachments.py:14
 msgid "Max attached file size (in kb)"
@@ -5396,8 +5317,8 @@ msgstr ""
 #: threads/permissions/bestanswers.py:188
 #, python-format
 msgid ""
-"You don't have permission to change this thread's marked answer because it's"
-" in the \"%(category)s\" category."
+"You don't have permission to change this thread's marked answer because it's "
+"in the \"%(category)s\" category."
 msgstr ""
 
 #: threads/permissions/bestanswers.py:198
@@ -5464,8 +5385,8 @@ msgstr ""
 
 #: threads/permissions/bestanswers.py:274
 msgid ""
-"You can't unmark this thread's best answer because it's closed and you don't"
-" have permission to open it."
+"You can't unmark this thread's best answer because it's closed and you don't "
+"have permission to open it."
 msgstr ""
 
 #: threads/permissions/bestanswers.py:282
@@ -5620,12 +5541,10 @@ msgstr "Вы не можете удалять опросы других поль
 #, python-format
 msgid "You can't delete polls that are older than %(minutes)s minute."
 msgid_plural "You can't delete polls that are older than %(minutes)s minutes."
-msgstr[0] ""
-"Вы не можете удалять опросы, которые старше чем %(minutes)s минута."
+msgstr[0] "Вы не можете удалять опросы, которые старше чем %(minutes)s минута."
 msgstr[1] "Вы не можете удалять опросы, которые старше чем %(minutes)s минут."
 msgstr[2] "Вы не можете удалять опросы, которые старше чем %(minutes)s минут."
-msgstr[3] ""
-"Вы не можете удалять опросы, которые старше чем %(minutes)s минуты."
+msgstr[3] "Вы не можете удалять опросы, которые старше чем %(minutes)s минуты."
 
 #: threads/permissions/polls.py:202
 msgid "This poll is over. You can't delete it."
@@ -5693,8 +5612,8 @@ msgstr "Можно отчитывать приватные темы"
 
 #: threads/permissions/privatethreads.py:52
 msgid ""
-"Allows user to report private threads they are participating in, making them"
-" accessible to moderators."
+"Allows user to report private threads they are participating in, making them "
+"accessible to moderators."
 msgstr ""
 "Позволяет пользователю отчитывать приватные темы, в которых они участвуют, "
 "создавая их доступными модераторам."
@@ -5777,8 +5696,8 @@ msgstr "Можно увидеть список одобренного содер
 msgid ""
 "Allows access to \"unapproved\" tab on threads lists for easy listing of "
 "threads that are unapproved or contain unapproved posts. Despite the tab "
-"being available on all threads lists, it will only display threads belonging"
-" to categories in which the user has permission to approve content."
+"being available on all threads lists, it will only display threads belonging "
+"to categories in which the user has permission to approve content."
 msgstr ""
 "Позволяет доступ к \"не одобренной\" вкладке в списках тем для лёгкого "
 "прослушивания тем, что не одобрены или содержат не одобренные публикации. "
@@ -6239,15 +6158,13 @@ msgstr "Эта публикация защищена. Вы не можете р
 msgid "You can't edit posts that are older than %(minutes)s minute."
 msgid_plural "You can't edit posts that are older than %(minutes)s minutes."
 msgstr[0] ""
-"Вы не можете редактировать публикации, которые старше чем %(minutes)s "
-"минута."
+"Вы не можете редактировать публикации, которые старше чем %(minutes)s минута."
 msgstr[1] ""
 "Вы не можете редактировать публикации, которые старше чем %(minutes)s минут."
 msgstr[2] ""
 "Вы не можете редактировать публикации, которые старше чем %(minutes)s минут."
 msgstr[3] ""
-"Вы не можете редактировать публикации, которые старше чем %(minutes)s "
-"минуты."
+"Вы не можете редактировать публикации, которые старше чем %(minutes)s минуты."
 
 #: threads/permissions/threads.py:899
 msgid "This category is closed. You can't edit posts in it."
@@ -6350,8 +6267,7 @@ msgstr "Вы не можете удалять публикации в этой 
 
 #: threads/permissions/threads.py:1018
 msgid "You can't delete other users posts in this category."
-msgstr ""
-"Вы не можете удалять публикации других пользователей в этой категории."
+msgstr "Вы не можете удалять публикации других пользователей в этой категории."
 
 #: threads/permissions/threads.py:1022
 msgid "This post is protected. You can't delete it."
@@ -6886,17 +6802,17 @@ msgid_plural ""
 "Posted message should be at least %(limit_value)s characters long (it has "
 "%(show_value)s)."
 msgstr[0] ""
-"Опубликованное сообщение должно быть по крайне мере длиной в %(limit_value)s"
-" символ (у него %(show_value)s)."
+"Опубликованное сообщение должно быть по крайне мере длиной в %(limit_value)s "
+"символ (у него %(show_value)s)."
 msgstr[1] ""
-"Опубликованное сообщение должно быть по крайне мере длиной в %(limit_value)s"
-" символов (у него %(show_value)s)."
+"Опубликованное сообщение должно быть по крайне мере длиной в %(limit_value)s "
+"символов (у него %(show_value)s)."
 msgstr[2] ""
-"Опубликованное сообщение должно быть по крайне мере длиной в %(limit_value)s"
-" символов (у него %(show_value)s)."
+"Опубликованное сообщение должно быть по крайне мере длиной в %(limit_value)s "
+"символов (у него %(show_value)s)."
 msgstr[3] ""
-"Опубликованное сообщение должно быть по крайне мере длиной в %(limit_value)s"
-" символа (у него %(show_value)s)."
+"Опубликованное сообщение должно быть по крайне мере длиной в %(limit_value)s "
+"символа (у него %(show_value)s)."
 
 #: threads/validators.py:93
 #, python-format
@@ -6910,11 +6826,11 @@ msgstr[0] ""
 "Опубликованное сообщение не может быть длиннее, чем %(limit_value)s символ "
 "(у него %(show_value)s)."
 msgstr[1] ""
-"Опубликованное сообщение не может быть длиннее, чем %(limit_value)s символов"
-" (у него %(show_value)s)."
+"Опубликованное сообщение не может быть длиннее, чем %(limit_value)s символов "
+"(у него %(show_value)s)."
 msgstr[2] ""
-"Опубликованное сообщение не может быть длиннее, чем %(limit_value)s символов"
-" (у него %(show_value)s)."
+"Опубликованное сообщение не может быть длиннее, чем %(limit_value)s символов "
+"(у него %(show_value)s)."
 msgstr[3] ""
 "Опубликованное сообщение не может быть длиннее, чем %(limit_value)s символа "
 "(у него %(show_value)s)."
@@ -6951,8 +6867,7 @@ msgstr ""
 #: threads/viewmodels/threads.py:36
 msgid "You have to sign in to see list of threads with new replies."
 msgstr ""
-"Вы должны пойти, чтобы просматривать список тем, в которых есть новые "
-"ответы."
+"Вы должны пойти, чтобы просматривать список тем, в которых есть новые ответы."
 
 #: threads/viewmodels/threads.py:39
 msgid "You have to sign in to see list of threads you are subscribing."
@@ -6961,8 +6876,8 @@ msgstr "Вы должны войти, чтобы просматривать те
 #: threads/viewmodels/threads.py:42
 msgid "You have to sign in to see list of threads with unapproved posts."
 msgstr ""
-"Вы должны войти чтобы просматривать список тем, в которых есть не одобренные"
-" публикации."
+"Вы должны войти чтобы просматривать список тем, в которых есть не одобренные "
+"публикации."
 
 #: threads/viewmodels/threads.py:113
 msgid "You don't have permission to see unapproved content lists."
@@ -7020,8 +6935,8 @@ msgstr "Является администратором"
 #: users/admin/forms.py:78
 msgid ""
 "Designates whether the user can log into admin sites. If Django admin site "
-"is enabled, this user will need additional permissions assigned within it to"
-" admin Django modules."
+"is enabled, this user will need additional permissions assigned within it to "
+"admin Django modules."
 msgstr ""
 "Определяет, может ли пользователь войти в административные сайты. Если "
 "административный сайт Django доступен, этому пользователю нужны будут "
@@ -7120,8 +7035,8 @@ msgstr ""
 #: users/admin/forms.py:152
 msgid "Optional message to user explaining why his/hers signature is locked."
 msgstr ""
-"Дополнительное сообщение для пользователя, объясняющее почему его/ее подпись"
-" заблокирована."
+"Дополнительное сообщение для пользователя, объясняющее почему его/ее подпись "
+"заблокирована."
 
 #: users/admin/forms.py:160
 msgid ""
@@ -7209,8 +7124,8 @@ msgstr "Пользовательский заголовок"
 
 #: users/admin/forms.py:397
 msgid ""
-"Optional, singular version of rank name displayed by user names. For example"
-" \"GM\" or \"Dev\"."
+"Optional, singular version of rank name displayed by user names. For example "
+"\"GM\" or \"Dev\"."
 msgstr ""
 "Дополнительная, единичная версия имени ранга, которая показывается именами "
 "пользователей. Например, \"GM\" или \"Dev\"."
@@ -7246,8 +7161,8 @@ msgid ""
 "Selecting this option will make users with this rank easily discoverable by "
 "others through dedicated page on forum users list."
 msgstr ""
-"Выбор данной опции сделает пользователей данного ранга легко распознаваемыми"
-" для других через соответствующий список пользователей на странице форума."
+"Выбор данной опции сделает пользователей данного ранга легко распознаваемыми "
+"для других через соответствующий список пользователей на странице форума."
 
 #: users/admin/forms.py:447
 msgid "This name collides with other rank."
@@ -7313,8 +7228,8 @@ msgid ""
 msgstr ""
 "При изменении этого на \"да\" проверка этой блокировки будет  возможна  "
 "только на стадии регистрации. Это хорошо, если вы хотите блокировать "
-"определенные регистрации, отклоненные недавно Email провайдерами, без ущерба"
-" существующих пользователей."
+"определенные регистрации, отклоненные недавно Email провайдерами, без ущерба "
+"существующих пользователей."
 
 #: users/admin/forms.py:512
 msgid "Banned value"
@@ -7365,8 +7280,8 @@ msgstr ""
 
 #: users/admin/forms.py:624
 msgid ""
-"Enter every item in new line. Duplicates will be ignored. This field is case"
-" insensitive. Depending on site configuration and amount of data to archive "
+"Enter every item in new line. Duplicates will be ignored. This field is case "
+"insensitive. Depending on site configuration and amount of data to archive "
 "it may take up to few days for requests to complete. E-mail will "
 "notification will be sent to every user once their download is ready."
 msgstr ""
@@ -7605,26 +7520,21 @@ msgstr "Новый пользователь \"%(user)s\" был зарегист
 msgid "User \"%(user)s\" has been edited."
 msgstr "Пользователь \"%(user)s\" был отредактирован."
 
-#: users/api/auth.py:42 users/api/auth.py:92 users/api/auth.py:130
-#: users/api/auth.py:174
-msgid "Please use the 3rd party site to authenticate."
-msgstr ""
-
-#: users/api/auth.py:100
+#: users/api/auth.py:94
 #, python-format
 msgid "Activate %(user)s account on %(forum_name)s forums"
 msgstr "Активировать аккаунт %(user)s на %(forum_name)s форумах."
 
-#: users/api/auth.py:138
+#: users/api/auth.py:129
 #, python-format
 msgid "Change %(user)s password on %(forum_name)s forums"
 msgstr "Изменить пароль %(user)s на %(forum_name)s форумах"
 
-#: users/api/auth.py:176
+#: users/api/auth.py:164
 msgid "Form link is invalid. Please try again."
 msgstr "Ссылка формы неправильна. Пожалуйста, попробуйте заново."
 
-#: users/api/auth.py:177
+#: users/api/auth.py:165
 msgid "Your link has expired. Please request new one."
 msgstr "Ваша ссылка истекла. Пожалуйста, запросите новую."
 
@@ -7727,83 +7637,63 @@ msgstr "У вас нет разрешения просматривать ист
 msgid "You have to sign in to perform this action."
 msgstr "Вы должны войти, чтобы выполнить это действие."
 
-#: users/api/users.py:90
-msgid "Please use the 3rd party site to register."
-msgstr ""
-
-#: users/api/users.py:113
+#: users/api/users.py:110
 msgid "You can't change other users avatars."
 msgstr "Вы не можете изменять аватары других пользователей."
 
-#: users/api/users.py:125
+#: users/api/users.py:122
 msgid "You can't change other users options."
 msgstr "Вы не можете изменять настройки других пользователей."
 
-#: users/api/users.py:130
+#: users/api/users.py:127
 msgid "Your forum options have been changed."
 msgstr "Ваши настройки форума были изменены."
 
-#: users/api/users.py:137
-msgid "Please use the 3rd party site to change your username."
-msgstr ""
-
-#: users/api/users.py:141
+#: users/api/users.py:133
 msgid "You can't change other users names."
 msgstr "Вы не можете менять имена других пользователей."
 
-#: users/api/users.py:148
+#: users/api/users.py:140
 msgid "You can't change other users signatures."
 msgstr "Вы не можете менять подписи других пользователей."
 
-#: users/api/users.py:161
-msgid "Please use the 3rd party site to change your password."
-msgstr ""
-
-#: users/api/users.py:165
+#: users/api/users.py:152
 msgid "You can't change other users passwords."
 msgstr "Вы не можете менять пароли других пользователей."
 
-#: users/api/users.py:175
-msgid "Please use the 3rd party site to change your e-mail."
-msgstr ""
-
-#: users/api/users.py:180
+#: users/api/users.py:162
 msgid "You can't change other users e-mail addresses."
 msgstr "Вы не можете менять e-mail адреса других пользователей."
 
-#: users/api/users.py:211
-msgid "Please use the 3rd party site to delete account."
-msgstr ""
-
-#: users/api/users.py:292
+#: users/api/users.py:269
 msgid "You can't request data downloads for other users."
 msgstr ""
 
-#: users/api/users.py:296
+#: users/api/users.py:273
 msgid "You can't download your data."
 msgstr ""
 
-#: users/api/users.py:301
+#: users/api/users.py:278
 msgid "You can't have more than one data download request at a single time."
 msgstr ""
 
-#: users/api/users.py:358
+#: users/api/users.py:335
 msgid "You can't see other users data downloads."
 msgstr ""
 
-#: users/apps.py:33
+#: users/apps.py:30
 msgid "Edit details"
 msgstr "Редактировать детали"
 
-#: users/apps.py:39
+#: users/apps.py:36
 msgid "Change username"
 msgstr "Изменить имя пользователя"
 
-#: users/apps.py:46
+#: users/apps.py:42
 msgid "Change email or password"
 msgstr "Изменить email или пароль"
 
-#: users/apps.py:71
+#: users/apps.py:63
 msgid "Delete account"
 msgstr ""
 
@@ -7819,8 +7709,8 @@ msgstr "Загружаемый тип файла не позволен."
 #, python-format
 msgid "Uploaded image should be at least %(size)s pixels tall and wide."
 msgstr ""
-"Загружаемое изображение должно быть по крайне мере %(size)s пикселей высотой"
-" и шириной."
+"Загружаемое изображение должно быть по крайне мере %(size)s пикселей высотой "
+"и шириной."
 
 #: users/avatars/uploaded.py:63
 msgid "Uploaded image is too big."
@@ -7884,7 +7774,7 @@ msgstr "Введеный e-mail недействителен."
 msgid "No user with this e-mail exists."
 msgstr "Пользователей с данным e-mail не существует."
 
-#: users/forms/auth.py:150 users/views/activation.py:51
+#: users/forms/auth.py:150 users/views/activation.py:46
 #, python-format
 msgid "%(user)s, your account is already active."
 msgstr "%(user)s, Ваш аккаунт уже активен."
@@ -7910,6 +7800,14 @@ msgstr ""
 "Администратор должен активировать Ваш аккаунт до того как вы сможете "
 "запросить новый пароль."
 
+#: users/forms/register.py:34 users/validators.py:80
+msgid "This username is not allowed."
+msgstr "Данное имя пользователя запрещено."
+
+#: users/forms/register.py:45 users/validators.py:52
+msgid "This e-mail address is not allowed."
+msgstr "Этот e-mail адрес недоступен."
+
 #: users/forms/register.py:51
 msgid "This agreement is required."
 msgstr ""
@@ -8252,8 +8150,8 @@ msgstr "Можно видеть информацию по блокировкам
 #: users/permissions/profiles.py:29
 msgid "Allows users with this permission to see user and staff ban messages."
 msgstr ""
-"Позволять пользователям с этим разрешением видеть сообщения к блокировкам от"
-" пользователей и персонала."
+"Позволять пользователям с этим разрешением видеть сообщения к блокировкам от "
+"пользователей и персонала."
 
 #: users/permissions/profiles.py:35
 msgid "User profiles"
@@ -8341,12 +8239,12 @@ msgstr "Вебсайт"
 
 #: users/profilefields/default.py:41
 msgid ""
-"If you own website in the internet you wish to share on your profile you may"
-" enter its address here. Remember to for it to be valid http address "
-"starting with either \"http://\" or \"https://\"."
+"If you own website in the internet you wish to share on your profile you may "
+"enter its address here. Remember to for it to be valid http address starting "
+"with either \"http://\" or \"https://\"."
 msgstr ""
-"Если Вы владеете сайтом в интернете и хотите указать его в своем профиле, Вы"
-" можете ввести его адрес здесь. Учтите, чтобы быть действительным, адрес "
+"Если Вы владеете сайтом в интернете и хотите указать его в своем профиле, Вы "
+"можете ввести его адрес здесь. Учтите, чтобы быть действительным, адрес "
 "должен начинаться с \"http://\" или \"https://\"."
 
 #: users/profilefields/default.py:49
@@ -8368,9 +8266,9 @@ msgstr "Twitter аккаунт"
 #: users/profilefields/default.py:62
 #, python-format
 msgid ""
-"If you own Twitter account, here you may enter your Twitter handle for other"
-" users to find you. Starting your handle with \"@\" sign is optional. Either"
-" \"@%(slug)s\" or \"%(slug)s\" are valid values."
+"If you own Twitter account, here you may enter your Twitter handle for other "
+"users to find you. Starting your handle with \"@\" sign is optional. Either "
+"\"@%(slug)s\" or \"%(slug)s\" are valid values."
 msgstr ""
 "Если у Вас есть аккаунт в Twitter, Вы можете внести его сюда, чтобы другие "
 "пользователи могли найти Вас. Указывать \"@\" в начале аккаунта не "
@@ -8459,8 +8357,7 @@ msgstr "Имя пользователя может содержать тольк
 msgid "Username must be at least %(limit_value)s character long."
 msgid_plural "Username must be at least %(limit_value)s characters long."
 msgstr[0] ""
-"Имя пользователя должно быть по крайней мере длиной в %(limit_value)s "
-"символ."
+"Имя пользователя должно быть по крайней мере длиной в %(limit_value)s символ."
 msgstr[1] ""
 "Имя пользователя должно быть по крайней мере длиной в %(limit_value)s "
 "символа."
@@ -8488,11 +8385,7 @@ msgstr "Введенные данные были найдены в базе да
 msgid "This email is not allowed."
 msgstr "Данный e-mail запрещен."
 
-#: users/views/activation.py:21
-msgid "Please use the 3rd party site to activate your account."
-msgstr ""
-
-#: users/views/activation.py:56
+#: users/views/activation.py:51
 #, python-format
 msgid ""
 "%(user)s, your activation link is invalid. Try again or request new "
@@ -8501,40 +8394,31 @@ msgstr ""
 "%(user)s, ваша ссылка активации недействительна. Попробуйте еще раз или "
 "запросите новую ссылку активации."
 
-#: users/views/activation.py:74
+#: users/views/activation.py:69
 #, python-format
 msgid "%(user)s, your account has been activated!"
 msgstr "%(user)s, Ваш аккаунт был активирован."
 
-#: users/views/forgottenpassword.py:18 users/views/options.py:70
-msgid "Please use the 3rd party site to change password."
-msgstr ""
-
-#: users/views/forgottenpassword.py:45
+#: users/views/forgottenpassword.py:31
 #, python-format
-msgid ""
-"%(user)s, your link has expired. Please request new link and try again."
+msgid "%(user)s, your link has expired. Please request new link and try again."
 msgstr ""
-"%(user)s, Ваша ссылка устарела. Пожалуйста, запросите новую и попробуйте еще"
-" раз."
+"%(user)s, Ваша ссылка устарела. Пожалуйста, запросите новую и попробуйте еще "
+"раз."
 
-#: users/views/forgottenpassword.py:52
+#: users/views/forgottenpassword.py:38
 #, python-format
 msgid "%(user)s, your link is invalid. Please try again or request new link."
 msgstr ""
 "%(user)s, Ваша ссылка недействительна. Пожалуйста, попробуйте снова или "
 "запросите новую ссылку."
 
-#: users/views/options.py:47
-msgid "Please use the 3rd party site to change e-mail."
-msgstr ""
-
-#: users/views/options.py:59
+#: users/views/options.py:56
 #, python-format
 msgid "%(user)s, your e-mail has been changed."
 msgstr "%(user)s, Ваш e-mail был изменен."
 
-#: users/views/options.py:80
+#: users/views/options.py:74
 #, python-format
 msgid "%(user)s, your password has been changed."
 msgstr "%(user)s, Ваш пароль был изменен."

BIN
misago/locale/ru/LC_MESSAGES/djangojs.mo


+ 73 - 76
misago/locale/ru/LC_MESSAGES/djangojs.po

@@ -2,7 +2,7 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # alff0x1f <alff3one@gmail.com>, 2017
 # Amy Woodehy <amywoodehy@gmail.com>, 2017
@@ -11,21 +11,23 @@
 # Roman Patsev <rpatsev@gmail.com>, 2018
 # musindmitriy <dmitry.musin@phystech.edu>, 2018
 # Katrin Kutepova <blackkatelv@gmail.com>, 2018
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Katrin Kutepova <blackkatelv@gmail.com>, 2018\n"
 "Language-Team: Russian (https://www.transifex.com/misago/teams/65369/ru/)\n"
+"Language: ru\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: ru\n"
-"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
+"%100>=11 && n%100<=14)? 2 : 3);\n"
 
 #: static/misago/admin/index.js:16
 msgid "defineLocaleOverride"
@@ -388,8 +390,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Please select the best answer for your newly merged thread. No posts will be"
-" deleted during the merge."
+"Please select the best answer for your newly merged thread. No posts will be "
+"deleted during the merge."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -416,8 +418,7 @@ msgid_plural "See full \"%(provider)s\" results page with %(count)s results."
 msgstr[0] ""
 "Показать полные результаты \"%(provider)s\", содержащие %(count)s результат."
 msgstr[1] ""
-"Показать полные результаты \"%(provider)s\", содержащие %(count)s "
-"результата."
+"Показать полные результаты \"%(provider)s\", содержащие %(count)s результата."
 msgstr[2] ""
 "Показать полные результаты \"%(provider)s\", содержащие %(count)s "
 "результатов."
@@ -492,8 +493,8 @@ msgstr "Удалить аккаунт"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You are going to delete your account. This action is nonreversible, and will"
-" result in following data being deleted:"
+"You are going to delete your account. This action is nonreversible, and will "
+"result in following data being deleted:"
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -514,8 +515,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"All your posted content will NOT be deleted, but username associated with it"
-" will be changed to one shared by all deleted accounts."
+"All your posted content will NOT be deleted, but username associated with it "
+"will be changed to one shared by all deleted accounts."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -708,6 +709,10 @@ msgid "Change forgotten password"
 msgstr "Изменить забытый пароль"
 
 #: static/misago/js/misago.js:1
+msgid "%(user)s has been made new thread owner."
+msgstr "%(user)s новый владелец темы."
+
+#: static/misago/js/misago.js:1
 msgid "You have left this thread."
 msgstr "Вы вышли из этой темы"
 
@@ -716,10 +721,6 @@ msgid "%(user)s has been removed from this thread."
 msgstr "%(user)s был удален из этой темы."
 
 #: static/misago/js/misago.js:1
-msgid "%(user)s has been made new thread owner."
-msgstr "%(user)s новый владелец темы."
-
-#: static/misago/js/misago.js:1
 msgid "See profile"
 msgstr "Просмотреть профиль"
 
@@ -992,8 +993,7 @@ msgstr "Отменить"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you with to revert this post to the state from before this "
-"edit?"
+"Are you sure you with to revert this post to the state from before this edit?"
 msgstr ""
 "Вы уверены, что хотите вернуть это сообщение в состояние до этого изменения?"
 
@@ -1330,8 +1330,7 @@ msgstr "Это сообщение скрыто. Содержимое недос
 #: static/misago/js/misago.js:1
 msgid ""
 "Are you sure you want to delete this post? This action is not reversible!"
-msgstr ""
-"Вы уверены, что хотите удалить это сообщение? Это действие необратимо."
+msgstr "Вы уверены, что хотите удалить это сообщение? Это действие необратимо."
 
 #: static/misago/js/misago.js:1
 msgid "Post has been deleted."
@@ -1448,22 +1447,22 @@ msgstr ""
 #: static/misago/js/misago.js:1
 msgid "This post is hidden. Only users with permission may see its contents."
 msgstr ""
-"Эта сообщение скрыто. Только пользователи, имеющие разрешение, могут увидеть"
-" его содержимое."
+"Эта сообщение скрыто. Только пользователи, имеющие разрешение, могут увидеть "
+"его содержимое."
+
+#: static/misago/js/misago.js:1
+msgid "This post is protected. Only moderators may change it."
+msgstr "Это сообщение защищено. Только модераторы могут изменить его."
 
 #: static/misago/js/misago.js:1
 msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
 "Это сообщение не одобрено. Только пользователи, имеющие разрешения на "
 "одобрение сообщений, и его автор могут увидеть его содержимое."
 
 #: static/misago/js/misago.js:1
-msgid "This post is protected. Only moderators may change it."
-msgstr "Это сообщение защищено. Только модераторы могут изменить его."
-
-#: static/misago/js/misago.js:1
 msgid "Liked"
 msgstr "Нравится"
 
@@ -1568,24 +1567,24 @@ msgid "%(username)s's details have been updated."
 msgstr "%(username)sличные данные обновлены."
 
 #: static/misago/js/misago.js:1
-msgid "You have no started threads."
-msgstr "У вас нет начатых тем."
+msgid "You have posted no messages."
+msgstr "Вы не написали сообщений."
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s started no threads."
-msgstr "У %(username)s нет начатых тем."
+msgid "%(username)s posted no messages."
+msgstr "У %(username)s нет опубликованных сообщений."
 
 #: static/misago/js/misago.js:1
-msgid "You have started %(threads)s thread."
-msgid_plural "You have started %(threads)s threads."
-msgstr[0] "Вы начали %(threads)sтему."
-msgstr[1] "Вы начали %(threads)sтемы."
-msgstr[2] "Вы начали %(threads)sтем."
-msgstr[3] "Вы начали %(threads)s тем."
+msgid "You have posted %(posts)s message."
+msgid_plural "You have posted %(posts)s messages."
+msgstr[0] "Вы опубликовали %(posts)s сообщение."
+msgstr[1] "Вы опубликовали %(posts)s сообщения."
+msgstr[2] "Вы опубликовали %(posts)s сообщений."
+msgstr[3] "Вы опубликовали %(posts)s сообщений."
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s has started %(threads)s thread."
-msgid_plural "%(username)s has started %(threads)s threads."
+msgid "%(username)s has posted %(posts)s message."
+msgid_plural "%(username)s has posted %(posts)s messages."
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
@@ -1596,36 +1595,36 @@ msgid "Loading..."
 msgstr "Загрузка..."
 
 #: static/misago/js/misago.js:1
-msgid "Threads"
-msgstr "Темы"
+msgid "Posts"
+msgstr "Сообщений"
 
 #: static/misago/js/misago.js:1
-msgid "You have posted no messages."
-msgstr "Вы не написали сообщений."
+msgid "You have no started threads."
+msgstr "У вас нет начатых тем."
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s posted no messages."
-msgstr "У %(username)s нет опубликованных сообщений."
+msgid "%(username)s started no threads."
+msgstr "У %(username)s нет начатых тем."
 
 #: static/misago/js/misago.js:1
-msgid "You have posted %(posts)s message."
-msgid_plural "You have posted %(posts)s messages."
-msgstr[0] "Вы опубликовали %(posts)s сообщение."
-msgstr[1] "Вы опубликовали %(posts)s сообщения."
-msgstr[2] "Вы опубликовали %(posts)s сообщений."
-msgstr[3] "Вы опубликовали %(posts)s сообщений."
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
+msgstr[0] "Вы начали %(threads)sтему."
+msgstr[1] "Вы начали %(threads)sтемы."
+msgstr[2] "Вы начали %(threads)sтем."
+msgstr[3] "Вы начали %(threads)s тем."
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s has posted %(posts)s message."
-msgid_plural "%(username)s has posted %(posts)s messages."
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 msgstr[3] ""
 
 #: static/misago/js/misago.js:1
-msgid "Posts"
-msgstr "Сообщений"
+msgid "Threads"
+msgstr "Темы"
 
 #: static/misago/js/misago.js:1
 msgid "Show older activity"
@@ -2111,8 +2110,7 @@ msgstr "последний ответ %(user)s %(date)s"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you want to merge selected posts? This action is not "
-"reversible!"
+"Are you sure you want to merge selected posts? This action is not reversible!"
 msgstr ""
 "Вы уверены, что хотите удалить выбранные сообщения? Это действие необратимо!"
 
@@ -2456,8 +2454,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You need permission to start threads in category to be able to merge threads"
-" to it."
+"You need permission to start threads in category to be able to merge threads "
+"to it."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -2723,20 +2721,24 @@ msgid "You are banned"
 msgstr "Вы заблокированы"
 
 #: static/misago/js/misago.js:1
-msgid "You have to accept the terms of service."
-msgstr ""
+msgid "Valid password must be at least %(limit_value)s character long."
+msgid_plural "Valid password must be at least %(limit_value)s characters long."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
 
 #: static/misago/js/misago.js:1
 msgid "You have to accept the privacy policy."
 msgstr ""
 
 #: static/misago/js/misago.js:1
-msgid "Username must be at least %(limit_value)s character long."
-msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgid "You have to accept the terms of service."
+msgstr ""
+
+#: static/misago/js/misago.js:1
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr "Имя пользователя может содержать только латинские буквы и цифры."
 
 #: static/misago/js/misago.js:1
 msgid "Username cannot be longer than %(limit_value)s character."
@@ -2747,13 +2749,8 @@ msgstr[2] ""
 msgstr[3] ""
 
 #: static/misago/js/misago.js:1
-msgid "Username can only contain latin alphabet letters and digits."
-msgstr "Имя пользователя может содержать только латинские буквы и цифры."
-
-#: static/misago/js/misago.js:1
-msgid "Valid password must be at least %(limit_value)s character long."
-msgid_plural ""
-"Valid password must be at least %(limit_value)s characters long."
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""

BIN
misago/locale/tr/LC_MESSAGES/django.mo


+ 214 - 333
misago/locale/tr/LC_MESSAGES/django.po

@@ -2,27 +2,29 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # ReYHa <reha.akalan@gmail.com>, 2017
 # orkun bademli <orkunbademli@gmail.com>, 2017
 # Yiğitcan Uçan <ucanyiit@gmail.com>, 2017
 # Gökhan KURT <gokurt@bilkent.edu.tr>, 2018
 # bedirhan doğan yılmaz <bedirhandoganyilmaz@gmail.com>, 2018
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-13 18:22+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
-"Last-Translator: bedirhan doğan yılmaz <bedirhandoganyilmaz@gmail.com>, 2018\n"
-"Language-Team: Turkish (Turkey) (https://www.transifex.com/misago/teams/65369/tr_TR/)\n"
+"Last-Translator: bedirhan doğan yılmaz <bedirhandoganyilmaz@gmail.com>, "
+"2018\n"
+"Language-Team: Turkish (Turkey) (https://www.transifex.com/misago/"
+"teams/65369/tr_TR/)\n"
+"Language: tr_TR\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: tr_TR\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 #: acl/admin/__init__.py:24 templates/misago/acl_debug.html:16
@@ -217,7 +219,7 @@ msgstr "Kapalı bölüm"
 msgid "Only members with valid permissions can post in closed categories."
 msgstr "Sadece geçerli izni olan üyeler kapalı kategorilerde ileti yapabilir."
 
-#: categories/admin/forms.py:70 conf/admin/__init__.py:93
+#: categories/admin/forms.py:70 conf/admin/__init__.py:79
 #: templates/misago/admin/categories/list.html:19
 #: templates/misago/admin/dashboard/totals.html:19
 #: templates/misago/navbar.html:20 templates/misago/navbar.html:36
@@ -231,7 +233,7 @@ msgstr "Sadece geçerli izni olan üyeler kapalı kategorilerde ileti yapabilir.
 #: templates/misago/threadslist/threads.html:42
 #: templates/misago/threadslist/threads.html:66
 #: threads/permissions/threads.py:73 threads/permissions/threads.py:104
-#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:106
+#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:97
 msgid "Threads"
 msgstr "Konular"
 
@@ -266,8 +268,8 @@ msgstr "Konu yaşı"
 
 #: categories/admin/forms.py:95
 msgid ""
-"Prune thread if number of days since its creation is greater than specified."
-" Enter 0 to disable this pruning criteria."
+"Prune thread if number of days since its creation is greater than specified. "
+"Enter 0 to disable this pruning criteria."
 msgstr ""
 "Eğer konu, oluşturulduğundan beri var olan gün sayısı, belirtilenden daha "
 "büyükse kısaltınız. Bu kısaltma kriterini etkisiz kılmak için 0 giriniz."
@@ -281,9 +283,8 @@ msgid ""
 "Prune thread if number of days since last reply is greater than specified. "
 "Enter 0 to disable this pruning criteria."
 msgstr ""
-"Eğer konu, en son gelen yanıtlamadan beri var olan gün sayısı, belirtilenden"
-" daha büyükse kısaltınız. Bu kısaltma kriterini etkisiz kılmak için 0 "
-"giriniz."
+"Eğer konu, en son gelen yanıtlamadan beri var olan gün sayısı, belirtilenden "
+"daha büyükse kısaltınız. Bu kısaltma kriterini etkisiz kılmak için 0 giriniz."
 
 #: categories/admin/forms.py:126
 msgid "Permissions cannot be copied from category into itself."
@@ -305,8 +306,7 @@ msgstr "İzinleri kopyalama"
 msgid ""
 "You can replace this category permissions with permissions copied from "
 "category selected here."
-msgstr ""
-"Bu bölüm iznini buradan seçilen bölüm izniyle yer değiştirebilirsiniz."
+msgstr "Bu bölüm iznini buradan seçilen bölüm izniyle yer değiştirebilirsiniz."
 
 #: categories/admin/forms.py:167
 msgid "Don't copy permissions"
@@ -318,8 +318,7 @@ msgstr "Kayıtlar"
 
 #: categories/admin/forms.py:173
 msgid ""
-"Instead of being deleted, pruned threads can be moved to designated "
-"category."
+"Instead of being deleted, pruned threads can be moved to designated category."
 msgstr "Kısaltılmış konular, silinmek yerine atanmış bölüm e taşınmaktadır."
 
 #: categories/admin/forms.py:177
@@ -351,8 +350,7 @@ msgid "Move child categories to"
 msgstr "ast kategorisini taşı"
 
 #: categories/admin/forms.py:249 categories/admin/forms.py:264
-#: templates/misago/acl_debug.html:15
-#: templates/misago/admin/roles/list.html:16
+#: templates/misago/acl_debug.html:15 templates/misago/admin/roles/list.html:16
 msgid "Role"
 msgstr "sıfat"
 
@@ -462,20 +460,20 @@ msgstr "bölüm içeriği görülüyor"
 msgid "You don't have permission to browse \"%(category)s\" contents."
 msgstr "%(category)s bölüm içeriklerini göz atmaya izniniz bulunmamaktadır."
 
-#: conf/admin/__init__.py:45 templates/misago/admin/conf/index.html:5
+#: conf/admin/__init__.py:41 templates/misago/admin/conf/index.html:5
 #: templates/misago/admin/themes/form.html:48
 msgid "Settings"
 msgstr "Ayarlar"
 
-#: conf/admin/__init__.py:52 templates/misago/admin/socialauth/form.html:27
+#: conf/admin/__init__.py:48 templates/misago/admin/socialauth/form.html:27
 msgid "General"
 msgstr "Genel"
 
-#: conf/admin/__init__.py:53
+#: conf/admin/__init__.py:49
 msgid "Change forum details like name, description or footer."
 msgstr ""
 
-#: conf/admin/__init__.py:58 templates/misago/admin/dashboard/totals.html:7
+#: conf/admin/__init__.py:54 templates/misago/admin/dashboard/totals.html:7
 #: templates/misago/admin/users/ban.html:22 templates/misago/navbar.html:42
 #: templates/misago/userslists/base.html:5
 #: templates/misago/userslists/base.html:14 users/admin/__init__.py:74
@@ -483,38 +481,28 @@ msgstr ""
 msgid "Users"
 msgstr "Kullanicilar"
 
-#: conf/admin/__init__.py:60
+#: conf/admin/__init__.py:56
 msgid "Customize user accounts default behavior and features availability."
 msgstr ""
 
-#: conf/admin/__init__.py:67
+#: conf/admin/__init__.py:63
 msgid "Captcha"
 msgstr ""
 
-#: conf/admin/__init__.py:69
+#: conf/admin/__init__.py:65
 msgid "Setup protection against automatic registrations on the site."
 msgstr ""
 
-#: conf/admin/__init__.py:76
-msgid "Single Sign-On"
-msgstr ""
-
-#: conf/admin/__init__.py:78
-msgid ""
-"SSO enables you to delegate user login and registration from Misago tothe "
-"third party site."
-msgstr ""
-
-#: conf/admin/__init__.py:86 templates/misago/admin/dashboard/analytics.html:7
+#: conf/admin/__init__.py:72 templates/misago/admin/dashboard/analytics.html:7
 #: templates/misago/admin/dashboard/index.html:40
 msgid "Analytics"
 msgstr ""
 
-#: conf/admin/__init__.py:87
+#: conf/admin/__init__.py:73
 msgid "Enable Google Analytics or setup Google Site Verification."
 msgstr ""
 
-#: conf/admin/__init__.py:94
+#: conf/admin/__init__.py:80
 msgid "Threads, posts, polls and attachments options."
 msgstr ""
 
@@ -534,8 +522,8 @@ msgstr ""
 
 #: conf/admin/forms/analytics.py:27
 msgid ""
-"This token was extracted from uploaded site verification file. To change it,"
-" upload new verification file."
+"This token was extracted from uploaded site verification file. To change it, "
+"upload new verification file."
 msgstr ""
 
 #: conf/admin/forms/analytics.py:34
@@ -752,39 +740,6 @@ msgid ""
 "Address under which site is running appears to be \"%(address)s\"."
 msgstr ""
 
-#: conf/admin/forms/sso.py:13
-msgid "Enable Single Sign-On"
-msgstr ""
-
-#: conf/admin/forms/sso.py:15
-msgid ""
-"Enabling SSO will make login option redirect users to the server URL "
-"configured below. It will also disable option to register on forum, change "
-"username, email or passward, as those features will be delegated to the 3rd "
-"party site."
-msgstr ""
-
-#: conf/admin/forms/sso.py:22
-msgid "Public key"
-msgstr ""
-
-#: conf/admin/forms/sso.py:24 conf/admin/forms/sso.py:32
-msgid ""
-"Leave this field empty for Misago to generate this key on form submission."
-msgstr ""
-
-#: conf/admin/forms/sso.py:30
-msgid "Private key"
-msgstr ""
-
-#: conf/admin/forms/sso.py:37
-msgid "Server URL"
-msgstr ""
-
-#: conf/admin/forms/sso.py:50
-msgid "You need to enter server URL to enable SSO."
-msgstr ""
-
 #: conf/admin/forms/threads.py:27
 msgid "Daily post limit per user"
 msgstr ""
@@ -843,10 +798,10 @@ msgstr ""
 
 #: conf/admin/forms/threads.py:71
 msgid ""
-"Controls amount of data used by read-tracking system. All content older than"
-" number of days specified in this setting is considered old and read, even "
-"if the opposite is true for the user. Active forums can try lowering this "
-"value while less active ones may wish to increase it instead. "
+"Controls amount of data used by read-tracking system. All content older than "
+"number of days specified in this setting is considered old and read, even if "
+"the opposite is true for the user. Active forums can try lowering this value "
+"while less active ones may wish to increase it instead. "
 msgstr ""
 
 #: conf/admin/forms/threads.py:80
@@ -926,8 +881,8 @@ msgstr ""
 
 #: conf/admin/forms/users.py:48
 msgid ""
-"Delete new inactive accounts if they weren't activated within this number of"
-" days"
+"Delete new inactive accounts if they weren't activated within this number of "
+"days"
 msgstr ""
 
 #: conf/admin/forms/users.py:51
@@ -984,8 +939,8 @@ msgstr "Varsayılan gravatar için yedek"
 
 #: conf/admin/forms/users.py:86
 msgid ""
-"Select which avatar to use when user has no gravatar associated with their "
-"e-mail address."
+"Select which avatar to use when user has no gravatar associated with their e-"
+"mail address."
 msgstr ""
 
 #: conf/admin/forms/users.py:96
@@ -1096,44 +1051,44 @@ msgstr ""
 msgid "This value must be lower than number of users per page."
 msgstr ""
 
-#: conf/admin/views.py:40
+#: conf/admin/views.py:39
 msgid "Settings have been saved."
 msgstr ""
 
-#: core/errorpages.py:42
+#: core/errorpages.py:51
 msgid "Permission denied."
 msgstr "Izin red edildi."
 
-#: core/errorpages.py:71
+#: core/errorpages.py:80
 msgid ""
 "A problem was encountered when disconnecting your account from the remote "
 "site."
 msgstr ""
 
-#: core/errorpages.py:75
+#: core/errorpages.py:84
 msgid ""
 "You are not allowed to disconnect your account from the other site, because "
 "currently it's the only way to sign in to your account."
 msgstr ""
 
-#: core/errorpages.py:80
+#: core/errorpages.py:89
 #, python-format
 msgid "A problem was encountered when signing you in using %(backend)s."
 msgstr ""
 
-#: core/errorpages.py:84
+#: core/errorpages.py:93
 msgid "The sign in process has been canceled by user."
 msgstr ""
 
-#: core/errorpages.py:86
+#: core/errorpages.py:95
 msgid "The other service could not be reached."
 msgstr ""
 
-#: core/errorpages.py:92
+#: core/errorpages.py:101
 msgid "Unexpected problem has been encountered during sign in process."
 msgstr ""
 
-#: core/errorpages.py:113
+#: core/errorpages.py:122
 msgid ""
 "Your request was rejected because your browser didn't send the CSRF cookie, "
 "or the cookie sent was invalid."
@@ -1180,8 +1135,8 @@ msgstr ""
 #: templates/misago/admin/dashboard/checks.html:17
 #: templates/misago/admin/dashboard/index.html:33
 msgid ""
-"Version check feature relies on the API operated by the Python Package Index"
-" (pypi.org) API to retrieve latest Misago release version."
+"Version check feature relies on the API operated by the Python Package Index "
+"(pypi.org) API to retrieve latest Misago release version."
 msgstr ""
 
 #: graphql/admin/versioncheck.py:70
@@ -1508,11 +1463,11 @@ msgstr "Ara"
 msgid "Can search site"
 msgstr "Site aranabilir"
 
-#: socialauth/admin/__init__.py:42
+#: socialauth/admin/__init__.py:40
 msgid "Social login"
 msgstr ""
 
-#: socialauth/admin/__init__.py:44
+#: socialauth/admin/__init__.py:42
 msgid "Enable users to sign on and login using their social profile."
 msgstr ""
 
@@ -1535,9 +1490,9 @@ msgstr ""
 #: socialauth/admin/forms/base.py:39
 msgid ""
 "Enabling this option will result in the user being signed in if their forum "
-"account was registered using same e-mail address as used on the social site."
-" Otherwise they will be asked to specify a different e-mail to continue sign"
-" in using social site."
+"account was registered using same e-mail address as used on the social site. "
+"Otherwise they will be asked to specify a different e-mail to continue sign "
+"in using social site."
 msgstr ""
 
 #: socialauth/admin/forms/base.py:51 socialauth/admin/forms/base.py:53
@@ -1596,8 +1551,8 @@ msgstr ""
 #: socialauth/pipeline.py:88
 #, python-format
 msgid ""
-"The e-mail address associated with your %(backend)s account is not available"
-" for use on this site."
+"The e-mail address associated with your %(backend)s account is not available "
+"for use on this site."
 msgstr ""
 
 #: socialauth/pipeline.py:98
@@ -1611,18 +1566,6 @@ msgstr ""
 msgid "Please try resubmitting the form."
 msgstr "Lütfen formu tekrar deneyin."
 
-#: socialauth/views.py:23
-msgid "Please use the 3rd party site to login."
-msgstr ""
-
-#: sso/validators.py:24 users/forms/register.py:34 users/validators.py:80
-msgid "This username is not allowed."
-msgstr "Bu kullanıcı adına izin verilmiyor."
-
-#: sso/validators.py:33 users/forms/register.py:45 users/validators.py:52
-msgid "This e-mail address is not allowed."
-msgstr "Bu e-posta adresine izin verilmiyor."
-
 #: templates/misago/acl_debug.html:5
 #, python-format
 msgid ""
@@ -1674,8 +1617,8 @@ msgstr "Onay linki iste"
 
 #: templates/misago/activation/request.html:25
 msgid ""
-"The site administrator may impose a requirement on newly registered accounts"
-" to be activated before users will be able to sign in."
+"The site administrator may impose a requirement on newly registered accounts "
+"to be activated before users will be able to sign in."
 msgstr ""
 
 #: templates/misago/activation/request.html:28
@@ -2046,7 +1989,7 @@ msgstr "bölüm"
 #: templates/misago/admin/dashboard/totals.html:31
 #: templates/misago/admin/users/list.html:21
 #: templates/misago/profile/posts.html:5 templates/misago/profile/posts.html:8
-#: templates/misago/profile/posts.html:9 users/apps.py:102
+#: templates/misago/profile/posts.html:9 users/apps.py:93
 msgid "Posts"
 msgstr "iletiler"
 
@@ -2190,56 +2133,45 @@ msgstr ""
 msgid "Attachment error images"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:9
-#: templates/misago/admin/socialauth/list.html:97
-msgid "Note"
-msgstr ""
-
-#: templates/misago/admin/conf/users_settings.html:9
-msgid ""
-"Single Sign-On is enabled. Site's registration, password and deletion "
-"features have been disabled and delegated to the third-party site."
-msgstr ""
-
-#: templates/misago/admin/conf/users_settings.html:14
+#: templates/misago/admin/conf/users_settings.html:8
 msgid "New accounts"
 msgstr "Yeni hesaplar"
 
-#: templates/misago/admin/conf/users_settings.html:23 users/admin/forms.py:484
+#: templates/misago/admin/conf/users_settings.html:17 users/admin/forms.py:484
 #: users/admin/forms.py:573
 msgid "Usernames"
 msgstr "Kullanıcı adları"
 
-#: templates/misago/admin/conf/users_settings.html:33
+#: templates/misago/admin/conf/users_settings.html:27
 msgid "Avatars"
 msgstr "Avatarlar"
 
-#: templates/misago/admin/conf/users_settings.html:49
+#: templates/misago/admin/conf/users_settings.html:43
 msgid "Signatures"
 msgstr "İmzalar"
 
-#: templates/misago/admin/conf/users_settings.html:57
+#: templates/misago/admin/conf/users_settings.html:51
 #: users/admin/__init__.py:80
 msgid "Data downloads"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:66
+#: templates/misago/admin/conf/users_settings.html:60
 msgid "Own account deletion"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:74 users/admin/forms.py:492
+#: templates/misago/admin/conf/users_settings.html:68 users/admin/forms.py:492
 msgid "IP addresses"
 msgstr "IP adresleri"
 
-#: templates/misago/admin/conf/users_settings.html:82
+#: templates/misago/admin/conf/users_settings.html:76
 msgid "Default subscription preferences"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:91
+#: templates/misago/admin/conf/users_settings.html:85
 msgid "Users lists"
 msgstr ""
 
-#: templates/misago/admin/conf/users_settings.html:100
+#: templates/misago/admin/conf/users_settings.html:94
 msgid "Top posters ranking"
 msgstr ""
 
@@ -2362,9 +2294,8 @@ msgstr ""
 msgid "Site analytics are currently unavailable due to an error."
 msgstr ""
 
-#: templates/misago/admin/dashboard/totals.html:43
-#: threads/admin/__init__.py:38 threads/permissions/attachments.py:11
-#: threads/permissions/attachments.py:29
+#: templates/misago/admin/dashboard/totals.html:43 threads/admin/__init__.py:36
+#: threads/permissions/attachments.py:11 threads/permissions/attachments.py:29
 msgid "Attachments"
 msgstr "Ekler"
 
@@ -2481,20 +2412,20 @@ msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:12
 msgid ""
-"The form was sent after being opened in the browser for a long time (eg. few"
-" days) and cookie token has expired."
+"The form was sent after being opened in the browser for a long time (eg. few "
+"days) and cookie token has expired."
 msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:15
 msgid ""
-"The site is configured to use the HTTPS, but this form was sent over the the"
-" HTTP."
+"The site is configured to use the HTTPS, but this form was sent over the the "
+"HTTP."
 msgstr ""
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:16
 msgid ""
-"If you are an owner of this site, please check if the HTTPS certificate used"
-" by the site is valid and accepted by the browser."
+"If you are an owner of this site, please check if the HTTPS certificate used "
+"by the site is valid and accepted by the browser."
 msgstr ""
 
 #: templates/misago/admin/generic/filter_form.html:7
@@ -2751,8 +2682,7 @@ msgstr "Görüntülenme ve görünürlük"
 #: templates/misago/admin/ranks/list.html:17
 #: templates/misago/admin/users/list.html:19
 #: templates/misago/userslists/active_posters.html:112
-#: templates/misago/userslists/active_posters.html:123
-#: users/admin/forms.py:238
+#: templates/misago/userslists/active_posters.html:123 users/admin/forms.py:238
 msgid "Rank"
 msgstr "Rütbe"
 
@@ -2817,7 +2747,7 @@ msgid "Enabled login methods"
 msgstr ""
 
 #: templates/misago/admin/socialauth/list.html:15
-#: templates/misago/admin/socialauth/list.html:112
+#: templates/misago/admin/socialauth/list.html:106
 msgid "Provider"
 msgstr ""
 
@@ -2833,25 +2763,19 @@ msgstr ""
 msgid "Are you sure you want to disable this social login provider?"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:97
-msgid ""
-"Single Sign-On is enabled. Social authentication has been disabled and "
-"delegated to the third-party site."
-msgstr ""
-
-#: templates/misago/admin/socialauth/list.html:106
+#: templates/misago/admin/socialauth/list.html:100
 msgid "Setup new login method"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:125
+#: templates/misago/admin/socialauth/list.html:119
 msgid "Setup login with this provider"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:126
+#: templates/misago/admin/socialauth/list.html:120
 msgid "Setup"
 msgstr ""
 
-#: templates/misago/admin/socialauth/list.html:133
+#: templates/misago/admin/socialauth/list.html:127
 msgid "No new login providers are available for setup at this time."
 msgstr ""
 
@@ -3149,7 +3073,7 @@ msgstr ""
 msgid "Signature"
 msgstr "İmza"
 
-#: templates/misago/admin/users/edit.html:228 users/apps.py:27
+#: templates/misago/admin/users/edit.html:228 users/apps.py:24
 msgid "Forum options"
 msgstr "Forum ayarları"
 
@@ -3169,8 +3093,7 @@ msgstr ""
 
 #: templates/misago/admin/users/edit.html:251
 msgid ""
-"No additional action is required. This account will be deleted "
-"automatically."
+"No additional action is required. This account will be deleted automatically."
 msgstr ""
 
 #: templates/misago/admin/users/edit.html:294
@@ -3360,8 +3283,8 @@ msgstr "hesabımı etkinleştir"
 #: templates/misago/emails/change_email.txt:6
 #, python-format
 msgid ""
-"%(user)s, you are receiving this message because you have changed your "
-"e-mail address."
+"%(user)s, you are receiving this message because you have changed your e-"
+"mail address."
 msgstr ""
 "%(user)s, e-posta adresinizi değiştirdiğiniz için bu ileti alıyorsunuz."
 
@@ -3411,7 +3334,7 @@ msgid ""
 "download."
 msgstr ""
 
-#: templates/misago/emails/data_download.html:11 users/apps.py:57
+#: templates/misago/emails/data_download.html:11 users/apps.py:52
 msgid "Download data"
 msgstr ""
 
@@ -3479,8 +3402,7 @@ msgstr "Her zaman hesabınızda %(login_form)s kullanarak oturum açabilirsiniz.
 
 #: templates/misago/emails/register/complete.txt:14
 msgid "You can always sign in to your account using the form below:"
-msgstr ""
-"Her zaman aşağıdaki formu kullanarak hesabınızda oturum açabilirsiniz:"
+msgstr "Her zaman aşağıdaki formu kullanarak hesabınızda oturum açabilirsiniz:"
 
 #: templates/misago/emails/register/inactive.html:7
 #: templates/misago/emails/register/inactive.txt:10
@@ -3488,14 +3410,14 @@ msgid ""
 "Before you will be able to join discussion on our forums, one of our "
 "administrators will have to activate your account."
 msgstr ""
-"Forumlarımıza tartışmaya başlamadan önce, yöneticilerimizden biri hesabınızı"
-" etkinleştirmek zorunda kalacaklar."
+"Forumlarımıza tartışmaya başlamadan önce, yöneticilerimizden biri hesabınızı "
+"etkinleştirmek zorunda kalacaklar."
 
 #: templates/misago/emails/register/inactive.html:12
 #: templates/misago/emails/register/inactive.txt:15
 msgid ""
-"This may take a while, but you will receive e-mail with notification once it"
-" happens."
+"This may take a while, but you will receive e-mail with notification once it "
+"happens."
 msgstr ""
 "Bu biraz zaman alabilir, ancak bir kez gerçekleştiğinde bildirimle birlikte "
 "e-posta alırsınız."
@@ -3695,14 +3617,13 @@ msgid ""
 "saved to database, it is not possible for us to simply send you your "
 "password."
 msgstr ""
-"Kullanıcı şifreleri, veritabanına kaydedilmeden önce geri dönüşü olmayan bir"
-" şekilde işlendiğinden, şifrenizin size yalnızca gönderilmesi mümkün "
-"değildir."
+"Kullanıcı şifreleri, veritabanına kaydedilmeden önce geri dönüşü olmayan bir "
+"şekilde işlendiğinden, şifrenizin size yalnızca gönderilmesi mümkün değildir."
 
 #: templates/misago/forgottenpassword/request.html:39
 msgid ""
-"Instead, you can change your password using special secure form that will be"
-" available by special link valid only for your browser, for seven days or "
+"Instead, you can change your password using special secure form that will be "
+"available by special link valid only for your browser, for seven days or "
 "until your password is changed."
 msgstr ""
 "Bunun yerine, şifrenizi, yalnızca tarayıcınız için geçerli olan özel "
@@ -3720,8 +3641,8 @@ msgstr ""
 #: templates/misago/forgottenpassword/request.html:60
 msgid "To request new password reset link please enable JavaScript."
 msgstr ""
-"Yeni parola sıfırlama bağlantısı isteğinde bulunmak için lütfen JavaScript'i"
-" etkinleştirin."
+"Yeni parola sıfırlama bağlantısı isteğinde bulunmak için lütfen JavaScript'i "
+"etkinleştirin."
 
 #: templates/misago/options/credentials_changed.html:5
 #: templates/misago/options/credentials_error.html:5
@@ -3756,8 +3677,8 @@ msgstr "JavaScript'i etkinleştir"
 #: templates/misago/options/noscript.html:21
 msgid "You need to enable JavaScript in your browser to change your options."
 msgstr ""
-"Seçeneklerinizi değiştirmek için tarayıcınızda JavaScript'i etkinleştirmeniz"
-" gerekir."
+"Seçeneklerinizi değiştirmek için tarayıcınızda JavaScript'i etkinleştirmeniz "
+"gerekir."
 
 #: templates/misago/participants.html:30
 msgid "Add participant"
@@ -3836,7 +3757,7 @@ msgstr "Sonuçlara bak"
 #: templates/misago/profile/ban_details.html:5
 #: templates/misago/profile/ban_details.html:8
 #: templates/misago/profile/ban_details.html:9
-#: templates/misago/profile/ban_details.html:16 users/apps.py:137
+#: templates/misago/profile/ban_details.html:16 users/apps.py:128
 msgid "Ban details"
 msgstr "Yasaklamak ayrıntıları"
 
@@ -3885,7 +3806,7 @@ msgstr[1] "%(threads)s dizilerini başlattı."
 #: templates/misago/profile/details.html:5
 #: templates/misago/profile/details.html:8
 #: templates/misago/profile/details.html:9
-#: templates/misago/profile/details.html:19 users/apps.py:124
+#: templates/misago/profile/details.html:19 users/apps.py:115
 msgid "Details"
 msgstr "ayrıntılar"
 
@@ -3914,7 +3835,7 @@ msgstr "Bu hata, geçersiz ileti içeriği manipülasyonundan kaynaklanmaktadır
 
 #: templates/misago/profile/followers.html:5
 #: templates/misago/profile/followers.html:8
-#: templates/misago/profile/followers.html:9 users/apps.py:112
+#: templates/misago/profile/followers.html:9 users/apps.py:103
 msgid "Followers"
 msgstr "Takipçiler"
 
@@ -3943,7 +3864,7 @@ msgstr "%(username)sTakipçisi yok."
 
 #: templates/misago/profile/follows.html:5
 #: templates/misago/profile/follows.html:8
-#: templates/misago/profile/follows.html:9 users/apps.py:118
+#: templates/misago/profile/follows.html:9 users/apps.py:109
 msgid "Follows"
 msgstr "Şöyledir"
 
@@ -4031,7 +3952,7 @@ msgstr "%(username)sKonu başlatılmamış."
 
 #: templates/misago/profile/username_history.html:5
 #: templates/misago/profile/username_history.html:8
-#: templates/misago/profile/username_history.html:9 users/apps.py:130
+#: templates/misago/profile/username_history.html:9 users/apps.py:121
 msgid "Username history"
 msgstr "Kullanıcı adı geçmişi"
 
@@ -4193,8 +4114,8 @@ msgstr "%(event_by)s tarafından %(event_on)s"
 #, python-format
 msgid "%(filetype)s, %(size)s, uploaded by %(uploader)s on %(uploaded_on)s."
 msgstr ""
-"%(filetype)s,%(size)s tarafından%(uploader)s tarihinde "
-"yüklendi.%(uploaded_on)s"
+"%(filetype)s,%(size)s tarafından%(uploader)s tarihinde yüklendi."
+"%(uploaded_on)s"
 
 #: templates/misago/thread/posts/post/body-hidden.html:4
 msgid "This post is hidden. You cannot not see its contents."
@@ -4217,11 +4138,11 @@ msgstr ""
 
 #: templates/misago/thread/posts/post/flags.html:29
 msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr ""
-"Bu ileti onaylanmamıştır. Sadece yayınları ve yazarını onaylama iznine sahip"
-" kullanıcılar iletiler görebilir."
+"Bu ileti onaylanmamıştır. Sadece yayınları ve yazarını onaylama iznine sahip "
+"kullanıcılar iletiler görebilir."
 
 #: templates/misago/thread/posts/post/flags.html:35
 msgid "This post is protected. Only moderators may change it."
@@ -4412,7 +4333,7 @@ msgstr "Anket"
 
 #: templates/misago/userslists/active_posters.html:5
 #: templates/misago/userslists/active_posters.html:23
-#: templates/misago/userslists/active_posters.html:24 users/apps.py:81
+#: templates/misago/userslists/active_posters.html:24 users/apps.py:72
 msgid "Top posters"
 msgstr ""
 
@@ -4721,11 +4642,11 @@ msgstr ""
 msgid "Default Misago Theme"
 msgstr ""
 
-#: threads/admin/__init__.py:45
+#: threads/admin/__init__.py:43
 msgid "Attachment types"
 msgstr "Ataşman tipleri"
 
-#: threads/admin/__init__.py:46
+#: threads/admin/__init__.py:44
 msgid "Specify what files may be uploaded on the forum."
 msgstr ""
 
@@ -4775,8 +4696,7 @@ msgstr "Indirmeyi sınırla"
 
 #: threads/admin/forms.py:64
 msgid ""
-"List of comma separated file extensions associated with this attachment "
-"type."
+"List of comma separated file extensions associated with this attachment type."
 msgstr ""
 "Bu ek türü ile ilişkilendirilmiş virgülle ayrılmış dosya uzantılarının "
 "dizelge."
@@ -4794,8 +4714,8 @@ msgid ""
 "Maximum allowed uploaded file size for this type, in kb. May be overriden "
 "via user permission."
 msgstr ""
-"Bu tür için izin verilen maksimum dosya boyutu, kb olarak. Kullanıcı izniyle"
-" geçersiz kılınabilir."
+"Bu tür için izin verilen maksimum dosya boyutu, kb olarak. Kullanıcı izniyle "
+"geçersiz kılınabilir."
 
 #: threads/admin/forms.py:75
 msgid "Controls this attachment type availability on your site."
@@ -4810,8 +4730,8 @@ msgid ""
 msgstr ""
 "Bu türdeki dosyaları karşıya yükleme seçeneğini belirli rollerle "
 "sınırlandırmak isterseniz bunları bu dizelge seçin. Diğer, izinli tüm "
-"kullanıcıların bu tür ekleri yükleyebilmeleri için ek dosyalar yüklemek için"
-" herhangi bir rol seçmez."
+"kullanıcıların bu tür ekleri yükleyebilmeleri için ek dosyalar yüklemek için "
+"herhangi bir rol seçmez."
 
 #: threads/admin/forms.py:83
 msgid ""
@@ -4889,8 +4809,7 @@ msgstr "Ek türü \"%(name)s\" düzenlendi."
 #: threads/admin/views/attachmenttypes.py:47
 #, python-format
 msgid ""
-"Attachment type \"%(name)s\" has associated attachments and can't be "
-"deleted."
+"Attachment type \"%(name)s\" has associated attachments and can't be deleted."
 msgstr "Ek türü \"%(name)s\", ilişkili ekleri var ve silinemiyor."
 
 #: threads/admin/views/attachmenttypes.py:54
@@ -4919,8 +4838,8 @@ msgstr "Bu tür dosyalar yükleyemezsiniz."
 msgid ""
 "You can't upload files larger than %(limit)s (your file has %(upload)s)."
 msgstr ""
-"%(limit)s daha büyük dosyaları karşıya yükleyemezsiniz "
-"(dosyanızın%(upload)sye sahip olduğu)."
+"%(limit)s daha büyük dosyaları karşıya yükleyemezsiniz (dosyanızın"
+"%(upload)sye sahip olduğu)."
 
 #: threads/api/attachments.py:104
 #, python-format
@@ -4981,11 +4900,11 @@ msgid_plural ""
 "You can't attach more than %(limit_value)s flies to single post (added "
 "%(show_value)s)."
 msgstr[0] ""
-"Tek gönderiye (%(show_value)seklendiğinde)%(limit_value)s sinden fazla ileti"
-" bağlayamazsınız."
+"Tek gönderiye (%(show_value)seklendiğinde)%(limit_value)s sinden fazla ileti "
+"bağlayamazsınız."
 msgstr[1] ""
-"Tek gönderiye (%(show_value)seklendiğinde)%(limit_value)s sinden fazla ileti"
-" bağlayamazsınız."
+"Tek gönderiye (%(show_value)seklendiğinde)%(limit_value)s sinden fazla ileti "
+"bağlayamazsınız."
 
 #: threads/api/postingendpoint/category.py:45
 msgid "You have to select category to post thread in."
@@ -5027,8 +4946,7 @@ msgstr ""
 msgid ""
 "You can't include yourself on the list of users to invite to new thread."
 msgstr ""
-"Kendinizi yeni konu ya davet edecek kullanıcıların dizelge dahil "
-"edemezsiniz."
+"Kendinizi yeni konu ya davet edecek kullanıcıların dizelge dahil edemezsiniz."
 
 #: threads/api/postingendpoint/participants.py:61
 msgid "You have to enter user names."
@@ -5043,11 +4961,11 @@ msgid_plural ""
 "You can't add more than %(users)s users to private thread (you've added "
 "%(added)s)."
 msgstr[0] ""
-"konu ya %(users)s 'dan fazla kullanıcı ekleyemezsiniz (%(added)s eklediğiniz"
-" kişileri eklediniz)."
+"konu ya %(users)s 'dan fazla kullanıcı ekleyemezsiniz (%(added)s eklediğiniz "
+"kişileri eklediniz)."
 msgstr[1] ""
-"konu ya %(users)s 'dan fazla kullanıcı ekleyemezsiniz (%(added)s eklediğiniz"
-" kişileri eklediniz)."
+"konu ya %(users)s 'dan fazla kullanıcı ekleyemezsiniz (%(added)s eklediğiniz "
+"kişileri eklediniz)."
 
 #: threads/api/postingendpoint/participants.py:93
 #, python-format
@@ -5109,8 +5027,7 @@ msgstr ""
 
 #: threads/api/threadendpoints/patch.py:273
 msgid ""
-"This post can't be unmarked because it's not currently marked as best "
-"answer."
+"This post can't be unmarked because it's not currently marked as best answer."
 msgstr ""
 
 #: threads/api/threadendpoints/patch.py:301
@@ -5219,7 +5136,8 @@ msgstr "Konu yu silmeden orijinal ileti silemezsiniz."
 
 #: threads/participants.py:142
 #, python-format
-msgid "%(user)s has invited you to participate in private thread \"%(thread)s\""
+msgid ""
+"%(user)s has invited you to participate in private thread \"%(thread)s\""
 msgstr "%(user)s konu \"%(thread)s\" adlı özel konu davet etti."
 
 #: threads/permissions/attachments.py:14
@@ -5310,8 +5228,8 @@ msgstr ""
 #: threads/permissions/bestanswers.py:188
 #, python-format
 msgid ""
-"You don't have permission to change this thread's marked answer because it's"
-" in the \"%(category)s\" category."
+"You don't have permission to change this thread's marked answer because it's "
+"in the \"%(category)s\" category."
 msgstr ""
 
 #: threads/permissions/bestanswers.py:198
@@ -5374,8 +5292,8 @@ msgstr ""
 
 #: threads/permissions/bestanswers.py:274
 msgid ""
-"You can't unmark this thread's best answer because it's closed and you don't"
-" have permission to open it."
+"You can't unmark this thread's best answer because it's closed and you don't "
+"have permission to open it."
 msgstr ""
 
 #: threads/permissions/bestanswers.py:282
@@ -5593,8 +5511,8 @@ msgstr "Özel konuları tutanak edebilir miyim "
 
 #: threads/permissions/privatethreads.py:52
 msgid ""
-"Allows user to report private threads they are participating in, making them"
-" accessible to moderators."
+"Allows user to report private threads they are participating in, making them "
+"accessible to moderators."
 msgstr ""
 "Kullanıcının katıldığı özel konuları tutanak edebilmesini ve bunları "
 "moderatörlerin erişebilmesini sağlar."
@@ -5665,8 +5583,7 @@ msgstr "%(user)sözel konulara davetiye vermiyor."
 #: threads/permissions/privatethreads.py:288
 #, python-format
 msgid "%(user)s limits invitations to private threads to followed users."
-msgstr ""
-"%(user)stakip eden kullanıcılara özel davetlerin davetlerini sınırlar."
+msgstr "%(user)stakip eden kullanıcılara özel davetlerin davetlerini sınırlar."
 
 #: threads/permissions/threads.py:76
 msgid "Can see unapproved content list"
@@ -5676,11 +5593,11 @@ msgstr "Onaylanmamış içerik dizelge görebilirsiniz"
 msgid ""
 "Allows access to \"unapproved\" tab on threads lists for easy listing of "
 "threads that are unapproved or contain unapproved posts. Despite the tab "
-"being available on all threads lists, it will only display threads belonging"
-" to categories in which the user has permission to approve content."
+"being available on all threads lists, it will only display threads belonging "
+"to categories in which the user has permission to approve content."
 msgstr ""
-"Onaylanmamış veya onaylanmamış iletiler içeren iş parçalarının kolay listesi"
-" için, konu listelerindeki \"onaylanmamış\" sekmesine erişim izni verir. "
+"Onaylanmamış veya onaylanmamış iletiler içeren iş parçalarının kolay listesi "
+"için, konu listelerindeki \"onaylanmamış\" sekmesine erişim izni verir. "
 "Sekmenin tüm ipliklerin listelerinde bulunmasına rağmen, yalnızca "
 "kullanıcının içeriği onaylama iznine sahip olduğu kategorilere ait konuları "
 "görüntüler."
@@ -5698,8 +5615,8 @@ msgid ""
 msgstr ""
 "Bildirilen iletiler içeren konular kolay listelendiği iş parçacıkları "
 "listelerindeki \"bildirilenler\" sekmesine erişim izni verir. Sekmenin tüm "
-"kategori konuları listelerinde mevcut olmasına rağmen, yalnızca kullanıcının"
-" iletiler raporlarını görme iznine sahip olduğu kategorilere ait konuları "
+"kategori konuları listelerinde mevcut olmasına rağmen, yalnızca kullanıcının "
+"iletiler raporlarını görme iznine sahip olduğu kategorilere ait konuları "
 "görüntüler."
 
 #: threads/permissions/threads.py:98
@@ -5850,8 +5767,7 @@ msgstr "iletiler korumak"
 
 #: threads/permissions/threads.py:200
 msgid "Only users with this permission can edit protected posts."
-msgstr ""
-"Yalnızca bu iznine sahip kullanıcılar korunan iletiler düzenleyebilir."
+msgstr "Yalnızca bu iznine sahip kullanıcılar korunan iletiler düzenleyebilir."
 
 #: threads/permissions/threads.py:203
 msgid "Can move posts"
@@ -6593,19 +6509,16 @@ msgstr[1] ""
 
 #: threads/serializers/poll.py:134
 msgid "Number of allowed choices can't be greater than number of all choices."
-msgstr ""
-"İzin verilen seçenek sayısı, tüm seçeneklerin sayısından büyük olamaz."
+msgstr "İzin verilen seçenek sayısı, tüm seçeneklerin sayısından büyük olamaz."
 
 #: threads/serializers/pollvote.py:15
 #, python-format
 msgid "This poll disallows voting for more than %(choices)s choice."
 msgid_plural "This poll disallows voting for more than %(choices)s choices."
 msgstr[0] ""
-"Bu anket oyların %(choices)s seçimlerin sayısından fazla olmasını "
-"engelliyor."
+"Bu anket oyların %(choices)s seçimlerin sayısından fazla olmasını engelliyor."
 msgstr[1] ""
-"Bu anket oyların %(choices)s seçimlerin sayısından fazla olmasını "
-"engelliyor."
+"Bu anket oyların %(choices)s seçimlerin sayısından fazla olmasını engelliyor."
 
 #: threads/serializers/pollvote.py:32
 msgid "One or more of poll choices were invalid."
@@ -6678,11 +6591,11 @@ msgid_plural ""
 "Thread title should be at least %(limit_value)s characters long (it has "
 "%(show_value)s)."
 msgstr[0] ""
-"Konu başlığı en az %(limit_value)s karakter uzunluğunda olmalıdır(  "
-"%(show_value)s değerine sahiptir)."
+"Konu başlığı en az %(limit_value)s karakter uzunluğunda "
+"olmalıdır(  %(show_value)s değerine sahiptir)."
 msgstr[1] ""
-"Konu başlığı en az %(limit_value)s karakter uzunluğunda olmalıdır(  "
-"%(show_value)s değerine sahiptir)."
+"Konu başlığı en az %(limit_value)s karakter uzunluğunda "
+"olmalıdır(  %(show_value)s değerine sahiptir)."
 
 #: threads/validators.py:63
 #, python-format
@@ -6829,8 +6742,8 @@ msgstr "Yönetici mi"
 #: users/admin/forms.py:78
 msgid ""
 "Designates whether the user can log into admin sites. If Django admin site "
-"is enabled, this user will need additional permissions assigned within it to"
-" admin Django modules."
+"is enabled, this user will need additional permissions assigned within it to "
+"admin Django modules."
 msgstr ""
 "Kullanıcının admin sitelerine giriş yapıp giriş yapamayacağını belirtir. "
 "Django admin sitesi etkinleştirilmişse, bu kullanıcının admin Django "
@@ -6859,8 +6772,8 @@ msgid ""
 "is non-destructible way to remove user accounts."
 msgstr ""
 "Bu kullanıcının aktif olarak muamele edilmesi gerekip gerekmediğini "
-"belirtir. Bu işlevi kapatmak, kullanıcı hesaplarını kaldırmanın yıkılmaz bir"
-" yoludur."
+"belirtir. Bu işlevi kapatmak, kullanıcı hesaplarını kaldırmanın yıkılmaz bir "
+"yoludur."
 
 #: users/admin/forms.py:97 users/admin/forms.py:128 users/admin/forms.py:158
 msgid "Staff message"
@@ -6887,8 +6800,8 @@ msgid ""
 "Setting this to yes will stop user from changing his/her avatar, and will "
 "reset his/her avatar to procedurally generated one."
 msgstr ""
-"Bunu evet olarak ayarlamak, kullanıcının avatarını değiştirmesini durduracak"
-" ve avatarını usulle üretilen birine sıfırlayacaktır."
+"Bunu evet olarak ayarlamak, kullanıcının avatarını değiştirmesini durduracak "
+"ve avatarını usulle üretilen birine sıfırlayacaktır."
 
 #: users/admin/forms.py:119 users/admin/forms.py:150 users/admin/forms.py:457
 #: users/admin/forms.py:524
@@ -7016,8 +6929,8 @@ msgstr "Kullanıcı başlığı"
 
 #: users/admin/forms.py:397
 msgid ""
-"Optional, singular version of rank name displayed by user names. For example"
-" \"GM\" or \"Dev\"."
+"Optional, singular version of rank name displayed by user names. For example "
+"\"GM\" or \"Dev\"."
 msgstr ""
 "Sıralama isminin isteğe bağlı, tekil hali kullanıcı adlarıyla gösterilir. "
 "Örneğin \"GM\" veya \"Dev\"."
@@ -7118,8 +7031,8 @@ msgid ""
 "existing users."
 msgstr ""
 "Bunu evet olarak değiştirmek, bu Yasaklamak kontrol ettirmek için sadece "
-"kayıt aşamasında yapılmalıdır. Bu, mevcut kullanıcılara zarar vermeden, kısa"
-" süre önce hesaplanan e-posta sağlayıcılarından gelen gibi bazı kayıtları "
+"kayıt aşamasında yapılmalıdır. Bu, mevcut kullanıcılara zarar vermeden, kısa "
+"süre önce hesaplanan e-posta sağlayıcılarından gelen gibi bazı kayıtları "
 "engellemek istiyorsanız iyi olur."
 
 #: users/admin/forms.py:512
@@ -7170,8 +7083,8 @@ msgstr ""
 
 #: users/admin/forms.py:624
 msgid ""
-"Enter every item in new line. Duplicates will be ignored. This field is case"
-" insensitive. Depending on site configuration and amount of data to archive "
+"Enter every item in new line. Duplicates will be ignored. This field is case "
+"insensitive. Depending on site configuration and amount of data to archive "
 "it may take up to few days for requests to complete. E-mail will "
 "notification will be sent to every user once their download is ready."
 msgstr ""
@@ -7410,26 +7323,21 @@ msgstr "Yeni kullanıcı \"%(user)s\" kaydedildi."
 msgid "User \"%(user)s\" has been edited."
 msgstr "Kullanıcı \"%(user)s\" düzenlendi."
 
-#: users/api/auth.py:42 users/api/auth.py:92 users/api/auth.py:130
-#: users/api/auth.py:174
-msgid "Please use the 3rd party site to authenticate."
-msgstr ""
-
-#: users/api/auth.py:100
+#: users/api/auth.py:94
 #, python-format
 msgid "Activate %(user)s account on %(forum_name)s forums"
 msgstr "%(user)s hesabını %(forum_name)s forumlarında etkinleştir"
 
-#: users/api/auth.py:138
+#: users/api/auth.py:129
 #, python-format
 msgid "Change %(user)s password on %(forum_name)s forums"
 msgstr "%(user)s 'un şifresini %(forum_name)s forumlarında değiştir"
 
-#: users/api/auth.py:176
+#: users/api/auth.py:164
 msgid "Form link is invalid. Please try again."
 msgstr "Form bağlantısı geçersiz. Lütfen tekrar deneyin."
 
-#: users/api/auth.py:177
+#: users/api/auth.py:165
 msgid "Your link has expired. Please request new one."
 msgstr "Bağlantınızın süresi doldu. Lütfen yeni bir tane talep edin."
 
@@ -7532,83 +7440,63 @@ msgstr "Diğer kullanıcıların ad geçmişini izlemek için izniniz yok."
 msgid "You have to sign in to perform this action."
 msgstr "Bu işlemi gerçekleştirmek için oturum açmanız gerekir."
 
-#: users/api/users.py:90
-msgid "Please use the 3rd party site to register."
-msgstr ""
-
-#: users/api/users.py:113
+#: users/api/users.py:110
 msgid "You can't change other users avatars."
 msgstr "Diğer avatarları değiştiremezsiniz."
 
-#: users/api/users.py:125
+#: users/api/users.py:122
 msgid "You can't change other users options."
 msgstr "Diğer kullanıcı seçeneklerini değiştiremezsiniz."
 
-#: users/api/users.py:130
+#: users/api/users.py:127
 msgid "Your forum options have been changed."
 msgstr "Forum seçenekleriniz değiştirildi."
 
-#: users/api/users.py:137
-msgid "Please use the 3rd party site to change your username."
-msgstr ""
-
-#: users/api/users.py:141
+#: users/api/users.py:133
 msgid "You can't change other users names."
 msgstr "Diğer kullanıcı adlarını değiştiremezsiniz."
 
-#: users/api/users.py:148
+#: users/api/users.py:140
 msgid "You can't change other users signatures."
 msgstr "Diğer kullanıcı imzalarını değiştiremezsiniz."
 
-#: users/api/users.py:161
-msgid "Please use the 3rd party site to change your password."
-msgstr ""
-
-#: users/api/users.py:165
+#: users/api/users.py:152
 msgid "You can't change other users passwords."
 msgstr "Diğer kullanıcıların şifrelerini değiştiremezsiniz."
 
-#: users/api/users.py:175
-msgid "Please use the 3rd party site to change your e-mail."
-msgstr ""
-
-#: users/api/users.py:180
+#: users/api/users.py:162
 msgid "You can't change other users e-mail addresses."
 msgstr "Diğer kullanıcıların e-posta adreslerini değiştiremezsiniz."
 
-#: users/api/users.py:211
-msgid "Please use the 3rd party site to delete account."
-msgstr ""
-
-#: users/api/users.py:292
+#: users/api/users.py:269
 msgid "You can't request data downloads for other users."
 msgstr ""
 
-#: users/api/users.py:296
+#: users/api/users.py:273
 msgid "You can't download your data."
 msgstr ""
 
-#: users/api/users.py:301
+#: users/api/users.py:278
 msgid "You can't have more than one data download request at a single time."
 msgstr ""
 
-#: users/api/users.py:358
+#: users/api/users.py:335
 msgid "You can't see other users data downloads."
 msgstr ""
 
-#: users/apps.py:33
+#: users/apps.py:30
 msgid "Edit details"
 msgstr "Detayları düzenle"
 
-#: users/apps.py:39
+#: users/apps.py:36
 msgid "Change username"
 msgstr "Kullanıcı adını değiştir"
 
-#: users/apps.py:46
+#: users/apps.py:42
 msgid "Change email or password"
 msgstr "E-posta veya şifre değiştir"
 
-#: users/apps.py:71
+#: users/apps.py:63
 msgid "Delete account"
 msgstr ""
 
@@ -7687,7 +7575,7 @@ msgstr "Email adresini gir."
 msgid "No user with this e-mail exists."
 msgstr "Bu e-postayla hiçbir kullanıcı mevcut değil."
 
-#: users/forms/auth.py:150 users/views/activation.py:51
+#: users/forms/auth.py:150 users/views/activation.py:46
 #, python-format
 msgid "%(user)s, your account is already active."
 msgstr "%(user)s, hesabınız zaten aktif."
@@ -7709,6 +7597,14 @@ msgid ""
 "request new password."
 msgstr "Yönetici, yeni şifre isteyebilmek için hesabınızı etkinleştirmelidir."
 
+#: users/forms/register.py:34 users/validators.py:80
+msgid "This username is not allowed."
+msgstr "Bu kullanıcı adına izin verilmiyor."
+
+#: users/forms/register.py:45 users/validators.py:52
+msgid "This e-mail address is not allowed."
+msgstr "Bu e-posta adresine izin verilmiyor."
+
 #: users/forms/register.py:51
 msgid "This agreement is required."
 msgstr ""
@@ -8121,9 +8017,9 @@ msgstr "Websitesi"
 
 #: users/profilefields/default.py:41
 msgid ""
-"If you own website in the internet you wish to share on your profile you may"
-" enter its address here. Remember to for it to be valid http address "
-"starting with either \"http://\" or \"https://\"."
+"If you own website in the internet you wish to share on your profile you may "
+"enter its address here. Remember to for it to be valid http address starting "
+"with either \"http://\" or \"https://\"."
 msgstr ""
 "Kendi internet siteni kimlik paylaşmak istiyorsan adresini buraya "
 "girebilirsin.Unutma http adresi''http://'' ya da ''https://'' başlayarak "
@@ -8148,9 +8044,9 @@ msgstr "Twitter kolu"
 #: users/profilefields/default.py:62
 #, python-format
 msgid ""
-"If you own Twitter account, here you may enter your Twitter handle for other"
-" users to find you. Starting your handle with \"@\" sign is optional. Either"
-" \"@%(slug)s\" or \"%(slug)s\" are valid values."
+"If you own Twitter account, here you may enter your Twitter handle for other "
+"users to find you. Starting your handle with \"@\" sign is optional. Either "
+"\"@%(slug)s\" or \"%(slug)s\" are valid values."
 msgstr ""
 "Twitter hesabına sahipseniz, burada diğer kullanıcıların sizi bulması için "
 "Twitter tutamacını girebilirsiniz. Kolunuzu \"@\" işaretiyle başlatmak "
@@ -8239,10 +8135,8 @@ msgstr ""
 #, python-format
 msgid "Username must be at least %(limit_value)s character long."
 msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] ""
-"Kullanıcı adı en az %(limit_value)s karakter uzunluğunda olmalıdır."
-msgstr[1] ""
-"Kullanıcı adı en az %(limit_value)s karakter uzunluğunda olmalıdır."
+msgstr[0] "Kullanıcı adı en az %(limit_value)s karakter uzunluğunda olmalıdır."
+msgstr[1] "Kullanıcı adı en az %(limit_value)s karakter uzunluğunda olmalıdır."
 
 #: users/validators.py:101
 #, python-format
@@ -8259,11 +8153,7 @@ msgstr "Girilen veriler spam verici veritabanında bulundu."
 msgid "This email is not allowed."
 msgstr "Bu e-postaya izin verilmiyor."
 
-#: users/views/activation.py:21
-msgid "Please use the 3rd party site to activate your account."
-msgstr ""
-
-#: users/views/activation.py:56
+#: users/views/activation.py:51
 #, python-format
 msgid ""
 "%(user)s, your activation link is invalid. Try again or request new "
@@ -8272,40 +8162,31 @@ msgstr ""
 "%(user)s, etkinleştirme bağlantınız geçersiz. Tekrar deneyin veya yeni "
 "etkinleştirme bağlantısı isteğinde bulunun."
 
-#: users/views/activation.py:74
+#: users/views/activation.py:69
 #, python-format
 msgid "%(user)s, your account has been activated!"
 msgstr "%(user)s, hesabınız aktive edildi!"
 
-#: users/views/forgottenpassword.py:18 users/views/options.py:70
-msgid "Please use the 3rd party site to change password."
-msgstr ""
-
-#: users/views/forgottenpassword.py:45
+#: users/views/forgottenpassword.py:31
 #, python-format
-msgid ""
-"%(user)s, your link has expired. Please request new link and try again."
+msgid "%(user)s, your link has expired. Please request new link and try again."
 msgstr ""
-"%(user)s, bağlantınızın süresi doldu. Lütfen yeni bağlantı isteğinde bulunup"
-" tekrar deneyin."
+"%(user)s, bağlantınızın süresi doldu. Lütfen yeni bağlantı isteğinde bulunup "
+"tekrar deneyin."
 
-#: users/views/forgottenpassword.py:52
+#: users/views/forgottenpassword.py:38
 #, python-format
 msgid "%(user)s, your link is invalid. Please try again or request new link."
 msgstr ""
-"%(user)s, bağlantınız geçersiz. Lütfen tekrar deneyin veya yeni bir bağlantı"
-" isteğinde bulunun."
-
-#: users/views/options.py:47
-msgid "Please use the 3rd party site to change e-mail."
-msgstr ""
+"%(user)s, bağlantınız geçersiz. Lütfen tekrar deneyin veya yeni bir bağlantı "
+"isteğinde bulunun."
 
-#: users/views/options.py:59
+#: users/views/options.py:56
 #, python-format
 msgid "%(user)s, your e-mail has been changed."
 msgstr "%(user)s, e-postanız değiştirildi."
 
-#: users/views/options.py:80
+#: users/views/options.py:74
 #, python-format
 msgid "%(user)s, your password has been changed."
 msgstr "%(user)s, Şifreniz değiştirildi."

BIN
misago/locale/tr/LC_MESSAGES/djangojs.mo


+ 76 - 83
misago/locale/tr/LC_MESSAGES/djangojs.po

@@ -2,7 +2,7 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # Mesut GÜLECEN <mesutgulecen@hotmail.com>, 2017
 # Yiğit Tanrıverdi <x_game92@hotmail.com>, 2017
@@ -13,20 +13,21 @@
 # Bilal Akgül <billakgl@gmail.com>, 2018
 # gülce abatay <gulceabatay@gmail.com>, 2018
 # Arda Asik (Student) <ardaasik@sabanciuniv.edu>, 2020
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Arda Asik (Student) <ardaasik@sabanciuniv.edu>, 2020\n"
-"Language-Team: Turkish (Turkey) (https://www.transifex.com/misago/teams/65369/tr_TR/)\n"
+"Language-Team: Turkish (Turkey) (https://www.transifex.com/misago/"
+"teams/65369/tr_TR/)\n"
+"Language: tr_TR\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: tr_TR\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 #: static/misago/admin/index.js:16
@@ -393,8 +394,8 @@ msgstr "En iyi cevap"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Please select the best answer for your newly merged thread. No posts will be"
-" deleted during the merge."
+"Please select the best answer for your newly merged thread. No posts will be "
+"deleted during the merge."
 msgstr ""
 "Lütfen yeni birleştirdiğiniz konu için en iyi cevabı seçin. Birleştirme "
 "sırasında iletiler silinmez."
@@ -496,8 +497,8 @@ msgstr "Hesabı sil"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You are going to delete your account. This action is nonreversible, and will"
-" result in following data being deleted:"
+"You are going to delete your account. This action is nonreversible, and will "
+"result in following data being deleted:"
 msgstr ""
 "Hesabınızı silmek üzeresiniz. Bu aksiyon geri alınamaz ve aşağıdaki "
 "verilerin kaybolmasına sebep olur:"
@@ -520,8 +521,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"All your posted content will NOT be deleted, but username associated with it"
-" will be changed to one shared by all deleted accounts."
+"All your posted content will NOT be deleted, but username associated with it "
+"will be changed to one shared by all deleted accounts."
 msgstr ""
 
 #: static/misago/js/misago.js:1
@@ -632,8 +633,8 @@ msgid ""
 "If you hide your presence, only members with permission to see hidden users "
 "will see when you are online."
 msgstr ""
-"Gizliliğinizi aktifleştirirseniz, sadece gizli kullanıcıları görmeye yetkisi"
-" olan üyeler sizi çevrimiçi görebileceklerdir."
+"Gizliliğinizi aktifleştirirseniz, sadece gizli kullanıcıları görmeye yetkisi "
+"olan üyeler sizi çevrimiçi görebileceklerdir."
 
 #: static/misago/js/misago.js:1
 msgid "Hide my presence from other users"
@@ -716,6 +717,10 @@ msgid "Change forgotten password"
 msgstr "Unutulan şifreni değiştir"
 
 #: static/misago/js/misago.js:1
+msgid "%(user)s has been made new thread owner."
+msgstr "1%(kullanıcı)lar bu konuya yönetici atandı."
+
+#: static/misago/js/misago.js:1
 msgid "You have left this thread."
 msgstr "Bu konuyu terkettiniz"
 
@@ -724,10 +729,6 @@ msgid "%(user)s has been removed from this thread."
 msgstr "1%(kullanıcı)lar bu konudan silindi."
 
 #: static/misago/js/misago.js:1
-msgid "%(user)s has been made new thread owner."
-msgstr "1%(kullanıcı)lar bu konuya yönetici atandı."
-
-#: static/misago/js/misago.js:1
 msgid "See profile"
 msgstr "Profili gör"
 
@@ -742,8 +743,8 @@ msgstr "Bu konuyu sonlandırmak istediğinize emin misiniz?"
 #: static/misago/js/misago.js:1
 msgid "Are you sure you want to change thread owner to %(user)s?"
 msgstr ""
-"Konunun yöneticisini 1%(kullanıcı)lar olarak degiştirmek istediğinizden emin"
-" misiniz?"
+"Konunun yöneticisini 1%(kullanıcı)lar olarak degiştirmek istediğinizden emin "
+"misiniz?"
 
 #: static/misago/js/misago.js:1
 msgid "Make owner"
@@ -990,8 +991,7 @@ msgstr "Geriye almak"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you with to revert this post to the state from before this "
-"edit?"
+"Are you sure you with to revert this post to the state from before this edit?"
 msgstr "Bu ileti düzenlemeden önceki haline döner emin misiniz?"
 
 #: static/misago/js/misago.js:1
@@ -1420,18 +1420,18 @@ msgstr ""
 "görebilir."
 
 #: static/misago/js/misago.js:1
-msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
-msgstr ""
-"Bu ileti onaylanmamıştır. Sadece yayınları ve yazarını onaylama iznine sahip"
-" kullanıcılar iletiler görebilir."
-
-#: static/misago/js/misago.js:1
 msgid "This post is protected. Only moderators may change it."
 msgstr "Korunan ileti. Yalnızca moderatörler değiştirebilir."
 
 #: static/misago/js/misago.js:1
+msgid ""
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
+msgstr ""
+"Bu ileti onaylanmamıştır. Sadece yayınları ve yazarını onaylama iznine sahip "
+"kullanıcılar iletiler görebilir."
+
+#: static/misago/js/misago.js:1
 msgid "Liked"
 msgstr "Beğenilen"
 
@@ -1530,34 +1530,6 @@ msgid "%(username)s's details have been updated."
 msgstr "%(username)skullanıcısının detayları güncellendi."
 
 #: static/misago/js/misago.js:1
-msgid "You have no started threads."
-msgstr "Başlatılmış sana ait konular yok."
-
-#: static/misago/js/misago.js:1
-msgid "%(username)s started no threads."
-msgstr "%(username)s kullanıcısına ait başlatılmış konular yok"
-
-#: static/misago/js/misago.js:1
-msgid "You have started %(threads)s thread."
-msgid_plural "You have started %(threads)s threads."
-msgstr[0] "Sana ait %(threads)s adet başlatılmış konular var."
-msgstr[1] "Sana ait %(threads)s adet başlatılmış konular var."
-
-#: static/misago/js/misago.js:1
-msgid "%(username)s has started %(threads)s thread."
-msgid_plural "%(username)s has started %(threads)s threads."
-msgstr[0] "%(username)s adlı kullanıcı %(threads)skonular ını başlattı."
-msgstr[1] "%(username)s adlı kullanıcı %(threads)skonular ını başlattı."
-
-#: static/misago/js/misago.js:1
-msgid "Loading..."
-msgstr "Yükleniyor..."
-
-#: static/misago/js/misago.js:1
-msgid "Threads"
-msgstr "Konular"
-
-#: static/misago/js/misago.js:1
 msgid "You have posted no messages."
 msgstr "Gönderilmiş bir mesaj yok."
 
@@ -1578,10 +1550,38 @@ msgstr[0] "%(username)s kullanıcısının %(posts)s mesajı var."
 msgstr[1] "%(username)s kullanıcısının %(posts)s mesajı var."
 
 #: static/misago/js/misago.js:1
+msgid "Loading..."
+msgstr "Yükleniyor..."
+
+#: static/misago/js/misago.js:1
 msgid "Posts"
 msgstr "İletiler"
 
 #: static/misago/js/misago.js:1
+msgid "You have no started threads."
+msgstr "Başlatılmış sana ait konular yok."
+
+#: static/misago/js/misago.js:1
+msgid "%(username)s started no threads."
+msgstr "%(username)s kullanıcısına ait başlatılmış konular yok"
+
+#: static/misago/js/misago.js:1
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
+msgstr[0] "Sana ait %(threads)s adet başlatılmış konular var."
+msgstr[1] "Sana ait %(threads)s adet başlatılmış konular var."
+
+#: static/misago/js/misago.js:1
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
+msgstr[0] "%(username)s adlı kullanıcı %(threads)skonular ını başlattı."
+msgstr[1] "%(username)s adlı kullanıcı %(threads)skonular ını başlattı."
+
+#: static/misago/js/misago.js:1
+msgid "Threads"
+msgstr "Konular"
+
+#: static/misago/js/misago.js:1
 msgid "Show older activity"
 msgstr "Geçmiş aktiviteyi göster."
 
@@ -2060,8 +2060,7 @@ msgstr "%(user)s tarafından son cevaplama tarihi %(date)s"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you want to merge selected posts? This action is not "
-"reversible!"
+"Are you sure you want to merge selected posts? This action is not reversible!"
 msgstr ""
 "Seçilen iletiler i birleştirmek istediğinizden emin misiniz? Bu eylem geri "
 "alınamaz!"
@@ -2071,8 +2070,7 @@ msgid ""
 "Are you sure you want to delete selected posts? This action is not "
 "reversible!"
 msgstr ""
-"Seçilen iletileri silmek istediğinizden emin misiniz? Bu eylem geri "
-"alınamaz!"
+"Seçilen iletileri silmek istediğinizden emin misiniz? Bu eylem geri alınamaz!"
 
 #: static/misago/js/misago.js:1
 msgid "Merge"
@@ -2410,8 +2408,8 @@ msgstr ""
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You need permission to start threads in category to be able to merge threads"
-" to it."
+"You need permission to start threads in category to be able to merge threads "
+"to it."
 msgstr ""
 "Konular ı birleştirmek için bölüm içindeki konular a başlatma izni almanız "
 "gerekir."
@@ -2677,20 +2675,23 @@ msgid "You are banned"
 msgstr "Yasaklandin."
 
 #: static/misago/js/misago.js:1
-msgid "You have to accept the terms of service."
-msgstr "Servis şartlarını kabul etmelisiniz."
+msgid "Valid password must be at least %(limit_value)s character long."
+msgid_plural "Valid password must be at least %(limit_value)s characters long."
+msgstr[0] "Geçerli şifre en az %(limit_value)s karakter uzunluğunda olmalıdır."
+msgstr[1] "Geçerli şifre en az %(limit_value)s karakter uzunluğunda olmalıdır."
 
 #: static/misago/js/misago.js:1
 msgid "You have to accept the privacy policy."
 msgstr "Gizlilik ilke sini kabul etmelisiniz"
 
 #: static/misago/js/misago.js:1
-msgid "Username must be at least %(limit_value)s character long."
-msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] ""
-"Kullanıcı adı en az %(limit_value)s karakter uzunluğunda olmalıdır."
-msgstr[1] ""
-"Kullanıcı adı en az %(limit_value)s karakter uzunluğunda olmalıdır."
+msgid "You have to accept the terms of service."
+msgstr "Servis şartlarını kabul etmelisiniz."
+
+#: static/misago/js/misago.js:1
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr ""
+"Kullanıcı adı sadece latin alfabesindeki harfleri ve rakamları içerebilir."
 
 #: static/misago/js/misago.js:1
 msgid "Username cannot be longer than %(limit_value)s character."
@@ -2699,18 +2700,10 @@ msgstr[0] "Kullanıcı adı %(limit_value)s karakterden uzun olamaz."
 msgstr[1] "Kullanıcı adı %(limit_value)s karakterden uzun olamaz."
 
 #: static/misago/js/misago.js:1
-msgid "Username can only contain latin alphabet letters and digits."
-msgstr ""
-"Kullanıcı adı sadece latin alfabesindeki harfleri ve rakamları içerebilir."
-
-#: static/misago/js/misago.js:1
-msgid "Valid password must be at least %(limit_value)s character long."
-msgid_plural ""
-"Valid password must be at least %(limit_value)s characters long."
-msgstr[0] ""
-"Geçerli şifre en az %(limit_value)s karakter uzunluğunda olmalıdır."
-msgstr[1] ""
-"Geçerli şifre en az %(limit_value)s karakter uzunluğunda olmalıdır."
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
+msgstr[0] "Kullanıcı adı en az %(limit_value)s karakter uzunluğunda olmalıdır."
+msgstr[1] "Kullanıcı adı en az %(limit_value)s karakter uzunluğunda olmalıdır."
 
 #: static/misago/js/misago.js:1
 msgid "This field is required."

BIN
misago/locale/zh_Hans/LC_MESSAGES/django.mo


+ 317 - 329
misago/locale/zh_Hans/LC_MESSAGES/django.po

@@ -2,7 +2,7 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # ZZLL <zhuolun1996@gmail.com>, 2017
 # Paradox506 <Renyi_14@whu.edu.cn>, 2017
@@ -11,20 +11,21 @@
 # cxgreat2014 <fwy1998@gmail.com>, 2018
 # 沐子白 <yiveco@qq.com>, 2018
 # 蚂蚁先生 <pzf_karl@hotmail.com>, 2019
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-11-10 16:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: 蚂蚁先生 <pzf_karl@hotmail.com>, 2019\n"
-"Language-Team: Chinese (China) (https://www.transifex.com/misago/teams/65369/zh_CN/)\n"
+"Language-Team: Chinese (China) (https://www.transifex.com/misago/teams/65369/"
+"zh_CN/)\n"
+"Language: zh_CN\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: zh_CN\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #: acl/admin/__init__.py:24 templates/misago/acl_debug.html:16
@@ -219,7 +220,7 @@ msgstr "已关闭版块"
 msgid "Only members with valid permissions can post in closed categories."
 msgstr "只有具备特定权限的成员可以在已经关闭的版块中发帖。"
 
-#: categories/admin/forms.py:70 conf/admin/__init__.py:93
+#: categories/admin/forms.py:70 conf/admin/__init__.py:79
 #: templates/misago/admin/categories/list.html:19
 #: templates/misago/admin/dashboard/totals.html:19
 #: templates/misago/navbar.html:20 templates/misago/navbar.html:36
@@ -233,7 +234,7 @@ msgstr "只有具备特定权限的成员可以在已经关闭的版块中发帖
 #: templates/misago/threadslist/threads.html:42
 #: templates/misago/threadslist/threads.html:66
 #: threads/permissions/threads.py:73 threads/permissions/threads.py:104
-#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:106
+#: threads/search.py:16 threads/viewmodels/thread.py:122 users/apps.py:97
 msgid "Threads"
 msgstr "话题"
 
@@ -265,8 +266,8 @@ msgstr "话题寿命"
 
 #: categories/admin/forms.py:95
 msgid ""
-"Prune thread if number of days since its creation is greater than specified."
-" Enter 0 to disable this pruning criteria."
+"Prune thread if number of days since its creation is greater than specified. "
+"Enter 0 to disable this pruning criteria."
 msgstr "如果话题的创建时长超过指定的天数,直接删除话题。输入0禁用此功能。"
 
 #: categories/admin/forms.py:100
@@ -311,8 +312,7 @@ msgstr "归档"
 
 #: categories/admin/forms.py:173
 msgid ""
-"Instead of being deleted, pruned threads can be moved to designated "
-"category."
+"Instead of being deleted, pruned threads can be moved to designated category."
 msgstr "替换直接删除,你可以把超过寿命的话题归档到指定的版块中。"
 
 #: categories/admin/forms.py:177
@@ -327,7 +327,8 @@ msgstr "你正在移动话题到该话题本身的版块中。"
 msgid ""
 "You are trying to move this category threads to a child category that will "
 "be deleted together with this category."
-msgstr "你正在将当前版块话题移动到子版块中,如果父版块删除,子版块将会一起删除。"
+msgstr ""
+"你正在将当前版块话题移动到子版块中,如果父版块删除,子版块将会一起删除。"
 
 #: categories/admin/forms.py:213
 msgid "Move category threads to"
@@ -342,8 +343,7 @@ msgid "Move child categories to"
 msgstr "移动子版块到"
 
 #: categories/admin/forms.py:249 categories/admin/forms.py:264
-#: templates/misago/acl_debug.html:15
-#: templates/misago/admin/roles/list.html:16
+#: templates/misago/acl_debug.html:15 templates/misago/admin/roles/list.html:16
 msgid "Role"
 msgstr "身份"
 
@@ -453,20 +453,20 @@ msgstr "可查看版块内容"
 msgid "You don't have permission to browse \"%(category)s\" contents."
 msgstr "你无法浏览 \"%(category)s\" 版块中的内容。"
 
-#: conf/admin/__init__.py:45 templates/misago/admin/conf/index.html:5
+#: conf/admin/__init__.py:41 templates/misago/admin/conf/index.html:5
 #: templates/misago/admin/themes/form.html:48
 msgid "Settings"
 msgstr "设置"
 
-#: conf/admin/__init__.py:52 templates/misago/admin/socialauth/form.html:27
+#: conf/admin/__init__.py:48 templates/misago/admin/socialauth/form.html:27
 msgid "General"
 msgstr "通用"
 
-#: conf/admin/__init__.py:53
+#: conf/admin/__init__.py:49
 msgid "Change forum details like name, description or footer."
 msgstr "修改论坛信息,比如名称,描述信息,页脚信息等。"
 
-#: conf/admin/__init__.py:58 templates/misago/admin/dashboard/totals.html:7
+#: conf/admin/__init__.py:54 templates/misago/admin/dashboard/totals.html:7
 #: templates/misago/admin/users/ban.html:22 templates/misago/navbar.html:42
 #: templates/misago/userslists/base.html:5
 #: templates/misago/userslists/base.html:14 users/admin/__init__.py:74
@@ -474,38 +474,28 @@ msgstr "修改论坛信息,比如名称,描述信息,页脚信息等。"
 msgid "Users"
 msgstr "用户"
 
-#: conf/admin/__init__.py:60
+#: conf/admin/__init__.py:56
 msgid "Customize user accounts default behavior and features availability."
 msgstr "自定义用户账号的默认行为和功能。"
 
-#: conf/admin/__init__.py:67
+#: conf/admin/__init__.py:63
 msgid "Captcha"
 msgstr "验证码"
 
-#: conf/admin/__init__.py:69
+#: conf/admin/__init__.py:65
 msgid "Setup protection against automatic registrations on the site."
 msgstr "为站点上的自动注册设置保护措施。"
 
-#: conf/admin/__init__.py:76
-msgid "Single Sign-On"
-msgstr "单点登录"
-
-#: conf/admin/__init__.py:78
-msgid ""
-"SSO enables you to delegate user login and registration from Misago tothe "
-"third party site."
-msgstr "启用单点登录可以将你网站的登录和注册委派给第三方网站。"
-
-#: conf/admin/__init__.py:86 templates/misago/admin/dashboard/analytics.html:7
+#: conf/admin/__init__.py:72 templates/misago/admin/dashboard/analytics.html:7
 #: templates/misago/admin/dashboard/index.html:40
 msgid "Analytics"
 msgstr "分析"
 
-#: conf/admin/__init__.py:87
+#: conf/admin/__init__.py:73
 msgid "Enable Google Analytics or setup Google Site Verification."
 msgstr "启用谷歌分析或设置谷歌网站验证。"
 
-#: conf/admin/__init__.py:94
+#: conf/admin/__init__.py:80
 msgid "Threads, posts, polls and attachments options."
 msgstr "话题、帖子、投票和附件选项。"
 
@@ -517,7 +507,9 @@ msgstr "追踪 ID"
 msgid ""
 "Setting the Tracking ID will result in gtag.js file being included in your "
 "site's HTML markup, enabling Google Analytics integration."
-msgstr "设置追踪 ID,将在你网站的 HTML 标记中包含 gtag. js 文件,从而实现 Google 分析集成。"
+msgstr ""
+"设置追踪 ID,将在你网站的 HTML 标记中包含 gtag. js 文件,从而实现 Google 分析"
+"集成。"
 
 #: conf/admin/forms/analytics.py:25
 msgid "Site verification token"
@@ -525,8 +517,8 @@ msgstr "站点验证令牌"
 
 #: conf/admin/forms/analytics.py:27
 msgid ""
-"This token was extracted from uploaded site verification file. To change it,"
-" upload new verification file."
+"This token was extracted from uploaded site verification file. To change it, "
+"upload new verification file."
 msgstr "此令牌是从上传的网站验证文件中提取的。若要更改它,请上传新的验证文件。"
 
 #: conf/admin/forms/analytics.py:34
@@ -537,7 +529,9 @@ msgstr "上传网站验证文件"
 msgid ""
 "Site verification file can be downloaded from Search Console's \"Ownership "
 "verification\" page."
-msgstr "网站验证文件可以从搜索控制台的 “所有权验证(Ownership verification)\" 页面下载。"
+msgstr ""
+"网站验证文件可以从搜索控制台的 “所有权验证(Ownership verification)\" 页面下"
+"载。"
 
 #: conf/admin/forms/analytics.py:48
 msgid "Submitted file type is not HTML."
@@ -609,8 +603,9 @@ msgid ""
 "themselves. If this score is equal or higher than specified, Misago will "
 "block user from registering and ban their IP address for 24 hours."
 msgstr ""
-"SFS 将用户电子邮件和 IP 地址与已知垃圾邮件发送者的数据库进行比较,并将用户本身是垃圾邮件发送者的置信度评分分配在 0 到 100 "
-"之间。如果此分数等于或高于指定分数,系统将阻止用户注册并禁用其 IP 地址 24 小时。"
+"SFS 将用户电子邮件和 IP 地址与已知垃圾邮件发送者的数据库进行比较,并将用户本身"
+"是垃圾邮件发送者的置信度评分分配在 0 到 100 之间。如果此分数等于或高于指定分"
+"数,系统将阻止用户注册并禁用其 IP 地址 24 小时。"
 
 #: conf/admin/forms/captcha.py:79
 msgid "You need to enter site key if selected CAPTCHA type is reCaptcha."
@@ -693,7 +688,9 @@ msgstr "文本"
 msgid ""
 "Text displayed in forum navbar. If logo image was uploaded, text will be "
 "displayed right next to it. Never displayed by the compact navbar."
-msgstr "显示在论坛导航栏中的文本。如果上传了 logo 图片,该文本将显示在 logo 旁边。永远不会显示在移动端导航栏。"
+msgstr ""
+"显示在论坛导航栏中的文本。如果上传了 logo 图片,该文本将显示在 logo 旁边。永"
+"远不会显示在移动端导航栏。"
 
 #: conf/admin/forms/general.py:73
 msgid "Image"
@@ -704,7 +701,9 @@ msgid ""
 "Custom image that will appear next to links to your forum posted on social "
 "sites. Facebook recommends that this image should be 1200 pixels wide and "
 "630 pixels tall."
-msgstr "用于展示在社交站点上的网站图片。Facebook 建议该图片应该是 1200px 宽,630px 高。"
+msgstr ""
+"用于展示在社交站点上的网站图片。Facebook 建议该图片应该是 1200px 宽,630px "
+"高。"
 
 #: conf/admin/forms/general.py:81
 msgid "Delete image"
@@ -740,41 +739,9 @@ msgstr "由本论坛发送的电子邮件末尾的短消息。(可选)"
 msgid ""
 "Misago uses this setting to build links in e-mails sent to site users. "
 "Address under which site is running appears to be \"%(address)s\"."
-msgstr "系统使用此设置创建发送给用户邮件中的正确连接。当前站点的正确链接似乎是 “%(address)s”。"
-
-#: conf/admin/forms/sso.py:13
-msgid "Enable Single Sign-On"
-msgstr "启用单点登录"
-
-#: conf/admin/forms/sso.py:15
-msgid ""
-"Enabling SSO will make login option redirect users to the server URL "
-"configured below. It will also disable option to register on forum, change "
-"username, email or passward, as those features will be delegated to the 3rd "
-"party site."
 msgstr ""
-"启用单点登录将重定向网站的登录信息到下面设置的服务链接。并同时禁用网站的注册,修改用户名,电子邮件或密码,因为这些功能都委派给第3方网站了。"
-
-#: conf/admin/forms/sso.py:22
-msgid "Public key"
-msgstr "公钥"
-
-#: conf/admin/forms/sso.py:24 conf/admin/forms/sso.py:32
-msgid ""
-"Leave this field empty for Misago to generate this key on form submission."
-msgstr "留空将自动生成密钥。"
-
-#: conf/admin/forms/sso.py:30
-msgid "Private key"
-msgstr "私钥"
-
-#: conf/admin/forms/sso.py:37
-msgid "Server URL"
-msgstr "服务器链接"
-
-#: conf/admin/forms/sso.py:50
-msgid "You need to enter server URL to enable SSO."
-msgstr "你需要输入服务器链接以启用单点登录。"
+"系统使用此设置创建发送给用户邮件中的正确连接。当前站点的正确链接似乎是 "
+"“%(address)s”。"
 
 #: conf/admin/forms/threads.py:27
 msgid "Daily post limit per user"
@@ -785,7 +752,9 @@ msgid ""
 "Daily limit of posts that may be posted by single user. Fail-safe for "
 "situations when forum is flooded by spam bots. Change to 0 to remove the "
 "limit."
-msgstr "每个用户每日发帖的数量。如果论坛垃圾邮件过多的时候可在此调整数据量。设为0将删除限制。"
+msgstr ""
+"每个用户每日发帖的数量。如果论坛垃圾邮件过多的时候可在此调整数据量。设为0将删"
+"除限制。"
 
 #: conf/admin/forms/threads.py:36
 msgid "Hourly post limit per user"
@@ -796,7 +765,9 @@ msgid ""
 "Hourly limit of posts that may be posted by single user. Fail-safe for "
 "situations when forum is flooded by spam bots. Change to 0 to remove the "
 "limit."
-msgstr "每个用户每小时发帖的数量。如果论坛垃圾邮件过多的时候可在此调整数据量。设为 0 将移除限制。"
+msgstr ""
+"每个用户每小时发帖的数量。如果论坛垃圾邮件过多的时候可在此调整数据量。设为 0 "
+"将移除限制。"
 
 #: conf/admin/forms/threads.py:45
 msgid "Maximum number of attachments per post"
@@ -826,7 +797,9 @@ msgstr "未附加附件保存时限"
 msgid ""
 "Period of time (in hours) after which user-uploaded files that weren't "
 "attached to any post are deleted from disk."
-msgstr "删除用户上传的文件,如果在指定时间之内该文件未附加到任何帖子,该文件将被删除。"
+msgstr ""
+"删除用户上传的文件,如果在指定时间之内该文件未附加到任何帖子,该文件将被删"
+"除。"
 
 #: conf/admin/forms/threads.py:69
 msgid "Read-tracker cutoff"
@@ -834,13 +807,14 @@ msgstr "阅读跟踪截止时间"
 
 #: conf/admin/forms/threads.py:71
 msgid ""
-"Controls amount of data used by read-tracking system. All content older than"
-" number of days specified in this setting is considered old and read, even "
-"if the opposite is true for the user. Active forums can try lowering this "
-"value while less active ones may wish to increase it instead. "
+"Controls amount of data used by read-tracking system. All content older than "
+"number of days specified in this setting is considered old and read, even if "
+"the opposite is true for the user. Active forums can try lowering this value "
+"while less active ones may wish to increase it instead. "
 msgstr ""
-"控制阅读跟踪系统使用的数据量。超过此设置中指定天数的所有内容都被视为旧内容并读取,即使用户的情况正好相反也是如此。活跃的论坛可以尝试降低此值,而不太活跃的论坛可能希望增加此值。"
-" "
+"控制阅读跟踪系统使用的数据量。超过此设置中指定天数的所有内容都被视为旧内容并"
+"读取,即使用户的情况正好相反也是如此。活跃的论坛可以尝试降低此值,而不太活跃的"
+"论坛可能希望增加此值。 "
 
 #: conf/admin/forms/threads.py:80
 msgid "Number of threads displayed on a single page"
@@ -859,7 +833,9 @@ msgid ""
 "If number of posts to be displayed on the last page is less or equal to "
 "number specified in this setting, those posts will instead be displayed on "
 "previous page, reducing the total number of pages in thread."
-msgstr "如果最后一页的帖子数小于或等于该值,那么这些帖子将显示在上一页上,从而减少话题列表的总页数。"
+msgstr ""
+"如果最后一页的帖子数小于或等于该值,那么这些帖子将显示在上一页上,从而减少话"
+"题列表的总页数。"
 
 #: conf/admin/forms/threads.py:96
 msgid "Maximum number of events displayed on a single page"
@@ -919,8 +895,8 @@ msgstr "关闭新用户注册"
 
 #: conf/admin/forms/users.py:48
 msgid ""
-"Delete new inactive accounts if they weren't activated within this number of"
-" days"
+"Delete new inactive accounts if they weren't activated within this number of "
+"days"
 msgstr "如果新的未激活帐户未在此天数内激活,将被删除"
 
 #: conf/admin/forms/users.py:51
@@ -975,8 +951,8 @@ msgstr "Gravatar不可用时的备用项"
 
 #: conf/admin/forms/users.py:86
 msgid ""
-"Select which avatar to use when user has no gravatar associated with their "
-"e-mail address."
+"Select which avatar to use when user has no gravatar associated with their e-"
+"mail address."
 msgstr "选择当用户没有与 Gravatar 相关联的电子邮件时使用的头像。"
 
 #: conf/admin/forms/users.py:96
@@ -988,7 +964,9 @@ msgid ""
 "Blank avatar is displayed in the interface when user's avatar is not "
 "available: when user was deleted or is guest. Uploaded image should be a "
 "square."
-msgstr "当用户的头像不可用,或已删除,或该用户是访客时,将使用此空白头像。上传的图片必须是方形的。"
+msgstr ""
+"当用户的头像不可用,或已删除,或该用户是访客时,将使用此空白头像。上传的图片"
+"必须是方形的。"
 
 #: conf/admin/forms/users.py:105
 msgid "Delete custom blank avatar"
@@ -1028,7 +1006,9 @@ msgid ""
 "If number of users to be displayed on the last page is less or equal to "
 "number specified in this setting, those users will instead be displayed on "
 "previous page, reducing the total number of pages on the list."
-msgstr "如果最后一页的用户数小于或等于该值,那么这些用户将显示在上一页上,从而减少用户列表的总页数。"
+msgstr ""
+"如果最后一页的用户数小于或等于该值,那么这些用户将显示在上一页上,从而减少用"
+"户列表的总页数。"
 
 #: conf/admin/forms/users.py:151
 msgid "Maximum age in days of posts that should count to the ranking"
@@ -1065,7 +1045,9 @@ msgid ""
 "Number of days for which users IP addresses are stored in forum database. "
 "Enter zero to store registered IP addresses forever. Deleting user account "
 "always deletes the IP addresses associated with it."
-msgstr "用户 IP 存放的网站数据库中的天数。输入 0 将永久保存 IP 地址。删除用户账户的同时将删除关联的 IP 地址。"
+msgstr ""
+"用户 IP 存放的网站数据库中的天数。输入 0 将永久保存 IP 地址。删除用户账户的同"
+"时将删除关联的 IP 地址。"
 
 #: conf/admin/forms/users.py:183
 msgid "Anonymous username"
@@ -1086,48 +1068,50 @@ msgstr "上传的图片的边长至少炫耀 %(size)s 像素。"
 msgid "This value must be lower than number of users per page."
 msgstr "此值必须低于每页的用户数。"
 
-#: conf/admin/views.py:40
+#: conf/admin/views.py:39
 msgid "Settings have been saved."
 msgstr "设置已保存。"
 
-#: core/errorpages.py:42
+#: core/errorpages.py:51
 msgid "Permission denied."
 msgstr "没有权限。"
 
-#: core/errorpages.py:71
+#: core/errorpages.py:80
 msgid ""
 "A problem was encountered when disconnecting your account from the remote "
 "site."
 msgstr "断开你的帐户与远程站点的连接时遇到问题。"
 
-#: core/errorpages.py:75
+#: core/errorpages.py:84
 msgid ""
 "You are not allowed to disconnect your account from the other site, because "
 "currently it's the only way to sign in to your account."
 msgstr "你无法断开此快捷登录,因为目前这是登录到你的帐户的唯一方式。"
 
-#: core/errorpages.py:80
+#: core/errorpages.py:89
 #, python-format
 msgid "A problem was encountered when signing you in using %(backend)s."
 msgstr "使用 %(backend)s 登录到你账户的时候遇到问题。"
 
-#: core/errorpages.py:84
+#: core/errorpages.py:93
 msgid "The sign in process has been canceled by user."
 msgstr "登录进程被用户取消。"
 
-#: core/errorpages.py:86
+#: core/errorpages.py:95
 msgid "The other service could not be reached."
 msgstr "无法连接到远程服务器。"
 
-#: core/errorpages.py:92
+#: core/errorpages.py:101
 msgid "Unexpected problem has been encountered during sign in process."
 msgstr "登录过程发生了错误。"
 
-#: core/errorpages.py:113
+#: core/errorpages.py:122
 msgid ""
 "Your request was rejected because your browser didn't send the CSRF cookie, "
 "or the cookie sent was invalid."
-msgstr "你的请求被拒绝,因为你的浏览器没有发送 CSRF cookie 信息,或者发送的 cookie 信息无效。"
+msgstr ""
+"你的请求被拒绝,因为你的浏览器没有发送 CSRF cookie 信息,或者发送的 cookie 信"
+"息无效。"
 
 #: core/rest_permissions.py:9
 msgid "This action is not available to guests."
@@ -1170,9 +1154,11 @@ msgstr "访问 pypi.org API 失败,请稍候尝试。"
 #: templates/misago/admin/dashboard/checks.html:17
 #: templates/misago/admin/dashboard/index.html:33
 msgid ""
-"Version check feature relies on the API operated by the Python Package Index"
-" (pypi.org) API to retrieve latest Misago release version."
-msgstr "版本检查功能依赖于由 Python 包索引 (pypi. org) 的 API 来检索最新的 Misago 版本。"
+"Version check feature relies on the API operated by the Python Package Index "
+"(pypi.org) API to retrieve latest Misago release version."
+msgstr ""
+"版本检查功能依赖于由 Python 包索引 (pypi. org) 的 API 来检索最新的 Misago 版"
+"本。"
 
 #: graphql/admin/versioncheck.py:70
 msgid "The site is running updated version of Misago."
@@ -1192,7 +1178,8 @@ msgstr "该网站正在运行旧版本的 Misago。"
 msgid ""
 "The site is running Misago version %(version)s while version %(latest)s is "
 "available."
-msgstr "该网站正在运行 Misago 版本是 %(version)s ,而当前最新版本是 %(latest)s 。"
+msgstr ""
+"该网站正在运行 Misago 版本是 %(version)s ,而当前最新版本是 %(latest)s 。"
 
 #: icons/admin/__init__.py:15
 msgid "Icons"
@@ -1261,7 +1248,9 @@ msgid ""
 "If other agreement is already active for this type, it will be unset and "
 "replaced with this one. Misago will ask users who didn't accept this "
 "agreement to do so before allowing them to continue using the site."
-msgstr "如果此类型存在已启用的协议,那么将强制替换成此协议。并且系统将强制要求所有用户接受此协议,然后才能继续使用网站服务。"
+msgstr ""
+"如果此类型存在已启用的协议,那么将强制替换成此协议。并且系统将强制要求所有用"
+"户接受此协议,然后才能继续使用网站服务。"
 
 #: legal/admin/forms.py:27 templates/misago/admin/themes/assets/css.html:17
 msgid "Link"
@@ -1498,11 +1487,11 @@ msgstr "搜索"
 msgid "Can search site"
 msgstr "可搜索站点"
 
-#: socialauth/admin/__init__.py:42
+#: socialauth/admin/__init__.py:40
 msgid "Social login"
 msgstr "社交登录"
 
-#: socialauth/admin/__init__.py:44
+#: socialauth/admin/__init__.py:42
 msgid "Enable users to sign on and login using their social profile."
 msgstr "允许用户通过社交网站登录和注册本站。"
 
@@ -1525,10 +1514,12 @@ msgstr "通过邮件关联现有用户"
 #: socialauth/admin/forms/base.py:39
 msgid ""
 "Enabling this option will result in the user being signed in if their forum "
-"account was registered using same e-mail address as used on the social site."
-" Otherwise they will be asked to specify a different e-mail to continue sign"
-" in using social site."
-msgstr "如果用户账户使用的电子邮件地址与该社交网站上的相同,那么将自动关联。否则将要求用户指定本地账户电子邮件,以便继续使用社交登录。"
+"account was registered using same e-mail address as used on the social site. "
+"Otherwise they will be asked to specify a different e-mail to continue sign "
+"in using social site."
+msgstr ""
+"如果用户账户使用的电子邮件地址与该社交网站上的相同,那么将自动关联。否则将要"
+"求用户指定本地账户电子邮件,以便继续使用社交登录。"
 
 #: socialauth/admin/forms/base.py:51 socialauth/admin/forms/base.py:53
 #: threads/admin/forms.py:97
@@ -1586,8 +1577,8 @@ msgstr "使用 %(provider)s 登录已移动到 %(other)s 之前。"
 #: socialauth/pipeline.py:88
 #, python-format
 msgid ""
-"The e-mail address associated with your %(backend)s account is not available"
-" for use on this site."
+"The e-mail address associated with your %(backend)s account is not available "
+"for use on this site."
 msgstr "关联到你 %(backend)s 账号的电子邮件无法在本站注册。"
 
 #: socialauth/pipeline.py:98
@@ -1601,18 +1592,6 @@ msgstr "你的账户必须通过网站管理员激活,才可以使用 %(backen
 msgid "Please try resubmitting the form."
 msgstr "请重新尝试提交表单。"
 
-#: socialauth/views.py:23
-msgid "Please use the 3rd party site to login."
-msgstr "请使用第 3 方网站登录。"
-
-#: sso/validators.py:24 users/forms/register.py:34 users/validators.py:80
-msgid "This username is not allowed."
-msgstr "不允许使用此用户名。"
-
-#: sso/validators.py:33 users/forms/register.py:45 users/validators.py:52
-msgid "This e-mail address is not allowed."
-msgstr "不能使用此电子邮件。"
-
 #: templates/misago/acl_debug.html:5
 #, python-format
 msgid ""
@@ -1665,8 +1644,8 @@ msgstr "请求验证链接"
 
 #: templates/misago/activation/request.html:25
 msgid ""
-"The site administrator may impose a requirement on newly registered accounts"
-" to be activated before users will be able to sign in."
+"The site administrator may impose a requirement on newly registered accounts "
+"to be activated before users will be able to sign in."
 msgstr "此站点管理员可能会强制要求用户在登录之前激活新注册的账户。"
 
 #: templates/misago/activation/request.html:28
@@ -1674,7 +1653,9 @@ msgid ""
 "Depending on the time of registration, you will be able to activate your "
 "account by clicking a special activation link. This link will be valid only "
 "for your browser, for seven days or until your account is activated."
-msgstr "根据注册时间,你可以通过点击激活链接来激活你的账户,此链接有效期 7 天,且仅对你的浏览器有效,或直到你的账户被激活为止。"
+msgstr ""
+"根据注册时间,你可以通过点击激活链接来激活你的账户,此链接有效期 7 天,且仅对"
+"你的浏览器有效,或直到你的账户被激活为止。"
 
 #: templates/misago/activation/request.html:31
 msgid ""
@@ -2037,7 +2018,7 @@ msgstr "版块"
 #: templates/misago/admin/dashboard/totals.html:31
 #: templates/misago/admin/users/list.html:21
 #: templates/misago/profile/posts.html:5 templates/misago/profile/posts.html:8
-#: templates/misago/profile/posts.html:9 users/apps.py:102
+#: templates/misago/profile/posts.html:9 users/apps.py:93
 msgid "Posts"
 msgstr "帖子"
 
@@ -2181,56 +2162,45 @@ msgstr "阅读跟踪器"
 msgid "Attachment error images"
 msgstr "附件错误图片"
 
-#: templates/misago/admin/conf/users_settings.html:9
-#: templates/misago/admin/socialauth/list.html:97
-msgid "Note"
-msgstr "注意"
-
-#: templates/misago/admin/conf/users_settings.html:9
-msgid ""
-"Single Sign-On is enabled. Site's registration, password and deletion "
-"features have been disabled and delegated to the third-party site."
-msgstr "已启用单点登录。已将此站点的注册,密码和删除功能委派给第 3 方网站。"
-
-#: templates/misago/admin/conf/users_settings.html:14
+#: templates/misago/admin/conf/users_settings.html:8
 msgid "New accounts"
 msgstr "新账号"
 
-#: templates/misago/admin/conf/users_settings.html:23 users/admin/forms.py:484
+#: templates/misago/admin/conf/users_settings.html:17 users/admin/forms.py:484
 #: users/admin/forms.py:573
 msgid "Usernames"
 msgstr "用户名"
 
-#: templates/misago/admin/conf/users_settings.html:33
+#: templates/misago/admin/conf/users_settings.html:27
 msgid "Avatars"
 msgstr "头像"
 
-#: templates/misago/admin/conf/users_settings.html:49
+#: templates/misago/admin/conf/users_settings.html:43
 msgid "Signatures"
 msgstr "签名"
 
-#: templates/misago/admin/conf/users_settings.html:57
+#: templates/misago/admin/conf/users_settings.html:51
 #: users/admin/__init__.py:80
 msgid "Data downloads"
 msgstr "下载数据"
 
-#: templates/misago/admin/conf/users_settings.html:66
+#: templates/misago/admin/conf/users_settings.html:60
 msgid "Own account deletion"
 msgstr "删除帐户"
 
-#: templates/misago/admin/conf/users_settings.html:74 users/admin/forms.py:492
+#: templates/misago/admin/conf/users_settings.html:68 users/admin/forms.py:492
 msgid "IP addresses"
 msgstr "IP 地址"
 
-#: templates/misago/admin/conf/users_settings.html:82
+#: templates/misago/admin/conf/users_settings.html:76
 msgid "Default subscription preferences"
 msgstr "默认订阅首选项"
 
-#: templates/misago/admin/conf/users_settings.html:91
+#: templates/misago/admin/conf/users_settings.html:85
 msgid "Users lists"
 msgstr "用户列表"
 
-#: templates/misago/admin/conf/users_settings.html:100
+#: templates/misago/admin/conf/users_settings.html:94
 msgid "Top posters ranking"
 msgstr "活跃用户排行榜"
 
@@ -2251,7 +2221,9 @@ msgstr "该站点正在 debug 模式下运行。"
 msgid ""
 "Error pages displayed in DEBUG mode will expose site configuration details "
 "like secrets and tokens to all visitors. This is MAJOR security risk."
-msgstr "在 DEBUG 模式下显示的错误页面将会暴露站点的设置细节给所有访问者,比如密钥和令牌。这是最致命的安全风险。"
+msgstr ""
+"在 DEBUG 模式下显示的错误页面将会暴露站点的设置细节给所有访问者,比如密钥和令"
+"牌。这是最致命的安全风险。"
 
 #: templates/misago/admin/dashboard/checks.html:48
 msgid "Forum address is not configured."
@@ -2270,7 +2242,9 @@ msgstr "设置的论坛链接似乎不正确。"
 msgid ""
 "Your forum address is set to %(configured_address)s while correct value "
 "appears to be %(correct_address)s."
-msgstr "你的论坛地址设置为 %(configured_address)s,而正确的值应该是 %(correct_address)s。"
+msgstr ""
+"你的论坛地址设置为 %(configured_address)s,而正确的值应该是 "
+"%(correct_address)s。"
 
 #: templates/misago/admin/dashboard/checks.html:82
 msgid "Links in e-mails sentby Misagoill be broken."
@@ -2284,7 +2258,9 @@ msgstr "此站点未启用 HTTPS。"
 msgid ""
 "Browsers may warn users visiting the site about it being insecure. Search "
 "engines will lower its position in search results."
-msgstr "当用户访问此站点时,浏览器可能会警告用户该网站是不安全的。并且搜索引擎将降低此站点在搜索结果中的位置。"
+msgstr ""
+"当用户访问此站点时,浏览器可能会警告用户该网站是不安全的。并且搜索引擎将降低"
+"此站点在搜索结果中的位置。"
 
 #: templates/misago/admin/dashboard/checks.html:117
 msgid "Cache is disabled."
@@ -2317,7 +2293,8 @@ msgstr[0] "有 %(users)s 个未激活的用户账号。"
 msgid ""
 "The site may be targeted by bots, is not sending activation e-mails, or is "
 "not configured to delete inactive user accounts."
-msgstr "该网站可能会成为机器人的目标,未发送激活电子邮件,或者未设置删除未激活用户。"
+msgstr ""
+"该网站可能会成为机器人的目标,未发送激活电子邮件,或者未设置删除未激活用户。"
 
 #: templates/misago/admin/dashboard/index.html:28
 msgid "Version check is currently unavailable due to an error."
@@ -2351,9 +2328,8 @@ msgstr "数据下载请求"
 msgid "Site analytics are currently unavailable due to an error."
 msgstr "由于出现错误,站点分析当前不可用。"
 
-#: templates/misago/admin/dashboard/totals.html:43
-#: threads/admin/__init__.py:38 threads/permissions/attachments.py:11
-#: threads/permissions/attachments.py:29
+#: templates/misago/admin/dashboard/totals.html:43 threads/admin/__init__.py:36
+#: threads/permissions/attachments.py:11 threads/permissions/attachments.py:29
 msgid "Attachments"
 msgstr "附件"
 
@@ -2458,7 +2434,9 @@ msgstr "拒绝提交表单"
 msgid ""
 "Your form submission was rejected because your browser didn't send the CSRF "
 "cookie, or the cookie sent was invalid."
-msgstr "你的表单提交被拒绝,因为你的浏览器没有发送 CSRF cookie,或者发送的 cookie 无效。"
+msgstr ""
+"你的表单提交被拒绝,因为你的浏览器没有发送 CSRF cookie,或者发送的 cookie 无"
+"效。"
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:6
 msgid "This is usually a result of one of following problems:"
@@ -2470,21 +2448,22 @@ msgstr "你的浏览器配置为不接收或发送任何 cookie。"
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:12
 msgid ""
-"The form was sent after being opened in the browser for a long time (eg. few"
-" days) and cookie token has expired."
+"The form was sent after being opened in the browser for a long time (eg. few "
+"days) and cookie token has expired."
 msgstr "表单是在打开浏览器后长时间 (例如几天) 之后发送的,cookie 令牌已过期。"
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:15
 msgid ""
-"The site is configured to use the HTTPS, but this form was sent over the the"
-" HTTP."
+"The site is configured to use the HTTPS, but this form was sent over the the "
+"HTTP."
 msgstr "该站点配置为使用 HTTPS,但此表单是通过 HTTP 发送的。"
 
 #: templates/misago/admin/errorpages/csrf_failure_message.html:16
 msgid ""
-"If you are an owner of this site, please check if the HTTPS certificate used"
-" by the site is valid and accepted by the browser."
-msgstr "如果你是本网站的所有者,请检查该网站使用的 HTTPS 证书是否有效并被浏览器接受。"
+"If you are an owner of this site, please check if the HTTPS certificate used "
+"by the site is valid and accepted by the browser."
+msgstr ""
+"如果你是本网站的所有者,请检查该网站使用的 HTTPS 证书是否有效并被浏览器接受。"
 
 #: templates/misago/admin/generic/filter_form.html:7
 msgid "Filter"
@@ -2740,8 +2719,7 @@ msgstr "显示和可见性"
 #: templates/misago/admin/ranks/list.html:17
 #: templates/misago/admin/users/list.html:19
 #: templates/misago/userslists/active_posters.html:112
-#: templates/misago/userslists/active_posters.html:123
-#: users/admin/forms.py:238
+#: templates/misago/userslists/active_posters.html:123 users/admin/forms.py:238
 msgid "Rank"
 msgstr "级别"
 
@@ -2806,7 +2784,7 @@ msgid "Enabled login methods"
 msgstr "已启用登录方式"
 
 #: templates/misago/admin/socialauth/list.html:15
-#: templates/misago/admin/socialauth/list.html:112
+#: templates/misago/admin/socialauth/list.html:106
 msgid "Provider"
 msgstr "服务商"
 
@@ -2822,25 +2800,19 @@ msgstr "未启用社交登录。"
 msgid "Are you sure you want to disable this social login provider?"
 msgstr "确定停用此社交登录服务?"
 
-#: templates/misago/admin/socialauth/list.html:97
-msgid ""
-"Single Sign-On is enabled. Social authentication has been disabled and "
-"delegated to the third-party site."
-msgstr "单点登录已启用。已禁用社交登录并委派给第 3 方网站。"
-
-#: templates/misago/admin/socialauth/list.html:106
+#: templates/misago/admin/socialauth/list.html:100
 msgid "Setup new login method"
 msgstr "设置新登录方式"
 
-#: templates/misago/admin/socialauth/list.html:125
+#: templates/misago/admin/socialauth/list.html:119
 msgid "Setup login with this provider"
 msgstr "设置此登录服务"
 
-#: templates/misago/admin/socialauth/list.html:126
+#: templates/misago/admin/socialauth/list.html:120
 msgid "Setup"
 msgstr "设置"
 
-#: templates/misago/admin/socialauth/list.html:133
+#: templates/misago/admin/socialauth/list.html:127
 msgid "No new login providers are available for setup at this time."
 msgstr "当前没有新的社交登录可设置。"
 
@@ -2947,7 +2919,9 @@ msgstr "选择要上传的媒体文件"
 msgid ""
 "Media files are primarily image and font files that can be linked to from "
 "the CSS, but files of any type can be uploaded using this option."
-msgstr "媒体文件主要是在 CSS 文件中链接到的图片和字体文件,但可以使用此选项上传任何类型的文件。"
+msgstr ""
+"媒体文件主要是在 CSS 文件中链接到的图片和字体文件,但可以使用此选项上传任何类"
+"型的文件。"
 
 #: templates/misago/admin/themes/assets/upload-media.html:21
 msgid ""
@@ -3135,7 +3109,7 @@ msgstr "此用户没有设置账户密码,使用社交账号登录。"
 msgid "Signature"
 msgstr "签名"
 
-#: templates/misago/admin/users/edit.html:228 users/apps.py:27
+#: templates/misago/admin/users/edit.html:228 users/apps.py:24
 msgid "Forum options"
 msgstr "论坛选项"
 
@@ -3155,8 +3129,7 @@ msgstr "此用户正在删除他的帐户。已停用该用户。"
 
 #: templates/misago/admin/users/edit.html:251
 msgid ""
-"No additional action is required. This account will be deleted "
-"automatically."
+"No additional action is required. This account will be deleted automatically."
 msgstr "无需其他操作。此账号将自动删除。"
 
 #: templates/misago/admin/users/edit.html:294
@@ -3342,9 +3315,10 @@ msgstr "激活我的账号!"
 #: templates/misago/emails/change_email.txt:6
 #, python-format
 msgid ""
-"%(user)s, you are receiving this message because you have changed your "
-"e-mail address."
-msgstr "%(user)s 你好, 你已修改了账号绑定的电子邮箱地址,因此,我们向你发送这封邮件。"
+"%(user)s, you are receiving this message because you have changed your e-"
+"mail address."
+msgstr ""
+"%(user)s 你好, 你已修改了账号绑定的电子邮箱地址,因此,我们向你发送这封邮件。"
 
 #: templates/misago/emails/change_email.html:11
 #: templates/misago/emails/change_email.txt:10
@@ -3359,7 +3333,9 @@ msgstr "确认此修改,请单击以下链接:"
 msgid ""
 "%(user)s, you are receiving this message because you have changed your "
 "password."
-msgstr "%(user)s 你好, 当你收到这封邮件的时候,表示你已经成功修改了密码。友情提示,请妥善保管号密码哟。"
+msgstr ""
+"%(user)s 你好, 当你收到这封邮件的时候,表示你已经成功修改了密码。友情提示,请"
+"妥善保管号密码哟。"
 
 #: templates/misago/emails/change_password_form_link.html:6
 #: templates/misago/emails/change_password_form_link.txt:6
@@ -3367,7 +3343,9 @@ msgstr "%(user)s 你好, 当你收到这封邮件的时候,表示你已经成
 msgid ""
 "%(user)s, you are receiving this message because you want to change "
 "forgotten password for your forum account."
-msgstr "%(user)s 你好,站点已响应你发起的忘记密码请求,如果该操作是你发起的,请按下方提示操作,否则请忽略。"
+msgstr ""
+"%(user)s 你好,站点已响应你发起的忘记密码请求,如果该操作是你发起的,请按下方"
+"提示操作,否则请忽略。"
 
 #: templates/misago/emails/change_password_form_link.html:11
 #: templates/misago/emails/change_password_form_link.txt:10
@@ -3388,9 +3366,11 @@ msgstr "设置新密码"
 msgid ""
 "%(user)s, you are receiving this message because your data is ready for "
 "download."
-msgstr "%(user)s, 你好,当你收到这封邮件的时候,表示系统已经准备好了你的数据,并且现在就可以下载了。"
+msgstr ""
+"%(user)s, 你好,当你收到这封邮件的时候,表示系统已经准备好了你的数据,并且现"
+"在就可以下载了。"
 
-#: templates/misago/emails/data_download.html:11 users/apps.py:57
+#: templates/misago/emails/data_download.html:11 users/apps.py:52
 msgid "Download data"
 msgstr "下载数据"
 
@@ -3414,7 +3394,9 @@ msgstr "请点击以下链接下载数据:"
 msgid ""
 "%(user)s, you are receiving this message because %(sender)s has invited you "
 "to participate in private thread %(thread)s."
-msgstr "%(user)s 你好,%(sender)s 邀请你参与隐蔽话题 %(thread)s 的讨论,因此,我们向你发送这封邮件。"
+msgstr ""
+"%(user)s 你好,%(sender)s 邀请你参与隐蔽话题 %(thread)s 的讨论,因此,我们向"
+"你发送这封邮件。"
 
 #: templates/misago/emails/privatethread/added.html:14
 #: templates/misago/emails/privatethread/added.txt:10
@@ -3426,7 +3408,9 @@ msgstr "请点击以下链接参与讨论:"
 msgid ""
 "%(user)s, you are receiving this message because %(sender)s has invited you "
 "to participate in private thread \"%(thread)s\"."
-msgstr "%(user)s 你好,%(sender)s 邀请你参与隐蔽话题 \"%(thread)s\" 的讨论。因此,我们向你发送这封邮件。"
+msgstr ""
+"%(user)s 你好,%(sender)s 邀请你参与隐蔽话题 \"%(thread)s\" 的讨论。因此,我"
+"们向你发送这封邮件。"
 
 #: templates/misago/emails/register/complete.html:6
 #: templates/misago/emails/register/complete.txt:6
@@ -3441,7 +3425,9 @@ msgid ""
 "You may now join discussion on our forums. Why not spend a minute or two to "
 "have a look around and share your opinions and knowledge with rest of "
 "community?"
-msgstr "你现在可以加入我们论坛的讨论。为什么不花一两分钟来逛逛,和社区其他人分享你的意见和知识?"
+msgstr ""
+"你现在可以加入我们论坛的讨论。为什么不花一两分钟来逛逛,和社区其他人分享你的"
+"意见和知识?"
 
 #: templates/misago/emails/register/complete.html:20
 #, python-format
@@ -3462,8 +3448,8 @@ msgstr "请耐心等待站点管理员激活你的账户,之后就可以登录
 #: templates/misago/emails/register/inactive.html:12
 #: templates/misago/emails/register/inactive.txt:15
 msgid ""
-"This may take a while, but you will receive e-mail with notification once it"
-" happens."
+"This may take a while, but you will receive e-mail with notification once it "
+"happens."
 msgstr "这可能需要一点时间,激活之后我们将向你发送一封邮件,请留意邮箱。"
 
 #: templates/misago/emails/register/inactive.html:17
@@ -3570,7 +3556,9 @@ msgstr "请求被拦截"
 msgid ""
 "This is usually caused by your browser not accepting or using outdated "
 "cookies. Check your browser configuration and try again."
-msgstr "这通常是由你的浏览器不接受或使用过时的 Cookie 引起的。检查你的浏览器配置,然后重试。"
+msgstr ""
+"这通常是由你的浏览器不接受或使用过时的 Cookie 引起的。检查你的浏览器配置,然"
+"后重试。"
 
 #: templates/misago/errorpages/csrf_failure.html:24
 #: templates/misago/errorpages/csrf_failure_authenticated.html:19
@@ -3642,7 +3630,9 @@ msgid ""
 "To set password for your account, you can use special secure form that will "
 "be available by special link valid only for your browser, for seven days or "
 "until your password is set."
-msgstr "要为你的账号设置密码,你可以使用特殊的安全表单,该表单将通过仅对你的浏览器有效的特殊链接提供,链接有效期7天,请尽快设置。"
+msgstr ""
+"要为你的账号设置密码,你可以使用特殊的安全表单,该表单将通过仅对你的浏览器有"
+"效的特殊链接提供,链接有效期7天,请尽快设置。"
 
 #: templates/misago/forgottenpassword/request.html:38
 msgid ""
@@ -3653,10 +3643,12 @@ msgstr "我们使用加密存储的方式保护你的密码, 所以我们无
 
 #: templates/misago/forgottenpassword/request.html:39
 msgid ""
-"Instead, you can change your password using special secure form that will be"
-" available by special link valid only for your browser, for seven days or "
+"Instead, you can change your password using special secure form that will be "
+"available by special link valid only for your browser, for seven days or "
 "until your password is changed."
-msgstr "你可以在通过仅对你浏览器有效的安全密码重置链接来修改密码,链接有效期7天,请尽快修改。"
+msgstr ""
+"你可以在通过仅对你浏览器有效的安全密码重置链接来修改密码,链接有效期7天,请尽"
+"快修改。"
 
 #: templates/misago/forgottenpassword/request.html:42
 msgid ""
@@ -3773,7 +3765,7 @@ msgstr "查看结果"
 #: templates/misago/profile/ban_details.html:5
 #: templates/misago/profile/ban_details.html:8
 #: templates/misago/profile/ban_details.html:9
-#: templates/misago/profile/ban_details.html:16 users/apps.py:137
+#: templates/misago/profile/ban_details.html:16 users/apps.py:128
 msgid "Ban details"
 msgstr "封禁细节"
 
@@ -3820,7 +3812,7 @@ msgstr[0] "已发起 %(threads)s 个话题。"
 #: templates/misago/profile/details.html:5
 #: templates/misago/profile/details.html:8
 #: templates/misago/profile/details.html:9
-#: templates/misago/profile/details.html:19 users/apps.py:124
+#: templates/misago/profile/details.html:19 users/apps.py:115
 msgid "Details"
 msgstr "详细资料"
 
@@ -3849,7 +3841,7 @@ msgstr "此错误是由违规的操作引起的。"
 
 #: templates/misago/profile/followers.html:5
 #: templates/misago/profile/followers.html:8
-#: templates/misago/profile/followers.html:9 users/apps.py:112
+#: templates/misago/profile/followers.html:9 users/apps.py:103
 msgid "Followers"
 msgstr "关注者"
 
@@ -3876,7 +3868,7 @@ msgstr "%(username)s 没有关注者。"
 
 #: templates/misago/profile/follows.html:5
 #: templates/misago/profile/follows.html:8
-#: templates/misago/profile/follows.html:9 users/apps.py:118
+#: templates/misago/profile/follows.html:9 users/apps.py:109
 msgid "Follows"
 msgstr "关注"
 
@@ -3958,7 +3950,7 @@ msgstr "%(username)s 还没有发起过话题。"
 
 #: templates/misago/profile/username_history.html:5
 #: templates/misago/profile/username_history.html:8
-#: templates/misago/profile/username_history.html:9 users/apps.py:130
+#: templates/misago/profile/username_history.html:9 users/apps.py:121
 msgid "Username history"
 msgstr "用户名历史记录"
 
@@ -4138,8 +4130,8 @@ msgstr "这条帖子是隐藏的。只有拥有相应权限的用户才能看到
 
 #: templates/misago/thread/posts/post/flags.html:29
 msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
 msgstr "此帖子未审批。只有拥有审批帖子权限的用户及作者才能看到此内容。"
 
 #: templates/misago/thread/posts/post/flags.html:35
@@ -4326,7 +4318,7 @@ msgstr "投票"
 
 #: templates/misago/userslists/active_posters.html:5
 #: templates/misago/userslists/active_posters.html:23
-#: templates/misago/userslists/active_posters.html:24 users/apps.py:81
+#: templates/misago/userslists/active_posters.html:24 users/apps.py:72
 msgid "Top posters"
 msgstr "活跃用户"
 
@@ -4631,11 +4623,11 @@ msgstr "已更新 CSS 链接 \"%(name)s\"。"
 msgid "Default Misago Theme"
 msgstr "Misago 默认主题"
 
-#: threads/admin/__init__.py:45
+#: threads/admin/__init__.py:43
 msgid "Attachment types"
 msgstr "附件类型"
 
-#: threads/admin/__init__.py:46
+#: threads/admin/__init__.py:44
 msgid "Specify what files may be uploaded on the forum."
 msgstr "指定可在论坛中上传的文件。"
 
@@ -4685,8 +4677,7 @@ msgstr "可下载的用户权限"
 
 #: threads/admin/forms.py:64
 msgid ""
-"List of comma separated file extensions associated with this attachment "
-"type."
+"List of comma separated file extensions associated with this attachment type."
 msgstr "列出与此附件类型相关联的文件扩展名并用逗号分隔。"
 
 #: threads/admin/forms.py:68
@@ -4712,7 +4703,8 @@ msgid ""
 "to allow all users with permission to upload attachments to be able to "
 "upload attachments of this type."
 msgstr ""
-"如果你希望仅限特定身份的用户可上传此类型的文件,请在此列表中选中这些身份。若不选择任何身份,则允许所有拥有上传附件权限的用户上传该类型的附件。"
+"如果你希望仅限特定身份的用户可上传此类型的文件,请在此列表中选中这些身份。若"
+"不选择任何身份,则允许所有拥有上传附件权限的用户上传该类型的附件。"
 
 #: threads/admin/forms.py:83
 msgid ""
@@ -4721,7 +4713,8 @@ msgid ""
 "to allow all users with permission to download attachments to be able to "
 "download attachments of this type."
 msgstr ""
-"如果你希望仅限特定身份的用户可下载此类型的文件,请在此列表中选中这些身份。若不选择任何身份,则允许所有拥有下载附件权限的用户下载该类型的附件。"
+"如果你希望仅限特定身份的用户可下载此类型的文件,请在此列表中选中这些身份。若"
+"不选择任何身份,则允许所有拥有下载附件权限的用户下载该类型的附件。"
 
 #: threads/admin/views/attachments.py:14
 msgid "Requested attachment could not be found."
@@ -4787,8 +4780,7 @@ msgstr "已编辑附件类型 \"%(name)s\"。"
 #: threads/admin/views/attachmenttypes.py:47
 #, python-format
 msgid ""
-"Attachment type \"%(name)s\" has associated attachments and can't be "
-"deleted."
+"Attachment type \"%(name)s\" has associated attachments and can't be deleted."
 msgstr "附件类型 \"%(name)s\" 已经关联了附件,不能被删除。"
 
 #: threads/admin/views/attachmenttypes.py:54
@@ -4873,7 +4865,8 @@ msgid ""
 msgid_plural ""
 "You can't attach more than %(limit_value)s flies to single post (added "
 "%(show_value)s)."
-msgstr[0] "每条帖子最多可添加 %(limit_value)s 个附件(已添加 %(show_value)s 个)。"
+msgstr[0] ""
+"每条帖子最多可添加 %(limit_value)s 个附件(已添加 %(show_value)s 个)。"
 
 #: threads/api/postingendpoint/category.py:45
 msgid "You have to select category to post thread in."
@@ -4928,7 +4921,8 @@ msgid ""
 msgid_plural ""
 "You can't add more than %(users)s users to private thread (you've added "
 "%(added)s)."
-msgstr[0] "你不能添加超过 %(users)s 名用户到隐蔽话题(已添加 %(added)s 名用户)"
+msgstr[0] ""
+"你不能添加超过 %(users)s 名用户到隐蔽话题(已添加 %(added)s 名用户)"
 
 #: threads/api/postingendpoint/participants.py:93
 #, python-format
@@ -4989,8 +4983,7 @@ msgstr "这篇帖子已被标记为该话题的最佳答案。"
 
 #: threads/api/threadendpoints/patch.py:273
 msgid ""
-"This post can't be unmarked because it's not currently marked as best "
-"answer."
+"This post can't be unmarked because it's not currently marked as best answer."
 msgstr "此帖子无法取消标记,因为它目前未被标记为最佳答案。"
 
 #: threads/api/threadendpoints/patch.py:301
@@ -5096,7 +5089,8 @@ msgstr "你不能删除帖子而不删除话题。"
 
 #: threads/participants.py:142
 #, python-format
-msgid "%(user)s has invited you to participate in private thread \"%(thread)s\""
+msgid ""
+"%(user)s has invited you to participate in private thread \"%(thread)s\""
 msgstr "%(user)s邀请你参与隐蔽话题 \"%(thread)s\""
 
 #: threads/permissions/attachments.py:14
@@ -5187,9 +5181,10 @@ msgstr "你无法在此话题中标记最佳答案,因为此话题已关闭且
 #: threads/permissions/bestanswers.py:188
 #, python-format
 msgid ""
-"You don't have permission to change this thread's marked answer because it's"
-" in the \"%(category)s\" category."
-msgstr "你无法修改此话题标记的最佳答案,因为 \"%(category)s\" 版块不允许执行此操作。"
+"You don't have permission to change this thread's marked answer because it's "
+"in the \"%(category)s\" category."
+msgstr ""
+"你无法修改此话题标记的最佳答案,因为 \"%(category)s\" 版块不允许执行此操作。"
 
 #: threads/permissions/bestanswers.py:198
 msgid ""
@@ -5249,8 +5244,8 @@ msgstr "你无法取消标记最佳答案,因为 \"%(category)s\" 版块已关
 
 #: threads/permissions/bestanswers.py:274
 msgid ""
-"You can't unmark this thread's best answer because it's closed and you don't"
-" have permission to open it."
+"You can't unmark this thread's best answer because it's closed and you don't "
+"have permission to open it."
 msgstr "你无法取消该话题的最佳答案,因为该话题已关闭,且你无法重新开启话题。"
 
 #: threads/permissions/bestanswers.py:282
@@ -5463,8 +5458,8 @@ msgstr "可举报隐蔽话题"
 
 #: threads/permissions/privatethreads.py:52
 msgid ""
-"Allows user to report private threads they are participating in, making them"
-" accessible to moderators."
+"Allows user to report private threads they are participating in, making them "
+"accessible to moderators."
 msgstr "允许用户举报他们正在参与的隐蔽话题,使其能够被版主访问。"
 
 #: threads/permissions/privatethreads.py:57
@@ -5541,11 +5536,12 @@ msgstr "可查看未审批的内容列表"
 msgid ""
 "Allows access to \"unapproved\" tab on threads lists for easy listing of "
 "threads that are unapproved or contain unapproved posts. Despite the tab "
-"being available on all threads lists, it will only display threads belonging"
-" to categories in which the user has permission to approve content."
+"being available on all threads lists, it will only display threads belonging "
+"to categories in which the user has permission to approve content."
 msgstr ""
-"允许在话题列表中查看 “未审批” "
-"标签以便于列出那些包含未审批的帖子或未审批的话题。尽管该标签存在于所有版块话题中,但仅当用户有审批权限的时候,才显示含有 “未审批” 标签的话题或帖子。"
+"允许在话题列表中查看 “未审批” 标签以便于列出那些包含未审批的帖子或未审批的话"
+"题。尽管该标签存在于所有版块话题中,但仅当用户有审批权限的时候,才显示含有 "
+"“未审批” 标签的话题或帖子。"
 
 #: threads/permissions/threads.py:87
 msgid "Can see reported content list"
@@ -5558,8 +5554,9 @@ msgid ""
 "categories threads lists, it will only display threads belonging to "
 "categories in which the user has permission to see posts reports."
 msgstr ""
-"允许在话题列表中查看 “被举报” "
-"标签以便于列出那些包含被举报帖子的话题。尽管该标签存在于所有版块话题中,但其仅对有权限查看相应版块被举报帖子的用户展示相应话题。"
+"允许在话题列表中查看 “被举报” 标签以便于列出那些包含被举报帖子的话题。尽管该"
+"标签存在于所有版块话题中,但其仅对有权限查看相应版块被举报帖子的用户展示相应"
+"话题。"
 
 #: threads/permissions/threads.py:98
 msgid "Can omit flood protection"
@@ -6424,7 +6421,8 @@ msgid ""
 msgid_plural ""
 "You can't add more than %(limit_value)s options to a single poll (added "
 "%(show_value)s)."
-msgstr[0] "你不能在一次投票中加入多于 %(limit_value)s 个选项(已加入 %(show_value)s 个)."
+msgstr[0] ""
+"你不能在一次投票中加入多于 %(limit_value)s 个选项(已加入 %(show_value)s 个)."
 
 #: threads/serializers/poll.py:134
 msgid "Number of allowed choices can't be greater than number of all choices."
@@ -6505,7 +6503,8 @@ msgid ""
 msgid_plural ""
 "Thread title should be at least %(limit_value)s characters long (it has "
 "%(show_value)s)."
-msgstr[0] "话题名称至少需要 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
+msgstr[0] ""
+"话题名称至少需要 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
 
 #: threads/validators.py:63
 #, python-format
@@ -6515,7 +6514,8 @@ msgid ""
 msgid_plural ""
 "Thread title cannot be longer than %(limit_value)s characters (it has "
 "%(show_value)s)."
-msgstr[0] "话题名称最多包含 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
+msgstr[0] ""
+"话题名称最多包含 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
 
 #: threads/validators.py:82
 #, python-format
@@ -6525,7 +6525,8 @@ msgid ""
 msgid_plural ""
 "Posted message should be at least %(limit_value)s characters long (it has "
 "%(show_value)s)."
-msgstr[0] "发帖内容至少需要 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
+msgstr[0] ""
+"发帖内容至少需要 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
 
 #: threads/validators.py:93
 #, python-format
@@ -6535,7 +6536,8 @@ msgid ""
 msgid_plural ""
 "Posted message cannot be longer than %(limit_value)s characters (it has "
 "%(show_value)s)."
-msgstr[0] "发帖内容最多包含 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
+msgstr[0] ""
+"发帖内容最多包含 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
 
 #: threads/viewmodels/threads.py:23
 msgid "Your threads"
@@ -6631,9 +6633,11 @@ msgstr "是管理员"
 #: users/admin/forms.py:78
 msgid ""
 "Designates whether the user can log into admin sites. If Django admin site "
-"is enabled, this user will need additional permissions assigned within it to"
-" admin Django modules."
-msgstr "指定用户是否可以登录到管理员站点。如果启用 Django 管理站点,用户将需要额外的 Django 模块的权限。"
+"is enabled, this user will need additional permissions assigned within it to "
+"admin Django modules."
+msgstr ""
+"指定用户是否可以登录到管理员站点。如果启用 Django 管理站点,用户将需要额外的 "
+"Django 模块的权限。"
 
 #: users/admin/forms.py:84
 msgid "Is superuser"
@@ -6643,7 +6647,8 @@ msgstr "是超级用户"
 msgid ""
 "Only administrators can access admin sites. In addition to admin site "
 "access, superadmins can also change other members admin levels."
-msgstr "只有管理员可以访问管理页面。另外,超级管理员可以改变其他成员的管理权限。"
+msgstr ""
+"只有管理员可以访问管理页面。另外,超级管理员可以改变其他成员的管理权限。"
 
 #: users/admin/forms.py:91
 msgid "Is active"
@@ -6653,7 +6658,9 @@ msgstr "已激活"
 msgid ""
 "Designates whether this user should be treated as active. Turning this off "
 "is non-destructible way to remove user accounts."
-msgstr "指定该用户是否应被视为激活状态。当需要删除用户账号时将它设为 “否” 来冻结用户账号即可保留数据。"
+msgstr ""
+"指定该用户是否应被视为激活状态。当需要删除用户账号时将它设为 “否” 来冻结用户"
+"账号即可保留数据。"
 
 #: users/admin/forms.py:97 users/admin/forms.py:128 users/admin/forms.py:158
 msgid "Staff message"
@@ -6790,8 +6797,8 @@ msgstr "用户外号"
 
 #: users/admin/forms.py:397
 msgid ""
-"Optional, singular version of rank name displayed by user names. For example"
-" \"GM\" or \"Dev\"."
+"Optional, singular version of rank name displayed by user names. For example "
+"\"GM\" or \"Dev\"."
 msgstr "可选,展示在用户名旁边的级别名称。例如 “游戏大师” 或 “开发”。"
 
 #: users/admin/forms.py:407
@@ -6820,7 +6827,9 @@ msgstr "将此级别显示到用户标签"
 msgid ""
 "Selecting this option will make users with this rank easily discoverable by "
 "others through dedicated page on forum users list."
-msgstr "选择此选项将使得具有此级别的用户可以轻松地被其他人在论坛用户列表专用页上发现。"
+msgstr ""
+"选择此选项将使得具有此级别的用户可以轻松地被其他人在论坛用户列表专用页上发"
+"现。"
 
 #: users/admin/forms.py:447
 msgid "This name collides with other rank."
@@ -6881,7 +6890,9 @@ msgid ""
 "registration step. This is good if you want to block certain registrations "
 "like ones from recently comprimised e-mail providers, without harming "
 "existing users."
-msgstr "设置为“是”可以使得该封禁只在注册步骤生效。这能帮助你阻止来自近期被攻击的电子邮件提供商的用户注册,而不影响现有的用户。"
+msgstr ""
+"设置为“是”可以使得该封禁只在注册步骤生效。这能帮助你阻止来自近期被攻击的电子"
+"邮件提供商的用户注册,而不影响现有的用户。"
 
 #: users/admin/forms.py:512
 msgid "Banned value"
@@ -6892,7 +6903,9 @@ msgid ""
 "This value is case-insensitive and accepts asterisk (*) for rought matches. "
 "For example, making IP ban for value \"83.*\" will ban all IP addresses "
 "beginning with \"83.\"."
-msgstr "这个值不区分大小写,并接受*作为通配符。例如,设置IP封禁为\"83.*\",将会禁止所有以\"83.\"开头的 IP 地址。"
+msgstr ""
+"这个值不区分大小写,并接受*作为通配符。例如,设置IP封禁为\"83.*\",将会禁止所"
+"有以\"83.\"开头的 IP 地址。"
 
 #: users/admin/forms.py:520
 msgid "Banned value can't be longer than 250 characters."
@@ -6928,12 +6941,14 @@ msgstr "用户名或电子邮件"
 
 #: users/admin/forms.py:624
 msgid ""
-"Enter every item in new line. Duplicates will be ignored. This field is case"
-" insensitive. Depending on site configuration and amount of data to archive "
+"Enter every item in new line. Duplicates will be ignored. This field is case "
+"insensitive. Depending on site configuration and amount of data to archive "
 "it may take up to few days for requests to complete. E-mail will "
 "notification will be sent to every user once their download is ready."
 msgstr ""
-"在新行中输入每个项目。重复项将被忽略。此字段不区分大小写。根据站点配置和存档的数据量,请求最多可能需要几天时间才能完成。一旦每个用户的下载准备就绪,将向其发送电子邮件通知。"
+"在新行中输入每个项目。重复项将被忽略。此字段不区分大小写。根据站点配置和存档"
+"的数据量,请求最多可能需要几天时间才能完成。一旦每个用户的下载准备就绪,将向"
+"其发送电子邮件通知。"
 
 #: users/admin/forms.py:641
 #, python-format
@@ -7167,26 +7182,21 @@ msgstr "新用户 \"%(user)s\" 已成功注册。"
 msgid "User \"%(user)s\" has been edited."
 msgstr "已编辑用户 “%(user)s”。"
 
-#: users/api/auth.py:42 users/api/auth.py:92 users/api/auth.py:130
-#: users/api/auth.py:174
-msgid "Please use the 3rd party site to authenticate."
-msgstr "请使用第 3 方网站进行身份验证。"
-
-#: users/api/auth.py:100
+#: users/api/auth.py:94
 #, python-format
 msgid "Activate %(user)s account on %(forum_name)s forums"
 msgstr "在 %(forum_name)s 论坛中激活 %(user)s 的账号"
 
-#: users/api/auth.py:138
+#: users/api/auth.py:129
 #, python-format
 msgid "Change %(user)s password on %(forum_name)s forums"
 msgstr "在 %(forum_name)s 论坛中修改 %(user)s 的密码"
 
-#: users/api/auth.py:176
+#: users/api/auth.py:164
 msgid "Form link is invalid. Please try again."
 msgstr "表单链接无效。请再试一次。"
 
-#: users/api/auth.py:177
+#: users/api/auth.py:165
 msgid "Your link has expired. Please request new one."
 msgstr "你的链接已过期,请重新申请。"
 
@@ -7289,83 +7299,63 @@ msgstr "你无法查看其他用户名称的历史记录。"
 msgid "You have to sign in to perform this action."
 msgstr "你必须登录才能执行此操作。"
 
-#: users/api/users.py:90
-msgid "Please use the 3rd party site to register."
-msgstr "请使用第 3 方网站注册。"
-
-#: users/api/users.py:113
+#: users/api/users.py:110
 msgid "You can't change other users avatars."
 msgstr "你无法修改其他用户的头像。"
 
-#: users/api/users.py:125
+#: users/api/users.py:122
 msgid "You can't change other users options."
 msgstr "你不能更改其他用户选项。"
 
-#: users/api/users.py:130
+#: users/api/users.py:127
 msgid "Your forum options have been changed."
 msgstr "你的论坛设置已修改。"
 
-#: users/api/users.py:137
-msgid "Please use the 3rd party site to change your username."
-msgstr "请使用第 3 方网站修改你的用户名。"
-
-#: users/api/users.py:141
+#: users/api/users.py:133
 msgid "You can't change other users names."
 msgstr "你不能修改其他用户的名称。"
 
-#: users/api/users.py:148
+#: users/api/users.py:140
 msgid "You can't change other users signatures."
 msgstr "你不能修改其他用户的签名。"
 
-#: users/api/users.py:161
-msgid "Please use the 3rd party site to change your password."
-msgstr "请使用第 3 方网站更改你的密码。"
-
-#: users/api/users.py:165
+#: users/api/users.py:152
 msgid "You can't change other users passwords."
 msgstr "你不能修改其他用户的密码。"
 
-#: users/api/users.py:175
-msgid "Please use the 3rd party site to change your e-mail."
-msgstr "请使用第 3 方网站更改你的邮箱。"
-
-#: users/api/users.py:180
+#: users/api/users.py:162
 msgid "You can't change other users e-mail addresses."
 msgstr "你不能修改其他用户的电子邮件地址。"
 
-#: users/api/users.py:211
-msgid "Please use the 3rd party site to delete account."
-msgstr "请使用第 3 方网站删除你的账号。"
-
-#: users/api/users.py:292
+#: users/api/users.py:269
 msgid "You can't request data downloads for other users."
 msgstr "你不能为其他用户请求数据下载。"
 
-#: users/api/users.py:296
+#: users/api/users.py:273
 msgid "You can't download your data."
 msgstr "你不能下载你的数据。"
 
-#: users/api/users.py:301
+#: users/api/users.py:278
 msgid "You can't have more than one data download request at a single time."
 msgstr "你不能一次请求多个数据下载。"
 
-#: users/api/users.py:358
+#: users/api/users.py:335
 msgid "You can't see other users data downloads."
 msgstr "你无法看到其他用户的数据下载。"
 
-#: users/apps.py:33
+#: users/apps.py:30
 msgid "Edit details"
 msgstr "编辑详情"
 
-#: users/apps.py:39
+#: users/apps.py:36
 msgid "Change username"
 msgstr "修改用户名"
 
-#: users/apps.py:46
+#: users/apps.py:42
 msgid "Change email or password"
 msgstr "修改电子邮件或密码"
 
-#: users/apps.py:71
+#: users/apps.py:63
 msgid "Delete account"
 msgstr "删除帐号"
 
@@ -7444,7 +7434,7 @@ msgstr "输入的电子邮件无效。"
 msgid "No user with this e-mail exists."
 msgstr "没有使用此电子邮件的用户。"
 
-#: users/forms/auth.py:150 users/views/activation.py:51
+#: users/forms/auth.py:150 users/views/activation.py:46
 #, python-format
 msgid "%(user)s, your account is already active."
 msgstr "%(user)s,你的账号已激活。"
@@ -7466,6 +7456,14 @@ msgid ""
 "request new password."
 msgstr "请耐心等待管理员激活你的账号,然后你才能申请新密码。"
 
+#: users/forms/register.py:34 users/validators.py:80
+msgid "This username is not allowed."
+msgstr "不允许使用此用户名。"
+
+#: users/forms/register.py:45 users/validators.py:52
+msgid "This e-mail address is not allowed."
+msgstr "不能使用此电子邮件。"
+
 #: users/forms/register.py:51
 msgid "This agreement is required."
 msgstr "此协议是必需项。"
@@ -7557,7 +7555,8 @@ msgstr "激活"
 msgid ""
 "Designates whether this user should be treated as active. Unselect this "
 "instead of deleting accounts."
-msgstr "指定该用户是否应被视为激活状态。当需要删除账号请取消激活账号而不要删除它。"
+msgstr ""
+"指定该用户是否应被视为激活状态。当需要删除账号请取消激活账号而不要删除它。"
 
 #: users/permissions/account.py:10
 msgid "Account settings"
@@ -7863,10 +7862,12 @@ msgstr "网站"
 
 #: users/profilefields/default.py:41
 msgid ""
-"If you own website in the internet you wish to share on your profile you may"
-" enter its address here. Remember to for it to be valid http address "
-"starting with either \"http://\" or \"https://\"."
-msgstr "如果你想在个人资料内展示你的个人网站,你可以在这里填写你的网站地址.请保证它是有效的http地址,以http://或https://开头."
+"If you own website in the internet you wish to share on your profile you may "
+"enter its address here. Remember to for it to be valid http address starting "
+"with either \"http://\" or \"https://\"."
+msgstr ""
+"如果你想在个人资料内展示你的个人网站,你可以在这里填写你的网站地址.请保证它是"
+"有效的http地址,以http://或https://开头."
 
 #: users/profilefields/default.py:49
 msgid "Skype ID"
@@ -7885,12 +7886,12 @@ msgstr "推特用户名"
 #: users/profilefields/default.py:62
 #, python-format
 msgid ""
-"If you own Twitter account, here you may enter your Twitter handle for other"
-" users to find you. Starting your handle with \"@\" sign is optional. Either"
-" \"@%(slug)s\" or \"%(slug)s\" are valid values."
+"If you own Twitter account, here you may enter your Twitter handle for other "
+"users to find you. Starting your handle with \"@\" sign is optional. Either "
+"\"@%(slug)s\" or \"%(slug)s\" are valid values."
 msgstr ""
-"如果你拥有推特账户,你可以在此输入你的推特用户名,以便其他用户可以找到你。用户名开头的 “@” 是可选项,你可以输入 “@%(slug)s” 或者 "
-"“%(slug)s”。"
+"如果你拥有推特账户,你可以在此输入你的推特用户名,以便其他用户可以找到你。用"
+"户名开头的 “@” 是可选项,你可以输入 “@%(slug)s” 或者 “%(slug)s”。"
 
 #: users/profilefields/default.py:73
 msgid "This is not a valid twitter handle."
@@ -7990,47 +7991,34 @@ msgstr "输入的数据被禁止或不合法。"
 msgid "This email is not allowed."
 msgstr "此电子邮件不可用。"
 
-#: users/views/activation.py:21
-msgid "Please use the 3rd party site to activate your account."
-msgstr "请使用第 3 方网站激活你的账号。"
-
-#: users/views/activation.py:56
+#: users/views/activation.py:51
 #, python-format
 msgid ""
 "%(user)s, your activation link is invalid. Try again or request new "
 "activation link."
 msgstr "%(user)s,你的激活链接无效,请重试或者重新申请激活链接。"
 
-#: users/views/activation.py:74
+#: users/views/activation.py:69
 #, python-format
 msgid "%(user)s, your account has been activated!"
 msgstr "%(user)s,你的账号已激活!"
 
-#: users/views/forgottenpassword.py:18 users/views/options.py:70
-msgid "Please use the 3rd party site to change password."
-msgstr "请使用第 3 方网站修改密码。"
-
-#: users/views/forgottenpassword.py:45
+#: users/views/forgottenpassword.py:31
 #, python-format
-msgid ""
-"%(user)s, your link has expired. Please request new link and try again."
+msgid "%(user)s, your link has expired. Please request new link and try again."
 msgstr "%(user)s,你的链接已经过期,请申请一个新链接并重试。"
 
-#: users/views/forgottenpassword.py:52
+#: users/views/forgottenpassword.py:38
 #, python-format
 msgid "%(user)s, your link is invalid. Please try again or request new link."
 msgstr "%(user)s,你的链接不可用,请重试并申请一个新链接。"
 
-#: users/views/options.py:47
-msgid "Please use the 3rd party site to change e-mail."
-msgstr "请使用第 3 方网站修改邮箱。"
-
-#: users/views/options.py:59
+#: users/views/options.py:56
 #, python-format
 msgid "%(user)s, your e-mail has been changed."
 msgstr "%(user)s, 你的电子邮件已被修改。"
 
-#: users/views/options.py:80
+#: users/views/options.py:74
 #, python-format
 msgid "%(user)s, your password has been changed."
 msgstr "%(user)s,你的密码已被修改。"

BIN
misago/locale/zh_Hans/LC_MESSAGES/djangojs.mo


+ 84 - 74
misago/locale/zh_Hans/LC_MESSAGES/djangojs.po

@@ -2,7 +2,7 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 # Translators:
 # ZZLL <zhuolun1996@gmail.com>, 2017
 # Paradox506 <Renyi_14@whu.edu.cn>, 2017
@@ -10,20 +10,21 @@
 # cxgreat2014 <fwy1998@gmail.com>, 2018
 # 蚂蚁先生 <pzf_karl@hotmail.com>, 2019
 # Percy <scvoet@gmail.com>, 2020
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 19:34+0000\n"
+"POT-Creation-Date: 2022-10-31 23:26+0000\n"
 "PO-Revision-Date: 2017-01-16 00:04+0000\n"
 "Last-Translator: Percy <scvoet@gmail.com>, 2020\n"
-"Language-Team: Chinese (China) (https://www.transifex.com/misago/teams/65369/zh_CN/)\n"
+"Language-Team: Chinese (China) (https://www.transifex.com/misago/teams/65369/"
+"zh_CN/)\n"
+"Language: zh_CN\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: zh_CN\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #: static/misago/admin/index.js:16
@@ -380,8 +381,8 @@ msgstr "最佳答案"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Please select the best answer for your newly merged thread. No posts will be"
-" deleted during the merge."
+"Please select the best answer for your newly merged thread. No posts will be "
+"deleted during the merge."
 msgstr "请为新合并的话题选择最佳答案。合并期间不会删除帖子。"
 
 #: static/misago/js/misago.js:1
@@ -468,9 +469,11 @@ msgstr "删除帐号"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You are going to delete your account. This action is nonreversible, and will"
-" result in following data being deleted:"
-msgstr "你正准备删除你的账户,此操作是不可逆的,请再考虑一下!如果你执意要删除账户,我必须提醒你,如下数据将被删除:"
+"You are going to delete your account. This action is nonreversible, and will "
+"result in following data being deleted:"
+msgstr ""
+"你正准备删除你的账户,此操作是不可逆的,请再考虑一下!如果你执意要删除账户,"
+"我必须提醒你,如下数据将被删除:"
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -490,9 +493,11 @@ msgstr "你的电子邮件将可用于新帐户注册。"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"All your posted content will NOT be deleted, but username associated with it"
-" will be changed to one shared by all deleted accounts."
-msgstr "你发布的所有内容都不会被删除,但与其关联的用户名将被更改为由所有已删除帐户共享的用户名。"
+"All your posted content will NOT be deleted, but username associated with it "
+"will be changed to one shared by all deleted accounts."
+msgstr ""
+"你发布的所有内容都不会被删除,但与其关联的用户名将被更改为由所有已删除帐户共"
+"享的用户名。"
 
 #: static/misago/js/misago.js:1
 msgid "Delete my account"
@@ -514,8 +519,9 @@ msgid ""
 "your download to be prepared. An e-mail with notification will be sent to "
 "you when your data is ready to be downloaded."
 msgstr ""
-"要从网站下载数据, 请单击 \"请求数据下载\" 按钮。根据要存档的数据量以及希望在同一时间下载数据的用户数, "
-"你的下载准备就绪可能需要几天时间。当你的数据准备好下载时, 将向你发送带有通知的电子邮件。"
+"要从网站下载数据, 请单击 \"请求数据下载\" 按钮。根据要存档的数据量以及希望在"
+"同一时间下载数据的用户数, 你的下载准备就绪可能需要几天时间。当你的数据准备好"
+"下载时, 将向你发送带有通知的电子邮件。"
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -684,6 +690,10 @@ msgid "Change forgotten password"
 msgstr "忘记密码"
 
 #: static/misago/js/misago.js:1
+msgid "%(user)s has been made new thread owner."
+msgstr "%(user)s 已经成为话题的新拥有者。"
+
+#: static/misago/js/misago.js:1
 msgid "You have left this thread."
 msgstr "你已经离开了这个话题。"
 
@@ -692,10 +702,6 @@ msgid "%(user)s has been removed from this thread."
 msgstr "已从话题中移除了 %(user)s 。"
 
 #: static/misago/js/misago.js:1
-msgid "%(user)s has been made new thread owner."
-msgstr "%(user)s 已经成为话题的新拥有者。"
-
-#: static/misago/js/misago.js:1
 msgid "See profile"
 msgstr "查看个人资料"
 
@@ -836,7 +842,9 @@ msgid ""
 "showing which users voted for which choices and at which times. This option "
 "can't be changed after poll's creation. Moderators may see voting details "
 "for all polls."
-msgstr "设为公开将允许所有人查看投票详情,将显示哪些用户在哪些时间投票选择了哪些选项。这个选项在投票建立后无法更改。版主可以查看所有投票的详情。"
+msgstr ""
+"设为公开将允许所有人查看投票详情,将显示哪些用户在哪些时间投票选择了哪些选"
+"项。这个选项在投票建立后无法更改。版主可以查看所有投票的详情。"
 
 #: static/misago/js/misago.js:1
 msgid "Votes are public"
@@ -945,8 +953,7 @@ msgstr "还原"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you with to revert this post to the state from before this "
-"edit?"
+"Are you sure you with to revert this post to the state from before this edit?"
 msgstr "你确定还原这个帖子为编辑之前的状态嘛?"
 
 #: static/misago/js/misago.js:1
@@ -1097,7 +1104,8 @@ msgid ""
 msgid_plural ""
 "Thread title should be at least %(limit_value)s characters long (it has "
 "%(show_value)s)."
-msgstr[0] "话题名称至少需要 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
+msgstr[0] ""
+"话题名称至少需要 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -1106,7 +1114,8 @@ msgid ""
 msgid_plural ""
 "Thread title cannot be longer than %(limit_value)s characters (it has "
 "%(show_value)s)."
-msgstr[0] "话题名称最多包含 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
+msgstr[0] ""
+"话题名称最多包含 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -1115,7 +1124,8 @@ msgid ""
 msgid_plural ""
 "Posted message should be at least %(limit_value)s characters long (it has "
 "%(show_value)s)."
-msgstr[0] "发帖内容至少需要 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
+msgstr[0] ""
+"发帖内容至少需要 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -1124,7 +1134,8 @@ msgid ""
 msgid_plural ""
 "Posted message cannot be longer than %(limit_value)s characters (it has "
 "%(show_value)s)."
-msgstr[0] "发帖内容最多包含 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
+msgstr[0] ""
+"发帖内容最多包含 %(limit_value)s 个字符(现有 %(show_value)s 个字符)。"
 
 #: static/misago/js/misago.js:1
 msgid "Hide"
@@ -1350,16 +1361,16 @@ msgid "This post is hidden. Only users with permission may see its contents."
 msgstr "这个帖子是隐藏的。只有拥有相关权限的用户才可以看到其内容。"
 
 #: static/misago/js/misago.js:1
-msgid ""
-"This post is unapproved. Only users with permission to approve posts and its"
-" author may see its contents."
-msgstr "此帖子未批准。只有拥有审批帖子权限的用户及作者可以看到它的内容。"
-
-#: static/misago/js/misago.js:1
 msgid "This post is protected. Only moderators may change it."
 msgstr "此贴已锁定,只有版主可修改。"
 
 #: static/misago/js/misago.js:1
+msgid ""
+"This post is unapproved. Only users with permission to approve posts and its "
+"author may see its contents."
+msgstr "此帖子未批准。只有拥有审批帖子权限的用户及作者可以看到它的内容。"
+
+#: static/misago/js/misago.js:1
 msgid "Liked"
 msgstr "已赞"
 
@@ -1455,52 +1466,52 @@ msgid "%(username)s's details have been updated."
 msgstr "%(username)s 的资料已更新。"
 
 #: static/misago/js/misago.js:1
-msgid "You have no started threads."
-msgstr "你还没有发起过话题。"
+msgid "You have posted no messages."
+msgstr "你还没有发布信息。"
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s started no threads."
-msgstr "%(username)s 还没有发起过话题。"
+msgid "%(username)s posted no messages."
+msgstr "%(username)s 还没有发布信息。"
 
 #: static/misago/js/misago.js:1
-msgid "You have started %(threads)s thread."
-msgid_plural "You have started %(threads)s threads."
-msgstr[0] "你已经发起了 %(threads)s 个话题。"
+msgid "You have posted %(posts)s message."
+msgid_plural "You have posted %(posts)s messages."
+msgstr[0] "你发布了 %(posts)s 条信息。"
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s has started %(threads)s thread."
-msgid_plural "%(username)s has started %(threads)s threads."
-msgstr[0] "%(username)s 已发起 %(threads)s 个话题。"
+msgid "%(username)s has posted %(posts)s message."
+msgid_plural "%(username)s has posted %(posts)s messages."
+msgstr[0] "%(username)s 发布了 %(posts)s 条信息。"
 
 #: static/misago/js/misago.js:1
 msgid "Loading..."
 msgstr "正在加载..."
 
 #: static/misago/js/misago.js:1
-msgid "Threads"
-msgstr "话题"
+msgid "Posts"
+msgstr "帖子"
 
 #: static/misago/js/misago.js:1
-msgid "You have posted no messages."
-msgstr "你还没有发布信息。"
+msgid "You have no started threads."
+msgstr "你还没有发起过话题。"
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s posted no messages."
-msgstr "%(username)s 还没有发布信息。"
+msgid "%(username)s started no threads."
+msgstr "%(username)s 还没有发起过话题。"
 
 #: static/misago/js/misago.js:1
-msgid "You have posted %(posts)s message."
-msgid_plural "You have posted %(posts)s messages."
-msgstr[0] "你发布了 %(posts)s 条信息。"
+msgid "You have started %(threads)s thread."
+msgid_plural "You have started %(threads)s threads."
+msgstr[0] "你已经发起了 %(threads)s 个话题。"
 
 #: static/misago/js/misago.js:1
-msgid "%(username)s has posted %(posts)s message."
-msgid_plural "%(username)s has posted %(posts)s messages."
-msgstr[0] "%(username)s 发布了 %(posts)s 条信息。"
+msgid "%(username)s has started %(threads)s thread."
+msgid_plural "%(username)s has started %(threads)s threads."
+msgstr[0] "%(username)s 已发起 %(threads)s 个话题。"
 
 #: static/misago/js/misago.js:1
-msgid "Posts"
-msgstr "帖子"
+msgid "Threads"
+msgstr "话题"
 
 #: static/misago/js/misago.js:1
 msgid "Show older activity"
@@ -1776,7 +1787,8 @@ msgstr "%(username)s 你好,你的帐号已创建,但你需要激活它之
 msgid ""
 "%(username)s, your account has been created but board administrator will "
 "have to activate it before you will be able to sign in."
-msgstr "%(username)s 你好,你的帐号已创建,但必须在管理员激活它之后才可以登录。"
+msgstr ""
+"%(username)s 你好,你的帐号已创建,但必须在管理员激活它之后才可以登录。"
 
 #: static/misago/js/misago.js:1
 msgid ""
@@ -1957,8 +1969,7 @@ msgstr "%(user)s 最后回复于 %(date)s"
 
 #: static/misago/js/misago.js:1
 msgid ""
-"Are you sure you want to merge selected posts? This action is not "
-"reversible!"
+"Are you sure you want to merge selected posts? This action is not reversible!"
 msgstr "你确定要合并选定的帖子吗?这个操作是不可逆的!"
 
 #: static/misago/js/misago.js:1
@@ -2294,8 +2305,8 @@ msgstr "你不可以移动话题,因为没有接收你移动话题的版块。
 
 #: static/misago/js/misago.js:1
 msgid ""
-"You need permission to start threads in category to be able to merge threads"
-" to it."
+"You need permission to start threads in category to be able to merge threads "
+"to it."
 msgstr "你必须有权限在版块中发起话题,才可以向相应版块中合并话题。"
 
 #: static/misago/js/misago.js:1
@@ -2550,17 +2561,21 @@ msgid "You are banned"
 msgstr "你被封禁了"
 
 #: static/misago/js/misago.js:1
-msgid "You have to accept the terms of service."
-msgstr "你需要接受服务条款。"
+msgid "Valid password must be at least %(limit_value)s character long."
+msgid_plural "Valid password must be at least %(limit_value)s characters long."
+msgstr[0] "有效的密码最少需要 %(limit_value)s 字符。"
 
 #: static/misago/js/misago.js:1
 msgid "You have to accept the privacy policy."
 msgstr "你需要接受隐私政策。"
 
 #: static/misago/js/misago.js:1
-msgid "Username must be at least %(limit_value)s character long."
-msgid_plural "Username must be at least %(limit_value)s characters long."
-msgstr[0] "用户名至少需要 %(limit_value)s 个字符。"
+msgid "You have to accept the terms of service."
+msgstr "你需要接受服务条款。"
+
+#: static/misago/js/misago.js:1
+msgid "Username can only contain latin alphabet letters and digits."
+msgstr "用户名只可以包含拉丁字母和数字。"
 
 #: static/misago/js/misago.js:1
 msgid "Username cannot be longer than %(limit_value)s character."
@@ -2568,14 +2583,9 @@ msgid_plural "Username cannot be longer than %(limit_value)s characters."
 msgstr[0] "用户名不可以超过 %(limit_value)s 个字符。"
 
 #: static/misago/js/misago.js:1
-msgid "Username can only contain latin alphabet letters and digits."
-msgstr "用户名只可以包含拉丁字母和数字。"
-
-#: static/misago/js/misago.js:1
-msgid "Valid password must be at least %(limit_value)s character long."
-msgid_plural ""
-"Valid password must be at least %(limit_value)s characters long."
-msgstr[0] "有效的密码最少需要 %(limit_value)s 字符。"
+msgid "Username must be at least %(limit_value)s character long."
+msgid_plural "Username must be at least %(limit_value)s characters long."
+msgstr[0] "用户名至少需要 %(limit_value)s 个字符。"
 
 #: static/misago/js/misago.js:1
 msgid "This field is required."

+ 0 - 2
misago/markup/__init__.py

@@ -1,5 +1,3 @@
 from .finalize import finalize_markup
 from .flavours import common as common_flavour, signature as signature_flavour
 from .parser import parse
-
-default_app_config = "misago.markup.apps.MisagoMarkupConfig"

+ 82 - 2
misago/markup/bbcode/code.py

@@ -1,15 +1,18 @@
 import re
 
 import markdown
+from markdown.extensions.attr_list import AttrListExtension
 from markdown.extensions.fenced_code import FencedBlockPreprocessor
+from markdown.extensions.codehilite import CodeHilite, CodeHiliteExtension
+from markdown.serializers import _escape_attrib_html
 
 
 class CodeBlockExtension(markdown.Extension):
     def extendMarkdown(self, md):
         md.registerExtension(self)
 
-        md.preprocessors.add(
-            "misago_code_bbcode", CodeBlockPreprocessor(md), ">normalize_whitespace"
+        md.preprocessors.register(
+            CodeBlockPreprocessor(md, self.getConfigs()), "misago_code_bbcode", 24
         )
 
 
@@ -20,3 +23,80 @@ class CodeBlockPreprocessor(FencedBlockPreprocessor):
 """,
         re.IGNORECASE | re.MULTILINE | re.DOTALL | re.VERBOSE,
     )
+
+    def run(self, lines):
+        """Match and store Fenced Code Blocks in the HtmlStash."""
+
+        # Check for dependent extensions
+        if not self.checked_for_deps:
+            for ext in self.md.registeredExtensions:
+                if isinstance(ext, CodeHiliteExtension):
+                    self.codehilite_conf = ext.getConfigs()
+                if isinstance(ext, AttrListExtension):
+                    self.use_attr_list = True
+
+            self.checked_for_deps = True
+
+        text = "\n".join(lines)
+        while 1:
+            m = self.FENCED_BLOCK_RE.search(text)
+            if m:
+                lang, id, classes, config = None, "", [], {}
+                if m.group("lang"):
+                    lang = m.group("lang")
+
+                # If config is not empty, then the codehighlite extension
+                # is enabled, so we call it to highlight the code
+                if (
+                    self.codehilite_conf
+                    and self.codehilite_conf["use_pygments"]
+                    and config.get("use_pygments", True)
+                ):
+                    local_config = self.codehilite_conf.copy()
+                    local_config.update(config)
+                    # Combine classes with cssclass. Ensure cssclass is at end
+                    # as pygments appends a suffix under certain circumstances.
+                    # Ignore ID as Pygments does not offer an option to set it.
+                    if classes:
+                        local_config["css_class"] = "{} {}".format(
+                            " ".join(classes), local_config["css_class"]
+                        )
+                    highliter = CodeHilite(
+                        m.group("code"),
+                        lang=lang,
+                        style=local_config.pop("pygments_style", "default"),
+                        **local_config,
+                    )
+
+                    code = highliter.hilite(shebang=False)
+                else:
+                    id_attr = lang_attr = class_attr = kv_pairs = ""
+                    if lang:
+                        lang_attr = f' class="{_escape_attrib_html(lang)}"'
+                    if classes:
+                        class_attr = (
+                            f' class="{_escape_attrib_html(" ".join(classes))}"'
+                        )
+                    if id:
+                        id_attr = f' id="{_escape_attrib_html(id)}"'
+                    if (
+                        self.use_attr_list
+                        and config
+                        and not config.get("use_pygments", False)
+                    ):
+                        # Only assign key/value pairs to code element if attr_list ext is enabled, key/value pairs
+                        # were defined on the code block, and the `use_pygments` key was not set to True. The
+                        # `use_pygments` key could be either set to False or not defined. It is omitted from output.
+                        kv_pairs = "".join(
+                            f' {k}="{_escape_attrib_html(v)}"'
+                            for k, v in config.items()
+                            if k != "use_pygments"
+                        )
+                    code = self._escape(m.group("code"))
+                    code = f"<pre{id_attr}{class_attr}><code{lang_attr}{kv_pairs}>{code}</code></pre>"
+
+                placeholder = self.md.htmlStash.store(code)
+                text = f"{text[:m.start()]}\n{placeholder}\n{text[m.end():]}"
+            else:
+                break
+        return text.split("\n")

+ 35 - 37
misago/markup/bbcode/inline.py

@@ -2,14 +2,14 @@
 Supported inline BBCodes: b, u, i
 """
 import re
+from xml.etree.ElementTree import Element
 
 from markdown.inlinepatterns import (
-    ImagePattern,
-    LinkPattern,
+    ImageInlineProcessor,
+    LinkInlineProcessor,
+    Pattern,
     SimpleTagPattern,
     dequote,
-    handleAttributes,
-    util,
 )
 
 
@@ -36,51 +36,48 @@ italics = SimpleBBCodePattern("i")
 underline = SimpleBBCodePattern("u")
 
 
-class BBcodePattern:
-    def __init__(self, pattern, markdown_instance=None):
+class BBcodeProcessor(Pattern):
+    def __init__(self, pattern, md=None):
         self.pattern = pattern
         self.compiled_re = re.compile(
             "^(.*?)%s(.*)$" % pattern, re.DOTALL | re.UNICODE | re.IGNORECASE
         )
 
         self.safe_mode = False
-        if markdown_instance:
-            self.markdown = markdown_instance
-
-
-class BBCodeImagePattern(BBcodePattern, ImagePattern):
-    def handleMatch(self, m):
-        el = util.etree.Element("img")
-        src_parts = m.group(2).split()
-        if src_parts:
-            src = src_parts[0]
-            if src[0] == "<" and src[-1] == ">":
-                src = src[1:-1]
-            el.set("src", self.sanitize_url(self.unescape(src)))
-        else:
-            el.set("src", "")
-        if len(src_parts) > 1:
-            el.set("title", dequote(self.unescape(" ".join(src_parts[1:]))))
+        if md:
+            self.md = md
 
-        if self.markdown.enable_attributes:
-            truealt = handleAttributes(m.group(2), el)
-        else:
-            truealt = m.group(2)
 
-        el.set("alt", self.unescape(truealt))
-        return el
+class BBCodeImageProcessor(BBcodeProcessor, ImageInlineProcessor):
+    def handleMatch(self, m, _):
+        el = Element("img")
+
+        src = m.group("content").strip()
+        el.set("src", self.unescape(src))
+
+        alt_text = src.replace('"', "&quot;")
+        if alt_text.lower()[:6] == "https:":
+            alt_text = alt_text[6:]
+        elif alt_text.lower()[:5] == "http:":
+            alt_text = alt_text[5:]
 
+        alt_text = alt_text.lstrip("/")
 
-IMAGE_PATTERN = r"\[img\](.*?)\[/img\]"
+        el.set("alt", alt_text)
+
+        return el, m.start("open"), m.end("close")
+
+
+IMAGE_PATTERN = r"(?P<open>\[img\])(?P<content>.*?)(?P<close>\[/img\])"
 
 
 def image(md):
-    return BBCodeImagePattern(IMAGE_PATTERN, md)
+    return BBCodeImageProcessor(IMAGE_PATTERN, md)
 
 
-class BBCodeUrlPattern(BBcodePattern, LinkPattern):
-    def handleMatch(self, m):
-        el = util.etree.Element("a")
+class BBCodeUrlPattern(BBcodeProcessor, LinkInlineProcessor):
+    def handleMatch(self, m, _):
+        el = Element("a")
 
         if m.group("arg"):
             el.text = m.group("content")
@@ -90,13 +87,14 @@ class BBCodeUrlPattern(BBcodePattern, LinkPattern):
             href = m.group("content")
 
         if href:
-            el.set("href", self.sanitize_url(self.unescape(href.strip())))
+            el.set("href", self.unescape(href.strip()))
         else:
             el.set("href", "")
-        return el
+
+        return el, m.start("open"), m.end("close")
 
 
-URL_PATTERN = r'((\[url=("?)(?P<arg>.*?)("?)\])|(\[url\]))(?P<content>.*?)\[/url\]'
+URL_PATTERN = r'(?P<open>(\[url=("?)(?P<arg>.*?)("?)\])|(\[url\]))(?P<content>.*?)(?P<close>\[/url\])'
 
 
 def url(md):

+ 7 - 7
misago/markup/bbcode/quote.py

@@ -1,10 +1,10 @@
 import re
+from xml.etree.ElementTree import SubElement
 
 import markdown
 from django.utils.crypto import get_random_string
 from markdown.blockprocessors import BlockProcessor
 from markdown.preprocessors import Preprocessor
-from markdown.util import etree
 
 QUOTE_START = get_random_string(32)
 QUOTE_END = get_random_string(32)
@@ -14,9 +14,9 @@ class QuoteExtension(markdown.Extension):
     def extendMarkdown(self, md):
         md.registerExtension(self)
 
-        md.preprocessors.add("misago_bbcode_quote", QuotePreprocessor(md), "_end")
-        md.parser.blockprocessors.add(
-            "misago_bbcode_quote", QuoteBlockProcessor(md.parser), ">code"
+        md.preprocessors.register(QuotePreprocessor(md), "misago_bbcode_quote", 200)
+        md.parser.blockprocessors.register(
+            QuoteBlockProcessor(md.parser), "misago_bbcode_quote", 90
         )
 
 
@@ -81,13 +81,13 @@ class QuoteBlockProcessor(BlockProcessor):
             children, self._children = self._children[1:-1], []
             title, self._title = self._title, None
 
-            aside = etree.SubElement(parent, "aside")
+            aside = SubElement(parent, "aside")
             aside.set("class", "quote-block")
 
-            heading = etree.SubElement(aside, "div")
+            heading = SubElement(aside, "div")
             heading.set("class", "quote-heading")
 
-            blockquote = etree.SubElement(aside, "blockquote")
+            blockquote = SubElement(aside, "blockquote")
             blockquote.set("class", "quote-body")
 
             if title:

+ 8 - 8
misago/markup/bbcode/spoiler.py

@@ -1,10 +1,10 @@
 import re
+from xml.etree.ElementTree import SubElement
 
 import markdown
 from django.utils.crypto import get_random_string
 from markdown.blockprocessors import BlockProcessor
 from markdown.preprocessors import Preprocessor
-from markdown.util import etree
 
 SPOILER_START = get_random_string(32)
 SPOILER_END = get_random_string(32)
@@ -14,9 +14,9 @@ class SpoilerExtension(markdown.Extension):
     def extendMarkdown(self, md):
         md.registerExtension(self)
 
-        md.preprocessors.add("misago_bbcode_spoiler", SpoilerPreprocessor(md), "_end")
-        md.parser.blockprocessors.add(
-            "misago_bbcode_spoiler", SpoilerBlockProcessor(md.parser), ">code"
+        md.preprocessors.register(SpoilerPreprocessor(md), "misago_bbcode_spoiler", 200)
+        md.parser.blockprocessors.register(
+            SpoilerBlockProcessor(md.parser), "misago_bbcode_spoiler", 85
         )
 
 
@@ -61,16 +61,16 @@ class SpoilerBlockProcessor(BlockProcessor):
         if not self._spoiler:
             children, self._children = self._children[1:-1], []
 
-            aside = etree.SubElement(parent, "aside")
+            aside = SubElement(parent, "aside")
             aside.set("class", "spoiler-block")
 
-            blockquote = etree.SubElement(aside, "blockquote")
+            blockquote = SubElement(aside, "blockquote")
             blockquote.set("class", "spoiler-body")
 
-            overlay = etree.SubElement(aside, "div")
+            overlay = SubElement(aside, "div")
             overlay.set("class", "spoiler-overlay")
 
-            reveal_btn = etree.SubElement(overlay, "button")
+            reveal_btn = SubElement(overlay, "button")
             reveal_btn.set("class", "spoiler-reveal")
             reveal_btn.set("type", "button")
 

+ 15 - 12
misago/markup/md/shortimgs.py

@@ -1,6 +1,7 @@
+from xml.etree.ElementTree import Element
+
 import markdown
-from markdown.inlinepatterns import LinkPattern
-from markdown.util import etree
+from markdown.inlinepatterns import LinkInlineProcessor
 
 IMAGES_RE = r"\!\((<.*?>|([^\)]*))\)"
 
@@ -8,16 +9,18 @@ IMAGES_RE = r"\!\((<.*?>|([^\)]*))\)"
 class ShortImagesExtension(markdown.Extension):
     def extendMarkdown(self, md):
         md.registerExtension(self)
-        md.inlinePatterns.add(
-            "misago_short_images", ShortImagePattern(IMAGES_RE, md), "_end"
+        md.inlinePatterns.register(
+            ShortImagePattern(IMAGES_RE, md), "misago_short_images", 200
         )
 
 
-class ShortImagePattern(LinkPattern):
-    def handleMatch(self, m):
-        img_src = m.groups()[2].strip()
-        if img_src:
-            img = etree.Element("img")
-            img.set("src", img_src)
-            img.set("alt", img_src)
-            return img
+class ShortImagePattern(LinkInlineProcessor):
+    def handleMatch(self, m, _):
+        img_src = m.groups()[1].strip()
+        if not img_src:
+            return None, None, None
+
+        img = Element("img")
+        img.set("src", img_src)
+        img.set("alt", img_src)
+        return img, m.start(0), m.end(0)

+ 2 - 2
misago/markup/md/strikethrough.py

@@ -7,6 +7,6 @@ STRIKETHROUGH_RE = r"(~{2})(.+?)\2"
 class StrikethroughExtension(markdown.Extension):
     def extendMarkdown(self, md):
         md.registerExtension(self)
-        md.inlinePatterns.add(
-            "misago_strikethrough", SimpleTagPattern(STRIKETHROUGH_RE, "del"), "_end"
+        md.inlinePatterns.register(
+            SimpleTagPattern(STRIKETHROUGH_RE, "del"), "misago_strikethrough", 100
         )

+ 25 - 25
misago/markup/parser.py

@@ -82,19 +82,19 @@ def md_factory(allow_links=True, allow_images=True, allow_blocks=True):
     md = markdown.Markdown(extensions=["markdown.extensions.nl2br"])
 
     # Remove HTML allowances
-    del md.preprocessors["html_block"]
-    del md.inlinePatterns["html"]
+    md.preprocessors.deregister("html_block")
+    md.inlinePatterns.deregister("html")
 
     # Remove references
-    del md.preprocessors["reference"]
-    del md.inlinePatterns["reference"]
-    del md.inlinePatterns["image_reference"]
-    del md.inlinePatterns["short_reference"]
+    md.parser.blockprocessors.deregister("reference")
+    md.inlinePatterns.deregister("reference")
+    md.inlinePatterns.deregister("image_reference")
+    md.inlinePatterns.deregister("short_reference")
 
     # Add [b], [i], [u]
-    md.inlinePatterns.add("bb_b", bold, "<strong")
-    md.inlinePatterns.add("bb_i", italics, "<emphasis")
-    md.inlinePatterns.add("bb_u", underline, "<emphasis2")
+    md.inlinePatterns.register(bold, "bb_b", 55)
+    md.inlinePatterns.register(italics, "bb_i", 55)
+    md.inlinePatterns.register(underline, "bb_u", 55)
 
     # Add ~~deleted~~
     strikethrough_md = StrikethroughExtension()
@@ -102,28 +102,28 @@ def md_factory(allow_links=True, allow_images=True, allow_blocks=True):
 
     if allow_links:
         # Add [url]
-        md.inlinePatterns.add("bb_url", url(md), "<link")
+        md.inlinePatterns.register(url(md), "bb_url", 155)
     else:
         # Remove links
-        del md.inlinePatterns["link"]
-        del md.inlinePatterns["autolink"]
-        del md.inlinePatterns["automail"]
+        md.inlinePatterns.deregister("link")
+        md.inlinePatterns.deregister("autolink")
+        md.inlinePatterns.deregister("automail")
 
     if allow_images:
         # Add [img]
-        md.inlinePatterns.add("bb_img", image(md), "<image_link")
+        md.inlinePatterns.register(image(md), "bb_img", 145)
         short_images_md = ShortImagesExtension()
         short_images_md.extendMarkdown(md)
     else:
         # Remove images
-        del md.inlinePatterns["image_link"]
+        md.inlinePatterns.deregister("image_link")
 
     if allow_blocks:
         # Add [hr] and [quote] blocks
-        md.parser.blockprocessors.add("bb_hr", BBCodeHRProcessor(md.parser), ">hr")
+        md.parser.blockprocessors.register(BBCodeHRProcessor(md.parser), "bb_hr", 45)
 
-        fenced_code = FencedCodeExtension()
-        fenced_code.extendMarkdown(md, None)
+        fenced_code = FencedCodeExtension(lang_prefix="")
+        fenced_code.extendMarkdown(md)
 
         code_bbcode = CodeBlockExtension()
         code_bbcode.extendMarkdown(md)
@@ -135,13 +135,13 @@ def md_factory(allow_links=True, allow_images=True, allow_blocks=True):
         spoiler_bbcode.extendMarkdown(md)
     else:
         # Remove blocks
-        del md.parser.blockprocessors["hashheader"]
-        del md.parser.blockprocessors["setextheader"]
-        del md.parser.blockprocessors["code"]
-        del md.parser.blockprocessors["quote"]
-        del md.parser.blockprocessors["hr"]
-        del md.parser.blockprocessors["olist"]
-        del md.parser.blockprocessors["ulist"]
+        md.parser.blockprocessors.deregister("hashheader")
+        md.parser.blockprocessors.deregister("setextheader")
+        md.parser.blockprocessors.deregister("code")
+        md.parser.blockprocessors.deregister("quote")
+        md.parser.blockprocessors.deregister("hr")
+        md.parser.blockprocessors.deregister("olist")
+        md.parser.blockprocessors.deregister("ulist")
 
     return pipeline.extend_markdown(md)
 

+ 8 - 8
misago/markup/tests/snapshots/snap_test_code_bbcode.py

@@ -7,13 +7,9 @@ from snapshottest import Snapshot
 
 snapshots = Snapshot()
 
-snapshots["test_single_line_code 1"] = '<pre><code>echo("Hello!");</code></pre>'
-
 snapshots[
-    "test_multi_line_code 1"
-] = """<pre><code>echo("Hello!");
-
-echo("World!");</code></pre>"""
+    "test_code_block_disables_parsing 1"
+] = "<pre><code>Dolor [b]met.[/b]</code></pre>"
 
 snapshots[
     "test_code_with_language_parameter 1"
@@ -24,5 +20,9 @@ snapshots[
 ] = '<pre><code class="php">echo("Hello!");</code></pre>'
 
 snapshots[
-    "test_code_block_disables_parsing 1"
-] = "<pre><code>Dolor [b]met.[/b]</code></pre>"
+    "test_multi_line_code 1"
+] = """<pre><code>&lt;script&gt;
+alert("!")
+&lt;/script&gt;</code></pre>"""
+
+snapshots["test_single_line_code 1"] = '<pre><code>echo("Hello!");</code></pre>'

+ 26 - 0
misago/markup/tests/snapshots/snap_test_code_md.py

@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# snapshottest: v1 - https://goo.gl/zC4yUc
+from __future__ import unicode_literals
+
+from snapshottest import Snapshot
+
+
+snapshots = Snapshot()
+
+snapshots[
+    "test_multi_line_code_markdown 1"
+] = """<pre><code>&lt;script&gt;
+alert("!")
+&lt;/script&gt;
+</code></pre>"""
+
+snapshots[
+    "test_multi_line_code_markdown_with_language 1"
+] = """<pre><code class="javascript">&lt;script&gt;
+alert("!")
+&lt;/script&gt;
+</code></pre>"""
+
+snapshots[
+    "test_single_line_code_markdown 1"
+] = '<p><code>&lt;script&gt;alert("!")&lt;/script&gt;</code></p>'

+ 29 - 0
misago/markup/tests/snapshots/snap_test_escaping.py

@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# snapshottest: v1 - https://goo.gl/zC4yUc
+from __future__ import unicode_literals
+
+from snapshottest import Snapshot
+
+
+snapshots = Snapshot()
+
+snapshots[
+    "test_code_in_quote_bbcode_is_escaped 1"
+] = """<aside class="quote-block">
+<div class="quote-heading"></div>
+<blockquote class="quote-body">
+<p>&lt;script&gt;alert("!")&lt;/script&gt;</p>
+</blockquote>
+</aside>"""
+
+snapshots[
+    "test_code_in_quote_markdown_is_escaped 1"
+] = """<blockquote>
+<p>&lt;script&gt;alert("!")&lt;/script&gt;</p>
+</blockquote>"""
+
+snapshots[
+    "test_inline_code_is_escaped 1"
+] = '<p><code>&lt;script&gt;alert("!")&lt;/script&gt;</code></p>'
+
+snapshots["test_text_is_escaped 1"] = '<p>&lt;script&gt;alert("!")&lt;/script&gt;</p>'

+ 25 - 7
misago/markup/tests/snapshots/snap_test_inline_bbcode.py

@@ -9,27 +9,45 @@ snapshots = Snapshot()
 
 snapshots["test_bold_bbcode 1"] = "<p>Lorem <b>ipsum</b>!</p>"
 
-snapshots["test_italics_bbcode 1"] = "<p>Lorem <i>ipsum</i>!</p>"
+snapshots[
+    "test_image_bbcode 1"
+] = '<p>Lorem <img alt="placekitten.com/g/1200/500" src="https://placekitten.com/g/1200/500"/> ipsum</p>'
 
-snapshots["test_underline_bbcode 1"] = "<p>Lorem <u>ipsum</u>!</p>"
+snapshots[
+    "test_image_bbcode_is_case_insensitive 1"
+] = '<p>Lorem <img alt="placekitten.com/g/1200/500" src="https://placekitten.com/g/1200/500"/> ipsum</p>'
+
+snapshots[
+    "test_image_bbcode_is_escaped 1"
+] = "<p>Lorem <img alt='&lt;script language=\"application/javascript\"&gt;' src='http://&lt;script language=\"application/javascript\"&gt;'/> ipsum</p>"
+
+snapshots["test_inline_bbcode_can_be_mixed 1"] = "<p>Lorem <b><u>ipsum</u></b>!</p>"
 
 snapshots[
     "test_inline_bbcode_can_be_mixed_with_markdown 1"
 ] = "<p>Lorem <b><strong>ipsum</strong></b>!</p>"
 
-snapshots[
-    "test_image_bbcode 1"
-] = '<p>Lorem <img alt="placekitten.com/g/1200/500" src="https://placekitten.com/g/1200/500"/> ipsum</p>'
+snapshots["test_italics_bbcode 1"] = "<p>Lorem <i>ipsum</i>!</p>"
 
 snapshots[
-    "test_image_bbcode_is_case_insensitive 1"
-] = '<p>Lorem <img alt="placekitten.com/g/1200/500" src="https://placekitten.com/g/1200/500"/> ipsum</p>'
+    "test_simple_inline_bbcode_is_escaped 1"
+] = '<p>Lorem <b>ips &lt;script language="application/javascript"&gt; um</b>!</p>'
+
+snapshots["test_underline_bbcode 1"] = "<p>Lorem <u>ipsum</u>!</p>"
 
 snapshots[
     "test_url_bbcode 1"
 ] = '<p>Lorem <a href="https://placekitten.com/g/1200/500" rel="nofollow noopener">placekitten.com/g/1200/500</a> ipsum</p>'
 
 snapshots[
+    "test_url_bbcode_is_escaped 1"
+] = '<p>Lorem <a href=\'http://&lt;script language="application/javascript"&gt;\' rel="nofollow noopener">&lt;script language="application/javascript"&gt;</a> ipsum</p>'
+
+snapshots[
+    "test_url_bbcode_link_text_is_escaped 1"
+] = '<p>Lorem <a href=\'http://&lt;script language="application/javascript"&gt;\' rel="nofollow noopener">&lt;script language="application/javascript"&gt;</a> ipsum</p>'
+
+snapshots[
     "test_url_bbcode_with_link_text 1"
 ] = '<p>Lorem <a href="https://placekitten.com/g/1200/500" rel="nofollow noopener">dolor</a> ipsum</p>'
 

+ 3 - 3
misago/markup/tests/test_code_bbcode.py

@@ -10,9 +10,9 @@ def test_single_line_code(request_mock, user, snapshot):
 def test_multi_line_code(request_mock, user, snapshot):
     text = """
 [code]
-echo("Hello!");
-
-echo("World!");
+<script>
+alert("!")
+</script>
 [/code]
     """
     result = parse(text, request_mock, user, minify=False)

+ 31 - 0
misago/markup/tests/test_code_md.py

@@ -0,0 +1,31 @@
+from ..parser import parse
+
+
+def test_single_line_code_markdown(request_mock, user, snapshot):
+    text = '```<script>alert("!")</script>```'
+    result = parse(text, request_mock, user, minify=False)
+    snapshot.assert_match(result["parsed_text"])
+
+
+def test_multi_line_code_markdown(request_mock, user, snapshot):
+    text = """
+```
+<script>
+alert("!")
+</script>
+```
+    """
+    result = parse(text, request_mock, user, minify=False)
+    snapshot.assert_match(result["parsed_text"])
+
+
+def test_multi_line_code_markdown_with_language(request_mock, user, snapshot):
+    text = """
+```javascript
+<script>
+alert("!")
+</script>
+```
+    """
+    result = parse(text, request_mock, user, minify=False)
+    snapshot.assert_match(result["parsed_text"])

+ 26 - 0
misago/markup/tests/test_escaping.py

@@ -0,0 +1,26 @@
+# Bunch of tests for unsafe/malicious contents escaping
+from ..parser import parse
+
+
+def test_text_is_escaped(request_mock, user, snapshot):
+    text = '<script>alert("!")</script>'
+    result = parse(text, request_mock, user, minify=False)
+    snapshot.assert_match(result["parsed_text"])
+
+
+def test_inline_code_is_escaped(request_mock, user, snapshot):
+    text = '`<script>alert("!")</script>`'
+    result = parse(text, request_mock, user, minify=False)
+    snapshot.assert_match(result["parsed_text"])
+
+
+def test_code_in_quote_markdown_is_escaped(request_mock, user, snapshot):
+    text = '> <script>alert("!")</script>'
+    result = parse(text, request_mock, user, minify=False)
+    snapshot.assert_match(result["parsed_text"])
+
+
+def test_code_in_quote_bbcode_is_escaped(request_mock, user, snapshot):
+    text = '[quote]<script>alert("!")</script>[/quote]'
+    result = parse(text, request_mock, user, minify=False)
+    snapshot.assert_match(result["parsed_text"])

+ 35 - 0
misago/markup/tests/test_inline_bbcode.py

@@ -19,6 +19,18 @@ def test_underline_bbcode(request_mock, user, snapshot):
     snapshot.assert_match(result["parsed_text"])
 
 
+def test_simple_inline_bbcode_is_escaped(request_mock, user, snapshot):
+    text = 'Lorem [b]ips <script language="application/javascript"> um[/b]!'
+    result = parse(text, request_mock, user, minify=False)
+    snapshot.assert_match(result["parsed_text"])
+
+
+def test_inline_bbcode_can_be_mixed(request_mock, user, snapshot):
+    text = "Lorem [b][u]ipsum[/u][/b]!"
+    result = parse(text, request_mock, user, minify=False)
+    snapshot.assert_match(result["parsed_text"])
+
+
 def test_inline_bbcode_can_be_mixed_with_markdown(request_mock, user, snapshot):
     text = "Lorem [b]**ipsum**[/b]!"
     result = parse(text, request_mock, user, minify=False)
@@ -31,6 +43,12 @@ def test_image_bbcode(request_mock, user, snapshot):
     snapshot.assert_match(result["parsed_text"])
 
 
+def test_image_bbcode_is_escaped(request_mock, user, snapshot):
+    text = 'Lorem [img]<script language="application/javascript">[/img] ipsum'
+    result = parse(text, request_mock, user, minify=False)
+    snapshot.assert_match(result["parsed_text"])
+
+
 def test_image_bbcode_is_case_insensitive(request_mock, user, snapshot):
     text = "Lorem [iMg]https://placekitten.com/g/1200/500[/ImG] ipsum"
     result = parse(text, request_mock, user, minify=False)
@@ -49,6 +67,12 @@ def test_url_bbcode_includes_nofollow_and_noopener(request_mock, user, snapshot)
     assert 'rel="nofollow noopener"' in result["parsed_text"]
 
 
+def test_url_bbcode_is_escaped(request_mock, user, snapshot):
+    text = 'Lorem [url]<script language="application/javascript">[/url] ipsum'
+    result = parse(text, request_mock, user, minify=False)
+    snapshot.assert_match(result["parsed_text"])
+
+
 def test_url_bbcode_with_link_text(request_mock, user, snapshot):
     text = "Lorem [url=https://placekitten.com/g/1200/500]dolor[/url] ipsum"
     result = parse(text, request_mock, user, minify=False)
@@ -71,3 +95,14 @@ def test_url_bbcode_with_quotes_and_long_link_text(request_mock, user, snapshot)
     text = 'Lorem [url="https://placekitten.com/g/1200/500"]dolor met[/url] ipsum'
     result = parse(text, request_mock, user, minify=False)
     snapshot.assert_match(result["parsed_text"])
+
+
+def test_url_bbcode_link_text_is_escaped(request_mock, user, snapshot):
+    text = (
+        'Lorem [url=<script language="application/javascript">]'
+        '<script language="application/javascript">'
+        "[/url] ipsum"
+    )
+
+    result = parse(text, request_mock, user, minify=False)
+    snapshot.assert_match(result["parsed_text"])

+ 2 - 2
misago/markup/urls.py

@@ -1,5 +1,5 @@
-from django.conf.urls import url
+from django.urls import path
 
 from .api import parse_markup
 
-urlpatterns = [url(r"^parse-markup/$", parse_markup, name="parse-markup")]
+urlpatterns = [path("parse-markup/", parse_markup, name="parse-markup")]

+ 0 - 2
misago/menus/__init__.py

@@ -1,3 +1 @@
-default_app_config = "misago.menus.apps.MisagoMenusConfig"
-
 MENU_ITEMS_CACHE = "menus"

+ 9 - 9
misago/menus/admin/__init__.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 from django.utils.translation import gettext_lazy as _
 
 from .views import (
@@ -14,16 +14,16 @@ from .views import (
 class MisagoAdminExtension:
     def register_urlpatterns(self, urlpatterns):
         # Menu items
-        urlpatterns.namespace(r"^menu-items/", "menu-items", "settings")
+        urlpatterns.namespace("menu-items/", "menu-items", "settings")
         urlpatterns.patterns(
             "settings:menu-items",
-            url(r"^$", MenuItemsList.as_view(), name="index"),
-            url(r"^(?P<page>\d+)/$", MenuItemsList.as_view(), name="index"),
-            url(r"^new/$", NewMenuItem.as_view(), name="new"),
-            url(r"^edit/(?P<pk>\d+)/$", EditMenuItem.as_view(), name="edit"),
-            url(r"^delete/(?P<pk>\d+)/$", DeleteMenuItem.as_view(), name="delete"),
-            url(r"^down/(?P<pk>(\w|-)+)/$", MoveDownMenuItem.as_view(), name="down"),
-            url(r"^up/(?P<pk>(\w|-)+)/$", MoveUpMenuItem.as_view(), name="up"),
+            path("", MenuItemsList.as_view(), name="index"),
+            path("<int:page>/", MenuItemsList.as_view(), name="index"),
+            path("new/", NewMenuItem.as_view(), name="new"),
+            path("edit/<int:pk>/", EditMenuItem.as_view(), name="edit"),
+            path("delete/<int:pk>/", DeleteMenuItem.as_view(), name="delete"),
+            path("down/<int:pk>/", MoveDownMenuItem.as_view(), name="down"),
+            path("up/<int:pk>/", MoveUpMenuItem.as_view(), name="up"),
         )
 
     def register_navigation_nodes(self, site):

+ 0 - 1
misago/readtracker/__init__.py

@@ -1 +0,0 @@
-default_app_config = "misago.readtracker.apps.MisagoReadTrackerConfig"

+ 1 - 1
misago/readtracker/signals.py

@@ -4,7 +4,7 @@ from ..categories import PRIVATE_THREADS_ROOT_NAME
 from ..categories.signals import delete_category_content, move_category_content
 from ..threads.signals import merge_post, merge_thread, move_post, move_thread
 
-thread_read = Signal(providing_args=["thread"])
+thread_read = Signal()
 
 
 @receiver(delete_category_content)

+ 0 - 3
misago/search/__init__.py

@@ -1,4 +1 @@
 from .searchprovider import SearchProvider
-
-
-default_app_config = "misago.search.apps.MisagoSearchConfig"

+ 3 - 3
misago/search/urls/__init__.py

@@ -1,8 +1,8 @@
-from django.conf.urls import url
+from django.urls import path
 
 from ..views import landing, search
 
 urlpatterns = [
-    url(r"^search/$", landing, name="search"),
-    url(r"^search/(?P<search_provider>[-a-zA-Z0-9]+)/$", search, name="search"),
+    path("search/", landing, name="search"),
+    path("search/<slug:search_provider>/", search, name="search"),
 ]

+ 3 - 3
misago/search/urls/api.py

@@ -1,8 +1,8 @@
-from django.conf.urls import url
+from django.urls import path
 
 from .. import api
 
 urlpatterns = [
-    url(r"^search/$", api.search, name="search"),
-    url(r"^search/(?P<search_provider>[-a-zA-Z0-9]+)/$", api.search, name="search"),
+    path("search/", api.search, name="search"),
+    path("search/<slug:search_provider>/", api.search, name="search"),
 ]

+ 0 - 2
misago/socialauth/__init__.py

@@ -1,3 +1 @@
-default_app_config = "misago.socialauth.apps.MisagoSocialAuthConfig"
-
 SOCIALAUTH_CACHE = "social_auth_providers"

+ 10 - 12
misago/socialauth/admin/__init__.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 from django.utils.translation import gettext_lazy as _
 
 from .views import (
@@ -13,25 +13,23 @@ from .views import (
 class MisagoAdminExtension:
     def register_urlpatterns(self, urlpatterns):
         # Social auth providers
-        urlpatterns.namespace(r"^social-auth/", "socialauth", "settings")
+        urlpatterns.namespace("social-auth/", "socialauth", "settings")
         urlpatterns.patterns(
             "settings:socialauth",
-            url(r"^$", SocialAuthProvidersList.as_view(), name="index"),
-            url(
-                r"^edit/(?P<pk>(\w|-)+)/$",
+            path("", SocialAuthProvidersList.as_view(), name="index"),
+            path(
+                "edit/<slug:pk>/",
                 EditSocialAuthProvider.as_view(),
                 name="edit",
             ),
-            url(
-                r"^down/(?P<pk>(\w|-)+)/$",
+            path(
+                "down/<slug:pk>/",
                 MoveDownSocialAuthProvider.as_view(),
                 name="down",
             ),
-            url(
-                r"^up/(?P<pk>(\w|-)+)/$", MoveUpSocialAuthProvider.as_view(), name="up"
-            ),
-            url(
-                r"^disable/(?P<pk>(\w|-)+)/$",
+            path("up/<slug:pk>/", MoveUpSocialAuthProvider.as_view(), name="up"),
+            path(
+                "disable/<slug:pk>/",
                 DisableSocialAuthProvider.as_view(),
                 name="disable",
             ),

+ 1 - 2
misago/socialauth/migrations/0001_initial.py

@@ -1,6 +1,5 @@
 # Generated by Django 2.2.1 on 2019-06-16 13:39
 
-import django.contrib.postgres.fields.jsonb
 from django.db import migrations, models
 
 
@@ -25,7 +24,7 @@ class Migration(migrations.Migration):
                 ("button_color", models.CharField(blank=True, max_length=7, null=True)),
                 (
                     "settings",
-                    django.contrib.postgres.fields.jsonb.JSONField(default=dict),
+                    models.JSONField(default=dict),
                 ),
                 ("is_active", models.BooleanField(default=False)),
                 ("order", models.IntegerField(default=0)),

+ 1 - 2
misago/socialauth/models.py

@@ -1,4 +1,3 @@
-from django.contrib.postgres.fields import JSONField
 from django.db import models
 
 from .providers import providers
@@ -8,7 +7,7 @@ class SocialAuthProvider(models.Model):
     provider = models.CharField(primary_key=True, max_length=30)
     button_text = models.CharField(max_length=255, null=True, blank=True)
     button_color = models.CharField(max_length=7, null=True, blank=True)
-    settings = JSONField(default=dict)
+    settings = models.JSONField(default=dict)
     is_active = models.BooleanField(default=False)
     order = models.IntegerField(default=0)
 

+ 0 - 8
misago/socialauth/tests/test_begin_auth.py

@@ -10,14 +10,6 @@ def test_view_begins_social_auth_for_provider(client, provider):
     assert response.status_code == 302
 
 
-@override_dynamic_settings(enable_sso=True)
-def test_view_returns_403_when_sso_is_enabled(client, provider):
-    response = client.get(
-        reverse("misago:social-begin", kwargs={"backend": provider.pk})
-    )
-    assert response.status_code == 403
-
-
 def test_view_returns_404_for_disabled_provider(client, disabled_provider):
     response = client.get(
         reverse("misago:social-begin", kwargs={"backend": disabled_provider.pk})

+ 3 - 3
misago/socialauth/urls.py

@@ -1,9 +1,9 @@
-from django.conf.urls import url
+from django.urls import path
 
 from . import views
 
 
 urlpatterns = [
-    url(r"^login/(?P<backend>[^/]+)/$", views.auth, name="social-begin"),
-    url(r"^complete/(?P<backend>[^/]+)/$", views.complete, name="social-complete"),
+    path("login/<str:backend>/", views.auth, name="social-begin"),
+    path("complete/<str:backend>/", views.complete, name="social-complete"),
 ]

+ 0 - 3
misago/socialauth/views.py

@@ -19,9 +19,6 @@ def get_provider_from_request(request, backend):
 
 def social_auth_view(f):
     def social_auth_view_wrapper(request, backend, *args, **kwargs):
-        if request.settings.enable_sso:
-            raise PermissionDenied(_("Please use the 3rd party site to login."))
-
         provider = get_provider_from_request(request, backend)
         request.strategy = load_strategy(request)
 

+ 0 - 1
misago/sso/__init__.py

@@ -1 +0,0 @@
-default_app_config = "misago.sso.apps.MisagoSSOConfig"

+ 0 - 34
misago/sso/api.py

@@ -1,34 +0,0 @@
-import jwt
-from django.http import Http404, HttpResponseBadRequest, JsonResponse
-from django.views.decorators.csrf import csrf_exempt
-from django.views.decorators.http import require_POST
-
-from .user import get_or_create_user
-from .validators import UserDataValidator
-
-
-@csrf_exempt
-@require_POST
-def sso_sync(request):
-    if not request.settings.enable_sso:
-        raise Http404()
-
-    access_token = request.POST.get("access_token")
-    if not access_token:
-        return HttpResponseBadRequest("Request did not contain the access token")
-
-    try:
-        user_data = jwt.decode(
-            access_token, request.settings.sso_private_key, algorithms=["HS256"]
-        )
-    except jwt.PyJWTError:
-        return HttpResponseBadRequest("Access token is invalid")
-
-    validator = UserDataValidator(user_data)
-    if not validator.is_valid():
-        failed_fields = ", ".join(validator.errors.keys())
-        return HttpResponseBadRequest(f"User data failed to validate: {failed_fields}")
-
-    user = get_or_create_user(request, validator.cleaned_data)
-
-    return JsonResponse({"id": user.id})

+ 0 - 11
misago/sso/apps.py

@@ -1,11 +0,0 @@
-from django.apps import AppConfig
-
-
-class MisagoSSOConfig(AppConfig):
-    """
-    Using https://github.com/divio/django-simple-sso
-    """
-
-    name = "misago.sso"
-    label = "misago_sso"
-    verbose_name = "Misago Single Sign On"

+ 0 - 56
misago/sso/client.py

@@ -1,56 +0,0 @@
-from django.core.exceptions import SuspiciousOperation
-from django.http import Http404
-from simple_sso.sso_client.client import AuthenticateView, Client, LoginView
-
-from ..users.authbackends import MisagoBackend
-from .user import get_or_create_user
-from .validators import UserDataValidator
-
-
-class MisagoAuthenticateView(AuthenticateView):
-    @property
-    def client(self):
-        return create_configured_client(self.request)
-
-    def get(self, request):
-        if not request.settings.enable_sso:
-            raise Http404()
-
-        return super().get(request)
-
-
-class MisagoLoginView(LoginView):
-    @property
-    def client(self):
-        return create_configured_client(self.request)
-
-    def get(self, request):
-        if not request.settings.enable_sso:
-            raise Http404()
-
-        return super().get(request)
-
-
-def create_configured_client(request):
-    settings = request.settings
-
-    return ClientMisago(
-        settings.sso_url,
-        settings.sso_public_key,
-        settings.sso_private_key,
-        request=request,
-    )
-
-
-class ClientMisago(Client):
-    def __init__(self, *args, **kwargs):
-        self.request = kwargs.pop("request")
-        super().__init__(*args, **kwargs)
-        self.backend = "%s.%s" % (MisagoBackend.__module__, MisagoBackend.__name__)
-
-    def build_user(self, user_data):
-        validator = UserDataValidator(user_data)
-        if not validator.is_valid():
-            failed_fields = ", ".join(validator.errors.keys())
-            raise SuspiciousOperation(f"User data failed to validate: {failed_fields}")
-        return get_or_create_user(self.request, validator.cleaned_data)

+ 0 - 0
misago/sso/tests/__init__.py


+ 0 - 69
misago/sso/tests/test_sso_sync_api.py

@@ -1,69 +0,0 @@
-import jwt
-from django.contrib.auth import get_user_model
-from django.urls import reverse
-
-from ...conf.test import override_dynamic_settings
-from .utils import TEST_SSO_SETTINGS
-
-User = get_user_model()
-api_link = reverse("simple-sso-sync")
-
-
-@override_dynamic_settings(enable_sso=False)
-def test_sso_api_returns_404_if_sso_is_disabled(db, client):
-    response = client.post(api_link)
-    assert response.status_code == 404
-
-
-@override_dynamic_settings(**TEST_SSO_SETTINGS)
-def test_sso_api_returns_400_if_api_request_is_missing_access_token(db, client):
-    response = client.post(api_link)
-    assert response.status_code == 400
-
-
-@override_dynamic_settings(**TEST_SSO_SETTINGS)
-def test_sso_api_returns_400_if_access_token_is_invalid(db, client):
-    response = client.post(api_link, {"access_token": "invalid"})
-    assert response.status_code == 400
-
-
-@override_dynamic_settings(**TEST_SSO_SETTINGS)
-def test_sso_api_returns_400_if_user_data_in_token_is_invalid(db, client):
-    token = jwt.encode(
-        {"username": "jkowalski", "email": "jkowalski@example.com"},
-        TEST_SSO_SETTINGS["sso_private_key"],
-        algorithm="HS256",
-    ).decode("ascii")
-
-    response = client.post(api_link, {"access_token": token})
-    assert response.status_code == 400
-
-
-@override_dynamic_settings(**TEST_SSO_SETTINGS)
-def test_sso_api_creates_user_account_if_user_data_is_valid(db, client):
-    token = jwt.encode(
-        {"id": 1, "username": "jkowalski", "email": "jkowalski@example.com"},
-        TEST_SSO_SETTINGS["sso_private_key"],
-        algorithm="HS256",
-    ).decode("ascii")
-
-    response = client.post(api_link, {"access_token": token})
-    assert response.status_code == 200
-
-    user = User.objects.get(sso_id=1)
-    assert user.username == "jkowalski"
-    assert user.email == "jkowalski@example.com"
-
-
-@override_dynamic_settings(**TEST_SSO_SETTINGS)
-def test_sso_api_returns_user_id_if_user_data_is_valid(db, client):
-    token = jwt.encode(
-        {"id": 1, "username": "jkowalski", "email": "jkowalski@example.com"},
-        TEST_SSO_SETTINGS["sso_private_key"],
-        algorithm="HS256",
-    ).decode("ascii")
-
-    response = client.post(api_link, {"access_token": token})
-
-    user = User.objects.get(sso_id=1)
-    assert response.json() == {"id": user.pk}

+ 0 - 213
misago/sso/tests/test_sso_views.py

@@ -1,213 +0,0 @@
-from urllib.parse import urlparse
-
-from itsdangerous.timed import TimedSerializer, TimestampSigner
-from requests import Response
-from requests.sessions import Session
-
-from django.contrib.auth import get_user_model
-from django.shortcuts import reverse
-from django.test import override_settings, TestCase
-from django.utils.timezone import now
-
-from ...conf.test import override_dynamic_settings
-from .utils import TEST_SSO_SETTINGS
-
-User = get_user_model()
-
-SSO_USER_ID = 1
-
-
-def create_verify_response(data):
-    signer = TimedSerializer(TEST_SSO_SETTINGS["sso_private_key"])
-    return signer.dumps(data)
-
-
-class ConnectionMock:
-    def __init__(self, user_data=None):
-        self.session = Session
-        self.user_data = user_data
-
-    def __enter__(self):
-        self.origin_post = Session.post
-
-        def mocked_post(*args, **kwargs):
-            mocked_response = Response()
-            requested_url = args[1]
-            if "/server/request-token/" == urlparse(requested_url).path:
-                # token generated for private key settings.SSO_PRIVATE_KEY = 'priv1'
-                mocked_response._content = (
-                    b'{"request_token": "XcHtuemqcjnIT6J2WHTFswLQP0W07nI96XfxqGkm6b1zFT'
-                    b'oF0YGEoIYu37QOajkc"}.XTd9sA.quRsXFxqMk-ufwSc79q-_YLDNzg'
-                )
-            elif "/server/verify/" == urlparse(requested_url).path:
-                user_data = {
-                    "id": SSO_USER_ID,
-                    "username": "jkowalski",
-                    "email": "jkowalski@example.com",
-                    "first_name": "Jan",
-                    "last_name": "Kowalski",
-                    "is_staff": False,
-                    "is_superuser": False,
-                    "is_active": True,
-                }
-
-                if self.user_data:
-                    user_data.update(self.user_data)
-
-                mocked_response._content = create_verify_response(user_data)
-
-            mocked_response.status_code = 200
-            return mocked_response
-
-        setattr(self.session, "post", mocked_post)
-        return self.session
-
-    def __exit__(self, type, value, traceback):
-        setattr(self.session, "post", self.origin_post)
-
-
-class TimestampSignerMock:
-    def __init__(self):
-        self.TimestampSigner = TimestampSigner
-
-    def __enter__(self):
-        self.origin_unsign = TimestampSigner.unsign
-
-        def mocked_unsign(*args, **kwargs):
-            s = args[1]
-            if b'"username": "jkowalski"' in s:
-                value = s[: s.index(b"}.") + 1]  # {...}
-                timestamp_to_datetime = now()
-                return value, timestamp_to_datetime
-            else:
-                return self.origin_unsign(*args, **kwargs)
-
-        setattr(self.TimestampSigner, "unsign", mocked_unsign)
-        return self.TimestampSigner
-
-    def __exit__(self, type, value, traceback):
-        setattr(self.TimestampSigner, "unsign", self.origin_unsign)
-
-
-@override_dynamic_settings(enable_sso=False)
-def test_sso_login_view_returns_404_if_sso_is_disabled(db, client):
-    url_to_external_logging = reverse("simple-sso-login")
-    assert url_to_external_logging == "/sso/client/"
-
-    response = client.get(url_to_external_logging)
-    assert response.status_code == 404
-
-
-@override_dynamic_settings(**TEST_SSO_SETTINGS)
-def test_sso_login_view_initiates_auth_flow(db, client):
-    url_to_external_logging = reverse("simple-sso-login")
-    assert url_to_external_logging == "/sso/client/"
-
-    with ConnectionMock():
-        response = client.get(url_to_external_logging)
-
-    assert response.status_code == 302
-
-    url_parsed = urlparse(response.url)
-    assert url_parsed.path == "/server/authorize/"
-    assert url_parsed.query == (
-        "token=XcHtuemqcjnIT6J2WHTFswLQP0W07nI96XfxqGkm6b1zFToF0YGEoIYu37QOajkc"
-    )
-
-
-@override_dynamic_settings(enable_sso=False)
-def test_sso_auth_view_returns_404_if_sso_is_disabled(db, client):
-    url_to_authenticate = reverse("simple-sso-authenticate")
-    assert url_to_authenticate == "/sso/client/authenticate/"
-
-    response = client.get(url_to_authenticate)
-    assert response.status_code == 404
-
-
-@override_dynamic_settings(**TEST_SSO_SETTINGS)
-def test_sso_auth_view_creates_new_user(db, client):
-    url_to_authenticate = reverse("simple-sso-authenticate")
-    assert url_to_authenticate == "/sso/client/authenticate/"
-
-    query = (
-        "next=%2F&access_token=InBBMjllMlNla2ZWdDdJMnR0c3R3QWIxcjQwRzV6TmphZDRSaEprbjlMbnR0TnF"
-        "Ka3Q2d1dNR1lVYkhzVThvZU0i.XTeRVQ.3XiIMg0AFcJKDFCekse6s43uNLI"
-    )
-    url_to_authenticate += "?" + query
-
-    with ConnectionMock():
-        with TimestampSignerMock():
-            response = client.get(url_to_authenticate)
-
-    assert response.status_code == 302
-    assert response.url == "/"
-
-    user = User.objects.first()
-    assert user.username == "jkowalski"
-
-
-@override_dynamic_settings(**TEST_SSO_SETTINGS)
-def test_sso_auth_view_authenticates_existing_user(user, client):
-    user.sso_id = SSO_USER_ID
-    user.save()
-
-    url_to_authenticate = reverse("simple-sso-authenticate")
-    assert url_to_authenticate == "/sso/client/authenticate/"
-
-    query = (
-        "next=%2F&access_token=InBBMjllMlNla2ZWdDdJMnR0c3R3QWIxcjQwRzV6TmphZDRSaEprbjlMbnR0TnF"
-        "Ka3Q2d1dNR1lVYkhzVThvZU0i.XTeRVQ.3XiIMg0AFcJKDFCekse6s43uNLI"
-    )
-    url_to_authenticate += "?" + query
-
-    with ConnectionMock():
-        with TimestampSignerMock():
-            response = client.get(url_to_authenticate)
-
-    assert response.status_code == 302
-    assert response.url == "/"
-
-    assert User.objects.count() == 1
-
-
-@override_dynamic_settings(**TEST_SSO_SETTINGS)
-def test_sso_auth_view_updates_existing_user_using_data_from_sso(user, client):
-    user.sso_id = SSO_USER_ID
-    user.is_active = False
-    user.save()
-
-    url_to_authenticate = reverse("simple-sso-authenticate")
-    assert url_to_authenticate == "/sso/client/authenticate/"
-
-    query = (
-        "next=%2F&access_token=InBBMjllMlNla2ZWdDdJMnR0c3R3QWIxcjQwRzV6TmphZDRSaEprbjlMbnR0TnF"
-        "Ka3Q2d1dNR1lVYkhzVThvZU0i.XTeRVQ.3XiIMg0AFcJKDFCekse6s43uNLI"
-    )
-    url_to_authenticate += "?" + query
-
-    with ConnectionMock():
-        with TimestampSignerMock():
-            client.get(url_to_authenticate)
-
-    user.refresh_from_db()
-    assert user.username == "jkowalski"
-    assert user.email == "jkowalski@example.com"
-    assert user.is_active is True
-
-
-@override_dynamic_settings(**TEST_SSO_SETTINGS)
-def test_sso_auth_view_returns_bad_request_error_for_invalid_user_data(db, client):
-
-    url_to_authenticate = reverse("simple-sso-authenticate")
-    assert url_to_authenticate == "/sso/client/authenticate/"
-
-    query = (
-        "next=%2F&access_token=InBBMjllMlNla2ZWdDdJMnR0c3R3QWIxcjQwRzV6TmphZDRSaEprbjlMbnR0TnF"
-        "Ka3Q2d1dNR1lVYkhzVThvZU0i.XTeRVQ.3XiIMg0AFcJKDFCekse6s43uNLI"
-    )
-    url_to_authenticate += "?" + query
-
-    with ConnectionMock({"email": "invalid"}):
-        with TimestampSignerMock():
-            response = client.get(url_to_authenticate)
-            assert response.status_code == 400

+ 0 - 60
misago/sso/tests/test_user_data_validation.py

@@ -1,60 +0,0 @@
-from ...users.models import Ban
-from ..validators import UserDataValidator
-
-
-def test_valid_data_passess_validation(db):
-    validator = UserDataValidator(
-        {"id": 1, "username": "User", "email": "user@example.com"}
-    )
-    assert validator.is_valid()
-    assert "id" not in validator.errors
-    assert "username" not in validator.errors
-    assert "email" not in validator.errors
-
-
-def test_invalid_id_fails_validation(db):
-    validator = UserDataValidator(
-        {"id": "invalid", "username": "User", "email": "user@example.com"}
-    )
-    assert not validator.is_valid()
-    assert list(validator.errors) == ["id"]
-
-
-def test_invalid_username_fails_validation(db):
-    validator = UserDataValidator(
-        {"id": 1, "username": "User!", "email": "user@example.com"}
-    )
-    assert not validator.is_valid()
-    assert list(validator.errors) == ["username"]
-
-
-def test_banned_username_fails_validation(db):
-    Ban.objects.create(check_type=Ban.USERNAME, banned_value="User")
-    validator = UserDataValidator(
-        {"id": 1, "username": "User", "email": "user@example.com"}
-    )
-    assert not validator.is_valid()
-    assert list(validator.errors) == ["username"]
-
-
-def test_invalid_email_fails_validation(db):
-    validator = UserDataValidator({"id": 1, "username": "User", "email": "invalid"})
-    assert not validator.is_valid()
-    assert list(validator.errors) == ["email"]
-
-
-def test_banned_email_fails_validation(db):
-    Ban.objects.create(check_type=Ban.EMAIL, banned_value="user@example.com")
-    validator = UserDataValidator(
-        {"id": 1, "username": "User", "email": "user@example.com"}
-    )
-    assert not validator.is_valid()
-    assert list(validator.errors) == ["email"]
-
-
-def test_is_active_flag_can_be_included_in_data(db):
-    validator = UserDataValidator(
-        {"id": 1, "username": "User", "email": "user@example.com", "is_active": True}
-    )
-    assert validator.is_valid()
-    assert validator.cleaned_data["is_active"] is True

+ 0 - 85
misago/sso/tests/test_user_syncing.py

@@ -1,85 +0,0 @@
-from unittest.mock import Mock
-
-import pytest
-
-from ..user import get_or_create_user, user_needs_updating
-
-SSO_ID = 1
-
-
-@pytest.fixture
-def sso_user(user):
-    user.sso_id = SSO_ID
-    user.save()
-    return user
-
-
-def test_new_user_is_created_if_user_with_given_sso_id_doesnt_exist(dynamic_settings):
-    user = get_or_create_user(
-        Mock(settings=dynamic_settings),
-        {
-            "id": SSO_ID,
-            "username": "SsoUser",
-            "email": "ssouser@example.com",
-            "is_active": False,
-        },
-    )
-
-    assert user.sso_id == SSO_ID
-    assert user.username == "SsoUser"
-    assert user.email == "ssouser@example.com"
-    assert user.is_active is False
-
-
-def test_user_with_sso_id_is_returned_if_they_exist(dynamic_settings, sso_user):
-    user = get_or_create_user(
-        Mock(settings=dynamic_settings),
-        {"id": SSO_ID, "username": "SsoUser", "email": "ssouser@example.com"},
-    )
-
-    assert user == sso_user
-
-
-def test_user_with_sso_id_is_updated_using_provider_data(dynamic_settings, sso_user):
-    user = get_or_create_user(
-        Mock(settings=dynamic_settings),
-        {
-            "id": SSO_ID,
-            "username": "SsoUser",
-            "email": "ssouser@example.com",
-            "is_active": False,
-        },
-    )
-
-    sso_user.refresh_from_db()
-    assert sso_user.username == "SsoUser"
-    assert sso_user.email == "ssouser@example.com"
-    assert sso_user.is_active is False
-
-
-def test_user_needs_updating_if_their_username_changed(user):
-    assert user_needs_updating(user, {"username": "Changed", "email": user.email})
-
-
-def test_user_needs_updating_if_their_email_changed(user):
-    assert user_needs_updating(
-        user, {"username": user.username, "email": "changed@example.com"}
-    )
-
-
-def test_user_needs_updating_if_their_active_status_changed(user):
-    assert user_needs_updating(
-        user,
-        {
-            "username": user.username,
-            "email": user.email,
-            "is_active": not user.is_active,
-        },
-    )
-
-
-def test_user_doesnt_need_updating_if_their_data_is_same(user):
-    assert not user_needs_updating(
-        user,
-        {"username": user.username, "email": user.email, "is_active": user.is_active},
-    )

+ 0 - 6
misago/sso/tests/utils.py

@@ -1,6 +0,0 @@
-TEST_SSO_SETTINGS = {
-    "enable_sso": True,
-    "sso_private_key": "priv1",
-    "sso_public_key": "fakeSsoPublicKey",
-    "sso_url": "http://example.com/server/",
-}

+ 0 - 14
misago/sso/urls.py

@@ -1,14 +0,0 @@
-from django.conf.urls import url
-
-from .api import sso_sync
-from .client import MisagoAuthenticateView, MisagoLoginView
-
-urlpatterns = [
-    url(r"^sync/$", sso_sync, name="simple-sso-sync"),
-    url(r"^client/$", MisagoLoginView.as_view(), name="simple-sso-login"),
-    url(
-        r"^client/authenticate/$",
-        MisagoAuthenticateView.as_view(),
-        name="simple-sso-authenticate",
-    ),
-]

+ 0 - 43
misago/sso/user.py

@@ -1,43 +0,0 @@
-from django.contrib.auth import get_user_model
-
-from ..users.setupnewuser import setup_new_user
-
-User = get_user_model()
-
-
-def get_or_create_user(request, user_data):
-    try:
-        user = User.objects.get(sso_id=user_data["id"])
-        if user_needs_updating(user, user_data):
-            update_user(user, user_data)
-        return user
-    except User.DoesNotExist:
-        user = User.objects.create_user(
-            user_data["username"],
-            user_data["email"],
-            is_active=user_data.get("is_active", True),
-            sso_id=user_data["id"],
-        )
-        user.update_acl_key()
-        setup_new_user(request.settings, user)
-        return user
-
-
-def user_needs_updating(user, user_data):
-    return any(
-        (
-            user.username != user_data["username"],
-            user.email != user_data["email"],
-            user.is_active != user_data.get("is_active", user.is_active),
-        )
-    )
-
-
-def update_user(user, user_data):
-    if user.username != user_data["username"]:
-        user.set_username(user_data["username"])
-    if user.email != user_data["email"]:
-        user.set_email(user_data["email"])
-    if user.is_active != user_data.get("is_active", user.is_active):
-        user.is_active = user_data["is_active"]
-    user.save()

+ 0 - 35
misago/sso/validators.py

@@ -1,35 +0,0 @@
-from django import forms
-from django.core.exceptions import ValidationError
-from django.utils.translation import gettext as _
-
-from ..users.validators import (
-    validate_username_content,
-    validate_username_banned,
-    validate_email_content,
-    validate_email_banned,
-)
-
-
-class UserDataValidator(forms.Form):
-    id = forms.IntegerField(min_value=1)
-    username = forms.CharField()
-    email = forms.CharField()
-    is_active = forms.BooleanField(required=False)
-
-    def clean_username(self):
-        data = self.cleaned_data["username"]
-
-        validate_username_content(data)
-        if validate_username_banned(data):
-            raise ValidationError(_("This username is not allowed."))
-
-        return data
-
-    def clean_email(self):
-        data = self.cleaned_data["email"]
-
-        validate_email_content(data)
-        if validate_email_banned(data):
-            raise ValidationError(_("This e-mail address is not allowed."))
-
-        return data

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

@@ -1,2 +1,2 @@
-!function o(l,i,u){function s(t,e){if(!i[t]){if(!l[t]){var r="function"==typeof require&&require;if(!e&&r)return r(t,!0);if(c)return c(t,!0);var n=new Error("Cannot find module '"+t+"'");throw n.code="MODULE_NOT_FOUND",n}var a=i[t]={exports:{}};l[t][0].call(a.exports,function(e){return s(l[t][1][e]||e)},a,a.exports,o,l,i,u)}return i[t].exports}for(var c="function"==typeof require&&require,e=0;e<u.length;e++)s(u[e]);return s}({1:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var c=n(e("react")),f=n(e("./..")),s=n(e("../utils/escape-html"));function n(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=e.errors,r=e.privacyPolicy,n=e.termsOfService,a=e.onPrivacyPolicyChange,o=e.onTermsOfServiceChange,l=f.default.get("TERMS_OF_SERVICE_ID"),i=f.default.get("TERMS_OF_SERVICE_URL"),u=f.default.get("PRIVACY_POLICY_ID"),s=f.default.get("PRIVACY_POLICY_URL");return l||u?c.default.createElement("div",null,c.default.createElement(d,{agreement:gettext("the terms of service"),checked:null!==n,errors:t.termsOfService,url:i,value:l,onChange:o}),c.default.createElement(d,{agreement:gettext("the privacy policy"),checked:null!==r,errors:t.privacyPolicy,url:s,value:u,onChange:a})):null}var d=function(e){var t=e.agreement,r=e.checked,n=e.errors,a=e.url,o=e.value,l=e.onChange;if(!a)return null;var i=interpolate('<a href="%(url)s" target="_blank">%(agreement)s</a>',{agreement:(0,s.default)(t),url:(0,s.default)(a)},!0),u=interpolate(gettext("I have read and accept %(agreement)s."),{agreement:i},!0);return c.default.createElement("div",{className:"checkbox legal-footnote"},c.default.createElement("label",null,c.default.createElement("input",{checked:r,type:"checkbox",value:o,onChange:l}),c.default.createElement("span",{dangerouslySetInnerHTML:{__html:u}})),n&&n.map(function(e,t){return c.default.createElement("div",{className:"help-block errors",key:t},e)}))};r.default=a},{"../utils/escape-html":383,"./..":302,react:"react"}],2:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var f=n(e("react")),o=n(e("./.."));function n(e){return e&&e.__esModule?e:{default:e}}function a(e){var s=e.buttonClassName,c=e.buttonLabel,t=e.formLabel,r=e.header,n=e.labelClassName,a=o.default.get("SOCIAL_AUTH");return 0===a.length?null:f.default.createElement("div",{className:"form-group form-social-auth"},f.default.createElement(l,{className:n,text:r}),f.default.createElement("div",{className:"row"},a.map(function(e){var t=e.id,r=e.name,n=e.button_text,a=e.button_color,o=e.url,l="btn btn-block btn-default btn-social-"+t,i=a?{color:a}:null,u=n||interpolate(c,{site:r},!0);return f.default.createElement("div",{className:s||"col-xs-12",key:t},f.default.createElement("a",{className:l,style:i,href:o},u))})),f.default.createElement("hr",null),f.default.createElement(l,{className:n,text:t}))}var l=function(e){var t=e.className,r=e.text;return r?f.default.createElement("h5",{className:t||""},r):null};r.default=a},{"./..":302,react:"react"}],3:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../services/ajax"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=f(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return c(e)}(this,n?(e=f(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function f(e){return(f=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function d(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),d(c(t=n.call(this,e)),"handleDecline",function(){t.state.submiting||window.confirm(gettext("Declining will result in immediate deactivation and deletion of your account. This action is not reversible."))&&(t.setState({submiting:!0}),l.default.post(t.props.api,{accept:!1}).then(function(){window.location.reload(!0)}))}),d(c(t),"handleAccept",function(){t.state.submiting||(t.setState({submiting:!0}),l.default.post(t.props.api,{accept:!0}).then(function(){window.location.reload(!0)}))}),t.state={submiting:!1},t}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",null,o.default.createElement("button",{className:"btn btn-default",disabled:this.state.submiting,type:"buton",onClick:this.handleDecline},gettext("Decline")),o.default.createElement("button",{className:"btn btn-primary",disabled:this.state.submiting,type:"buton",onClick:this.handleAccept},gettext("Accept and continue")))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../services/ajax":365,react:"react"}],4:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ModalHeader=E,r.default=void 0;var n=o(e("react")),a=o(e("./form")),u=o(e("./form-group")),s=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=y(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../reducers/participants")),c=e("../reducers/thread"),f=o(e("../services/ajax")),d=o(e("../services/modal")),p=o(e("../services/snackbar")),m=o(e("../services/store"));function y(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(y=function(e){return e?r:t})(e)}function o(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return g(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(l,a.default);var e,t,r,o=v(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=g(t),a=function(e){t.changeValue("username",e.target.value)},(n="onUsernameChange")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1,username:""},t}return e=l,(t=[{key:"clean",value:function(){return!!this.state.username.trim().length||(p.default.error(gettext("You have to enter user name.")),!1)}},{key:"send",value:function(){return f.default.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){m.default.dispatch((0,c.updateAcl)(e)),m.default.dispatch(s.replace(e.participants)),p.default.success(gettext("New participant has been added to thread.")),d.default.hide()}},{key:"render",value:function(){return n.default.createElement("div",{className:"modal-dialog modal-sm",role:"document"},n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"modal-content"},n.default.createElement(E,null),n.default.createElement("div",{className:"modal-body"},n.default.createElement(u.default,{for:"id_username",label:gettext("User to add")},n.default.createElement("input",{id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.onUsernameChange,type:"text",value:this.state.username}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("button",{className:"btn btn-block btn-primary",disabled:this.state.isLoading},gettext("Add participant")),n.default.createElement("button",{className:"btn btn-block btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel"))))))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function E(e){return n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Add participant")))}r.default=_},{"../reducers/participants":351,"../reducers/thread":360,"../services/ajax":365,"../services/modal":371,"../services/snackbar":376,"../services/store":377,"./form":56,"./form-group":55,react:"react"}],5:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.select=function(e){return{user:e.auth.user,signedIn:e.auth.signedIn,signedOut:e.auth.signedOut}};var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"refresh",value:function(){window.location.reload()}},{key:"getMessage",value:function(){return this.props.signedIn?interpolate(gettext("You have signed in as %(username)s. Please refresh the page before continuing."),{username:this.props.signedIn.username},!0):this.props.signedOut?interpolate(gettext("%(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"),o.default.createElement("div",{className:e},o.default.createElement("div",{className:"container"},o.default.createElement("p",{className:"lead"},this.getMessage()),o.default.createElement("p",null,o.default.createElement("button",{className:"btn btn-default",type:"button",onClick:this.refresh},gettext("Reload page")),o.default.createElement("span",{className:"hidden-xs hidden-sm"}," "+gettext("or press F5 key.")))))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],6:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.size||100,r=e.size2x||t;return n.default.createElement("img",{alt:"",className:e.className||"user-avatar",src:l(e.user,t),srcSet:l(e.user,r),width:t,height:t})},r.getSrc=l,r.resolveAvatarForSize=i;var n=o(e("react")),a=o(e("./.."));function o(e){return e&&e.__esModule?e:{default:e}}function l(e,t){return e&&e.id?i(e.avatars,t).url:a.default.get("BLANK_AVATAR_URL")}function i(e,t){var r=e[0];return e.forEach(function(e){e.size>=t&&(r=e)}),r}},{"./..":302,react:"react"}],7:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("moment")),l=n(e("react"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,l.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getReasonMessage",value:function(){return this.props.message.html?l.default.createElement("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.props.message.html}}):l.default.createElement("p",{className:"lead"},this.props.message.plain)}},{key:"getExpirationMessage",value:function(){if(this.props.expires){if(this.props.expires.isAfter((0,o.default)())){var e=interpolate(gettext("This ban expires on %(expires_on)s."),{expires_on:this.props.expires.format("LL, LT")},!0),t=interpolate(gettext("This ban expires %(expires_on)s."),{expires_on:this.props.expires.fromNow()},!0);return l.default.createElement("abbr",{title:e},t)}return gettext("This ban has expired.")}return gettext("This ban is permanent.")}},{key:"render",value:function(){return l.default.createElement("div",{className:"page page-error page-error-banned"},l.default.createElement("div",{className:"container"},l.default.createElement("div",{className:"message-panel"},l.default.createElement("div",{className:"message-icon"},l.default.createElement("span",{className:"material-icon"},"highlight_off")),l.default.createElement("div",{className:"message-body"},this.getReasonMessage(),l.default.createElement("p",{className:"message-footnote"},this.getExpirationMessage())))))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{moment:"moment",react:"react"}],8:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./loader"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){var e="btn "+this.props.className,t=this.props.disabled;return this.props.loading&&(e+=" btn-loading",t=!0),o.default.createElement("button",{className:e,disabled:t,onClick:this.props.onClick,type:this.props.onClick?"button":"submit"},this.props.children,this.props.loading?o.default.createElement(l.default,null):null)}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();(r.default=f).defaultProps={className:"btn-default",type:"submit",loading:!1,disabled:!1,onClick:null}},{"./loader":58,react:"react"}],9:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return a.default.createElement("div",{className:"categories-list"},a.default.createElement("ul",{className:"list-group"},a.default.createElement("li",{className:"list-group-item empty-message"},a.default.createElement("p",{className:"lead"},gettext("No categories exist or you don't have permission to see them.")))))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],10:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.categories;return n.default.createElement("div",{className:"categories-list"},t.map(function(e){return n.default.createElement(a.default,{category:e,key:e.id})}))};var n=o(e("react")),a=o(e("./category"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./category":11,react:"react"}],11:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category,r="list-group list-group-category";t.css_class&&(r+=" list-group-category-has-flavor",r+=" list-group-category-"+t.css_class);return n.default.createElement("ul",{className:r},n.default.createElement(a.default,{category:t,isFirst:!0}),t.subcategories.map(function(e){return n.default.createElement(a.default,{category:e,isFirst:!1,key:e.id})}))};var n=o(e("react")),a=o(e("./list-item"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./list-item":14,react:"react"}],12:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category;return t.description?a.default.createElement("div",{className:"category-description",dangerouslySetInnerHTML:{__html:t.description.html}}):null};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],13:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category;return a.default.createElement("div",{className:o(t),title:l(t)},a.default.createElement("span",{className:"material-icon"},i(t)))},r.getClassName=o,r.getIcon=i,r.getTitle=l;var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){return e.is_read?"read-status item-read":"read-status item-new"}function l(e){return e.is_closed?e.is_read?gettext("This category has no new posts. (closed)"):gettext("This category has new posts. (closed)"):e.is_read?gettext("This category has no new posts."):gettext("This category has new posts.")}function i(e){return e.is_closed?e.is_read?"lock_outline":"lock":e.is_read?"chat_bubble_outline":"chat_bubble"}},{react:"react"}],14:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category,r=e.isFirst,n="list-group-item";t.description?n+=" list-group-category-has-description":n+=" list-group-category-no-description";r&&(n+=" list-group-item-first");t.css_class&&(n+=" list-group-category-has-flavor",n+=" list-group-item-category-"+t.css_class);return a.default.createElement("li",{className:n},a.default.createElement("div",{className:"row"},a.default.createElement(o.default,{category:t}),a.default.createElement(i.default,{category:t}),a.default.createElement(l.default,{category:t})),a.default.createElement(u.default,{category:t,isFirst:r}))};var a=n(e("react")),o=n(e("./main")),l=n(e("./last-thread")),i=n(e("./stats")),u=n(e("./subcategories"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./last-thread":15,"./main":16,"./stats":17,"./subcategories":18,react:"react"}],15:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Empty=s,r.LastPosterAvatar=i,r.LastPosterName=u,r.LastThread=l,r.Message=d,r.Private=c,r.Protected=f,r.default=function(e){var t=e.category;return n.default.createElement("div",{className:"col-xs-12 col-sm-6 col-md-4 category-last-thread"},n.default.createElement(l,{category:t}),n.default.createElement(s,{category:t}),n.default.createElement(c,{category:t}),n.default.createElement(f,{category:t}))};var n=o(e("react")),a=o(e("../../../avatar"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e){var t=e.category;return t.acl.can_browse&&t.acl.can_see_all_threads&&t.last_thread_title?n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left hidden-xs"},n.default.createElement(i,{category:t})),n.default.createElement("div",{className:"media-body"},n.default.createElement("div",{className:"media-heading"},n.default.createElement("a",{className:"item-title thread-title",href:t.url.last_thread_new,title:t.last_thread_title},t.last_thread_title)),n.default.createElement("ul",{className:"list-inline"},n.default.createElement("li",{className:"category-last-thread-poster"},n.default.createElement(u,{category:t})),n.default.createElement("li",{className:"divider"},"—"),n.default.createElement("li",{className:"category-last-thread-date"},n.default.createElement("a",{href:t.url.last_post},t.last_post_on.fromNow()))))):null}function i(e){var t=e.category;return t.last_poster?n.default.createElement("a",{className:"last-poster-avatar",href:t.last_poster.url,title:t.last_poster_name},n.default.createElement(a.default,{className:"media-object",size:40,user:t.last_poster})):n.default.createElement("span",{className:"last-poster-avatar",title:t.last_poster_name},n.default.createElement(a.default,{className:"media-object",size:40}))}function u(e){var t=e.category;return t.last_poster?n.default.createElement("a",{className:"item-title",href:t.last_poster.url},t.last_poster_name):n.default.createElement("span",{className:"item-title"},t.last_poster_name)}function s(e){var t=e.category;return!t.acl.can_browse||!t.acl.can_see_all_threads||t.last_thread_title?null:n.default.createElement(d,{message:gettext("This category is empty. No threads were posted within it so far.")})}function c(e){var t=e.category;return!t.acl.can_browse||t.acl.can_see_all_threads?null:n.default.createElement(d,{message:gettext("This category is private. You can see only your own threads within it.")})}function f(e){return e.category.acl.can_browse?null:n.default.createElement(d,{message:gettext("This category is protected. You can't browse its contents.")})}function d(e){var t=e.message;return n.default.createElement("div",{className:"media category-thread-message"},n.default.createElement("div",{className:"media-left"},n.default.createElement("span",{className:"material-icon"},"info_outline")),n.default.createElement("div",{className:"media-body"},n.default.createElement("p",null,t)))}},{"../../../avatar":6,react:"react"}],16:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category;return n.default.createElement("div",{className:"col-xs-12 col-sm-6 col-md-6 category-main"},n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left"},n.default.createElement(o.default,{category:t})),n.default.createElement("div",{className:"media-body"},n.default.createElement("h4",{className:"media-heading"},n.default.createElement("a",{href:t.url.index},t.name)),n.default.createElement(a.default,{category:t}))))};var n=l(e("react")),a=l(e("./description")),o=l(e("./icon"));function l(e){return e&&e.__esModule?e:{default:e}}},{"./description":12,"./icon":13,react:"react"}],17:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Posts=l,r.Threads=o,r.default=function(e){var t=e.category;return n.default.createElement("div",{className:"col-md-2 hidden-xs hidden-sm"},n.default.createElement("ul",{className:"list-unstyled category-stats"},n.default.createElement(o,{threads:t.threads}),n.default.createElement(l,{posts:t.posts})))};var n=a(e("react"));a(e("../../../avatar"));function a(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=e.threads,r=ngettext("%(threads)s thread","%(threads)s threads",t);return n.default.createElement("li",{className:"category-stat-threads"},interpolate(r,{threads:t},!0))}function l(e){var t=e.posts,r=ngettext("%(posts)s post","%(posts)s posts",t);return n.default.createElement("li",{className:"category-stat-posts"},interpolate(r,{posts:t},!0))}},{"../../../avatar":6,react:"react"}],18:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category;return e.isFirst||0===t.subcategories.length?null:n.default.createElement("div",{className:"row subcategories-list"},t.subcategories.map(function(e){return n.default.createElement(a.default,{category:e,key:e.id})}))};var n=o(e("react")),a=o(e("./list-item"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./list-item":19,react:"react"}],19:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category,r="btn btn-default btn-block btn-sm btn-subcategory";t.is_read||(r+=" btn-subcategory-new");return a.default.createElement("div",{className:"col-xs-12 col-sm-4 col-md-3"},a.default.createElement("a",{className:r,href:t.url.index},a.default.createElement("span",{className:"material-icon"},o(t)),a.default.createElement("span",{className:"icon-text"},t.name)))},r.getIcon=o;var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){return e.is_closed?e.is_read?"lock_outline":"lock":e.is_read?"chat_bubble_outline":"chat_bubble"}},{react:"react"}],20:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.select=function(e){return{tick:e.tick.tick}};var n=o(e("moment")),i=o(e("react")),u=o(e("./blankslate")),s=o(e("./categories-list")),c=o(e("../..")),f=o(e("../../services/polls"));function o(e){return e&&e.__esModule?e:{default:e}}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var b=function e(t){return Object.assign({},t,{last_post_on:t.last_post_on?(0,n.default)(t.last_post_on):null,subcategories:t.subcategories.map(e)})},h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(l,i.default.Component);var e,t,r,o=m(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=y(t),a=function(e){t.setState({categories:e.map(b)})},(n="update")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={categories:c.default.get("CATEGORIES").map(b)},t.startPolling(c.default.get("CATEGORIES_API")),t}return e=l,(t=[{key:"startPolling",value:function(e){f.default.start({poll:"categories",url:e,frequency:18e4,update:this.update})}},{key:"render",value:function(){var e=this.state.categories;return 0===e.length?i.default.createElement(u.default,null):i.default.createElement(s.default,{categories:e})}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=h},{"../..":302,"../../services/polls":374,"./blankslate":9,"./categories-list":10,moment:"moment",react:"react"}],21:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return a.default.createElement("select",{className:e.className||"form-control",disabled:e.disabled||!1,id:e.id||null,onChange:e.onChange,value:e.value},e.choices.map(function(e){return a.default.createElement("option",{disabled:e.disabled||!1,key:e.value,value:e.value},"- - ".repeat(e.level)+e.label)}))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],22:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),i=(o(e("../avatar")),o(e("../button"))),u=o(e("../../services/ajax")),s=o(e("../../services/snackbar"));function o(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return p(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var m=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(l,n.default.Component);var e,t,r,o=d(l);function l(e){var a,t,r,n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),a=o.call(this,e),t=p(a),n=function(){if(a.state.isLoading)return!1;a.setState({isLoading:!0});var e=a.props.upload?"crop_tmp":"crop_src",t=$(".crop-form"),r=t.cropit("exportZoom"),n=t.cropit("offset");u.default.post(a.props.user.api.avatar,{avatar:e,crop:{offset:{x:n.x*r,y:n.y*r},zoom:t.cropit("zoom")*r}}).then(function(e){a.props.onComplete(e),s.default.success(e.detail)},function(e){400===e.status?(s.default.error(e.detail),a.setState({isLoading:!1})):a.props.showError(e)})},(r="cropAvatar")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,a.state={isLoading:!1,deviceRatio:1},a}return e=l,(t=[{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 o=this,l=$(".crop-form"),e=this.getAvatarSize(),t=l.width();t<e;)e/=2;var r=this.getAvatarSize()/e;l.width(e),l.cropit({width:e,height:e,exportZoom:r,imageState:{src:this.getImagePath()},onImageLoaded:function(){var e,t,r,n,a;o.props.upload?(e=l.cropit("zoom"),(t=l.cropit("imageSize")).width>t.height?(r=(t.width*e-o.getAvatarSize())/-2,l.cropit("offset",{x:r,y:0})):t.width<t.height?(n=(t.height*e-o.getAvatarSize())/-2,l.cropit("offset",{x:0,y:n})):l.cropit("offset",{x:0,y:0})):(a=o.props.options.crop_src.crop)&&(l.cropit("zoom",a.zoom),l.cropit("offset",{x:a.x,y:a.y}))}})}},{key:"componentWillUnmount",value:function(){$(".crop-form").cropit("disable")}},{key:"render",value:function(){return n.default.createElement("div",null,n.default.createElement("div",{className:"modal-body modal-avatar-crop"},n.default.createElement("div",{className:"crop-form"},n.default.createElement("div",{className:"cropit-preview"}),n.default.createElement("input",{type:"range",className:"cropit-image-zoom-input"}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("div",{className:"col-md-6 col-md-offset-3"},n.default.createElement(i.default,{onClick:this.cropAvatar,loading:this.state.isLoading,className:"btn-primary btn-block"},this.props.upload?gettext("Set avatar"):gettext("Crop image")),n.default.createElement(i.default,{onClick:this.props.showIndex,disabled:this.state.isLoading,className:"btn-default btn-block"},gettext("Cancel")))))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=m},{"../../services/ajax":365,"../../services/snackbar":376,"../avatar":6,"../button":8,react:"react"}],23:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.GalleryItem=r.Gallery=void 0;var l=s(e("react")),o=(s(e("../avatar")),s(e("../button"))),i=(s(e("../..")),s(e("../../services/ajax"))),u=s(e("../../services/snackbar")),n=s(e("../../utils/batch"));function s(e){return e&&e.__esModule?e:{default:e}}function c(){return(c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t,r){return t&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function m(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=v(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=v(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function g(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var _=function(){m(o,l.default.Component);var a=b(o);function o(){var e;f(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"select",function(){e.props.select(e.props.id)}),e}return p(o,[{key:"getClassName",value:function(){return this.props.selection===this.props.id?this.props.disabled?"btn btn-avatar btn-disabled avatar-selected":"btn btn-avatar avatar-selected":this.props.disabled?"btn btn-avatar btn-disabled":"btn btn-avatar"}},{key:"render",value:function(){return l.default.createElement("button",{type:"button",className:this.getClassName(),disabled:this.props.disabled,onClick:this.select},l.default.createElement("img",{src:this.props.url}))}}]),o}();r.GalleryItem=_;var E=function(){m(t,l.default.Component);var e=b(t);function t(){return f(this,t),e.apply(this,arguments)}return p(t,[{key:"render",value:function(){var r=this;return l.default.createElement("div",{className:"avatars-gallery"},l.default.createElement("h3",null,this.props.name),l.default.createElement("div",{className:"avatars-gallery-images"},(0,n.default)(this.props.images,4,null).map(function(e,t){return l.default.createElement("div",{className:"row",key:t},e.map(function(e,t){return l.default.createElement("div",{className:"col-xs-3",key:t},e?l.default.createElement(_,c({disabled:r.props.disabled,select:r.props.select,selection:r.props.selection},e)):l.default.createElement("div",{className:"blank-avatar"}))}))})))}}]),t}();r.Gallery=E;var w=function(){m(n,l.default.Component);var r=b(n);function n(e){var t;return f(this,n),g(h(t=r.call(this,e)),"select",function(e){t.setState({selection:e})}),g(h(t),"save",function(){return!t.state.isLoading&&(t.setState({isLoading:!0}),void i.default.post(t.props.user.api.avatar,{avatar:"galleries",image:t.state.selection}).then(function(e){t.setState({isLoading:!1}),u.default.success(e.detail),t.props.onComplete(e),t.props.showIndex()},function(e){400===e.status?(u.default.error(e.detail),t.setState({isLoading:!1})):t.props.showError(e)}))}),t.state={selection:null,isLoading:!1},t}return p(n,[{key:"render",value:function(){var r=this;return l.default.createElement("div",null,l.default.createElement("div",{className:"modal-body modal-avatar-gallery"},this.props.options.galleries.map(function(e,t){return l.default.createElement(E,{name:e.name,images:e.images,selection:r.state.selection,disabled:r.state.isLoading,select:r.select,key:t})})),l.default.createElement("div",{className:"modal-footer"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-md-6 col-md-offset-3"},l.default.createElement(o.default,{onClick:this.save,loading:this.state.isLoading,disabled:!this.state.selection,className:"btn-primary btn-block"},this.state.selection?gettext("Save choice"):gettext("Select avatar")),l.default.createElement(o.default,{onClick:this.props.showIndex,disabled:this.state.isLoading,className:"btn-default btn-block"},gettext("Cancel"))))))}}]),n}();r.default=w},{"../..":302,"../../services/ajax":365,"../../services/snackbar":376,"../../utils/batch":380,"../avatar":6,"../button":8,react:"react"}],24:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../avatar")),i=n(e("../button")),u=n(e("../loader")),s=n(e("../../services/ajax")),c=n(e("../../services/snackbar"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,o.default.Component);var e,t,r,n=p(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),b(m(t=n.call(this,e)),"setGravatar",function(){t.callApi("gravatar")}),b(m(t),"setGenerated",function(){t.callApi("generated")}),t.state={isLoading:!1},t}return e=a,(t=[{key:"callApi",value:function(e){var t=this;if(this.state.isLoading)return!1;this.setState({isLoading:!0}),s.default.post(this.props.user.api.avatar,{avatar:e}).then(function(e){t.setState({isLoading:!1}),c.default.success(e.detail),t.props.onComplete(e)},function(e){400===e.status?(c.default.error(e.detail),t.setState({isLoading:!1})):t.props.showError(e)})}},{key:"getGravatarButton",value:function(){return this.props.options.gravatar?o.default.createElement(i.default,{onClick:this.setGravatar,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-gravatar"},gettext("Download my Gravatar")):null}},{key:"getCropButton",value:function(){return this.props.options.crop_src?o.default.createElement(i.default,{className:"btn-default btn-block btn-avatar-crop",disabled:this.state.isLoading,onClick:this.props.showCrop},gettext("Re-crop uploaded image")):null}},{key:"getUploadButton",value:function(){return this.props.options.upload?o.default.createElement(i.default,{className:"btn-default btn-block btn-avatar-upload",disabled:this.state.isLoading,onClick:this.props.showUpload},gettext("Upload new image")):null}},{key:"getGalleryButton",value:function(){return this.props.options.galleries?o.default.createElement(i.default,{className:"btn-default btn-block btn-avatar-gallery",disabled:this.state.isLoading,onClick:this.props.showGallery},gettext("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?o.default.createElement("div",{className:"avatar-preview preview-loading"},o.default.createElement(l.default,{size:"200",user:e}),o.default.createElement(u.default,null)):o.default.createElement("div",{className:"avatar-preview"},o.default.createElement(l.default,{size:"200",user:e}))}},{key:"render",value:function(){return o.default.createElement("div",{className:"modal-body modal-avatar-index"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-md-5"},this.getAvatarPreview()),o.default.createElement("div",{className:"col-md-7"},this.getGravatarButton(),o.default.createElement(i.default,{onClick:this.setGenerated,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-generate"},gettext("Generate my individual avatar")),this.getCropButton(),this.getUploadButton(),this.getGalleryButton())))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h},{"../../services/ajax":365,"../../services/snackbar":376,"../avatar":6,"../button":8,"../loader":58,react:"react"}],25:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.ChangeAvatarError=void 0,r.select=function(e){return{user:e.auth.user}};var n=o(e("react")),l=o(e("./index")),i=o(e("./crop")),u=o(e("./upload")),s=o(e("./gallery")),c=o(e("../modal-loader")),f=e("../../reducers/users"),d=o(e("../../services/ajax")),p=o(e("../../services/store"));function o(e){return e&&e.__esModule?e:{default:e}}function m(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function y(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t,r){return t&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function v(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=w(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=w(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function w(e){return(w=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var O=function(){v(t,n.default.Component);var e=_(t);function t(){return y(this,t),e.apply(this,arguments)}return h(t,[{key:"getErrorReason",value:function(){return this.props.reason?n.default.createElement("p",{dangerouslySetInnerHTML:{__html:this.props.reason}}):null}},{key:"render",value:function(){return n.default.createElement("div",{className:"modal-body"},n.default.createElement("div",{className:"message-icon"},n.default.createElement("span",{className:"material-icon"},"remove_circle_outline")),n.default.createElement("div",{className:"message-body"},n.default.createElement("p",{className:"lead"},this.props.message),this.getErrorReason(),n.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok"))))}}]),t}();r.ChangeAvatarError=O;var j=function(){v(o,n.default.Component);var a=_(o);function o(){var t;y(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return m(E(t=a.call.apply(a,[this].concat(r))),"showError",function(e){t.setState({error:e})}),m(E(t),"showIndex",function(){t.setState({component:l.default})}),m(E(t),"showUpload",function(){t.setState({component:u.default})}),m(E(t),"showCrop",function(){t.setState({component:i.default})}),m(E(t),"showGallery",function(){t.setState({component:s.default})}),m(E(t),"completeFlow",function(e){p.default.dispatch((0,f.updateAvatar)(t.props.user,e.avatars)),t.setState({component:l.default,options:e})}),t}return h(o,[{key:"componentDidMount",value:function(){var t=this;d.default.get(this.props.user.api.avatar).then(function(e){t.setState({component:l.default,options:e,error:null})},function(e){t.showError(e)})}},{key:"getBody",value:function(){return this.state?this.state.error?n.default.createElement(O,{message:this.state.error.detail,reason:this.state.error.reason}):n.default.createElement(this.state.component,{options:this.state.options,user:this.props.user,onComplete:this.completeFlow,showError:this.showError,showIndex:this.showIndex,showCrop:this.showCrop,showUpload:this.showUpload,showGallery:this.showGallery}):n.default.createElement(c.default,null)}},{key:"getClassName",value:function(){return this.state&&this.state.error?"modal-dialog modal-message modal-change-avatar":"modal-dialog modal-change-avatar"}},{key:"render",value:function(){return n.default.createElement("div",{className:this.getClassName(),role:"document"},n.default.createElement("div",{className:"modal-content"},n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Change your avatar"))),this.getBody()))}}]),o}();r.default=j},{"../../reducers/users":364,"../../services/ajax":365,"../../services/store":377,"../modal-loader":61,"./crop":22,"./gallery":23,"./index":24,"./upload":26,react:"react"}],26:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),l=o(e("./crop")),i=o(e("../button")),u=o(e("../../services/ajax")),s=o(e("../../services/snackbar")),c=o(e("../../utils/file-size"));function o(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(o,n.default.Component);var e,t,r,a=p(o);function o(e){var n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o),b(m(n=a.call(this,e)),"pickFile",function(){document.getElementById("avatar-hidden-upload").click()}),b(m(n),"uploadFile",function(){var e,t,r=document.getElementById("avatar-hidden-upload").files[0];r&&((e=n.validateFile(r))?s.default.error(e):(n.setState({image:r,preview:URL.createObjectURL(r),progress:0}),(t=new FormData).append("avatar","upload"),t.append("image",r),u.default.upload(n.props.user.api.avatar,t,function(e){n.setState({progress:e})}).then(function(e){n.setState({options:e,uploaded:e.detail}),s.default.info(gettext("Your image has been uploaded and you may now crop it."))},function(e){400===e.status||413===e.status?(s.default.error(e.detail),n.setState({isLoading:!1,image:null,progress:0})):n.props.showError(e)})))}),n.state={image:null,preview:null,progress:0,uploaded:null,dataUrl:null},n}return e=o,(t=[{key:"validateFile",value:function(e){if(e.size>this.props.options.upload.limit)return interpolate(gettext("Selected file is too big. (%(filesize)s)"),{filesize:(0,c.default)(e.size)},!0);var t=gettext("Selected file type is not supported.");if(-1===this.props.options.upload.allowed_mime_types.indexOf(e.type))return t;var r=!1,n=e.name.toLowerCase();return this.props.options.upload.allowed_extensions.map(function(e){n.substr(-1*e.length)===e&&(r=!0)}),!r&&t}},{key:"getUploadRequirements",value:function(e){var t=e.allowed_extensions.map(function(e){return e.substr(1)});return interpolate(gettext("%(files)s files smaller than %(limit)s"),{files:t.join(", "),limit:(0,c.default)(e.limit)},!0)}},{key:"getUploadButton",value:function(){return n.default.createElement("div",{className:"modal-body modal-avatar-upload"},n.default.createElement(i.default,{className:"btn-pick-file",onClick:this.pickFile},n.default.createElement("div",{className:"material-icon"},"input"),gettext("Select file")),n.default.createElement("p",{className:"text-muted"},this.getUploadRequirements(this.props.options.upload)))}},{key:"getUploadProgressLabel",value:function(){return interpolate(gettext("%(progress)s % complete"),{progress:this.state.progress},!0)}},{key:"getUploadProgress",value:function(){return n.default.createElement("div",{className:"modal-body modal-avatar-upload"},n.default.createElement("div",{className:"upload-progress"},n.default.createElement("img",{src:this.state.preview}),n.default.createElement("div",{className:"progress"},n.default.createElement("div",{className:"progress-bar",role:"progressbar","aria-valuenow":"{this.state.progress}","aria-valuemin":"0","aria-valuemax":"100",style:{width:this.state.progress+"%"}},n.default.createElement("span",{className:"sr-only"},this.getUploadProgressLabel())))))}},{key:"renderUpload",value:function(){return n.default.createElement("div",null,n.default.createElement("input",{type:"file",id:"avatar-hidden-upload",className:"hidden-file-upload",onChange:this.uploadFile}),this.state.image?this.getUploadProgress():this.getUploadButton(),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("div",{className:"col-md-6 col-md-offset-3"},n.default.createElement(i.default,{onClick:this.props.showIndex,disabled:!!this.state.image,className:"btn-default btn-block"},gettext("Cancel")))))}},{key:"renderCrop",value:function(){return n.default.createElement(l.default,{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()}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=h},{"../../services/ajax":365,"../../services/snackbar":376,"../../utils/file-size":384,"../button":8,"./crop":22,react:"react"}],27:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getClassName",value:function(){return this.props.dropdown?"btn btn-default btn-aligned btn-icon btn-dropdown-toggle open hidden-md hidden-lg":"btn btn-default btn-aligned btn-icon btn-dropdown-toggle hidden-md hidden-lg"}},{key:"render",value:function(){return o.default.createElement("button",{className:this.getClassName(),type:"button",onClick:this.props.toggleNav,"aria-haspopup":"true","aria-expanded":this.props.dropdown?"true":"false"},o.default.createElement("i",{className:"material-icon"},"menu"))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],28:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.display?n.default.createElement(a.default,{helpText:gettext("No profile details are editable at this time."),message:gettext("This option is currently unavailable.")}):null};var n=o(e("react")),a=o(e("../panel-message"));function o(e){return e&&e.__esModule?e:{default:e}}},{"../panel-message":94,react:"react"}],29:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../select"));function n(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(u,o.default.Component);var e,t,r,i=f(u);function u(){var n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var e,t,r,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return n=i.call.apply(i,[this].concat(o)),e=d(n),r=function(e){var t=n.props,r=t.field;(0,t.onChange)(r.fieldname,e.target.value)},(t="onChange")in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,n}return e=u,(t=[{key:"render",value:function(){var e=this.props,t=e.disabled,r=e.field,n=e.value,a=r.input;return"select"===a.type?o.default.createElement(l.default,{choices:a.choices,disabled:t,id:"id_"+r.fieldname,onChange:this.onChange,value:n}):"textarea"===a.type?o.default.createElement("textarea",{className:"form-control",disabled:t,id:"id_"+r.fieldname,onChange:this.onChange,rows:"4",type:"text",value:n}):"text"===a.type?o.default.createElement("input",{className:"form-control",disabled:t,id:"id_"+r.fieldname,onChange:this.onChange,type:"text",value:n}):null}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../select":210,react:"react"}],30:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.disabled,r=e.errors,n=e.fields,a=e.name,o=e.onChange,l=e.value;return i.default.createElement("fieldset",null,i.default.createElement("legend",null,a),n.map(function(e){return i.default.createElement(s.default,{for:"id_"+e.fieldname,helpText:e.help_text,key:e.fieldname,label:e.label,validation:r[e.fieldname]},i.default.createElement(u.default,{disabled:t,field:e,onChange:o,value:l[e.fieldname]}))}))};var i=n(e("react")),u=n(e("./field-input")),s=n(e("../form-group"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../form-group":55,"./field-input":29,react:"react"}],31:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.CancelButton=v,r.default=void 0;var n=s(e("react")),o=s(e("./fieldset")),l=s(e("../button")),i=s(e("../form")),u=s(e("../../services/ajax")),f=s(e("../../services/snackbar"));function s(e){return e&&e.__esModule?e:{default:e}}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(c,i.default);var e,t,r,s=m(c);function c(e){var r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,c),b(y(r=s.call(this,e)),"onChange",function(e,t){r.setState(b({},e,t))}),r.state={isLoading:!1,errors:{}};for(var t=e.groups.length,n=0;n<t;n++)for(var a=e.groups[n],o=a.fields.length,l=0;l<o;l++){var i=a.fields[l].fieldname,u=a.fields[l].initial;r.state[i]=u}return r}return e=c,(t=[{key:"send",value:function(){var e=Object.assign({},this.state,{errors:null,isLoading:null});return u.default.post(this.props.api,e)}},{key:"handleSuccess",value:function(e){this.props.onSuccess(e)}},{key:"handleError",value:function(e){400===e.status?(f.default.error(gettext("Form contains errors.")),this.setState({errors:e})):f.default.apiError(e)}},{key:"render",value:function(){var r=this;return n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"panel-body"},this.props.groups.map(function(e,t){return n.default.createElement(o.default,{disabled:r.state.isLoading,errors:r.state.errors,fields:e.fields,name:e.name,key:t,onChange:r.onChange,value:r.state})})),n.default.createElement("div",{className:"panel-footer text-right"},n.default.createElement(v,{disabled:this.state.isLoading,onCancel:this.props.onCancel})," ",n.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Save changes"))))}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),c}();function v(e){var t=e.onCancel,r=e.disabled;return t?n.default.createElement("button",{className:"btn btn-default",disabled:r,onClick:t,type:"button"},gettext("Cancel")):null}r.default=h},{"../../services/ajax":365,"../../services/snackbar":376,"../button":8,"../form":56,"./fieldset":30,react:"react"}],32:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.FormDisplay=b,r.default=void 0;var l=n(e("react")),o=n(e("./blankslate")),i=n(e("./loader")),u=n(e("./form")),s=n(e("../../services/ajax")),c=n(e("../../services/snackbar"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=m(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=m(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var y=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,l.default.Component);var e,t,r,n=p(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={loading:!0,groups:null},t}return e=a,(t=[{key:"componentDidMount",value:function(){var t=this;s.default.get(this.props.api).then(function(e){t.setState({loading:!1,groups:e})},function(e){c.default.apiError(e),t.props.cancel&&t.props.cancel()})}},{key:"render",value:function(){var e=this.state,t=e.groups,r=e.loading;return l.default.createElement("div",{className:"panel panel-default panel-form"},l.default.createElement("div",{className:"panel-heading"},l.default.createElement("h3",{className:"panel-title"},gettext("Edit details"))),l.default.createElement(i.default,{display:r}),l.default.createElement(o.default,{display:!r&&!t.length}),l.default.createElement(b,{api:this.props.api,display:!r&&t.length,groups:t,onCancel:this.props.onCancel,onSuccess:this.props.onSuccess}))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function b(e){var t=e.api,r=e.display,n=e.groups,a=e.onCancel,o=e.onSuccess;return r?l.default.createElement(u.default,{api:t,groups:n,onCancel:a,onSuccess:o}):null}r.default=y},{"../../services/ajax":365,"../../services/snackbar":376,"./blankslate":28,"./form":31,"./loader":33,react:"react"}],33:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.display?n.default.createElement("div",{className:"panel-body"},n.default.createElement(a.default,null)):null};var n=o(e("react")),a=o(e("../loader"));function o(e){return e&&e.__esModule?e:{default:e}}},{"../loader":58,react:"react"}],34:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return f(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(u,o.default.Component);var e,t,r,i=c(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=f(e),n=function(){e.props.replaceSelection(e.props.execAction)},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return o.default.createElement("button",{className:"btn btn-icon "+this.props.className,disabled:this.props.disabled,onClick:this.onClick,title:this.props.title,type:"button"},this.props.children)}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{react:"react"}],35:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Insert code")},e),n.default.createElement("span",{className:"material-icon"},"functions"))},r.insertCode=i;var n=o(e("react")),a=o(e("./action"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){t("\n\n```"+$.trim(prompt(gettext("Enter name of syntax of your code (optional)")+":"))+"\n"+e+"\n```\n\n")}},{"./action":34,react:"react"}],36:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Emphase selection")},e),n.default.createElement("span",{className:"material-icon"},"format_italic"))},r.makeEmphasis=i;var n=o(e("react")),a=o(e("./action"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){e.length&&t("*"+e+"*")}},{"./action":34,react:"react"}],37:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Insert horizontal ruler")},e),n.default.createElement("span",{className:"material-icon"},"remove"))},r.insertHr=i;var n=o(e("react")),a=o(e("./action"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){t("\n\n- - - - -\n\n")}},{"./action":34,react:"react"}],38:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,i({execAction:u,title:gettext("Insert image")},e),n.default.createElement("span",{className:"material-icon"},"insert_photo"))},r.insertImage=u;var n=l(e("react")),a=l(e("./action")),o=l(e("../../../utils/is-url"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){return(i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function u(e,t){var r="",n="";e.length&&((0,o.default)(e)?r=e:n=e),(r=$.trim(prompt(gettext("Enter link to image")+":",r))).length&&(0<(n=$.trim(prompt(gettext("Enter image label (optional)")+":",n))).length?t("!["+n+"]("+r+")"):t("!("+r+")"))}},{"../../../utils/is-url":385,"./action":34,react:"react"}],39:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,i({execAction:u,title:gettext("Insert link")},e),n.default.createElement("span",{className:"material-icon"},"insert_link"))},r.insertLink=u;var n=l(e("react")),a=l(e("./action")),o=l(e("../../../utils/is-url"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){return(i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function u(e,t){var r="",n="";if(e.length&&((0,o.default)(e)?r=e:n=e),0===(r=$.trim(prompt(gettext("Enter link address")+":",r)||"")).length)return!1;n=$.trim(prompt(gettext("Enter link label (optional)")+":",n)),r.length&&(0<n.length?t("["+n+"]("+r+")"):t(r))}},{"../../../utils/is-url":385,"./action":34,react:"react"}],40:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Insert quote")},e),n.default.createElement("span",{className:"material-icon"},"format_quote"))},r.insertQuote=i;var n=o(e("react")),a=o(e("./action"));o(e("../../../utils/is-url"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){var r=$.trim(prompt(gettext("Enter quote autor, prefix usernames with @")+":",r));t(r?'\n\n[quote="'+r+'"]\n'+e+"\n[/quote]\n\n":"\n\n[quote]\n"+e+"\n[/quote]\n\n")}},{"../../../utils/is-url":385,"./action":34,react:"react"}],41:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Insert spoiler")},e),n.default.createElement("span",{className:"material-icon"},"not_interested"))},r.insertSpoiler=i;var n=o(e("react")),a=o(e("./action"));o(e("../../../utils/is-url"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){t("\n\n[spoiler]\n"+e+"\n[/spoiler]\n\n")}},{"../../../utils/is-url":385,"./action":34,react:"react"}],42:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Strikethrough selection")},e),n.default.createElement("span",{className:"material-icon"},"format_strikethrough"))},r.makeStrikethrough=i;var n=o(e("react")),a=o(e("./action"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){e.length&&t("~~"+e+"~~")}},{"./action":34,react:"react"}],43:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Bolder selection")},e),n.default.createElement("span",{className:"material-icon"},"format_bold"))},r.makeStrong=i;var n=o(e("react")),a=o(e("./action"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){e.length&&t("**"+e+"**")}},{"./action":34,react:"react"}],44:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Actions=j,r.Details=O,r.Filename=w,r.Icon=E,r.Image=_,r.Insert=P,r.Preview=g,r.Remove=k,r.Undo=N,r.default=void 0;var l=n(e("react")),o=(n(e("../../../..")),n(e("../../../../utils/escape-html"))),i=n(e("../../../../utils/file-size"));function n(e){return e&&e.__esModule?e:{default:e}}function u(){return(u=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=p(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=p(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function p(e){return(p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function m(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var y='<abbr title="%(absolute)s">%(relative)s</abbr>',b='<span class="item-title">%(user)s</span>',h='<a href="%(url)s" class="item-title">%(user)s</a>',v=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(o,l.default.Component);var e,t,r,a=f(o);function o(){var n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return m(d(n=a.call.apply(a,[this].concat(t))),"onInsert",function(){n.props.replaceSelection(n.insertAttachment)}),m(d(n),"insertAttachment",function(e,t){var r=n.props.item;r.is_image?r.url.thumb?t("[!["+r.filename+"]("+r.url.thumb+")]("+r.url.index+")"):t("[!["+r.filename+"]("+r.url.index+")]("+r.url.index+")"):t("["+r.filename+"]("+r.url.index+")")}),m(d(n),"onRemove",function(){n.updateItem({isRemoved:!0})}),m(d(n),"onUndo",function(){n.updateItem({isRemoved:!1})}),m(d(n),"updateItem",function(t){var e=n.props.attachments.map(function(e){return e.id===n.props.item.id?Object.assign({},e,t):e});n.props.onAttachmentsChange(e)}),n}return e=o,(t=[{key:"render",value:function(){return l.default.createElement("li",{className:"editor-attachment-complete"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-xs-12 col-sm-8 col-md-9"},l.default.createElement(g,this.props),l.default.createElement("div",{className:"editor-attachment-details"},l.default.createElement(w,this.props),l.default.createElement(O,this.props))),l.default.createElement("div",{className:"col-xs-12 col-sm-4 col-md-3 xs-margin-top-half"},l.default.createElement(j,u({onInsert:this.onInsert,onRemove:this.onRemove,onUndo:this.onUndo},this.props)))))}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();function g(e){return e.item.is_image?l.default.createElement(_,e):l.default.createElement(E,e)}function _(e){var t=e.item.url.thumb||e.item.url.index;return l.default.createElement("div",{className:"editor-attachment-image"},l.default.createElement("a",{href:e.item.url.index+"?shva=1",style:{backgroundImage:"url('"+t+"?shva=1')"},target:"_blank"}))}function E(e){return l.default.createElement("div",{className:"editor-attachment-icon"},l.default.createElement("span",{className:"material-icon"},"insert_drive_file"))}function w(e){return l.default.createElement("h4",null,l.default.createElement("a",{className:"item-title",href:e.item.url.index+"?shva=1",target:"_blank"},e.item.filename))}function O(e){var t=null,t=e.item.url.uploader?interpolate(h,{url:(0,o.default)(e.item.url.uploader),user:(0,o.default)(e.item.uploader_name)},!0):interpolate(b,{user:(0,o.default)(e.item.uploader_name)},!0),r=interpolate(y,{absolute:(0,o.default)(e.item.uploaded_on.format("LLL")),relative:(0,o.default)(e.item.uploaded_on.fromNow())},!0),n=interpolate((0,o.default)(gettext("%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.")),{filetype:e.item.filetype,size:(0,i.default)(e.item.size),uploader:t,uploaded_on:r},!0);return l.default.createElement("p",{dangerouslySetInnerHTML:{__html:n}})}function j(e){return l.default.createElement("div",{className:"editor-attachment-actions"},l.default.createElement("div",{className:"row"},l.default.createElement(P,e),l.default.createElement(k,e),l.default.createElement(N,e)))}function P(e){return e.item.isRemoved?null:l.default.createElement("div",{className:"col-xs-6"},l.default.createElement("button",{className:"btn btn-default btn-sm btn-block",onClick:e.onInsert,type:"button"},gettext("Insert")))}function k(e){return e.item.isRemoved&&e.item.acl.can_delete?null:l.default.createElement("div",{className:"col-xs-6"},l.default.createElement("button",{className:"btn btn-default btn-sm btn-block",onClick:e.onRemove,type:"button"},gettext("Remove")))}function N(e){return e.item.isRemoved?l.default.createElement("div",{className:"col-xs-12"},l.default.createElement("button",{className:"btn btn-default btn-sm btn-block",onClick:e.onUndo,type:"button"},gettext("Undo removal"))):null}r.default=v},{"../../../..":302,"../../../../utils/escape-html":383,"../../../../utils/file-size":384,react:"react"}],45:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=l(e("react")),o=l(e("../../../../utils/escape-html"));function l(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(u,n.default.Component);var e,t,r,i=f(u);function u(){var t;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var e,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return t=i.call.apply(i,[this].concat(o)),e=d(t),n=function(){var e=t.props.attachments.filter(function(e){return e.key!==t.props.item.key});t.props.onAttachmentsChange(e)},(r="onClick")in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,t}return e=u,(t=[{key:"render",value:function(){var e=interpolate("<strong>%(name)s</strong>",{name:(0,o.default)(this.props.item.filename)},!0),t=interpolate(gettext("Error uploading %(filename)s"),{filename:e,progress:this.props.item.progress+"%"},!0);return n.default.createElement("li",{className:"editor-attachment-error"},n.default.createElement("div",{className:"editor-attachment-error-icon"},n.default.createElement("span",{className:"material-icon"},"warning")),n.default.createElement("div",{className:"editor-attachment-error-message"},n.default.createElement("h4",{dangerouslySetInnerHTML:{__html:t+":"}}),n.default.createElement("p",null,this.props.item.error),n.default.createElement("button",{className:"btn btn-default btn-sm",onClick:this.onClick,type:"button"},gettext("Dismiss"))))}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../../../../utils/escape-html":383,react:"react"}],46:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){if(e.item.id)return n.default.createElement(a.default,e);if(e.item.error)return n.default.createElement(o.default,e);return n.default.createElement(l.default,e)};var n=i(e("react")),a=i(e("./complete")),o=i(e("./error")),l=i(e("./upload"));i(e("../../../..")),i(e("../../../../utils/escape-html"));function i(e){return e&&e.__esModule?e:{default:e}}},{"../../../..":302,"../../../../utils/escape-html":383,"./complete":44,"./error":45,"./upload":47,react:"react"}],47:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=interpolate(l,{name:(0,a.default)(e.item.filename)},!0),r=interpolate(gettext("Uploading %(filename)s... %(progress)s"),{filename:t,progress:e.item.progress+"%"},!0);return n.default.createElement("li",{className:"editor-attachment-upload"},n.default.createElement("div",{className:"editor-attachment-progress-bar"},n.default.createElement("div",{className:"editor-attachment-progress",style:{width:e.item.progress+"%"}})),n.default.createElement("p",{className:"editor-attachment-upload-message",dangerouslySetInnerHTML:{__html:r}}))};var n=o(e("react")),a=o(e("../../../../utils/escape-html"));function o(e){return e&&e.__esModule?e:{default:e}}var l="<strong>%(name)s</strong>"},{"../../../../utils/escape-html":383,react:"react"}],48:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return l.default.get("user").acl.max_attachment_size?n.default.createElement("div",{className:"editor-attachments"},n.default.createElement(a.default,e),n.default.createElement(o.default,e)):null};var n=i(e("react")),a=i(e("./list")),o=i(e("./uploader")),l=i(e("../../.."));function i(e){return e&&e.__esModule?e:{default:e}}},{"../../..":302,"./list":49,"./uploader":51,react:"react"}],49:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(t){return n.default.createElement("ul",{className:"list-unstyled editor-attachments-list"},t.attachments.map(function(e){return n.default.createElement(a.default,l({item:e,key:e.id||e.key},t))}))};var n=o(e("react")),a=o(e("./attachment"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}},{"./attachment":46,react:"react"}],50:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=l(e("react")),o=l(e("../../.."));function l(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(u,n.default.Component);var e,t,r,i=f(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=d(e),n=function(){document.getElementById("editor-upload-field").click()},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return o.default.get("user").acl.max_attachment_size?n.default.createElement("button",{className:"btn btn-icon "+this.props.className,disabled:this.props.disabled,onClick:this.onClick,title:gettext("Upload file"),type:"button"},n.default.createElement("span",{className:"material-icon"},"file_upload")):null}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../../..":302,react:"react"}],51:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.getRandomKey=b;var n=o(e("react")),s=o(e("moment")),c=o(e("../../..")),f=o(e("../../../services/ajax")),d=o(e("../../../services/snackbar"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(u,n.default.Component);var e,t,r,i=m(u);function u(){var a;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var e,t,r,n=arguments.length,o=new Array(n),l=0;l<n;l++)o[l]=arguments[l];return a=i.call.apply(i,[this].concat(o)),e=y(a),r=function(e){var t,r,n=e.target.files[0];n&&(t={id:null,key:b(),progress:0,error:null,filename:n.name},a.props.onAttachmentsChange([t].concat(a.props.attachments)),(r=new FormData).append("upload",n),f.default.upload(c.default.get("ATTACHMENTS_API"),r,function(e){t.progress=e,a.props.onAttachmentsChange(a.props.attachments.concat())}).then(function(e){e.uploaded_on=(0,s.default)(e.uploaded_on),Object.assign(t,e),a.props.onAttachmentsChange(a.props.attachments.concat())},function(e){400===e.status||413===e.status?(t.error=e.detail,a.props.onAttachmentsChange(a.props.attachments.concat())):d.default.apiError(e)}))},(t="onChange")in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,a}return e=u,(t=[{key:"render",value:function(){return n.default.createElement("input",{id:"editor-upload-field",onChange:this.onChange,type:"file"})}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();function b(){return"upld-"+Math.round((new Date).getTime())}r.default=u},{"../../..":302,"../../../services/ajax":365,"../../../services/snackbar":376,moment:"moment",react:"react"}],52:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Protect=M,r.default=void 0;var o=n(e("react")),l=n(e("./actions/code")),u=n(e("./actions/emphasis")),s=n(e("./actions/hr")),c=n(e("./actions/image")),f=n(e("./actions/link")),d=n(e("./actions/spoiler")),p=n(e("./actions/strikethrough")),m=n(e("./actions/strong")),y=n(e("./actions/quote")),b=n(e("./attachments")),h=n(e("./attachments/upload-button")),v=n(e("./markup-preview")),g=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=P(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./textutils")),_=n(e("../button")),E=n(e("../..")),w=n(e("../../services/ajax")),O=n(e("../../services/modal")),j=n(e("../../services/snackbar"));function P(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(P=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function k(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function N(e,t){return(N=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function x(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return S(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function S(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function R(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var C=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&N(e,t)}(a,o.default.Component);var e,t,r,n=x(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),R(S(t=n.call(this,e)),"onPreviewClick",function(){t.state.isPreviewLoading||(t.setState({isPreviewLoading:!0}),w.default.post(E.default.get("PARSE_MARKUP_API"),{post:t.props.value}).then(function(e){O.default.show(o.default.createElement(v.default,{markup:e.parsed})),t.setState({isPreviewLoading:!1})},function(e){400===e.status?j.default.error(e.detail):j.default.apiError(e),t.setState({isPreviewLoading:!1})}))}),R(S(t),"replaceSelection",function(e){e(g.getSelectionText(),t._replaceSelection)}),R(S(t),"_replaceSelection",function(e){t.props.onChange({target:{value:g.replace(e)}})}),t.state={isPreviewLoading:!1},t}return e=a,(t=[{key:"componentDidMount",value:function(){var n=this;$("#editor-textarea").atwho({at:"@",displayTpl:'<li><img src="${avatar}" alt="">${username}</li>',insertTpl:"@${username}",searchKey:"username",callbacks:{remoteFilter:function(e,t){$.getJSON(E.default.get("MENTION_API"),{q:e},t)}}}),$("#editor-textarea").on("inserted.atwho",function(e,t,r){n.props.onChange(e)})}},{key:"render",value:function(){return o.default.createElement("div",{className:"editor-border"},o.default.createElement("textarea",{className:"form-control",value:this.props.value,disabled:this.props.loading,id:"editor-textarea",onChange:this.props.onChange,rows:"9"}),o.default.createElement("div",{className:"editor-footer"},o.default.createElement("div",{className:"buttons-list pull-left"},o.default.createElement(m.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(u.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(p.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(s.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(f.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(c.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(y.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(d.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(l.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(h.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading})),o.default.createElement(_.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,onClick:this.onPreviewClick,type:"button"},gettext("Preview")),o.default.createElement(_.default,{className:"btn-primary btn-sm pull-right",loading:this.props.loading},this.props.submitLabel||gettext("Post")),o.default.createElement("button",{className:"btn btn-default btn-sm pull-right",disabled:this.props.loading,onClick:this.props.onCancel,type:"button"},gettext("Cancel")),o.default.createElement("div",{className:"clearfix visible-xs-block"}),o.default.createElement(M,{canProtect:this.props.canProtect,disabled:this.props.loading,onProtect:this.props.onProtect,onUnprotect:this.props.onUnprotect,protect:this.props.protect})),o.default.createElement(b.default,{attachments:this.props.attachments,onAttachmentsChange:this.props.onAttachmentsChange,placeholder:this.props.placeholder,replaceSelection:this.replaceSelection}))}}])&&k(e.prototype,t),r&&k(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function M(e){if(!e.canProtect)return null;var t=e.protect?gettext("Protected"):gettext("Protect");return o.default.createElement("button",{className:"btn btn-icon btn-default btn-protect btn-sm pull-right",disabled:e.disabled,onClick:e.protect?e.onUnprotect:e.onProtect,title:t,type:"button"},o.default.createElement("span",{className:"material-icon"},e.protect?"lock":"lock_outline"),o.default.createElement("span",{className:"btn-text hidden-md hidden-lg"},t))}r.default=C},{"../..":302,"../../services/ajax":365,"../../services/modal":371,"../../services/snackbar":376,"../button":8,"./actions/code":35,"./actions/emphasis":36,"./actions/hr":37,"./actions/image":38,"./actions/link":39,"./actions/quote":40,"./actions/spoiler":41,"./actions/strikethrough":42,"./actions/strong":43,"./attachments":48,"./attachments/upload-button":50,"./markup-preview":53,"./textutils":54,react:"react"}],53:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement("div",{className:"modal-dialog",role:"document"},n.default.createElement("div",{className:"modal-content"},n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Preview message"))),n.default.createElement("div",{className:"modal-body markup-preview"},n.default.createElement(a.default,{markup:e.markup}))))};var n=o(e("react")),a=o(e("../misago-markup"));function o(e){return e&&e.__esModule?e:{default:e}}},{"../misago-markup":60,react:"react"}],54:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r._replace=s,r.getSelection=i,r.getSelectionRange=l,r.getSelectionText=function(){var e=i();return $.trim(a().substring(e.start,e.end))},r.getTextarea=o,r.getValue=a,r.replace=function(e){return s(i(),e)},r.setSelection=u,r.textareaId=void 0;var n="editor-textarea";function o(){return document.getElementById(n)}function a(){return document.getElementById(n).value}function l(e,t){return{start:e,end:t}}function i(){var e=o();if(document.selection){e.focus();var t=document.selection.createRange(),r=t.text.length;return t.moveStart("character",-e.value.length),l(t.text.length-r,t.text.length)}if(e.selectionStart||"0"==e.selectionStart)return l(e.selectionStart,e.selectionEnd)}function u(e){var t,r=o();r.setSelectionRange?(r.focus(),r.setSelectionRange(e.start,e.end)):r.createTextRange&&((t=r.createTextRange()).collapse(!0),t.moveStart("character",e.start),t.moveEnd("character",e.end),t.select())}function s(e,t){var r=o(),n=r.value,a=n.substring(0,e.start);return r.value=n.substring(0,e.start)+t+n.substring(e.end),u(l(a.length+t.length,a.length+t.length)),r.value}r.textareaId=n},{}],55:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{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 r=this;return this.props.validation?o.default.createElement("div",{className:"help-block errors"},this.props.validation.map(function(e,t){return o.default.createElement("p",{key:r.props.for+"FeedbackItem"+t},e)})):null}},{key:"getFeedbackDescription",value:function(){return this.isValidated()?o.default.createElement("span",{id:this.props.for+"_status",className:"sr-only"},this.props.validation?gettext("(error)"):gettext("(success)")):null}},{key:"getHelpText",value:function(){return this.props.helpText?o.default.createElement("p",{className:"help-block"},this.props.helpText):null}},{key:"render",value:function(){return o.default.createElement("div",{className:this.getClassName()},o.default.createElement("label",{className:"control-label "+(this.props.labelClass||""),htmlFor:this.props.for||""},this.props.label+":"),o.default.createElement("div",{className:this.props.controlClass||""},this.props.children,this.getFeedbackDescription(),this.getFeedback(),this.getHelpText(),this.props.extra||null))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],56:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var l=o(e("react")),n=e("../utils/validators"),i=o(e("../services/snackbar"));function o(e){return e&&e.__esModule?e:{default:e}}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=d(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return f(e)}(this,n?(e=d(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function d(e){return(d=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function p(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var m=(0,n.required)(),y=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(o,l.default.Component);var e,t,r,n=c(o);function o(){var a;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return p(f(a=n.call.apply(n,[this].concat(t))),"bindInput",function(t){return function(e){a.changeValue(t,e.target.value)}}),p(f(a),"changeValue",function(e,t){var r=p({},e,t),n=a.state.errors||{};n[e]=a.validateField(e,r[e]),r.errors=n,a.setState(r)}),p(f(a),"handleSubmit",function(e){var t;e&&e.preventDefault(),a.state.isLoading||a.clean()&&(a.setState({isLoading:!0}),(t=a.send())?t.then(function(e){a.setState({isLoading:!1}),a.handleSuccess(e)},function(e){a.setState({isLoading:!1}),a.handleError(e)}):a.setState({isLoading:!1}))}),a}return e=o,(t=[{key:"validate",value:function(){var e={};if(!this.state.validators)return e;var t={required:this.state.validators.required||this.state.validators,optional:this.state.validators.optional||{}},r=[];for(var n in t.required)t.required.hasOwnProperty(n)&&t.required[n]&&r.push(n);for(var a in t.optional)t.optional.hasOwnProperty(a)&&t.optional[a]&&r.push(a);for(var o in r){var l=r[o],i=this.validateField(l,this.state[l]);null===i?e[l]=null:i&&(e[l]=i)}return e}},{key:"isValid",value:function(){var e=this.validate();for(var t in e)if(e.hasOwnProperty(t)&&null!==e[t])return!1;return!0}},{key:"validateField",value:function(e,t){var r=[];if(!this.state.validators)return r;var n={required:(this.state.validators.required||this.state.validators)[e],optional:(this.state.validators.optional||{})[e]},a=m(t)||!1;if(n.required){if(a)r=[a];else for(var o in n.required){var l=n.required[o](t);l&&r.push(l)}return r.length?r:null}if(!1===a&&n.optional){for(var i in n.optional){var u=n.optional[i](t);u&&r.push(u)}return r.length?r:null}return!1}},{key:"clean",value:function(){return!0}},{key:"send",value:function(){return null}},{key:"handleSuccess",value:function(){}},{key:"handleError",value:function(e){i.default.apiError(e)}}])&&u(e.prototype,t),r&&u(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=y},{"../services/snackbar":376,"../utils/validators":393,react:"react"}],57:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{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 o.default.createElement("li",{className:this.getClassName()},this.props.children)}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],58:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return a.default.createElement("div",{className:e.className||"loader"},a.default.createElement("div",{className:"loader-spinning-wheel"}))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],59:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.BestAnswerSelect=v,r.PollSelect=g,r.default=void 0;var o=n(e("react")),l=n(e("./button")),i=n(e("./form")),u=n(e("./form-group")),s=n(e("../services/ajax")),c=n(e("../services/modal"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,i.default);var e,t,r,n=p(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),b(m(t=n.call(this,e)),"handleSuccess",function(e){t.props.onSuccess(e),c.default.hide()}),b(m(t),"handleError",function(e){t.props.onError(e)}),b(m(t),"onBestAnswerChange",function(e){t.changeValue("bestAnswer",e.target.value)}),b(m(t),"onPollChange",function(e){t.changeValue("poll",e.target.value)}),t.state={isLoading:!1,bestAnswer:"0",poll:"0"},t}return e=a,(t=[{key:"clean",value:function(){return!this.props.polls||"0"!==this.state.poll||window.confirm(gettext("Are you sure you want to delete all polls?"))}},{key:"send",value:function(){var e=Object.assign({},this.props.data,{best_answer:this.state.bestAnswer,poll:this.state.poll});return s.default.post(this.props.api,e)}},{key:"render",value:function(){return o.default.createElement("div",{className:"modal-dialog",role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Merge threads"))),o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"modal-body"},o.default.createElement(v,{choices:this.props.bestAnswers,onChange:this.onBestAnswerChange,value:this.state.bestAnswer}),o.default.createElement(g,{choices:this.props.polls,onChange:this.onPollChange,value:this.state.poll})),o.default.createElement("div",{className:"modal-footer"},o.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Merge threads"))))))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function v(e){var t=e.choices,r=e.onChange,n=e.value;return t?o.default.createElement(u.default,{label:gettext("Best answer"),helpText:gettext("Please select the best answer for your newly merged thread. No posts will be deleted during the merge."),for:"id_best_answer"},o.default.createElement("select",{className:"form-control",id:"id_best_answer",onChange:r,value:n},t.map(function(e){return o.default.createElement("option",{value:e[0],key:e[0]},e[1])}))):null}function g(e){var t=e.choices,r=e.onChange,n=e.value;return t?o.default.createElement(u.default,{label:gettext("Poll"),helpText:gettext("Please select the poll for your newly merged thread. Rejected polls will be permanently deleted and cannot be recovered."),for:"id_poll"},o.default.createElement("select",{className:"form-control",id:"id_poll",onChange:r,value:n},t.map(function(e){return o.default.createElement("option",{value:e[0],key:e[0]},e[1])}))):null}r.default=h},{"../services/ajax":365,"../services/modal":371,"./button":8,"./form":56,"./form-group":55,react:"react"}],60:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../services/one-box"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"componentDidMount",value:function(){l.default.render(this.documentNode),$(this.documentNode).find(".spoiler-reveal").click(d)}},{key:"componentDidUpdate",value:function(){l.default.render(this.documentNode),$(this.documentNode).find(".spoiler-reveal").click(d)}},{key:"shouldComponentUpdate",value:function(e){return e.markup!==this.props.markup}},{key:"render",value:function(){var t=this;return o.default.createElement("article",{className:"misago-markup",dangerouslySetInnerHTML:{__html:this.props.markup},ref:function(e){t.documentNode=e}})}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function d(e){var t=e.target;$(t).parent().parent().addClass("revealed")}r.default=f},{"../services/one-box":372,react:"react"}],61:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./loader"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"modal-body modal-loader"},o.default.createElement(l.default,null))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./loader":58,react:"react"}],62:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./panel-message"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,l.default);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getHelpText",value:function(){return this.props.helpText?o.default.createElement("p",{className:"help-block"},this.props.helpText):null}},{key:"render",value:function(){return o.default.createElement("div",{className:"modal-body"},o.default.createElement("div",{className:"message-icon"},o.default.createElement("span",{className:"material-icon"},this.props.icon||"info_outline")),o.default.createElement("div",{className:"message-body"},o.default.createElement("p",{className:"lead"},this.props.message),this.getHelpText(),o.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok"))))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./panel-message":94,react:"react"}],63:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.filter(function(e){return 0<e.results.count}).map(function(e){return Object.assign({},e,{count:e.results.count,results:e.results.results.slice(0,n)})})};var n=5},{}],64:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.RESULT=r.HEADER=r.FOOTER=void 0;r.HEADER="HEADER";r.RESULT="RESULT";r.FOOTER="FOOTER"},{}],65:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.children,r=e.onChange,n=e.query;return a.default.createElement("ul",{className:"dropdown-menu dropdown-search-results",role:"menu"},a.default.createElement("li",{className:"form-group"},a.default.createElement(o.default,{value:n,onChange:r})),t)};var a=n(e("react")),o=n(e("./input"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./input":69,react:"react"}],66:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(){return a.default.createElement("li",{className:"dropdown-search-message"},gettext("Search returned no results."))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],67:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=[];return function(e,t){for(var r=e.length,n=0;n<r;n++){var a=e[n];t.push({provider:a,type:o.HEADER}),function(e,t){for(var r=e.results.length,n=0;n<r;n++){var a=e.results[n];t.push({provider:e,result:a,type:o.RESULT})}t.push({provider:e,type:o.FOOTER})}(a,t)}}(e,t),t};var o=e("./constants")},{"./constants":64}],68:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.isLoading,r=e.onChange,n=e.results,a=e.query;if(!a.trim().length)return l.default.createElement(u.default,{onChange:r,query:a});{if(n.length){var o=(0,d.default)(n);return l.default.createElement(u.default,{onChange:r,query:a},o.map(function(e){var t=e.type,r=e.provider,n=e.result;return t===i.RESULT?l.default.createElement(f.default,p({key:[r.id,t,n.id].join("_")},e)):l.default.createElement(f.default,p({key:[r.id,t].join("_"),query:a},e))}))}if(t)return l.default.createElement(u.default,{onChange:r,query:a},l.default.createElement(c.default,null))}return l.default.createElement(u.default,{onChange:r,query:a},l.default.createElement(s.default,null))};var l=n(e("react")),i=e("./constants"),u=n(e("./dropdown-menu")),s=n(e("./empty")),c=n(e("./loader")),f=n(e("./result")),d=n(e("./flatten-results"));function n(e){return e&&e.__esModule?e:{default:e}}function p(){return(p=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}},{"./constants":64,"./dropdown-menu":65,"./empty":66,"./flatten-results":67,"./loader":70,"./result":73,react:"react"}],69:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.value,r=e.onChange;return a.default.createElement("input",{"aria-haspopup":"true","aria-expanded":"false","aria-controls":"dropdown-menu dropdown-search-results",autoComplete:"off",className:"form-control",value:t,onChange:r,placeholder:gettext("Search"),role:"combobox",type:"text"})};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],70:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){e.message;return n.default.createElement("li",{className:"dropdown-search-loader"},n.default.createElement(a.default,null))};var n=o(e("react")),a=o(e("../../loader"));function o(e){return e&&e.__esModule?e:{default:e}}},{"../../loader":58,react:"react"}],71:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.provider,r=e.query,n=t.url+"?q="+encodeURI(r),a=ngettext('See full "%(provider)s" results page with %(count)s result.','See full "%(provider)s" results page with %(count)s results.',t.count);return o.default.createElement("li",{className:"dropdown-search-footer"},o.default.createElement("a",{href:n},interpolate(a,{count:t.count,provider:t.name},!0)))};var n,o=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],72:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.provider;return a.default.createElement("li",{className:"dropdown-search-header"},t.name)};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],73:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.provider,r=e.result,n=e.type,a=e.query;{if(n===l.HEADER)return o.default.createElement(u.default,{provider:t});if(n===l.FOOTER)return o.default.createElement(i.default,{provider:t,query:a})}return o.default.createElement(s.default,{provider:t,result:r})};var o=n(e("react")),l=e("../constants"),i=n(e("./footer")),u=n(e("./header")),s=n(e("./result"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../constants":64,"./footer":71,"./header":72,"./result":74,react:"react"}],74:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.provider,r=e.result;return"threads"!==t.id?n.default.createElement(o.default,{result:r}):n.default.createElement(a.default,{result:r})};var n=l(e("react")),a=l(e("./thread")),o=l(e("./user"));function l(e){return e&&e.__esModule?e:{default:e}}},{"./thread":75,"./user":76,react:"react"}],75:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.result,r=(t.poster,t.thread),n=gettext("Posted by %(poster)s on %(posted_on)s in %(category)s.");return o.default.createElement("li",null,o.default.createElement("a",{href:t.url.index,className:"dropdown-search-thread"},o.default.createElement("h5",null,r.title),o.default.createElement("small",{className:"dropdown-search-post-content"},$(t.content).text()),o.default.createElement("small",{className:"dropdown-search-post-footer"},interpolate(n,{category:t.category.name,posted_on:(0,a.default)(t.posted_on).format("LL"),poster:t.poster_name},!0))))};var a=n(e("moment")),o=n(e("react"));function n(e){return e&&e.__esModule?e:{default:e}}},{moment:"moment",react:"react"}],76:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.result,r=t.rank,n=gettext("%(title)s, joined on %(joined_on)s"),a=t.title||r.title||r.name;return l.default.createElement("li",null,l.default.createElement("a",{href:t.url,className:"dropdown-search-user"},l.default.createElement("div",{className:"media"},l.default.createElement("div",{className:"media-left"},l.default.createElement(i.default,{size:38,user:t})),l.default.createElement("div",{className:"media-body"},l.default.createElement("h5",{className:"media-heading"},t.username),l.default.createElement("small",null,interpolate(n,{title:a,joined_on:(0,o.default)(t.joined_on).format("LL")},!0))))))};var o=n(e("moment")),l=n(e("react")),i=n(e("../../../avatar"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../../../avatar":6,moment:"moment",react:"react"}],77:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),l=o(e("../../services/ajax")),i=o(e("../../services/snackbar")),u=o(e("../..")),s=o(e("./clean-results")),c=o(e("./dropdown"));function o(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(o,n.default.Component);var e,t,r,a=p(o);function o(){var n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o),b(m(n=a.call(this)),"onToggle",function(e){n.setState(function(e,t){return e.isOpen||window.setTimeout(function(){n.container.querySelector("input").focus()},100),{isOpen:!e.isOpen}})}),b(m(n),"onDocumentMouseDown",function(e){for(var t=!0,r=e.target;null!==r&&r!==document;){if(r===n.container)return void(t=!1);r=r.parentNode}t&&n.setState({isOpen:!1})}),b(m(n),"onEscape",function(e){"Escape"===e.key&&n.setState({isOpen:!1})}),b(m(n),"onChange",function(e){var t=e.target.value;n.setState({query:t}),n.loadResults(t.trim())}),n.state={isLoading:!1,isOpen:!1,query:"",results:[]},n.intervalId=null,n}return e=o,(t=[{key:"componentDidMount",value:function(){document.addEventListener("mousedown",this.onDocumentMouseDown),document.addEventListener("keydown",this.onEscape)}},{key:"componentWillUnmount",value:function(){document.removeEventListener("mousedown",this.onDocumentMouseDown),document.removeEventListener("keydown",this.onEscape)}},{key:"loadResults",value:function(e){var t,r=this;e.length&&(t=300+300*Math.random(),this.intervalId&&window.clearTimeout(this.intervalId),this.setState({isLoading:!0}),this.intervalId=window.setTimeout(function(){l.default.get(u.default.get("SEARCH_API"),{q:e}).then(function(e){r.setState({intervalId:null,isLoading:!1,results:(0,s.default)(e)})},function(e){i.default.apiError(e),r.setState({intervalId:null,isLoading:!1,results:[]})})},t))}},{key:"render",value:function(){var t=this,e="navbar-search dropdown";return this.state.isOpen&&(e+=" open"),n.default.createElement("div",{className:e,ref:function(e){return t.container=e}},n.default.createElement("a",{"aria-haspopup":"true","aria-expanded":"false",className:"navbar-icon","data-toggle":"dropdown",href:u.default.get("SEARCH_URL"),onClick:this.onToggle},n.default.createElement("i",{className:"material-icon"},"search")),n.default.createElement(c.default,{isLoading:this.state.isLoading,onChange:this.onChange,results:this.state.results,query:this.state.query}))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=h},{"../..":302,"../../services/ajax":365,"../../services/snackbar":376,"./clean-results":63,"./dropdown":68,react:"react"}],78:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(){return n.default.createElement("div",{className:"panel panel-default panel-form"},n.default.createElement("div",{className:"panel-heading"},n.default.createElement("h3",{className:"panel-title"},gettext("Change username"))),n.default.createElement(a.default,null))};var n=o(e("react")),a=o(e("../../panel-loader"));function o(e){return e&&e.__esModule?e:{default:e}}},{"../../panel-loader":93,react:"react"}],79:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../panel-message"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getHelpText",value:function(){return this.props.options.next_on?interpolate(gettext("You will be able to change your username %(next_change)s."),{next_change:this.props.options.next_on.fromNow()},!0):gettext("You have used up available name changes.")}},{key:"render",value:function(){return o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Change username"))),o.default.createElement(l.default,{helpText:this.getHelpText(),message:gettext("You can't change your username at the moment.")}))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"../../panel-message":94,react:"react"}],80:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../button")),u=n(e("../../form")),s=n(e("../../form-group")),c=n(e("../../../services/ajax")),f=n(e("../../../services/snackbar")),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=p(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/validators"));function p(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(p=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function m(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(a,u.default);var e,t,r,n=b(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={username:"",validators:{username:[d.usernameContent(),d.usernameMinLength(e.options.length_min),d.usernameMaxLength(e.options.length_max)]},isLoading:!1},t}return e=a,(t=[{key:"getHelpText",value:function(){var e,t,r=[];return 0<this.props.options.changes_left&&(e=ngettext("You can change your username %(changes_left)s more time.","You can change your username %(changes_left)s more times.",this.props.options.changes_left),r.push(interpolate(e,{changes_left:this.props.options.changes_left},!0))),0<this.props.user.acl.name_changes_expire&&(t=ngettext("Used changes become available again after %(name_changes_expire)s day.","Used changes become available again after %(name_changes_expire)s days.",this.props.user.acl.name_changes_expire),r.push(interpolate(t,{name_changes_expire:this.props.user.acl.name_changes_expire},!0))),r.length?r.join(" "):null}},{key:"clean",value:function(){var e=this.validate();return e.username?(f.default.error(e.username[0]),!1):this.state.username.trim()!==this.props.user.username||(f.default.info(gettext("Your new username is same as current one.")),!1)}},{key:"send",value:function(){return c.default.post(this.props.user.api.username,{username:this.state.username})}},{key:"handleSuccess",value:function(e){this.setState({username:""}),this.props.complete(e.username,e.slug,e.options)}},{key:"handleError",value:function(e){f.default.apiError(e)}},{key:"render",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Change username"))),o.default.createElement("div",{className:"panel-body"},o.default.createElement(s.default,{label:gettext("New username"),for:"id_username",helpText:this.getHelpText()},o.default.createElement("input",{type:"text",id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username}))),o.default.createElement("div",{className:"panel-footer"},o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Change username")))))}}])&&m(e.prototype,t),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h},{"../../../services/ajax":365,"../../../services/snackbar":376,"../../../utils/validators":393,"../../button":8,"../../form":56,"../../form-group":55,react:"react"}],81:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("moment")),i=o(e("react")),u=o(e("./form-loading")),s=o(e("./form-locked")),c=o(e("./form")),f=o(e("../../username-history/root")),d=o(e("../../..")),p=e("../../../reducers/username-history"),m=e("../../../reducers/users"),y=o(e("../../../services/ajax")),b=o(e("../../../services/page-title")),h=o(e("../../../services/snackbar")),v=o(e("../../../services/store"));function o(e){return e&&e.__esModule?e:{default:e}}function g(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var O=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}(l,i.default.Component);var e,t,r,o=E(l);function l(e){var n,t,r,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),n=o.call(this,e),t=w(n),a=function(e,t,r){n.setState({options:r}),v.default.dispatch((0,p.addNameChange)({username:e,slug:t},n.props.user,n.props.user)),v.default.dispatch((0,m.updateUsername)(n.props.user,e,t)),h.default.success(gettext("Your username has been changed successfully."))},(r="onComplete")in t?Object.defineProperty(t,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[r]=a,n.state={isLoaded:!1,options:null},n}return e=l,(t=[{key:"componentDidMount",value:function(){var t=this;b.default.set({title:gettext("Change username"),parent:gettext("Change your options")}),Promise.all([y.default.get(this.props.user.api.username),y.default.get(d.default.get("USERNAME_CHANGES_API"),{user:this.props.user.id})]).then(function(e){v.default.dispatch((0,p.hydrate)(e[1].results)),t.setState({isLoaded:!0,options:{changes_left:e[0].changes_left,length_min:e[0].length_min,length_max:e[0].length_max,next_on:e[0].next_on?(0,n.default)(e[0].next_on):null}})})}},{key:"getChangeForm",value:function(){return this.state.isLoaded?0===this.state.options.changes_left?i.default.createElement(s.default,{options:this.state.options}):i.default.createElement(c.default,{complete:this.onComplete,options:this.state.options,user:this.props.user}):i.default.createElement(u.default,null)}},{key:"render",value:function(){return i.default.createElement("div",null,this.getChangeForm(),i.default.createElement(f.default,{changes:this.props["username-history"],isLoaded:this.state.isLoaded}))}}])&&g(e.prototype,t),r&&g(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=O},{"../../..":302,"../../../reducers/username-history":363,"../../../reducers/users":364,"../../../services/ajax":365,"../../../services/page-title":373,"../../../services/snackbar":376,"../../../services/store":377,"../../username-history/root":280,"./form":80,"./form-loading":78,"./form-locked":79,moment:"moment",react:"react"}],82:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../button")),i=n(e("../../services/ajax")),u=n(e("../../services/page-title")),s=n(e("../../services/snackbar")),c=(n(e("../../services/store")),n(e("../..")));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,o.default.Component);var e,t,r,n=p(a);function a(e){var o;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),b(m(o=n.call(this,e)),"onPasswordChange",function(e){o.setState({password:e.target.value})}),b(m(o),"handleSubmit",function(e){e.preventDefault();var t=o.state,r=t.isLoading,n=t.password,a=o.props.user;return 0==n.length?(s.default.error(gettext("Enter your password to confirm account deletion.")),!1):!r&&(o.setState({isLoading:!0}),void i.default.post(a.api.delete,{password:n}).then(function(e){window.location.href=c.default.get("MISAGO_PATH")},function(e){o.setState({isLoading:!1}),e.password?s.default.error(e.password[0]):s.default.apiError(e)}))}),o.state={isLoading:!1,password:""},o}return e=a,(t=[{key:"componentDidMount",value:function(){u.default.set({title:gettext("Delete account"),parent:gettext("Change your options")})}},{key:"render",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"panel panel-danger panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Delete account"))),o.default.createElement("div",{className:"panel-body"},o.default.createElement("p",{className:"lead"},gettext("You are going to delete your account. This action is nonreversible, and will result in following data being deleted:")),o.default.createElement("p",null,"-"," ",gettext("Stored IP addresses associated with content that you have posted will be deleted.")),o.default.createElement("p",null,"-"," ",gettext("Your username will become available for other user to rename to or for new user to register their account with.")),o.default.createElement("p",null,"-"," ",gettext("Your e-mail will become available for use in new account registration.")),o.default.createElement("hr",null),o.default.createElement("p",null,gettext("All your posted content will NOT be deleted, but username associated with it will be changed to one shared by all deleted accounts."))),o.default.createElement("div",{className:"panel-footer"},o.default.createElement("div",{className:"input-group"},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,name:"password-confirmation",type:"password",placeholder:gettext("Enter your password to confirm account deletion."),value:this.state.password,onChange:this.onPasswordChange}),o.default.createElement("span",{className:"input-group-btn"},o.default.createElement(l.default,{className:"btn-danger",loading:this.state.isLoading},gettext("Delete my account")))))))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h},{"../..":302,"../../services/ajax":365,"../../services/page-title":373,"../../services/snackbar":376,"../../services/store":377,"../button":8,react:"react"}],83:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("moment")),i=n(e("../button")),u=n(e("../../services/ajax")),s=n(e("../../services/page-title")),c=n(e("../../services/snackbar"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,o.default.Component);var e,t,r,n=p(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),b(m(t=n.call(this,e)),"handleLoadDownloads",function(){u.default.get(t.props.user.api.data_downloads).then(function(e){t.setState({isLoading:!1,downloads:e})},function(e){c.default.apiError(e)})}),b(m(t),"handleRequestDataDownload",function(){t.setState({isSubmiting:!0}),u.default.post(t.props.user.api.request_data_download).then(function(){t.handleLoadDownloads(),c.default.success(gettext("Your request for data download has been registered.")),t.setState({isSubmiting:!1})},function(e){console.log(e),c.default.apiError(e),t.setState({isSubmiting:!1})})}),t.state={isLoading:!1,isSubmiting:!1,downloads:[]},t}return e=a,(t=[{key:"componentDidMount",value:function(){s.default.set({title:gettext("Download your data"),parent:gettext("Change your options")}),this.handleLoadDownloads()}},{key:"render",value:function(){return o.default.createElement("div",null,o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Download your data"))),o.default.createElement("div",{className:"panel-body"},o.default.createElement("p",null,gettext('To download your data from the site, click the "Request data download" button. Depending on amount of data to be archived and number of users wanting to download their data at same time it may take up to few days for your download to be prepared. An e-mail with notification will be sent to you when your data is ready to be downloaded.')),o.default.createElement("p",null,gettext("The download will only be available for limited amount of time, after which it will be deleted from the site and marked as expired."))),o.default.createElement("table",{className:"table"},o.default.createElement("thead",null,o.default.createElement("tr",null,o.default.createElement("th",null,gettext("Requested on")),o.default.createElement("th",{className:"col-md-4"},gettext("Download")))),o.default.createElement("tbody",null,this.state.downloads.map(function(e){return o.default.createElement("tr",{key:e.id},o.default.createElement("td",{style:v},(0,l.default)(e.requested_on).fromNow()),o.default.createElement("td",null,o.default.createElement(g,{exportFile:e.file,status:e.status})))}),0==this.state.downloads.length?o.default.createElement("tr",null,o.default.createElement("td",{colSpan:"2"},gettext("You have no data downloads."))):null)),o.default.createElement("div",{className:"panel-footer text-right"},o.default.createElement(i.default,{className:"btn-primary",loading:this.state.isSubmiting,type:"button",onClick:this.handleRequestDataDownload},gettext("Request data download")))))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h;var v={verticalAlign:"middle"},g=function(e){var t=e.exportFile,r=e.status;return 0===r||1===r?o.default.createElement(i.default,{className:"btn-info btn-sm btn-block",disabled:!0,type:"button"},gettext("Download is being prepared")):t?o.default.createElement("a",{className:"btn btn-success btn-sm btn-block",href:t},gettext("Download your data")):o.default.createElement(i.default,{className:"btn-default btn-sm btn-block",disabled:!0,type:"button"},gettext("Download is expired"))}},{"../../services/ajax":365,"../../services/page-title":373,"../../services/snackbar":376,"../button":8,moment:"moment",react:"react"}],84:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=i(e("react")),o=i(e("../edit-details")),l=i(e("../../services/page-title")),s=i(e("../../services/snackbar"));function i(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=u(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return p(e)}(this,n?(e=u(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function u(e){return(u=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var m=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(u,n.default.Component);var e,t,r,i=d(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=p(e),n=function(){s.default.info(gettext("Your details have been updated."))},(r="onSuccess")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"componentDidMount",value:function(){l.default.set({title:gettext("Edit details"),parent:gettext("Change your options")})}},{key:"render",value:function(){return n.default.createElement(o.default,{api:this.props.user.api.edit_details,onSuccess:this.onSuccess})}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=m},{"../../services/page-title":373,"../../services/snackbar":376,"../edit-details":32,react:"react"}],85:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../button")),i=n(e("../form")),u=n(e("../form-group")),s=n(e("../select")),c=n(e("../yes-no-switch")),f=e("../../reducers/auth"),d=n(e("../../services/ajax")),p=n(e("../../services/page-title")),m=n(e("../../services/snackbar")),y=n(e("../../services/store"));function n(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(a,i.default);var e,t,r,n=v(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={isLoading:!1,is_hiding_presence:e.user.is_hiding_presence,limits_private_thread_invites_to:e.user.limits_private_thread_invites_to,subscribe_to_started_threads:e.user.subscribe_to_started_threads,subscribe_to_replied_threads:e.user.subscribe_to_replied_threads,errors:{}},t.privateThreadInvitesChoices=[{value:0,icon:"help_outline",label:gettext("Everybody")},{value:1,icon:"done_all",label:gettext("Users I follow")},{value:2,icon:"highlight_off",label:gettext("Nobody")}],t.subscribeToChoices=[{value:0,icon:"star_border",label:gettext("No")},{value:1,icon:"star_half",label:gettext("Notify")},{value:2,icon:"star",label:gettext("Notify with e-mail")}],t}return e=a,(t=[{key:"send",value:function(){return d.default.post(this.props.user.api.options,{is_hiding_presence:this.state.is_hiding_presence,limits_private_thread_invites_to:this.state.limits_private_thread_invites_to,subscribe_to_started_threads:this.state.subscribe_to_started_threads,subscribe_to_replied_threads:this.state.subscribe_to_replied_threads})}},{key:"handleSuccess",value:function(){y.default.dispatch((0,f.patch)({is_hiding_presence:this.state.is_hiding_presence,limits_private_thread_invites_to:this.state.limits_private_thread_invites_to,subscribe_to_started_threads:this.state.subscribe_to_started_threads,subscribe_to_replied_threads:this.state.subscribe_to_replied_threads})),m.default.success(gettext("Your forum options have been changed."))}},{key:"handleError",value:function(e){400===e.status?m.default.error(gettext("Please reload page and try again.")):m.default.apiError(e)}},{key:"componentDidMount",value:function(){p.default.set({title:gettext("Forum options"),parent:gettext("Change your options")})}},{key:"render",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Change forum options"))),o.default.createElement("div",{className:"panel-body"},o.default.createElement("fieldset",null,o.default.createElement("legend",null,gettext("Privacy settings")),o.default.createElement(u.default,{label:gettext("Hide my presence"),helpText:gettext("If you hide your presence, only members with permission to see hidden users will see when you are online."),for:"id_is_hiding_presence"},o.default.createElement(c.default,{id:"id_is_hiding_presence",disabled:this.state.isLoading,iconOn:"visibility_off",iconOff:"visibility",labelOn:gettext("Hide my presence from other users"),labelOff:gettext("Show my presence to other users"),onChange:this.bindInput("is_hiding_presence"),value:this.state.is_hiding_presence})),o.default.createElement(u.default,{label:gettext("Private thread invitations"),for:"id_limits_private_thread_invites_to"},o.default.createElement(s.default,{id:"id_limits_private_thread_invites_to",disabled:this.state.isLoading,onChange:this.bindInput("limits_private_thread_invites_to"),value:this.state.limits_private_thread_invites_to,choices:this.privateThreadInvitesChoices}))),o.default.createElement("fieldset",null,o.default.createElement("legend",null,gettext("Automatic subscriptions")),o.default.createElement(u.default,{label:gettext("Threads I start"),for:"id_subscribe_to_started_threads"},o.default.createElement(s.default,{id:"id_subscribe_to_started_threads",disabled:this.state.isLoading,onChange:this.bindInput("subscribe_to_started_threads"),value:this.state.subscribe_to_started_threads,choices:this.subscribeToChoices})),o.default.createElement(u.default,{label:gettext("Threads I reply to"),for:"id_subscribe_to_replied_threads"},o.default.createElement(s.default,{id:"id_subscribe_to_replied_threads",disabled:this.state.isLoading,onChange:this.bindInput("subscribe_to_replied_threads"),value:this.state.subscribe_to_replied_threads,choices:this.subscribeToChoices})))),o.default.createElement("div",{className:"panel-footer"},o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Save changes")))))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=_},{"../../reducers/auth":350,"../../services/ajax":365,"../../services/page-title":373,"../../services/snackbar":376,"../../services/store":377,"../button":8,"../form":56,"../form-group":55,"../select":210,"../yes-no-switch":300,react:"react"}],86:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.CompactNav=function(t){return n.default.createElement("ul",{className:t.className||"dropdown-menu stick-to-bottom",role:"menu"},t.options.map(function(e){return n.default.createElement(o.default,{path:t.baseUrl+e.component+"/",key:e.component},n.default.createElement(a.Link,{to:t.baseUrl+e.component+"/",onClick:t.hideNav},n.default.createElement("span",{className:"material-icon hidden-sm"},e.icon),e.name))}))},r.SideNav=function(t){return n.default.createElement("div",{className:"list-group nav-side"},t.options.map(function(e){return n.default.createElement(a.Link,{to:t.baseUrl+e.component+"/",className:"list-group-item",activeClassName:"active",key:e.component},n.default.createElement("span",{className:"material-icon"},e.icon),e.name)}))};var n=l(e("react")),a=e("react-router"),o=l(e("../li"));l(e("../.."));function l(e){return e&&e.__esModule?e:{default:e}}},{"../..":302,"../li":57,react:"react","react-router":"react-router"}],87:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.paths=function(){var e=m.default.get("SETTINGS").enable_sso,t=[{path:m.default.get("USERCP_URL")+"forum-options/",component:(0,n.connect)(E)(c.default)},{path:m.default.get("USERCP_URL")+"edit-details/",component:(0,n.connect)(E)(u.default)}];e||(t.push({path:m.default.get("USERCP_URL")+"change-username/",component:(0,n.connect)(E)(f.default)}),t.push({path:m.default.get("USERCP_URL")+"sign-in-credentials/",component:(0,n.connect)(E)(d.default)}));m.default.get("ENABLE_DOWNLOAD_OWN_DATA")&&t.push({path:m.default.get("USERCP_URL")+"download-data/",component:(0,n.connect)(E)(s.default)});!e&&m.default.get("ENABLE_DELETE_OWN_ACCOUNT")&&t.push({path:m.default.get("USERCP_URL")+"delete-account/",component:(0,n.connect)(E)(i.default)});return t},r.select=E;var o=y(e("react")),n=e("react-redux"),l=(y(e("../dropdown-toggle")),e("./navs")),i=y(e("./delete-account")),u=y(e("./edit-details")),s=y(e("./download-data")),c=y(e("./forum-options")),f=y(e("./change-username/root")),d=y(e("./sign-in-credentials/root")),p=y(e("../with-dropdown")),m=y(e("../.."));function y(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(a,p.default);var e,t,r,n=v(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"page page-options"},o.default.createElement("div",{className:"page-header-bg"},o.default.createElement("div",{className:"page-header"},o.default.createElement("div",{className:"container"},o.default.createElement("h1",null,gettext("Change your options"))),o.default.createElement("div",{className:"page-tabs visible-xs-block visible-sm-block"},o.default.createElement("div",{className:"container"},o.default.createElement(l.CompactNav,{className:"nav nav-pills",baseUrl:m.default.get("USERCP_URL"),options:m.default.get("USER_OPTIONS")}))))),o.default.createElement("div",{className:"container"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-md-3 hidden-xs hidden-sm"},o.default.createElement(l.SideNav,{baseUrl:m.default.get("USERCP_URL"),options:m.default.get("USER_OPTIONS")})),o.default.createElement("div",{className:"col-md-9"},this.props.children))))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function E(e){return{tick:e.tick.tick,user:e.auth.user,"username-history":e["username-history"]}}r.default=_},{"../..":302,"../dropdown-toggle":27,"../with-dropdown":299,"./change-username/root":81,"./delete-account":82,"./download-data":83,"./edit-details":84,"./forum-options":85,"./navs":86,"./sign-in-credentials/root":91,react:"react","react-redux":"react-redux"}],88:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),a=o(e("../../.."));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return n.default.createElement("div",{className:"panel panel-default panel-form"},n.default.createElement("div",{className:"panel-heading"},n.default.createElement("h3",{className:"panel-title"},gettext("Change email or password"))),n.default.createElement("div",{className:"panel-body panel-message-body"},n.default.createElement("div",{className:"message-icon"},n.default.createElement("span",{className:"material-icon"},"info_outline")),n.default.createElement("div",{className:"message-body"},n.default.createElement("p",{className:"lead"},gettext("You need to set a password for your account to be able to change your username or email.")),n.default.createElement("p",{className:"help-block"},n.default.createElement("a",{className:"btn btn-primary",href:a.default.get("FORGOTTEN_PASSWORD_URL")},gettext("Set password"))))))}r.default=l},{"../../..":302,react:"react"}],89:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../button")),u=n(e("../../form")),s=n(e("../../form-group")),c=n(e("../../../services/ajax")),f=n(e("../../../services/snackbar")),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=p(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/validators"));function p(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(p=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function m(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(a,u.default);var e,t,r,n=b(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={new_email:"",password:"",validators:{new_email:[d.email()],password:[]},isLoading:!1},t}return e=a,(t=[{key:"clean",value:function(){var e=this.validate();return-1!==[this.state.new_email.trim().length,this.state.password.trim().length].indexOf(0)?(f.default.error(gettext("Fill out all fields.")),!1):!e.new_email||(f.default.error(e.new_email[0]),!1)}},{key:"send",value:function(){return c.default.post(this.props.user.api.change_email,{new_email:this.state.new_email,password:this.state.password})}},{key:"handleSuccess",value:function(e){this.setState({new_email:"",password:""}),f.default.success(e.detail)}},{key:"handleError",value:function(e){400===e.status?e.new_email?f.default.error(e.new_email):f.default.error(e.password):f.default.apiError(e)}},{key:"render",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("input",{type:"type",style:{display:"none"}}),o.default.createElement("input",{type:"password",style:{display:"none"}}),o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Change e-mail address"))),o.default.createElement("div",{className:"panel-body"},o.default.createElement(s.default,{label:gettext("New e-mail"),for:"id_new_email"},o.default.createElement("input",{type:"text",id:"id_new_email",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("new_email"),value:this.state.new_email})),o.default.createElement("hr",null),o.default.createElement(s.default,{label:gettext("Your current password"),for:"id_confirm_email"},o.default.createElement("input",{type:"password",id:"id_confirm_email",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),o.default.createElement("div",{className:"panel-footer"},o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Change e-mail")))))}}])&&m(e.prototype,t),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h},{"../../../services/ajax":365,"../../../services/snackbar":376,"../../../utils/validators":393,"../../button":8,"../../form":56,"../../form-group":55,react:"react"}],90:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../button")),i=n(e("../../form")),u=n(e("../../form-group")),s=n(e("../../../services/ajax")),c=n(e("../../../services/snackbar"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=m(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=m(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var y=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,i.default);var e,t,r,n=p(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={new_password:"",repeat_password:"",password:"",validators:{new_password:[],repeat_password:[],password:[]},isLoading:!1},t}return e=a,(t=[{key:"clean",value:function(){var e=this.validate();return-1!==[this.state.new_password.trim().length,this.state.repeat_password.trim().length,this.state.password.trim().length].indexOf(0)?(c.default.error(gettext("Fill out all fields.")),!1):e.new_password?(c.default.error(e.new_password[0]),!1):this.state.new_password===this.state.repeat_password||(c.default.error(gettext("New passwords are different.")),!1)}},{key:"send",value:function(){return s.default.post(this.props.user.api.change_password,{new_password:this.state.new_password,password:this.state.password})}},{key:"handleSuccess",value:function(e){this.setState({new_password:"",repeat_password:"",password:""}),c.default.success(e.detail)}},{key:"handleError",value:function(e){400===e.status?e.new_password?c.default.error(e.new_password):c.default.error(e.password):c.default.apiError(e)}},{key:"render",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("input",{type:"type",style:{display:"none"}}),o.default.createElement("input",{type:"password",style:{display:"none"}}),o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Change password"))),o.default.createElement("div",{className:"panel-body"},o.default.createElement(u.default,{label:gettext("New password"),for:"id_new_password"},o.default.createElement("input",{type:"password",id:"id_new_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("new_password"),value:this.state.new_password})),o.default.createElement(u.default,{label:gettext("Repeat password"),for:"id_repeat_password"},o.default.createElement("input",{type:"password",id:"id_repeat_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("repeat_password"),value:this.state.repeat_password})),o.default.createElement("hr",null),o.default.createElement(u.default,{label:gettext("Your current password"),for:"id_confirm_password"},o.default.createElement("input",{type:"password",id:"id_confirm_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),o.default.createElement("div",{className:"panel-footer"},o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Change password")))))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=y},{"../../../services/ajax":365,"../../../services/snackbar":376,"../../button":8,"../../form":56,"../../form-group":55,react:"react"}],91:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./change-email")),i=n(e("./change-password")),u=n(e("../../..")),s=n(e("../../../services/page-title")),c=n(e("./UnusablePasswordMessage"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=m(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=m(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var y=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,o.default.Component);var e,t,r,n=p(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"componentDidMount",value:function(){s.default.set({title:gettext("Change email or password"),parent:gettext("Change your options")})}},{key:"render",value:function(){return this.props.user.has_usable_password?o.default.createElement("div",null,o.default.createElement(l.default,{user:this.props.user}),o.default.createElement(i.default,{user:this.props.user}),o.default.createElement("p",{className:"message-line"},o.default.createElement("span",{className:"material-icon"},"warning"),o.default.createElement("a",{href:u.default.get("FORGOTTEN_PASSWORD_URL")},gettext("Change forgotten password")))):o.default.createElement(c.default,null)}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=y},{"../../..":302,"../../../services/page-title":373,"./UnusablePasswordMessage":88,"./change-email":89,"./change-password":90,react:"react"}],92:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../utils/string-count"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getClassName",value:function(){return this.props.copy&&this.props.copy.length&&1===(0,l.default)(this.props.copy,"<p")&&-1===this.props.copy.indexOf("<br")?"page-lead lead":"page-lead"}},{key:"render",value:function(){return this.props.copy&&this.props.copy.length?o.default.createElement("div",{className:this.getClassName(),dangerouslySetInnerHTML:{__html:this.props.copy}}):null}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"../utils/string-count":392,react:"react"}],93:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./loader"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"panel-body panel-body-loading"},o.default.createElement(l.default,{className:"loader loader-spaced"}))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./loader":58,react:"react"}],94:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getHelpText",value:function(){return this.props.helpText?o.default.createElement("p",{className:"help-block"},this.props.helpText):null}},{key:"render",value:function(){return o.default.createElement("div",{className:"panel-body panel-message-body"},o.default.createElement("div",{className:"message-icon"},o.default.createElement("span",{className:"material-icon"},this.props.icon||"info_outline")),o.default.createElement("div",{className:"message-body"},o.default.createElement("p",{className:"lead"},this.props.message),this.getHelpText()))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],95:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var s=n(e("react")),c=n(e("../add-participant")),f=n(e("../../services/modal"));function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function l(e,t){return(l=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return p(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&l(e,t)}(u,s.default.Component);var e,t,r,i=d(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=p(e),n=function(){f.default.show(s.default.createElement(c.default,{thread:e.props.thread}))},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return this.props.thread.acl.can_add_participants?s.default.createElement("div",{className:"col-xs-12 col-sm-3"},s.default.createElement("button",{className:"btn btn-default btn-block",onClick:this.onClick,type:"button"},s.default.createElement("span",{className:"material-icon"},"person_add"),gettext("Add participant"))):null}}])&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../../services/modal":371,"../add-participant":4,react:"react"}],96:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.changeOwner=function(e,r){l.default.patch(e.api.index,[{op:"replace",path:"owner",value:r.id},{op:"add",path:"acl",value:1}]).then(function(e){s.default.dispatch((0,a.updateAcl)(e)),s.default.dispatch(n.replace(e.participants));var t=gettext("%(user)s has been made new thread owner.");u.default.success(interpolate(t,{user:r.username},!0))},function(e){u.default.apiError(e)})},r.leave=function(e,t){l.default.patch(e.api.index,[{op:"remove",path:"participants",value:t.id}]).then(function(){u.default.success(gettext("You have left this thread.")),window.setTimeout(function(){window.location=o.default.get("PRIVATE_THREADS_URL")},3e3)},function(e){u.default.apiError(e)})},r.remove=function(e,r){l.default.patch(e.api.index,[{op:"remove",path:"participants",value:r.id},{op:"add",path:"acl",value:1}]).then(function(e){s.default.dispatch((0,a.updateAcl)(e)),s.default.dispatch(n.replace(e.participants));var t=gettext("%(user)s has been removed from this thread.");u.default.success(interpolate(t,{user:r.username},!0))},function(e){u.default.apiError(e)})};var n=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=f(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/participants")),a=e("../../../reducers/thread"),o=c(e("../../..")),l=c(e("../../../services/ajax")),u=c(e("../../../services/snackbar")),s=c(e("../../../services/store"));function c(e){return e&&e.__esModule?e:{default:e}}function f(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(f=function(e){return e?r:t})(e)}},{"../../..":302,"../../../reducers/participants":351,"../../../reducers/thread":360,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377}],97:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.UserStatus=u,r.default=function(e){var t=e.participant,r="btn btn-default";t.is_owner&&(r="btn btn-primary");return r+=" btn-user btn-block",n.default.createElement("div",{className:"col-xs-12 col-sm-3 col-md-2 participant-card"},n.default.createElement("div",{className:"dropdown"},n.default.createElement("button",{"aria-haspopup":"true","aria-expanded":"false",className:r,"data-toggle":"dropdown",type:"button"},n.default.createElement(l.default,{size:"34",user:t}),n.default.createElement("span",{className:"btn-text"},t.username)),n.default.createElement("ul",{className:"dropdown-menu stick-to-bottom"},n.default.createElement(u,{isOwner:t.is_owner}),n.default.createElement("li",{className:"dropdown-header"}),n.default.createElement("li",null,n.default.createElement("a",{href:t.url},gettext("See profile"))),n.default.createElement("li",{role:"separator",className:"divider"}),n.default.createElement(a.default,e),n.default.createElement(o.default,e))))};var n=i(e("react")),a=i(e("./make-owner")),o=i(e("./remove")),l=i(e("../../avatar"));function i(e){return e&&e.__esModule?e:{default:e}}function u(e){return e.isOwner?n.default.createElement("li",{className:"dropdown-header dropdown-header-owner"},n.default.createElement("span",{className:"material-icon"},"start"),n.default.createElement("span",{className:"icon-text"},gettext("Thread owner"))):null}},{"../../avatar":6,"./make-owner":99,"./remove":100,react:"react"}],98:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.participants,r=e.thread,n=e.user,a=e.userIsOwner;return o.default.createElement("div",{className:"participants-cards"},o.default.createElement("div",{className:"row"},t.map(function(e){return o.default.createElement(l.default,{key:e.id,participant:e,thread:r,user:n,userIsOwner:a})})))};var o=n(e("react")),l=n(e("./card"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./card":97,react:"react"}],99:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,i=(n=e("react"))&&n.__esModule?n:{default:n},u=e("./actions");function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=o(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=o(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var l=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(l,i.default.Component);var e,t,r,o=f(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=d(t),a=function(){var e;(t.isUser?window.confirm(gettext("Are you sure you want to take over this thread?")):(e=gettext("Are you sure you want to change thread owner to %(user)s?"),window.confirm(interpolate(e,{user:t.props.participant.username},!0))))&&(0,u.changeOwner)(t.props.thread,t.props.participant)},(n="onClick")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.isUser=e.participant.id===e.user.id,t}return e=l,(t=[{key:"render",value:function(){return!this.props.participant.is_owner&&this.props.thread.acl.can_change_owner?i.default.createElement("li",null,i.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},gettext("Make owner"))):null}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=l},{"./actions":96,react:"react"}],100:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,i=(n=e("react"))&&n.__esModule?n:{default:n},u=e("./actions");function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=o(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=o(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var l=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(l,i.default.Component);var e,t,r,o=f(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=d(t),a=function(){var e;(t.isUser?window.confirm(gettext("Are you sure you want to leave this thread?")):(e=gettext("Are you sure you want to remove %(user)s from this thread?"),window.confirm(interpolate(e,{user:t.props.participant.username},!0))))&&(t.isUser?(0,u.leave):(0,u.remove))(t.props.thread,t.props.participant)},(n="onClick")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.isUser=e.participant.id===e.user.id,t}return e=l,(t=[{key:"render",value:function(){var e=this.props.user.acl.can_moderate_private_threads;return this.props.userIsOwner||this.isUser||e?i.default.createElement("li",null,i.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},this.isUser?gettext("Leave thread"):gettext("Remove"))):null}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=l},{"./actions":96,react:"react"}],101:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.participants.length?n.default.createElement("div",{className:"panel panel-default panel-participants"},n.default.createElement("div",{className:"panel-body"},n.default.createElement(o.default,c({userIsOwner:f(e.user,e.participants)},e)),n.default.createElement("div",{className:"row"},n.default.createElement(a.default,{thread:e.thread}),n.default.createElement("div",{className:"col-xs-12 col-sm-9"},n.default.createElement("p",null,l.getParticipantsCopy(e.participants)))))):null},r.getUserIsOwner=f;var n=s(e("react")),a=s(e("./add-participant")),o=s(e("./cards-list")),l=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./utils"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e){return e&&e.__esModule?e:{default:e}}function c(){return(c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function f(e,t){return t[0].id===e.id}},{"./add-participant":95,"./cards-list":98,"./utils":102,react:"react"}],102:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.getParticipantsCopy=function(e){var t=e.length,r=ngettext("This thread has %(users)s participant.","This thread has %(users)s participants.",t);return interpolate(r,{users:t},!0)}},{}],103:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.STYLES=r.LABELS=void 0;var o=n(e("react")),l=n(e("../services/zxcvbn"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=["progress-bar-danger","progress-bar-warning","progress-bar-warning","progress-bar-primary","progress-bar-success"];r.STYLES=f;var d=[gettext("Entered password is very weak."),gettext("Entered password is weak."),gettext("Entered password is average."),gettext("Entered password is strong."),gettext("Entered password is very strong.")];r.LABELS=d;var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e))._score=0,t._password=null,t._inputs=[],t.state={loaded:!1},t}return e=a,(t=[{key:"componentDidMount",value:function(){var e=this;l.default.load().then(function(){e.setState({loaded:!0})})}},{key:"getScore",value:function(e,t){var r=this,n=!1;return e!==this._password&&(n=!0),t.length!==this._inputs.length?n=!0:t.map(function(e,t){e.trim()!==r._inputs[t]&&(n=!0)}),n&&(this._score=l.default.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 o.default.createElement("div",{className:"help-block password-strength"},o.default.createElement("div",{className:"progress"},o.default.createElement("div",{className:"progress-bar "+f[e],style:{width:20+20*e+"%"},role:"progress-bar","aria-valuenow":e,"aria-valuemin":"0","aria-valuemax":"4"},o.default.createElement("span",{className:"sr-only"},d[e]))),o.default.createElement("p",{className:"text-small"},d[e]))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../services/zxcvbn":378,react:"react"}],104:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.PollChoice=void 0,r.generateRandomHash=h;var n,l=(n=e("react"))&&n.__esModule?n:{default:n};function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t,r){return t&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=p(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=p(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function p(e){return(p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function m(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var y=function(){s(o,l.default.Component);var a=f(o);function o(){var n;i(this,o);for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return m(d(n=a.call.apply(a,[this].concat(t))),"onAdd",function(){var e=n.props.choices.slice();e.push({hash:h(),label:""}),n.props.setChoices(e)}),m(d(n),"onChange",function(t,r){var e=n.props.choices.map(function(e){return e.hash===t&&(e.label=r),e});n.props.setChoices(e)}),m(d(n),"onDelete",function(t){var e=n.props.choices.filter(function(e){return e.hash!==t});n.props.setChoices(e)}),n}return u(o,[{key:"render",value:function(){var t=this;return l.default.createElement("div",{className:"poll-choices-control"},l.default.createElement("ul",{className:"list-group"},this.props.choices.map(function(e){return l.default.createElement(b,{canDelete:2<t.props.choices.length,choice:e,disabled:t.props.disabled,key:e.hash,onChange:t.onChange,onDelete:t.onDelete})})),l.default.createElement("button",{className:"btn btn-default btn-sm",disabled:this.props.disabled,onClick:this.onAdd,type:"button"},gettext("Add choice")))}}]),o}();r.default=y;var b=function(){s(o,l.default.Component);var a=f(o);function o(){var t;i(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return m(d(t=a.call.apply(a,[this].concat(r))),"onChange",function(e){t.props.onChange(t.props.choice.hash,e.target.value)}),m(d(t),"onDelete",function(){window.confirm(gettext("Are you sure you want to delete this choice?"))&&t.props.onDelete(t.props.choice.hash)}),t}return u(o,[{key:"render",value:function(){return l.default.createElement("li",{className:"list-group-item"},l.default.createElement("button",{className:"btn",disabled:!this.props.canDelete||this.props.disabled,onClick:this.onDelete,title:gettext("Delete this choice"),type:"button"},l.default.createElement("span",{className:"material-icon"},"close")),l.default.createElement("input",{disabled:this.props.disabled,maxLength:"255",placeholder:gettext("choice label"),type:"text",onChange:this.onChange,value:this.props.choice.label}))}}]),o}();function h(){for(var e="";12!=e.length;)e=Math.random().toString(36).replace(/[^a-zA-Z0-9]+/g,"").substr(1,12);return e}r.PollChoice=b},{react:"react"}],105:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.PollPublicSwitch=j,r.default=void 0;var o=n(e("react")),l=n(e("./choices-control")),u=n(e("../../button")),s=n(e("../../form")),c=n(e("../../form-group")),f=n(e("../../yes-no-switch")),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=h(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/poll")),p=n(e("../../../services/ajax")),m=n(e("../../../services/posting")),y=n(e("../../../services/snackbar")),b=n(e("../../../services/store"));function h(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(h=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function v(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function w(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var O=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}(a,s.default);var e,t,r,n=_(a);function a(e){var r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),w(E(r=n.call(this,e)),"setChoices",function(e){var t=Object.assign({},t,{choices:null});r.setState({choices:e,errors:t})}),w(E(r),"onCancel",function(){window.confirm(gettext("Are you sure you want to discard poll?"))&&m.default.close()});var t=e.poll||{question:"",choices:[{hash:"choice-10000",label:""},{hash:"choice-20000",label:""}],length:0,allowed_choices:1,allow_revotes:0,is_public:0};return r.state={isLoading:!1,isEdit:!!t.question,question:t.question,choices:t.choices,length:t.length,allowed_choices:t.allowed_choices,allow_revotes:t.allow_revotes,is_public:t.is_public,validators:{question:[],choices:[],length:[],allowed_choices:[]},errors:{}},r}return e=a,(t=[{key:"send",value:function(){var e={question:this.state.question,choices:this.state.choices,length:this.state.length,allowed_choices:this.state.allowed_choices,allow_revotes:this.state.allow_revotes,is_public:this.state.is_public};return this.state.isEdit?p.default.put(this.props.poll.api.index,e):p.default.post(this.props.thread.api.poll,e)}},{key:"handleSuccess",value:function(e){b.default.dispatch(d.replace(e)),this.state.isEdit?y.default.success(gettext("Poll has been edited.")):y.default.success(gettext("Poll has been posted.")),m.default.close()}},{key:"handleError",value:function(e){400===e.status?(e.non_field_errors&&(e.allowed_choices=e.non_field_errors),this.setState({errors:Object.assign({},e)}),y.default.error(gettext("Form contains errors."))):y.default.apiError(e)}},{key:"render",value:function(){return o.default.createElement("div",{className:"poll-form"},o.default.createElement("div",{className:"container"},o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-body"},o.default.createElement("fieldset",null,o.default.createElement("legend",null,gettext("Question and choices")),o.default.createElement(c.default,{label:gettext("Poll question"),for:"id_questions",validation:this.state.errors.question},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,id:"id_questions",onChange:this.bindInput("question"),type:"text",maxLength:"255",value:this.state.question})),o.default.createElement(c.default,{label:gettext("Available choices"),validation:this.state.errors.choices},o.default.createElement(l.default,{choices:this.state.choices,disabled:this.state.isLoading,setChoices:this.setChoices}))),o.default.createElement("fieldset",null,o.default.createElement("legend",null,gettext("Voting")),o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-xs-12 col-sm-6"},o.default.createElement(c.default,{label:gettext("Poll length"),helpText:gettext("Enter number of days for which voting in this poll should be possible or zero to run this poll indefinitely."),for:"id_length",validation:this.state.errors.length},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,id:"id_length",onChange:this.bindInput("length"),type:"text",value:this.state.length}))),o.default.createElement("div",{className:"col-xs-12 col-sm-6"},o.default.createElement(c.default,{label:gettext("Allowed choices"),for:"id_allowed_choices",validation:this.state.errors.allowed_choices},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,id:"id_allowed_choices",onChange:this.bindInput("allowed_choices"),type:"text",maxLength:"255",value:this.state.allowed_choices})))),o.default.createElement("div",{className:"row"},o.default.createElement(j,{bindInput:this.bindInput,disabled:this.state.isLoading,isEdit:this.state.isEdit,value:this.state.is_public}),o.default.createElement("div",{className:"col-xs-12 col-sm-6"},o.default.createElement(c.default,{label:gettext("Allow vote changes"),for:"id_allow_revotes"},o.default.createElement(f.default,{id:"id_allow_revotes",disabled:this.state.isLoading,iconOn:"check",iconOff:"close",labelOn:gettext("Allow participants to change their vote"),labelOff:gettext("Don't allow participants to change their vote"),onChange:this.bindInput("allow_revotes"),value:this.state.allow_revotes})))))),o.default.createElement("div",{className:"panel-footer text-right"},o.default.createElement("button",{className:"btn btn-default",disabled:this.state.isLoading,onClick:this.onCancel,type:"button"},gettext("Cancel"))," ",o.default.createElement(u.default,{className:"btn-primary",loading:this.state.isLoading},this.state.isEdit?gettext("Save changes"):gettext("Post poll")))))))}}])&&v(e.prototype,t),r&&v(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function j(e){return e.isEdit?null:o.default.createElement("div",{className:"col-xs-12 col-sm-6"},o.default.createElement(c.default,{label:gettext("Make voting public"),helpText:gettext("Making voting public will allow everyone to access detailed list of votes, showing which users voted for which choices and at which times. This option can't be changed after poll's creation. Moderators may see voting details for all polls."),for:"id_is_public"},o.default.createElement(f.default,{id:"id_is_public",disabled:e.disabled,iconOn:"visibility",iconOff:"visibility_off",labelOn:gettext("Votes are public"),labelOff:gettext("Votes are hidden"),onChange:e.bindInput("is_public"),value:e.value})))}r.default=O},{"../../../reducers/poll":352,"../../../services/ajax":365,"../../../services/posting":375,"../../../services/snackbar":376,"../../../services/store":377,"../../button":8,"../../form":56,"../../form-group":55,"../../yes-no-switch":300,"./choices-control":104,react:"react"}],106:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"Poll",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(r,"PollForm",{enumerable:!0,get:function(){return a.default}});var n=o(e("./poll")),a=o(e("./form"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./form":105,"./poll":108}],107:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.PollCreation=s,r.PollIsPublic=y,r.PollLength=d,r.PollVotes=m,r.default=function(e){return n.default.createElement("ul",{className:"list-unstyled list-inline poll-details"},n.default.createElement(m,{votes:e.poll.votes}),n.default.createElement(d,{poll:e.poll}),n.default.createElement(y,{poll:e.poll}),n.default.createElement(s,{poll:e.poll}))},r.getEndsOn=p,r.getPostedOn=f,r.getPoster=c;var n=o(e("react")),a=o(e("../../utils/escape-html"));function o(e){return e&&e.__esModule?e:{default:e}}var l='<abbr title="%(absolute)s">%(relative)s</abbr>',i='<span class="item-title">%(user)s</span>',u='<a href="%(url)s" class="item-title">%(user)s</a>';function s(e){var t=interpolate((0,a.default)(gettext("Posted by %(poster)s %(posted_on)s.")),{poster:c(e.poll),posted_on:f(e.poll)},!0);return n.default.createElement("li",{className:"poll-info-creation",dangerouslySetInnerHTML:{__html:t}})}function c(e){return e.url.poster?interpolate(u,{url:(0,a.default)(e.url.poster),user:(0,a.default)(e.poster_name)},!0):interpolate(i,{user:(0,a.default)(e.poster_name)},!0)}function f(e){return interpolate(l,{absolute:(0,a.default)(e.posted_on.format("LLL")),relative:(0,a.default)(e.posted_on.fromNow())},!0)}function d(e){if(!e.poll.length)return null;var t=interpolate((0,a.default)(gettext("Voting ends %(ends_on)s.")),{ends_on:p(e.poll)},!0);return n.default.createElement("li",{className:"poll-info-ends-on",dangerouslySetInnerHTML:{__html:t}})}function p(e){return interpolate(l,{absolute:(0,a.default)(e.endsOn.format("LLL")),relative:(0,a.default)(e.endsOn.fromNow())},!0)}function m(e){var t=ngettext("%(votes)s vote.","%(votes)s votes.",e.votes),r=interpolate(t,{votes:e.votes},!0);return n.default.createElement("li",{className:"poll-info-votes"},r)}function y(e){return e.poll.is_public?n.default.createElement("li",{className:"poll-info-public"},gettext("Votes are public.")):null}},{"../../utils/escape-html":383,react:"react"}],108:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.getIsPollOver=h;var o=u(e("react")),n=u(e("moment")),l=u(e("./results")),i=u(e("./voting"));function u(e){return e&&e.__esModule?e:{default:e}}function s(){return(s=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=m(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return p(e)}(this,n?(e=m(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function y(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var b=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(a,o.default.Component);var e,t,r,n=d(a);function a(e){var t;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),y(p(t=n.call(this,e)),"showResults",function(){t.setState({showResults:!0})}),y(p(t),"showVoting",function(){t.setState({showResults:!1})});var r=!0;return e.user.id&&!e.poll.hasSelectedChoices&&(r=!1),t.state={showResults:r},t}return e=a,(t=[{key:"render",value:function(){if(!this.props.thread.poll)return null;var e=h(this.props.poll);return e||!this.props.poll.acl.can_vote||this.state.showResults?o.default.createElement(l.default,s({isPollOver:e,showVoting:this.showVoting},this.props)):o.default.createElement(i.default,s({showResults:this.showResults},this.props))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function h(e){return!!e.length&&(0,n.default)().isAfter(e.endsOn)}r.default=b},{"./results":110,"./voting":114,moment:"moment",react:"react"}],109:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.ChoiceVotes=l,r.PollChoice=o,r.UserChoice=u,r.default=function(t){return a.default.createElement("div",{className:"poll-choices-bars"},t.poll.choices.map(function(e){return a.default.createElement(o,{choice:e,key:e.hash,poll:t.poll})}))},r.getVotesLabel=i;var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){var t=0;return e.choice.votes&&e.poll.votes&&(t=Math.ceil(100*e.choice.votes/e.poll.votes)),a.default.createElement("dl",{className:"dl-horizontal"},a.default.createElement("dt",null,e.choice.label),a.default.createElement("dd",null,a.default.createElement("div",{className:"progress"},a.default.createElement("div",{className:"progress-bar",role:"progressbar","aria-valuenow":t,"aria-valuemin":"0","aria-valuemax":"100",style:{width:t+"%"}},a.default.createElement("span",{className:"sr-only"},i(e.votes,e.proc)))),a.default.createElement("ul",{className:"list-unstyled list-inline poll-chart"},a.default.createElement(l,{proc:t,votes:e.choice.votes}),a.default.createElement(u,{selected:e.choice.selected}))))}function l(e){return a.default.createElement("li",{className:"poll-chart-votes"},i(e.votes,e.proc))}function i(e,t){var r=ngettext("%(votes)s vote, %(proc)s% of total.","%(votes)s votes, %(proc)s% of total.",e);return interpolate(r,{votes:e,proc:t},!0)}function u(e){return e.selected?a.default.createElement("li",{className:"poll-chart-selected"},a.default.createElement("span",{className:"material-icon"},"check_box"),gettext("Your choice.")):null}},{react:"react"}],110:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement("div",{className:"panel panel-default panel-poll"},n.default.createElement("div",{className:"panel-body"},n.default.createElement("h2",null,e.poll.question),n.default.createElement(l.default,{poll:e.poll}),n.default.createElement(a.default,{poll:e.poll}),n.default.createElement(o.default,{isPollOver:e.isPollOver,poll:e.poll,showVoting:e.showVoting,thread:e.thread})))};var n=i(e("react")),a=i(e("./chart")),o=i(e("./options")),l=i(e("../info"));function i(e){return e&&e.__esModule?e:{default:e}}},{"../info":107,"./chart":109,"./options":112,react:"react"}],111:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ChoiceDetails=v,r.ChoicesList=h,r.ModalBody=b,r.VoteDate=w,r.Voter=E,r.VotesCount=g,r.VotesList=_,r.default=void 0;var o=s(e("react")),l=s(e("moment")),n=s(e("../../modal-message")),i=s(e("../../modal-loader")),u=s(e("../../../services/ajax"));function s(e){return e&&e.__esModule?e:{default:e}}function c(){return(c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=m(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=m(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var y=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,o.default.Component);var e,t,r,n=p(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={isLoading:!0,error:null,data:[]},t}return e=a,(t=[{key:"componentDidMount",value:function(){var r=this;u.default.get(this.props.poll.api.votes).then(function(e){var t=e.map(function(e){return Object.assign({},e,{voters:e.voters.map(function(e){return Object.assign({},e,{voted_on:(0,l.default)(e.voted_on)})})})});r.setState({isLoading:!1,data:t})},function(e){r.setState({isLoading:!1,error:e.detail})})}},{key:"render",value:function(){return o.default.createElement("div",{className:"modal-dialog"+(this.state.error?" modal-message":" modal-sm"),role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Poll votes"))),o.default.createElement(b,{data:this.state.data,error:this.state.error,isLoading:this.state.isLoading})))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function b(e){return e.isLoading?o.default.createElement(i.default,null):e.error?o.default.createElement(n.default,{icon:"error_outline",message:e.error}):o.default.createElement(h,{data:e.data})}function h(e){return o.default.createElement("div",{className:"modal-body modal-poll-votes"},o.default.createElement("ul",{className:"list-unstyled votes-details"},e.data.map(function(e){return o.default.createElement(v,c({key:e.hash},e))})))}function v(e){return o.default.createElement("li",null,o.default.createElement("h4",null,e.label),o.default.createElement(g,{votes:e.votes}),o.default.createElement(_,{voters:e.voters}),o.default.createElement("hr",null))}function g(e){var t=ngettext("%(votes)s user has voted for this choice.","%(votes)s users have voted for this choice.",e.votes),r=interpolate(t,{votes:e.votes},!0);return o.default.createElement("p",null,r)}function _(e){return e.voters.length?o.default.createElement("ul",{className:"list-unstyled"},e.voters.map(function(e){return o.default.createElement(E,c({key:e.username},e))})):null}function E(e){return e.url?o.default.createElement("li",null,o.default.createElement("a",{className:"item-title",href:e.url},e.username)," ",o.default.createElement(w,{voted_on:e.voted_on})):o.default.createElement("li",null,o.default.createElement("strong",null,e.username)," ",o.default.createElement(w,{voted_on:e.voted_on}))}function w(e){return o.default.createElement("abbr",{className:"text-muted",title:e.voted_on.format("LLL")},e.voted_on.fromNow())}r.default=y},{"../../../services/ajax":365,"../../modal-loader":61,"../../modal-message":62,moment:"moment",react:"react"}],112:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ChangeVote=N,r.SeeVotes=r.Edit=r.Delete=void 0,r.default=function(e){var t=e.isPollOver,r=e.poll,n=e.showVoting,a=e.thread;if(!P(t,r.acl,r))return null;var o=[],l=r.acl.can_vote,i=!r.hasSelectedChoices||r.allow_revotes;l&&i&&o.push(0);(r.is_public||r.acl.can_see_votes)&&o.push(1);r.acl.can_edit&&o.push(2);r.acl.can_delete&&o.push(3);return u.default.createElement("div",{className:"row poll-options"},u.default.createElement(N,{controls:o,isPollOver:t,poll:r,showVoting:n}),u.default.createElement(x,{controls:o,poll:r}),u.default.createElement(S,{controls:o,poll:r,thread:a}),u.default.createElement(R,{controls:o,poll:r}))},r.getClassName=k,r.isVisible=P;var u=a(e("react")),l=a(e("./modal")),s=n(e("../../../reducers/poll")),c=n(e("../../../reducers/thread")),f=a(e("../../../services/ajax")),d=a(e("../../../services/modal")),p=a(e("../../../services/posting")),m=a(e("../../../services/snackbar")),y=a(e("../../../services/store"));function b(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(b=function(e){return e?r:t})(e)}function n(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=b(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function a(e){return e&&e.__esModule?e:{default:e}}function h(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function v(e,t,r){return t&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=O(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=O(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function O(e){return(O=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function j(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function P(e,t,r){return r.is_public||t.can_delete||t.can_edit||t.can_see_votes||t.can_vote&&!e&&(!r.hasSelectedChoices||r.allow_revotes)}function k(e,t){var r="col-xs-6";return 1===e.length&&(r="col-xs-12"),3===e.length&&e[0]===t&&(r="col-xs-12"),r+" col-sm-3 col-md-2"}function N(e){var t=e.poll.acl.can_vote,r=!e.poll.hasSelectedChoices||e.poll.allow_revotes;return t&&r?u.default.createElement("div",{className:k(e.controls,0)},u.default.createElement("button",{className:"btn btn-default btn-block btn-sm",disabled:e.poll.isBusy,onClick:e.showVoting,type:"button"},gettext("Vote"))):null}var x=function(){g(o,u.default.Component);var a=E(o);function o(){var e;h(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return j(w(e=a.call.apply(a,[this].concat(r))),"onClick",function(){d.default.show(u.default.createElement(l.default,{poll:e.props.poll}))}),e}return v(o,[{key:"render",value:function(){return this.props.poll.is_public||this.props.poll.acl.can_see_votes?u.default.createElement("div",{className:k(this.props.controls,1)},u.default.createElement("button",{className:"btn btn-default btn-block btn-sm",disabled:this.props.poll.isBusy,onClick:this.onClick,type:"button"},gettext("See votes"))):null}}]),o}();r.SeeVotes=x;var S=function(){g(o,u.default.Component);var a=E(o);function o(){var e;h(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return j(w(e=a.call.apply(a,[this].concat(r))),"onClick",function(){p.default.open({submit:e.props.poll.api.index,thread:e.props.thread,poll:e.props.poll,mode:"POLL"})}),e}return v(o,[{key:"render",value:function(){return this.props.poll.acl.can_edit?u.default.createElement("div",{className:k(this.props.controls,2)},u.default.createElement("button",{className:"btn btn-default btn-block btn-sm",disabled:this.props.poll.isBusy,onClick:this.onClick,type:"button"},gettext("Edit"))):null}}]),o}();r.Edit=S;var R=function(){g(o,u.default.Component);var a=E(o);function o(){var e;h(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return j(w(e=a.call.apply(a,[this].concat(r))),"onClick",function(){return!!window.confirm(gettext("Are you sure you want to delete this poll? This action is not reversible."))&&(y.default.dispatch(s.busy()),void f.default.delete(e.props.poll.api.index).then(e.handleSuccess,e.handleError))}),j(w(e),"handleSuccess",function(e){m.default.success("Poll has been deleted"),y.default.dispatch(s.remove()),y.default.dispatch(c.updateAcl(e))}),j(w(e),"handleError",function(e){m.default.apiError(e),y.default.dispatch(s.release())}),e}return v(o,[{key:"render",value:function(){return this.props.poll.acl.can_delete?u.default.createElement("div",{className:k(this.props.controls,3)},u.default.createElement("button",{className:"btn btn-default btn-block btn-sm",disabled:this.props.poll.isBusy,onClick:this.onClick,type:"button"},gettext("Delete"))):null}}]),o}();r.Delete=R},{"../../../reducers/poll":352,"../../../reducers/thread":360,"../../../services/ajax":365,"../../../services/modal":371,"../../../services/posting":375,"../../../services/snackbar":376,"../../../services/store":377,"./modal":111,react:"react"}],113:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.PollAllowRevote=l,r.PollChoicesLeft=o,r.default=function(e){return a.default.createElement("ul",{className:"list-unstyled list-inline poll-help"},a.default.createElement(o,{choicesLeft:e.choicesLeft}),a.default.createElement(l,{poll:e.poll}))};var a=n(e("react"));n(e("../../../utils/escape-html"));function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=e.choicesLeft;if(0===t)return a.default.createElement("li",{className:"poll-help-choices-left"},gettext("You can't select any more choices."));var r=ngettext("You can select %(choices)s more choice.","You can select %(choices)s more choices.",t),n=interpolate(r,{choices:t},!0);return a.default.createElement("li",{className:"poll-help-choices-left"},n)}function l(e){return e.poll.allow_revotes?a.default.createElement("li",{className:"poll-help-allow-revotes"},gettext("You can change your vote later.")):a.default.createElement("li",{className:"poll-help-no-revotes"},gettext("Votes are final."))}},{"../../../utils/escape-html":383,react:"react"}],114:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var a=n(e("react")),l=n(e("./help")),u=n(e("./select")),s=e("./utils"),c=n(e("../info")),f=e("../results/options"),d=n(e("../../button")),p=n(e("../../form")),m=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=v(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/poll")),y=n(e("../../../services/ajax")),b=n(e("../../../services/snackbar")),h=n(e("../../../services/store"));function v(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(v=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function g(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=o(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=o(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function O(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var j=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}(o,p.default);var e,t,r,n=E(o);function o(e){var a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o),O(w(a=n.call(this,e)),"toggleChoice",function(e){var t=(0,s.getChoiceFromHash)(a.state.choices,e),r=null,r=t.selected?a.deselectChoice(t,e):a.selectChoice(t,e);a.setState({choices:r,choicesLeft:(0,s.getChoicesLeft)(a.props.poll,r)})}),O(w(a),"selectChoice",function(e,t){if(!(0,s.getChoicesLeft)(a.props.poll,a.state.choices))for(var r in a.state.choices.slice()){var n=a.state.choices[r];if(n.selected&&n.hash!=t){n.selected=!1;break}}return a.state.choices.map(function(e){return Object.assign({},e,{selected:e.hash==t||e.selected})})}),O(w(a),"deselectChoice",function(e,t){return a.state.choices.map(function(e){return Object.assign({},e,{selected:e.hash!=t&&e.selected})})}),a.state={isLoading:!1,choices:e.poll.choices,choicesLeft:(0,s.getChoicesLeft)(e.poll,e.poll.choices)},a}return e=o,(t=[{key:"clean",value:function(){return this.state.choicesLeft!==this.props.poll.allowed_choices||(b.default.error(gettext("You need to select at least one choice")),!1)}},{key:"send",value:function(){var e=[];for(var t in this.state.choices.slice()){var r=this.state.choices[t];r.selected&&e.push(r.hash)}return y.default.post(this.props.poll.api.votes,e)}},{key:"handleSuccess",value:function(e){h.default.dispatch(m.replace(e)),b.default.success(gettext("Your vote has been saved.")),this.props.showResults()}},{key:"handleError",value:function(e){400===e.status?b.default.error(e.detail):b.default.apiError(e)}},{key:"render",value:function(){var e=[];return this.props.poll.acl.can_vote&&e.push(0),(this.props.poll.is_public||this.props.poll.acl.can_see_votes)&&e.push(1),this.props.poll.acl.can_edit&&e.push(2),this.props.poll.acl.can_delete&&e.push(3),a.default.createElement("div",{className:"panel panel-default panel-poll"},a.default.createElement("form",{onSubmit:this.handleSubmit},a.default.createElement("div",{className:"panel-body"},a.default.createElement("h2",null,this.props.poll.question),a.default.createElement(c.default,{poll:this.props.poll}),a.default.createElement(u.default,{choices:this.state.choices,toggleChoice:this.toggleChoice}),a.default.createElement(l.default,{choicesLeft:this.state.choicesLeft,poll:this.props.poll})),a.default.createElement("div",{className:"panel-footer"},a.default.createElement("div",{className:"row"},a.default.createElement("div",{className:(0,f.getClassName)(e,0)},a.default.createElement(d.default,{className:"btn-primary btn-block btn-sm",loading:this.state.isLoading},gettext("Save your vote"))),a.default.createElement("div",{className:(0,f.getClassName)(e,1)},a.default.createElement("button",{className:"btn btn-default btn-block btn-sm",disabled:this.state.isLoading,onClick:this.props.showResults,type:"button"},gettext("See results"))),a.default.createElement(f.Edit,{controls:e,poll:this.props.poll,thread:this.props.thread}),a.default.createElement(f.Delete,{controls:e,poll:this.props.poll})))))}}])&&g(e.prototype,t),r&&g(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=j},{"../../../reducers/poll":352,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377,"../../button":8,"../../form":56,"../info":107,"../results/options":112,"./help":113,"./select":115,"./utils":116,react:"react"}],115:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ChoiceSelect=void 0,r.default=function(t){return o.default.createElement("ul",{className:"list-unstyled poll-select-choices"},t.choices.map(function(e){return o.default.createElement(u,{choice:e,key:e.hash,toggleChoice:t.toggleChoice})}))};var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return f(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(u,o.default.Component);var e,t,r,i=c(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=f(e),n=function(){e.props.toggleChoice(e.props.choice.hash)},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return o.default.createElement("li",{className:"poll-select-choice"},o.default.createElement("button",{className:this.props.choice.selected?"btn btn-selected":"btn",onClick:this.onClick,type:"button"},o.default.createElement("span",{className:"material-icon"},this.props.choice.selected?"check_box":"check_box_outline_blank"),o.default.createElement("strong",null,this.props.choice.label)))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.ChoiceSelect=u},{react:"react"}],116:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.getChoiceFromHash=function(e,t){for(var r in e){var n=e[r];if(n.hash===t)return n}return null},r.getChoicesLeft=function(e,t){var r=[];for(var n in t){var a=t[n];a.selected&&r.push(a)}return e.allowed_choices-r.length}},{}],117:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.DiffItem=o,r.cleanItem=i,r.default=function(e){return a.default.createElement("div",{className:"modal-body post-changelog-diff"},a.default.createElement("ul",{className:"list-unstyled"},e.diff.map(function(e,t){return a.default.createElement(o,{item:e,key:t})})))},r.getItemClassName=l;var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){return"?"===e.item[0]?null:a.default.createElement("li",{className:l(e.item)},i(e.item))}function l(e){var t="diff-item";return"-"===e[0]?t+=" diff-item-sub":"+"===e[0]&&(t+=" diff-item-add"),t}function i(e){return e.substr(2)}},{react:"react"}],118:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=l(e("react")),o=l(e("../button"));function l(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(u,n.default.Component);var e,t,r,i=f(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=d(e),n=function(){e.props.revertEdit(e.props.edit.id)},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return this.props.canRevert?n.default.createElement("div",{className:"modal-footer visible-xs-block"},n.default.createElement(o.default,{className:"btn-default btn-sm btn-block",disabled:this.props.disabled,onClick:this.onClick,title:gettext("Revert post to state from before this edit.")},gettext("Revert"))):null}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../button":8,react:"react"}],119:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ModalDialog=P,r.default=void 0;var o=n(e("react")),l=n(e("./diff")),u=n(e("./footer")),s=n(e("./toolbar")),c=e("./utils"),f=n(e("../modal-message")),d=n(e("../modal-loader")),p=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=v(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/post")),m=n(e("../../services/ajax")),y=n(e("../../services/modal")),b=n(e("../../services/snackbar")),h=n(e("../../services/store"));function v(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(v=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function g(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function O(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var j=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}(a,o.default.Component);var e,t,r,n=E(a);function a(e){var r;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),O(w(r=n.call(this,e)),"goToEdit",function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:null;r.setState({isBusy:!0});var t=r.props.post.api.edits;null!==e&&(t+="?edit="+e),m.default.get(t).then(function(e){r.setState({isReady:!0,isBusy:!1,edit:(0,c.hydrateEdit)(e)})},function(e){r.setState({isReady:!0,isBusy:!1,error:e.detail})})}),O(w(r),"revertEdit",function(e){var t;r.state.isBusy||window.confirm(gettext("Are you sure you with to revert this post to the state from before this edit?"))&&(r.setState({isBusy:!0}),t=r.props.post.api.edits+"?edit="+e,m.default.post(t).then(function(e){var t=p.hydrate(e);h.default.dispatch(p.patch(e,t)),b.default.success(gettext("Post has been reverted to previous state.")),y.default.hide()},function(e){b.default.apiError(e),r.setState({isBusy:!1})}))}),r.state={isReady:!1,isBusy:!0,canRevert:e.post.acl.can_edit,error:null,edit:null},r}return e=a,(t=[{key:"componentDidMount",value:function(){this.goToEdit()}},{key:"render",value:function(){return this.state.error?o.default.createElement(P,{className:"modal-dialog modal-message"},o.default.createElement(f.default,{message:this.state.error})):this.state.isReady?o.default.createElement(P,null,o.default.createElement(s.default,{canRevert:this.state.canRevert,disabled:this.state.isBusy,edit:this.state.edit,goToEdit:this.goToEdit,revertEdit:this.revertEdit}),o.default.createElement(l.default,{diff:this.state.edit.diff}),o.default.createElement(u.default,{canRevert:this.state.canRevert,disabled:this.state.isBusy,edit:this.state.edit,revertEdit:this.revertEdit})):o.default.createElement(P,null,o.default.createElement(d.default,null))}}])&&g(e.prototype,t),r&&g(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function P(e){return o.default.createElement("div",{className:e.className||"modal-dialog",role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Post edits history"))),e.children))}r.default=j},{"../../reducers/post":353,"../../services/ajax":365,"../../services/modal":371,"../../services/snackbar":376,"../../services/store":377,"../modal-loader":61,"../modal-message":62,"./diff":117,"./footer":118,"./toolbar":120,"./utils":121,react:"react"}],120:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.GoBackBtn=v,r.GoForwardBtn=g,r.GoLastBtn=_,r.Label=w,r.RevertBtn=E,r.default=void 0;var l=i(e("react")),n=i(e("../button")),o=i(e("../../utils/escape-html"));function i(e){return e&&e.__esModule?e:{default:e}}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=d(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return f(e)}(this,n?(e=d(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function d(e){return(d=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function p(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var m='<abbr title="%(absolute)s">%(relative)s</abbr>',y='<span class="item-title">%(user)s</span>',b='<a href="%(url)s" class="item-title">%(user)s</a>',h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(o,l.default.Component);var e,t,r,a=c(o);function o(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return p(f(e=a.call.apply(a,[this].concat(r))),"goLast",function(){e.props.goToEdit()}),p(f(e),"goForward",function(){e.props.goToEdit(e.props.edit.next)}),p(f(e),"goBack",function(){e.props.goToEdit(e.props.edit.previous)}),p(f(e),"revertEdit",function(){e.props.revertEdit(e.props.edit.id)}),e}return e=o,(t=[{key:"render",value:function(){return l.default.createElement("div",{className:"modal-toolbar post-changelog-toolbar"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-xs-12 col-sm-4"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-xs-4"},l.default.createElement(v,{disabled:this.props.disabled,edit:this.props.edit,onClick:this.goBack})),l.default.createElement("div",{className:"col-xs-4"},l.default.createElement(g,{disabled:this.props.disabled,edit:this.props.edit,onClick:this.goForward})),l.default.createElement("div",{className:"col-xs-4"},l.default.createElement(_,{disabled:this.props.disabled,edit:this.props.edit,onClick:this.goLast})))),l.default.createElement("div",{className:"col-xs-12 col-sm-5 xs-margin-top-half post-change-label"},l.default.createElement(w,{edit:this.props.edit})),l.default.createElement(E,{canRevert:this.props.canRevert,disabled:this.props.disabled,onClick:this.revertEdit})))}}])&&u(e.prototype,t),r&&u(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();function v(e){return l.default.createElement(n.default,{className:"btn-default btn-block btn-icon btn-sm",disabled:e.disabled||!e.edit.previous,onClick:e.onClick,title:gettext("See previous change")},l.default.createElement("span",{className:"material-icon"},"chevron_left"))}function g(e){return l.default.createElement(n.default,{className:"btn-default btn-block btn-icon btn-sm",disabled:e.disabled||!e.edit.next,onClick:e.onClick,title:gettext("See next change")},l.default.createElement("span",{className:"material-icon"},"chevron_right"))}function _(e){return l.default.createElement(n.default,{className:"btn-default btn-block btn-icon btn-sm",disabled:e.disabled||!e.edit.next,onClick:e.onClick,title:gettext("See previous change")},l.default.createElement("span",{className:"material-icon"},"last_page"))}function E(e){return e.canRevert?l.default.createElement("div",{className:"col-sm-3 hidden-xs"},l.default.createElement(n.default,{className:"btn-default btn-sm btn-block",disabled:e.disabled,onClick:e.onClick,title:gettext("Revert post to state from before this edit.")},gettext("Revert"))):null}function w(e){var t=null,t=e.edit.url.editor?interpolate(b,{url:(0,o.default)(e.edit.url.editor),user:(0,o.default)(e.edit.editor_name)},!0):interpolate(y,{user:(0,o.default)(e.edit.editor_name)},!0),r=interpolate(m,{absolute:(0,o.default)(e.edit.edited_on.format("LLL")),relative:(0,o.default)(e.edit.edited_on.fromNow())},!0),n=interpolate((0,o.default)(gettext("By %(edited_by)s %(edited_on)s.")),{edited_by:t,edited_on:r},!0);return l.default.createElement("p",{dangerouslySetInnerHTML:{__html:n}})}r.default=h},{"../../utils/escape-html":383,"../button":8,react:"react"}],121:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.hydrateEdit=function(e){return Object.assign({},e,{edited_on:(0,a.default)(e.edited_on)})};var n,a=(n=e("moment"))&&n.__esModule?n:{default:n}},{moment:"moment"}],122:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.isReady,r=e.posts,n=e.poster;return t?a.default.createElement("ul",{className:"posts-list post-feed ui-ready"},r.map(function(e){return a.default.createElement(o.default,{key:e.id,post:e,poster:n})})):a.default.createElement(l.default,null)};var a=n(e("react")),o=n(e("./post")),l=n(e("./preview"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./post":125,"./preview":131,react:"react"}],123:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Default=l,r.Invalid=i,r.default=function(e){return e.post.content?n.default.createElement(l,e):n.default.createElement(i,e)};var n=o(e("react")),a=o(e("../../misago-markup"));o(e("../../../utils/escape-html"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e){return n.default.createElement("div",{className:"post-body"},n.default.createElement(a.default,{markup:e.post.content}))}function i(e){return n.default.createElement("div",{className:"post-body post-body-invalid"},n.default.createElement("p",{className:"lead"},gettext("This post's contents cannot be displayed.")),n.default.createElement("p",{className:"text-muted"},gettext("This error is caused by invalid post content manipulation.")))}},{"../../../utils/escape-html":383,"../../misago-markup":60,react:"react"}],124:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post,r=t.category,n=t.thread,a=interpolate(gettext("posted %(posted_on)s"),{posted_on:t.posted_on.format("LL, LT")},!0);return o.default.createElement("div",{className:"post-heading"},o.default.createElement("a",{className:"btn btn-link item-title",href:n.url},n.title),o.default.createElement("a",{className:"btn btn-link post-category",href:r.url.index},r.name),o.default.createElement("a",{href:t.url.index,className:"btn btn-link posted-on",title:a},t.posted_on.fromNow()))};var n,o=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],125:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post,r=e.poster||t.poster,n="post";r&&r.rank.css_class&&(n+=" post-"+r.rank.css_class);return a.default.createElement("li",{className:n,id:"post-"+t.id},a.default.createElement("div",{className:"panel panel-default panel-post"},a.default.createElement("div",{className:"panel-body"},a.default.createElement(i.default,{post:t,poster:r}),a.default.createElement(l.default,{post:t}),a.default.createElement(o.default,{post:t}))))};var a=n(e("react")),o=n(e("./body")),l=n(e("./header")),i=n(e("./post-side"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./body":123,"./header":124,"./post-side":128,react:"react"}],126:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post;return n.default.createElement("div",{className:"post-side post-side-anonymous"},n.default.createElement(o.default,{post:t}),n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left"},n.default.createElement("span",null,n.default.createElement(a.default,{className:"poster-avatar",size:50}))),n.default.createElement("div",{className:"media-body"},n.default.createElement("div",{className:"media-heading"},n.default.createElement("span",{className:"item-title"},t.poster_name)),n.default.createElement("span",{className:"user-title user-title-anonymous"},gettext("Removed user")))))};var n=l(e("react")),a=l(e("../../../avatar")),o=l(e("./button"));function l(e){return e&&e.__esModule?e:{default:e}}},{"../../../avatar":6,"./button":127,react:"react"}],127:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post;return a.default.createElement("a",{className:"btn btn-default btn-icon pull-right",href:t.url.index},a.default.createElement("span",{className:"btn-text-left hidden-xs"},gettext("See post")),a.default.createElement("span",{className:"material-icon"},"chevron_right"))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],128:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post,r=e.poster;if(r.id)return n.default.createElement(o.default,{post:t,poster:r});return n.default.createElement(a.default,{post:t})};var n=l(e("react")),a=l(e("./anonymous")),o=l(e("./registered"));function l(e){return e&&e.__esModule?e:{default:e}}},{"./anonymous":126,"./registered":129,react:"react"}],129:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post,r=e.poster;return n.default.createElement("div",{className:"post-side post-side-registered"},n.default.createElement(o.default,{post:t}),n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left"},n.default.createElement("a",{href:r.url},n.default.createElement(a.default,{className:"poster-avatar",size:50,user:r}))),n.default.createElement("div",{className:"media-body"},n.default.createElement("div",{className:"media-heading"},n.default.createElement("a",{className:"item-title",href:r.url},r.username)),n.default.createElement(l.default,{title:r.title,rank:r.rank}))))};var n=i(e("react")),a=i(e("../../../avatar")),o=i(e("./button")),l=i(e("./user-title"));function i(e){return e&&e.__esModule?e:{default:e}}},{"../../../avatar":6,"./button":127,"./user-title":130,react:"react"}],130:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.rank,r=e.title||t.title||t.name,n="user-title";t.css_class&&(n+=" user-title-"+t.css_class);if(t.is_tab)return a.default.createElement("a",{className:n,href:t.url},r);return a.default.createElement("span",{className:n},r)};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],131:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(){return n.default.createElement("ul",{className:"posts-list post-feed ui-preview"},n.default.createElement("li",{className:"post"},n.default.createElement("div",{className:"panel panel-default panel-post"},n.default.createElement("div",{className:"panel-body"},n.default.createElement("div",{className:"post-side post-side-anonymous"},n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left"},n.default.createElement("span",null,n.default.createElement(a.default,{className:"poster-avatar",size:50}))),n.default.createElement("div",{className:"media-body"},n.default.createElement("div",{className:"media-heading"},n.default.createElement("span",{className:"item-title"},n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,200)+"px"}}," "))),n.default.createElement("span",{className:"user-title user-title-anonymous"},n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,200)+"px"}}," "))))),n.default.createElement("div",{className:"post-heading"},n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,200)+"px"}}," ")),n.default.createElement("div",{className:"post-body"},n.default.createElement("article",{className:"misago-markup"},n.default.createElement("p",null,n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,200)+"px"}}," ")," ",n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,200)+"px"}}," ")," ",n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,200)+"px"}}," "))))))))};var n=l(e("react")),a=l(e("../avatar")),o=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../utils/random"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}},{"../../utils/random":388,"../avatar":6,react:"react"}],132:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.LikeDate=E,r.LikeDetails=_,r.LikesList=g,r.ModalDialog=v,r.default=void 0,r.hydrateLike=h;var i=c(e("react")),n=c(e("moment")),o=c(e("./avatar")),l=c(e("./modal-message")),u=c(e("./modal-loader")),s=c(e("../services/ajax"));function c(e){return e&&e.__esModule?e:{default:e}}function f(){return(f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var b=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(a,i.default.Component);var e,t,r,n=m(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={isReady:!1,error:null,likes:[]},t}return e=a,(t=[{key:"componentDidMount",value:function(){var t=this;s.default.get(this.props.post.api.likes).then(function(e){t.setState({isReady:!0,likes:e.map(h)})},function(e){t.setState({isReady:!0,error:e.detail})})}},{key:"render",value:function(){return this.state.error?i.default.createElement(v,{className:"modal-message"},i.default.createElement(l.default,{message:this.state.error})):this.state.isReady?this.state.likes.length?i.default.createElement(v,{className:"modal-sm",likes:this.state.likes},i.default.createElement(g,{likes:this.state.likes})):i.default.createElement(v,{className:"modal-message"},i.default.createElement(l.default,{message:gettext("No users have liked this post.")})):i.default.createElement(v,{className:"modal-sm"},i.default.createElement(u.default,null))}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function h(e){return Object.assign({},e,{liked_on:(0,n.default)(e.liked_on)})}function v(e){var t,r,n=e.className,a=e.children,o=e.likes,l=gettext("Post Likes");return o&&(t=o.length,r=ngettext("%(likes)s like","%(likes)s likes",t),l=interpolate(r,{likes:t},!0)),i.default.createElement("div",{className:"modal-dialog "+(n||""),role:"document"},i.default.createElement("div",{className:"modal-content"},i.default.createElement("div",{className:"modal-header"},i.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},i.default.createElement("span",{"aria-hidden":"true"},"×")),i.default.createElement("h4",{className:"modal-title"},l)),a))}function g(e){return i.default.createElement("div",{className:"modal-body modal-post-likers"},i.default.createElement("ul",{className:"media-list"},e.likes.map(function(e){return i.default.createElement(_,f({key:e.id},e))})))}function _(e){if(e.url){var t={id:e.liker_id,avatars:e.avatars};return i.default.createElement("li",{className:"media"},i.default.createElement("div",{className:"media-left"},i.default.createElement("a",{className:"user-avatar",href:e.url},i.default.createElement(o.default,{size:"50",user:t}))),i.default.createElement("div",{className:"media-body"},i.default.createElement("a",{className:"item-title",href:e.url},e.username)," ",i.default.createElement(E,{likedOn:e.liked_on})))}return i.default.createElement("li",{className:"media"},i.default.createElement("div",{className:"media-left"},i.default.createElement("span",{className:"user-avatar"},i.default.createElement(o.default,{size:"50"}))),i.default.createElement("div",{className:"media-body"},i.default.createElement("strong",null,e.username)," ",i.default.createElement(E,{likedOn:e.liked_on})))}function E(e){return i.default.createElement("span",{className:"text-muted",title:e.likedOn.format("LLL")},e.likedOn.fromNow())}r.default=b},{"../services/ajax":365,"./avatar":6,"./modal-loader":61,"./modal-message":62,moment:"moment",react:"react"}],133:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../editor")),u=n(e("../form")),s=n(e("./utils/container")),c=n(e("./utils/loader")),f=n(e("./utils/message")),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=h(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./utils/attachments")),p=e("./utils/validators"),m=n(e("../../services/ajax")),y=n(e("../../services/posting")),b=n(e("../../services/snackbar"));function h(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(h=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function v(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function w(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var O=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}(a,u.default);var e,t,r,n=_(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),w(E(t=n.call(this,e)),"loadSuccess",function(e){t.setState({isReady:!0,post:e.post,attachments:d.hydrate(e.attachments),protect:e.is_protected,canProtect:e.can_protect})}),w(E(t),"loadError",function(e){t.setState({isErrored:e.detail})}),w(E(t),"onCancel",function(){window.confirm(gettext("Are you sure you want to discard changes?"))&&y.default.close()}),w(E(t),"onProtect",function(){t.setState({protect:!0})}),w(E(t),"onUnprotect",function(){t.setState({protect:!1})}),w(E(t),"onPostChange",function(e){t.changeValue("post",e.target.value)}),w(E(t),"onAttachmentsChange",function(e){t.setState({attachments:e})}),t.state={isReady:!1,isLoading:!1,isErrored:!1,post:"",attachments:[],protect:!1,canProtect:!1,validators:{post:(0,p.getPostValidators)()},errors:{}},t}return e=a,(t=[{key:"componentDidMount",value:function(){m.default.get(this.props.config).then(this.loadSuccess,this.loadError)}},{key:"clean",value:function(){if(!this.state.post.trim().length)return b.default.error(gettext("You have to enter a message.")),!1;var e=this.validate();return!e.post||(b.default.error(e.post[0]),!1)}},{key:"send",value:function(){return m.default.put(this.props.submit,{post:this.state.post,attachments:d.clean(this.state.attachments),protect:this.state.protect})}},{key:"handleSuccess",value:function(e){b.default.success(gettext("Reply has been edited.")),window.location=e.url.index,this.setState({isLoading:!0})}},{key:"handleError",value:function(e){var t;400===e.status?(t=[].concat(e.non_field_errors||[],e.category||[],e.title||[],e.post||[],e.attachments||[]),b.default.error(t[0])):b.default.apiError(e)}},{key:"render",value:function(){return this.state.isReady?o.default.createElement(s.default,{className:"posting-form"},o.default.createElement("form",{onSubmit:this.handleSubmit,method:"POST"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-md-12"},o.default.createElement(l.default,{attachments:this.state.attachments,canProtect:this.state.canProtect,loading:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onCancel:this.onCancel,onChange:this.onPostChange,onProtect:this.onProtect,onUnprotect:this.onUnprotect,protect:this.state.protect,submitLabel:gettext("Edit reply"),value:this.state.post}))))):this.state.isErrored?o.default.createElement(f.default,{message:this.state.isErrored}):o.default.createElement(c.default,null)}}])&&v(e.prototype,t),r&&v(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=O},{"../../services/ajax":365,"../../services/posting":375,"../../services/snackbar":376,"../editor":52,"../form":56,"./utils/attachments":138,"./utils/container":139,"./utils/loader":140,"./utils/message":141,"./utils/validators":144,react:"react"}],134:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return"START"===e.mode?n.default.createElement(a.default,e):"START_PRIVATE"===e.mode?n.default.createElement(o.default,e):"REPLY"===e.mode?n.default.createElement(l.default,e):"EDIT"===e.mode?n.default.createElement(i.default,e):null};var n=u(e("react")),a=u(e("./start")),o=u(e("./start-private")),l=u(e("./reply")),i=u(e("./edit"));function u(e){return e&&e.__esModule?e:{default:e}}},{"./edit":133,"./reply":135,"./start":137,"./start-private":136,react:"react"}],135:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../editor")),u=n(e("../form")),s=n(e("./utils/container")),c=n(e("./utils/loader")),f=n(e("./utils/message")),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=h(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./utils/attachments")),p=e("./utils/validators"),m=n(e("../../services/ajax")),y=n(e("../../services/posting")),b=n(e("../../services/snackbar"));function h(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(h=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function v(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function w(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var O=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}(a,u.default);var e,t,r,n=_(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),w(E(t=n.call(this,e)),"loadSuccess",function(e){t.setState({isReady:!0,post:e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]":""})}),w(E(t),"loadError",function(e){t.setState({isErrored:e.detail})}),w(E(t),"appendData",function(e){var r=e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]\n\n":"";t.setState(function(e,t){return 0<e.post.length?{post:e.post+"\n\n"+r}:{post:r}})}),w(E(t),"onCancel",function(){window.confirm(gettext("Are you sure you want to discard your reply?"))&&y.default.close()}),w(E(t),"onPostChange",function(e){t.changeValue("post",e.target.value)}),w(E(t),"onAttachmentsChange",function(e){t.setState({attachments:e})}),t.state={isReady:!1,isLoading:!1,isErrored:!1,post:"",attachments:[],validators:{post:(0,p.getPostValidators)()},errors:{}},t}return e=a,(t=[{key:"componentDidMount",value:function(){m.default.get(this.props.config,this.props.context||null).then(this.loadSuccess,this.loadError)}},{key:"componentWillReceiveProps",value:function(e){var t=this.props.context,r=e.context;t&&r&&t.reply===r.reply||m.default.get(e.config,e.context||null).then(this.appendData,b.default.apiError)}},{key:"clean",value:function(){if(!this.state.post.trim().length)return b.default.error(gettext("You have to enter a message.")),!1;var e=this.validate();return!e.post||(b.default.error(e.post[0]),!1)}},{key:"send",value:function(){return m.default.post(this.props.submit,{post:this.state.post,attachments:d.clean(this.state.attachments)})}},{key:"handleSuccess",value:function(e){b.default.success(gettext("Your reply has been posted.")),window.location=e.url.index,this.setState({isLoading:!0})}},{key:"handleError",value:function(e){var t;400===e.status?(t=[].concat(e.non_field_errors||[],e.post||[],e.attachments||[]),b.default.error(t[0])):b.default.apiError(e)}},{key:"render",value:function(){return this.state.isReady?o.default.createElement(s.default,{className:"posting-form"},o.default.createElement("form",{onSubmit:this.handleSubmit,method:"POST"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-md-12"},o.default.createElement(l.default,{attachments:this.state.attachments,loading:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onCancel:this.onCancel,onChange:this.onPostChange,submitLabel:gettext("Post reply"),value:this.state.post}))))):this.state.isErrored?o.default.createElement(f.default,{message:this.state.isErrored}):o.default.createElement(c.default,null)}}])&&v(e.prototype,t),r&&v(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=O},{"../../services/ajax":365,"../../services/posting":375,"../../services/snackbar":376,"../editor":52,"../form":56,"./utils/attachments":138,"./utils/container":139,"./utils/loader":140,"./utils/message":141,"./utils/validators":144,react:"react"}],136:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../editor")),u=n(e("../form")),s=n(e("./utils/container")),c=(n(e("./utils/message")),function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=b(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./utils/attachments"))),f=n(e("./utils/usernames")),d=e("./utils/validators"),p=n(e("../../services/ajax")),m=n(e("../../services/posting")),y=n(e("../../services/snackbar"));function b(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(b=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function h(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function v(e,t){return(v=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function g(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return _(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function _(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function E(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var w=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&v(e,t)}(a,u.default);var e,t,r,n=g(a);function a(e){var t;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),E(_(t=n.call(this,e)),"onCancel",function(){window.confirm(gettext("Are you sure you want to discard private thread?"))&&m.default.close()}),E(_(t),"onToChange",function(e){t.changeValue("to",e.target.value)}),E(_(t),"onTitleChange",function(e){t.changeValue("title",e.target.value)}),E(_(t),"onPostChange",function(e){t.changeValue("post",e.target.value)}),E(_(t),"onAttachmentsChange",function(e){t.setState({attachments:e})});var r=(e.to||[]).map(function(e){return e.username}).join(", ");return t.state={isLoading:!1,to:r,title:"",post:"",attachments:[],validators:{title:(0,d.getTitleValidators)(),post:(0,d.getPostValidators)()},errors:{}},t}return e=a,(t=[{key:"clean",value:function(){if(!(0,f.default)(this.state.to).length)return y.default.error(gettext("You have to enter at least one recipient.")),!1;if(!this.state.title.trim().length)return y.default.error(gettext("You have to enter thread title.")),!1;if(!this.state.post.trim().length)return y.default.error(gettext("You have to enter a message.")),!1;var e=this.validate();return e.title?(y.default.error(e.title[0]),!1):!e.post||(y.default.error(e.post[0]),!1)}},{key:"send",value:function(){return p.default.post(this.props.submit,{to:(0,f.default)(this.state.to),title:this.state.title,post:this.state.post,attachments:c.clean(this.state.attachments)})}},{key:"handleSuccess",value:function(e){y.default.success(gettext("Your thread has been posted.")),window.location=e.url,this.setState({isLoading:!0})}},{key:"handleError",value:function(e){var t;400===e.status?(t=[].concat(e.non_field_errors||[],e.to||[],e.title||[],e.post||[],e.attachments||[]),y.default.error(t[0])):y.default.apiError(e)}},{key:"render",value:function(){return o.default.createElement(s.default,{className:"posting-form",withFirstRow:!0},o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"row first-row"},o.default.createElement("div",{className:"col-xs-12"},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onToChange,placeholder:gettext("Comma separated list of user names, eg.: Danny, Lisa"),type:"text",value:this.state.to}))),o.default.createElement("div",{className:"row first-row"},o.default.createElement("div",{className:"col-xs-12"},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onTitleChange,placeholder:gettext("Thread title"),type:"text",value:this.state.title}))),o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-xs-12"},o.default.createElement(l.default,{attachments:this.state.attachments,loading:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onCancel:this.onCancel,onChange:this.onPostChange,submitLabel:gettext("Post thread"),value:this.state.post})))))}}])&&h(e.prototype,t),r&&h(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=w},{"../../services/ajax":365,"../../services/posting":375,"../../services/snackbar":376,"../editor":52,"../form":56,"./utils/attachments":138,"./utils/container":139,"./utils/message":141,"./utils/usernames":143,"./utils/validators":144,react:"react"}],137:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../category-select")),u=n(e("../editor")),s=n(e("../form")),c=n(e("./utils/container")),f=n(e("./utils/loader")),d=n(e("./utils/message")),p=n(e("./utils/options")),m=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=g(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./utils/attachments")),y=e("./utils/validators"),b=n(e("../../services/ajax")),h=n(e("../../services/posting")),v=n(e("../../services/snackbar"));function g(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(g=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function _(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function E(e,t){return(E=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function w(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return O(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function O(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function j(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var P=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&E(e,t)}(a,s.default);var e,t,r,n=w(a);function a(e){var o;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),j(O(o=n.call(this,e)),"loadSuccess",function(e){var t=null,r=!1,n=null,a=e.map(function(e){return!1===e.post||t&&e.id!=o.state.category||(t=e.id,n=e.post),e.post&&(e.post.close||e.post.hide||e.post.pin)&&(r=!0),Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id})});o.setState({isReady:!0,showOptions:r,categories:a,category:t,categoryOptions:n})}),j(O(o),"loadError",function(e){o.setState({isErrored:e.detail})}),j(O(o),"onCancel",function(){window.confirm(gettext("Are you sure you want to discard thread?"))&&h.default.close()}),j(O(o),"onTitleChange",function(e){o.changeValue("title",e.target.value)}),j(O(o),"onCategoryChange",function(t){var e=o.state.categories.find(function(e){return t.target.value==e.value}),r=o.state.pin;e.post.pin&&e.post.pin<r&&(r=e.post.pin),o.setState({category:e.id,categoryOptions:e.post,pin:r})}),j(O(o),"onPostChange",function(e){o.changeValue("post",e.target.value)}),j(O(o),"onAttachmentsChange",function(e){o.setState({attachments:e})}),j(O(o),"onClose",function(){o.changeValue("close",!0)}),j(O(o),"onOpen",function(){o.changeValue("close",!1)}),j(O(o),"onPinGlobally",function(){o.changeValue("pin",2)}),j(O(o),"onPinLocally",function(){o.changeValue("pin",1)}),j(O(o),"onUnpin",function(){o.changeValue("pin",0)}),j(O(o),"onHide",function(){o.changeValue("hide",!0)}),j(O(o),"onUnhide",function(){o.changeValue("hide",!1)}),o.state={isReady:!1,isLoading:!1,isErrored:!1,showOptions:!1,categoryOptions:null,title:"",category:e.category||null,categories:[],post:"",attachments:[],close:!1,hide:!1,pin:0,validators:{title:(0,y.getTitleValidators)(),post:(0,y.getPostValidators)()},errors:{}},o}return e=a,(t=[{key:"componentDidMount",value:function(){b.default.get(this.props.config).then(this.loadSuccess,this.loadError)}},{key:"clean",value:function(){if(!this.state.title.trim().length)return v.default.error(gettext("You have to enter thread title.")),!1;if(!this.state.post.trim().length)return v.default.error(gettext("You have to enter a message.")),!1;var e=this.validate();return e.title?(v.default.error(e.title[0]),!1):!e.post||(v.default.error(e.post[0]),!1)}},{key:"send",value:function(){return b.default.post(this.props.submit,{title:this.state.title,category:this.state.category,post:this.state.post,attachments:m.clean(this.state.attachments),close:this.state.close,hide:this.state.hide,pin:this.state.pin})}},{key:"handleSuccess",value:function(e){v.default.success(gettext("Your thread has been posted.")),window.location=e.url,this.setState({isLoading:!0})}},{key:"handleError",value:function(e){var t;400===e.status?(t=[].concat(e.non_field_errors||[],e.category||[],e.title||[],e.post||[],e.attachments||[]),v.default.error(t[0])):v.default.apiError(e)}},{key:"render",value:function(){if(this.state.isErrored)return o.default.createElement(d.default,{message:this.state.isErrored});if(!this.state.isReady)return o.default.createElement(f.default,null);var e=0;this.state.categoryOptions.close&&(e+=1),this.state.categoryOptions.hide&&(e+=1),this.state.categoryOptions.pin&&(e+=1);var t=null,t=1===e?"col-sm-6":"col-sm-8";return t+=3===e?" col-md-6":e?" col-md-7":" col-md-9",o.default.createElement(c.default,{className:"posting-form",withFirstRow:!0},o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"row first-row"},o.default.createElement("div",{className:t},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onTitleChange,placeholder:gettext("Thread title"),type:"text",value:this.state.title})),o.default.createElement("div",{className:"col-xs-12 col-sm-4 col-md-3 xs-margin-top"},o.default.createElement(l.default,{choices:this.state.categories,disabled:this.state.isLoading,onChange:this.onCategoryChange,value:this.state.category})),o.default.createElement(p.default,{close:this.state.close,columns:e,disabled:this.state.isLoading,hide:this.state.hide,onClose:this.onClose,onHide:this.onHide,onOpen:this.onOpen,onPinGlobally:this.onPinGlobally,onPinLocally:this.onPinLocally,onUnhide:this.onUnhide,onUnpin:this.onUnpin,options:this.state.categoryOptions,pin:this.state.pin,showOptions:this.state.showOptions})),o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-md-12"},o.default.createElement(u.default,{attachments:this.state.attachments,loading:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onCancel:this.onCancel,onChange:this.onPostChange,submitLabel:gettext("Post thread"),value:this.state.post})))))}}])&&_(e.prototype,t),r&&_(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=P},{"../../services/ajax":365,"../../services/posting":375,"../../services/snackbar":376,"../category-select":21,"../editor":52,"../form":56,"./utils/attachments":138,"./utils/container":139,"./utils/loader":140,"./utils/message":141,"./utils/options":142,"./utils/validators":144,react:"react"}],138:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.clean=function(e){return e.filter(function(e){return e.id&&!e.isRemoved}).map(function(e){return e.id})},r.hydrate=function(e){return e.map(function(e){return Object.assign({},e,{uploaded_on:(0,a.default)(e.uploaded_on)})})};var n,a=(n=e("moment"))&&n.__esModule?n:{default:n}},{moment:"moment"}],139:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return a.default.createElement("div",{className:e.className},a.default.createElement("div",{className:"container"},e.children))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],140:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,{className:"posting-loader"},n.default.createElement(o.default,null))};var n=l(e("react")),a=l(e("./container")),o=l(e("../../loader"));function l(e){return e&&e.__esModule?e:{default:e}}},{"../../loader":58,"./container":139,react:"react"}],141:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,{className:"posting-message"},n.default.createElement("div",{className:"message-body"},n.default.createElement("p",null,n.default.createElement("span",{className:"material-icon"},"error_outline"),e.message),n.default.createElement("button",{type:"button",className:"btn btn-default",onClick:o.default.close},gettext("Dismiss"))))};var n=l(e("react")),a=l(e("./container")),o=l(e("../../../services/posting"));function l(e){return e&&e.__esModule?e:{default:e}}},{"../../../services/posting":375,"./container":139,react:"react"}],142:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.CloseOptions=l,r.HideOptions=i,r.PinOptions=u,r.default=function(e){if(!e.showOptions)return null;var t=e.columns,r="col-xs-12 xs-margin-top";r+=1===t?" col-sm-2":" sm-margin-top";r+=3===t?" col-md-3":" col-md-2";r+=" posting-options";var n="col-xs-"+12/t,a="btn-text";a+=3===t?" visible-sm-inline-block":2===t?" hidden-md hidden-lg":" hidden-sm";return o.default.createElement("div",{className:r},o.default.createElement("div",{className:"row"},o.default.createElement(u,{className:n,disabled:e.disabled,onPinGlobally:e.onPinGlobally,onPinLocally:e.onPinLocally,onUnpin:e.onUnpin,pin:e.pin,show:e.options.pin,textClassName:a}),o.default.createElement(i,{className:n,disabled:e.disabled,hide:e.hide,onHide:e.onHide,onUnhide:e.onUnhide,show:e.options.hide,textClassName:a}),o.default.createElement(l,{className:n,close:e.close,disabled:e.disabled,onClose:e.onClose,onOpen:e.onOpen,show:e.options.close,textClassName:a})))};var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e){if(!e.show)return null;var t=e.close?gettext("Closed"):gettext("Open");return o.default.createElement("div",{className:e.className},o.default.createElement("button",{className:"btn btn-default btn-block",disabled:e.disabled,onClick:e.close?e.onOpen:e.onClose,title:t,type:"button"},o.default.createElement("span",{className:"material-icon"},e.close?"lock":"lock_outline"),o.default.createElement("span",{className:e.textClassName},t)))}function i(e){if(!e.show)return null;var t=e.hide?gettext("Hidden"):gettext("Not hidden");return o.default.createElement("div",{className:e.className},o.default.createElement("button",{className:"btn btn-default btn-block",disabled:e.disabled,onClick:e.hide?e.onUnhide:e.onHide,title:t,type:"button"},o.default.createElement("span",{className:"material-icon"},e.hide?"visibility_off":"visibility"),o.default.createElement("span",{className:e.textClassName},t)))}function u(e){if(!e.show)return null;var t=null,r=null,n=null;switch(e.pin){case 0:t="radio_button_unchecked",r=e.onPinLocally,n=gettext("Unpinned");break;case 1:t="bookmark_outline",r=e.onPinGlobally,n=gettext("Pinned locally"),r=2==e.show?e.onPinGlobally:e.onUnpin;break;case 2:t="bookmark",r=e.onUnpin,n=gettext("Pinned globally")}return o.default.createElement("div",{className:e.className},o.default.createElement("button",{className:"btn btn-default btn-block",disabled:e.disabled,onClick:r,title:n,type:"button"},o.default.createElement("span",{className:"material-icon"},t),o.default.createElement("span",{className:e.textClassName},n)))}},{react:"react"}],143:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var r=e.split(",").map(function(e){return e.trim().toLowerCase()}).filter(function(e){return 0<e.length});return r.filter(function(e,t){return r.indexOf(e)==t})}},{}],144:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.getPostValidators=function(){return o.default.get("SETTINGS").post_length_max?[u(),s()]:[u()]},r.getTitleLengthMax=i,r.getTitleLengthMin=l,r.getTitleValidators=function(){return[l(),i()]},r.validatePostLengthMax=s,r.validatePostLengthMin=u;var n,a=e("../../../utils/validators"),o=(n=e("../../.."))&&n.__esModule?n:{default:n};function l(){return(0,a.minLength)(o.default.get("SETTINGS").thread_title_length_min,function(e,t){var r=ngettext("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(r,{limit_value:e,show_value:t},!0)})}function i(){return(0,a.maxLength)(o.default.get("SETTINGS").thread_title_length_max,function(e,t){var r=ngettext("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(r,{limit_value:e,show_value:t},!0)})}function u(){return(0,a.minLength)(o.default.get("SETTINGS").post_length_min,function(e,t){var r=ngettext("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(r,{limit_value:e,show_value:t},!0)})}function s(){return(0,a.maxLength)(o.default.get("SETTINGS").post_length_max||1e6,function(e,t){var r=ngettext("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(r,{limit_value:e,show_value:t},!0)})}},{"../../..":302,"../../../utils/validators":393}],145:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Unhide=r.Hide=r.Delete=void 0,r.default=function(e){return E(e.post.acl)?n.default.createElement("li",{className:"event-controls"},n.default.createElement(w,e),n.default.createElement(O,e),n.default.createElement(j,e)):null},r.isVisible=E;var n=a(e("react")),l=a(e("moment")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/post")),s=a(e("../../../services/ajax")),c=a(e("../../../services/snackbar")),f=a(e("../../../services/store"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function a(e){return e&&e.__esModule?e:{default:e}}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t,r){return t&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function y(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function E(e){return e.can_hide}var w=function(){y(o,n.default.Component);var a=h(o);function o(){var t;p(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return _(v(t=a.call.apply(a,[this].concat(r))),"onClick",function(){f.default.dispatch(u.patch(t.props.post,{is_hidden:!0,hidden_on:(0,l.default)(),hidden_by_name:t.props.user.username,url:Object.assign(t.props.post.url,{hidden_by:t.props.user.url})}));s.default.patch(t.props.post.api.index,[{op:"replace",path:"is-hidden",value:!0}]).then(function(e){f.default.dispatch(u.patch(t.props.post,e))},function(e){400===e.status?c.default.error(e.detail[0]):c.default.apiError(e),f.default.dispatch(u.patch(t.props.post,{is_hidden:!1}))})}),t}return m(o,[{key:"render",value:function(){return this.props.post.is_hidden?null:n.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},gettext("Hide"))}}]),o}();r.Hide=w;var O=function(){y(o,n.default.Component);var a=h(o);function o(){var t;p(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return _(v(t=a.call.apply(a,[this].concat(r))),"onClick",function(){f.default.dispatch(u.patch(t.props.post,{is_hidden:!1}));s.default.patch(t.props.post.api.index,[{op:"replace",path:"is-hidden",value:!1}]).then(function(e){f.default.dispatch(u.patch(t.props.post,e))},function(e){400===e.status?c.default.error(e.detail[0]):c.default.apiError(e),f.default.dispatch(u.patch(t.props.post,{is_hidden:!0}))})}),t}return m(o,[{key:"render",value:function(){return this.props.post.is_hidden?n.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},gettext("Unhide")):null}}]),o}();r.Unhide=O;var j=function(){y(o,n.default.Component);var a=h(o);function o(){var t;p(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return _(v(t=a.call.apply(a,[this].concat(r))),"onClick",function(){window.confirm(gettext("Are you sure you wish to delete this event? This action is not reversible!"))&&t.delete()}),_(v(t),"delete",function(){f.default.dispatch(u.patch(t.props.post,{isDeleted:!0})),s.default.delete(t.props.post.api.index).then(function(){c.default.success(gettext("Event has been deleted."))},function(e){400===e.status?c.default.error(e.detail[0]):c.default.apiError(e),f.default.dispatch(u.patch(t.props.post,{isDeleted:!1}))})}),t}return m(o,[{key:"render",value:function(){return n.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},gettext("Delete"))}}]),o}();r.Delete=j},{"../../../reducers/post":353,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377,moment:"moment",react:"react"}],146:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return a.default.createElement("div",{className:"post-avatar"},a.default.createElement("span",{className:"material-icon"},o[e.post.event_type]))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n};var o={changed_title:"edit",pinned_globally:"bookmark",pinned_locally:"bookmark_border",unpinned:"panorama_fish_eye",moved:"arrow_forward",merged:"call_merge",approved:"done",opened:"lock_open",closed:"lock_outline",unhid:"visibility",hid:"visibility_off",changed_owner:"grade",tookover:"grade",added_participant:"person_add",owner_left:"person_outline",participant_left:"person_outline",removed_participant:"remove_circle_outline"}},{react:"react"}],147:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t="event";e.post.isDeleted?t="hide":e.post.is_hidden&&(t="event post-hidden");return n.default.createElement("li",{id:"post-"+e.post.id,className:t},n.default.createElement(i.default,{post:e.post}),n.default.createElement("div",{className:"row"},n.default.createElement("div",{className:"col-xs-2 col-sm-3 text-right"},n.default.createElement(a.default,e)),n.default.createElement("div",{className:"col-xs-10 col-sm-9 text-left"},n.default.createElement(u.default,{post:e.post},n.default.createElement(l.default,e),n.default.createElement(o.default,e)))))};var n=s(e("react")),a=s(e("./icon")),o=s(e("./info")),l=s(e("./message")),i=s(e("./unread-label")),u=s(e("../waypoint"));function s(e){return e&&e.__esModule?e:{default:e}}},{"../waypoint":173,"./icon":146,"./info":148,"./message":149,"./unread-label":150,react:"react"}],148:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Hidden=f,r.Poster=d,r.default=function(e){return a.default.createElement("ul",{className:"list-inline event-info"},a.default.createElement(f,e),a.default.createElement(d,e),a.default.createElement(n.default,e))};var a=l(e("react")),o=l(e("../../../utils/escape-html")),n=l(e("./controls"));function l(e){return e&&e.__esModule?e:{default:e}}var i='<abbr title="%(absolute)s">%(relative)s</abbr>',u='<a href="%(url)s" title="%(absolute)s">%(relative)s</a>',s='<span class="item-title">%(user)s</span>',c='<a href="%(url)s" class="item-title">%(user)s</a>';function f(e){if(e.post.is_hidden){var t=null,t=e.post.url.hidden_by?interpolate(c,{url:(0,o.default)(e.post.url.hidden_by),user:(0,o.default)(e.post.hidden_by_name)},!0):interpolate(s,{user:(0,o.default)(e.post.hidden_by_name)},!0),r=interpolate(i,{absolute:(0,o.default)(e.post.hidden_on.format("LLL")),relative:(0,o.default)(e.post.hidden_on.fromNow())},!0),n=interpolate((0,o.default)(gettext("Hidden by %(event_by)s %(event_on)s.")),{event_by:t,event_on:r},!0);return a.default.createElement("li",{className:"event-hidden-message",dangerouslySetInnerHTML:{__html:n}})}return null}function d(e){var t=null,t=e.post.poster?interpolate(c,{url:(0,o.default)(e.post.poster.url),user:(0,o.default)(e.post.poster_name)},!0):interpolate(s,{user:(0,o.default)(e.post.poster_name)},!0),r=interpolate(u,{url:(0,o.default)(e.post.url.index),absolute:(0,o.default)(e.post.posted_on.format("LLL")),relative:(0,o.default)(e.post.posted_on.fromNow())},!0),n=interpolate((0,o.default)(gettext("By %(event_by)s %(event_on)s.")),{event_by:t,event_on:r},!0);return a.default.createElement("li",{className:"event-posters",dangerouslySetInnerHTML:{__html:n}})}},{"../../../utils/escape-html":383,"./controls":145,react:"react"}],149:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.AddedParticipant=p,r.ChangedOwner=d,r.ChangedTitle=s,r.Merged=f,r.Moved=c,r.RemovedParticipant=m,r.default=function(e){return l[e.post.event_type]?a.default.createElement("p",{className:"event-message"},l[e.post.event_type]):"changed_title"===e.post.event_type?a.default.createElement(s,e):"moved"===e.post.event_type?a.default.createElement(c,e):"merged"===e.post.event_type?a.default.createElement(f,e):"changed_owner"===e.post.event_type?a.default.createElement(d,e):"added_participant"===e.post.event_type?a.default.createElement(p,e):"removed_participant"===e.post.event_type?a.default.createElement(m,e):null};var a=n(e("react")),o=n(e("../../../utils/escape-html"));function n(e){return e&&e.__esModule?e:{default:e}}var l={pinned_globally:gettext("Thread has been pinned globally."),pinned_locally:gettext("Thread has been pinned locally."),unpinned:gettext("Thread has been unpinned."),approved:gettext("Thread has been approved."),opened:gettext("Thread has been opened."),closed:gettext("Thread has been closed."),unhid:gettext("Thread has been revealed."),hid:gettext("Thread has been made hidden."),tookover:gettext("Took thread over."),owner_left:gettext("Owner has left thread. This thread is now closed."),participant_left:gettext("Participant has left thread.")},i='<a href="%(url)s" class="item-title">%(name)s</a>',u='<span class="item-title">%(name)s</span>';function s(e){var t=(0,o.default)(gettext("Thread title has been changed from %(old_title)s.")),r=interpolate(u,{name:(0,o.default)(e.post.event_context.old_title)},!0),n=interpolate(t,{old_title:r},!0);return a.default.createElement("p",{className:"event-message",dangerouslySetInnerHTML:{__html:n}})}function c(e){var t=(0,o.default)(gettext("Thread has been moved from %(from_category)s.")),r=interpolate(i,{url:(0,o.default)(e.post.event_context.from_category.url),name:(0,o.default)(e.post.event_context.from_category.name)},!0),n=interpolate(t,{from_category:r},!0);return a.default.createElement("p",{className:"event-message",dangerouslySetInnerHTML:{__html:n}})}function f(e){var t=(0,o.default)(gettext("The %(merged_thread)s thread has been merged into this thread.")),r=interpolate(u,{name:(0,o.default)(e.post.event_context.merged_thread)},!0),n=interpolate(t,{merged_thread:r},!0);return a.default.createElement("p",{className:"event-message",dangerouslySetInnerHTML:{__html:n}})}function d(e){var t=(0,o.default)(gettext("Changed thread owner to %(user)s.")),r=interpolate(i,{url:(0,o.default)(e.post.event_context.user.url),name:(0,o.default)(e.post.event_context.user.username)},!0),n=interpolate(t,{user:r},!0);return a.default.createElement("p",{className:"event-message",dangerouslySetInnerHTML:{__html:n}})}function p(e){var t=(0,o.default)(gettext("Added %(user)s to thread.")),r=interpolate(i,{url:(0,o.default)(e.post.event_context.user.url),name:(0,o.default)(e.post.event_context.user.username)},!0),n=interpolate(t,{user:r},!0);return a.default.createElement("p",{className:"event-message",dangerouslySetInnerHTML:{__html:n}})}function m(e){var t=(0,o.default)(gettext("Removed %(user)s from thread.")),r=interpolate(i,{url:(0,o.default)(e.post.event_context.user.url),name:(0,o.default)(e.post.event_context.user.username)},!0),n=interpolate(t,{user:r},!0);return a.default.createElement("p",{className:"event-message",dangerouslySetInnerHTML:{__html:n}})}},{"../../../utils/escape-html":383,react:"react"}],150:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.post.is_read?null:a.default.createElement("div",{className:"row"},a.default.createElement("div",{className:"col-xs-10 col-xs-offset-2 col-sm-9 col-sm-offset-3 text-left"},a.default.createElement("div",{className:"event-label"},a.default.createElement("span",{className:"label label-unread"},gettext("New event")))))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],151:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.ListItem=s,r.default=function(t){return t.posts.isLoaded?n.default.createElement("ul",{className:"posts-list ui-ready"},t.posts.results.map(function(e){return n.default.createElement(s,u({key:e.id,post:e},t))})):n.default.createElement("ul",{className:"posts-list ui-preview"},n.default.createElement(l.default,null))};var n=i(e("react")),a=i(e("./event")),o=i(e("./post")),l=i(e("./post/preview"));function i(e){return e&&e.__esModule?e:{default:e}}function u(){return(u=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function s(e){return e.post.is_event?n.default.createElement(a.default,e):n.default.createElement(o.default,e)}},{"./event":147,"./post":163,"./post/preview":171,react:"react"}],152:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.AttachmentDetails=p,r.AttachmentIcon=f,r.AttachmentPreview=c,r.AttachmentThumbnail=d,r.default=function(e){return a.default.createElement("div",{className:"col-xs-12 col-md-6"},a.default.createElement(c,e),a.default.createElement("div",{className:"post-attachment"},a.default.createElement("a",{href:e.attachment.url.index,className:"attachment-name item-title"},e.attachment.filename),a.default.createElement(p,e)))};var a=n(e("react")),o=(n(e("../../../..")),n(e("../../../../utils/escape-html"))),l=n(e("../../../../utils/file-size"));function n(e){return e&&e.__esModule?e:{default:e}}var i='<abbr title="%(absolute)s">%(relative)s</abbr>',u='<span class="item-title">%(user)s</span>',s='<a href="%(url)s" class="item-title">%(user)s</a>';function c(e){return e.attachment.is_image?a.default.createElement("div",{className:"post-attachment-preview"},a.default.createElement(d,e)):a.default.createElement("div",{className:"post-attachment-preview"},a.default.createElement(f,e))}function f(e){return a.default.createElement("a",{href:e.attachment.url.index,className:"material-icon"},"insert_drive_file")}function d(e){var t=e.attachment.url.thumb||e.attachment.url.index;return a.default.createElement("a",{className:"post-thumbnail",href:e.attachment.url.index,style:{backgroundImage:'url("'+(0,o.default)(t)+'")'}})}function p(e){var t=null,t=e.attachment.url.uploader?interpolate(s,{url:(0,o.default)(e.attachment.url.uploader),user:(0,o.default)(e.attachment.uploader_name)},!0):interpolate(u,{user:(0,o.default)(e.attachment.uploader_name)},!0),r=interpolate(i,{absolute:(0,o.default)(e.attachment.uploaded_on.format("LLL")),relative:(0,o.default)(e.attachment.uploaded_on.fromNow())},!0),n=interpolate((0,o.default)(gettext("%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.")),{filetype:e.attachment.filetype,size:(0,l.default)(e.attachment.size),uploader:t,uploaded_on:r},!0);return a.default.createElement("p",{className:"post-attachment-description",dangerouslySetInnerHTML:{__html:n}})}},{"../../../..":302,"../../../../utils/escape-html":383,"../../../../utils/file-size":384,react:"react"}],153:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Row=u,r.default=function(e){return i(e.post)?n.default.createElement("div",{className:"post-attachments"},(0,a.default)(e.post.attachments,2).map(function(e){var t=e.map(function(e){return e?e.id:0}).join("_");return n.default.createElement(u,{key:t,row:e})})):null},r.isVisible=i;var n=l(e("react")),a=l(e("../../../../utils/batch")),o=l(e("./attachment"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){return(!e.is_hidden||e.acl.can_see_hidden)&&e.attachments}function u(e){return n.default.createElement("div",{className:"row"},e.row.map(function(e){return n.default.createElement(o.default,{attachment:e,key:e?e.id:0})}))}},{"../../../../utils/batch":380,"./attachment":152,react:"react"}],154:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Default=f,r.Hidden=d,r.Invalid=p,r.default=function(e){return e.post.is_hidden&&!e.post.acl.can_see_hidden?a.default.createElement(d,e):e.post.content?a.default.createElement(f,e):a.default.createElement(p,e)};var a=i(e("react")),o=i(e("../waypoint")),n=i(e("../../misago-markup")),l=i(e("../../../utils/escape-html"));function i(e){return e&&e.__esModule?e:{default:e}}var u='<a href="%(url)s" class="item-title">%(user)s</a>',s='<span class="item-title">%(user)s</span>',c='<abbr class="last-title" title="%(absolute)s">%(relative)s</abbr>';function f(e){return a.default.createElement(o.default,{className:"post-body",post:e.post},a.default.createElement(n.default,{markup:e.post.content}))}function d(e){var t=null,t=e.post.hidden_by?interpolate(u,{url:(0,l.default)(e.post.url.hidden_by),user:(0,l.default)(e.post.hidden_by_name)},!0):interpolate(s,{user:(0,l.default)(e.post.hidden_by_name)},!0),r=interpolate(c,{absolute:(0,l.default)(e.post.hidden_on.format("LLL")),relative:(0,l.default)(e.post.hidden_on.fromNow())},!0),n=interpolate((0,l.default)(gettext("Hidden by %(hidden_by)s %(hidden_on)s.")),{hidden_by:t,hidden_on:r},!0);return a.default.createElement(o.default,{className:"post-body post-body-hidden",post:e.post},a.default.createElement("p",{className:"lead"},gettext("This post is hidden. You cannot see its contents.")),a.default.createElement("p",{className:"text-muted",dangerouslySetInnerHTML:{__html:n}}))}function p(e){return a.default.createElement(o.default,{className:"post-body post-body-invalid",post:e.post},a.default.createElement("p",{className:"lead"},gettext("This post's contents cannot be displayed.")),a.default.createElement("p",{className:"text-muted"},gettext("This error is caused by invalid post content manipulation.")))}},{"../../../utils/escape-html":383,"../../misago-markup":60,"../waypoint":173,react:"react"}],155:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.approve=function(e){s.default.dispatch(u.patch(e.post,{is_unapproved:!1}));var t={is_unapproved:e.post.is_unapproved};p(e,[{op:"replace",path:"is-unapproved",value:!1}],t)},r.hide=function(e){s.default.dispatch(u.patch(e.post,{is_hidden:!0,hidden_on:(0,o.default)(),hidden_by_name:e.user.username,url:Object.assign(e.post.url,{hidden_by:e.user.url})}));var t={is_hidden:e.post.is_hidden,hidden_on:e.post.hidden_on,hidden_by_name:e.post.hidden_by_name,url:e.post.url};p(e,[{op:"replace",path:"is-hidden",value:!0}],t)},r.like=function(e){var t=e.post.last_likes||[],r=[e.user].concat(t),n=3<r.length?r.slice(0,-1):r;s.default.dispatch(u.patch(e.post,{is_liked:!0,likes:e.post.likes+1,last_likes:n}));var a={is_liked:e.post.is_liked,likes:e.post.likes,last_likes:e.post.last_likes};p(e,[{op:"replace",path:"is-liked",value:!0}],a)},r.markAsBestAnswer=function(e){var t=e.post,r=e.user;s.default.dispatch(l.update({best_answer:t.id,best_answer_is_protected:t.is_protected,best_answer_marked_on:(0,o.default)(),best_answer_marked_by:r.id,best_answer_marked_by_name:r.username,best_answer_marked_by_slug:r.slug}));var n=[{op:"replace",path:"best-answer",value:t.id},{op:"add",path:"acl",value:!0}],a={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};m(e,n,a)},r.patch=p,r.patchThread=m,r.protect=function(e){s.default.dispatch(u.patch(e.post,{is_protected:!0}));var t={is_protected:e.post.is_protected};p(e,[{op:"replace",path:"is-protected",value:!0}],t)},r.remove=function(t){if(!window.confirm(gettext("Are you sure you want to delete this post? This action is not reversible!")))return;s.default.dispatch(u.patch(t.post,{isDeleted:!0})),n.default.delete(t.post.api.index).then(function(){a.default.success(gettext("Post has been deleted."))},function(e){400===e.status?a.default.error(e.detail):a.default.apiError(e),s.default.dispatch(u.patch(t.post,{isDeleted:!1}))})},r.unhide=function(e){s.default.dispatch(u.patch(e.post,{is_hidden:!1}));var t={is_hidden:e.post.is_hidden};p(e,[{op:"replace",path:"is-hidden",value:!1}],t)},r.unlike=function(t){s.default.dispatch(u.patch(t.post,{is_liked:!1,likes:t.post.likes-1,last_likes:t.post.last_likes.filter(function(e){return!e.id||e.id!==t.user.id})}));var e={is_liked:t.post.is_liked,likes:t.post.likes,last_likes:t.post.last_likes};p(t,[{op:"replace",path:"is-liked",value:!1}],e)},r.unmarkBestAnswer=function(e){var t=e.post;s.default.dispatch(l.update({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}));var r=[{op:"remove",path:"best-answer",value:t.id},{op:"add",path:"acl",value:!0}],n={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};m(e,r,n)},r.unprotect=function(e){s.default.dispatch(u.patch(e.post,{is_protected:!1}));var t={is_protected:e.post.is_protected};p(e,[{op:"replace",path:"is-protected",value:!1}],t)};var o=d(e("moment")),l=f(e("../../../../reducers/thread")),u=f(e("../../../../reducers/post")),n=d(e("../../../../services/ajax")),a=d(e("../../../../services/snackbar")),s=d(e("../../../../services/store"));function c(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(c=function(e){return e?r:t})(e)}function f(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=c(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function d(e){return e&&e.__esModule?e:{default:e}}function p(t,e,r){n.default.patch(t.post.api.index,e).then(function(e){s.default.dispatch(u.patch(t.post,e))},function(e){400===e.status?a.default.error(e.detail[0]):a.default.apiError(e),s.default.dispatch(u.patch(t.post,r))})}function m(e,t,r){n.default.patch(e.thread.api.index,t).then(function(e){e.best_answer_marked_on&&(e.best_answer_marked_on=(0,o.default)(e.best_answer_marked_on)),s.default.dispatch(l.update(e))},function(e){400===e.status?a.default.error(e.detail[0]):a.default.apiError(e),s.default.dispatch(l.update(r))})}},{"../../../../reducers/post":353,"../../../../reducers/thread":360,"../../../../services/ajax":365,"../../../../services/snackbar":376,"../../../../services/store":377,moment:"moment"}],156:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Unprotect=r.UnmarkMarkBestAnswer=r.Unhide=r.Split=r.Protect=r.PostEdits=r.Permalink=r.Move=r.MarkAsBestAnswer=r.Hide=r.Edit=r.Delete=r.Approve=void 0,r.default=function(e){return l.default.createElement("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},l.default.createElement(w,e),l.default.createElement(O,e),l.default.createElement(j,e),l.default.createElement(P,e),l.default.createElement(k,e),l.default.createElement(N,e),l.default.createElement(x,e),l.default.createElement(S,e),l.default.createElement(R,e),l.default.createElement(C,e),l.default.createElement(M,e),l.default.createElement(T,e),l.default.createElement(L,e))};var l=n(e("react")),u=n(e("../../../../services/modal")),s=n(e("../../../../services/posting")),c=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=m(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./actions")),f=n(e("./move")),d=n(e("../../../post-changelog")),p=n(e("./split"));function m(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(m=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function y(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t,r){return t&&a(e.prototype,t),r&&a(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function h(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&o(e,t)}function o(e,t){return(o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=_(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return g(e)}(this,n?(e=_(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _(e){return(_=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function E(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var w=function(){h(o,l.default.Component);var a=v(o);function o(){var t;y(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return E(g(t=a.call.apply(a,[this].concat(r))),"onClick",function(){var e=window.location.protocol+"//";e+=window.location.host,e+=t.props.post.url.index,prompt(gettext("Permament link to this post:"),e)}),t}return b(o,[{key:"render",value:function(){return l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"link"),gettext("Permament link")))}}]),o}();r.Permalink=w;var O=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.default.open({mode:"EDIT",config:e.props.post.api.editor,submit:e.props.post.api.index})}),e}return b(o,[{key:"render",value:function(){return this.props.post.acl.can_edit?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"edit"),gettext("Edit"))):null}}]),o}();r.Edit=O;var j=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.markAsBestAnswer(e.props)}),e}return b(o,[{key:"render",value:function(){var e=this.props,t=e.post,r=e.thread;return!r.acl.can_mark_best_answer||!t.acl.can_mark_as_best_answer||t.id===r.best_answer||r.best_answer&&!r.acl.can_change_best_answer?null:l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"check_box"),gettext("Mark as best answer")))}}]),o}();r.MarkAsBestAnswer=j;var P=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.unmarkBestAnswer(e.props)}),e}return b(o,[{key:"render",value:function(){var e=this.props,t=e.post,r=e.thread;return t.id===r.best_answer&&r.acl.can_unmark_best_answer?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"check_box_outline_blank"),gettext("Unmark best answer"))):null}}]),o}();r.UnmarkMarkBestAnswer=P;var k=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.default.show(l.default.createElement(d.default,{post:e.props.post}))}),e}return b(o,[{key:"render",value:function(){var e=this.props.post.is_hidden&&!this.props.post.acl.can_see_hidden,t=0===this.props.post.edits;if(e||t)return null;var r=ngettext("This post was edited %(edits)s time.","This post was edited %(edits)s times.",this.props.post.edits);interpolate(r,{edits:this.props.post.edits},!0);return l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"edit"),gettext("Changes history")))}}]),o}();r.PostEdits=k;var N=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.approve(e.props)}),e}return b(o,[{key:"render",value:function(){return this.props.post.acl.can_approve&&this.props.post.is_unapproved?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"done"),gettext("Approve"))):null}}]),o}();r.Approve=N;var x=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.default.show(l.default.createElement(f.default,e.props))}),e}return b(o,[{key:"render",value:function(){return this.props.post.acl.can_move?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"arrow_forward"),gettext("Move"))):null}}]),o}();r.Move=x;var S=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.default.show(l.default.createElement(p.default,e.props))}),e}return b(o,[{key:"render",value:function(){return this.props.post.acl.can_move?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"call_split"),gettext("Split"))):null}}]),o}();r.Split=S;var R=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.protect(e.props)}),e}return b(o,[{key:"render",value:function(){return!this.props.post.acl.can_protect||this.props.post.is_protected?null:l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"lock_outline"),gettext("Protect")))}}]),o}();r.Protect=R;var C=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.unprotect(e.props)}),e}return b(o,[{key:"render",value:function(){return this.props.post.acl.can_protect&&this.props.post.is_protected?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"lock_open"),gettext("Remove protection"))):null}}]),o}();r.Unprotect=C;var M=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.hide(e.props)}),e}return b(o,[{key:"render",value:function(){var e=this.props,t=e.post,r=e.thread;return t.id===r.best_answer||!t.acl.can_hide||t.is_hidden?null:l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"visibility_off"),gettext("Hide")))}}]),o}();r.Hide=M;var T=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.unhide(e.props)}),e}return b(o,[{key:"render",value:function(){return this.props.post.acl.can_unhide&&this.props.post.is_hidden?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"visibility"),gettext("Unhide"))):null}}]),o}();r.Unhide=T;var L=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.remove(e.props)}),e}return b(o,[{key:"render",value:function(){var e=this.props,t=e.post,r=e.thread;return t.id!==r.best_answer&&t.acl.can_delete?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"clear"),gettext("Delete"))):null}}]),o}();r.Delete=L},{"../../../../services/modal":371,"../../../../services/posting":375,"../../../post-changelog":119,"./actions":155,"./move":158,"./split":159,react:"react"}],157:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement("div",{className:"pull-right dropdown"},n.default.createElement("button",{"aria-expanded":"true","aria-haspopup":"true",className:"btn btn-default btn-icon dropdown-toggle","data-toggle":"dropdown",type:"button"},n.default.createElement("span",{className:"material-icon"},"expand_more")),n.default.createElement(a.default,e))};var n=o(e("react")),a=o(e("./dropdown"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./dropdown":156,react:"react"}],158:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ModalHeader=_,r.default=void 0;var n=o(e("react")),a=(o(e("../../../button")),o(e("../../../form"))),u=o(e("../../../form-group")),s=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=m(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../../reducers/post")),c=o(e("../../../../services/ajax")),f=o(e("../../../../services/modal")),d=o(e("../../../../services/snackbar")),p=o(e("../../../../services/store"));function m(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(m=function(e){return e?r:t})(e)}function o(e){return e&&e.__esModule?e:{default:e}}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(l,a.default);var e,t,r,o=h(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=v(t),a=function(e){t.changeValue("url",e.target.value)},(n="onUrlChange")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1,url:"",validators:{url:[]},errors:{}},t}return e=l,(t=[{key:"clean",value:function(){return!!this.state.url.trim().length||(d.default.error(gettext("You have to enter link to the other thread.")),!1)}},{key:"send",value:function(){return c.default.post(this.props.thread.api.posts.move,{new_thread:this.state.url,posts:[this.props.post.id]})}},{key:"handleSuccess",value:function(){p.default.dispatch(s.patch(this.props.post,{isDeleted:!0})),f.default.hide(),d.default.success(gettext("Selected post was moved to the other thread."))}},{key:"handleError",value:function(e){400===e.status?d.default.error(e.detail):d.default.apiError(e)}},{key:"render",value:function(){return n.default.createElement("div",{className:"modal-dialog",role:"document"},n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"modal-content"},n.default.createElement(_,null),n.default.createElement("div",{className:"modal-body"},n.default.createElement(u.default,{for:"id_url",label:gettext("Link to thread you want to move post to")},n.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,id:"id_url",onChange:this.onUrlChange,value:this.state.url}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("button",{className:"btn btn-primary",loading:this.state.isLoading},gettext("Move post"))))))}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function _(e){return n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Move post")))}r.default=g},{"../../../../reducers/post":353,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../button":8,"../../../form":56,"../../../form-group":55,react:"react"}],159:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Error=M,r.Loader=C,r.Modal=T,r.PostingConfig=r.ModerationForm=void 0,r.default=function(e){return a.default.createElement(S,x({},e,{Form:R}))};var a=g(e("react")),n=g(e("../../../button")),u=g(e("../../../form")),s=g(e("../../../form-group")),c=g(e("../../../category-select")),o=g(e("../../../modal-loader")),f=g(e("../../../select")),d=l(e("../../../../reducers/post")),p=g(e("../../../../services/ajax")),m=g(e("../../../../services/modal")),y=g(e("../../../../services/snackbar")),b=g(e("../../../../services/store")),h=l(e("../../../../utils/validators"));function v(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(v=function(e){return e?r:t})(e)}function l(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=v(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function g(e){return e&&e.__esModule?e:{default:e}}function _(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function E(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function w(e,t,r){return t&&E(e.prototype,t),r&&E(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function O(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&j(e,t)}function j(e,t){return(j=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function P(r){var 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}}();return function(){var e,t=N(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return k(e)}(this,n?(e=N(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function k(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function N(e){return(N=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function x(){return(x=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}var S=function(){O(n,a.default.Component);var r=P(n);function n(e){var t;return _(this,n),(t=r.call(this,e)).state={isLoaded:!1,isError:!1,categories:[]},t}return w(n,[{key:"componentDidMount",value:function(){var r=this;p.default.get(misago.get("THREAD_EDITOR_API")).then(function(e){var t=e.map(function(e){return Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id,post:e.post})});r.setState({isLoaded:!0,categories:t})},function(e){r.setState({isError:e.detail})})}},{key:"render",value:function(){return this.state.isError?a.default.createElement(M,{message:this.state.isError}):this.state.isLoaded?a.default.createElement(R,x({},this.props,{categories:this.state.categories})):a.default.createElement(C,null)}}]),n}();r.PostingConfig=S;var R=function(){O(l,u.default);var o=P(l);function l(e){var n,t,r,a;return _(this,l),n=o.call(this,e),t=k(n),a=function(e){var t=e.target.value,r={category:t};n.acl[t].can_pin_threads<r.weight&&(r.weight=0),n.acl[t].can_hide_threads||(r.is_hidden=0),n.acl[t].can_close_threads||(r.is_closed=!1),n.setState(r)},(r="onCategoryChange")in t?Object.defineProperty(t,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[r]=a,n.state={isLoading:!1,title:"",category:null,categories:e.categories,weight:0,is_hidden:0,is_closed:!1,validators:{title:[h.required()]},errors:{}},n.isHiddenChoices=[{value:0,icon:"visibility",label:gettext("No")},{value:1,icon:"visibility_off",label:gettext("Yes")}],n.isClosedChoices=[{value:!1,icon:"lock_outline",label:gettext("No")},{value:!0,icon:"lock",label:gettext("Yes")}],n.acl={},n.props.categories.forEach(function(e){e.post&&(n.state.category||(n.state.category=e.id),n.acl[e.id]={can_pin_threads:e.post.pin,can_close_threads:e.post.close,can_hide_threads:e.post.hide})}),n}return w(l,[{key:"clean",value:function(){return!!this.isValid()||(y.default.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}},{key:"send",value:function(){return p.default.post(this.props.thread.api.posts.split,{title:this.state.title,category:this.state.category,weight:this.state.weight,is_hidden:this.state.is_hidden,is_closed:this.state.is_closed,posts:[this.props.post.id]})}},{key:"handleSuccess",value:function(){b.default.dispatch(d.patch(this.props.post,{isDeleted:!0})),m.default.hide(),y.default.success(gettext("Selected post was split into new thread."))}},{key:"handleError",value:function(e){400===e.status?(this.setState({errors:Object.assign({},this.state.errors,e)}),y.default.error(gettext("Form contains errors."))):y.default.apiError(e)}},{key:"getWeightChoices",value:function(){var e=[{value:0,icon:"remove",label:gettext("Not pinned")},{value:1,icon:"bookmark_border",label:gettext("Pinned locally")}];return 2==this.acl[this.state.category].can_pin_threads&&e.push({value:2,icon:"bookmark",label:gettext("Pinned globally")}),e}},{key:"renderWeightField",value:function(){return this.acl[this.state.category].can_pin_threads?a.default.createElement(s.default,{label:gettext("Thread weight"),for:"id_weight",labelClass:"col-sm-4",controlClass:"col-sm-8"},a.default.createElement(f.default,{id:"id_weight",onChange:this.bindInput("weight"),value:this.state.weight,choices:this.getWeightChoices()})):null}},{key:"renderHiddenField",value:function(){return this.acl[this.state.category].can_hide_threads?a.default.createElement(s.default,{label:gettext("Hide thread"),for:"id_is_hidden",labelClass:"col-sm-4",controlClass:"col-sm-8"},a.default.createElement(f.default,{id:"id_is_closed",onChange:this.bindInput("is_hidden"),value:this.state.is_hidden,choices:this.isHiddenChoices})):null}},{key:"renderClosedField",value:function(){return this.acl[this.state.category].can_close_threads?a.default.createElement(s.default,{label:gettext("Close thread"),for:"id_is_closed",labelClass:"col-sm-4",controlClass:"col-sm-8"},a.default.createElement(f.default,{id:"id_is_closed",onChange:this.bindInput("is_closed"),value:this.state.is_closed,choices:this.isClosedChoices})):null}},{key:"render",value:function(){return a.default.createElement(T,{className:"modal-dialog"},a.default.createElement("form",{onSubmit:this.handleSubmit},a.default.createElement("div",{className:"modal-body"},a.default.createElement(s.default,{label:gettext("Thread title"),for:"id_title",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.title},a.default.createElement("input",{id:"id_title",className:"form-control",type:"text",onChange:this.bindInput("title"),value:this.state.title})),a.default.createElement("div",{className:"clearfix"}),a.default.createElement(s.default,{label:gettext("Category"),for:"id_category",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.category},a.default.createElement(c.default,{id:"id_category",onChange:this.onCategoryChange,value:this.state.category,choices:this.state.categories})),a.default.createElement("div",{className:"clearfix"}),this.renderWeightField(),this.renderHiddenField(),this.renderClosedField()),a.default.createElement("div",{className:"modal-footer"},a.default.createElement(n.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Split post")))))}}]),l}();function C(){return a.default.createElement(T,{className:"modal-dialog"},a.default.createElement(o.default,null))}function M(e){return a.default.createElement(T,{className:"modal-dialog modal-message"},a.default.createElement("div",{className:"message-icon"},a.default.createElement("span",{className:"material-icon"},"info_outline")),a.default.createElement("div",{className:"message-body"},a.default.createElement("p",{className:"lead"},gettext("You can't move this post at the moment.")),a.default.createElement("p",null,e.message)))}function T(e){return a.default.createElement("div",{className:e.className,role:"document"},a.default.createElement("div",{className:"modal-content"},a.default.createElement("div",{className:"modal-header"},a.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},a.default.createElement("span",{"aria-hidden":"true"},"×")),a.default.createElement("h4",{className:"modal-title"},gettext("Split post into new thread"))),e.children))}r.ModerationForm=R},{"../../../../reducers/post":353,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../../utils/validators":393,"../../../button":8,"../../../category-select":21,"../../../form":56,"../../../form-group":55,"../../../modal-loader":61,"../../../select":210,react:"react"}],160:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.FlagBestAnswer=function(e){var t=e.post,r=e.thread,n=e.user;if(!l(t)||t.id!==r.best_answer)return null;var a=null;a=n.id&&r.best_answer_marked_by===n.id?interpolate(gettext("Marked as best answer by you %(marked_on)s."),{marked_on:r.best_answer_marked_on.fromNow()},!0):interpolate(gettext("Marked as best answer by %(marked_by)s %(marked_on)s."),{marked_by:r.best_answer_marked_by_name,marked_on:r.best_answer_marked_on.fromNow()},!0);return o.default.createElement("div",{className:"post-status-message post-status-best-answer"},o.default.createElement("span",{className:"material-icon"},"check_box"),o.default.createElement("p",null,a))},r.FlagHidden=function(e){return l(e.post)&&e.post.is_hidden?o.default.createElement("div",{className:"post-status-message post-status-hidden"},o.default.createElement("span",{className:"material-icon"},"visibility_off"),o.default.createElement("p",null,gettext("This post is hidden. Only users with permission may see its contents."))):null},r.FlagProtected=function(e){return l(e.post)&&e.post.is_protected?o.default.createElement("div",{className:"post-status-message post-status-protected visible-xs-block"},o.default.createElement("span",{className:"material-icon"},"lock_outline"),o.default.createElement("p",null,gettext("This post is protected. Only moderators may change it."))):null},r.FlagUnapproved=function(e){return l(e.post)&&e.post.is_unapproved?o.default.createElement("div",{className:"post-status-message post-status-unapproved"},o.default.createElement("span",{className:"material-icon"},"remove_circle_outline"),o.default.createElement("p",null,gettext("This post is unapproved. Only users with permission to approve posts and its author may see its contents."))):null},r.isVisible=l;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e){return!e.is_hidden||e.acl.can_see_hidden}},{react:"react"}],161:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Reply=r.MarkAsBestAnswerCompact=r.MarkAsBestAnswer=r.LikesCompact=r.Likes=r.Like=r.Edit=void 0,r.default=function(e){return E(e.post)?l.default.createElement("div",{className:"post-footer"},l.default.createElement(w,e),l.default.createElement(O,e),l.default.createElement(j,e),l.default.createElement(P,_({lastLikes:e.post.last_likes,likes:e.post.likes},e)),l.default.createElement(k,_({likes:e.post.likes},e)),l.default.createElement(x,e),l.default.createElement(S,e)):null},r.getLikesMessage=N,r.isVisible=E;var l=n(e("react")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./controls/actions")),s=n(e("../../post-likes")),c=n(e("../../../services/modal")),f=n(e("../../../services/posting"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t,r){return t&&a(e.prototype,t),r&&a(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function y(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&o(e,t)}function o(e,t){return(o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=v(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=v(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function g(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _(){return(_=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function E(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)}var w=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.markAsBestAnswer(e.props)}),e}return m(o,[{key:"render",value:function(){var e=this.props,t=e.post,r=e.thread;return!r.acl.can_mark_best_answer||!t.acl.can_mark_as_best_answer||r.best_answer&&!r.acl.can_change_best_answer?null:l.default.createElement("button",{className:"hidden-xs btn btn-default btn-sm pull-left",disabled:this.props.post.isBusy||t.id===r.best_answer,onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"check_box"),gettext("Best answer"))}}]),o}();r.MarkAsBestAnswer=w;var O=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.markAsBestAnswer(e.props)}),e}return m(o,[{key:"render",value:function(){var e=this.props,t=e.post,r=e.thread;return!r.acl.can_mark_best_answer||!t.acl.can_mark_as_best_answer||r.best_answer&&!r.acl.can_change_best_answer?null:l.default.createElement("button",{className:"visible-xs-inline-block btn btn-default btn-sm pull-left",disabled:this.props.post.isBusy||t.id===r.best_answer,onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"check_box"))}}]),o}();r.MarkAsBestAnswerCompact=O;var j=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){e.props.post.is_liked?u.unlike(e.props):u.like(e.props)}),e}return m(o,[{key:"render",value:function(){if(!this.props.post.acl.can_like)return null;var e="btn btn-default btn-sm pull-left";return this.props.post.is_liked&&(e="btn btn-success btn-sm pull-left"),l.default.createElement("button",{className:e,disabled:this.props.post.isBusy,onClick:this.onClick,type:"button"},this.props.post.is_liked?gettext("Liked"):gettext("Like"))}}]),o}();r.Like=j;var P=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.default.show(l.default.createElement(s.default,{post:e.props.post}))}),e}return m(o,[{key:"render",value:function(){var e=0<(this.props.post.last_likes||[]).length;return this.props.post.acl.can_see_likes&&e?2===this.props.post.acl.can_see_likes?l.default.createElement("button",{className:"btn btn-link btn-sm pull-left hidden-xs",onClick:this.onClick,type:"button"},N(this.props.likes,this.props.lastLikes)):l.default.createElement("p",{className:"pull-left hidden-xs"},N(this.props.likes,this.props.lastLikes)):null}}]),o}();r.Likes=P;var k=function(){y(t,P);var e=b(t);function t(){return p(this,t),e.apply(this,arguments)}return m(t,[{key:"render",value:function(){var e=0<(this.props.post.last_likes||[]).length;return this.props.post.acl.can_see_likes&&e?2===this.props.post.acl.can_see_likes?l.default.createElement("button",{className:"btn btn-link btn-sm likes-compact pull-left visible-xs-block",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"favorite"),this.props.likes):l.default.createElement("p",{className:"likes-compact pull-left visible-xs-block"},l.default.createElement("span",{className:"material-icon"},"favorite"),this.props.likes):null}}]),t}();function N(e,t){var r=t.slice(0,3).map(function(e){return e.username});if(1==r.length)return interpolate(gettext("%(user)s likes this."),{user:r[0]},!0);var n=e-r.length,a=r.slice(0,-1).join(", "),o=r.slice(-1)[0],l=interpolate(gettext("%(users)s and %(last_user)s"),{users:a,last_user:o},!0);if(0==n)return interpolate(gettext("%(users)s like this."),{users:l},!0);var i=ngettext("%(users)s and %(likes)s other user like this.","%(users)s and %(likes)s other users like this.",n);return interpolate(i,{users:r.join(", "),likes:n},!0)}r.LikesCompact=k;var x=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){f.default.open({mode:"REPLY",config:e.props.thread.api.editor,submit:e.props.thread.api.posts.index,context:{reply:e.props.post.id}})}),e}return m(o,[{key:"render",value:function(){return this.props.post.acl.can_reply?l.default.createElement("button",{className:"btn btn-primary btn-sm pull-right",type:"button",onClick:this.onClick},gettext("Reply")):null}}]),o}();r.Reply=x;var S=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){f.default.open({mode:"EDIT",config:e.props.post.api.editor,submit:e.props.post.api.index})}),e}return m(o,[{key:"render",value:function(){return this.props.post.acl.can_edit?l.default.createElement("button",{className:"hidden-xs btn btn-default btn-sm pull-right",type:"button",onClick:this.onClick},gettext("Edit")):null}}]),o}();r.Edit=S},{"../../../services/modal":371,"../../../services/posting":375,"../../post-likes":132,"./controls/actions":155,react:"react"}],162:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.PostEditsCompacts=r.PostEdits=void 0,r.PostedOn=_,r.PostedOnCompact=E,r.ProtectedLabel=j,r.UnreadCompact=g,r.UnreadLabel=v,r.default=function(e){return s.default.createElement("div",{className:"post-heading"},s.default.createElement(v,e),s.default.createElement(g,e),s.default.createElement(_,e),s.default.createElement(E,e),s.default.createElement(w,e),s.default.createElement(O,e),s.default.createElement(j,e),s.default.createElement(o.default,e),s.default.createElement(n.default,e))};var s=l(e("react")),n=l(e("./controls")),o=l(e("./select")),c=(e("../../user-status"),l(e("../../post-changelog"))),f=l(e("../../../services/modal"));function l(e){return e&&e.__esModule?e:{default:e}}function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t,r){return t&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function m(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function y(r){var 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}}();return function(){var e,t=h(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return b(e)}(this,n?(e=h(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function b(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function h(e){return(h=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function v(e){return e.post.is_read?null:s.default.createElement("span",{className:"label label-unread hidden-xs"},gettext("New post"))}function g(e){return e.post.is_read?null:s.default.createElement("span",{className:"label label-unread visible-xs-inline-block"},gettext("New"))}function _(e){var t=interpolate(gettext("posted %(posted_on)s"),{posted_on:e.post.posted_on.format("LL, LT")},!0);return s.default.createElement("a",{href:e.post.url.index,className:"btn btn-link posted-on hidden-xs",title:t},e.post.posted_on.fromNow())}function E(e){return s.default.createElement("a",{href:e.post.url.index,className:"btn btn-link posted-on visible-xs-inline-block"},e.post.posted_on.fromNow(!0))}var w=function(){m(u,s.default.Component);var i=y(u);function u(){var e;d(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=b(e),n=function(){f.default.show(s.default.createElement(c.default,{post:e.props.post}))},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return p(u,[{key:"render",value:function(){var e=this.props.post.is_hidden&&!this.props.post.acl.can_see_hidden,t=0===this.props.post.edits;if(e||t)return null;var r=ngettext("This post was edited %(edits)s time.","This post was edited %(edits)s times.",this.props.post.edits),n=interpolate(r,{edits:this.props.post.edits},!0),a=ngettext("edited %(edits)s time","edited %(edits)s times",this.props.post.edits);return s.default.createElement("button",{className:"btn btn-link btn-see-edits hidden-xs",onClick:this.onClick,title:n,type:"button"},interpolate(a,{edits:this.props.post.edits},!0))}}]),u}();r.PostEdits=w;var O=function(){m(t,w);var e=y(t);function t(){return d(this,t),e.apply(this,arguments)}return p(t,[{key:"render",value:function(){var e=this.props.post.is_hidden&&!this.props.post.acl.can_see_hidden,t=0===this.props.post.edits;if(e||t)return null;var r=ngettext("%(edits)s edit","%(edits)s edits",this.props.post.edits);return s.default.createElement("button",{className:"btn btn-link btn-see-edits visible-xs-inline-block",onClick:this.onClick,type:"button"},interpolate(r,{edits:this.props.post.edits},!0))}}]),t}();function j(e){var t=e.post.poster&&e.post.poster.id===e.user.id,r=e.post.acl.can_protect;return e.user.id&&e.post.is_protected&&(t||r)?s.default.createElement("span",{className:"label label-protected hidden-xs",title:gettext("This post is protected and may not be edited.")},s.default.createElement("span",{className:"material-icon"},"lock_outline"),gettext("protected")):null}r.PostEditsCompacts=O},{"../../../services/modal":371,"../../post-changelog":119,"../../user-status":274,"./controls":157,"./select":172,react:"react"}],163:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t="post";e.post.isDeleted?t="hide":e.post.is_hidden&&!e.post.acl.can_see_hidden&&(t="post post-hidden");e.post.poster&&e.post.poster.rank.css_class&&(t+=" post-"+e.post.poster.rank.css_class);e.post.is_read||(t+=" post-new");return n.default.createElement("li",{id:"post-"+e.post.id,className:t},n.default.createElement("div",{className:"panel panel-default panel-post"},n.default.createElement("div",{className:"panel-body"},n.default.createElement("div",{className:"row"},n.default.createElement(s.default,e),n.default.createElement("div",{className:"col-xs-12 col-md-9"},n.default.createElement(u.default,e),n.default.createElement(l.FlagBestAnswer,e),n.default.createElement(l.FlagUnapproved,e),n.default.createElement(l.FlagProtected,e),n.default.createElement(l.FlagHidden,e),n.default.createElement(o.default,e),n.default.createElement(a.default,e),n.default.createElement(i.default,e))))))};var n=c(e("react")),a=c(e("./attachments")),o=c(e("./body")),l=e("./flags"),i=c(e("./footer")),u=c(e("./header")),s=c(e("./post-side"));function c(e){return e&&e.__esModule?e:{default:e}}},{"./attachments":153,"./body":154,"./flags":160,"./footer":161,"./header":162,"./post-side":166,react:"react"}],164:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post,r=e.thread;return n.default.createElement("div",{className:"col-xs-12 col-md-3 post-side post-side-anonymous"},n.default.createElement(l.default,{post:t,thread:r}),n.default.createElement(o.default,{post:t,thread:r}),n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left"},n.default.createElement("span",null,n.default.createElement(a.default,{className:"poster-avatar",size:100}))),n.default.createElement("div",{className:"media-body"},n.default.createElement("span",{className:"media-heading item-title"},t.poster_name),n.default.createElement("span",{className:"user-title user-title-anonymous"},gettext("Removed user")))))};var n=s(e("react")),a=s(e("../../../avatar")),o=s(e("../controls")),l=s(e("../select"));(function(e,t){if(!t&&e&&e.__esModule)return;if(null===e||"object"!==i(e)&&"function"!=typeof e)return;var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n)})(e("../../../user-status")),s(e("./user-postcount")),s(e("./user-title"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e){return e&&e.__esModule?e:{default:e}}},{"../../../avatar":6,"../../../user-status":274,"../controls":157,"../select":172,"./user-postcount":168,"./user-title":170,react:"react"}],165:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.title,r=e.rank;return r.is_tab||!!t||!!r.title}},{}],166:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){if(e.post.poster)return n.default.createElement(o.default,e);return n.default.createElement(a.default,e)};var n=l(e("react")),a=l(e("./anonymous")),o=l(e("./registered"));function l(e){return e&&e.__esModule?e:{default:e}}},{"./anonymous":164,"./registered":167,react:"react"}],167:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post,r=e.thread,n=t.poster;return a.default.createElement("div",{className:"col-xs-12 col-md-3 post-side post-side-registered"},a.default.createElement(u.default,{post:t,thread:r}),a.default.createElement(l.default,{post:t,thread:r}),a.default.createElement("div",{className:"media"},a.default.createElement("div",{className:"media-left"},a.default.createElement("a",{href:n.url},a.default.createElement(o.default,{className:"poster-avatar",size:100,user:n}))),a.default.createElement("div",{className:"media-body"},a.default.createElement("div",{className:"media-heading"},a.default.createElement("a",{className:"item-title",href:n.url},n.username),a.default.createElement(s.default,{status:n.status},a.default.createElement(s.StatusIcon,{status:n.status}))),a.default.createElement(d.default,{rank:n.rank,title:n.title}),a.default.createElement(f.default,{poster:n}),a.default.createElement(c.default,{poster:n}))))};var a=n(e("react")),o=n(e("../../../avatar")),l=n(e("../controls")),u=n(e("../select")),s=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=p(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../user-status")),c=n(e("./user-postcount")),f=n(e("./user-status")),d=n(e("./user-title"));function p(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(p=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}},{"../../../avatar":6,"../../../user-status":274,"../controls":157,"../select":172,"./user-postcount":168,"./user-status":169,"./user-title":170,react:"react"}],168:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.poster,r=ngettext("%(posts)s post","%(posts)s posts",t.posts),n="user-postcount";(0,o.default)(t)&&(n+=" hidden-xs hidden-sm");return a.default.createElement("span",{className:n},interpolate(r,{posts:t.posts},!0))};var a=n(e("react")),o=n(e("./has-visible-title"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./has-visible-title":165,react:"react"}],169:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.poster,r="hidden-xs";(0,o.default)(t)&&(r+=" hidden-sm");return n.default.createElement("span",{className:r},n.default.createElement(a.default,{status:t.status},n.default.createElement(a.StatusLabel,{status:t.status,user:t})))};var n=l(e("react")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../user-status")),o=l(e("./has-visible-title"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}},{"../../../user-status":274,"./has-visible-title":165,react:"react"}],170:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.rank,r=e.title||t.title;!r&&t.is_tab&&(r=t.name);if(!r)return null;var n="user-title";t.css_class&&(n+=" user-title-"+t.css_class);if(t.is_tab)return a.default.createElement("div",{className:n},a.default.createElement("a",{href:t.url},r));return a.default.createElement("div",{className:n},r)};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],171:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement("li",{className:"post"},n.default.createElement("div",{className:"post-border"},n.default.createElement("div",{className:"post-avatar"},n.default.createElement(a.default,{size:"100"})),n.default.createElement("div",{className:"post-body"},n.default.createElement("div",{className:"panel panel-default panel-post"},n.default.createElement("div",{className:"panel-heading post-heading"},n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,100)+"px"}}," "),n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,100)+"px"}}," ")),n.default.createElement("div",{className:"panel-body"},n.default.createElement("article",{className:"misago-markup"},n.default.createElement("p",{className:"ui-preview-text",style:{width:o.int(50,100)+"%"}}," "),n.default.createElement("p",{className:"ui-preview-text",style:{width:o.int(50,100)+"%"}}," "),n.default.createElement("p",{className:"ui-preview-text",style:{width:o.int(50,100)+"%"}}," ")))))))};var n=l(e("react")),a=l(e("../../avatar")),o=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/random"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}},{"../../../utils/random":388,"../../avatar":6,react:"react"}],172:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.isVisible=y;var n=a(e("react")),s=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/posts")),c=a(e("../../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function a(e){return e&&e.__esModule?e:{default:e}}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function l(e,t){return(l=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=p(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=p(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function p(e){return(p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var m=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&l(e,t)}(u,n.default.Component);var e,t,r,i=f(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=d(e),n=function(){e.props.post.isSelected?c.default.dispatch(s.deselect(e.props.post)):c.default.dispatch(s.select(e.props.post))},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return this.props.thread.acl.can_merge_posts||y(this.props.post.acl)?n.default.createElement("div",{className:"pull-right hidden-xs"},n.default.createElement("button",{className:"btn btn-default btn-icon",onClick:this.onClick,type:"button"},n.default.createElement("span",{className:"material-icon"},this.props.post.isSelected?"check_box":"check_box_outline_blank"))):null}}])&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();function y(e){return e.can_approve||e.can_hide||e.can_protect||e.can_unhide||e.can_delete||e.can_move}r.default=m},{"../../../reducers/posts":354,"../../../services/store":377,react:"react"}],173:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=a(e("react")),l=n(e("../../reducers/post")),u=n(e("../../reducers/thread")),s=a(e("../../services/ajax")),c=a(e("../../services/snackbar")),f=a(e("../../services/store"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function n(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function a(e){return e&&e.__esModule?e:{default:e}}function p(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t){return(m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function y(r){var 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}}();return function(){var e,t=b(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=b(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function b(e){return(b=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&m(e,t)}(a,o.default.Component);var e,t,r,n=y(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"componentDidMount",value:function(){var n=this;this.props.post.is_read||$(this.documentNode).waypoint({handler:function(e){"down"!==e||n.props.post.is_read||window.setTimeout(function(){var e=n.documentNode.getBoundingClientRect(),t=e.height+e.top,r=document.documentElement.clientHeight;t<5||r<t||(f.default.dispatch(l.patch(n.props.post,{is_read:!0})),s.default.post(n.props.post.api.read).then(function(e){f.default.dispatch(u.update(n.props.thread,{is_read:e.thread_is_read}))},function(e){c.default.apiError(e)}))},1e3)},offset:"bottom-in-view"})}},{key:"render",value:function(){var t=this;return o.default.createElement("div",{className:this.props.className,ref:function(e){t.documentNode=e}},this.props.children)}}])&&p(e.prototype,t),r&&p(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h},{"../../reducers/post":353,"../../reducers/thread":360,"../../services/ajax":365,"../../services/snackbar":376,"../../services/store":377,react:"react"}],174:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("moment")),l=n(e("react")),i=n(e("../panel-loader")),u=n(e("../panel-message")),s=n(e("../..")),c=n(e("../../services/polls")),f=n(e("../../services/page-title"));function n(e){return e&&e.__esModule?e:{default:e}}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=b(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=b(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function b(e){return(b=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function h(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var v=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(a,l.default.Component);var e,t,r,n=m(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),h(y(t=n.call(this,e)),"update",function(e){e.expires_on&&(e.expires_on=(0,o.default)(e.expires_on)),t.setState({isLoaded:!0,error:null,ban:e})}),h(y(t),"error",function(e){t.setState({isLoaded:!0,error:e.detail,ban:null})}),s.default.has("PROFILE_BAN")?t.initWithPreloadedData(s.default.pop("PROFILE_BAN")):t.initWithoutPreloadedData(),t.startPolling(e.profile.api.ban),t}return e=a,(t=[{key:"initWithPreloadedData",value:function(e){e.expires_on&&(e.expires_on=(0,o.default)(e.expires_on)),this.state={isLoaded:!0,ban:e}}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1}}},{key:"startPolling",value:function(e){c.default.start({poll:"ban-details",url:e,frequency:9e4,update:this.update,error:this.error})}},{key:"componentDidMount",value:function(){f.default.set({title:gettext("Ban details"),parent:this.props.profile.username})}},{key:"componentWillUnmount",value:function(){c.default.stop("ban-details")}},{key:"getUserMessage",value:function(){return this.state.ban.user_message?l.default.createElement("div",{className:"panel-body ban-message ban-user-message"},l.default.createElement("h4",null,gettext("User-shown ban message")),l.default.createElement("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.state.ban.user_message.html}})):null}},{key:"getStaffMessage",value:function(){return this.state.ban.staff_message?l.default.createElement("div",{className:"panel-body ban-message ban-staff-message"},l.default.createElement("h4",null,gettext("Team-shown ban message")),l.default.createElement("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((0,o.default)())){var e=interpolate(gettext("This ban expires on %(expires_on)s."),{expires_on:this.state.ban.expires_on.format("LL, LT")},!0),t=interpolate(gettext("This ban expires %(expires_on)s."),{expires_on:this.state.ban.expires_on.fromNow()},!0);return l.default.createElement("abbr",{title:e},t)}return gettext("This ban has expired.")}return interpolate(gettext("%(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?l.default.createElement("div",null,this.getUserMessage(),this.getStaffMessage(),l.default.createElement("div",{className:"panel-body ban-expires"},l.default.createElement("h4",null,gettext("Ban expiration")),l.default.createElement("p",{className:"lead"},this.getExpirationMessage()))):l.default.createElement("div",null,l.default.createElement(u.default,{message:gettext("No ban is active at the moment.")})):this.state.error?l.default.createElement("div",null,l.default.createElement(u.default,{icon:"error_outline",message:this.state.error})):l.default.createElement("div",null,l.default.createElement(i.default,null))}},{key:"render",value:function(){return l.default.createElement("div",{className:"profile-ban-details"},l.default.createElement("div",{className:"panel panel-default"},l.default.createElement("div",{className:"panel-heading"},l.default.createElement("h3",{className:"panel-title"},gettext("Ban details"))),this.getPanelBody()))}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=v},{"../..":302,"../../services/page-title":373,"../../services/polls":374,"../panel-loader":93,"../panel-message":94,moment:"moment",react:"react"}],175:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.isAuthenticated,r=e.profile,n=null;n=t?gettext("You are not sharing any details with others."):interpolate(gettext("%(username)s is not sharing any details with others."),{username:r.username},!0);return a.default.createElement("div",{className:"panel panel-default"},a.default.createElement("div",{className:"panel-body text-center lead"},n))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],176:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SafeValue=o,r.default=function(e){var t=e.html,r=e.text,n=e.url;if(t)return a.default.createElement("div",{className:"form-control-static col-md-9",dangerouslySetInnerHTML:{__html:t}});return a.default.createElement("div",{className:"form-control-static col-md-9"},a.default.createElement(o,{text:r,url:n}))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){var t=e.text,r=e.url;return r?a.default.createElement("p",null,a.default.createElement("a",{href:r,target:"_blank",rel:"nofollow"},t||r)):t?a.default.createElement("p",null,t):null}},{react:"react"}],177:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement("div",{className:"form-group"},n.default.createElement("strong",{className:"control-label col-md-3"},e.name,":"),n.default.createElement(a.default,e))};var n=o(e("react")),a=o(e("./field-value"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./field-value":176,react:"react"}],178:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.api,r=e.display,n=e.onCancel,a=e.onSuccess;return r?o.default.createElement(l.default,{api:t,onCancel:n,onSuccess:a}):null};var o=n(e("react")),l=n(e("../../edit-details"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../../edit-details":32,react:"react"}],179:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.fields,r=e.name;return l.default.createElement("div",{className:"panel panel-default panel-profile-details-group"},l.default.createElement("div",{className:"panel-heading"},l.default.createElement("h3",{className:"panel-title"},r)),l.default.createElement("div",{className:"panel-body"},l.default.createElement("div",{className:"form-horizontal"},t.map(function(e){var t=e.fieldname,r=e.html,n=e.name,a=e.text,o=e.url;return l.default.createElement(i.default,{key:t,name:n,html:r,text:a,url:o})}))))};var l=n(e("react")),i=n(e("./field"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./field":177,react:"react"}],180:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.display,r=e.groups,n=e.isAuthenticated,a=e.loading,o=e.profile;if(!t)return null;if(a)return l.default.createElement(s.default,null);return r.length?l.default.createElement("div",null,r.map(function(e,t){return l.default.createElement(u.default,{fields:e.fields,key:t,name:e.name})})):l.default.createElement(i.default,{isAuthenticated:n,profile:o})};var l=n(e("react")),i=n(e("./empty-message")),u=n(e("./group")),s=n(e("../../loader"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../../loader":58,"./empty-message":175,"./group":179,react:"react"}],181:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.EditButton=o,r.default=function(e){var t=e.onEdit,r=e.showEditButton;return a.default.createElement("div",null,a.default.createElement("nav",{className:"toolbar"},a.default.createElement("div",{className:"row"},a.default.createElement("div",{className:"col-sm-8 col-md-10"},a.default.createElement("h3",{className:"md-margin-top-no"},gettext("Details"))),a.default.createElement(o,{onEdit:t,showEditButton:r}))))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){var t=e.onEdit;return e.showEditButton?a.default.createElement("div",{className:"col-sm-4 col-md-2"},a.default.createElement("button",{className:"btn btn-default btn-outline btn-block",onClick:t,type:"button"},gettext("Edit"))):null}},{react:"react"}],182:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var l=n(e("react")),i=n(e("./form")),u=n(e("./groups-list")),s=n(e("./header")),c=n(e("../../../data/profile-details")),f=e("../../../reducers/profile-details"),o=n(e("../../../services/page-title")),d=n(e("../../../services/snackbar"));function n(e){return e&&e.__esModule?e:{default:e}}function p(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t){return(m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function y(r){var 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}}();return function(){var e,t=h(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return b(e)}(this,n?(e=h(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function b(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function h(e){return(h=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function v(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&m(e,t)}(a,l.default.Component);var e,t,r,n=y(a);function a(e){var l;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),v(b(l=n.call(this,e)),"onCancel",function(){l.setState({editing:!1})}),v(b(l),"onEdit",function(){l.setState({editing:!0})}),v(b(l),"onSuccess",function(e){var t=l.props,r=t.dispatch,n=t.isAuthenticated,a=t.profile,o=null,o=n?gettext("Your details have been updated."):interpolate(gettext("%(username)s's details have been updated."),{username:a.username},!0);d.default.info(o),r((0,f.load)(e)),l.setState({editing:!1})}),l.state={editing:!1},l}return e=a,(t=[{key:"componentDidMount",value:function(){o.default.set({title:gettext("Details"),parent:this.props.profile.username})}},{key:"render",value:function(){var e=this.props,t=e.dispatch,r=e.isAuthenticated,n=e.profile,a=e.profileDetails,o=a.id!==n.id;return l.default.createElement(c.default,{data:a,dispatch:t,user:n},l.default.createElement("div",{className:"profile-details"},l.default.createElement(s.default,{onEdit:this.onEdit,showEditButton:!!a.edit&&!this.state.editing}),l.default.createElement(u.default,{display:!this.state.editing,groups:a.groups,isAuthenticated:r,loading:o,profile:n}),l.default.createElement(i.default,{api:n.api.edit_details,dispatch:t,display:this.state.editing,onCancel:this.onCancel,onSuccess:this.onSuccess})))}}])&&p(e.prototype,t),r&&p(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=g},{"../../../data/profile-details":301,"../../../reducers/profile-details":355,"../../../services/page-title":373,"../../../services/snackbar":376,"./form":178,"./groups-list":180,"./header":181,react:"react"}],183:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Posts=function(e){var t=null;t=e.user.id===e.profile.id?gettext("You have posted no messages."):interpolate(gettext("%(username)s posted no messages."),{username:e.profile.username},!0);var r=null;{var n,a;r=e.posts.isLoaded?e.profile.id===e.user.id?(n=ngettext("You have posted %(posts)s message.","You have posted %(posts)s messages.",e.profile.posts),interpolate(n,{posts:e.profile.posts},!0)):(a=ngettext("%(username)s has posted %(posts)s message.","%(username)s has posted %(posts)s messages.",e.profile.posts),interpolate(a,{username:e.profile.username,posts:e.profile.posts},!0)):gettext("Loading...")}return o.default.createElement(l.default,i({api:e.profile.api.posts,emptyMessage:t,header:r,title:gettext("Posts")},e))},r.Threads=function(e){var t=null;t=e.user.id===e.profile.id?gettext("You have no started threads."):interpolate(gettext("%(username)s started no threads."),{username:e.profile.username},!0);var r=null;{var n,a;r=e.posts.isLoaded?e.profile.id===e.user.id?(n=ngettext("You have started %(threads)s thread.","You have started %(threads)s threads.",e.profile.threads),interpolate(n,{threads:e.profile.threads},!0)):(a=ngettext("%(username)s has started %(threads)s thread.","%(username)s has started %(threads)s threads.",e.profile.threads),interpolate(a,{username:e.profile.username,threads:e.profile.threads},!0)):gettext("Loading...")}return o.default.createElement(l.default,i({api:e.profile.api.threads,emptyMessage:t,header:r,title:gettext("Threads")},e))};var o=n(e("react")),l=n(e("./route"));function n(e){return e&&e.__esModule?e:{default:e}}function i(){return(i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}},{"./route":184,react:"react"}],184:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Feed=E,r.LoadMoreButton=w,r.default=void 0;var n=l(e("react")),a=l(e("../../post-feed")),o=l(e("../../button")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=p(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/posts")),s=l(e("../../../services/page-title")),c=l(e("../../../services/ajax")),f=l(e("../../../services/snackbar")),d=l(e("../../../services/store"));function p(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(p=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function m(){return(m=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(l,n.default.Component);var e,t,r,o=h(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=v(t),a=function(){t.setState({isLoading:!0}),t.loadItems(t.props.posts.next)},(n="loadMore")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1},t}return e=l,(t=[{key:"loadItems",value:function(e){var t=this,r=0<arguments.length&&void 0!==e?e:0;c.default.get(this.props.api,{start:r||0}).then(function(e){0===r?d.default.dispatch(u.load(e)):d.default.dispatch(u.append(e)),t.setState({isLoading:!1})},function(e){t.setState({isLoading:!1}),f.default.apiError(e)})}},{key:"componentDidMount",value:function(){s.default.set({title:this.props.title,parent:this.props.profile.username}),this.loadItems()}},{key:"render",value:function(){return n.default.createElement("div",{className:"profile-feed"},n.default.createElement("nav",{className:"toolbar"},n.default.createElement("h3",{className:"toolbar-left"},this.props.header)),n.default.createElement(E,m({isLoading:this.state.isLoading,loadMore:this.loadMore},this.props)))}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function E(e){return e.posts.results.length?n.default.createElement("div",null,n.default.createElement(a.default,{isReady:e.posts.isLoaded,posts:e.posts.results,poster:e.profile}),n.default.createElement(w,{isLoading:e.isLoading,loadMore:e.loadMore,next:e.posts.next})):n.default.createElement("p",{className:"lead"},e.emptyMessage)}function w(e){return e.next?n.default.createElement("div",{className:"pager-more"},n.default.createElement(o.default,{className:"btn btn-default btn-outline",loading:e.isLoading,onClick:e.loadMore},gettext("Show older activity"))):null}r.default=_},{"../../../reducers/posts":354,"../../../services/ajax":365,"../../../services/page-title":373,"../../../services/snackbar":376,"../../../services/store":377,"../../button":8,"../../post-feed":122,react:"react"}],185:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),i=o(e("../button")),u=e("../../reducers/profile"),s=o(e("../../services/ajax")),c=o(e("../../services/snackbar")),f=o(e("../../services/store"));function o(e){return e&&e.__esModule?e:{default:e}}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var b=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(l,n.default.Component);var e,t,r,o=m(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=y(t),a=function(){t.setState({isLoading:!0}),t.props.profile.is_followed?f.default.dispatch((0,u.patch)({is_followed:!1,followers:t.props.profile.followers-1})):f.default.dispatch((0,u.patch)({is_followed:!0,followers:t.props.profile.followers+1})),s.default.post(t.props.profile.api.follow).then(function(e){t.setState({isLoading:!1}),f.default.dispatch((0,u.patch)(e))},function(e){t.setState({isLoading:!1}),c.default.apiError(e)})},(n="action")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1},t}return e=l,(t=[{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?gettext("Following"):gettext("Follow")}},{key:"render",value:function(){return n.default.createElement(i.default,{className:this.getClassName(),disabled:this.state.isLoading,onClick:this.action},n.default.createElement("span",{className:"material-icon"},this.getIcon()),this.getLabel())}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=b},{"../../reducers/profile":356,"../../services/ajax":365,"../../services/snackbar":376,"../../services/store":377,"../button":8,react:"react"}],186:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../button")),i=n(e("../quick-search")),u=n(e("../users-list")),s=n(e("../..")),c=e("../../reducers/users"),f=n(e("../../services/ajax")),d=n(e("../../services/snackbar")),p=n(e("../../services/store")),m=n(e("../../services/page-title"));function n(e){return e&&e.__esModule?e:{default:e}}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var E=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(a,o.default.Component);var e,t,r,n=h(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),_(v(t=n.call(this,e)),"loadMore",function(){t.setState({isBusy:!0}),t.loadUsers(t.state.page+1,t.state.search)}),_(v(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(),s.default.has(t.PRELOADED_DATA_KEY)?t.initWithPreloadedData(s.default.pop(t.PRELOADED_DATA_KEY)):t.initWithoutPreloadedData(),t}return e=a,(t=[{key:"setSpecialProps",value:function(){this.PRELOADED_DATA_KEY="PROFILE_FOLLOWERS",this.TITLE=gettext("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},p.default.dispatch((0,c.hydrate)(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(e,t){var r=this,n=0<arguments.length&&void 0!==e?e:1,a=1<arguments.length&&void 0!==t?t:null,o=this.props.profile.api[this.API_FILTER];f.default.get(o,{search:a,page:n||1},"user-"+this.API_FILTER).then(function(e){1===n?p.default.dispatch((0,c.hydrate)(e.results)):p.default.dispatch((0,c.append)(e.results)),r.setState({isLoaded:!0,isBusy:!1,count:e.count,more:e.more,page:e.page,pages:e.pages})},function(e){d.default.apiError(e)})}},{key:"componentDidMount",value:function(){m.default.set({title:this.TITLE,parent:this.props.profile.username})}},{key:"getLabel",value:function(){if(this.state.isLoaded){if(this.state.search){var e=ngettext("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=ngettext("You have %(users)s follower.","You have %(users)s followers.",this.state.count);return interpolate(t,{users:this.state.count},!0)}var r=ngettext("%(username)s has %(users)s follower.","%(username)s has %(users)s followers.",this.state.count);return interpolate(r,{username:this.props.profile.username,users:this.state.count},!0)}return gettext("Loading...")}},{key:"getEmptyMessage",value:function(){return this.state.search?gettext("Search returned no users matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("You have no followers."):interpolate(gettext("%(username)s has no followers."),{username:this.props.profile.username},!0)}},{key:"getMoreButton",value:function(){return this.state.more?o.default.createElement("div",{className:"pager-more"},o.default.createElement(l.default,{className:"btn btn-default btn-outline",loading:this.state.isBusy,onClick:this.loadMore},interpolate(gettext("Show more (%(more)s)"),{more:this.state.more},!0))):null}},{key:"getListBody",value:function(){return this.state.isLoaded&&0===this.state.count?o.default.createElement("p",{className:"lead"},this.getEmptyMessage()):o.default.createElement("div",null,o.default.createElement(u.default,{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 o.default.createElement("div",{className:this.getClassName()},o.default.createElement("nav",{className:"toolbar"},o.default.createElement("h3",{className:"toolbar-left"},this.getLabel()),o.default.createElement(i.default,{className:"toolbar-right",value:this.state.search,onChange:this.search,placeholder:gettext("Search users...")})),this.getListBody())}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=E},{"../..":302,"../../reducers/users":364,"../../services/ajax":365,"../../services/page-title":373,"../../services/snackbar":376,"../../services/store":377,"../button":8,"../quick-search":197,"../users-list":284,react:"react"}],187:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;n(e("react"));var o=n(e("./followers"));function n(e){return e&&e.__esModule?e:{default:e}}function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"setSpecialProps",value:function(){this.PRELOADED_DATA_KEY="PROFILE_FOLLOWS",this.TITLE=gettext("Follows"),this.API_FILTER="follows"}},{key:"getLabel",value:function(){if(this.state.isLoaded){if(this.state.search){var e=ngettext("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=ngettext("You are following %(users)s user.","You are following %(users)s users.",this.state.count);return interpolate(t,{users:this.state.count},!0)}var r=ngettext("%(username)s is following %(users)s user.","%(username)s is following %(users)s users.",this.state.count);return interpolate(r,{username:this.props.profile.username,users:this.state.count},!0)}return gettext("Loading...")}},{key:"getEmptyMessage",value:function(){return this.state.search?gettext("Search returned no users matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("You are not following any users."):interpolate(gettext("%(username)s is not following any users."),{username:this.props.profile.username},!0)}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{"./followers":186,react:"react"}],188:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.IsDisabledMessage=v,r.default=void 0,r.getColStyle=g;var l=n(e("react")),u=n(e("../avatar")),o=(n(e("../dropdown-toggle")),n(e("./follow-button"))),s=n(e("./message-button")),c=n(e("./moderation/nav")),f=e("./navs"),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=p(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../user-status"));function p(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(p=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function m(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(a,l.default.Component);var e,t,r,n=b(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getUserStatus",value:function(){return l.default.createElement("li",{className:"user-status-display"},l.default.createElement(d.default,{user:this.props.profile,status:this.props.profile.status},l.default.createElement(d.StatusIcon,{user:this.props.profile,status:this.props.profile.status}),l.default.createElement(d.StatusLabel,{user:this.props.profile,status:this.props.profile.status,className:"status-label"})))}},{key:"getUserRank",value:function(){return this.props.profile.rank.is_tab?l.default.createElement("li",{className:"user-rank"},l.default.createElement("a",{href:this.props.profile.rank.url,className:"item-title"},this.props.profile.rank.name)):l.default.createElement("li",{className:"user-rank"},l.default.createElement("span",{className:"item-title"},this.props.profile.rank.name))}},{key:"getUserTitle",value:function(){return this.props.profile.title?l.default.createElement("li",{className:"user-title"},this.props.profile.title):this.props.profile.rank.title?l.default.createElement("li",{className:"user-title"},this.props.profile.rank.title):null}},{key:"getJoinedOn",value:function(){var e=interpolate(gettext("Joined on %(joined_on)s"),{joined_on:this.props.profile.joined_on.format("LL, LT")},!0),t=interpolate(gettext("Joined %(joined_on)s"),{joined_on:this.props.profile.joined_on.fromNow()},!0);return l.default.createElement("li",{className:"user-joined-on"},l.default.createElement("abbr",{title:e},t))}},{key:"getEmail",value:function(){return this.props.profile.email?l.default.createElement("li",{className:"user-email"},l.default.createElement("a",{href:"mailto:"+this.props.profile.email,className:"item-title"},this.props.profile.email)):null}},{key:"getFollowButton",value:function(){return this.props.profile.acl.can_follow?l.default.createElement(o.default,{className:"btn btn-block btn-outline",profile:this.props.profile}):null}},{key:"getModerationButton",value:function(){return this.props.profile.acl.can_moderate?l.default.createElement("div",{className:"btn-group btn-group-justified"},l.default.createElement("div",{className:"btn-group"},l.default.createElement("button",{className:"btn btn-default btn-moderate btn-outline dropdown-toggle",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},l.default.createElement("span",{className:"material-icon"},"tonality"),gettext("Moderation")),l.default.createElement(c.default,{profile:this.props.profile}))):null}},{key:"render",value:function(){var e=this.props.profile.acl.can_follow,t=this.props.profile.acl.can_moderate,r=!(this.props.user.id===this.props.profile.id)&&this.props.user.acl.can_start_private_threads,n=0;e&&(n+=1),t&&(n+=1),r&&(n+=1);var a=n?2*n+1:0,o="page-header";return this.props.profile.rank.css_class&&(o+=" page-header-rank-"+this.props.profile.rank.css_class),l.default.createElement("div",{className:"page-header-bg"},l.default.createElement("div",{className:o},l.default.createElement("div",{className:"container"},l.default.createElement(v,{isActive:this.props.profile.is_active,isDeletingAccount:this.props.profile.is_deleting_account}),l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-md-9 col-md-offset-3"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-sm-"+(12-a)},l.default.createElement(u.default,{className:"user-avatar user-avatar-sm",user:this.props.profile,size:"100",size2x:"200"}),l.default.createElement("h1",null,this.props.profile.username)),!!n&&l.default.createElement("div",{className:"col-sm-"+a},l.default.createElement("div",{className:"row xs-margin-top sm-margin-top"},!!r&&l.default.createElement("div",{className:g(n,0)},l.default.createElement(s.default,{className:"btn btn-default btn-block btn-outline",profile:this.props.profile,user:this.props.user})),!!e&&l.default.createElement("div",{className:g(n,1)},this.getFollowButton()),!!t&&l.default.createElement("div",{className:g(n,2)},this.getModerationButton()))))))),l.default.createElement("div",{className:"header-stats"},l.default.createElement("div",{className:"container"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-md-9 col-md-offset-3"},l.default.createElement("ul",{className:"list-inline"},this.getUserStatus(),this.getUserRank(),this.getUserTitle(),this.getJoinedOn(),this.getEmail()))))),l.default.createElement(f.CompactNav,{baseUrl:this.props.baseUrl,pages:this.props.pages,profile:this.props.profile})))}}])&&m(e.prototype,t),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function v(e){var t=e.isActive,r=e.isDeletingAccount;if(!1!==t&&!0!==r)return null;var n=null,n=r?gettext("This user is deleting their account."):gettext("This user's account has been disabled by administrator.");return l.default.createElement("div",{className:"alert alert-danger"},l.default.createElement("p",null,n))}function g(e,t){var r=2==e?"col-xs-6 col-sm-6":1==e?"col-xs-12":"";return 3==e&&(2==t?r="col-xs-12 col-sm-4 xs-margin-top":r+="col-xs-6 col-sm-4"),r}r.default=h},{"../avatar":6,"../dropdown-toggle":27,"../user-status":274,"./follow-button":185,"./message-button":189,"./moderation/nav":193,"./navs":194,react:"react"}],189:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),s=o(e("../../services/posting")),c=o(e("../.."));function o(e){return e&&e.__esModule?e:{default:e}}function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return p(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(u,n.default.Component);var e,t,r,i=d(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=p(e),n=function(){s.default.open({mode:"START_PRIVATE",submit:c.default.get("PRIVATE_THREADS_API"),to:[e.props.profile]})},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){var e=this.props.user.acl.can_start_private_threads,t=this.props.user.id===this.props.profile.id;return!e||t?null:n.default.createElement("button",{className:this.props.className,onClick:this.onClick,type:"button"},n.default.createElement("span",{className:"material-icon"},"comment"),gettext("Message"))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../..":302,"../../services/posting":375,react:"react"}],190:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../button")),i=n(e("../../form")),u=n(e("../../form-group")),s=n(e("../../modal-loader")),c=n(e("../../yes-no-switch")),f=n(e("../../modal-message")),d=e("../../../reducers/users"),p=n(e("../../../services/ajax")),m=n(e("../../../services/snackbar")),y=n(e("../../../services/store"));function n(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(a,i.default);var e,t,r,n=v(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={isLoaded:!1,isLoading:!1,error:null,is_avatar_locked:"",avatar_lock_user_message:"",avatar_lock_staff_message:""},t}return e=a,(t=[{key:"componentDidMount",value:function(){var t=this;p.default.get(this.props.profile.api.moderate_avatar).then(function(e){t.setState({isLoaded:!0,is_avatar_locked:e.is_avatar_locked,avatar_lock_user_message:e.avatar_lock_user_message||"",avatar_lock_staff_message:e.avatar_lock_staff_message||""})},function(e){t.setState({isLoaded:!0,error:e.detail})})}},{key:"clean",value:function(){return!!this.isValid()||(m.default.error(this.validate().username[0]),!1)}},{key:"send",value:function(){return p.default.post(this.props.profile.api.moderate_avatar,{is_avatar_locked:this.state.is_avatar_locked,avatar_lock_user_message:this.state.avatar_lock_user_message,avatar_lock_staff_message:this.state.avatar_lock_staff_message})}},{key:"handleSuccess",value:function(e){y.default.dispatch((0,d.updateAvatar)(this.props.profile,e.avatar_hash)),m.default.success(gettext("Avatar controls have been changed."))}},{key:"getFormBody",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"modal-body"},o.default.createElement(u.default,{label:gettext("Lock avatar"),helpText:gettext("Locking user avatar will prohibit user from changing his avatar and will reset his/her avatar to default one."),for:"id_is_avatar_locked"},o.default.createElement(c.default,{id:"id_is_avatar_locked",disabled:this.state.isLoading,iconOn:"lock_outline",iconOff:"lock_open",labelOn:gettext("Disallow user from changing avatar"),labelOff:gettext("Allow user to change avatar"),onChange:this.bindInput("is_avatar_locked"),value:this.state.is_avatar_locked})),o.default.createElement(u.default,{label:gettext("User message"),helpText:gettext("Optional message for user explaining why he/she is prohibited form changing avatar."),for:"id_avatar_lock_user_message"},o.default.createElement("textarea",{id:"id_avatar_lock_user_message",className:"form-control",rows:"4",disabled:this.state.isLoading,onChange:this.bindInput("avatar_lock_user_message"),value:this.state.avatar_lock_user_message})),o.default.createElement(u.default,{label:gettext("Staff message"),helpText:gettext("Optional message for forum team members explaining why user is prohibited form changing avatar."),for:"id_avatar_lock_staff_message"},o.default.createElement("textarea",{id:"id_avatar_lock_staff_message",className:"form-control",rows:"4",disabled:this.state.isLoading,onChange:this.bindInput("avatar_lock_staff_message"),value:this.state.avatar_lock_staff_message}))),o.default.createElement("div",{className:"modal-footer"},o.default.createElement("button",{type:"button",className:"btn btn-default","data-dismiss":"modal"},gettext("Close")),o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Save changes"))))}},{key:"getModalBody",value:function(){return this.state.error?o.default.createElement(f.default,{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.getFormBody():o.default.createElement(s.default,null)}},{key:"getClassName",value:function(){return this.state.error?"modal-dialog modal-message modal-avatar-controls":"modal-dialog modal-avatar-controls"}},{key:"render",value:function(){return o.default.createElement("div",{className:this.getClassName(),role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Avatar controls"))),this.getModalBody()))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=_},{"../../../reducers/users":364,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377,"../../button":8,"../../form":56,"../../form-group":55,"../../modal-loader":61,"../../modal-message":62,"../../yes-no-switch":300,react:"react"}],191:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../button")),u=n(e("../../form")),s=n(e("../../form-group")),c=n(e("../../modal-loader")),f=n(e("../../modal-message")),d=e("../../../reducers/username-history"),p=e("../../../reducers/users"),m=n(e("../../../services/ajax")),y=n(e("../../../services/snackbar")),b=n(e("../../../services/store")),h=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=v(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/validators"));function v(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(v=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function g(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var w=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}(a,u.default);var e,t,r,n=E(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={isLoaded:!1,isLoading:!1,error:null,username:"",validators:{username:[h.usernameContent()]}},t}return e=a,(t=[{key:"componentDidMount",value:function(){var t=this;m.default.get(this.props.profile.api.moderate_username).then(function(){t.setState({isLoaded:!0})},function(e){t.setState({isLoaded:!0,error:e.detail})})}},{key:"clean",value:function(){return!!this.isValid()||(y.default.error(this.validate().username[0]),!1)}},{key:"send",value:function(){return m.default.post(this.props.profile.api.moderate_username,{username:this.state.username})}},{key:"handleSuccess",value:function(e){this.setState({username:""}),b.default.dispatch((0,d.addNameChange)(e,this.props.profile,this.props.user)),b.default.dispatch((0,p.updateUsername)(this.props.profile,e.username,e.slug)),y.default.success(gettext("Username has been changed."))}},{key:"getFormBody",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"modal-body"},o.default.createElement(s.default,{label:gettext("New username"),for:"id_username"},o.default.createElement("input",{type:"text",id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username}))),o.default.createElement("div",{className:"modal-footer"},o.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Change username"))))}},{key:"getModalBody",value:function(){return this.state.error?o.default.createElement(f.default,{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.getFormBody():o.default.createElement(c.default,null)}},{key:"getClassName",value:function(){return this.state.error?"modal-dialog modal-message modal-rename-user":"modal-dialog modal-rename-user"}},{key:"render",value:function(){return o.default.createElement("div",{className:this.getClassName(),role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Change username"))),this.getModalBody()))}}])&&g(e.prototype,t),r&&g(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=w},{"../../../reducers/username-history":363,"../../../reducers/users":364,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377,"../../../utils/validators":393,"../../button":8,"../../form":56,"../../form-group":55,"../../modal-loader":61,"../../modal-message":62,react:"react"}],192:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),i=o(e("../../button")),u=o(e("../../form")),s=o(e("../../form-group")),c=o(e("../../modal-loader")),f=o(e("../../modal-message")),d=o(e("../../yes-no-switch")),p=o(e("../../..")),m=o(e("../../../services/ajax")),y=o(e("../../../services/polls"));function o(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return g(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(l,u.default);var e,t,r,o=v(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=g(t),a=function(){window.setTimeout(function(){1<t.state.countdown?(t.setState({countdown:t.state.countdown-1}),t.countdown()):t.state.confirm||t.setState({confirm:!0})},1e3)},(n="countdown")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoaded:!1,isLoading:!1,isDeleted:!1,error:null,countdown:5,confirm:!1,with_content:!1},t}return e=l,(t=[{key:"componentDidMount",value:function(){var t=this;m.default.get(this.props.profile.api.delete).then(function(){t.setState({isLoaded:!0}),t.countdown()},function(e){t.setState({isLoaded:!0,error:e.detail})})}},{key:"send",value:function(){return m.default.post(this.props.profile.api.delete,{with_content:this.state.with_content})}},{key:"handleSuccess",value:function(){y.default.stop("user-profile"),this.state.with_content?this.setState({isDeleted:interpolate(gettext("%(username)s's account, threads, posts and other content has been deleted."),{username:this.props.profile.username},!0)}):this.setState({isDeleted:interpolate(gettext("%(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(gettext("Delete %(username)s"),{username:this.props.profile.username},!0):interpolate(gettext("Please wait... (%(countdown)ss)"),{countdown:this.state.countdown},!0)}},{key:"getForm",value:function(){return n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"modal-body"},n.default.createElement(s.default,{label:gettext("User content"),for:"id_with_content"},n.default.createElement(d.default,{id:"id_with_content",disabled:this.state.isLoading,labelOn:gettext("Delete together with user's account"),labelOff:gettext("Hide after deleting user's account"),onChange:this.bindInput("with_content"),value:this.state.with_content}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("button",{type:"button",className:"btn btn-default","data-dismiss":"modal"},gettext("Cancel")),n.default.createElement(i.default,{className:"btn-danger",loading:this.state.isLoading,disabled:!this.state.confirm},this.getButtonLabel())))}},{key:"getDeletedBody",value:function(){return n.default.createElement("div",{className:"modal-body"},n.default.createElement("div",{className:"message-icon"},n.default.createElement("span",{className:"material-icon"},"info_outline")),n.default.createElement("div",{className:"message-body"},n.default.createElement("p",{className:"lead"},this.state.isDeleted),n.default.createElement("p",null,n.default.createElement("a",{href:p.default.get("USERS_LIST_URL")},gettext("Return to users list")))))}},{key:"getModalBody",value:function(){return this.state.error?n.default.createElement(f.default,{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.state.isDeleted?this.getDeletedBody():this.getForm():n.default.createElement(c.default,null)}},{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 n.default.createElement("div",{className:this.getClassName(),role:"document"},n.default.createElement("div",{className:"modal-content"},n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Delete user account"))),this.getModalBody()))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=_},{"../../..":302,"../../../services/ajax":365,"../../../services/polls":374,"../../button":8,"../../form":56,"../../form-group":55,"../../modal-loader":61,"../../modal-message":62,"../../yes-no-switch":300,react:"react"}],193:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),l=e("react-redux"),i=o(e("./avatar-controls")),u=o(e("./change-username")),s=o(e("./delete-account")),c=o(e("../../../services/modal"));function o(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(e){return{tick:e.tick,user:e.auth,profile:e.profile}},v=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(o,n.default.Component);var e,t,r,a=p(o);function o(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return b(m(e=a.call.apply(a,[this].concat(r))),"showAvatarDialog",function(){c.default.show((0,l.connect)(h)(i.default))}),b(m(e),"showRenameDialog",function(){c.default.show((0,l.connect)(h)(u.default))}),b(m(e),"showDeleteDialog",function(){c.default.show((0,l.connect)(h)(s.default))}),e}return e=o,(t=[{key:"getAvatarButton",value:function(){return this.props.profile.acl.can_moderate_avatar?n.default.createElement("li",null,n.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.showAvatarDialog},n.default.createElement("span",{className:"material-icon"},"portrait"),gettext("Avatar controls"))):null}},{key:"getRenameButton",value:function(){return this.props.profile.acl.can_rename?n.default.createElement("li",null,n.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.showRenameDialog},n.default.createElement("span",{className:"material-icon"},"credit_card"),gettext("Change username"))):null}},{key:"getDeleteButton",value:function(){return this.props.profile.acl.can_delete?n.default.createElement("li",null,n.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.showDeleteDialog},n.default.createElement("span",{className:"material-icon"},"clear"),gettext("Delete account"))):null}},{key:"render",value:function(){return n.default.createElement("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom",role:"menu"},this.getAvatarButton(),this.getRenameButton(),this.getDeleteButton())}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=v},{"../../../services/modal":371,"./avatar-controls":190,"./change-username":191,"./delete-account":192,react:"react","react-redux":"react-redux"}],194:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.CompactNav=function(t){return o.default.createElement("div",{className:"page-tabs hidden-md hidden-lg"},o.default.createElement("div",{className:"container"},o.default.createElement("ul",{className:"nav nav-pills",role:"menu"},t.pages.map(function(e){return o.default.createElement(n.default,{path:t.baseUrl+e.component+"/",key:e.component},o.default.createElement(l.Link,{to:t.baseUrl+e.component+"/",onClick:t.hideNav},o.default.createElement("span",{className:"material-icon"},e.icon),e.name))}))))},r.SideNav=void 0;var o=i(e("react")),l=e("react-router"),n=i(e("../li"));i(e("./follow-button")),i(e("../.."));function i(e){return e&&e.__esModule?e:{default:e}}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=f(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=f(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){return(f=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var d=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(a,o.default.Component);var e,t,r,n=c(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){var t=this;return o.default.createElement("div",{className:"list-group nav-side"},this.props.pages.map(function(e){return o.default.createElement(l.Link,{to:t.props.baseUrl+e.component+"/",className:"list-group-item",activeClassName:"active",key:e.component},o.default.createElement("span",{className:"material-icon"},e.icon),e.name)}))}}])&&u(e.prototype,t),r&&u(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.SideNav=d},{"../..":302,"../li":57,"./follow-button":185,react:"react","react-router":"react-router"}],195:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.paths=function(){var t=[];return b.default.get("PROFILE_PAGES").forEach(function(e){t.push(Object.assign({},e,{path:b.default.get("PROFILE").url+e.component+"/",component:(0,o.connect)(N)(x[e.component])}))}),t},r.select=N;var n=_(e("react")),o=e("react-redux"),l=_(e("./ban-details")),i=_(e("./details")),u=e("./feed"),s=_(e("./followers")),c=_(e("./follows")),f=_(e("./username-history")),d=_(e("./header")),p=(_(e("./moderation/nav")),e("./navs")),m=_(e("../avatar")),y=_(e("../with-dropdown")),b=_(e("../..")),h=e("../../reducers/profile"),v=_(e("../../services/polls")),g=_(e("../../services/store"));function _(e){return e&&e.__esModule?e:{default:e}}function E(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function w(e,t){return(w=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function O(r){var 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}}();return function(){var e,t=P(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return j(e)}(this,n?(e=P(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function j(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function P(e){return(P=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var k=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&w(e,t)}(l,y.default);var e,t,r,o=O(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=j(t),a=function(e){g.default.dispatch((0,h.hydrate)(e))},(n="update")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.startPolling(e.profile.api.index),t}return e=l,(t=[{key:"startPolling",value:function(e){v.default.start({poll:"user-profile",url:e,frequency:9e4,update:this.update})}},{key:"render",value:function(){var e=b.default.get("PROFILE").url,t=b.default.get("PROFILE_PAGES");return n.default.createElement("div",{className:"page page-user-profile"},n.default.createElement(d.default,{baseUrl:e,pages:t,profile:this.props.profile,toggleNav:this.toggleNav,toggleModeration:this.toggleModeration,user:this.props.user}),n.default.createElement("div",{className:"container"},n.default.createElement("div",{className:"row"},n.default.createElement("div",{className:"col-md-3 hidden-xs hidden-sm"},n.default.createElement("div",{className:"profile-side-avatar"},n.default.createElement(m.default,{user:this.props.profile,size:"400"})),n.default.createElement(p.SideNav,{baseUrl:e,pages:t,profile:this.props.profile})),n.default.createElement("div",{className:"col-md-9"},this.props.children))))}}])&&E(e.prototype,t),r&&E(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function N(e){return{isAuthenticated:e.auth.user.id===e.profile.id,tick:e.tick.tick,user:e.auth.user,users:e.users,posts:e.posts,profile:e.profile,profileDetails:e["profile-details"],"username-history":e["username-history"]}}r.default=k;var x={posts:u.Posts,threads:u.Threads,followers:s.default,follows:c.default,details:i.default,"username-history":f.default,"ban-details":l.default}},{"../..":302,"../../reducers/profile":356,"../../services/polls":374,"../../services/store":377,"../avatar":6,"../with-dropdown":299,"./ban-details":174,"./details":182,"./feed":183,"./followers":186,"./follows":187,"./header":188,"./moderation/nav":193,"./navs":194,"./username-history":196,react:"react","react-redux":"react-redux"}],196:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../button")),i=n(e("../quick-search")),u=n(e("../username-history/root")),s=n(e("../..")),c=e("../../reducers/username-history"),f=n(e("../../services/ajax")),d=n(e("../../services/snackbar")),p=n(e("../../services/store")),m=n(e("../../services/page-title"));function n(e){return e&&e.__esModule?e:{default:e}}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var E=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(a,o.default.Component);var e,t,r,n=h(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),_(v(t=n.call(this,e)),"loadMore",function(){t.setState({isBusy:!0}),t.loadChanges(t.state.page+1,t.state.search)}),_(v(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)}),s.default.has("PROFILE_NAME_HISTORY")?t.initWithPreloadedData(s.default.pop("PROFILE_NAME_HISTORY")):t.initWithoutPreloadedData(),t}return e=a,(t=[{key:"initWithPreloadedData",value:function(e){this.state={isLoaded:!0,isBusy:!1,search:"",count:e.count,more:e.more,page:e.page,pages:e.pages},p.default.dispatch((0,c.hydrate)(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(e,t){var r=this,n=0<arguments.length&&void 0!==e?e:1,a=1<arguments.length&&void 0!==t?t:null;f.default.get(s.default.get("USERNAME_CHANGES_API"),{user:this.props.profile.id,search:a,page:n||1},"search-username-history").then(function(e){1===n?p.default.dispatch((0,c.hydrate)(e.results)):p.default.dispatch((0,c.append)(e.results)),r.setState({isLoaded:!0,isBusy:!1,count:e.count,more:e.more,page:e.page,pages:e.pages})},function(e){d.default.apiError(e)})}},{key:"componentDidMount",value:function(){m.default.set({title:gettext("Username history"),parent:this.props.profile.username})}},{key:"getLabel",value:function(){if(this.state.isLoaded){if(this.state.search){var e=ngettext("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=ngettext("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 r=ngettext("%(username)s's username was changed %(changes)s time.","%(username)s's username was changed %(changes)s times.",this.state.count);return interpolate(r,{username:this.props.profile.username,changes:this.state.count},!0)}return gettext("Loading...")}},{key:"getEmptyMessage",value:function(){return this.state.search?gettext("Search returned no username changes matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("No name changes have been recorded for your account."):interpolate(gettext("%(username)s's username was never changed."),{username:this.props.profile.username},!0)}},{key:"getMoreButton",value:function(){return this.state.more?o.default.createElement("div",{className:"pager-more"},o.default.createElement(l.default,{className:"btn btn-default btn-outline",loading:this.state.isBusy,onClick:this.loadMore},interpolate(gettext("Show older (%(more)s)"),{more:this.state.more},!0))):null}},{key:"render",value:function(){return o.default.createElement("div",{className:"profile-username-history"},o.default.createElement("nav",{className:"toolbar"},o.default.createElement("h3",{className:"toolbar-left"},this.getLabel()),o.default.createElement(i.default,{className:"toolbar-right",value:this.state.search,onChange:this.search,placeholder:gettext("Search history...")})),o.default.createElement(u.default,{isLoaded:this.state.isLoaded,emptyMessage:this.getEmptyMessage(),changes:this.props["username-history"]}),this.getMoreButton())}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=E},{"../..":302,"../../reducers/username-history":363,"../../services/ajax":365,"../../services/page-title":373,"../../services/snackbar":376,"../../services/store":377,"../button":8,"../quick-search":197,"../username-history/root":280,react:"react"}],197:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getClassName",value:function(){return this.props.className?"form-search "+this.props.className:"form-search"}},{key:"render",value:function(){return o.default.createElement("div",{className:this.getClassName()},o.default.createElement("input",{type:"text",className:"form-control",value:this.props.value,onChange:this.props.onChange,placeholder:this.props.placeholder||gettext("Search...")}),o.default.createElement("span",{className:"material-icon"},"search"))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],198:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var i=o(e("react")),n=o(e("./loader")),u=o(e("./register.js")),s=o(e("../services/ajax")),c=o(e("../services/captcha")),f=o(e("../services/modal")),d=o(e("../services/snackbar"));function o(e){return e&&e.__esModule?e:{default:e}}function p(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t){return(m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function y(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return b(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function b(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&m(e,t)}(l,i.default.Component);var e,t,r,o=y(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=b(t),a=function(){"closed"===misago.get("SETTINGS").account_activation?d.default.info(gettext("New registrations are currently disabled.")):t.state.isLoaded?f.default.show(i.default.createElement(u.default,{criteria:t.state.criteria})):(t.setState({isLoading:!0}),Promise.all([c.default.load(),s.default.get(misago.get("AUTH_CRITERIA_API"))]).then(function(e){t.setState({isLoading:!1,isLoaded:!0,criteria:e[1]}),f.default.show(i.default.createElement(u.default,{criteria:e[1]}))},function(){t.setState({isLoading:!1}),d.default.error(gettext("Registration is currently unavailable due to an error."))}))},(n="showRegisterForm")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1,isLoaded:!1,criteria:null},t}return e=l,(t=[{key:"getClassName",value:function(){return this.props.className+(this.state.isLoading?" btn-loading":"")}},{key:"render",value:function(){return i.default.createElement("button",{className:"btn "+this.getClassName(),disabled:this.state.isLoading,onClick:this.showRegisterForm,type:"button"},gettext("Register"),this.state.isLoading?i.default.createElement(n.default,null):null)}}])&&p(e.prototype,t),r&&p(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=h},{"../services/ajax":365,"../services/captcha":367,"../services/modal":371,"../services/snackbar":376,"./loader":58,"./register.js":199,react:"react"}],199:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.RegisterForm=r.RegisterComplete=void 0;var a=_(e("react")),n=_(e("./button")),o=_(e("./form")),s=_(e("./form-group")),c=_(e("./password-strength")),f=_(e("./RegisterLegalFootnote")),d=_(e("./StartSocialAuth")),p=_(e("./..")),m=_(e("../services/ajax")),l=_(e("../services/auth")),y=_(e("../services/captcha")),b=_(e("../services/modal")),h=_(e("../services/snackbar")),v=_(e("../utils/banned-page")),g=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../utils/validators"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function _(e){return e&&e.__esModule?e:{default:e}}function E(){return(E=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function w(t,e){var r,n=Object.keys(t);return Object.getOwnPropertySymbols&&(r=Object.getOwnPropertySymbols(t),e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,r)),n}function O(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?w(Object(r),!0).forEach(function(e){M(t,e,r[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):w(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))})}return t}function j(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function P(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function k(e,t,r){return t&&P(e.prototype,t),r&&P(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function N(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&x(e,t)}function x(e,t){return(x=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function S(r){var 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}}();return function(){var e,t=C(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return R(e)}(this,n?(e=C(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function R(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function C(e){return(C=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function M(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var T=function(){N(u,o.default);var l=S(u);function u(e){var i;j(this,u),M(R(i=l.call(this,e)),"handlePrivacyPolicyChange",function(e){var t=e.target.value;i.handleToggleAgreement("privacyPolicy",t)}),M(R(i),"handleTermsOfServiceChange",function(e){var t=e.target.value;i.handleToggleAgreement("termsOfService",t)}),M(R(i),"handleToggleAgreement",function(o,l){i.setState(function(e,t){if(null===e[o]){var r=O(O({},e.errors),{},M({},o,null));return M({errors:r},o,l)}var n=i.state.validators[o][0],a=O(O({},e.errors),{},M({},o,[n(null)]));return M({errors:a},o,null)})});var t=i.props.criteria,r=t.username,n=t.password,a=0;n.forEach(function(e){"MinimumLengthValidator"===e.name&&(a=e.min_length)});var o={username:[g.usernameContent(),g.usernameMinLength(r.min_length),g.usernameMaxLength(r.max_length)],email:[g.email()],password:[g.passwordMinLength(a)],captcha:y.default.validator()};return p.default.get("TERMS_OF_SERVICE_ID")&&(o.termsOfService=[g.requiredTermsOfService()]),p.default.get("PRIVACY_POLICY_ID")&&(o.privacyPolicy=[g.requiredPrivacyPolicy()]),i.state={isLoading:!1,username:"",email:"",password:"",captcha:"",termsOfService:null,privacyPolicy:null,validators:o,errors:{}},i}return k(u,[{key:"clean",value:function(){return!!this.isValid()||(h.default.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}},{key:"send",value:function(){return m.default.post(p.default.get("USERS_API"),{username:this.state.username,email:this.state.email,password:this.state.password,captcha:this.state.captcha,terms_of_service:this.state.termsOfService,privacy_policy:this.state.privacyPolicy})}},{key:"handleSuccess",value:function(e){this.props.callback(e)}},{key:"handleError",value:function(e){400===e.status?(this.setState({errors:Object.assign({},this.state.errors,e)}),e.__all__&&0<e.__all__.length?h.default.error(e.__all__[0]):h.default.error(gettext("Form contains errors."))):403===e.status&&e.ban?((0,v.default)(e.ban),b.default.hide()):h.default.apiError(e)}},{key:"render",value:function(){return a.default.createElement("div",{className:"modal-dialog modal-register",role:"document"},a.default.createElement("div",{className:"modal-content"},a.default.createElement("div",{className:"modal-header"},a.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},a.default.createElement("span",{"aria-hidden":"true"},"×")),a.default.createElement("h4",{className:"modal-title"},gettext("Register"))),a.default.createElement("form",{onSubmit:this.handleSubmit},a.default.createElement("input",{type:"type",style:{display:"none"}}),a.default.createElement("input",{type:"password",style:{display:"none"}}),a.default.createElement("div",{className:"modal-body"},a.default.createElement(d.default,{buttonClassName:"col-xs-12 col-sm-6",buttonLabel:gettext("Join with %(site)s"),formLabel:gettext("Or create forum account:")}),a.default.createElement(s.default,{label:gettext("Username"),for:"id_username",validation:this.state.errors.username},a.default.createElement("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})),a.default.createElement(s.default,{label:gettext("E-mail"),for:"id_email",validation:this.state.errors.email},a.default.createElement("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})),a.default.createElement(s.default,{label:gettext("Password"),for:"id_password",validation:this.state.errors.password,extra:a.default.createElement(c.default,{password:this.state.password,inputs:[this.state.username,this.state.email]})},a.default.createElement("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})),y.default.component({form:this}),a.default.createElement(f.default,{errors:this.state.errors,privacyPolicy:this.state.privacyPolicy,termsOfService:this.state.termsOfService,onPrivacyPolicyChange:this.handlePrivacyPolicyChange,onTermsOfServiceChange:this.handleTermsOfServiceChange})),a.default.createElement("div",{className:"modal-footer"},a.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),a.default.createElement(n.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Register account"))))))}}]),u}();r.RegisterForm=T;var L=function(){N(t,a.default.Component);var e=S(t);function t(){return j(this,t),e.apply(this,arguments)}return k(t,[{key:"getLead",value:function(){return"user"===this.props.activation?gettext("%(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?gettext("%(username)s, your account has been created but board 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?gettext("We have sent an e-mail to %(email)s with link that you have to click to activate your account."):"admin"===this.props.activation?gettext("We will send an e-mail to %(email)s when this takes place."):void 0}},{key:"render",value:function(){return a.default.createElement("div",{className:"modal-dialog modal-message modal-register",role:"document"},a.default.createElement("div",{className:"modal-content"},a.default.createElement("div",{className:"modal-header"},a.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},a.default.createElement("span",{"aria-hidden":"true"},"×")),a.default.createElement("h4",{className:"modal-title"},gettext("Registration complete"))),a.default.createElement("div",{className:"modal-body"},a.default.createElement("div",{className:"message-icon"},a.default.createElement("span",{className:"material-icon"},"info_outline")),a.default.createElement("div",{className:"message-body"},a.default.createElement("p",{className:"lead"},interpolate(this.getLead(),{username:this.props.username},!0)),a.default.createElement("p",null,interpolate(this.getSubscript(),{email:this.props.email},!0)),a.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok"))))))}}]),t}();r.RegisterComplete=L;var D=function(){N(n,a.default.Component);var r=S(n);function n(e){var t;return j(this,n),M(R(t=r.call(this,e)),"completeRegistration",function(e){"active"===e.activation?(b.default.hide(),l.default.signIn(e)):t.setState({complete:e})}),t.state={complete:!1},t}return k(n,[{key:"render",value:function(){return this.state.complete?a.default.createElement(L,{activation:this.state.complete.activation,email:this.state.complete.email,username:this.state.complete.username}):a.default.createElement(T,E({callback:this.completeRegistration},this.props))}}]),n}();r.default=D},{"../services/ajax":365,"../services/auth":366,"../services/captcha":367,"../services/modal":371,"../services/snackbar":376,"../utils/banned-page":379,"../utils/validators":393,"./..":302,"./RegisterLegalFootnote":1,"./StartSocialAuth":2,"./button":8,"./form":56,"./form-group":55,"./password-strength":103,react:"react"}],200:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.RequestLinkForm=r.LinkSent=void 0;var a=n(e("react")),o=n(e("./..")),l=n(e("./button")),u=n(e("./form")),s=n(e("../services/ajax")),c=n(e("../services/snackbar")),f=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=p(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../utils/validators")),d=n(e("../utils/banned-page"));function p(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(p=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function m(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function y(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t,r){return t&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function v(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=w(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=w(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function w(e){return(w=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var O=function(){v(n,u.default);var r=_(n);function n(e){var t;return y(this,n),(t=r.call(this,e)).state={isLoading:!1,email:"",validators:{email:[f.email()]}},t}return h(n,[{key:"clean",value:function(){return!!this.isValid()||(c.default.error(gettext("Enter a valid email address.")),!1)}},{key:"send",value:function(){return s.default.post(o.default.get("SEND_ACTIVATION_API"),{email:this.state.email})}},{key:"handleSuccess",value:function(e){this.props.callback(e)}},{key:"handleError",value:function(e){-1<["already_active","inactive_admin"].indexOf(e.code)?c.default.info(e.detail):403===e.status&&e.ban?(0,d.default)(e.ban):c.default.apiError(e)}},{key:"render",value:function(){return a.default.createElement("div",{className:"well well-form well-form-request-activation-link"},a.default.createElement("form",{onSubmit:this.handleSubmit},a.default.createElement("div",{className:"form-group"},a.default.createElement("div",{className:"control-input"},a.default.createElement("input",{type:"text",className:"form-control",placeholder:gettext("Your e-mail address"),disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email}))),a.default.createElement(l.default,{className:"btn-primary btn-block",loading:this.state.isLoading},gettext("Send link"))))}}]),n}();r.RequestLinkForm=O;var j=function(){v(t,a.default.Component);var e=_(t);function t(){return y(this,t),e.apply(this,arguments)}return h(t,[{key:"getMessage",value:function(){return interpolate(gettext("Activation link was sent to %(email)s"),{email:this.props.user.email},!0)}},{key:"render",value:function(){return a.default.createElement("div",{className:"well well-form well-form-request-activation-link well-done"},a.default.createElement("div",{className:"done-message"},a.default.createElement("div",{className:"message-icon"},a.default.createElement("span",{className:"material-icon"},"check")),a.default.createElement("div",{className:"message-body"},a.default.createElement("p",null,this.getMessage())),a.default.createElement("button",{className:"btn btn-primary btn-block",type:"button",onClick:this.props.callback},gettext("Request another link"))))}}]),t}();r.LinkSent=j;var P=function(){v(n,a.default.Component);var r=_(n);function n(e){var t;return y(this,n),m(E(t=r.call(this,e)),"complete",function(e){t.setState({complete:e})}),m(E(t),"reset",function(){t.setState({complete:!1})}),t.state={complete:!1},t}return h(n,[{key:"render",value:function(){return this.state.complete?a.default.createElement(j,{user:this.state.complete,callback:this.reset}):a.default.createElement(O,{callback:this.complete})}}]),n}();r.default=P},{"../services/ajax":365,"../services/snackbar":376,"../utils/banned-page":379,"../utils/validators":393,"./..":302,"./button":8,"./form":56,react:"react"}],201:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.RequestResetForm=r.LinkSent=r.AccountInactivePage=void 0;var a=n(e("react")),o=n(e("react-dom")),l=n(e("./..")),u=n(e("./button")),s=n(e("./form")),c=n(e("../services/ajax")),f=n(e("../services/snackbar")),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=m(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../utils/validators")),p=n(e("../utils/banned-page"));function m(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(m=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function y(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function b(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function h(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function v(e,t,r){return t&&h(e.prototype,t),r&&h(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=O(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=O(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function O(e){return(O=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var j=function(){g(n,s.default);var r=E(n);function n(e){var t;return b(this,n),(t=r.call(this,e)).state={isLoading:!1,email:"",validators:{email:[d.email()]}},t}return v(n,[{key:"clean",value:function(){return!!this.isValid()||(f.default.error(gettext("Enter a valid email address.")),!1)}},{key:"send",value:function(){return c.default.post(l.default.get("SEND_PASSWORD_RESET_API"),{email:this.state.email})}},{key:"handleSuccess",value:function(e){this.props.callback(e)}},{key:"handleError",value:function(e){-1<["inactive_user","inactive_admin"].indexOf(e.code)?this.props.showInactivePage(e):403===e.status&&e.ban?(0,p.default)(e.ban):f.default.apiError(e)}},{key:"render",value:function(){return a.default.createElement("div",{className:"well well-form well-form-request-password-reset"},a.default.createElement("form",{onSubmit:this.handleSubmit},a.default.createElement("div",{className:"form-group"},a.default.createElement("div",{className:"control-input"},a.default.createElement("input",{type:"text",className:"form-control",placeholder:gettext("Your e-mail address"),disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email}))),a.default.createElement(u.default,{className:"btn-primary btn-block",loading:this.state.isLoading},gettext("Send link"))))}}]),n}();r.RequestResetForm=j;var P=function(){g(t,a.default.Component);var e=E(t);function t(){return b(this,t),e.apply(this,arguments)}return v(t,[{key:"getMessage",value:function(){return interpolate(gettext("Reset password link was sent to %(email)s"),{email:this.props.user.email},!0)}},{key:"render",value:function(){return a.default.createElement("div",{className:"well well-form well-form-request-password-reset well-done"},a.default.createElement("div",{className:"done-message"},a.default.createElement("div",{className:"message-icon"},a.default.createElement("span",{className:"material-icon"},"check")),a.default.createElement("div",{className:"message-body"},a.default.createElement("p",null,this.getMessage())),a.default.createElement("button",{type:"button",className:"btn btn-primary btn-block",onClick:this.props.callback},gettext("Request another link"))))}}]),t}();r.LinkSent=P;var k=function(){g(t,a.default.Component);var e=E(t);function t(){return b(this,t),e.apply(this,arguments)}return v(t,[{key:"getActivateButton",value:function(){return"inactive_user"===this.props.activation?a.default.createElement("p",null,a.default.createElement("a",{href:l.default.get("REQUEST_ACTIVATION_URL")},gettext("Activate your account."))):null}},{key:"render",value:function(){return a.default.createElement("div",{className:"page page-message page-message-info page-forgotten-password-inactive"},a.default.createElement("div",{className:"container"},a.default.createElement("div",{className:"message-panel"},a.default.createElement("div",{className:"message-icon"},a.default.createElement("span",{className:"material-icon"},"info_outline")),a.default.createElement("div",{className:"message-body"},a.default.createElement("p",{className:"lead"},gettext("Your account is inactive.")),a.default.createElement("p",null,this.props.message),this.getActivateButton()))))}}]),t}();r.AccountInactivePage=k;var N=function(){g(n,a.default.Component);var r=E(n);function n(e){var t;return b(this,n),y(w(t=r.call(this,e)),"complete",function(e){t.setState({complete:e})}),y(w(t),"reset",function(){t.setState({complete:!1})}),t.state={complete:!1},t}return v(n,[{key:"showInactivePage",value:function(e){o.default.render(a.default.createElement(k,{activation:e.code,message:e.detail}),document.getElementById("page-mount"))}},{key:"render",value:function(){return this.state.complete?a.default.createElement(P,{callback:this.reset,user:this.state.complete}):a.default.createElement(j,{callback:this.complete,showInactivePage:this.showInactivePage})}}]),n}();r.default=N},{"../services/ajax":365,"../services/snackbar":376,"../utils/banned-page":379,"../utils/validators":393,"./..":302,"./button":8,"./form":56,react:"react","react-dom":"react-dom"}],202:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.ResetPasswordForm=r.PasswordChangedPage=void 0;var s=y(e("react")),c=y(e("react-dom")),o=y(e("./..")),l=y(e("./button")),i=y(e("./form")),n=y(e("./sign-in.js")),u=y(e("../services/ajax")),f=y(e("../services/auth")),d=y(e("../services/modal")),p=y(e("../services/snackbar")),m=y(e("../utils/banned-page"));function y(e){return e&&e.__esModule?e:{default:e}}function b(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function h(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function v(e,t,r){return t&&h(e.prototype,t),r&&h(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=O(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=O(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function O(e){return(O=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var j=function(){g(n,i.default);var r=E(n);function n(e){var t;return b(this,n),(t=r.call(this,e)).state={isLoading:!1,password:""},t}return v(n,[{key:"clean",value:function(){return!!this.state.password.trim().length||(p.default.error(gettext("Enter new password.")),!1)}},{key:"send",value:function(){return u.default.post(o.default.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,m.default)(e.ban):p.default.apiError(e)}},{key:"render",value:function(){return s.default.createElement("div",{className:"well well-form well-form-reset-password"},s.default.createElement("form",{onSubmit:this.handleSubmit},s.default.createElement("div",{className:"form-group"},s.default.createElement("div",{className:"control-input"},s.default.createElement("input",{type:"password",className:"form-control",placeholder:gettext("Enter new password"),disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),s.default.createElement(l.default,{className:"btn-primary btn-block",loading:this.state.isLoading},gettext("Change password"))))}}]),n}();r.ResetPasswordForm=j;var P=function(){g(t,s.default.Component);var e=E(t);function t(){return b(this,t),e.apply(this,arguments)}return v(t,[{key:"getMessage",value:function(){return interpolate(gettext("%(username)s, your password has been changed successfully."),{username:this.props.user.username},!0)}},{key:"showSignIn",value:function(){d.default.show(n.default)}},{key:"render",value:function(){return s.default.createElement("div",{className:"page page-message page-message-success page-forgotten-password-changed"},s.default.createElement("div",{className:"container"},s.default.createElement("div",{className:"message-panel"},s.default.createElement("div",{className:"message-icon"},s.default.createElement("span",{className:"material-icon"},"check")),s.default.createElement("div",{className:"message-body"},s.default.createElement("p",{className:"lead"},this.getMessage()),s.default.createElement("p",null,gettext("You will have to sign in using new password before continuing.")),s.default.createElement("p",null,s.default.createElement("button",{type:"button",className:"btn btn-primary",onClick:this.showSignIn},gettext("Sign in")))))))}}]),t}();r.PasswordChangedPage=P;var k=function(){g(u,s.default.Component);var i=E(u);function u(){var e;b(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=w(e),n=function(e){f.default.softSignOut(),$('#hidden-login-form input[name="redirect_to"]').remove(),c.default.render(s.default.createElement(P,{user:e}),document.getElementById("page-mount"))},(r="complete")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return v(u,[{key:"render",value:function(){return s.default.createElement(j,{callback:this.complete})}}]),u}();r.default=k},{"../services/ajax":365,"../services/auth":366,"../services/modal":371,"../services/snackbar":376,"../utils/banned-page":379,"./..":302,"./button":8,"./form":56,"./sign-in.js":211,react:"react","react-dom":"react-dom"}],203:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),i=o(e("../..")),u=o(e("../form")),s=e("../../reducers/posts"),c=e("../../reducers/search"),f=e("../../reducers/users"),d=o(e("../../services/ajax")),p=o(e("../../services/snackbar")),m=o(e("../../services/store"));function o(e){return e&&e.__esModule?e:{default:e}}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(l,u.default);var e,t,r,o=h(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=v(t),a=function(e){t.changeValue("query",e.target.value)},(n="onQueryChange")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1,query:e.search.query},t}return e=l,(t=[{key:"componentDidMount",value:function(){this.state.query.length&&this.handleSubmit()}},{key:"clean",value:function(){return!!this.state.query.trim().length||(p.default.error(gettext("You have to enter search query.")),!1)}},{key:"send",value:function(){return m.default.dispatch((0,c.update)({isLoading:!0})),d.default.get(i.default.get("SEARCH_API"),{q:this.state.query.trim()})}},{key:"handleSuccess",value:function(e){m.default.dispatch((0,c.update)({query:this.state.query.trim(),isLoading:!1,providers:e})),e.forEach(function(e){"users"===e.id?m.default.dispatch((0,f.hydrate)(e.results.results)):"threads"===e.id&&m.default.dispatch((0,s.load)(e.results))})}},{key:"handleError",value:function(e){p.default.apiError(e),m.default.dispatch((0,c.update)({isLoading:!1}))}},{key:"render",value:function(){return n.default.createElement("div",{className:"page-header-bg"},n.default.createElement("div",{className:"page-header page-search-form"},n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"container"},n.default.createElement("div",{className:"row"},n.default.createElement("div",{className:"col-xs-12 col-md-3"},n.default.createElement("h1",null,gettext("Search"))),n.default.createElement("div",{className:"col-xs-12 col-md-9"},n.default.createElement("div",{className:"row xs-margin-top sm-margin-top"},n.default.createElement("div",{className:"col-xs-12 col-sm-8 col-md-9"},n.default.createElement("div",{className:"form-group"},n.default.createElement("input",{className:"form-control",disabled:this.props.search.isLoading||this.state.isLoading,onChange:this.onQueryChange,type:"text",value:this.state.query}))),n.default.createElement("div",{className:"col-xs-12 col-sm-4 col-md-3"},n.default.createElement("button",{className:"btn btn-primary btn-block btn-outline",disabled:this.props.search.isLoading||this.state.isLoading},gettext("Search"))))))))))}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=g},{"../..":302,"../../reducers/posts":354,"../../reducers/search":357,"../../reducers/users":364,"../../services/ajax":365,"../../services/snackbar":376,"../../services/store":377,"../form":56,react:"react"}],204:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.map(function(e){return{path:e.url,component:(0,n.connect)(u)(i[e.id]),provider:e}})},r.select=u;var n=e("react-redux"),a=l(e("./threads")),o=l(e("./users"));function l(e){return e&&e.__esModule?e:{default:e}}var i={threads:a.default,users:o.default};function u(e){return{posts:e.posts,search:e.search,tick:e.tick.tick,user:e.auth.user,users:e.users}}},{"./threads":207,"./users":209,"react-redux":"react-redux"}],205:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SearchTime=i,r.default=function(e){return n.default.createElement("div",{className:"page page-search"},n.default.createElement(a.default,{provider:e.provider,search:e.search}),n.default.createElement("div",{className:"container"},n.default.createElement("div",{className:"row"},n.default.createElement("div",{className:"col-md-3"},n.default.createElement(o.default,{providers:e.search.providers})),n.default.createElement("div",{className:"col-md-9"},e.children,n.default.createElement(i,{provider:e.provider,search:e.search})))))};var n=l(e("react")),a=l(e("./form")),o=l(e("./sidenav"));function l(e){return e&&e.__esModule?e:{default:e}}function i(t){var r=null;if(t.search.providers.forEach(function(e){e.id===t.provider.id&&(r=e.time)}),null===r)return null;var e=gettext("Search took %(time)s s to complete");return n.default.createElement("footer",{className:"search-footer"},n.default.createElement("p",null,interpolate(e,{time:r},!0)))}},{"./form":203,"./sidenav":206,react:"react"}],206:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Badge=l,r.default=function(e){return a.default.createElement("div",{className:"list-group nav-side"},e.providers.map(function(e){return a.default.createElement(o.Link,{activeClassName:"active",className:"list-group-item",key:e.id,to:e.url},a.default.createElement("span",{className:"material-icon"},e.icon),e.name,a.default.createElement(l,{results:e.results}))}))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n},o=e("react-router");function l(e){if(!e.results)return null;var t=e.results.count;return 1e6<t?t=Math.ceil(t/1e6)+"KK":1e3<t&&(t=Math.ceil(t/1e3)+"K"),a.default.createElement("span",{className:"badge"},t)}},{react:"react","react-router":"react-router"}],207:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Blankslate=u,r.default=function(e){return n.default.createElement(a.default,{provider:e.route.provider,search:e.search},n.default.createElement(u,{query:e.search.query,posts:e.posts},n.default.createElement(o.default,i({provider:e.route.provider,query:e.search.query},e.posts))))};var n=l(e("react")),a=l(e("../page")),o=l(e("./results"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){return(i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function u(e){return e.posts&&e.posts.count?e.children:e.query.length?n.default.createElement("p",{className:"lead"},gettext("No threads matching search query have been found.")):n.default.createElement("p",{className:"lead"},gettext("Enter at least two characters to search threads."))}},{"../page":205,"./results":208,react:"react"}],208:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.LoadMore=void 0,r.default=function(e){return n.default.createElement("div",null,n.default.createElement(o.default,{isReady:!0,posts:e.results}),n.default.createElement(v,e))};var n=i(e("react")),o=i(e("../../post-feed")),l=i(e("../../button")),s=(i(e("../../misago-markup")),e("../../../reducers/posts")),c=e("../../../reducers/search"),f=i(e("../../../services/ajax")),d=i(e("../../../services/snackbar")),p=i(e("../../../services/store"));function i(e){return e&&e.__esModule?e:{default:e}}function m(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=u(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=u(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function u(e){return(u=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var v=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(u,n.default.Component);var e,t,r,i=b(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=h(e),n=function(){p.default.dispatch((0,s.update)({isBusy:!0})),f.default.get(e.props.provider.api,{q:e.props.query,page:e.props.next}).then(function(e){e.forEach(function(e){"threads"===e.id&&(p.default.dispatch((0,s.append)(e.results)),p.default.dispatch((0,c.updateProvider)(e)))}),p.default.dispatch((0,s.update)({isBusy:!1}))},function(e){d.default.apiError(e),p.default.dispatch((0,s.update)({isBusy:!1}))})},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return this.props.more?n.default.createElement("div",{className:"pager-more"},n.default.createElement(l.default,{className:"btn btn-default btn-outline",loading:this.props.isBusy,onClick:this.onClick},gettext("Show more"))):null}}])&&m(e.prototype,t),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.LoadMore=v},{"../../../reducers/posts":354,"../../../reducers/search":357,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377,"../../button":8,"../../misago-markup":60,"../../post-feed":122,react:"react"}],209:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Blankslate=i,r.default=function(e){return n.default.createElement(a.default,{provider:e.route.provider,search:e.search},n.default.createElement(i,{query:e.search.query,users:e.users},n.default.createElement(o.default,{cols:3,isReady:!0,users:e.users})))};var n=l(e("react")),a=l(e("../page")),o=l(e("../../users-list"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){return e.users.length?e.children:e.query.length?n.default.createElement("p",{className:"lead"},gettext("No users matching search query have been found.")):n.default.createElement("p",{className:"lead"},gettext("Enter at least two characters to search users."))}},{"../../users-list":284,"../page":205,react:"react"}],210:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Icon=d,r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return f(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(u,o.default.Component);var e,t,r,i=c(u);function u(){var t;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var e,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return t=i.call.apply(i,[this].concat(o)),e=f(t),n=function(e){return function(){t.props.onChange({target:{value:e}})}},(r="change")in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,t}return e=u,(t=[{key:"getChoice",value:function(){var t=this,r=null;return this.props.choices.map(function(e){e.value===t.props.value&&(r=e)}),r}},{key:"getIcon",value:function(){return this.getChoice().icon}},{key:"getLabel",value:function(){return this.getChoice().label}},{key:"render",value:function(){var r=this;return o.default.createElement("div",{className:"btn-group btn-select-group"},o.default.createElement("button",{type:"button",className:"btn btn-select dropdown-toggle",id:this.props.id||null,"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-describedby":this.props["aria-describedby"]||null,disabled:this.props.disabled||!1},o.default.createElement(d,{icon:this.getIcon()}),this.getLabel()),o.default.createElement("ul",{className:"dropdown-menu"},this.props.choices.map(function(e,t){return o.default.createElement("li",{key:t},o.default.createElement("button",{type:"button",className:"btn-link",onClick:r.change(e.value)},o.default.createElement(d,{icon:e.icon}),e.label))})))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();function d(e){var t=e.icon;return t?o.default.createElement("span",{className:"material-icon"},t):null}r.default=u},{react:"react"}],211:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./..")),i=n(e("./button")),u=n(e("./form")),s=n(e("./StartSocialAuth")),c=n(e("../services/ajax")),f=n(e("../services/modal")),d=n(e("../services/snackbar")),p=n(e("../utils/banned-page"));function n(e){return e&&e.__esModule?e:{default:e}}function m(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=h(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=h(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){return(h=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var v=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(a,u.default);var e,t,r,n=b(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={isLoading:!1,showActivation:!1,username:"",password:"",validators:{username:[],password:[]}},t}return e=a,(t=[{key:"clean",value:function(){return!!this.isValid()||(d.default.error(gettext("Fill out both fields.")),!1)}},{key:"send",value:function(){return c.default.post(l.default.get("AUTH_API"),{username:this.state.username,password:this.state.password})}},{key:"handleSuccess",value:function(){var e=$("#hidden-login-form");e.append('<input type="text" name="username" />'),e.append('<input type="password" name="password" />'),e.find('input[type="hidden"]').val(c.default.getCsrfToken()),e.find('input[name="redirect_to"]').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?d.default.info(e.detail):"inactive_user"===e.code?(d.default.info(e.detail),this.setState({showActivation:!0})):"banned"===e.code?((0,p.default)(e.detail),f.default.hide()):d.default.error(e.detail):403===e.status&&e.ban?((0,p.default)(e.ban),f.default.hide()):d.default.apiError(e)}},{key:"getActivationButton",value:function(){return this.state.showActivation?o.default.createElement("a",{className:"btn btn-success btn-block",href:l.default.get("REQUEST_ACTIVATION_URL")},gettext("Activate account")):null}},{key:"render",value:function(){return o.default.createElement("div",{className:"modal-dialog modal-sm modal-sign-in",role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Sign in"))),o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"modal-body"},o.default.createElement(s.default,{buttonLabel:gettext("Sign in with %(site)s"),formLabel:gettext("Or use your forum account:"),labelClassName:"text-center"}),o.default.createElement("div",{className:"form-group"},o.default.createElement("div",{className:"control-input"},o.default.createElement("input",{className:"form-control input-lg",disabled:this.state.isLoading,id:"id_username",onChange:this.bindInput("username"),placeholder:gettext("Username or e-mail"),type:"text",value:this.state.username}))),o.default.createElement("div",{className:"form-group"},o.default.createElement("div",{className:"control-input"},o.default.createElement("input",{className:"form-control input-lg",disabled:this.state.isLoading,id:"id_password",onChange:this.bindInput("password"),placeholder:gettext("Password"),type:"password",value:this.state.password})))),o.default.createElement("div",{className:"modal-footer"},this.getActivationButton(),o.default.createElement(i.default,{className:"btn-primary btn-block",loading:this.state.isLoading},gettext("Sign in")),o.default.createElement("a",{className:"btn btn-default btn-block",href:l.default.get("FORGOTTEN_PASSWORD_URL")},gettext("Forgot password?"))))))}}])&&m(e.prototype,t),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=v},{"../services/ajax":365,"../services/modal":371,"../services/snackbar":376,"../utils/banned-page":379,"./..":302,"./StartSocialAuth":2,"./button":8,"./form":56,react:"react"}],212:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Snackbar=void 0,r.select=function(e){return e.snackbar};var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c={info:"alert-info",success:"alert-success",warning:"alert-warning",error:"alert-danger"},f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getSnackbarClass",value:function(){var e="alerts-snackbar";return this.props.isVisible?e+=" in":e+=" out",e}},{key:"render",value:function(){return o.default.createElement("div",{className:this.getSnackbarClass()},o.default.createElement("p",{className:"alert "+c[this.props.type]},this.props.message))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.Snackbar=f},{react:"react"}],213:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var l=n(e("react")),i=n(e("./header")),u=n(e("../.."));function n(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=e.activation,r=e.backend_name,n=e.username,a="",o="",o="user"===t?gettext("%(username)s, your account has been created but you need to activate it before you will be able to sign in."):"admin"===t?gettext("%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in."):gettext("%(username)s, your account has been created and you have been signed in to it."),a="active"===t?"check":"info_outline";return l.default.createElement("div",{className:"page page-social-auth page-social-sauth-register"},l.default.createElement(i.default,{backendName:r}),l.default.createElement("div",{className:"container"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-md-6 col-md-offset-3"},l.default.createElement("div",{className:"panel panel-default panel-form"},l.default.createElement("div",{className:"panel-heading"},l.default.createElement("h3",{className:"panel-title"},gettext("Registration completed!"))),l.default.createElement("div",{className:"panel-body panel-message-body"},l.default.createElement("div",{className:"message-icon"},l.default.createElement("span",{className:"material-icon"},a)),l.default.createElement("div",{className:"message-body"},l.default.createElement("p",{className:"lead"},interpolate(o,{username:n},!0)),l.default.createElement("p",{className:"help-block"},l.default.createElement("a",{className:"btn btn-default",href:u.default.get("MISAGO_PATH")},gettext("Return to forum index"))))))))))}r.default=a},{"../..":302,"./header":214,react:"react"}],214:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){var t=e.backendName,r=gettext("Sign in with %(backend)s"),n=interpolate(r,{backend:t},!0);return a.default.createElement("div",{className:"page-header-bg"},a.default.createElement("div",{className:"page-header"},a.default.createElement("div",{className:"container"},a.default.createElement("h1",null,n))))}r.default=o},{react:"react"}],215:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var u=n(e("react")),s=n(e("./register")),c=n(e("./complete"));function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(l,u.default.Component);var e,t,r,a=f(l);function l(e){var o,t,r,n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),o=a.call(this,e),t=d(o),n=function(e){var t=e.activation,r=e.email,n=e.step,a=e.username;o.setState({activation:t,email:r,step:n,username:a})},(r="handleRegistrationComplete")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,o.state={step:e.step,activation:e.activation||"",email:e.email||"",username:e.username||""},o}return e=l,(t=[{key:"render",value:function(){var e=this.props,t=e.backend_name,r=e.url,n=this.state,a=n.activation,o=n.email,l=n.step,i=n.username;return"register"===l?u.default.createElement(s.default,{backend_name:t,email:o,url:r,username:i,onRegistrationComplete:this.handleRegistrationComplete}):u.default.createElement(c.default,{activation:a,backend_name:t,email:o,url:r,username:i})}}])&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=p},{"./complete":213,"./register":216,react:"react"}],216:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var u=n(e("react")),o=n(e("../..")),s=n(e("../RegisterLegalFootnote")),c=n(e("../button")),l=n(e("../form")),f=n(e("../form-group")),d=n(e("../../services/ajax")),p=n(e("../../services/snackbar")),m=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=b(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../utils/validators")),y=n(e("./header"));function b(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(b=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function a(t,e){var r,n=Object.keys(t);return Object.getOwnPropertySymbols&&(r=Object.getOwnPropertySymbols(t),e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,r)),n}function h(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?a(Object(r),!0).forEach(function(e){O(t,e,r[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))})}return t}function v(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=w(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=w(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function w(e){return(w=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function O(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var j=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}(a,l.default);var e,t,r,n=_(a);function a(e){var i;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),O(E(i=n.call(this,e)),"handlePrivacyPolicyChange",function(e){var t=e.target.value;i.handleToggleAgreement("privacyPolicy",t)}),O(E(i),"handleTermsOfServiceChange",function(e){var t=e.target.value;i.handleToggleAgreement("termsOfService",t)}),O(E(i),"handleToggleAgreement",function(o,l){i.setState(function(e,t){if(null===e[o]){var r=h(h({},e.errors),{},O({},o,null));return O({errors:r},o,l)}var n=i.state.validators[o][0],a=h(h({},e.errors),{},O({},o,[n(null)]));return O({errors:a},o,null)})});var t={email:[m.email()],username:[m.usernameContent()]};return o.default.get("TERMS_OF_SERVICE_ID")&&(t.termsOfService=[m.requiredTermsOfService()]),o.default.get("PRIVACY_POLICY_ID")&&(t.privacyPolicy=[m.requiredPrivacyPolicy()]),i.state={email:e.email||"",emailProtected:!!e.email,username:e.username||"",termsOfService:null,privacyPolicy:null,validators:t,errors:{},isLoading:!1},i}return e=a,(t=[{key:"clean",value:function(){this.validate();if(-1!==[this.state.email.trim().length,this.state.username.trim().length].indexOf(0))return p.default.error(gettext("Fill out all fields.")),!1;var e=this.state.validators;return o.default.get("TERMS_OF_SERVICE_ID")&&null===this.state.termsOfService?(p.default.error(e.termsOfService[0](null)),!1):!o.default.get("PRIVACY_POLICY_ID")||null!==this.state.privacyPolicy||(p.default.error(e.privacyPolicy[0](null)),p.default.error(gettext("You need to accept the privacy policy.")),!1)}},{key:"send",value:function(){return d.default.post(this.props.url,{email:this.state.email,username:this.state.username,terms_of_service:this.state.termsOfService,privacy_policy:this.state.privacyPolicy})}},{key:"handleSuccess",value:function(e){(0,this.props.onRegistrationComplete)(e)}},{key:"handleError",value:function(e){var t;200===e.status?(0,this.props.onRegistrationComplete)({activation:"active",step:"done",username:this.state.username}):400===e.status?(t={errors:e},e.email&&(t.emailProtected=!1),this.setState(t)):p.default.apiError(e)}},{key:"render",value:function(){var e,t=this.props.backend_name,r=this.state,n=r.email,a=r.emailProtected,o=r.username,l=r.isLoading,i=null;return a&&(e=gettext("Your e-mail address has been verified by %(backend)s."),i=interpolate(e,{backend:t},!0)),u.default.createElement("div",{className:"page page-social-auth page-social-sauth-register"},u.default.createElement(y.default,{backendName:t}),u.default.createElement("div",{className:"container"},u.default.createElement("div",{className:"row"},u.default.createElement("div",{className:"col-md-6 col-md-offset-3"},u.default.createElement("form",{onSubmit:this.handleSubmit},u.default.createElement("div",{className:"panel panel-default panel-form"},u.default.createElement("div",{className:"panel-heading"},u.default.createElement("h3",{className:"panel-title"},gettext("Complete your details"))),u.default.createElement("div",{className:"panel-body"},u.default.createElement(f.default,{for:"id_username",label:gettext("Username"),validation:this.state.errors.username},u.default.createElement("input",{type:"text",id:"id_username",className:"form-control",disabled:l,onChange:this.bindInput("username"),value:o})),u.default.createElement(f.default,{for:"id_email",label:gettext("E-mail address"),helpText:i,validation:a?null:this.state.errors.email},u.default.createElement("input",{type:"email",id:"id_email",className:"form-control",disabled:l||a,onChange:this.bindInput("email"),value:n})),u.default.createElement(s.default,{errors:this.state.errors,privacyPolicy:this.state.privacyPolicy,termsOfService:this.state.termsOfService,onPrivacyPolicyChange:this.handlePrivacyPolicyChange,onTermsOfServiceChange:this.handleTermsOfServiceChange})),u.default.createElement("div",{className:"panel-footer"},u.default.createElement(c.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Sign in")))))))))}}])&&v(e.prototype,t),r&&v(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=j},{"../..":302,"../../services/ajax":365,"../../services/snackbar":376,"../../utils/validators":393,"../RegisterLegalFootnote":1,"../button":8,"../form":56,"../form-group":55,"./header":214,react:"react"}],217:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Breadcrumb=o,r.GoBack=l,r.default=function(e){return a.default.createElement("div",{className:"page-breadcrumbs"},a.default.createElement("div",{className:"container"},a.default.createElement("ol",{className:"breadcrumb hidden-xs"},e.path.map(function(e){return a.default.createElement(o,{key:e.id,node:e})})),a.default.createElement(l,e)))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){return a.default.createElement("li",null,a.default.createElement("a",{href:e.node.url.index},e.node.name))}function l(e){var t=e.path[e.path.length-1];return a.default.createElement("a",{href:t.url.index,className:"go-back-sm visible-xs-block"},a.default.createElement("span",{className:"material-icon"},"chevron_left"),t.name)}},{react:"react"}],218:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Moderation=j,r.default=void 0;var o=n(e("react")),l=n(e("./breadcrumbs")),u=e("../moderation/thread"),s=n(e("./stats")),c=n(e("../../form")),f=e("../../posting/utils/validators"),d=n(e("../../../services/ajax")),p=n(e("../../../services/snackbar")),m=n(e("../../../services/store")),y=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=b(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/thread"));function b(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(b=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function h(){return(h=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function v(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function w(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var O=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}(a,c.default);var e,t,r,n=_(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),w(E(t=n.call(this,e)),"onChange",function(e){t.changeValue("title",e.target.value)}),w(E(t),"onEdit",function(){t.setState({isEditing:!0})}),w(E(t),"onCancel",function(){t.setState({title:t.props.thread.title,isEditing:!1})}),t.state={isEditing:!1,isLoading:!1,title:e.thread.title,validators:{title:(0,f.getTitleValidators)()},errors:{}},t}return e=a,(t=[{key:"clean",value:function(){if(!this.state.title.trim().length)return p.default.error(gettext("You have to enter thread title.")),!1;var e=this.validate();return!e.title||(p.default.error(e.title[0]),!1)}},{key:"send",value:function(){return d.default.patch(this.props.thread.api.index,[{op:"replace",path:"title",value:this.state.title}])}},{key:"handleSuccess",value:function(e){m.default.dispatch(y.update(e)),this.setState({isEditing:!1})}},{key:"handleError",value:function(e){400===e.status?p.default.error(e.detail[0]):p.default.apiError(e)}},{key:"render",value:function(){var e=this.props,t=e.thread,r=e.user,n=!!r.id&&(0,u.isModerationVisible)(t);return this.state.isEditing?o.default.createElement("div",{className:"page-header"},o.default.createElement(l.default,{path:t.path}),o.default.createElement("div",{className:"container"},o.default.createElement("div",{className:"row xs-margin-top title-edit-form"},o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"col-sm-6 col-md-6"},o.default.createElement("input",{className:"form-control",type:"text",value:this.state.title,onChange:this.onChange})),o.default.createElement("div",{className:"col-sm-6 col-md-4"},o.default.createElement("div",{className:"row xs-margin-top-half sm-margin-top-no md-margin-top-no"},o.default.createElement("div",{className:"col-xs-6"},o.default.createElement("button",{className:"btn btn-primary btn-block btn-outline",disabled:this.state.isLoading,title:gettext("Change title")},gettext("Save changes"))),o.default.createElement("div",{className:"col-xs-6"},o.default.createElement("button",{className:"btn btn-default btn-block btn-outline",disabled:this.state.isLoading,onClick:this.onCancel,title:gettext("Cancel"),type:"button"},gettext("Cancel")))))))),o.default.createElement(s.default,{thread:t})):r.id&&t.acl.can_edit?o.default.createElement("div",{className:"page-header"},o.default.createElement(l.default,{path:t.path}),o.default.createElement("div",{className:"container"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:n?"col-sm-9 col-md-8":"col-sm-10 col-md-10"},o.default.createElement("h1",null,t.title)),o.default.createElement("div",{className:n?"col-sm-3 col-md-4":"col-sm-3 col-md-2"},o.default.createElement("div",{className:"row xs-margin-top md-margin-top-no"},o.default.createElement("div",{className:n?"col-xs-6":"col-xs-12"},o.default.createElement("button",{className:"btn btn-default btn-block btn-outline",onClick:this.onEdit,title:gettext("Edit title"),type:"button"},o.default.createElement("span",{className:"material-icon"},"edit"),o.default.createElement("span",{className:"hidden-sm"},gettext("Edit")))),n&&o.default.createElement(j,this.props))))),o.default.createElement(s.default,{thread:t})):n?o.default.createElement("div",{className:"page-header"},o.default.createElement(l.default,{path:t.path}),o.default.createElement("div",{className:"container"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-sm-9 col-md-10"},o.default.createElement("h1",null,t.title)),o.default.createElement("div",{className:"col-sm-3 col-md-2"},o.default.createElement("div",{className:"row xs-margin-top md-margin-top-no"},o.default.createElement(j,h({isSingle:!0},this.props)))))),o.default.createElement(s.default,{thread:t})):o.default.createElement("div",{className:"page-header"},o.default.createElement(l.default,{path:t.path}),o.default.createElement("div",{className:"container"},o.default.createElement("h1",null,t.title)),o.default.createElement(s.default,{thread:t}))}}])&&v(e.prototype,t),r&&v(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function j(e){return o.default.createElement("div",{className:e.isSingle?"col-xs-12":"col-xs-6"},o.default.createElement("div",{className:"btn-group btn-group-justified"},o.default.createElement("div",{className:"btn-group"},o.default.createElement("button",{"aria-expanded":"false","aria-haspopup":"true",className:"btn btn-default btn-outline dropdown-toggle","data-toggle":"dropdown",disabled:e.thread.isBusy,type:"button"},o.default.createElement("span",{className:"material-icon"},"settings"),o.default.createElement("span",{className:e.isSingle?"":"hidden-sm"},gettext("Moderation"))),o.default.createElement(u.ModerationControls,{posts:e.posts,thread:e.thread,user:e.user}))))}r.default=O},{"../../../reducers/thread":360,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377,"../../form":56,"../../posting/utils/validators":144,"../moderation/thread":227,"./breadcrumbs":217,"./stats":219,react:"react"}],219:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.IsClosed=d,r.IsHidden=f,r.LastReply=m,r.Replies=p,r.Unapproved=c,r.Weight=s,r.default=function(e){return a.default.createElement("div",{className:"header-stats"},a.default.createElement("div",{className:"container"},a.default.createElement("ul",{className:"list-inline"},a.default.createElement(s,{thread:e.thread}),a.default.createElement(c,{thread:e.thread}),a.default.createElement(f,{thread:e.thread}),a.default.createElement(d,{thread:e.thread}),a.default.createElement(p,{thread:e.thread}),a.default.createElement(m,{thread:e.thread}))))};var a=n(e("react")),o=n(e("../../../utils/escape-html"));function n(e){return e&&e.__esModule?e:{default:e}}var l='<a href="%(url)s" class="poster-title">%(user)s</a>',i='<span class="poster-title">%(user)s</span>',u='<abbr class="last-title" title="%(absolute)s">%(relative)s</abbr>';function s(e){return 2==e.thread.weight?a.default.createElement("li",{className:"thread-pinned-globally"},a.default.createElement("span",{className:"material-icon"},"bookmark"),a.default.createElement("span",{className:"icon-legend"},gettext("Pinned globally"))):1==e.thread.weight?a.default.createElement("li",{className:"thread-pinned-locally"},a.default.createElement("span",{className:"material-icon"},"bookmark_border"),a.default.createElement("span",{className:"icon-legend"},gettext("Pinned locally"))):null}function c(e){return e.thread.is_unapproved?a.default.createElement("li",{className:"thread-unapproved"},a.default.createElement("span",{className:"material-icon"},"remove_circle"),a.default.createElement("span",{className:"icon-legend"},gettext("Unapproved"))):e.thread.has_unapproved_posts?a.default.createElement("li",{className:"thread-unapproved-posts"},a.default.createElement("span",{className:"material-icon"},"remove_circle_outline"),a.default.createElement("span",{className:"icon-legend"},gettext("Unapproved posts"))):null}function f(e){return e.thread.is_hidden?a.default.createElement("li",{className:"thread-hidden"},a.default.createElement("span",{className:"material-icon"},"visibility_off"),a.default.createElement("span",{className:"icon-legend"},gettext("Hidden"))):null}function d(e){return e.thread.is_closed?a.default.createElement("li",{className:"thread-closed"},a.default.createElement("span",{className:"material-icon"},"lock_outline"),a.default.createElement("span",{className:"icon-legend"},gettext("Closed"))):null}function p(e){var t=ngettext("%(replies)s reply","%(replies)s replies",e.thread.replies),r=interpolate(t,{replies:e.thread.replies},!0);return a.default.createElement("li",{className:"thread-replies"},a.default.createElement("span",{className:"material-icon"},"forum"),a.default.createElement("span",{className:"icon-legend"},r))}function m(e){var t=null,t=e.thread.url.last_poster?interpolate(l,{url:(0,o.default)(e.thread.url.last_poster),user:(0,o.default)(e.thread.last_poster_name)},!0):interpolate(i,{user:(0,o.default)(e.thread.last_poster_name)},!0),r=interpolate(u,{absolute:(0,o.default)(e.thread.last_post_on.format("LLL")),relative:(0,o.default)(e.thread.last_post_on.fromNow())},!0),n=interpolate((0,o.default)(gettext("last reply by %(user)s %(date)s")),{date:r,user:t},!0);return a.default.createElement("li",{className:"thread-last-reply",dangerouslySetInnerHTML:{__html:n}})}},{"../../../utils/escape-html":383,react:"react"}],220:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.approve=function(e){var t=e.selection,r=t.map(function(e){return{id:e.id,is_unapproved:!1}}),n=t.map(function(e){return{id:e.id,is_unapproved:e.is_unapproved}});l(e,[{op:"replace",path:"is-unapproved",value:!1}],r,n)},r.hide=function(t){var e=t.selection,r=e.map(function(e){return{id:e.id,is_hidden:!0,hidden_on:(0,a.default)(),hidden_by_name:t.user.username,url:Object.assign(e.url,{hidden_by:t.user.url})}}),n=e.map(function(e){return{id:e.id,is_hidden:e.is_hidden,hidden_on:e.hidden_on,hidden_by_name:e.hidden_by_name,url:e.url}});l(t,[{op:"replace",path:"is-hidden",value:!0}],r,n)},r.merge=function(t){if(!window.confirm(gettext("Are you sure you want to merge selected posts? This action is not reversible!")))return;t.selection.slice(1).map(function(e){m.default.dispatch(s.patch(e,{isDeleted:!0}))}),f.default.post(t.thread.api.posts.merge,{posts:t.selection.map(function(e){return e.id})}).then(function(e){m.default.dispatch(s.patch(e,s.hydrate(e)))},function(e){400===e.status?p.default.error(e.detail):p.default.apiError(e),t.selection.slice(1).map(function(e){m.default.dispatch(s.patch(e,{isDeleted:!1}))})}),m.default.dispatch(c.deselectAll())},r.patch=l,r.protect=function(e){var t=e.selection,r=t.map(function(e){return{id:e.id,is_protected:!0}}),n=t.map(function(e){return{id:e.id,is_protected:e.is_protected}});l(e,[{op:"replace",path:"is-protected",value:!0}],r,n)},r.remove=function(t){if(!window.confirm(gettext("Are you sure you want to delete selected posts? This action is not reversible!")))return;t.selection.map(function(e){m.default.dispatch(s.patch(e,{isDeleted:!0}))});var e=t.selection.map(function(e){return e.id});f.default.delete(t.thread.api.posts.index,e).then(function(){},function(e){400===e.status?p.default.error(e.detail):p.default.apiError(e),t.selection.map(function(e){m.default.dispatch(s.patch(e,{isDeleted:!1}))})}),m.default.dispatch(c.deselectAll())},r.unhide=function(t){var e=t.selection,r=e.map(function(e){return{id:e.id,is_hidden:!1,hidden_on:(0,a.default)(),hidden_by_name:t.user.username,url:Object.assign(e.url,{hidden_by:t.user.url})}}),n=e.map(function(e){return{id:e.id,is_hidden:e.is_hidden,hidden_on:e.hidden_on,hidden_by_name:e.hidden_by_name,url:e.url}});l(t,[{op:"replace",path:"is-hidden",value:!1}],r,n)},r.unprotect=function(e){var t=e.selection,r=t.map(function(e){return{id:e.id,is_protected:!1}}),n=t.map(function(e){return{id:e.id,is_protected:e.is_protected}});l(e,[{op:"replace",path:"is-protected",value:!1}],r,n)};var a=o(e("moment")),u=o(e("react")),s=n(e("../../../../reducers/post")),c=n(e("../../../../reducers/posts")),f=o(e("../../../../services/ajax")),d=o(e("../../../../services/modal")),p=o(e("../../../../services/snackbar")),m=o(e("../../../../services/store")),y=o(e("./errors-list"));function b(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(b=function(e){return e?r:t})(e)}function n(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=b(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function o(e){return e&&e.__esModule?e:{default:e}}function l(e,t,r,a){var o=e.selection,n=e.thread;r.forEach(function(e){s.patch(e,e)}),m.default.dispatch(c.deselectAll());var l={ops:t,ids:o.map(function(e){return e.id})};f.default.patch(n.api.posts.index,l).then(function(e){e.forEach(function(e){m.default.dispatch(s.patch(e,e))})},function(e){if(400!==e.status)return a.forEach(function(e){m.default.dispatch(s.patch(e,e))}),p.default.apiError(e);var t=[],r=[];e.forEach(function(e){e.detail?(t.push(e),r.push(e.id)):m.default.dispatch(s.patch(e,e)),a.forEach(function(e){-1!==r.indexOf(e)&&m.default.dispatch(s.patch(e,e))})});var n={};o.forEach(function(e){n[e.id]=e}),d.default.show(u.default.createElement(y.default,{errors:t,posts:n}))})}},{"../../../../reducers/post":353,"../../../../reducers/posts":354,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"./errors-list":222,moment:"moment",react:"react"}],221:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Unprotect=r.Unhide=r.Split=r.Protect=r.Move=r.Merge=r.Hide=r.Delete=r.Approve=void 0,r.default=function(e){return l.default.createElement("ul",{className:"dropdown-menu"},l.default.createElement(_,e),l.default.createElement(E,e),l.default.createElement(w,e),l.default.createElement(O,e),l.default.createElement(j,e),l.default.createElement(P,e),l.default.createElement(N,e),l.default.createElement(k,e),l.default.createElement(x,e))};var l=n(e("react")),u=n(e("../../../../services/modal")),s=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./actions")),c=n(e("./move")),f=n(e("./split"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t,r){return t&&a(e.prototype,t),r&&a(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function y(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&o(e,t)}function o(e,t){return(o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=v(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=v(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function g(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var _=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.approve(e.props)}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.acl.can_approve&&e.is_unapproved})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"done"),gettext("Approve"))):null}}]),o}();r.Approve=_;var E=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.merge(e.props)}),e}return m(o,[{key:"render",value:function(){return 1<this.props.selection.length&&this.props.selection.find(function(e){return e.acl.can_merge})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"call_merge"),gettext("Merge"))):null}}]),o}();r.Merge=E;var w=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.default.show(l.default.createElement(c.default,e.props))}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.acl.can_move})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"arrow_forward"),gettext("Move"))):null}}]),o}();r.Move=w;var O=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.default.show(l.default.createElement(f.default,e.props))}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.acl.can_move})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"call_split"),gettext("Split"))):null}}]),o}();r.Split=O;var j=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.protect(e.props)}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return!e.is_protected&&e.acl.can_protect})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"lock_outline"),gettext("Protect"))):null}}]),o}();r.Protect=j;var P=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.unprotect(e.props)}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.is_protected&&e.acl.can_protect})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"lock_open"),gettext("Unprotect"))):null}}]),o}();r.Unprotect=P;var k=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.hide(e.props)}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.acl.can_hide&&!e.is_hidden})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"visibility_off"),gettext("Hide"))):null}}]),o}();r.Hide=k;var N=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.unhide(e.props)}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.acl.can_unhide&&e.is_hidden})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"visibility"),gettext("Unhide"))):null}}]),o}();r.Unhide=N;var x=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.remove(e.props)}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.acl.can_delete})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"clear"),gettext("Delete"))):null}}]),o}();r.Delete=x},{"../../../../services/modal":371,"./actions":220,"./move":224,"./split":225,react:"react"}],222:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.PostErrors=o,r.default=function(e){var t=e.errors,r=e.posts;return a.default.createElement("div",{className:"modal-dialog",role:"document"},a.default.createElement("div",{className:"modal-content"},a.default.createElement("div",{className:"modal-header"},a.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},a.default.createElement("span",{"aria-hidden":"true"},"×")),a.default.createElement("h4",{className:"modal-title"},gettext("Moderation"))),a.default.createElement("div",{className:"modal-body"},a.default.createElement("p",{className:"lead"},gettext("One or more posts could not be changed:")),a.default.createElement("ul",{className:"list-unstyled list-errored-items"},t.map(function(e){return a.default.createElement(o,{errors:e.detail,key:e.id,post:r[e.id]})})))))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){var t=e.errors,r=e.post,n=interpolate(gettext("%(username)s on %(posted_on)s"),{posted_on:r.posted_on.format("LL, LT"),username:r.poster_name},!0);return a.default.createElement("li",null,a.default.createElement("h5",null,n,":"),t.map(function(e,t){return a.default.createElement("p",{key:t},e)}))}},{react:"react"}],223:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){if(!e.user.id||!i(e.thread,e.posts.results))return null;var t=e.posts.results.filter(function(e){return e.isSelected});return n.default.createElement("div",{className:"dropup"},n.default.createElement("button",{"aria-expanded":"true","aria-haspopup":"true",className:"btn btn-default dropdown-toggle btn-block btn-outline","data-toggle":"dropdown",disabled:!t.length,type:"button"},gettext("Posts options")),n.default.createElement(a.default,l({selection:t},e)))},r.isVisible=i;var n=o(e("react")),a=o(e("./dropdown"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){if(e.acl.can_merge_posts&&1<t.length)return!0;var r=!1;return t.forEach(function(e){e.is_event||(e.acl.can_approve&&e.is_unapproved||e.acl.can_delete||!e.is_hidden&&e.acl.can_hide||e.acl.can_move||e.acl.can_merge||e.acl.can_protect||e.is_hidden&&e.acl.can_unhide||e.acl.can_unprotect)&&(r=!0)}),r}},{"./dropdown":221,react:"react"}],224:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ModalHeader=_,r.default=void 0;var n=o(e("react")),a=(o(e("../../../button")),o(e("../../../form"))),u=o(e("../../../form-group")),s=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=m(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../../reducers/post")),c=o(e("../../../../services/ajax")),f=o(e("../../../../services/modal")),d=o(e("../../../../services/snackbar")),p=o(e("../../../../services/store"));function m(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(m=function(e){return e?r:t})(e)}function o(e){return e&&e.__esModule?e:{default:e}}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(l,a.default);var e,t,r,o=h(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=v(t),a=function(e){t.changeValue("url",e.target.value)},(n="onUrlChange")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1,url:"",validators:{url:[]},errors:{}},t}return e=l,(t=[{key:"clean",value:function(){return!!this.state.url.trim().length||(d.default.error(gettext("You have to enter link to the other thread.")),!1)}},{key:"send",value:function(){return c.default.post(this.props.thread.api.posts.move,{new_thread:this.state.url,posts:this.props.selection.map(function(e){return e.id})})}},{key:"handleSuccess",value:function(){this.props.selection.forEach(function(e){p.default.dispatch(s.patch(e,{isDeleted:!0}))}),f.default.hide(),d.default.success(gettext("Selected posts were moved to the other thread."))}},{key:"handleError",value:function(e){400===e.status?d.default.error(e.detail):d.default.apiError(e)}},{key:"render",value:function(){return n.default.createElement("div",{className:"modal-dialog",role:"document"},n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"modal-content"},n.default.createElement(_,null),n.default.createElement("div",{className:"modal-body"},n.default.createElement(u.default,{for:"id_url",label:gettext("Link to thread you want to move posts to")},n.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,id:"id_url",onChange:this.onUrlChange,value:this.state.url}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),n.default.createElement("button",{className:"btn btn-primary",loading:this.state.isLoading},gettext("Move posts"))))))}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function _(e){return n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Move posts")))}r.default=g},{"../../../../reducers/post":353,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../button":8,"../../../form":56,"../../../form-group":55,react:"react"}],225:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Error=T,r.Loader=M,r.Modal=L,r.PostingConfig=r.ModerationForm=void 0,r.default=function(e){return a.default.createElement(R,S({},e,{Form:C}))};var a=_(e("react")),n=_(e("../../../button")),u=_(e("../../../form")),s=_(e("../../../form-group")),c=_(e("../../../category-select")),o=_(e("../../../modal-loader")),f=_(e("../../../select")),d=l(e("../../../../reducers/post")),p=_(e("../../../../services/ajax")),m=_(e("../../../../services/modal")),y=_(e("../../../../services/snackbar")),b=_(e("../../../../services/store")),h=l(e("../../../../utils/validators")),v=_(e("./errors-list"));function g(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(g=function(e){return e?r:t})(e)}function l(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=g(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function _(e){return e&&e.__esModule?e:{default:e}}function E(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function w(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function O(e,t,r){return t&&w(e.prototype,t),r&&w(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function j(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&P(e,t)}function P(e,t){return(P=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function k(r){var 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}}();return function(){var e,t=x(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return N(e)}(this,n?(e=x(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function N(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function x(e){return(x=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function S(){return(S=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}var R=function(){j(n,a.default.Component);var r=k(n);function n(e){var t;return E(this,n),(t=r.call(this,e)).state={isLoaded:!1,isError:!1,categories:[]},t}return O(n,[{key:"componentDidMount",value:function(){var r=this;p.default.get(misago.get("THREAD_EDITOR_API")).then(function(e){var t=e.map(function(e){return Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id,post:e.post})});r.setState({isLoaded:!0,categories:t})},function(e){r.setState({isError:e.detail})})}},{key:"render",value:function(){return this.state.isError?a.default.createElement(T,{message:this.state.isError}):this.state.isLoaded?a.default.createElement(C,S({},this.props,{categories:this.state.categories})):a.default.createElement(M,null)}}]),n}();r.PostingConfig=R;var C=function(){j(l,u.default);var o=k(l);function l(e){var n,t,r,a;return E(this,l),n=o.call(this,e),t=N(n),a=function(e){var t=e.target.value,r={category:t};n.acl[t].can_pin_threads<r.weight&&(r.weight=0),n.acl[t].can_hide_threads||(r.is_hidden=0),n.acl[t].can_close_threads||(r.is_closed=!1),n.setState(r)},(r="onCategoryChange")in t?Object.defineProperty(t,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[r]=a,n.state={isLoading:!1,title:"",category:null,categories:e.categories,weight:0,is_hidden:0,is_closed:!1,validators:{title:[h.required()]},errors:{}},n.isHiddenChoices=[{value:0,icon:"visibility",label:gettext("No")},{value:1,icon:"visibility_off",label:gettext("Yes")}],n.isClosedChoices=[{value:!1,icon:"lock_outline",label:gettext("No")},{value:!0,icon:"lock",label:gettext("Yes")}],n.acl={},n.props.categories.forEach(function(e){e.post&&(n.state.category||(n.state.category=e.id),n.acl[e.id]={can_pin_threads:e.post.pin,can_close_threads:e.post.close,can_hide_threads:e.post.hide})}),n}return O(l,[{key:"clean",value:function(){return!!this.isValid()||(y.default.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}},{key:"send",value:function(){return p.default.post(this.props.thread.api.posts.split,{title:this.state.title,category:this.state.category,weight:this.state.weight,is_hidden:this.state.is_hidden,is_closed:this.state.is_closed,posts:this.props.selection.map(function(e){return e.id})})}},{key:"handleSuccess",value:function(){this.props.selection.forEach(function(e){b.default.dispatch(d.patch(e,{isDeleted:!0}))}),m.default.hide(),y.default.success(gettext("Selected posts were split into new thread."))}},{key:"handleError",value:function(e){400===e.status?(this.setState({errors:Object.assign({},this.state.errors,e)}),y.default.error(gettext("Form contains errors."))):403===e.status&&Array.isArray(e)?m.default.show(a.default.createElement(v.default,{errors:e})):y.default.apiError(e)}},{key:"getWeightChoices",value:function(){var e=[{value:0,icon:"remove",label:gettext("Not pinned")},{value:1,icon:"bookmark_border",label:gettext("Pinned locally")}];return 2==this.acl[this.state.category].can_pin_threads&&e.push({value:2,icon:"bookmark",label:gettext("Pinned globally")}),e}},{key:"renderWeightField",value:function(){return this.acl[this.state.category].can_pin_threads?a.default.createElement(s.default,{label:gettext("Thread weight"),for:"id_weight",labelClass:"col-sm-4",controlClass:"col-sm-8"},a.default.createElement(f.default,{id:"id_weight",onChange:this.bindInput("weight"),value:this.state.weight,choices:this.getWeightChoices()})):null}},{key:"renderHiddenField",value:function(){return this.acl[this.state.category].can_hide_threads?a.default.createElement(s.default,{label:gettext("Hide thread"),for:"id_is_hidden",labelClass:"col-sm-4",controlClass:"col-sm-8"},a.default.createElement(f.default,{id:"id_is_closed",onChange:this.bindInput("is_hidden"),value:this.state.is_hidden,choices:this.isHiddenChoices})):null}},{key:"renderClosedField",value:function(){return this.acl[this.state.category].can_close_threads?a.default.createElement(s.default,{label:gettext("Close thread"),for:"id_is_closed",labelClass:"col-sm-4",controlClass:"col-sm-8"},a.default.createElement(f.default,{id:"id_is_closed",onChange:this.bindInput("is_closed"),value:this.state.is_closed,choices:this.isClosedChoices})):null}},{key:"render",value:function(){return a.default.createElement(L,{className:"modal-dialog"},a.default.createElement("form",{onSubmit:this.handleSubmit},a.default.createElement("div",{className:"modal-body"},a.default.createElement(s.default,{label:gettext("Thread title"),for:"id_title",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.title},a.default.createElement("input",{id:"id_title",className:"form-control",type:"text",onChange:this.bindInput("title"),value:this.state.title})),a.default.createElement("div",{className:"clearfix"}),a.default.createElement(s.default,{label:gettext("Category"),for:"id_category",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.category},a.default.createElement(c.default,{id:"id_category",onChange:this.onCategoryChange,value:this.state.category,choices:this.state.categories})),a.default.createElement("div",{className:"clearfix"}),this.renderWeightField(),this.renderHiddenField(),this.renderClosedField()),a.default.createElement("div",{className:"modal-footer"},a.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),a.default.createElement(n.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Split posts")))))}}]),l}();function M(){return a.default.createElement(L,{className:"modal-dialog"},a.default.createElement(o.default,null))}function T(e){return a.default.createElement(L,{className:"modal-dialog modal-message"},a.default.createElement("div",{className:"message-icon"},a.default.createElement("span",{className:"material-icon"},"info_outline")),a.default.createElement("div",{className:"message-body"},a.default.createElement("p",{className:"lead"},gettext("You can't move selected posts at the moment.")),a.default.createElement("p",null,e.message),a.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok"))))}function L(e){return a.default.createElement("div",{className:e.className,role:"document"},a.default.createElement("div",{className:"modal-content"},a.default.createElement("div",{className:"modal-header"},a.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},a.default.createElement("span",{"aria-hidden":"true"},"×")),a.default.createElement("h4",{className:"modal-title"},gettext("Split posts into new thread"))),e.children))}r.ModerationForm=C},{"../../../../reducers/post":353,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../../utils/validators":393,"../../../button":8,"../../../category-select":21,"../../../form":56,"../../../form-group":55,"../../../modal-loader":61,"../../../select":210,"./errors-list":222,react:"react"}],226:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var l=n(e("react")),u=n(e("./merge")),s=n(e("./move")),c=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=y(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../../reducers/thread")),f=n(e("../../../../services/ajax")),d=n(e("../../../../services/modal")),p=n(e("../../../../services/snackbar")),m=n(e("../../../../services/store"));function y(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(y=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return g(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var o=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(o,l.default.Component);var e,t,r,a=v(o);function o(){var r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return _(g(r=a.call.apply(a,[this].concat(t))),"callApi",function(e,t){m.default.dispatch(c.busy()),e.push({op:"add",path:"acl",value:!0}),f.default.patch(r.props.thread.api.index,e).then(function(e){m.default.dispatch(c.update(e)),m.default.dispatch(c.release()),p.default.success(t)},function(e){m.default.dispatch(c.release()),400===e.status?p.default.error(e.detail[0]):p.default.apiError(e)})}),_(g(r),"pinGlobally",function(){r.callApi([{op:"replace",path:"weight",value:2}],gettext("Thread has been pinned globally."))}),_(g(r),"pinLocally",function(){r.callApi([{op:"replace",path:"weight",value:1}],gettext("Thread has been pinned locally."))}),_(g(r),"unpin",function(){r.callApi([{op:"replace",path:"weight",value:0}],gettext("Thread has been unpinned."))}),_(g(r),"approve",function(){r.callApi([{op:"replace",path:"is-unapproved",value:!1}],gettext("Thread has been approved."))}),_(g(r),"open",function(){r.callApi([{op:"replace",path:"is-closed",value:!1}],gettext("Thread has been opened."))}),_(g(r),"close",function(){r.callApi([{op:"replace",path:"is-closed",value:!0}],gettext("Thread has been closed."))}),_(g(r),"unhide",function(){r.callApi([{op:"replace",path:"is-hidden",value:!1}],gettext("Thread has been made visible."))}),_(g(r),"hide",function(){r.callApi([{op:"replace",path:"is-hidden",value:!0}],gettext("Thread has been made hidden."))}),_(g(r),"move",function(){d.default.show(l.default.createElement(s.default,{posts:r.props.posts,thread:r.props.thread}))}),_(g(r),"merge",function(){d.default.show(l.default.createElement(u.default,{thread:r.props.thread}))}),_(g(r),"delete",function(){window.confirm(gettext("Are you sure you want to delete this thread?"))&&(m.default.dispatch(c.busy()),f.default.delete(r.props.thread.api.index).then(function(e){p.default.success(gettext("Thread has been deleted.")),window.location=r.props.thread.category.url.index},function(e){m.default.dispatch(c.release()),p.default.apiError(e)}))}),r}return e=o,(t=[{key:"getPinGloballyButton",value:function(){return 2!==this.props.thread.weight&&this.props.thread.acl.can_pin_globally?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.pinGlobally,type:"button"},l.default.createElement("span",{className:"material-icon"},"bookmark"),gettext("Pin globally"))):null}},{key:"getPinLocallyButton",value:function(){return 1!==this.props.thread.weight&&this.props.thread.acl.can_pin?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.pinLocally,type:"button"},l.default.createElement("span",{className:"material-icon"},"bookmark_border"),gettext("Pin locally"))):null}},{key:"getUnpinButton",value:function(){return 0!==this.props.thread.weight&&this.props.thread.acl.can_pin?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.unpin,type:"button"},l.default.createElement("span",{className:"material-icon"},"panorama_fish_eye"),gettext("Unpin"))):null}},{key:"getMoveButton",value:function(){return this.props.thread.acl.can_move?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.move,type:"button"},l.default.createElement("span",{className:"material-icon"},"arrow_forward"),gettext("Move"))):null}},{key:"getMergeButton",value:function(){return this.props.thread.acl.can_merge?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.merge,type:"button"},l.default.createElement("span",{className:"material-icon"},"call_merge"),gettext("Merge"))):null}},{key:"getApproveButton",value:function(){return this.props.thread.is_unapproved&&this.props.thread.acl.can_approve?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.approve,type:"button"},l.default.createElement("span",{className:"material-icon"},"done"),gettext("Approve"))):null}},{key:"getOpenButton",value:function(){return this.props.thread.is_closed&&this.props.thread.acl.can_close?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.open,type:"button"},l.default.createElement("span",{className:"material-icon"},"lock_open"),gettext("Open"))):null}},{key:"getCloseButton",value:function(){return!this.props.thread.is_closed&&this.props.thread.acl.can_close?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.close,type:"button"},l.default.createElement("span",{className:"material-icon"},"lock_outline"),gettext("Close"))):null}},{key:"getUnhideButton",value:function(){return this.props.thread.is_hidden&&this.props.thread.acl.can_unhide?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.unhide,type:"button"},l.default.createElement("span",{className:"material-icon"},"visibility"),gettext("Unhide"))):null}},{key:"getHideButton",value:function(){return!this.props.thread.is_hidden&&this.props.thread.acl.can_hide?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.hide,type:"button"},l.default.createElement("span",{className:"material-icon"},"visibility_off"),gettext("Hide"))):null}},{key:"getDeleteButton",value:function(){return this.props.thread.acl.can_delete?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.delete,type:"button"},l.default.createElement("span",{className:"material-icon"},"clear"),gettext("Delete"))):null}},{key:"render",value:function(){return l.default.createElement("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},this.getPinGloballyButton(),this.getPinLocallyButton(),this.getUnpinButton(),this.getMoveButton(),this.getMergeButton(),this.getApproveButton(),this.getOpenButton(),this.getCloseButton(),this.getUnhideButton(),this.getHideButton(),this.getDeleteButton())}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=o},{"../../../../reducers/thread":360,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"./merge":229,"./move":230,react:"react"}],227:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ModerationControls",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(r,"isModerationVisible",{enumerable:!0,get:function(){return a.default}});var n=o(e("./controls")),a=o(e("./is-visible"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./controls":226,"./is-visible":228}],228:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return!!(e.acl.can_approve&&e.is_unapproved||e.acl.can_close||e.acl.can_delete||e.acl.can_hide||e.acl.can_move||e.acl.can_merge||e.acl.can_pin||e.acl.can_pin_globally&&2!==e.weight||e.acl.can_unhide&&e.is_hidden)}},{}],229:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ModalHeader=w,r.default=void 0;var o=n(e("react")),l=n(e("../../../form")),u=n(e("../../../form-group")),s=n(e("../../../merge-conflict")),c=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=y(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../../reducers/thread")),f=n(e("../../../../services/ajax")),d=n(e("../../../../services/modal")),p=n(e("../../../../services/snackbar")),m=n(e("../../../../services/store"));function y(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(y=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return g(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var E=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(a,l.default);var e,t,r,n=v(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),_(g(t=n.call(this,e)),"handleSuccess",function(e){t.handleSuccessUnmounted(e),t.setState({isLoading:!0})}),_(g(t),"handleSuccessUnmounted",function(e){p.default.success(gettext("Thread has been merged with other one.")),window.location=e.url}),_(g(t),"handleError",function(e){m.default.dispatch(c.release()),400===e.status?e.best_answers||e.polls?d.default.show(o.default.createElement(s.default,{api:t.props.thread.api.merge,bestAnswers:e.best_answers,data:{other_thread:t.state.url},polls:e.polls,onError:t.handleError,onSuccess:t.handleSuccessUnmounted})):e.best_answer?p.default.error(e.best_answer[0]):e.poll?p.default.error(e.poll[0]):p.default.error(e.detail):p.default.apiError(e)}),_(g(t),"onUrlChange",function(e){t.changeValue("url",e.target.value)}),t.state={isLoading:!1,url:"",validators:{url:[]},errors:{}},t}return e=a,(t=[{key:"clean",value:function(){return!!this.state.url.trim().length||(p.default.error(gettext("You have to enter link to the other thread.")),!1)}},{key:"send",value:function(){return m.default.dispatch(c.busy()),f.default.post(this.props.thread.api.merge,{other_thread:this.state.url})}},{key:"render",value:function(){return o.default.createElement("div",{className:"modal-dialog",role:"document"},o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"modal-content"},o.default.createElement(w,null),o.default.createElement("div",{className:"modal-body"},o.default.createElement(u.default,{for:"id_url",label:gettext("Link to thread you want to merge with"),help_text:gettext("Merge will delete current thread and move its contents to the thread specified here.")},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading||this.props.thread.isBusy,id:"id_url",onChange:this.onUrlChange,value:this.state.url}))),o.default.createElement("div",{className:"modal-footer"},o.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),o.default.createElement("button",{className:"btn btn-primary",loading:this.state.isLoading||this.props.thread.isBusy},gettext("Merge thread"))))))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function w(e){return o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Merge thread")))}r.default=E},{"../../../../reducers/thread":360,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../form":56,"../../../form-group":55,"../../../merge-conflict":59,react:"react"}],230:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ModalHeader=P,r.ModalLoading=k,r.ModalMessage=N,r.default=void 0;var n=v(e("react")),a=v(e("../../../form")),u=v(e("../../../form-group")),s=v(e("../../../category-select")),o=v(e("../../../modal-loader")),c=l(e("../../../../reducers/posts")),f=l(e("../../../../reducers/thread")),d=v(e("../../../..")),p=v(e("../../../../services/ajax")),m=v(e("../../../../services/modal")),y=v(e("../../../../services/snackbar")),b=v(e("../../../../services/store"));function h(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(h=function(e){return e?r:t})(e)}function l(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=h(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function v(e){return e&&e.__esModule?e:{default:e}}function g(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=O(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=O(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function O(e){return(O=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var j=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}(l,a.default);var e,t,r,o=E(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=w(t),a=function(e){t.changeValue("category",e.target.value)},(n="onCategoryChange")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isReady:!1,isLoading:!1,isError:!1,category:null,categories:[]},t}return e=l,(t=[{key:"componentDidMount",value:function(){var n=this;p.default.get(d.default.get("THREAD_EDITOR_API")).then(function(e){var t=null,r=e.map(function(e){return!1===e.post||t||(t=e.id),Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id})});n.setState({isReady:!0,category:t,categories:r})},function(e){n.setState({isError:e.detail})})}},{key:"send",value:function(){return b.default.dispatch(f.busy()),p.default.patch(this.props.thread.api.index,[{op:"replace",path:"category",value:this.state.category}])}},{key:"handleSuccess",value:function(){p.default.get(this.props.thread.api.posts.index,{page:this.props.posts.page}).then(function(e){b.default.dispatch(f.replace(e)),b.default.dispatch(c.load(e.post_set)),b.default.dispatch(f.release()),y.default.success(gettext("Thread has been moved.")),m.default.hide()},function(e){b.default.dispatch(f.release()),y.default.apiError(e)})}},{key:"handleError",value:function(e){400===e.status?y.default.error(e.detail[0]):y.default.apiError(e)}},{key:"render",value:function(){return this.state.isReady?n.default.createElement("div",{className:"modal-dialog",role:"document"},n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"modal-content"},n.default.createElement(P,null),n.default.createElement("div",{className:"modal-body"},n.default.createElement(u.default,{for:"id_category",label:gettext("New category")},n.default.createElement(s.default,{choices:this.state.categories,disabled:this.state.isLoading||this.props.thread.isBusy,id:"id_category",onChange:this.onCategoryChange,value:this.state.category}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),n.default.createElement("button",{className:"btn btn-primary",loading:this.state.isLoading||this.props.thread.isBusy},gettext("Move thread")))))):this.state.isError?n.default.createElement(N,{message:this.state.isError}):n.default.createElement(k,null)}}])&&g(e.prototype,t),r&&g(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function P(e){return n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Move thread")))}function k(e){return n.default.createElement("div",{className:"modal-dialog",role:"document"},n.default.createElement("div",{className:"modal-content"},n.default.createElement(P,null),n.default.createElement(o.default,null)))}function N(e){return n.default.createElement("div",{className:"modal-dialog modal-message",role:"document"},n.default.createElement("div",{className:"modal-content"},n.default.createElement(P,null),n.default.createElement("div",{className:"message-icon"},n.default.createElement("span",{className:"material-icon"},"info_outline")),n.default.createElement("div",{className:"message-body"},n.default.createElement("p",{className:"lead"},gettext("You can't move this thread at the moment.")),n.default.createElement("p",null,e.message),n.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok")))))}r.default=j},{"../../../..":302,"../../../../reducers/posts":354,"../../../../reducers/thread":360,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../category-select":21,"../../../form":56,"../../../form-group":55,"../../../modal-loader":61,react:"react"}],231:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.FirstPage=i,r.LastPage=c,r.More=f,r.NextPage=s,r.Pager=l,r.PreviousPage=u,r.default=function(e){return a.default.createElement("nav",{className:"misago-pagination pull-left"},a.default.createElement(l,e),a.default.createElement(f,{more:e.posts.more}))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n},o=e("react-router");function l(e){return a.default.createElement("div",{className:"row row-paginator"},a.default.createElement("div",{className:"col-xs-3"},a.default.createElement(i,e)),a.default.createElement("div",{className:"col-xs-3"},a.default.createElement(u,e)),a.default.createElement("div",{className:"col-xs-3"},a.default.createElement(s,e)),a.default.createElement("div",{className:"col-xs-3"},a.default.createElement(c,e)))}function i(e){return e.posts.isLoaded&&e.posts.first?a.default.createElement(o.Link,{className:"btn btn-default btn-block btn-outline btn-icon",to:e.thread.url.index,title:gettext("Go to first page")},a.default.createElement("span",{className:"material-icon"},"first_page")):a.default.createElement("span",{className:"btn btn-default btn-block btn-outline btn-icon disabled",title:gettext("Go to first page")},a.default.createElement("span",{className:"material-icon"},"first_page"))}function u(e){if(e.posts.isLoaded&&1<e.posts.page){var t="";return e.posts.previous&&(t=e.posts.previous+"/"),a.default.createElement(o.Link,{className:"btn btn-default btn-block btn-outline btn-icon",to:e.thread.url.index+t,title:gettext("Go to previous page")},a.default.createElement("span",{className:"material-icon"},"chevron_left"))}return a.default.createElement("span",{className:"btn btn-default btn-block btn-outline btn-icon disabled",title:gettext("Go to previous page")},a.default.createElement("span",{className:"material-icon"},"chevron_left"))}function s(e){if(e.posts.isLoaded&&e.posts.more){var t="";return e.posts.next&&(t=e.posts.next+"/"),a.default.createElement(o.Link,{className:"btn btn-default btn-block btn-outline btn-icon",to:e.thread.url.index+t,title:gettext("Go to next page")},a.default.createElement("span",{className:"material-icon"},"chevron_right"))}return a.default.createElement("span",{className:"btn btn-default btn-block btn-outline btn-icon disabled",title:gettext("Go to next page")},a.default.createElement("span",{className:"material-icon"},"chevron_right"))}function c(e){return e.posts.isLoaded&&e.posts.last?a.default.createElement(o.Link,{className:"btn btn-default btn-block btn-outline btn-icon",to:e.thread.url.index+e.posts.last+"/",title:gettext("Go to last page")},a.default.createElement("span",{className:"material-icon"},"last_page")):a.default.createElement("span",{className:"btn btn-default btn-block btn-outline btn-icon disabled",title:gettext("Go to last page")},a.default.createElement("span",{className:"material-icon"},"last_page"))}function f(e){var t=null,t=e.more?(t=ngettext("There is %(more)s more post in this thread.","There are %(more)s more posts in this thread.",e.more),interpolate(t,{more:e.more},!0)):gettext("There are no more posts in this thread.");return a.default.createElement("p",null,t)}},{react:"react","react-router":"react-router"}],232:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return a.default.createElement("button",{className:e.className||"btn btn-primary btn-outline",onClick:e.onClick,type:"button"},a.default.createElement("span",{className:"material-icon"},"chat"),gettext("Reply"))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],233:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.paths=function(){var e=o.default.get("THREAD"),t=e.url.index.replace(e.slug+"-"+e.pk,":slug");return[{path:t,component:(0,n.connect)(i)(a.default)},{path:t+":page/",component:(0,n.connect)(i)(a.default)}]},r.select=i;var n=e("react-redux"),a=l(e("./route")),o=l(e("../.."));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){return{participants:e.participants,poll:e.poll,posts:e.posts,thread:e.thread,tick:e.tick.tick,user:e.auth.user}}},{"../..":302,"./route":234,"react-redux":"react-redux"}],234:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),l=o(e("../participants")),u=e("../poll"),s=o(e("../posts-list")),c=o(e("./header")),f=o(e("./toolbar-top")),d=o(e("./toolbar-bottom")),p=a(e("../../reducers/participants")),m=a(e("../../reducers/poll")),y=a(e("../../reducers/posts")),b=a(e("../../reducers/thread")),h=o(e("../../services/ajax")),v=o(e("../../services/polls")),g=o(e("../../services/snackbar")),_=o(e("../../services/posting")),E=o(e("../../services/store")),w=o(e("../../services/page-title"));function O(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(O=function(e){return e?r:t})(e)}function a(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=O(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function o(e){return e&&e.__esModule?e:{default:e}}function j(){return(j=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function P(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function k(e,t){return(k=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function N(r){var 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}}();return function(){var e,t=S(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return x(e)}(this,n?(e=S(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function x(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function S(e){return(S=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function R(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var C=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&k(e,t)}(o,n.default.Component);var e,t,r,a=N(o);function o(){var t;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return R(x(t=a.call.apply(a,[this].concat(r))),"update",function(e){E.default.dispatch(b.replace(e)),E.default.dispatch(y.load(e.post_set)),e.participants&&E.default.dispatch(p.replace(e.participants)),e.poll&&E.default.dispatch(m.replace(e.poll)),t.setPageTitle()}),R(x(t),"openReplyForm",function(){_.default.open({mode:"REPLY",config:t.props.thread.api.editor,submit:t.props.thread.api.posts.index})}),t}return e=o,(t=[{key:"componentDidMount",value:function(){this.shouldFetchData()&&(this.fetchData(),this.setPageTitle()),this.startPollingApi()}},{key:"componentDidUpdate",value:function(){this.shouldFetchData()&&(this.fetchData(),this.startPollingApi(),this.setPageTitle())}},{key:"componentWillUnmount",value:function(){this.stopPollingApi()}},{key:"shouldFetchData",value:function(){return!!this.props.posts.isLoaded&&+(this.props.params.page||1)!=this.props.posts.page}},{key:"fetchData",value:function(){var t=this;E.default.dispatch(y.unload()),h.default.get(this.props.thread.api.posts.index,{page:this.props.params.page||1},"posts").then(function(e){t.update(e)},function(e){g.default.apiError(e)})}},{key:"startPollingApi",value:function(){v.default.start({poll:"thread-posts",url:this.props.thread.api.posts.index,data:{page:this.props.params.page||1},update:this.update,frequency:12e4,delayed:!0})}},{key:"stopPollingApi",value:function(){v.default.stop("thread-posts")}},{key:"setPageTitle",value:function(){w.default.set({title:this.props.thread.title,parent:this.props.thread.category.name,page:+(this.props.params.page||1)})}},{key:"render",value:function(){var e="page page-thread";return this.props.thread.category.css_class&&(e+=" page-thread-"+this.props.thread.category.css_class),n.default.createElement("div",{className:e},n.default.createElement("div",{className:"page-header-bg"},n.default.createElement(c.default,this.props)),n.default.createElement("div",{className:"container"},n.default.createElement(f.default,j({openReplyForm:this.openReplyForm},this.props)),n.default.createElement(u.Poll,{poll:this.props.poll,thread:this.props.thread,user:this.props.user}),n.default.createElement(l.default,{participants:this.props.participants,thread:this.props.thread,user:this.props.user}),n.default.createElement(s.default,this.props),n.default.createElement(d.default,j({openReplyForm:this.openReplyForm},this.props))))}}])&&P(e.prototype,t),r&&P(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=C},{"../../reducers/participants":351,"../../reducers/poll":352,"../../reducers/posts":354,"../../reducers/thread":360,"../../services/ajax":365,"../../services/page-title":373,"../../services/polls":374,"../../services/posting":375,"../../services/snackbar":376,"../../services/store":377,"../participants":101,"../poll":106,"../posts-list":151,"./header":218,"./toolbar-bottom":236,"./toolbar-top":237,react:"react"}],235:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Disable=void 0,r.Dropdown=w,r.Enable=r.Email=void 0,r.default=function(e){return e.user.id?n.default.createElement("div",{className:e.className},n.default.createElement("button",{"aria-expanded":"true","aria-haspopup":"true",className:"btn btn-default dropdown-toggle btn-block btn-outline","data-toggle":"dropdown",type:"button"},n.default.createElement("span",{className:"material-icon"},_(e.thread.subscription)),E(e.thread.subscription)),n.default.createElement(w,e)):null},r.getIcon=_,r.getLabel=E,r.update=k;var n=c(e("react")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/thread")),o=c(e("../../services/ajax")),l=c(e("../../services/snackbar")),u=c(e("../../services/store"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function c(e){return e&&e.__esModule?e:{default:e}}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t,r){return t&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function m(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=v(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=v(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function g(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _(e){return!0===e?"star":!1===e?"star_half":"star_border"}function E(e){return!0===e?gettext("E-mail"):!1===e?gettext("Enabled"):gettext("Disabled")}function w(e){return n.default.createElement("ul",{className:e.dropdownClassName||"dropdown-menu stick-to-bottom"},n.default.createElement(O,e),n.default.createElement(j,e),n.default.createElement(P,e))}var O=function(){m(o,n.default.Component);var a=b(o);function o(){var e;f(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){null!==e.props.thread.subscription&&k(e.props.thread,null,"unsubscribe")}),e}return p(o,[{key:"render",value:function(){return n.default.createElement("li",null,n.default.createElement("button",{className:"btn btn-link",onClick:this.onClick},n.default.createElement("span",{className:"material-icon"},"star_border"),gettext("Unsubscribe")))}}]),o}();r.Disable=O;var j=function(){m(o,n.default.Component);var a=b(o);function o(){var e;f(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){!1!==e.props.thread.subscription&&k(e.props.thread,!1,"notify")}),e}return p(o,[{key:"render",value:function(){return n.default.createElement("li",null,n.default.createElement("button",{className:"btn btn-link",onClick:this.onClick},n.default.createElement("span",{className:"material-icon"},"star_half"),gettext("Subscribe")))}}]),o}();r.Enable=j;var P=function(){m(o,n.default.Component);var a=b(o);function o(){var e;f(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){!0!==e.props.thread.subscription&&k(e.props.thread,!0,"email")}),e}return p(o,[{key:"render",value:function(){return n.default.createElement("li",null,n.default.createElement("button",{className:"btn btn-link",onClick:this.onClick},n.default.createElement("span",{className:"material-icon"},"star"),gettext("Subscribe with e-mail")))}}]),o}();function k(e,t,r){var n={subscription:e.subscription};u.default.dispatch(a.update({subscription:t})),o.default.patch(e.api.index,[{op:"replace",path:"subscription",value:r}]).then(function(e){u.default.dispatch(a.update(e))},function(e){400===e.status?l.default.error(e.detail[0]):l.default.apiError(e),u.default.dispatch(a.update(n))})}r.Email=P},{"../../reducers/thread":360,"../../services/ajax":365,"../../services/snackbar":376,"../../services/store":377,react:"react"}],236:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Moderation=f,r.Options=c,r.Reply=p,r.Spacer=m,r.Subscription=d,r.default=function(e){return n.default.createElement("div",{className:"row row-toolbar"},n.default.createElement("div",{className:"col-xs-12 text-center visible-xs-block"},n.default.createElement(a.More,{more:e.posts.more}),n.default.createElement("div",{className:"toolbar-vertical-spacer"})),n.default.createElement("div",{className:"col-md-7"},n.default.createElement("div",{className:"row"},n.default.createElement("div",{className:"col-sm-4 col-md-5"},n.default.createElement(a.Pager,e)),n.default.createElement("div",{className:"col-sm-8 col-md-7 hidden-xs"},n.default.createElement(a.More,{more:e.posts.more})))),n.default.createElement(c,{visible:!!e.user.id},n.default.createElement("div",{className:"toolbar-vertical-spacer hidden-md hidden-lg"}),n.default.createElement("div",{className:"row"},n.default.createElement(m,e),n.default.createElement(f,e),n.default.createElement(d,e),n.default.createElement(p,{thread:e.thread,onClick:e.openReplyForm}))))};var n=u(e("react")),a=e("./paginator"),o=u(e("./moderation/posts")),l=u(e("./reply-button")),i=u(e("./subscription"));function u(e){return e&&e.__esModule?e:{default:e}}function s(){return(s=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function c(e){return e.visible?n.default.createElement("div",{className:"col-md-5"},e.children):null}function f(e){return e.user.id?n.default.createElement("div",{className:"col-sm-4 hidden-xs"},n.default.createElement(o.default,e)):null}function d(e){var t="col-xs-6";return e.thread.acl.can_reply||(t="col-xs-12"),n.default.createElement("div",{className:t+" col-sm-4"},n.default.createElement(i.default,s({btnClassName:"btn-block",className:"dropup"},e)))}function p(e){return e.thread.acl.can_reply?n.default.createElement("div",{className:"col-xs-6 col-sm-4"},n.default.createElement(l.default,{className:"btn btn-primary btn-block btn-outline",onClick:e.onClick})):null}function m(e){return e.thread.acl.can_reply?null:n.default.createElement("div",{className:"hidden-xs hidden-sm col-sm-4"})}},{"./moderation/posts":223,"./paginator":231,"./reply-button":232,"./subscription":235,react:"react"}],237:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.CompactOptions=O,r.GotoBestAnswer=_,r.GotoLast=w,r.GotoLastCompact=k,r.GotoMenu=v,r.GotoNew=g,r.GotoNewCompact=j,r.GotoUnapproved=E,r.GotoUnapprovedCompact=P,r.Reply=N,r.Spacer=C,r.StartPollCompact=r.StartPoll=void 0,r.SubscriptionMenu=x,r.default=function(e){var t=!e.thread.acl.can_start_poll||e.thread.poll;return n.default.createElement("div",{className:"row row-toolbar row-toolbar-bottom-margin"},n.default.createElement(v,e),n.default.createElement("div",{className:"col-xs-9 col-md-5 col-md-offset-2"},n.default.createElement("div",{className:"row"},n.default.createElement(C,{visible:!e.user.id}),n.default.createElement(C,{visible:t}),n.default.createElement(x,e),n.default.createElement(S,e),n.default.createElement(N,e))))};var n=i(e("react")),o=i(e("./reply-button")),l=i(e("./subscription")),s=i(e("../../services/posting"));function i(e){return e&&e.__esModule?e:{default:e}}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t,r){return t&&u(e.prototype,t),r&&u(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function d(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=b(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=b(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function b(e){return(b=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function h(){return(h=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function v(e){var t="col-xs-3 col-sm-3 col-md-5";return e.user.is_anonymous&&(t="col-xs-12 col-sm-3 col-md-5"),n.default.createElement("div",{className:t},n.default.createElement("div",{className:"row hidden-xs hidden-sm"},n.default.createElement(w,{thread:e.thread}),n.default.createElement(g,{thread:e.thread}),n.default.createElement(_,{thread:e.thread}),n.default.createElement(E,{thread:e.thread})),n.default.createElement(O,e))}function g(e){return e.thread.is_new?n.default.createElement("div",{className:"col-sm-4"},n.default.createElement("a",{href:e.thread.url.new_post,className:"btn btn-default btn-block btn-outline",title:gettext("Go to first new post")},gettext("New"))):null}function _(e){return e.thread.best_answer?n.default.createElement("div",{className:"col-sm-4"},n.default.createElement("a",{href:e.thread.url.best_answer,className:"btn btn-default btn-block btn-outline",title:gettext("Go to best answer")},gettext("Best answer"))):null}function E(e){return e.thread.has_unapproved_posts&&e.thread.acl.can_approve?n.default.createElement("div",{className:"col-sm-4"},n.default.createElement("a",{href:e.thread.url.unapproved_post,className:"btn btn-default btn-block btn-outline",title:gettext("Go to first unapproved post")},gettext("Unapproved"))):null}function w(e){return n.default.createElement("div",{className:"col-sm-4"},n.default.createElement("a",{href:e.thread.url.last_post,className:"btn btn-default btn-block btn-outline",title:gettext("Go to last post")},gettext("Last")))}function O(e){return e.user.is_anonymous?n.default.createElement("div",{className:"visible-xs-block visible-sm-block"},n.default.createElement("a",{href:e.thread.url.last_post,className:"btn btn-default btn-block btn-outline"},gettext("Last post"))):n.default.createElement("div",{className:"dropdown visible-xs-block visible-sm-block"},n.default.createElement("button",{"aria-expanded":"true","aria-haspopup":"true",className:"btn btn-default dropdown-toggle btn-block btn-outline","data-toggle":"dropdown",type:"button"},n.default.createElement("span",{className:"material-icon"},"expand_more"),n.default.createElement("span",{className:"btn-text hidden-xs"},gettext("Options"))),n.default.createElement("ul",{className:"dropdown-menu"},n.default.createElement(R,e),n.default.createElement(j,e),n.default.createElement(P,e),n.default.createElement(k,e)))}function j(e){return e.thread.is_new?n.default.createElement("li",null,n.default.createElement("a",{href:e.thread.url.new_post,className:"btn btn-link"},gettext("Go to first new post"))):null}function P(e){return e.thread.has_unapproved_posts&&e.thread.acl.can_approve?n.default.createElement("li",null,n.default.createElement("a",{href:e.thread.url.unapproved_post,className:"btn btn-link"},gettext("Go to first unapproved post"))):null}function k(e){return n.default.createElement("li",null,n.default.createElement("a",{href:e.thread.url.last_post,className:"btn btn-link"},gettext("Go to last post")))}function N(e){return e.thread.acl.can_reply?n.default.createElement("div",{className:"col-sm-4 hidden-xs"},n.default.createElement(o.default,{className:"btn btn-primary btn-block btn-outline",onClick:e.openReplyForm})):null}function x(e){return e.user.id?n.default.createElement("div",{className:"col-xs-12 col-sm-4"},n.default.createElement(l.default,h({className:"dropdown",dropdownClassName:"dropdown-menu dropdown-menu-right stick-to-bottom"},e))):null}var S=function(){d(u,n.default.Component);var i=m(u);function u(){var e;c(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=y(e),n=function(){s.default.open({mode:"POLL",submit:e.props.thread.api.poll,thread:e.props.thread,poll:null})},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return f(u,[{key:"render",value:function(){return!this.props.thread.acl.can_start_poll||this.props.thread.poll?null:n.default.createElement("div",{className:"col-sm-4 hidden-xs"},n.default.createElement("button",{className:"btn btn-default btn-block btn-outline",onClick:this.onClick,type:"button"},n.default.createElement("span",{className:"material-icon"},"poll"),gettext("Add poll")))}}]),u}();r.StartPoll=S;var R=function(){d(t,S);var e=m(t);function t(){return c(this,t),e.apply(this,arguments)}return f(t,[{key:"render",value:function(){return!this.props.thread.acl.can_start_poll||this.props.thread.poll?null:n.default.createElement("li",null,n.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},gettext("Add poll")))}}]),t}();function C(e){return e.visible?n.default.createElement("div",{className:"col-sm-4 hidden-xs"}):null}r.StartPollCompact=R},{"../../services/posting":375,"./reply-button":232,"./subscription":235,react:"react"}],238:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.isLoaded?0!==e.threads.length?n.default.createElement(o.default,{activeCategory:e.category,categories:e.categories,list:e.list,threads:e.threads,diffSize:e.diffSize,applyDiff:e.applyDiff,showOptions:e.showOptions,selection:e.selection,busyThreads:e.busyThreads}):n.default.createElement(a.default,{diffSize:e.diffSize,applyDiff:e.applyDiff},e.children):n.default.createElement(l.default,null)};var n=i(e("react")),a=i(e("./list/empty")),o=i(e("./list/ready")),l=i(e("./list/preview"));function i(e){return e&&e.__esModule?e:{default:e}}},{"./list/empty":240,"./list/preview":241,"./list/ready":242,react:"react"}],239:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.applyDiff,r=e.diffSize;return 0===r?null:a.default.createElement("li",{className:"list-group-item threads-diff-message"},a.default.createElement("button",{type:"button",className:"btn btn-block btn-default",onClick:t},a.default.createElement("span",{className:"material-icon"},"cached"),a.default.createElement("span",{className:"diff-message"},o(r))))},r.getMessage=o;var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){var t=ngettext("There is %(threads)s new or updated thread. Click this message to show it.","There are %(threads)s new or updated threads. Click this message to show them.",e);return interpolate(t,{threads:e},!0)}},{react:"react"}],240:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./diff-message"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getDiffMessage",value:function(){return 0===this.props.diffSize?null:o.default.createElement(l.default,{applyDiff:this.props.applyDiff,diffSize:this.props.diffSize})}},{key:"render",value:function(){return o.default.createElement("div",{className:"threads-list ui-ready"},o.default.createElement("ul",{className:"list-group"},this.getDiffMessage(),this.props.children))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./diff-message":239,react:"react"}],241:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../thread/preview"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return o.default.createElement("div",{className:"threads-list ui-preview"},o.default.createElement("ul",{className:"list-group"},o.default.createElement(l.default,null)))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"../thread/preview":249,react:"react"}],242:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(t){return n.default.createElement("div",{className:"threads-list ui-ready"},n.default.createElement("ul",{className:"list-group"},n.default.createElement(a.default,{diffSize:t.diffSize,applyDiff:t.applyDiff}),t.threads.map(function(e){return n.default.createElement(o.default,{activeCategory:t.activeCategory,categories:t.categories,list:t.list,thread:e,showOptions:t.showOptions,isSelected:0<=t.selection.indexOf(e.id),isBusy:0<=t.busyThreads.indexOf(e.id),key:e.id})})))};var n=l(e("react")),a=l(e("./diff-message")),o=l(e("../thread/ready"));function l(e){return e&&e.__esModule?e:{default:e}}},{"../thread/ready":250,"./diff-message":239,react:"react"}],243:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.BestAnswerLabel=y,r.ClosedLabel=p,r.HiddenLabel=d,r.LastPoster=v,r.LastReplyLabel=h,r.PollLabel=m,r.RepliesLabel=b,r.default=function(e){var t=e.category,r=e.isBusy,n=e.showOptions,a=e.isSelected,o=e.thread,l="col-xs-12 col-sm-12";n&&(l=o.moderation.length?"col-xs-6 col-sm-12":"col-xs-9 col-sm-12");var i=0;o.is_hidden&&(i+=1);o.is_closed&&(i+=1);o.has_poll&&(i+=1);var u="detail-text hidden-xs";n&&3===i&&(u+=" hidden-sm");return s.default.createElement("div",{className:"row thread-details-bottom"},s.default.createElement("div",{className:l},s.default.createElement(c.default,{className:"item-title thread-detail-category hidden-xs",category:t}),s.default.createElement(d,{textClassName:u,display:o.is_hidden}),s.default.createElement(p,{textClassName:u,display:o.is_closed}),s.default.createElement(m,{textClassName:u,display:o.has_poll}),s.default.createElement(y,{thread:o}),s.default.createElement(b,{forceFullText:!n||i<2,replies:o.replies}),s.default.createElement(h,{datetime:o.last_post_on,url:o.url.last_post}),s.default.createElement(v,{posterName:o.last_poster_name,url:o.url.last_poster})),s.default.createElement(f.OptionsXs,{disabled:r,display:n,isSelected:a,thread:o}))};var s=n(e("react")),c=n(e("./category")),f=e("../options");function n(e){return e&&e.__esModule?e:{default:e}}function d(e){var t=e.display,r=e.textClassName;return t?s.default.createElement("span",{className:"thread-detail-hidden"},s.default.createElement("span",{className:"material-icon"},"visibility_off"),s.default.createElement("span",{className:r},gettext("Hidden"))):null}function p(e){var t=e.display,r=e.textClassName;return t?s.default.createElement("span",{className:"thread-detail-closed"},s.default.createElement("span",{className:"material-icon"},"lock_outline"),s.default.createElement("span",{className:r},gettext("Closed"))):null}function m(e){var t=e.display,r=e.textClassName;return t?s.default.createElement("span",{className:"thread-detail-poll"},s.default.createElement("span",{className:"material-icon"},"assessment"),s.default.createElement("span",{className:r},gettext("Poll"))):null}function y(e){var t=e.thread;return t.best_answer?s.default.createElement("a",{className:"visible-xs-inline-block thread-detail-answered",href:t.url.best_answer},s.default.createElement("span",{className:"material-icon"},"check_box")):null}function b(e){var t=e.replies,r=e.forceFullText,n=ngettext("%(replies)s reply","%(replies)s replies",t),a="",o="",o=r?(a="detail-text hide","detail-text"):(a="detail-text visible-xs-inline-block","detail-text hidden-xs");return s.default.createElement("span",{className:"thread-detail-replies"},s.default.createElement("span",{className:"material-icon"},"forum"),s.default.createElement("span",{className:a},t),s.default.createElement("span",{className:o},interpolate(n,{replies:t},!0)))}function h(e){var t=e.datetime,r=e.url;return s.default.createElement("a",{className:"visible-sm-inline-block thread-detail-last-reply",href:r,title:t.format("LLL")},t.fromNow(!0))}function v(e){var t=e.posterName,r=e.url,n="visible-sm-inline-block item-title thread-last-poster";return r?s.default.createElement("a",{className:n,href:r},t):s.default.createElement("span",{className:n},t)}},{"../options":248,"./category":244,react:"react"}],244:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category,r=e.className;if(!t)return null;t.css_class&&(r+=" thread-detail-category-"+t.css_class);return a.default.createElement("a",{className:r,href:t.url.index},t.name)};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],245:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"BottomDetails",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(r,"TopDetails",{enumerable:!0,get:function(){return a.default}});var n=o(e("./bottom")),a=o(e("./top"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./bottom":243,"./top":246}],246:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.BestAnswerLabel=s,r.LastPoster=f,r.LastReplyLabel=c,r.NewLabel=o,r.PinnedLabel=i,r.UnapprovedLabel=u,r.default=function(e){var t=e.category,r=e.thread;return l.default.createElement("div",{className:"thread-details-top"},l.default.createElement(o,{isRead:r.is_read,url:r.url.new_post}),l.default.createElement(i,{weight:r.weight}),l.default.createElement(u,{thread:r.is_unapproved,posts:r.has_unapproved_posts}),l.default.createElement(s,{thread:r}),l.default.createElement(n.default,{className:"item-title thread-detail-category visible-xs-inline-block",category:t}),l.default.createElement(c,{datetime:r.last_post_on,url:r.url.last_post}),l.default.createElement(f,{posterName:r.last_poster_name,url:r.url.last_poster}))};var l=a(e("react")),n=a(e("./category"));function a(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=e.isRead,r=e.url;return t?null:l.default.createElement("a",{className:"thread-detail-new",href:r},l.default.createElement("span",{className:"material-icon"},"comment"),l.default.createElement("span",{className:"detail-text"},gettext("New posts")))}function i(e){var t=e.weight;if(0===t)return null;var r="thread-detail-pinned-globally",n="bookmark",a=gettext("Pinned globally");return 1===t&&(r="thread-detail-pinned-locally",n="bookmark_border",a=gettext("Pinned locally")),l.default.createElement("span",{className:r},l.default.createElement("span",{className:"material-icon"},n),l.default.createElement("span",{className:"detail-text"},a))}function u(e){var t=e.posts,r=e.thread;if(!t&&!r)return null;var n="thread-detail-unapproved-posts",a="remove_circle_outline",o=gettext("Unapproved posts");return r&&(n="thread-detail-unapproved",a="remove_circle",o=gettext("Unapproved")),l.default.createElement("span",{className:n},l.default.createElement("span",{className:"material-icon"},a),l.default.createElement("span",{className:"detail-text"},o))}function s(e){var t=e.thread;return t.best_answer?l.default.createElement("a",{className:"hidden-xs thread-detail-answered",href:t.url.best_answer},l.default.createElement("span",{className:"material-icon"},"check_box"),l.default.createElement("span",{className:"detail-text"},gettext("Answered"))):null}function c(e){var t=e.datetime,r=e.url;return l.default.createElement("a",{className:"visible-xs-inline-block thread-detail-last-reply",href:r,title:t.format("LLL")},t.fromNow(!0))}function f(e){var t=e.posterName,r=e.url;return r?l.default.createElement("a",{className:"visible-xs-inline-block item-title thread-last-poster",href:r},t):l.default.createElement("span",{className:"visible-xs-inline-block item-title thread-last-poster"},t)}},{"./category":244,react:"react"}],247:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Timestamp=i,r.default=function(e){var t=e.thread;return n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left"},n.default.createElement(o.default,{className:"thread-last-poster-avatar",title:t.last_poster_name,url:t.url.last_poster},n.default.createElement(a.default,{className:"media-object",size:40,user:t.last_poster}))),n.default.createElement("div",{className:"media-body"},n.default.createElement(o.default,{className:"item-title thread-last-poster",url:t.url.last_poster},t.last_poster_name),n.default.createElement(i,{datetime:t.last_post_on,url:t.url.last_post})))};var n=l(e("react")),a=l(e("../../avatar")),o=l(e("./user-url"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=e.datetime,r=e.url;return n.default.createElement("a",{className:"thread-last-reply",href:r,title:t.format("LLL")},t.fromNow(!0))}},{"../../avatar":6,"./user-url":255,react:"react"}],248:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Checkbox=void 0,r.Options=function(e){var t=e.display,r=e.disabled,n=e.isSelected,a=e.thread;if(!t)return null;var o="col-sm-2 col-md-2 hidden-xs";a.moderation.length&&(o="col-sm-3 col-md-2 hidden-xs");return l.default.createElement("div",{className:o},l.default.createElement("div",{className:"row thread-options"},l.default.createElement(s.default,{thread:a,disabled:r}),l.default.createElement(u.default,{thread:a,disabled:r}),l.default.createElement(b,{thread:a,disabled:r,isSelected:n})))},r.OptionsXs=function(e){var t=e.display,r=e.disabled,n=e.isSelected,a=e.thread;if(!t)return null;var o="";a.moderation.length?o+="col-xs-6":o+="col-xs-3";return o+=" visible-xs-block thread-options-xs",l.default.createElement("div",{className:o},l.default.createElement("div",{className:"row thread-options"},l.default.createElement(s.default,{thread:a,disabled:r}),l.default.createElement(u.default,{thread:a,disabled:r}),l.default.createElement(b,{thread:a,disabled:r,isSelected:n})))};var l=n(e("react")),u=n(e("./subscription/compact")),s=n(e("./subscription/full")),c=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/selection")),f=n(e("../../../services/store"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function o(e,t){return(o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var b=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&o(e,t)}(u,l.default.Component);var e,t,r,i=p(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=m(e),n=function(){f.default.dispatch(c.item(e.props.thread.id))},(r="toggleSelection")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){var e=this.props,t=e.disabled,r=e.isSelected;return e.thread.moderation.length?l.default.createElement("div",{className:"col-xs-6"},l.default.createElement("button",{className:"btn btn-default btn-icon btn-block",onClick:this.toggleSelection,disabled:t},l.default.createElement("span",{className:"material-icon"},r?"check_box":"check_box_outline_blank"))):null}}])&&a(e.prototype,t),r&&a(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.Checkbox=b},{"../../../reducers/selection":358,"../../../services/store":377,"./subscription/compact":251,"./subscription/full":252,react:"react"}],249:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n},l=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/random"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var d=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(a,o.default.Component);var e,t,r,n=f(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return o.default.createElement("li",{className:"list-group-item thread-preview"},o.default.createElement("div",{className:"thread-details-top visible-xs-block"},o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(30,80)+"px"}}," "),o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(30,80)+"px"}}," "),o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(30,80)+"px"}}," ")),o.default.createElement("span",{className:"item-title thread-title"},o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(60,200)+"px"}}," "),o.default.createElement("span",{className:"ui-preview-text hidden-xs",style:{width:l.int(60,200)+"px"}}," "),o.default.createElement("span",{className:"ui-preview-text hidden-xs",style:{width:l.int(60,200)+"px"}}," ")),o.default.createElement("div",{className:"thread-details-bottom"},o.default.createElement("div",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(30,80)+"px"}}," "),o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(30,80)+"px"}}," "),o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(30,80)+"px"}}," "))))}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=d},{"../../../utils/random":388,react:"react"}],250:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.activeCategory,r=e.categories,n=(e.list,e.thread),a=e.isBusy,o=e.isSelected,l=e.showOptions,i=null;t.id!==n.category&&(i=r[n.category]);var u=i||t,s="thread-main col-xs-12";l?n.moderation.length?s+=" col-sm-9 col-md-7":s+=" col-sm-10 col-md-7":s+=" col-sm-12 col-md-9";return c.default.createElement("li",{className:b(n.is_read,a,o,u)},c.default.createElement(d.TopDetails,{category:i,thread:n}),c.default.createElement("div",{className:"row thread-row"},c.default.createElement("div",{className:s},c.default.createElement("div",{className:"media"},c.default.createElement("div",{className:"media-left hidden-xs"},c.default.createElement(y.default,{className:"thread-starter-avatar",title:n.starter_name,url:n.url.starter},c.default.createElement(f.default,{size:40,user:n.starter}))),c.default.createElement("div",{className:"media-body"},c.default.createElement("a",{href:n.url.index,className:"item-title thread-title"},n.title),c.default.createElement(d.BottomDetails,{category:i,disabled:a,isSelected:o,showOptions:l,thread:n})))),c.default.createElement("div",{className:"col-md-3 hidden-xs hidden-sm thread-last-action"},c.default.createElement(p.default,{thread:n})),c.default.createElement(m.Options,{disabled:a,display:l,isSelected:o,thread:n})))},r.getClassName=b;var c=n(e("react")),f=n(e("../../avatar")),d=e("./details"),p=n(e("./last-action")),m=e("./options"),y=n(e("./user-url"));function n(e){return e&&e.__esModule?e:{default:e}}function b(e,t,r,n){var a=["list-group-item"];return n&&n.css_class&&(a.push("list-group-category-has-flavor"),a.push("list-group-item-category-"+n.css_class)),e?a.push("thread-read"):a.push("thread-new"),t?a.push("thread-busy"):r&&a.push("thread-selected"),a.join(" ")}},{"../../avatar":6,"./details":245,"./last-action":247,"./options":248,"./user-url":255,react:"react"}],251:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var s=o(e("react")),n=o(e("./full")),c=o(e("./modal")),f=o(e("../../../../services/modal"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(u,n.default);var e,t,r,i=p(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=m(e),n=function(){f.default.show(s.default.createElement(c.default,{thread:e.props.thread}))},(r="showOptions")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){var e="";return this.props.thread.moderation.length?e+="col-xs-6":e+="col-xs-12",e+=" hidden-md hidden-lg",s.default.createElement("div",{className:e},s.default.createElement("button",{type:"button",className:this.getClassName(),disabled:this.props.disabled,onClick:this.showOptions},s.default.createElement("span",{className:"material-icon"},this.getIcon())))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../../../../services/modal":371,"./full":252,"./modal":253,react:"react"}],252:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Label=d,r.default=void 0;var o=n(e("react")),l=n(e("./options"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getIcon",value:function(){return!0===this.props.thread.subscription?"star":!1===this.props.thread.subscription?"star_half":"star_border"}},{key:"getClassName",value:function(){return!0===this.props.thread.subscription?"btn btn-default btn-icon btn-block btn-subscribe btn-subscribe-full dropdown-toggle":!1===this.props.thread.subscription?"btn btn-default btn-icon btn-block btn-subscribe btn-subscribe-half dropdown-toggle":"btn btn-default btn-icon btn-block btn-subscribe dropdown-toggle"}},{key:"render",value:function(){var e=this.props.thread,t=e.moderation,r=e.subscription,n=!t.length?"col-xs-12":"col-xs-6";return n+=" hidden-xs hidden-sm",o.default.createElement("div",{className:n},o.default.createElement("div",{className:"btn-group btn-group-justified"},o.default.createElement("div",{className:"btn-group"},o.default.createElement("button",{type:"button",className:this.getClassName(),disabled:this.props.disabled,"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},o.default.createElement("span",{className:"material-icon"},this.getIcon()),o.default.createElement(d,{moderation:t,subscription:r})),o.default.createElement(l.default,{className:"dropdown-menu dropdown-menu-right",thread:this.props.thread}))))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function d(e){var t=e.moderation,r=e.subscription;if(t.length)return null;var n=gettext("Disabled");return!0===r?n=gettext("E-mail"):!1===r&&(n=gettext("Enabled")),o.default.createElement("span",{className:"btn-text"},n)}r.default=f},{"./options":254,react:"react"}],253:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./options"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"modal-dialog modal-sm",role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Change subscription"))),o.default.createElement(l.default,{className:"modal-menu",thread:this.props.thread})))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./options":254,react:"react"}],254:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=(n(e("../../../button")),e("../../../../reducers/threads")),i=n(e("../../../../services/ajax")),u=n(e("../../../../services/modal")),s=n(e("../../../../services/snackbar")),c=n(e("../../../../services/store"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h={unsubscribe:null,notify:!1,email:!0},v=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,o.default.Component);var e,t,r,n=p(a);function a(e){var r;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),b(m(r=n.call(this,e)),"setSubscription",function(e){u.default.hide(),r.setState({isLoading:!0});var t=r.props.thread.subscription;c.default.dispatch((0,l.patch)(r.props.thread,{subscription:h[e]})),i.default.patch(r.props.thread.api.index,[{op:"replace",path:"subscription",value:e}]).then(function(){r.setState({isLoading:!1})},function(e){r.setState({isLoading:!1}),c.default.dispatch((0,l.patch)(r.props.thread,{subscription:h[t]})),s.default.apiError(e)})}),b(m(r),"unsubscribe",function(){r.setSubscription("unsubscribe")}),b(m(r),"notify",function(){r.setSubscription("notify")}),b(m(r),"email",function(){r.setSubscription("email")}),r.state={isLoading:!1},r}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("ul",{className:this.props.className},o.default.createElement("li",null,o.default.createElement("button",{className:"btn-link",onClick:this.unsubscribe},o.default.createElement("span",{className:"material-icon"},"star_border"),gettext("Unsubscribe"))),o.default.createElement("li",null,o.default.createElement("button",{className:"btn-link",onClick:this.notify},o.default.createElement("span",{className:"material-icon"},"star_half"),gettext("Subscribe"))),o.default.createElement("li",null,o.default.createElement("button",{className:"btn-link",onClick:this.email},o.default.createElement("span",{className:"material-icon"},"star"),gettext("Subscribe with e-mail"))))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=v},{"../../../../reducers/threads":361,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../button":8,react:"react"}],255:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.children,r=e.className,n=e.title,a=e.url;if(a)return o.default.createElement("a",{className:r,href:a,title:n},t);return o.default.createElement("span",{className:r,title:n},t)};var n,o=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],256:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Subcategory=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n},l=e("react-router");function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t,r){return t&&u(e.prototype,t),r&&u(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=p(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=p(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){return(p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var m=function(){c(t,o.default.Component);var e=d(t);function t(){return i(this,t),e.apply(this,arguments)}return s(t,[{key:"getUrl",value:function(){return this.props.listPath?this.props.category.url.index+this.props.listPath:this.props.category.url.index}},{key:"render",value:function(){return o.default.createElement("li",null,o.default.createElement(l.Link,{to:this.getUrl(),className:"btn btn-link"},this.props.category.name))}}]),t}();r.Subcategory=m;var y=function(){c(t,o.default.Component);var e=d(t);function t(){return i(this,t),e.apply(this,arguments)}return s(t,[{key:"render",value:function(){var t=this;return o.default.createElement("div",{className:"dropdown category-picker"},o.default.createElement("button",{type:"button",className:"btn btn-default btn-outline dropdown-toggle btn-block","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},o.default.createElement("span",{className:"material-icon"},"label_outline"),o.default.createElement("span",{className:"hidden-xs"},gettext("Category"))),o.default.createElement("ul",{className:"dropdown-menu stick-to-bottom categories-menu"},this.props.choices.map(function(e){return t.props.categories[e]?o.default.createElement(m,{category:t.props.categories[e],listPath:t.props.list.path,key:e}):null})))}}]),t}();r.default=y},{react:"react","react-router":"react-router"}],257:[function(e,t,r){"use strict";function n(e,t){return e.last_post>t.last_post?-1:e.last_post<t.last_post?1:0}Object.defineProperty(r,"__esModule",{value:!0}),r.compareGlobalWeight=function(e,t){return 2===e.weight&&e.weight>t.weight?-1:2===t.weight&&e.weight<t.weight?1:n(e,t)},r.compareLastPostAge=n,r.compareWeight=function(e,t){return e.weight>t.weight?-1:e.weight<t.weight?1:n(e,t)}},{}],258:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../page-lead")),i=n(e("./toolbar"));function n(e){return e&&e.__esModule?e:{default:e}}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=f(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=f(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){return(f=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var d=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(a,o.default.Component);var e,t,r,n=c(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getCategoryDescription",value:function(){return this.props.pageLead?o.default.createElement("div",{className:"category-description"},o.default.createElement("div",{className:"page-lead"},o.default.createElement("p",null,this.props.pageLead))):this.props.route.category.description?o.default.createElement("div",{className:"category-description"},o.default.createElement(l.default,{copy:this.props.route.category.description.html})):null}},{key:"getDisableToolbar",value:function(){return!this.props.isLoaded||this.props.isBusy||this.props.busyThreads.length}},{key:"getToolbar",value:function(){return this.props.subcategories.length||this.props.user.id?o.default.createElement(i.default,{subcategories:this.props.subcategories,categories:this.props.route.categories,categoriesMap:this.props.route.categoriesMap,list:this.props.route.list,threads:this.props.threads,moderation:this.props.moderation,selection:this.props.selection,selectAllThreads:this.props.selectAllThreads,selectNoneThreads:this.props.selectNoneThreads,addThreads:this.props.addThreads,freezeThread:this.props.freezeThread,deleteThread:this.props.deleteThread,updateThread:this.props.updateThread,api:this.props.api,route:this.props.route,disabled:this.getDisableToolbar(),user:this.props.user}):null}},{key:"render",value:function(){return o.default.createElement("div",{className:"container"},this.getCategoryDescription(),this.getToolbar(),this.props.children)}}])&&u(e.prototype,t),r&&u(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=d},{"../page-lead":92,"./toolbar":269,react:"react"}],259:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ParentCategory=h,r.default=void 0;var i=o(e("react")),u=e("react-router"),n=o(e("../button")),s=(o(e("../dropdown-toggle")),o(e("./nav"))),c=(o(e("../../services/ajax")),o(e("../../services/posting"))),f=(o(e("../../services/snackbar")),o(e("../../services/store")),o(e("../..")));function o(e){return e&&e.__esModule?e:{default:e}}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var b=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(l,i.default.Component);var e,t,r,o=m(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=y(t),a=function(){c.default.open(t.props.startThread||{mode:"START",config:f.default.get("THREAD_EDITOR_API"),submit:f.default.get("THREADS_API"),category:t.props.route.category.id})},(n="startThread")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isBusy:!1},t}return e=l,(t=[{key:"hasGoBackButton",value:function(){return!!this.props.route.category.parent}},{key:"getGoBackButton",value:function(){if(!this.props.route.category.parent)return null;var e=this.props.categories[this.props.route.category.parent];return i.default.createElement("div",{className:"hidden-xs col-sm-2 col-lg-1"},i.default.createElement(u.Link,{className:"btn btn-default btn-icon btn-aligned btn-go-back btn-block btn-outline",to:e.url.index+this.props.route.list.path},i.default.createElement("span",{className:"material-icon"},"keyboard_arrow_left")))}},{key:"getStartThreadButton",value:function(){return this.props.user.id?i.default.createElement(n.default,{className:"btn-primary btn-block btn-outline",onClick:this.startThread,disabled:this.props.disabled},i.default.createElement("span",{className:"material-icon"},"chat"),gettext("Start thread")):null}},{key:"render",value:function(){var e="col-xs-12";this.hasGoBackButton()&&(e+=" col-sm-10 col-lg-11 sm-align-row-buttons");var t=!!this.props.user.id;return i.default.createElement("div",{className:"page-header-bg"},i.default.createElement("div",{className:"page-header"},i.default.createElement("div",{className:"container"},i.default.createElement("div",{className:"row"},i.default.createElement("div",{className:t?"col-sm-9 col-md-10":"col-xs-12"},i.default.createElement("div",{className:"row"},this.getGoBackButton(),i.default.createElement("div",{className:e},i.default.createElement(h,{categories:this.props.categories,category:this.props.route.category.parent}),i.default.createElement("h1",null,this.props.title)))),t&&i.default.createElement("div",{className:"col-sm-3 col-md-2 xs-margin-top"},this.getStartThreadButton()))),i.default.createElement(s.default,{baseUrl:this.props.route.category.url.index,list:this.props.route.list,lists:this.props.route.lists})))}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function h(e){var t=e.categories,r=e.category;if(!r)return null;var n=t[r];return i.default.createElement(u.Link,{className:"go-back-sm visible-xs-block",to:n.url.index},i.default.createElement("span",{className:"material-icon"},"chevron_left"),n.parent?n.name:gettext("Threads"))}r.default=b},{"../..":302,"../../services/ajax":365,"../../services/posting":375,"../../services/snackbar":376,"../../services/store":377,"../button":8,"../dropdown-toggle":27,"./nav":266,react:"react","react-router":"react-router"}],260:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return"all"===this.props.list.type?this.props.emptyMessage?o.default.createElement("li",{className:"list-group-item empty-message"},o.default.createElement("p",{className:"lead"},this.props.emptyMessage),o.default.createElement("p",null,gettext("Why not start one yourself?"))):o.default.createElement("li",{className:"list-group-item empty-message"},o.default.createElement("p",{className:"lead"},this.props.category.special_role?gettext("There are no threads on this forum... yet!"):gettext("There are no threads in this category.")),o.default.createElement("p",null,gettext("Why not start one yourself?"))):o.default.createElement("li",{className:"list-group-item empty-message"},gettext("No threads matching specified criteria were found."))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],261:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var l=n(e("react")),u=n(e("./errors-list")),s=n(e("./merge")),c=n(e("./move")),f=(function(e,t){if(!t&&e&&e.__esModule)return;if(null===e||"object"!==i(e)&&"function"!=typeof e)return;var r=m(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n)}(e("../../../reducers/selection")),n(e("../../../services/ajax"))),d=n(e("../../../services/modal")),p=n(e("../../../services/snackbar"));n(e("../../../services/store")),n(e("../../../utils/countdown"));function m(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(m=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function v(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(a,l.default.Component);var e,t,r,n=b(a);function a(){var o;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a);for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return v(h(o=n.call.apply(n,[this].concat(t))),"callApi",function(e,t){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;o.props.threads.forEach(function(e){o.props.freezeThread(e.id)});var n=o.props.threads.map(function(e){return e.id});e.push({op:"add",path:"acl",value:!0}),f.default.patch(o.props.api,{ids:n,ops:e}).then(function(e){o.props.threads.forEach(function(e){o.props.freezeThread(e.id)}),e.forEach(function(e){o.props.updateThread(e)}),p.default.success(t),r&&r()},function(e){if(o.props.threads.forEach(function(e){o.props.freezeThread(e.id)}),400!==e.status)return p.default.apiError(e);var n=[],a={};o.props.threads.forEach(function(e){a[e.id]=e}),e.forEach(function(e){var t=e.id,r=e.detail;void 0!==a[t]&&n.push({errors:r,thread:a[t]})}),d.default.show(l.default.createElement(u.default,{errors:n}))})}),v(h(o),"pinGlobally",function(){o.callApi([{op:"replace",path:"weight",value:2}],gettext("Selected threads were pinned globally."))}),v(h(o),"pinLocally",function(){o.callApi([{op:"replace",path:"weight",value:1}],gettext("Selected threads were pinned locally."))}),v(h(o),"unpin",function(){o.callApi([{op:"replace",path:"weight",value:0}],gettext("Selected threads were unpinned."))}),v(h(o),"approve",function(){o.callApi([{op:"replace",path:"is-unapproved",value:!1}],gettext("Selected threads were approved."))}),v(h(o),"open",function(){o.callApi([{op:"replace",path:"is-closed",value:!1}],gettext("Selected threads were opened."))}),v(h(o),"close",function(){o.callApi([{op:"replace",path:"is-closed",value:!0}],gettext("Selected threads were closed."))}),v(h(o),"unhide",function(){o.callApi([{op:"replace",path:"is-hidden",value:!1}],gettext("Selected threads were unhidden."))}),v(h(o),"hide",function(){o.callApi([{op:"replace",path:"is-hidden",value:!0}],gettext("Selected threads were hidden."))}),v(h(o),"move",function(){d.default.show(l.default.createElement(c.default,{callApi:o.callApi,categories:o.props.categories,categoriesMap:o.props.categoriesMap,route:o.props.route,user:o.props.user}))}),v(h(o),"merge",function(){var t=[];if(o.props.threads.forEach(function(e){e.acl.can_merge||t.append({id:e.id,title:e.title,errors:[gettext("You don't have permission to merge this thread with others.")]})}),o.props.threads.length<2)p.default.info(gettext("You have to select at least two threads to merge."));else{if(t.length)return void d.default.show(l.default.createElement(u.default,{errors:t}));d.default.show(l.default.createElement(s.default,o.props))}}),v(h(o),"delete",function(){var e;window.confirm(gettext("Are you sure you want to delete selected threads?"))&&(o.props.threads.map(function(e){o.props.freezeThread(e.id)}),e=o.props.threads.map(function(e){return e.id}),f.default.delete(o.props.api,e).then(function(){o.props.threads.map(function(e){o.props.freezeThread(e.id),o.props.deleteThread(e)}),p.default.success(gettext("Selected threads were deleted."))},function(e){var t;400===e.status?(t=e.map(function(e){return e.id}),o.props.threads.map(function(e){o.props.freezeThread(e.id),-1===t.indexOf(e.id)&&o.props.deleteThread(e)}),d.default.show(l.default.createElement(u.default,{errors:e}))):p.default.apiError(e)}))}),o}return e=a,(t=[{key:"getPinGloballyButton",value:function(){return this.props.moderation.can_pin_globally?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.pinGlobally,type:"button"},l.default.createElement("span",{className:"material-icon"},"bookmark"),gettext("Pin threads globally"))):null}},{key:"getPinLocallyButton",value:function(){return this.props.moderation.can_pin?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.pinLocally,type:"button"},l.default.createElement("span",{className:"material-icon"},"bookmark_border"),gettext("Pin threads locally"))):null}},{key:"getUnpinButton",value:function(){return this.props.moderation.can_pin?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.unpin,type:"button"},l.default.createElement("span",{className:"material-icon"},"panorama_fish_eye"),gettext("Unpin threads"))):null}},{key:"getMoveButton",value:function(){return this.props.moderation.can_move?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.move,type:"button"},l.default.createElement("span",{className:"material-icon"},"arrow_forward"),gettext("Move threads"))):null}},{key:"getMergeButton",value:function(){return this.props.moderation.can_merge?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.merge,type:"button"},l.default.createElement("span",{className:"material-icon"},"call_merge"),gettext("Merge threads"))):null}},{key:"getApproveButton",value:function(){return this.props.moderation.can_approve?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.approve,type:"button"},l.default.createElement("span",{className:"material-icon"},"done"),gettext("Approve threads"))):null}},{key:"getOpenButton",value:function(){return this.props.moderation.can_close?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.open,type:"button"},l.default.createElement("span",{className:"material-icon"},"lock_open"),gettext("Open threads"))):null}},{key:"getCloseButton",value:function(){return this.props.moderation.can_close?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.close,type:"button"},l.default.createElement("span",{className:"material-icon"},"lock_outline"),gettext("Close threads"))):null}},{key:"getUnhideButton",value:function(){return this.props.moderation.can_unhide?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.unhide,type:"button"},l.default.createElement("span",{className:"material-icon"},"visibility"),gettext("Unhide threads"))):null}},{key:"getHideButton",value:function(){return this.props.moderation.can_hide?l.default.createElement("li",null,l.default.createElement("button",{onClick:this.hide,type:"button",className:"btn btn-link"},l.default.createElement("span",{className:"material-icon"},"visibility_off"),gettext("Hide threads"))):null}},{key:"getDeleteButton",value:function(){return this.props.moderation.can_delete?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.delete,type:"button"},l.default.createElement("span",{className:"material-icon"},"clear"),gettext("Delete threads"))):null}},{key:"render",value:function(){return l.default.createElement("ul",{className:this.props.className},this.getPinGloballyButton(),this.getPinLocallyButton(),this.getUnpinButton(),this.getMoveButton(),this.getMergeButton(),this.getApproveButton(),this.getOpenButton(),this.getCloseButton(),this.getUnhideButton(),this.getHideButton(),this.getDeleteButton())}}])&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=g},{"../../../reducers/selection":358,"../../../services/ajax":365,"../../../services/modal":371,"../../../services/snackbar":376,"../../../services/store":377,"../../../utils/countdown":382,"./errors-list":262,"./merge":263,"./move":264,react:"react"}],262:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ThreadErrors=f,r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"modal-dialog",role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Threads moderation"))),o.default.createElement("div",{className:"modal-body"},o.default.createElement("p",{className:"lead"},gettext("One or more threads could not be deleted:")),o.default.createElement("ul",{className:"list-unstyled list-errored-items"},this.props.errors.map(function(e){return o.default.createElement(f,{errors:e.errors,key:e.thread.id,thread:e.thread})})))))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function f(e){var t=e.errors,r=e.thread;return o.default.createElement("li",null,o.default.createElement("h5",null,r.title),t.map(function(e,t){return o.default.createElement("p",null,e)}))}r.default=c},{react:"react"}],263:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var l=o(e("react")),n=o(e("../../button")),u=o(e("../../form")),s=o(e("../../form-group")),c=o(e("../../category-select")),f=o(e("../../select")),d=o(e("../../..")),p=e("../../../reducers/threads"),m=a(e("../../../reducers/selection")),y=o(e("./errors-list")),b=o(e("../../merge-conflict")),h=o(e("../../../services/ajax")),v=o(e("../../../services/modal")),g=o(e("../../../services/snackbar")),_=o(e("../../../services/store")),E=a(e("../../../utils/validators"));function w(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(w=function(e){return e?r:t})(e)}function a(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=w(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function o(e){return e&&e.__esModule?e:{default:e}}function O(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function j(e,t){return(j=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function P(r){var 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}}();return function(){var e,t=N(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return k(e)}(this,n?(e=N(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function k(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function N(e){return(N=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function x(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var S=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&j(e,t)}(o,u.default);var e,t,r,a=P(o);function o(e){var n,t;for(var r in!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o),x(k(n=a.call(this,e)),"getFormdata",function(){return{threads:n.props.threads.map(function(e){return e.id}),title:n.state.title,category:n.state.category,weight:n.state.weight,is_hidden:n.state.is_hidden,is_closed:n.state.is_closed}}),x(k(n),"handleSuccess",function(e){n.props.threads.forEach(function(e){n.props.freezeThread(e.id),n.props.deleteThread(e)}),_.default.dispatch(m.none()),n.props.addThreads([e]),_.default.dispatch((0,p.filterThreads)(n.props.route.category,n.props.categoriesMap)),v.default.hide()}),x(k(n),"handleError",function(e){400===e.status?e.best_answers||e.polls?v.default.show(l.default.createElement(b.default,{api:d.default.get("MERGE_THREADS_API"),bestAnswers:e.best_answers,data:n.getFormdata(),polls:e.polls,onError:n.handleError,onSuccess:n.handleSuccess})):(n.setState({errors:Object.assign({},n.state.errors,e)}),g.default.error(gettext("Form contains errors."))):403===e.status&&Array.isArray(e)?v.default.show(l.default.createElement(y.default,{errors:e})):e.best_answer?g.default.error(e.best_answer[0]):e.poll?g.default.error(e.poll[0]):g.default.apiError(e)}),x(k(n),"onCategoryChange",function(e){var t=e.target.value,r={category:t};n.acl[t].can_pin_threads<r.weight&&(r.weight=0),n.acl[t].can_hide_threads||(r.is_hidden=0),n.acl[t].can_close_threads||(r.is_closed=!1),n.setState(r)}),n.state={isLoading:!1,title:"",category:null,weight:0,is_hidden:0,is_closed:!1,validators:{title:[E.required()]},errors:{}},n.acl={},e.user.acl.categories){e.user.acl.categories.hasOwnProperty(r)&&(t=e.user.acl.categories[r],n.acl[t.id]=t)}return n.categoryChoices=[],e.categories.forEach(function(e){var t,r;0<e.level&&(r=!(t=n.acl[e.id]).can_start_threads||e.is_closed&&!t.can_close_threads,n.categoryChoices.push({value:e.id,disabled:r,level:e.level-1,label:e.name}),r||n.state.category||(n.state.category=e.id))}),n.isHiddenChoices=[{value:0,icon:"visibility",label:gettext("No")},{value:1,icon:"visibility_off",label:gettext("Yes")}],n.isClosedChoices=[{value:!1,icon:"lock_outline",label:gettext("No")},{value:!0,icon:"lock",label:gettext("Yes")}],n}return e=o,(t=[{key:"clean",value:function(){return!!this.isValid()||(g.default.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}},{key:"send",value:function(){return h.default.post(d.default.get("MERGE_THREADS_API"),this.getFormdata())}},{key:"getWeightChoices",value:function(){var e=[{value:0,icon:"remove",label:gettext("Not pinned")},{value:1,icon:"bookmark_border",label:gettext("Pinned locally")}];return 2==this.acl[this.state.category].can_pin_threads&&e.push({value:2,icon:"bookmark",label:gettext("Pinned globally")}),e}},{key:"renderWeightField",value:function(){return this.acl[this.state.category].can_pin_threads?l.default.createElement(s.default,{label:gettext("Thread weight"),for:"id_weight"},l.default.createElement(f.default,{id:"id_weight",onChange:this.bindInput("weight"),value:this.state.weight,choices:this.getWeightChoices()})):null}},{key:"renderHiddenField",value:function(){return this.acl[this.state.category].can_hide_threads?l.default.createElement(s.default,{label:gettext("Hide thread"),for:"id_is_hidden"},l.default.createElement(f.default,{id:"id_is_closed",onChange:this.bindInput("is_hidden"),value:this.state.is_hidden,choices:this.isHiddenChoices})):null}},{key:"renderClosedField",value:function(){return this.acl[this.state.category].can_close_threads?l.default.createElement(s.default,{label:gettext("Close thread"),for:"id_is_closed"},l.default.createElement(f.default,{id:"id_is_closed",onChange:this.bindInput("is_closed"),value:this.state.is_closed,choices:this.isClosedChoices})):null}},{key:"renderForm",value:function(){return l.default.createElement("form",{onSubmit:this.handleSubmit},l.default.createElement("div",{className:"modal-body"},l.default.createElement(s.default,{label:gettext("Thread title"),for:"id_title",validation:this.state.errors.title},l.default.createElement("input",{id:"id_title",className:"form-control",type:"text",onChange:this.bindInput("title"),value:this.state.title})),l.default.createElement("div",{className:"clearfix"}),l.default.createElement(s.default,{label:gettext("Category"),for:"id_category",validation:this.state.errors.category},l.default.createElement(c.default,{id:"id_category",onChange:this.onCategoryChange,value:this.state.category,choices:this.categoryChoices})),l.default.createElement("div",{className:"clearfix"}),this.renderWeightField(),this.renderHiddenField(),this.renderClosedField()),l.default.createElement("div",{className:"modal-footer"},l.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),l.default.createElement(n.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Merge threads"))))}},{key:"renderCantMergeMessage",value:function(){return l.default.createElement("div",{className:"modal-body"},l.default.createElement("div",{className:"message-icon"},l.default.createElement("span",{className:"material-icon"},"info_outline")),l.default.createElement("div",{className:"message-body"},l.default.createElement("p",{className:"lead"},gettext("You can't move threads because there are no categories you are allowed to move them to.")),l.default.createElement("p",null,gettext("You need permission to start threads in category to be able to merge threads to it.")),l.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok"))))}},{key:"getClassName",value:function(){return this.state.category?"modal-dialog":"modal-dialog modal-message"}},{key:"render",value:function(){return l.default.createElement("div",{className:this.getClassName(),role:"document"},l.default.createElement("div",{className:"modal-content"},l.default.createElement("div",{className:"modal-header"},l.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},l.default.createElement("span",{"aria-hidden":"true"},"×")),l.default.createElement("h4",{className:"modal-title"},gettext("Merge threads"))),this.state.category?this.renderForm():this.renderCantMergeMessage()))}}])&&O(e.prototype,t),r&&O(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=S},{"../../..":302,"../../../reducers/selection":358,"../../../reducers/threads":361,"../../../services/ajax":365,"../../../services/modal":371,"../../../services/snackbar":376,"../../../services/store":377,"../../../utils/validators":393,"../../button":8,"../../category-select":21,"../../form":56,"../../form-group":55,"../../merge-conflict":59,"../../select":210,"./errors-list":262,react:"react"}],264:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=s(e("react")),a=s(e("../../form")),o=s(e("../../form-group")),l=s(e("../../category-select")),c=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/selection")),f=e("../../../reducers/threads"),d=s(e("../../../services/modal")),p=s(e("../../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e){return e&&e.__esModule?e:{default:e}}function m(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=v(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=v(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(s,a.default);var e,t,r,u=b(s);function s(e){var n,t,r,a;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,s),n=u.call(this,e),t=h(n),a=function(e){e.preventDefault(),d.default.hide();n.props.callApi([{op:"replace",path:"category",value:n.state.category},{op:"replace",path:"flatten-categories",value:null},{op:"add",path:"acl",value:!0}],gettext("Selected threads were moved."),function(){p.default.dispatch((0,f.filterThreads)(n.props.route.category,n.props.categoriesMap));var e=p.default.getState(),t=e.threads.map(function(e){return e.id});p.default.dispatch(c.all(e.selection.filter(function(e){return-1!==t.indexOf(e)})))})},(r="handleSubmit")in t?Object.defineProperty(t,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[r]=a,n.state={category:null};var o,l={};for(var i in e.user.acl.categories){e.user.acl.categories.hasOwnProperty(i)&&(o=e.user.acl.categories[i],l[o.id]=o)}return n.categoryChoices=[],e.categories.forEach(function(e){var t,r;0<e.level&&(r=!(t=l[e.id]).can_start_threads||e.is_closed&&!t.can_close_threads,n.categoryChoices.push({value:e.id,disabled:r,level:e.level-1,label:e.name}),r||n.state.category||(n.state.category=e.id))}),n}return e=s,(t=[{key:"getClassName",value:function(){return this.state.category?"modal-dialog":"modal-dialog modal-message"}},{key:"renderForm",value:function(){return n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"modal-body"},n.default.createElement(o.default,{label:gettext("New category"),for:"id_new_category"},n.default.createElement(l.default,{id:"id_new_category",onChange:this.bindInput("category"),value:this.state.category,choices:this.categoryChoices}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),n.default.createElement("button",{className:"btn btn-primary"},gettext("Move threads"))))}},{key:"renderCantMoveMessage",value:function(){return n.default.createElement("div",{className:"modal-body"},n.default.createElement("div",{className:"message-icon"},n.default.createElement("span",{className:"material-icon"},"info_outline")),n.default.createElement("div",{className:"message-body"},n.default.createElement("p",{className:"lead"},gettext("You can't move threads because there are no categories you are allowed to move them to.")),n.default.createElement("p",null,gettext("You need permission to start threads in category to be able to move threads to it.")),n.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok"))))}},{key:"render",value:function(){return n.default.createElement("div",{className:this.getClassName(),role:"document"},n.default.createElement("div",{className:"modal-content"},n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Move threads"))),this.state.category?this.renderForm():this.renderCantMoveMessage()))}}])&&m(e.prototype,t),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),s}();r.default=g},{"../../../reducers/selection":358,"../../../reducers/threads":361,"../../../services/modal":371,"../../../services/store":377,"../../category-select":21,"../../form":56,"../../form-group":55,react:"react"}],265:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=a(e("react")),l=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/selection")),u=a(e("../../../services/store"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function a(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=o(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return p(e)}(this,n?(e=o(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function m(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var y=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(o,n.default.Component);var e,t,r,a=d(o);function o(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return m(p(e=a.call.apply(a,[this].concat(r))),"selectAll",function(){u.default.dispatch(l.all(e.props.threads.map(function(e){return e.id})))}),m(p(e),"selectNone",function(){u.default.dispatch(l.none())}),e}return e=o,(t=[{key:"render",value:function(){return n.default.createElement("ul",{className:this.props.className},n.default.createElement("li",null,n.default.createElement("button",{className:"btn btn-link",type:"button",onClick:this.selectAll},n.default.createElement("span",{className:"material-icon"},"check_box"),gettext("Select all"))),n.default.createElement("li",null,n.default.createElement("button",{className:"btn btn-link",type:"button",onClick:this.selectNone},n.default.createElement("span",{className:"material-icon"},"check_box_outline_blank"),gettext("Select none"))))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=y},{"../../../reducers/selection":358,"../../../services/store":377,react:"react"}],266:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.baseUrl,r=e.list,n=e.lists;return n.length<2?null:a.default.createElement("div",{className:"page-tabs"},a.default.createElement("div",{className:"container"},a.default.createElement("ul",{className:"nav nav-pills"},n.map(function(e){return a.default.createElement(l.default,{isControlled:!0,isActive:e.path===r.path,key:t+e.path},a.default.createElement(o.Link,{to:t+e.path},e.name))}))))};var a=n(e("react")),o=e("react-router"),l=n(e("../li"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../li":57,react:"react","react-router":"react-router"}],267:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.getLists=c,r.getSelect=s,r.paths=function(e,r){var n=c(e),a=[],o={};return u.default.get("CATEGORIES").forEach(function(t){n.forEach(function(e){o[t.id]=t,a.push({path:t.url.index+e.path,component:(0,l.connect)(s(r))(i.default),categories:u.default.get("CATEGORIES"),categoriesMap:o,category:t,lists:n,list:e})})}),a};var l=e("react-redux"),i=n(e("./route")),u=n(e("../.."));function n(e){return e&&e.__esModule?e:{default:e}}function s(t){return function(e){return{options:t,selection:e.selection,threads:e.threads,tick:e.tick.tick,user:e.auth.user}}}function c(e){var t=[{type:"all",path:"",name:gettext("All"),longName:gettext("All threads")}];return e.id&&(t.push({type:"my",path:"my/",name:gettext("My"),longName:gettext("My threads")}),t.push({type:"new",path:"new/",name:gettext("New"),longName:gettext("New threads")}),t.push({type:"unread",path:"unread/",name:gettext("Unread"),longName:gettext("Unread threads")}),t.push({type:"subscribed",path:"subscribed/",name:gettext("Subscribed"),longName:gettext("Subscribed threads")}),e.acl.can_see_unapproved_content_lists&&t.push({type:"unapproved",path:"unapproved/",name:gettext("Unapproved"),longName:gettext("Unapproved content")})),t}},{"../..":302,"./route":268,"react-redux":"react-redux"}],268:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=a(e("react")),l=a(e("../button")),u=e("./compare"),s=a(e("./container")),c=a(e("./header")),f=e("./utils"),d=a(e("../threads-list")),p=a(e("./list-empty")),m=a(e("../with-dropdown")),y=a(e("../..")),b=n(e("../../reducers/selection")),h=e("../../reducers/threads"),v=a(e("../../services/ajax")),g=a(e("../../services/polls")),_=a(e("../../services/snackbar")),E=a(e("../../services/store")),w=a(e("../../services/page-title")),O=n(e("../../utils/sets"));function j(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(j=function(e){return e?r:t})(e)}function n(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=j(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function a(e){return e&&e.__esModule?e:{default:e}}function P(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function k(e,t){return(k=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function N(r){var 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}}();return function(){var e,t=S(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return x(e)}(this,n?(e=S(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function x(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function S(e){return(S=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function R(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var C=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&k(e,t)}(a,m.default);var e,t,r,n=N(a);function a(e){var r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),R(x(r=n.call(this,e)),"loadMore",function(){r.setState({isBusy:!0}),r.loadThreads(r.getCategory(),r.state.next)}),R(x(r),"pollResponse",function(e){r.setState({diff:Object.assign({},e,{results:(0,f.diffThreads)(r.props.threads,e.results)})})}),R(x(r),"addThreads",function(e){E.default.dispatch((0,h.append)(e,r.getSorting()))}),R(x(r),"applyDiff",function(){r.addThreads(r.state.diff.results),r.setState(Object.assign({},r.state.diff,{moderation:(0,f.getModerationActions)(E.default.getState().threads),diff:{results:[]}}))}),R(x(r),"freezeThread",function(t){r.setState(function(e){return{busyThreads:O.toggle(e.busyThreads,t)}})}),R(x(r),"updateThread",function(e){E.default.dispatch((0,h.patch)(e,e,r.getSorting()))}),R(x(r),"deleteThread",function(e){E.default.dispatch((0,h.deleteThread)(e))}),r.state={isMounted:!0,isLoaded:!1,isBusy:!1,diff:{results:[]},moderation:[],busyThreads:[],dropdown:!1,subcategories:[],next:0};var t=r.getCategory();return y.default.has("THREADS")?r.initWithPreloadedData(t,y.default.get("THREADS")):r.initWithoutPreloadedData(t),r}return e=a,(t=[{key:"getCategory",value:function(){return this.props.route.category.special_role?null:this.props.route.category.id}},{key:"initWithPreloadedData",value:function(e,t){this.state=Object.assign(this.state,{moderation:(0,f.getModerationActions)(t.results),subcategories:t.subcategories,next:t.next}),this.startPolling(e)}},{key:"initWithoutPreloadedData",value:function(e){this.loadThreads(e)}},{key:"loadThreads",value:function(t,e){var r=this,n=1<arguments.length&&void 0!==e?e:0;v.default.get(this.props.options.api,{category:t,list:this.props.route.list.type,start:n||0},"threads").then(function(e){r.state.isMounted&&(0===n?E.default.dispatch((0,h.hydrate)(e.results)):E.default.dispatch((0,h.append)(e.results,r.getSorting())),r.setState({isLoaded:!0,isBusy:!1,moderation:(0,f.getModerationActions)(E.default.getState().threads),subcategories:e.subcategories,next:e.next}),r.startPolling(t))},function(e){_.default.apiError(e)})}},{key:"startPolling",value:function(e){g.default.start({poll:"threads",url:this.props.options.api,data:{category:e,list:this.props.route.list.type},frequency:12e4,update:this.pollResponse})}},{key:"componentDidMount",value:function(){this.setPageTitle(),y.default.has("THREADS")&&(E.default.dispatch((0,h.hydrate)(y.default.pop("THREADS").results)),this.setState({isLoaded:!0})),E.default.dispatch(b.none())}},{key:"componentWillUnmount",value:function(){this.state.isMounted=!1,g.default.stop("threads")}},{key:"getTitle",value:function(){return this.props.options.title?this.props.options.title:(0,f.getTitle)(this.props.route)}},{key:"setPageTitle",value:function(){this.props.route.category.level||!y.default.get("THREADS_ON_INDEX")?w.default.set((0,f.getPageTitle)(this.props.route)):this.props.options.title?w.default.set(this.props.options.title):y.default.get("SETTINGS").index_title?document.title=y.default.get("SETTINGS").index_title:document.title=y.default.get("SETTINGS").forum_name}},{key:"getSorting",value:function(){return this.props.route.category.level?u.compareWeight:u.compareGlobalWeight}},{key:"getMoreButton",value:function(){return this.state.next?o.default.createElement("div",{className:"pager-more"},o.default.createElement(l.default,{className:"btn btn-default btn-outline",loading:this.state.isBusy||this.state.busyThreads.length,onClick:this.loadMore},gettext("Show more"))):null}},{key:"getClassName",value:function(){var e,t="page page-threads";return t+=" page-threads-"+this.props.route.list.type,(e=this.props).route.category.level||!y.default.get("THREADS_ON_INDEX")||e.options.title||(t+=" page-threads-index"),this.props.route.category.css_class&&(t+=" page-threads-"+this.props.route.category.css_class),t}},{key:"render",value:function(){return o.default.createElement("div",{className:this.getClassName()},o.default.createElement(c.default,{categories:this.props.route.categoriesMap,disabled:!this.state.isLoaded,startThread:this.props.options.startThread,threads:this.props.threads,title:this.getTitle(),toggleNav:this.toggleNav,route:this.props.route,user:this.props.user}),o.default.createElement(s.default,{api:this.props.options.api,route:this.props.route,subcategories:this.state.subcategories,user:this.props.user,pageLead:this.props.options.pageLead,threads:this.props.threads,threadsCount:this.state.count,moderation:this.state.moderation,selection:this.props.selection,busyThreads:this.state.busyThreads,addThreads:this.addThreads,freezeThread:this.freezeThread,deleteThread:this.deleteThread,updateThread:this.updateThread,isLoaded:this.state.isLoaded,isBusy:this.state.isBusy},o.default.createElement(d.default,{category:this.props.route.category,categories:this.props.route.categoriesMap,list:this.props.route.list,selection:this.props.selection,threads:this.props.threads,diffSize:this.state.diff.results.length,applyDiff:this.applyDiff,showOptions:!!this.props.user.id,isLoaded:this.state.isLoaded,busyThreads:this.state.busyThreads},o.default.createElement(p.default,{category:this.props.route.category,emptyMessage:this.props.options.emptyMessage,list:this.props.route.list})),this.getMoreButton()))}}])&&P(e.prototype,t),r&&P(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=C},{"../..":302,"../../reducers/selection":358,"../../reducers/threads":361,"../../services/ajax":365,"../../services/page-title":373,"../../services/polls":374,"../../services/snackbar":376,"../../services/store":377,"../../utils/sets":391,"../button":8,"../threads-list":238,"../with-dropdown":299,"./compare":257,"./container":258,"./header":259,"./list-empty":260,"./utils":270,react:"react"}],269:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./category-picker")),i=n(e("./moderation/controls")),u=n(e("./moderation/selection"));function n(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=d(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=d(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){return(d=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(a,o.default.Component);var e,t,r,n=f(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getCategoryPicker",value:function(){return this.props.subcategories.length?o.default.createElement(l.default,{categories:this.props.categoriesMap,choices:this.props.subcategories,list:this.props.list}):null}},{key:"showModerationOptions",value:function(){return this.props.user.id&&this.props.moderation.allow}},{key:"getSelectedThreads",value:function(){var t=this;return this.props.threads.filter(function(e){return 0<=t.props.selection.indexOf(e.id)})}},{key:"getModerationButton",value:function(){return this.showModerationOptions()?o.default.createElement("div",{className:"col-xs-6 col-sm-3 col-md-2"},o.default.createElement("div",{className:"btn-group btn-group-justified"},o.default.createElement("div",{className:"btn-group dropdown"},o.default.createElement("button",{type:"button",className:"btn btn-default btn-outline dropdown-toggle","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:this.props.disabled||!this.props.selection.length},o.default.createElement("span",{className:"material-icon"},"settings"),gettext("Options")),o.default.createElement(i.default,{addThreads:this.props.addThreads,api:this.props.api,categories:this.props.categories,categoriesMap:this.props.categoriesMap,className:"dropdown-menu dropdown-menu-right stick-to-bottom",deleteThread:this.props.deleteThread,freezeThread:this.props.freezeThread,moderation:this.props.moderation,route:this.props.route,threads:this.getSelectedThreads(),updateThread:this.props.updateThread,user:this.props.user})))):null}},{key:"getSelectionButton",value:function(){return this.showModerationOptions()?o.default.createElement("div",{className:"col-xs-3 col-sm-2 col-md-1"},o.default.createElement("div",{className:"btn-group btn-group-justified"},o.default.createElement("div",{className:"btn-group dropdown"},o.default.createElement("button",{type:"button",className:"btn btn-default btn-outline btn-icon dropdown-toggle","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:this.props.disabled},o.default.createElement("span",{className:"material-icon"},"select_all")),o.default.createElement(u.default,{className:"dropdown-menu dropdown-menu-right stick-to-bottom",threads:this.props.threads})))):null}},{key:"render",value:function(){return o.default.createElement("div",{className:"row row-toolbar row-toolbar-bottom-margin"},o.default.createElement("div",{className:"col-xs-3 col-sm-3 col-md-2 dropdown"},this.getCategoryPicker()),o.default.createElement("div",{className:"hidden-xs col-sm-4 col-md-7"}),this.getModerationButton(),this.getSelectionButton())}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"./category-picker":256,"./moderation/controls":261,"./moderation/selection":265,react:"react"}],270:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.diffThreads=function(e,t){var r={};return e.forEach(function(e){r[e.id]=e}),t.filter(function(e){return!r[e.id]||o(r[e.id],e)})},r.getModerationActions=function(e){var t={allow:!1,can_approve:0,can_close:0,can_delete:0,can_hide:0,can_merge:0,can_move:0,can_pin:0,can_pin_globally:0,can_unhide:0};return e.forEach(function(e){e.is_unapproved&&e.acl.can_approve>t.can_approve&&(t.can_approve=e.acl.can_approve),e.acl.can_close>t.can_close&&(t.can_close=e.acl.can_close),e.acl.can_delete>t.can_delete&&(t.can_delete=e.acl.can_delete),e.acl.can_hide>t.can_hide&&(t.can_hide=e.acl.can_hide),e.acl.can_merge>t.can_merge&&(t.can_merge=e.acl.can_merge),e.acl.can_move>t.can_move&&(t.can_move=e.acl.can_move),e.acl.can_pin>t.can_pin&&(t.can_pin=e.acl.can_pin),e.acl.can_pin_globally>t.can_pin_globally&&(t.can_pin_globally=e.acl.can_pin_globally),e.is_hidden&&e.acl.can_unhide>t.can_unhide&&(t.can_unhide=e.acl.can_unhide),t.allow=t.can_approve||t.can_close||t.can_delete||t.can_hide||t.can_merge||t.can_move||t.can_pin||t.can_pin_globally||t.can_unhide}),t},r.getPageTitle=function(e){return e.category.level?e.list.path?{title:e.list.longName,parent:e.category.name}:{title:e.category.name}:a.default.get("THREADS_ON_INDEX")?e.list.path?{title:e.list.longName}:null:e.list.path?{title:e.list.longName,parent:gettext("Threads")}:{title:gettext("Threads")}},r.getTitle=function(e){return e.category.level?e.category.name:a.default.get("THREADS_ON_INDEX")?a.default.get("SETTINGS").index_header?a.default.get("SETTINGS").index_header:a.default.get("SETTINGS").forum_name:gettext("Threads")},r.isThreadChanged=o;var n,a=(n=e("../.."))&&n.__esModule?n:{default:n};function o(e,t){return 0<=[e.title===t.title,e.weight===t.weight,e.category===t.category,e.last_post===t.last_post,e.last_poster_name===t.last_poster_name].indexOf(!1)}},{"../..":302}],271:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.GuestNav=r.GuestMenu=r.CompactGuestNav=void 0;var n=d(e("react")),o=d(e("../avatar")),l=d(e("../navbar-search")),i=d(e("../register-button")),u=d(e("../sign-in.js")),s=d(e("../..")),c=d(e("../../services/mobile-navbar-dropdown")),f=d(e("../../services/modal"));function d(e){return e&&e.__esModule?e:{default:e}}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function m(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t,r){return t&&m(e.prototype,t),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function b(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){b(t,n.default.Component);var e=v(t);function t(){return p(this,t),e.apply(this,arguments)}return y(t,[{key:"showSignInModal",value:function(){f.default.show(u.default)}},{key:"render",value:function(){return n.default.createElement("ul",{className:"dropdown-menu user-dropdown dropdown-menu-right",role:"menu"},n.default.createElement("li",{className:"guest-preview"},n.default.createElement("h4",null,gettext("You are browsing as guest.")),n.default.createElement("p",null,gettext("Sign in or register to start and participate in discussions.")),n.default.createElement("div",{className:"row"},s.default.get("SETTINGS").enable_sso?n.default.createElement("div",{className:"col-xs-12"},n.default.createElement("a",{className:"btn btn-primary btn-register btn-block",href:s.default.get("SETTINGS").SSO_LOGIN_URL},gettext("Sign in"))):n.default.createElement("div",{className:"col-xs-6"},n.default.createElement("button",{className:"btn btn-default btn-sign-in btn-block",onClick:this.showSignInModal,type:"button"},gettext("Sign in"))),!s.default.get("SETTINGS").enable_sso&&n.default.createElement("div",{className:"col-xs-6"},n.default.createElement(i.default,{className:"btn-primary btn-register btn-block"},gettext("Register"))))))}}]),t}();r.GuestMenu=_;var E=function(){b(t,_);var e=v(t);function t(){return p(this,t),e.apply(this,arguments)}return y(t,[{key:"render",value:function(){return n.default.createElement("div",{className:"nav nav-guest"},s.default.get("SETTINGS").enable_sso?n.default.createElement("a",{className:"btn navbar-btn btn-primary btn-register",href:s.default.get("SETTINGS").SSO_LOGIN_URL},gettext("Sign in")):n.default.createElement("button",{className:"btn navbar-btn btn-default btn-sign-in",onClick:this.showSignInModal,type:"button"},gettext("Sign in")),!s.default.get("SETTINGS").enable_sso&&n.default.createElement(i.default,{className:"navbar-btn btn-primary btn-register"},gettext("Register")),n.default.createElement("div",{className:"navbar-left"},n.default.createElement(l.default,null)))}}]),t}();r.GuestNav=E;var w=function(){b(t,n.default.Component);var e=v(t);function t(){return p(this,t),e.apply(this,arguments)}return y(t,[{key:"showGuestMenu",value:function(){c.default.show(_)}},{key:"render",value:function(){return n.default.createElement("button",{type:"button",onClick:this.showGuestMenu},n.default.createElement(o.default,{size:"64"}))}}]),t}();r.CompactGuestNav=w},{"../..":302,"../../services/mobile-navbar-dropdown":370,"../../services/modal":371,"../avatar":6,"../navbar-search":77,"../register-button":198,"../sign-in.js":211,react:"react"}],272:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.UserMenu=r.CompactUserMenu=void 0,r.select=function(e){return e.auth};var n,o=(n=e("react"))&&n.__esModule?n:{default:n},l=e("./guest-nav"),i=e("./user-nav");function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t,r){return t&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function f(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=m(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=m(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var y=function(){f(t,o.default.Component);var e=p(t);function t(){return u(this,t),e.apply(this,arguments)}return c(t,[{key:"render",value:function(){return this.props.isAuthenticated?o.default.createElement(i.UserNav,{user:this.props.user}):o.default.createElement(l.GuestNav,null)}}]),t}();r.UserMenu=y;var b=function(){f(t,o.default.Component);var e=p(t);function t(){return u(this,t),e.apply(this,arguments)}return c(t,[{key:"render",value:function(){return this.props.isAuthenticated?o.default.createElement(i.CompactUserNav,{user:this.props.user}):o.default.createElement(l.CompactGuestNav,null)}}]),t}();r.CompactUserMenu=b},{"./guest-nav":271,"./user-nav":273,react:"react"}],273:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.CompactUserNav=void 0,r.PrivateThreadsBadge=w,r.UserMenu=void 0,r.UserNav=function(e){var t=e.user;return n.default.createElement("ul",{className:"ul nav navbar-nav nav-user"},n.default.createElement("li",null,n.default.createElement(u.default,null)),n.default.createElement(O,{user:t}),n.default.createElement("li",{className:"dropdown"},n.default.createElement("a",{"aria-haspopup":"true","aria-expanded":"false",className:"dropdown-toggle","data-toggle":"dropdown",href:t.url,role:"button"},n.default.createElement(o.default,{user:t,size:"64"})),n.default.createElement(E,{user:t})))},r.UserPrivateThreadsLink=O,r.selectUserMenu=j;var n=p(e("react")),a=e("react-redux"),o=p(e("../avatar")),l=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../change-avatar/root")),u=p(e("../navbar-search")),s=p(e("../..")),c=p(e("../../services/mobile-navbar-dropdown")),f=p(e("../../services/modal"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function p(e){return e&&e.__esModule?e:{default:e}}function m(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t,r){return t&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function h(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&v(e,t)}function v(e,t){return(v=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function g(r){var 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}}();return function(){var e,t=_(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=_(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function _(e){return(_=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var E=function(){h(t,n.default.Component);var e=g(t);function t(){return m(this,t),e.apply(this,arguments)}return b(t,[{key:"logout",value:function(){window.confirm(gettext("Are you sure you want to sign out?"))&&$("#hidden-logout-form").submit()}},{key:"changeAvatar",value:function(){f.default.show((0,a.connect)(l.select)(l.default))}},{key:"render",value:function(){var e=this.props.user;return n.default.createElement("ul",{className:"dropdown-menu user-dropdown dropdown-menu-right",role:"menu"},n.default.createElement("li",{className:"dropdown-header"},n.default.createElement("strong",null,e.username),n.default.createElement("div",{className:"row user-stats"},n.default.createElement("div",{className:"col-sm-3"},n.default.createElement("span",{className:"material-icon"},"message"),e.posts),n.default.createElement("div",{className:"col-sm-3"},n.default.createElement("span",{className:"material-icon"},"forum"),e.threads),n.default.createElement("div",{className:"col-sm-3"},n.default.createElement("span",{className:"material-icon"},"favorite"),e.followers),n.default.createElement("div",{className:"col-sm-3"},n.default.createElement("span",{className:"material-icon"},"favorite_outline"),e.following))),n.default.createElement("li",{className:"divider"}),n.default.createElement("li",null,n.default.createElement("a",{href:e.url},n.default.createElement("span",{className:"material-icon"},"account_circle"),gettext("See your profile"))),n.default.createElement("li",null,n.default.createElement("a",{href:s.default.get("USERCP_URL")},n.default.createElement("span",{className:"material-icon"},"done_all"),gettext("Change options"))),n.default.createElement("li",null,n.default.createElement("button",{className:"btn-link",onClick:this.changeAvatar,type:"button"},n.default.createElement("span",{className:"material-icon"},"portrait"),gettext("Change avatar"))),!!e.acl.can_use_private_threads&&n.default.createElement("li",null,n.default.createElement("a",{href:s.default.get("PRIVATE_THREADS_URL")},n.default.createElement("span",{className:"material-icon"},"message"),gettext("Private threads"),n.default.createElement(w,{user:e}))),n.default.createElement("li",{className:"divider"}),n.default.createElement("li",{className:"dropdown-buttons"},n.default.createElement("button",{className:"btn btn-default btn-block",onClick:this.logout,type:"button"},gettext("Log out"))))}}]),t}();function w(e){var t=e.user;return t.unread_private_threads?n.default.createElement("span",{className:"badge"},t.unread_private_threads):null}function O(e){var t=e.user;if(!t.acl.can_use_private_threads)return null;var r=null,r=t.unread_private_threads?gettext("You have unread private threads!"):gettext("Private threads");return n.default.createElement("li",null,n.default.createElement("a",{className:"navbar-icon",href:s.default.get("PRIVATE_THREADS_URL"),title:r},n.default.createElement("span",{className:"material-icon"},"message"),0<t.unread_private_threads&&n.default.createElement("span",{className:"badge"},t.unread_private_threads)))}function j(e){return{user:e.auth.user}}r.UserMenu=E;var P=function(){h(t,n.default.Component);var e=g(t);function t(){return m(this,t),e.apply(this,arguments)}return b(t,[{key:"showUserMenu",value:function(){c.default.showConnected("user-menu",(0,a.connect)(j)(E))}},{key:"render",value:function(){return n.default.createElement("button",{type:"button",onClick:this.showUserMenu},n.default.createElement(o.default,{user:this.props.user,size:"50"}))}}]),t}();r.CompactUserNav=P},{"../..":302,"../../services/mobile-navbar-dropdown":370,"../../services/modal":371,"../avatar":6,"../change-avatar/root":25,"../navbar-search":77,react:"react","react-redux":"react-redux"}],274:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.StatusLabel=r.StatusIcon=void 0,r.getStatusClassName=b,r.getStatusDescription=h;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t,r){return t&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=d(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=d(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){return(d=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){s(t,o.default.Component);var e=f(t);function t(){return l(this,t),e.apply(this,arguments)}return u(t,[{key:"getClass",value:function(){return b(this.props.status)}},{key:"render",value:function(){return o.default.createElement("span",{className:this.getClass()},this.props.children)}}]),t}();r.default=p;var m=function(){s(t,o.default.Component);var e=f(t);function t(){return l(this,t),e.apply(this,arguments)}return u(t,[{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 o.default.createElement("span",{className:"material-icon status-icon"},this.getIcon())}}]),t}();r.StatusIcon=m;var y=function(){s(t,o.default.Component);var e=f(t);function t(){return l(this,t),e.apply(this,arguments)}return u(t,[{key:"getHelp",value:function(){return h(this.props.user,this.props.status)}},{key:"getLabel",value:function(){return this.props.status.is_banned?gettext("Banned"):this.props.status.is_hidden?gettext("Hidden"):this.props.status.is_online_hidden?gettext("Online (hidden)"):this.props.status.is_offline_hidden?gettext("Offline (hidden)"):this.props.status.is_online?gettext("Online"):this.props.status.is_offline?gettext("Offline"):void 0}},{key:"render",value:function(){return o.default.createElement("span",{className:this.props.className||"status-label",title:this.getHelp()},this.getLabel())}}]),t}();function b(e){var t="";return 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}function h(e,t){return t.is_banned?t.banned_until?interpolate(gettext("%(username)s is banned until %(ban_expires)s"),{username:e.username,ban_expires:t.banned_until.format("LL, LT")},!0):interpolate(gettext("%(username)s is banned"),{username:e.username},!0):t.is_hidden?interpolate(gettext("%(username)s is hiding presence"),{username:e.username},!0):t.is_online_hidden?interpolate(gettext("%(username)s is online (hidden)"),{username:e.username},!0):t.is_offline_hidden?interpolate(gettext("%(username)s was last seen %(last_click)s (hidden)"),{username:e.username,last_click:t.last_click.fromNow()},!0):t.is_online?interpolate(gettext("%(username)s is online"),{username:e.username},!0):t.is_offline?interpolate(gettext("%(username)s was last seen %(last_click)s"),{username:e.username,last_click:t.last_click.fromNow()},!0):void 0}r.StatusLabel=y},{react:"react"}],275:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../avatar")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../utils/random"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(a,o.default.Component);var e,t,r,n=d(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{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 o.default.createElement("li",{className:this.getClassName()},o.default.createElement("div",{className:"change-avatar"},o.default.createElement("span",{className:"user-avatar"},o.default.createElement(l.default,{size:"100"}))),o.default.createElement("div",{className:"change-author"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,100)+"px"}}," ")),o.default.createElement("div",{className:"change"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,70)+"px"}}," "),o.default.createElement("span",{className:"material-icon"},"arrow_forward"),o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,70)+"px"}}," ")),o.default.createElement("div",{className:"change-date"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(80,140)+"px"}}," ")))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../../utils/random":388,"../avatar":6,react:"react"}],276:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../avatar"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"renderUserAvatar",value:function(){return this.props.change.changed_by?o.default.createElement("a",{href:this.props.change.changed_by.url,className:"user-avatar-wrapper"},o.default.createElement(l.default,{user:this.props.change.changed_by,size:"100"})):o.default.createElement("span",{className:"user-avatar-wrapper"},o.default.createElement(l.default,{size:"100"}))}},{key:"renderUsername",value:function(){return this.props.change.changed_by?o.default.createElement("a",{href:this.props.change.changed_by.url,className:"item-title"},this.props.change.changed_by.username):o.default.createElement("span",{className:"item-title"},this.props.change.changed_by_username)}},{key:"render",value:function(){return o.default.createElement("li",{className:"list-group-item",key:this.props.change.id},o.default.createElement("div",{className:"change-avatar"},this.renderUserAvatar()),o.default.createElement("div",{className:"change-author"},this.renderUsername()),o.default.createElement("div",{className:"change"},o.default.createElement("span",{className:"old-username"},this.props.change.old_username),o.default.createElement("span",{className:"material-icon"},"arrow_forward"),o.default.createElement("span",{className:"new-username"},this.props.change.new_username)),o.default.createElement("div",{className:"change-date"},o.default.createElement("abbr",{title:this.props.change.changed_on.format("LLL")},this.props.change.changed_on.fromNow())))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"../avatar":6,react:"react"}],277:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getEmptyMessage",value:function(){return this.props.emptyMessage?this.props.emptyMessage:gettext("No name changes have been recorded for your account.")}},{key:"render",value:function(){return o.default.createElement("div",{className:"username-history ui-ready"},o.default.createElement("ul",{className:"list-group"},o.default.createElement("li",{className:"list-group-item empty-message"},this.getEmptyMessage())))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],278:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./change-preview"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return o.default.createElement("div",{className:"username-history ui-preview"},o.default.createElement("ul",{className:"list-group"},[0,1,2].map(function(e){return o.default.createElement(l.default,{hiddenOnMobile:0<e,key:e})})))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./change-preview":275,react:"react"}],279:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./change"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"username-history ui-ready"},o.default.createElement("ul",{className:"list-group"},this.props.changes.map(function(e){return o.default.createElement(l.default,{change:e,key:e.id})})))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./change":276,react:"react"}],280:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./list-empty")),i=n(e("./list-ready")),u=n(e("./list-preview"));function n(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=d(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=d(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){return(d=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(a,o.default.Component);var e,t,r,n=f(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return this.props.isLoaded?this.props.changes.length?o.default.createElement(i.default,{changes:this.props.changes}):o.default.createElement(l.default,{emptyMessage:this.props.emptyMessage}):o.default.createElement(u.default,null)}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"./list-empty":277,"./list-preview":278,"./list-ready":279,react:"react"}],281:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.showStatus,r=e.user,n=r.rank,a="panel user-card";n.css_class&&(a+=" user-card-"+n.css_class);return o.default.createElement("div",{className:a},o.default.createElement("div",{className:"panel-body"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-xs-3 user-card-left"},o.default.createElement("div",{className:"user-card-small-avatar"},o.default.createElement("a",{href:r.url},o.default.createElement(l.default,{size:"50",size2x:"80",user:r})))),o.default.createElement("div",{className:"col-xs-9 col-sm-12 user-card-body"},o.default.createElement("div",{className:"user-card-avatar"},o.default.createElement("a",{href:r.url},o.default.createElement(l.default,{size:"150",size2x:"200",user:r}))),o.default.createElement("div",{className:"user-card-username"},o.default.createElement("a",{href:r.url},r.username)),o.default.createElement("div",{className:"user-card-title"},o.default.createElement(u.default,{rank:n,title:r.title})),o.default.createElement("div",{className:"user-card-stats"},o.default.createElement(i.default,{showStatus:t,user:r}))))))};var o=n(e("react")),l=n(e("../../avatar")),i=n(e("./stats")),u=n(e("./user-title"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../../avatar":6,"./stats":282,"./user-title":283,react:"react"}],282:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Followers=d,r.JoinDate=s,r.Posts=c,r.Status=l,r.Threads=f,r.default=function(e){var t=e.showStatus,r=e.user;return a.default.createElement("ul",{className:"list-unstyled"},a.default.createElement(l,{showStatus:t,user:r}),a.default.createElement(s,{user:r}),a.default.createElement("li",{className:"user-stat-divider"}),a.default.createElement(c,{user:r}),a.default.createElement(f,{user:r}),a.default.createElement(d,{user:r}))},r.getStatClassName=p;var n,a=(n=e("react"))&&n.__esModule?n:{default:n},o=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../user-status"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){var t=e.showStatus,r=e.user;return t?a.default.createElement("li",{className:"user-stat-status"},a.default.createElement(o.default,{status:r.status},a.default.createElement(o.StatusLabel,{status:r.status,user:r}))):null}function s(e){var t=e.user.joined_on,r=interpolate(gettext("Joined on %(joined_on)s"),{joined_on:t.format("LL, LT")},!0),n=interpolate(gettext("Joined %(joined_on)s"),{joined_on:t.fromNow()},!0);return a.default.createElement("li",{className:"user-stat-join-date"},a.default.createElement("abbr",{title:r},n))}function c(e){var t=e.user,r=p("user-stat-posts",t.posts),n=ngettext("%(posts)s post","%(posts)s posts",t.posts);return a.default.createElement("li",{className:r},interpolate(n,{posts:t.posts},!0))}function f(e){var t=e.user,r=p("user-stat-threads",t.threads),n=ngettext("%(threads)s thread","%(threads)s threads",t.threads);return a.default.createElement("li",{className:r},interpolate(n,{threads:t.threads},!0))}function d(e){var t=e.user,r=p("user-stat-followers",t.followers),n=ngettext("%(followers)s follower","%(followers)s followers",t.followers);return a.default.createElement("li",{className:r},interpolate(n,{followers:t.followers},!0))}function p(e,t){return 0===t?e+" user-stat-empty":e}},{"../../user-status":274,react:"react"}],283:[function(e,t,r){arguments[4][130][0].apply(r,arguments)},{dup:130,react:"react"}],284:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.cols,r=e.isReady,n=e.showStatus,a=e.users,o="col-xs-12 col-sm-4";4===t&&(o+=" col-md-3");return r?l.default.createElement("div",{className:"users-cards-list ui-ready"},l.default.createElement("div",{className:"row"},a.map(function(e){return l.default.createElement("div",{className:o,key:e.id},l.default.createElement(i.default,{showStatus:n,user:e}))}))):l.default.createElement(u.default,{colClassName:o,cols:t})};var l=n(e("react")),i=n(e("./card")),u=n(e("./preview"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./card":281,"./preview":286,react:"react"}],285:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../avatar")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/random"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(a,o.default.Component);var e,t,r,n=d(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return o.default.createElement("div",{className:"panel user-card user-card-preview"},o.default.createElement("div",{className:"panel-body"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-xs-3 user-card-left"},o.default.createElement("div",{className:"user-card-small-avatar"},o.default.createElement("span",null,o.default.createElement(l.default,{size:"50",size2x:"80"})))),o.default.createElement("div",{className:"col-xs-9 col-sm-12 user-card-body"},o.default.createElement("div",{className:"user-card-avatar"},o.default.createElement("span",null,o.default.createElement(l.default,{size:"150",size2x:"200"}))),o.default.createElement("div",{className:"user-card-username"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(60,150)+"px"}}," ")),o.default.createElement("div",{className:"user-card-title"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(60,150)+"px"}}," ")),o.default.createElement("div",{className:"user-card-stats"},o.default.createElement("ul",{className:"list-unstyled"},o.default.createElement("li",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,70)+"px"}}," ")),o.default.createElement("li",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,70)+"px"}}," ")),o.default.createElement("li",{className:"user-stat-divider"}),o.default.createElement("li",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,70)+"px"}}," ")),o.default.createElement("li",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,70)+"px"}}," "))))))))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../../../utils/random":388,"../../avatar":6,react:"react"}],286:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var r=e.colClassName,t=e.cols,n=Array.apply(null,{length:t}).map(Number.call,Number);return a.default.createElement("div",{className:"users-cards-list ui-preview"},a.default.createElement("div",{className:"row"},n.map(function(e){var t=r;return 0!==e&&(t+=" hidden-xs"),3===e&&(t+=" hidden-sm"),a.default.createElement("div",{className:t,key:e},a.default.createElement(o.default,null))})))};var a=n(e("react")),o=n(e("./card"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./card":285,react:"react"}],287:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getEmptyMessage",value:function(){return interpolate(gettext("No users have posted any new messages during last %(days)s days."),{days:this.props.trackedPeriod},!0)}},{key:"render",value:function(){return o.default.createElement("div",{className:"active-posters-list"},o.default.createElement("div",{className:"container"},o.default.createElement("p",{className:"lead"},this.getEmptyMessage())))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],288:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../avatar")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/random"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(a,o.default.Component);var e,t,r,n=d(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{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 o.default.createElement("li",{className:this.getClassName()},o.default.createElement("div",{className:"rank-user-avatar"},o.default.createElement("span",null,o.default.createElement(l.default,{size:"50"}))),o.default.createElement("div",{className:"rank-user"},o.default.createElement("div",{className:"user-name"},o.default.createElement("span",{className:"item-title"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,80)+"px"}}," "))),o.default.createElement("div",{className:"user-details"},o.default.createElement("span",{className:"user-status"},o.default.createElement("span",{className:"status-icon ui-preview-text"}," "),o.default.createElement("span",{className:"status-label ui-preview-text hidden-xs hidden-sm",style:{width:u.int(30,50)+"px"}}," ")),o.default.createElement("span",{className:"rank-name"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,50)+"px"}}," ")),o.default.createElement("span",{className:"user-title hidden-xs hidden-sm"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,50)+"px"}}," "))),o.default.createElement("div",{className:"user-compact-stats visible-xs-block"},o.default.createElement("span",{className:"rank-position"},o.default.createElement("strong",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(20,30)+"px"}}," ")),o.default.createElement("small",null,gettext("Rank"))),o.default.createElement("span",{className:"rank-posts-counted"},o.default.createElement("strong",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(20,30)+"px"}}," ")),o.default.createElement("small",null,gettext("Ranked posts"))))),o.default.createElement("div",{className:"rank-position hidden-xs"},o.default.createElement("strong",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(20,30)+"px"}}," ")),o.default.createElement("small",null,gettext("Rank"))),o.default.createElement("div",{className:"rank-posts-counted hidden-xs"},o.default.createElement("strong",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(20,30)+"px"}}," ")),o.default.createElement("small",null,gettext("Ranked posts"))),o.default.createElement("div",{className:"rank-posts-total hidden-xs"},o.default.createElement("strong",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(20,30)+"px"}}," ")),o.default.createElement("small",null,gettext("Total posts"))))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../../../utils/random":388,"../../avatar":6,react:"react"}],289:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=a(e("react")),l=e("react-router"),u=a(e("../../avatar")),s=n(e("../../user-status")),c=a(e("../../..")),f=n(e("../../../utils/random"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function n(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function a(e){return e&&e.__esModule?e:{default:e}}function p(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t){return(m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function y(r){var 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}}();return function(){var e,t=b(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=b(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function b(e){return(b=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&m(e,t)}(a,o.default.Component);var e,t,r,n=y(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getClassName",value:function(){return this.props.rank.css_class?"list-group-item list-group-rank-"+this.props.rank.css_class:"list-group-item"}},{key:"getUserStatus",value:function(){return this.props.user.status?o.default.createElement(s.default,{user:this.props.user,status:this.props.user.status},o.default.createElement(s.StatusIcon,{user:this.props.user,status:this.props.user.status}),o.default.createElement(s.StatusLabel,{user:this.props.user,status:this.props.user.status,className:"status-label hidden-xs hidden-sm"})):o.default.createElement("span",{className:"user-status"},o.default.createElement("span",{className:"status-icon ui-preview-text"}," "),o.default.createElement("span",{className:"status-label ui-preview-text hidden-xs hidden-sm",style:{width:f.int(30,50)+"px"}}," "))}},{key:"getRankName",value:function(){if(!this.props.rank.is_tab)return o.default.createElement("span",{className:"rank-name item-title"},this.props.rank.name);var e=c.default.get("USERS_LIST_URL")+this.props.rank.slug+"/";return o.default.createElement(l.Link,{to:e,className:"rank-name item-title"},this.props.rank.name)}},{key:"getUserTitle",value:function(){return this.props.user.title?o.default.createElement("span",{className:"user-title hidden-xs hidden-sm"},this.props.user.title):null}},{key:"render",value:function(){return o.default.createElement("li",{className:this.getClassName()},o.default.createElement("div",{className:"rank-user-avatar"},o.default.createElement("a",{href:this.props.user.url},o.default.createElement(u.default,{user:this.props.user,size:50,size2x:64}))),o.default.createElement("div",{className:"rank-user"},o.default.createElement("div",{className:"user-name"},o.default.createElement("a",{href:this.props.user.url,className:"item-title"},this.props.user.username)),o.default.createElement("div",{className:"user-details"},this.getUserStatus(),this.getRankName(),this.getUserTitle()),o.default.createElement("div",{className:"user-compact-stats visible-xs-block"},o.default.createElement("span",{className:"rank-position"},o.default.createElement("strong",null,"#",this.props.counter),o.default.createElement("small",null,gettext("Rank"))),o.default.createElement("span",{className:"rank-posts-counted"},o.default.createElement("strong",null,this.props.user.meta.score),o.default.createElement("small",null,gettext("Ranked posts"))))),o.default.createElement("div",{className:"rank-position hidden-xs"},o.default.createElement("strong",null,"#",this.props.counter),o.default.createElement("small",null,gettext("Rank"))),o.default.createElement("div",{className:"rank-posts-counted hidden-xs"},o.default.createElement("strong",null,this.props.user.meta.score),o.default.createElement("small",null,gettext("Ranked posts"))),o.default.createElement("div",{className:"rank-posts-total hidden-xs"},o.default.createElement("strong",null,this.props.user.posts),o.default.createElement("small",null,gettext("Total posts"))))}}])&&p(e.prototype,t),r&&p(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h},{"../../..":302,"../../../utils/random":388,"../../avatar":6,"../../user-status":274,react:"react","react-router":"react-router"}],290:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./list-item-preview")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/random"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(a,o.default.Component);var e,t,r,n=d(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return o.default.createElement("div",{className:"active-posters-list"},o.default.createElement("div",{className:"container"},o.default.createElement("p",{className:"lead ui-preview"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(50,220)+"px"}}," ")),o.default.createElement("div",{className:"active-posters ui-preview"},o.default.createElement("ul",{className:"list-group"},[0,1,2].map(function(e){return o.default.createElement(l.default,{hiddenOnMobile:0<e,key:e})})))))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../../../utils/random":388,"./list-item-preview":288,react:"react"}],291:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./list-item"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getLeadMessage",value:function(){var e=ngettext("%(posters)s top poster from last %(days)s days.","%(posters)s top posters from last %(days)s days.",this.props.count);return interpolate(e,{posters:this.props.count,days:this.props.trackedPeriod},!0)}},{key:"render",value:function(){return o.default.createElement("div",{className:"active-posters-list"},o.default.createElement("div",{className:"container"},o.default.createElement("p",{className:"lead"},this.getLeadMessage()),o.default.createElement("div",{className:"active-posters ui-ready"},o.default.createElement("ul",{className:"list-group"},this.props.users.map(function(e,t){return o.default.createElement(l.default,{user:e,rank:e.rank,counter:t+1,key:e.id})})))))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./list-item":289,react:"react"}],292:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),i=o(e("./list-empty")),u=o(e("./list-preview")),s=o(e("./list-ready")),c=o(e("../../..")),f=e("../../../reducers/users"),d=o(e("../../../services/polls")),p=o(e("../../../services/store")),m=o(e("../../../services/page-title"));function o(e){return e&&e.__esModule?e:{default:e}}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(l,n.default.Component);var e,t,r,o=h(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=v(t),a=function(e){p.default.dispatch((0,f.hydrate)(e.results)),t.setState({isLoaded:!0,trackedPeriod:e.tracked_period,count:e.count})},(n="update")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,c.default.has("USERS")?t.initWithPreloadedData(c.default.pop("USERS")):t.initWithoutPreloadedData(),t.startPolling(),t}return e=l,(t=[{key:"initWithPreloadedData",value:function(e){this.state={isLoaded:!0,trackedPeriod:e.tracked_period,count:e.count},p.default.dispatch((0,f.hydrate)(e.results))}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1}}},{key:"startPolling",value:function(){d.default.start({poll:"active-posters",url:c.default.get("USERS_API"),data:{list:"active"},frequency:9e4,update:this.update})}},{key:"componentDidMount",value:function(){m.default.set({title:this.props.route.extra.name,parent:gettext("Users")})}},{key:"componentWillUnmount",value:function(){d.default.stop("active-posters")}},{key:"render",value:function(){return this.state.isLoaded?0<this.state.count?n.default.createElement(s.default,{users:this.props.users,trackedPeriod:this.state.trackedPeriod,count:this.state.count}):n.default.createElement(i.default,{trackedPeriod:this.state.trackedPeriod}):n.default.createElement(u.default,null)}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=g},{"../../..":302,"../../../reducers/users":364,"../../../services/page-title":373,"../../../services/polls":374,"../../../services/store":377,"./list-empty":287,"./list-preview":290,"./list-ready":291,react:"react"}],293:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var r=e.baseUrl,t=e.lists;return n.default.createElement("ul",{className:"nav nav-pills"},t.map(function(e){var t=i(r,e);return n.default.createElement(o.default,{path:t,key:t},n.default.createElement(a.Link,{to:t},e.name))}))};var n=l(e("react")),a=e("react-router"),o=l(e("../li"));l(e("../.."));function l(e){return e&&e.__esModule?e:{default:e}}var i=function(e,t){var r=e;return"rank"===t.component?r+=t.slug:r+=t.component,r+"/"}},{"../..":302,"../li":57,react:"react","react-router":"react-router"}],294:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../users-list"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return o.default.createElement("div",null,o.default.createElement(l.default,{cols:4,isReady:!1}))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"../../users-list":284,react:"react"}],295:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement("div",null,n.default.createElement(o.default,{cols:4,isReady:!0,showStatus:!0,users:e.users}),n.default.createElement(a.default,e))};var n=l(e("react")),a=l(e("./pager")),o=l(e("../../users-list"));function l(e){return e&&e.__esModule?e:{default:e}}},{"../../users-list":284,"./pager":296,react:"react"}],296:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.FirstPage=u,r.LastPage=f,r.More=d,r.NextPage=c,r.Pager=i,r.PreviousPage=s,r.default=function(e){return 1===e.pages?null:n.default.createElement("div",{className:"row row-toolbar"},n.default.createElement("div",{className:"col-xs-12 text-center visible-xs-block"},n.default.createElement(d,{more:e.more}),n.default.createElement("div",{className:"toolbar-vertical-spacer"})),n.default.createElement("div",{className:"col-md-7"},n.default.createElement("div",{className:"row"},n.default.createElement("div",{className:"col-sm-4 col-md-5"},n.default.createElement(i,e)),n.default.createElement("div",{className:"col-sm-8 col-md-7 hidden-xs"},n.default.createElement(d,{more:e.more})))))};var n=l(e("react")),a=e("react-router"),o=l(e("../../../utils/reset-scroll"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){return n.default.createElement("div",{className:"row row-paginator"},n.default.createElement("div",{className:"col-xs-3"},n.default.createElement(u,e)),n.default.createElement("div",{className:"col-xs-3"},n.default.createElement(s,e)),n.default.createElement("div",{className:"col-xs-3"},n.default.createElement(c,e)),n.default.createElement("div",{className:"col-xs-3"},n.default.createElement(f,e)))}function u(e){return e.isLoaded&&e.first?n.default.createElement(a.Link,{className:"btn btn-default btn-block btn-icon btn-outline",onClick:o.default,to:e.baseUrl,title:gettext("Go to first page")},n.default.createElement("span",{className:"material-icon"},"first_page")):n.default.createElement("span",{className:"btn btn-default btn-block btn-icon btn-outline disabled",title:gettext("Go to first page")},n.default.createElement("span",{className:"material-icon"},"first_page"))}function s(e){if(e.isLoaded&&1<e.page){var t="";return e.previous&&(t=e.previous+"/"),n.default.createElement(a.Link,{className:"btn btn-default btn-block btn-icon btn-outline",onClick:o.default,to:e.baseUrl+t,title:gettext("Go to previous page")},n.default.createElement("span",{className:"material-icon"},"chevron_left"))}return n.default.createElement("span",{className:"btn btn-default btn-block btn-icon btn-outline disabled",title:gettext("Go to previous page")},n.default.createElement("span",{className:"material-icon"},"chevron_left"))}function c(e){if(e.isLoaded&&e.more){var t="";return e.next&&(t=e.next+"/"),n.default.createElement(a.Link,{className:"btn btn-default btn-block btn-icon btn-outline",onClick:o.default,to:e.baseUrl+t,title:gettext("Go to next page")},n.default.createElement("span",{className:"material-icon"},"chevron_right"))}return n.default.createElement("span",{className:"btn btn-default btn-block btn-icon btn-outline disabled",title:gettext("Go to next page")},n.default.createElement("span",{className:"material-icon"},"chevron_right"))}function f(e){return e.isLoaded&&e.last?n.default.createElement(a.Link,{className:"btn btn-default btn-block btn-icon btn-outline",onClick:o.default,to:e.baseUrl+e.last+"/",title:gettext("Go to last page")},n.default.createElement("span",{className:"material-icon"},"last_page")):n.default.createElement("span",{className:"btn btn-default btn-block btn-icon btn-outline disabled",title:gettext("Go to last page")},n.default.createElement("span",{className:"material-icon"},"last_page"))}function d(e){var t=null,t=e.more?(t=ngettext("There is %(more)s more member with this role.","There are %(more)s more members with this role.",e.more),interpolate(t,{more:e.more},!0)):gettext("There are no more members with this role.");return n.default.createElement("p",null,t)}},{"../../../utils/reset-scroll":389,react:"react","react-router":"react-router"}],297:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),i=o(e("../../page-lead")),u=o(e("./list")),s=o(e("./list-loading")),c=o(e("../../..")),f=e("../../../reducers/users"),d=o(e("../../../services/polls")),p=o(e("../../../services/store")),m=o(e("../../../services/page-title"));function o(e){return e&&e.__esModule?e:{default:e}}function y(){return(y=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return g(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(l,n.default.Component);var e,t,r,o=v(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=g(t),a=function(e){p.default.dispatch((0,f.hydrate)(e.results)),e.isLoaded=!0,t.setState(e)},(n="update")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,c.default.has("USERS")?t.initWithPreloadedData(c.default.pop("USERS")):t.initWithoutPreloadedData(),t.startPolling(e.params.page||1),t}return e=l,(t=[{key:"initWithPreloadedData",value:function(e){this.state=Object.assign(e,{isLoaded:!0}),p.default.dispatch((0,f.hydrate)(e.results))}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1}}},{key:"startPolling",value:function(e){d.default.start({poll:"rank-users",url:c.default.get("USERS_API"),data:{rank:this.props.route.rank.id,page:e},frequency:9e4,update:this.update})}},{key:"componentDidMount",value:function(){m.default.set({title:this.props.route.rank.name,page:this.props.params.page||null,parent:gettext("Users")})}},{key:"componentWillUnmount",value:function(){d.default.stop("rank-users")}},{key:"componentWillReceiveProps",value:function(e){this.props.params.page!==e.params.page&&(m.default.set({title:this.props.route.rank.name,page:e.params.page||null,parent:gettext("Users")}),this.setState({isLoaded:!1}),d.default.stop("rank-users"),this.startPolling(e.params.page))}},{key:"getClassName",value:function(){return this.props.route.rank.css_class?"rank-users-list rank-users-"+this.props.route.rank.css_class:"rank-users-list"}},{key:"getRankDescription",value:function(){return this.props.route.rank.description?n.default.createElement("div",{className:"rank-description"},n.default.createElement(i.default,{copy:this.props.route.rank.description.html})):null}},{key:"getComponent",value:function(){if(this.state.isLoaded){if(0<this.state.count){var e=c.default.get("USERS_LIST_URL")+this.props.route.rank.slug+"/";return n.default.createElement(u.default,y({baseUrl:e,users:this.props.users},this.state))}return n.default.createElement("p",{className:"lead"},gettext("There are no users with this rank at the moment."))}return n.default.createElement(s.default,null)}},{key:"render",value:function(){return n.default.createElement("div",{className:this.getClassName()},n.default.createElement("div",{className:"container"},this.getRankDescription(),this.getComponent()))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=_},{"../../..":302,"../../../reducers/users":364,"../../../services/page-title":373,"../../../services/polls":374,"../../../services/store":377,"../../page-lead":92,"./list":295,"./list-loading":294,react:"react"}],298:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.paths=function(){var t=[];return c.default.get("USERS_LISTS").forEach(function(e){"rank"===e.component?(t.push({path:c.default.get("USERS_LIST_URL")+e.slug+"/:page/",component:(0,n.connect)(h)(u.default),rank:e}),t.push({path:c.default.get("USERS_LIST_URL")+e.slug+"/",component:(0,n.connect)(h)(u.default),rank:e})):"active-posters"===e.component&&t.push({path:c.default.get("USERS_LIST_URL")+e.component+"/",component:(0,n.connect)(h)(i.default),extra:{name:e.name}})}),t},r.select=h;var o=f(e("react")),n=e("react-redux"),l=(f(e("../dropdown-toggle")),f(e("./nav"))),i=f(e("./active-posters/root")),u=f(e("./rank/root")),s=f(e("../with-dropdown")),c=f(e("../.."));function f(e){return e&&e.__esModule?e:{default:e}}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var b=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(a,s.default);var e,t,r,n=m(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"page page-users-lists"},o.default.createElement("div",{className:"page-header-bg"},o.default.createElement("div",{className:"page-header"},o.default.createElement("div",{className:"container"},o.default.createElement("h1",null,gettext("Users"))),o.default.createElement("div",{className:"page-tabs"},o.default.createElement("div",{className:"container"},o.default.createElement(l.default,{lists:c.default.get("USERS_LISTS"),baseUrl:c.default.get("USERS_LIST_URL")}))))),this.props.children)}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function h(e){return{tick:e.tick.tick,user:e.auth.user,users:e.users}}r.default=b},{"../..":302,"../dropdown-toggle":27,"../with-dropdown":299,"./active-posters/root":292,"./nav":293,"./rank/root":297,react:"react","react-redux":"react-redux"}],299:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return s(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function f(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var d=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),f(s(t=n.call(this,e)),"toggleNav",function(){t.setState({dropdown:!t.state.dropdown})}),f(s(t),"hideNav",function(){t.setState({dropdown:!1})}),t.state={dropdown:!1},t}return e=a,(t=[{key:"getCompactNavClassName",value:function(){return this.state.dropdown?"compact-nav open":"compact-nav"}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=d},{react:"react"}],300:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return f(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(u,o.default.Component);var e,t,r,i=c(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=f(e),n=function(){e.props.onChange({target:{value:!e.props.value}})},(r="toggle")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"getClassName",value:function(){return this.props.value?"btn btn-yes-no btn-yes-no-on":"btn btn-yes-no btn-yes-no-off"}},{key:"getIcon",value:function(){return this.props.value?this.props.iconOn||"check_box":this.props.iconOff||"check_box_outline_blank"}},{key:"getLabel",value:function(){return this.props.value?this.props.labelOn||gettext("yes"):this.props.labelOff||gettext("no")}},{key:"render",value:function(){return o.default.createElement("button",{type:"button",onClick:this.toggle,className:this.getClassName(),id:this.props.id||null,"aria-describedby":this.props["aria-describedby"]||null,disabled:this.props.disabled||!1},o.default.createElement("span",{className:"material-icon"},this.getIcon()),o.default.createElement("span",{className:"btn-text"},this.getLabel()))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{react:"react"}],301:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=e("../reducers/profile-details"),i=n(e("../services/ajax")),u=n(e("../services/snackbar"));function n(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=d(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=d(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){return(d=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(a,o.default.Component);var e,t,r,n=f(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"componentDidMount",value:function(){var e=this.props,t=e.data,r=e.dispatch,n=e.user;t&&t.id===n.id||i.default.get(this.props.user.api.details).then(function(e){r((0,l.load)(e))},function(e){u.default.apiError(e)})}},{key:"render",value:function(){return this.props.children}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../reducers/profile-details":355,"../services/ajax":365,"../services/snackbar":376,react:"react"}],302:[function(l,e,i){(function(e){"use strict";Object.defineProperty(i,"__esModule",{value:!0}),i.default=i.Misago=void 0;var t,a=(t=l("./utils/ordered-list"))&&t.__esModule?t:{default:t};function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var r=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._initializers=[],this._context={}}var t,r,n;return t=e,(r=[{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 a.default(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}}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),n=new(i.Misago=r);e.misago=n,i.default=n}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./utils/ordered-list":387}],303:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/ajax"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){a.default.init(n.default.get("CSRF_COOKIE_NAME"))}n.default.addInitializer({name:"ajax",initializer:l})},{"../services/ajax":365,"./..":302}],304:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=c;var n=u(e("./..")),a=e("../reducers/auth"),o=u(e("../services/ajax")),l=u(e("../services/snackbar")),i=u(e("../services/store"));function u(e){return e&&e.__esModule?e:{default:e}}var s=45;function c(e){e.get("isAuthenticated")&&window.setInterval(function(){o.default.get(e.get("AUTH_API")).then(function(e){i.default.dispatch((0,a.patch)(e))},function(e){l.default.apiError(e)})},1e3*s)}n.default.addInitializer({name:"auth-sync",initializer:c,after:"auth"})},{"../reducers/auth":350,"../services/ajax":365,"../services/snackbar":376,"../services/store":377,"./..":302}],305:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=u(e("./..")),a=u(e("../services/auth")),o=u(e("../services/modal")),l=u(e("../services/store")),i=u(e("../services/local-storage"));function u(e){return e&&e.__esModule?e:{default:e}}function s(){a.default.init(l.default,i.default,o.default)}n.default.addInitializer({name:"auth",initializer:s,after:"store"})},{"../services/auth":366,"../services/local-storage":369,"../services/modal":371,"../services/store":377,"./..":302}],306:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=u(e("./..")),a=u(e("../services/ajax")),o=u(e("../services/captcha")),l=u(e("../services/include")),i=u(e("../services/snackbar"));function u(e){return e&&e.__esModule?e:{default:e}}function s(e){o.default.init(e,a.default,l.default,i.default)}n.default.addInitializer({name:"captcha",initializer:s})},{"../services/ajax":365,"../services/captcha":367,"../services/include":368,"../services/snackbar":376,"./..":302}],307:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=i(e("react")),a=i(e("../..")),o=i(e("../../components/accept-agreement")),l=i(e("../../utils/mount-component"));function i(e){return e&&e.__esModule?e:{default:e}}function u(e){document.getElementById("required-agreement-mount")&&(0,l.default)(n.default.createElement(o.default,{api:e.get("REQUIRED_AGREEMENT_API")}),"required-agreement-mount",!1)}a.default.addInitializer({name:"component:accept-agreement",initializer:u,after:"store"})},{"../..":302,"../../components/accept-agreement":3,"../../utils/mount-component":386,react:"react"}],308:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=c;var n=e("react-redux"),a=s(e("../..")),o=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../components/auth-message")),l=s(e("../../utils/mount-component"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e){return e&&e.__esModule?e:{default:e}}function c(){(0,l.default)((0,n.connect)(o.select)(o.default),"auth-message-mount")}a.default.addInitializer({name:"component:auth-message",initializer:c,after:"store"})},{"../..":302,"../../components/auth-message":5,"../../utils/mount-component":386,"react-redux":"react-redux"}],309:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("../..")),a=o(e("../../utils/banned-page"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e){e.has("BAN_MESSAGE")&&(0,a.default)(e.get("BAN_MESSAGE"),!1)}n.default.addInitializer({name:"component:banmed-page",initializer:l,after:"store"})},{"../..":302,"../../utils/banned-page":379}],310:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=c;var n=e("react-redux"),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../components/categories")),o=u(e("../..")),l=u(e("../../utils/mount-component"));function u(e){return e&&e.__esModule?e:{default:e}}function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function c(){document.getElementById("categories-mount")&&(0,l.default)((0,n.connect)(a.select)(a.default),"categories-mount")}o.default.addInitializer({name:"component:categories",initializer:c,after:"store"})},{"../..":302,"../../components/categories":20,"../../utils/mount-component":386,"react-redux":"react-redux"}],311:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../components/options/root")),a=l(e("../..")),o=l(e("../../utils/routed-component"));function l(e){return e&&e.__esModule?e:{default:e}}function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e){e.has("USER_OPTIONS")&&(0,o.default)({root:a.default.get("USERCP_URL"),component:n.default,paths:(0,n.paths)()})}a.default.addInitializer({name:"component:options",initializer:s,after:"store"})},{"../..":302,"../../components/options/root":87,"../../utils/routed-component":390}],312:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=c;var n=e("react-redux"),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../components/profile/root")),o=u(e("../..")),l=u(e("../../utils/routed-component"));function u(e){return e&&e.__esModule?e:{default:e}}function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function c(e){e.has("PROFILE")&&e.has("PROFILE_PAGES")&&(0,l.default)({root:o.default.get("PROFILE").url,component:(0,n.connect)(a.select)(a.default),paths:(0,a.paths)()})}o.default.addInitializer({name:"component:profile",initializer:c,after:"reducer:profile-hydrate"})},{"../..":302,"../../components/profile/root":195,"../../utils/routed-component":390,"react-redux":"react-redux"}],313:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../components/request-activation-link")),o=l(e("../../utils/mount-component"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){document.getElementById("request-activation-link-mount")&&(0,o.default)(a.default,"request-activation-link-mount",!1)}n.default.addInitializer({name:"component:request-activation-link",initializer:i,after:"store"})},{"../..":302,"../../components/request-activation-link":200,"../../utils/mount-component":386}],314:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../components/request-password-reset")),o=l(e("../../utils/mount-component"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){document.getElementById("request-password-reset-mount")&&(0,o.default)(a.default,"request-password-reset-mount",!1)}n.default.addInitializer({name:"component:request-password-reset",initializer:i,after:"store"})},{"../..":302,"../../components/request-password-reset":201,"../../utils/mount-component":386}],315:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../components/reset-password-form")),o=l(e("../../utils/mount-component"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){document.getElementById("reset-password-form-mount")&&(0,o.default)(a.default,"reset-password-form-mount",!1)}n.default.addInitializer({name:"component:reset-password-form",initializer:i,after:"store"})},{"../..":302,"../../components/reset-password-form":202,"../../utils/mount-component":386}],316:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../../components/search")),a=l(e("../..")),o=l(e("../../utils/routed-component"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){"misago:search"===e.get("CURRENT_LINK")&&(0,o.default)({paths:(0,n.default)(a.default.get("SEARCH_PROVIDERS"))})}a.default.addInitializer({name:"component:search",initializer:i,after:"store"})},{"../..":302,"../../components/search":204,"../../utils/routed-component":390}],317:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=e("react-redux"),a=i(e("../..")),o=e("../../components/snackbar"),l=i(e("../../utils/mount-component"));function i(e){return e&&e.__esModule?e:{default:e}}function u(){(0,l.default)((0,n.connect)(o.select)(o.Snackbar),"snackbar-mount")}a.default.addInitializer({name:"component:snackbar",initializer:u,after:"snackbar"})},{"../..":302,"../../components/snackbar":212,"../../utils/mount-component":386,"react-redux":"react-redux"}],318:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=i(e("react")),a=i(e("../../components/social-auth")),o=i(e("../..")),l=i(e("../../utils/mount-component"));function i(e){return e&&e.__esModule?e:{default:e}}function u(e){var t;"misago:social-complete"===e.get("CURRENT_LINK")&&(t=e.get("SOCIAL_AUTH_FORM"),(0,l.default)(n.default.createElement(a.default,t),"page-mount"))}o.default.addInitializer({name:"component:social-auth",initializer:u,after:"store"})},{"../..":302,"../../components/social-auth":215,"../../utils/mount-component":386,react:"react"}],319:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=e("../../components/thread/root"),a=l(e("../..")),o=l(e("../../utils/routed-component"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){e.has("THREAD")&&e.has("POSTS")&&(0,o.default)({paths:(0,n.paths)()})}a.default.addInitializer({name:"component:thread",initializer:i,after:"store"})},{"../..":302,"../../components/thread/root":233,"../../utils/routed-component":390}],320:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u,r.getListOptions=s;var n=e("../../components/threads/root"),a=l(e("../..")),o=l(e("../../utils/routed-component"));function l(e){return e&&e.__esModule?e:{default:e}}var i="misago:private-threads";function u(e){e.has("THREADS")&&e.has("CATEGORIES")&&(0,o.default)({paths:(0,n.paths)(e.get("user"),s(e))})}function s(e){return e.get("CURRENT_LINK").substr(0,i.length)===i?{api:e.get("PRIVATE_THREADS_API"),startThread:{mode:"START_PRIVATE",submit:a.default.get("PRIVATE_THREADS_API")},title:gettext("Private threads"),pageLead:gettext("Private threads are threads which only those that started them and those they have invited may see and participate in."),emptyMessage:gettext("You aren't participating in any private threads.")}:{api:e.get("THREADS_API")}}a.default.addInitializer({name:"component:threads",initializer:u,after:"store"})},{"../..":302,"../../components/threads/root":267,"../../utils/routed-component":390}],321:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=e("react-redux"),a=i(e("../..")),o=e("../../components/user-menu/root"),l=i(e("../../utils/mount-component"));function i(e){return e&&e.__esModule?e:{default:e}}function u(){(0,l.default)((0,n.connect)(o.select)(o.UserMenu),"user-menu-mount"),(0,l.default)((0,n.connect)(o.select)(o.CompactUserMenu),"user-menu-compact-mount")}a.default.addInitializer({name:"component:user-menu",initializer:u,after:"store"})},{"../..":302,"../../components/user-menu/root":272,"../../utils/mount-component":386,"react-redux":"react-redux"}],322:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../components/users/root")),a=l(e("../..")),o=l(e("../../utils/routed-component"));function l(e){return e&&e.__esModule?e:{default:e}}function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e){e.has("USERS_LISTS")&&(0,o.default)({root:a.default.get("USERS_LIST_URL"),component:n.default,paths:(0,n.paths)()})}a.default.addInitializer({name:"component:users",initializer:s,after:"store"})},{"../..":302,"../../components/users/root":298,"../../utils/routed-component":390}],323:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/include"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e){a.default.init(e.get("STATIC_URL"))}n.default.addInitializer({name:"include",initializer:l})},{"../services/include":368,"./..":302}],324:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/local-storage"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){a.default.init("misago_")}n.default.addInitializer({name:"local-storage",initializer:l})},{"../services/local-storage":369,"./..":302}],325:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/mobile-navbar-dropdown"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){var e=document.getElementById("mobile-navbar-dropdown-mount");e&&a.default.init(e)}n.default.addInitializer({name:"dropdown",initializer:l,before:"store"})},{"../services/mobile-navbar-dropdown":370,"./..":302}],326:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/modal"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){var e=document.getElementById("modal-mount");e&&a.default.init(e)}n.default.addInitializer({name:"modal",initializer:l,before:"store"})},{"../services/modal":371,"./..":302}],327:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=o;var n=a(e("moment"));function a(e){return e&&e.__esModule?e:{default:e}}function o(){n.default.locale($("html").attr("lang"))}a(e("./..")).default.addInitializer({name:"moment",initializer:o})},{"./..":302,moment:"moment"}],328:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/page-title"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e){a.default.init(e.get("SETTINGS").forum_index_title,e.get("SETTINGS").forum_name)}n.default.addInitializer({name:"page-title",initializer:l})},{"../services/page-title":373,"./..":302}],329:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=i(e("./..")),a=i(e("../services/ajax")),o=i(e("../services/snackbar")),l=i(e("../services/polls"));function i(e){return e&&e.__esModule?e:{default:e}}function u(){l.default.init(a.default,o.default)}n.default.addInitializer({name:"polls",initializer:u})},{"../services/ajax":365,"../services/polls":374,"../services/snackbar":376,"./..":302}],330:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=i(e("./..")),a=i(e("../services/ajax")),o=i(e("../services/posting")),l=i(e("../services/snackbar"));function i(e){return e&&e.__esModule?e:{default:e}}function u(){o.default.init(a.default,l.default,document.getElementById("posting-placeholder"))}n.default.addInitializer({name:"posting",initializer:u})},{"../services/ajax":365,"../services/posting":375,"../services/snackbar":376,"./..":302}],331:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/auth")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(e){o.default.addReducer("auth",a.default,Object.assign({isAuthenticated:e.get("isAuthenticated"),isAnonymous:!e.get("isAuthenticated"),user:e.get("user")},a.initialState))}n.default.addInitializer({name:"reducer:auth",initializer:s,before:"store"})},{"../..":302,"../../reducers/auth":350,"../../services/store":377}],332:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/participants")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){var e=null;n.default.has("THREAD")&&(e=n.default.get("THREAD").participants),o.default.addReducer("participants",a.default,e||[])}n.default.addInitializer({name:"reducer:participants",initializer:i,before:"store"})},{"../..":302,"../../reducers/participants":351,"../../services/store":377}],333:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/poll")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(){var e=null,e=n.default.has("THREAD")&&n.default.get("THREAD").poll?(0,a.hydrate)(n.default.get("THREAD").poll):{isBusy:!1};o.default.addReducer("poll",a.default,e)}n.default.addInitializer({name:"reducer:poll",initializer:s,before:"store"})},{"../..":302,"../../reducers/poll":352,"../../services/store":377}],334:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/posts")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(){var e=null,e=n.default.has("POSTS")?(0,a.hydrate)(n.default.get("POSTS")):{isLoaded:!1,isBusy:!1};o.default.addReducer("posts",a.default,e)}n.default.addInitializer({name:"reducer:posts",initializer:s,before:"store"})},{"../..":302,"../../reducers/posts":354,"../../services/store":377}],335:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/profile-details")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){var e=null;n.default.has("PROFILE_DETAILS")&&(e=n.default.get("PROFILE_DETAILS")),o.default.addReducer("profile-details",a.default,e||{})}n.default.addInitializer({name:"reducer:profile-details",initializer:i,before:"store"})},{"../..":302,"../../reducers/profile-details":355,"../../services/store":377}],336:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=e("../../reducers/profile"),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){n.default.has("PROFILE")&&o.default.dispatch((0,a.hydrate)(n.default.get("PROFILE")))}n.default.addInitializer({name:"reducer:profile-hydrate",initializer:i,after:"store"})},{"../..":302,"../../reducers/profile":356,"../../services/store":377}],337:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/profile")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){o.default.addReducer("profile",a.default,{})}n.default.addInitializer({name:"reducer:profile",initializer:i,before:"store"})},{"../..":302,"../../reducers/profile":356,"../../services/store":377}],338:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/search")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(){o.default.addReducer("search",a.default,Object.assign({},a.initialState,{providers:n.default.get("SEARCH_PROVIDERS")||[],query:n.default.get("SEARCH_QUERY")||""}))}n.default.addInitializer({name:"reducer:search",initializer:s,before:"store"})},{"../..":302,"../../reducers/search":357,"../../services/store":377}],339:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/selection")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){o.default.addReducer("selection",a.default,[])}n.default.addInitializer({name:"reducer:selection",initializer:i,before:"store"})},{"../..":302,"../../reducers/selection":358,"../../services/store":377}],340:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/snackbar")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(){o.default.addReducer("snackbar",a.default,a.initialState)}n.default.addInitializer({name:"reducer:snackbar",initializer:s,before:"store"})},{"../..":302,"../../reducers/snackbar":359,"../../services/store":377}],341:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/thread")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(){var e=null,e=n.default.has("THREAD")?(0,a.hydrate)(n.default.get("THREAD")):{isBusy:!1};o.default.addReducer("thread",a.default,e)}n.default.addInitializer({name:"reducer:thread",initializer:s,before:"store"})},{"../..":302,"../../reducers/thread":360,"../../services/store":377}],342:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/threads")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){o.default.addReducer("threads",a.default,[])}n.default.addInitializer({name:"reducer:threads",initializer:i,before:"store"})},{"../..":302,"../../reducers/threads":361,"../../services/store":377}],343:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/tick")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(){o.default.addReducer("tick",a.default,a.initialState)}n.default.addInitializer({name:"reducer:tick",initializer:s,before:"store"})},{"../..":302,"../../reducers/tick":362,"../../services/store":377}],344:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/username-history")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){o.default.addReducer("username-history",a.default,[])}n.default.addInitializer({name:"reducer:username-history",initializer:i,before:"store"})},{"../..":302,"../../reducers/username-history":363,"../../services/store":377}],345:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/users")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){o.default.addReducer("users",a.default,[])}n.default.addInitializer({name:"reducer:users",initializer:i,before:"store"})},{"../..":302,"../../reducers/users":364,"../../services/store":377}],346:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("./..")),a=l(e("../services/snackbar")),o=l(e("../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){a.default.init(o.default)}n.default.addInitializer({name:"snackbar",initializer:i,after:"store"})},{"../services/snackbar":376,"../services/store":377,"./..":302}],347:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/store"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){a.default.init()}n.default.addInitializer({name:"store",initializer:l,before:"_end"})},{"../services/store":377,"./..":302}],348:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=l(e("./..")),a=e("../reducers/tick"),o=l(e("../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}var i=5e4;function u(){window.setInterval(function(){o.default.dispatch((0,a.doTick)())},i)}n.default.addInitializer({name:"tick-start",initializer:u,after:"store"})},{"../reducers/tick":362,"../services/store":377,"./..":302}],349:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("./..")),a=l(e("../services/include")),o=l(e("../services/zxcvbn"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){o.default.init(a.default)}n.default.addInitializer({name:"zxcvbn",initializer:i})},{"../services/include":368,"../services/zxcvbn":378,"./..":302}],350:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SIGN_OUT=r.SIGN_IN=r.PATCH_USER=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:l,t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case i:var r=Object.assign({},e);return r.user=Object.assign({},e.user,t.patch),r;case u:return Object.assign({},e,{signedIn:t.user});case s:return Object.assign({},e,{isAuthenticated:!1,isAnonymous:!0,signedOut:!t.soft});case o.UPDATE_AVATAR:if(e.isAuthenticated&&e.user.id===t.userId){var n=Object.assign({},e);return n.user=Object.assign({},e.user,{avatars:t.avatars}),n}return e;case o.UPDATE_USERNAME:if(e.isAuthenticated&&e.user.id===t.userId){var a=Object.assign({},e);return a.user=Object.assign({},e.user,{username:t.username,slug:t.slug}),a}return e;default:return e}},r.initialState=void 0,r.patch=function(e){return{type:i,patch:e}},r.signIn=function(e){return{type:u,user:e}},r.signOut=function(){var e=0<arguments.length&&void 0!==arguments[0]&&arguments[0];return{type:s,soft:e}};var o=e("./users"),l={signedIn:!1,signedOut:!1};r.initialState=l;var i="PATCH_USER";r.PATCH_USER=i;var u="SIGN_IN";r.SIGN_IN=u;var s="SIGN_OUT";r.SIGN_OUT=s},{"./users":364}],351:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.REPLACE_PARTICIPANTS=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[],t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return t.state;default:return e}},r.replace=function(e){return{type:n,state:e}};var n="REPLACE_PARTICIPANTS";r.REPLACE_PARTICIPANTS=n},{}],352:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.UPDATE_POLL=r.REPLACE_POLL=r.REMOVE_POLL=r.RELEASE_POLL=r.BUSY_POLL=void 0,r.busy=function(){return{type:o}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case o:return Object.assign({},e,{isBusy:!0});case l:return Object.assign({},e,{isBusy:!1});case i:return{isBusy:!1};case u:return t.state;case s:return Object.assign({},e,t.data);default:return e}},r.hydrate=c,r.release=function(){return{type:l}},r.remove=function(){return{type:i}},r.replace=function(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1];return{type:u,state:t?e:c(e)}},r.update=function(e){return{type:s,data:e}};var n,a=(n=e("moment"))&&n.__esModule?n:{default:n};var o="BUSY_POLL";r.BUSY_POLL=o;var l="RELEASE_POLL";r.RELEASE_POLL=l;var i="REMOVE_POLL";r.REMOVE_POLL=i;var u="REPLACE_POLL";r.REPLACE_POLL=u;var s="UPDATE_POLL";function c(e){var t=!1;for(var r in e.choices){if(e.choices[r].selected){t=!0;break}}return Object.assign({},e,{posted_on:(0,a.default)(e.posted_on),hasSelectedChoices:t,endsOn:e.length?(0,a.default)(e.posted_on).add(e.length,"days"):null,isBusy:!1})}r.UPDATE_POLL=s},{moment:"moment"}],353:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.PATCH_POST=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case l:return e.id==t.post.id?Object.assign({},e,t.patch):e;default:return e}},r.hydrate=function(e){return Object.assign({},e,{posted_on:(0,a.default)(e.posted_on),updated_on:(0,a.default)(e.updated_on),hidden_on:(0,a.default)(e.hidden_on),attachments:e.attachments?e.attachments.map(i):null,poster:e.poster?(0,o.hydrateUser)(e.poster):null,isSelected:!1,isBusy:!1,isDeleted:!1})},r.hydrateAttachment=i,r.patch=function(e,t){return{type:l,post:e,patch:t}};var n,a=(n=e("moment"))&&n.__esModule?n:{default:n},o=e("./users");var l="PATCH_POST";function i(e){return Object.assign({},e,{uploaded_on:(0,a.default)(e.uploaded_on)})}r.PATCH_POST=l},{"./users":364,moment:"moment"}],354:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.UPDATE_POSTS=r.UNLOAD_POSTS=r.SELECT_POST=r.LOAD_POSTS=r.DESELECT_POSTS=r.DESELECT_POST=r.APPEND_POSTS=void 0,r.append=function(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1];return{type:c,state:t?e:n(e)}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case f:var r=e.results.map(function(e){return e.id==t.post.id?Object.assign({},e,{isSelected:!0}):e});return Object.assign({},e,{results:r});case d:var n=e.results.map(function(e){return e.id==t.post.id?Object.assign({},e,{isSelected:!1}):e});return Object.assign({},e,{results:n});case p:var a=e.results.map(function(e){return Object.assign({},e,{isSelected:!1})});return Object.assign({},e,{results:a});case c:var o=e.results.slice(),l=e.results.map(function(e){return e.id});return t.state.results.map(function(e){-1===l.indexOf(e.id)&&o.push(e)}),Object.assign({},t.state,{results:o});case m:return t.state;case y:return Object.assign({},e,{isLoaded:!1});case b:return Object.assign({},e,t.update);case u.PATCH_POST:var i=e.results.map(function(e){return(0,u.default)(e,t)});return Object.assign({},e,{results:i});default:return e}},r.deselect=function(e){return{type:d,post:e}},r.deselectAll=function(){return{type:p}},r.hydrate=n,r.load=function(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1];return{type:m,state:t?e:n(e)}},r.select=function(e){return{type:f,post:e}},r.unload=function(){return{type:y}},r.update=function(e){return{type:b,update:e}};var u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./post"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}var c="APPEND_POSTS";r.APPEND_POSTS=c;var f="SELECT_POST";r.SELECT_POST=f;var d="DESELECT_POST";r.DESELECT_POST=d;var p="DESELECT_POSTS";r.DESELECT_POSTS=p;var m="LOAD_POSTS";r.LOAD_POSTS=m;var y="UNLOAD_POSTS";r.UNLOAD_POSTS=y;var b="UPDATE_POSTS";function n(e){return Object.assign({},e,{results:e.results.map(u.hydrate),isLoaded:!0,isBusy:!1,isSelected:!1})}r.UPDATE_POSTS=b},{"./post":353}],355:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.LOAD_DETAILS=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return t.newState;default:return e}},r.load=function(e){return{type:n,newState:e}};var n="LOAD_DETAILS";r.LOAD_DETAILS=n},{}],356:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.PATCH_PROFILE=r.HYDRATE_PROFILE=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case l:return Object.assign({},t.profile,{joined_on:(0,a.default)(t.profile.joined_on),status:(0,o.hydrateStatus)(t.profile.status)});case i:return Object.assign({},e,t.patch);case o.UPDATE_AVATAR:return e.id===t.userId?Object.assign({},e,{avatars:t.avatars}):e;case o.UPDATE_USERNAME:return e.id===t.userId?Object.assign({},e,{username:t.username,slug:t.slug}):e;default:return e}},r.hydrate=function(e){return{type:l,profile:e}},r.patch=function(e){return{type:i,patch:e}};var n,a=(n=e("moment"))&&n.__esModule?n:{default:n},o=e("./users");var l="HYDRATE_PROFILE";r.HYDRATE_PROFILE=l;var i="PATCH_PROFILE";r.PATCH_PROFILE=i},{"./users":364,moment:"moment"}],357:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.UPDATE_SEARCH_PROVIDER=r.UPDATE_SEARCH=r.REPLACE_SEARCH=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return t.state;case a:return Object.assign({},e,t.update);case o:return Object.assign({},e,{providers:e.providers.map(function(e){return e.id===t.provider.id?t.provider:e})});default:return e}},r.initialState=void 0,r.replace=function(e){return{type:n,state:{isLoading:!1,providers:e}}},r.update=function(e){return{type:a,update:e}},r.updateProvider=function(e){return{type:o,provider:e}};var n="REPLACE_SEARCH";r.REPLACE_SEARCH=n;var a="UPDATE_SEARCH";r.UPDATE_SEARCH=a;var o="UPDATE_SEARCH_PROVIDER";r.UPDATE_SEARCH_PROVIDER=o;r.initialState={isLoading:!1,query:"",providers:[]}},{}],358:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SELECT_NONE=r.SELECT_ITEM=r.SELECT_ALL=void 0,r.all=function(e){return{type:a,items:e}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[],t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case a:return t.items;case o:return[];case l:return(0,n.toggle)(e,t.item);default:return e}},r.item=function(e){return{type:l,item:e}},r.none=function(){return{type:o}};var n=e("../utils/sets"),a="SELECT_ALL";r.SELECT_ALL=a;var o="SELECT_NONE";r.SELECT_NONE=o;var l="SELECT_ITEM";r.SELECT_ITEM=l},{"../utils/sets":391}],359:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SHOW_SNACKBAR=r.HIDE_SNACKBAR=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:n,t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;return t.type===a?{type:t.messageType,message:t.message,isVisible:!0}:t.type===o?Object.assign({},e,{isVisible:!1}):e},r.hideSnackbar=function(){return{type:o}},r.initialState=void 0;var n={type:"info",message:"",isVisible:!(r.showSnackbar=function(e,t){return{type:a,message:e,messageType:t}})};r.initialState=n;var a="SHOW_SNACKBAR";r.SHOW_SNACKBAR=a;var o="HIDE_SNACKBAR";r.HIDE_SNACKBAR=o},{}],360:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.UPDATE_THREAD_ACL=r.UPDATE_THREAD=r.REPLACE_THREAD=r.RELEASE_THREAD=r.BUSY_THREAD=void 0,r.busy=function(){return{type:l}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case l:return Object.assign({},e,{isBusy:!0});case i:return Object.assign({},e,{isBusy:!1});case o.REMOVE_POLL:return Object.assign({},e,{poll:null});case o.REPLACE_POLL:return Object.assign({},e,{poll:t.state});case u:return t.state;case s:return Object.assign({},e,t.data);case c:var r=Object.assign({},e.acl,t.data);return Object.assign({},e,{acl:r});default:return e}},r.hydrate=f,r.release=function(){return{type:i}},r.replace=function(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1];return{type:u,state:t?e:f(e)}},r.update=function(e){return{type:s,data:e}},r.updateAcl=function(e){return{type:c,data:e}};var n,a=(n=e("moment"))&&n.__esModule?n:{default:n},o=e("./poll");var l="BUSY_THREAD";r.BUSY_THREAD=l;var i="RELEASE_THREAD";r.RELEASE_THREAD=i;var u="REPLACE_THREAD";r.REPLACE_THREAD=u;var s="UPDATE_THREAD";r.UPDATE_THREAD=s;var c="UPDATE_THREAD_ACL";function f(e){return Object.assign({},e,{started_on:(0,a.default)(e.started_on),last_post_on:(0,a.default)(e.last_post_on),best_answer_marked_on:e.best_answer_marked_on?(0,a.default)(e.best_answer_marked_on):null,isBusy:!1})}r.UPDATE_THREAD_ACL=c},{"./poll":352,moment:"moment"}],361:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SORT_THREADS=r.PATCH_THREAD=r.MODERATION_PERMISSIONS=r.HYDRATE_THREADS=r.FILTER_THREADS=r.DELETE_THREAD=r.APPEND_THREADS=void 0,r.append=function(e,t){return{type:l,items:e,sorting:t}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[],r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(r.type){case l:return(0,a.default)(r.items.map(m),e).sort(r.sorting);case i:return e.filter(function(e){return e.id!==r.thread.id});case u:return e.filter(function(e){var t=r.categoriesMap[e.category];return t.lft>=r.category.lft&&t.rght<=r.category.rght||2==e.weight});case s:return r.items.map(m);case c:var t=e.map(function(e){return e.id===r.thread.id?Object.assign({},e,r.patch):e});return r.sorting?t.sort(r.sorting):t;case f:return e.sort(r.sorting);default:return e}},r.deleteThread=function(e){return{type:i,thread:e}},r.filterThreads=function(e,t){return{type:u,category:e,categoriesMap:t}},r.getThreadModerationOptions=p,r.hydrate=function(e){return{type:s,items:e}},r.hydrateThread=m,r.patch=function(e,t){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;return{type:c,thread:e,patch:t,sorting:r}},r.sort=function(e){return{type:f,sorting:e}};var n=o(e("moment")),a=o(e("../utils/concat-unique"));function o(e){return e&&e.__esModule?e:{default:e}}var l="APPEND_THREADS";r.APPEND_THREADS=l;var i="DELETE_THREAD";r.DELETE_THREAD=i;var u="FILTER_THREADS";r.FILTER_THREADS=u;var s="HYDRATE_THREADS";r.HYDRATE_THREADS=s;var c="PATCH_THREAD";r.PATCH_THREAD=c;var f="SORT_THREADS";r.SORT_THREADS=f;var d=["can_announce","can_approve","can_close","can_hide","can_move","can_merge","can_pin","can_review"];function p(t){var r=[];return d.forEach(function(e){t[e]&&r.push(e)}),r}function m(e){return Object.assign({},e,{started_on:(0,n.default)(e.started_on),last_post_on:(0,n.default)(e.last_post_on),moderation:p(e.acl)})}r.MODERATION_PERMISSIONS=d},{"../utils/concat-unique":381,moment:"moment"}],362:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.TICK=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:n;return(1<arguments.length&&void 0!==arguments[1]?arguments[1]:null).type===a?Object.assign({},e,{tick:e.tick+1}):e},r.doTick=function(){return{type:a}},r.initialState=void 0;var n={tick:0};r.initialState=n;var a="TICK";r.TICK=a},{}],363:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.HYDRATE_HISTORY=r.APPEND_HISTORY=r.ADD_NAME_CHANGE=void 0,r.addNameChange=function(e,t,r){return{type:i,change:e,user:t,changedBy:r}},r.append=function(e){return{type:u,items:e}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[],t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case i:var r=e.slice();return r.unshift({id:Math.floor(Date.now()/1e3),changed_by:t.changedBy,changed_by_username:t.changedBy.username,changed_on:(0,n.default)(),new_username:t.change.username,old_username:t.user.username}),r;case u:return(0,o.default)(e,t.items.map(c));case s:return t.items.map(c);case a.UPDATE_AVATAR:return e.map(function(e){return(e=Object.assign({},e)).changed_by&&e.changed_by.id===t.userId&&(e.changed_by=Object.assign({},e.changed_by,{avatars:t.avatars})),e});case a.UPDATE_USERNAME:return e.map(function(e){return(e=Object.assign({},e)).changed_by&&e.changed_by.id===t.userId&&(e.changed_by=Object.assign({},e.changed_by,{username:t.username,slug:t.slug})),Object.assign({},e)});default:return e}},r.hydrate=function(e){return{type:s,items:e}},r.hydrateNamechange=c;var n=l(e("moment")),a=e("./users"),o=l(e("../utils/concat-unique"));function l(e){return e&&e.__esModule?e:{default:e}}var i="ADD_NAME_CHANGE";r.ADD_NAME_CHANGE=i;var u="APPEND_HISTORY";r.APPEND_HISTORY=u;var s="HYDRATE_HISTORY";function c(e){return Object.assign({},e,{changed_on:(0,n.default)(e.changed_on)})}r.HYDRATE_HISTORY=s},{"../utils/concat-unique":381,"./users":364,moment:"moment"}],364:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.UPDATE_USERNAME=r.UPDATE_AVATAR=r.HYDRATE_USERS=r.APPEND_USERS=void 0,r.append=function(e){return{type:l,items:e}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[],t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case l:return(0,a.default)(e,t.items.map(f));case i:return t.items.map(f);case u:return e.map(function(e){return(e=Object.assign({},e)).id===t.userId&&(e.avatars=t.avatars),e});default:return e}},r.hydrate=function(e){return{type:i,items:e}},r.hydrateStatus=c,r.hydrateUser=f,r.updateAvatar=function(e,t){return{type:u,userId:e.id,avatars:t}},r.updateUsername=function(e,t,r){return{type:s,userId:e.id,username:t,slug:r}};var n=o(e("moment")),a=o(e("../utils/concat-unique"));function o(e){return e&&e.__esModule?e:{default:e}}var l="APPEND_USERS";r.APPEND_USERS=l;var i="HYDRATE_USERS";r.HYDRATE_USERS=i;var u="UPDATE_AVATAR";r.UPDATE_AVATAR=u;var s="UPDATE_USERNAME";function c(e){return e?Object.assign({},e,{last_click:e.last_click?(0,n.default)(e.last_click):null,banned_until:e.banned_until?(0,n.default)(e.banned_until):null}):null}function f(e){return Object.assign({},e,{joined_on:(0,n.default)(e.joined_on),status:c(e.status)})}r.UPDATE_USERNAME=s},{"../utils/concat-unique":381,moment:"moment"}],365:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Ajax=void 0;var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._cookieName=null,this._csrfToken=null,this._locks={}}var t,r,n;return t=e,(r=[{key:"init",value:function(e){this._cookieName=e}},{key:"getCsrfToken",value:function(){if(-1===document.cookie.indexOf(this._cookieName))return null;var e=new RegExp(this._cookieName+"=([^;]*)"),t=document.cookie.match(e)[0];return t?t.split("=")[1]:null}},{key:"request",value:function(n,a,o){var l=this;return new Promise(function(t,r){var e={url:a,method:n,headers:{"X-CSRFToken":l.getCsrfToken()},data:o?JSON.stringify(o):null,contentType:"application/json; charset=utf-8",dataType:"json",success:function(e){t(e)},error:function(e){var t=e.responseJSON||{};t.status=e.status,0===t.status&&(t.detail=gettext("Lost connection with application.")),404===t.status&&(t.detail&&"NOT FOUND"!==t.detail||(t.detail=gettext("Action link is invalid."))),500!==t.status||t.detail||(t.detail=gettext("Unknown error has occured.")),t.statusText=e.statusText,r(t)}};$.ajax(e)})}},{key:"get",value:function(o,e,l){if(e&&(o+="?"+$.param(e)),l){var i=this;return this._locks[l]&&(this._locks[l].url=o),this._locks[l]&&this._locks[l].waiter?{then:function(){}}:this._locks[l]&&this._locks[l].wait?(this._locks[l].waiter=!0,new Promise(function(n,a){window.setTimeout(function(){!function t(r){i._locks[l].wait?window.setTimeout(function(){t(r)},300):i._locks[l].url!==r?t(i._locks[l].url):(i._locks[l].waiter=!1,i.request("GET",i._locks[l].url).then(function(e){i._locks[l].url===r?n(e):(i._locks[l].waiter=!0,t(i._locks[l].url))},function(e){i._locks[l].url===r?a(e):(i._locks[l].waiter=!0,t(i._locks[l].url))}))}(o)},300)})):(this._locks[l]={url:o,wait:!0,waiter:!1},new Promise(function(t,r){i.request("GET",o).then(function(e){i._locks[l].wait=!1,i._locks[l].url===o&&t(e)},function(e){i._locks[l].wait=!1,i._locks[l].url===o&&r(e)})}))}return this.request("GET",o)}},{key:"post",value:function(e,t){return this.request("POST",e,t)}},{key:"patch",value:function(e,t){return this.request("PATCH",e,t)}},{key:"put",value:function(e,t){return this.request("PUT",e,t)}},{key:"delete",value:function(e,t){return this.request("DELETE",e,t)}},{key:"upload",value:function(n,a,o){var l=this;return new Promise(function(t,r){var e={url:n,method:"POST",headers:{"X-CSRFToken":l.getCsrfToken()},data:a,contentType:!1,processData:!1,xhr:function(){var e=new window.XMLHttpRequest;return e.upload.addEventListener("progress",function(e){e.lengthComputable&&o(Math.round(e.loaded/e.total*100))},!1),e},success:function(e){t(e)},error:function(e){var t=e.responseJSON||{};t.status=e.status,0===t.status&&(t.detail=gettext("Lost connection with application.")),413!==t.status||t.detail||(t.detail=gettext("Upload was rejected by server as too large.")),404===t.status&&(t.detail&&"NOT FOUND"!==t.detail||(t.detail=gettext("Action link is invalid."))),500!==t.status||t.detail||(t.detail=gettext("Unknown error has occured.")),t.statusText=e.statusText,r(t)}};$.ajax(e)})}}])&&a(t.prototype,r),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),o=new(r.Ajax=n);r.default=o},{}],366:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Auth=void 0;var a=e("../reducers/auth");function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e,t,r){this._store=e,this._local=t,this._modal=r,this.syncSession(),this.watchState()}},{key:"syncSession",value:function(){var e=this._store.getState().auth;e.isAuthenticated?this._local.set("auth",{isAuthenticated:!0,username:e.user.username}):this._local.set("auth",{isAuthenticated:!1})}},{key:"watchState",value:function(){var t=this,r=this._store.getState().auth;this._local.watch("auth",function(e){e.isAuthenticated?t._store.dispatch((0,a.signIn)({username:e.username})):r.isAuthenticated&&t._store.dispatch((0,a.signOut)())}),this._modal.hide()}},{key:"signIn",value:function(e){this._store.dispatch((0,a.signIn)(e)),this._local.set("auth",{isAuthenticated:!0,username:e.username}),this._modal.hide()}},{key:"signOut",value:function(){this._store.dispatch((0,a.signOut)()),this._local.set("auth",{isAuthenticated:!1}),this._modal.hide()}},{key:"softSignOut",value:function(){this._store.dispatch((0,a.signOut)(!0)),this._local.set("auth",{isAuthenticated:!1}),this._modal.hide()}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),l=new(r.Auth=n);r.default=l},{"../reducers/auth":350}],367:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.ReCaptchaComponent=r.ReCaptcha=r.QACaptcha=r.NoCaptcha=r.Captcha=r.BaseCaptcha=void 0;var n=l(e("react")),o=l(e("../components/form-group"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t,r){return t&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}var m=function(){function e(){f(this,e)}return p(e,[{key:"init",value:function(e,t,r,n){this._context=e,this._ajax=t,this._include=r,this._snackbar=n}}]),e}();r.BaseCaptcha=m;var y=function(){i(t,m);var e=s(t);function t(){return f(this,t),e.apply(this,arguments)}return p(t,[{key:"load",value:function(){return new Promise(function(e){e()})}},{key:"validator",value:function(){return null}},{key:"component",value:function(){return null}}]),t}();r.NoCaptcha=y;var b=function(){i(t,m);var e=s(t);function t(){return f(this,t),e.apply(this,arguments)}return p(t,[{key:"load",value:function(){var r=this;return new Promise(function(t,e){r._ajax.get(r._context.get("CAPTCHA_API")).then(function(e){r.question=e.question,r.helpText=e.help_text,t()},function(){r._snackbar.error(gettext("Failed to load CAPTCHA.")),e()})})}},{key:"validator",value:function(){return[]}},{key:"component",value:function(e){return n.default.createElement(o.default,{label:this.question,for:"id_captcha",labelClass:e.labelClass||"",controlClass:e.controlClass||"",validation:e.form.state.errors.captcha,helpText:this.helpText||null},n.default.createElement("input",{"aria-describedby":"id_captcha_status",className:"form-control",disabled:e.form.state.isLoading,id:"id_captcha",onChange:e.form.bindInput("captcha"),type:"text",value:e.form.state.captcha}))}}]),t}();r.QACaptcha=b;var h=function(){i(t,n.default.Component);var e=s(t);function t(){return f(this,t),e.apply(this,arguments)}return p(t,[{key:"componentDidMount",value:function(){var t=this;grecaptcha.render("recaptcha",{sitekey:this.props.siteKey,callback:function(e){t.props.binding({target:{value:e}})}})}},{key:"render",value:function(){return n.default.createElement("div",{id:"recaptcha"})}}]),t}();r.ReCaptchaComponent=h;var v=function(){i(t,m);var e=s(t);function t(){return f(this,t),e.apply(this,arguments)}return p(t,[{key:"load",value:function(){return this._include.include("https://www.google.com/recaptcha/api.js",!0),new Promise(function(t){!function e(){"undefined"==typeof grecaptcha?window.setTimeout(function(){e()},200):t()}()})}},{key:"validator",value:function(){return[]}},{key:"component",value:function(e){return n.default.createElement(o.default,{label:gettext("Please solve the quick test"),for:"id_captcha",labelClass:e.labelClass||"",controlClass:e.controlClass||"",validation:e.form.state.errors.captcha,helpText:gettext("This test helps us prevent automated spam registrations on our site.")},n.default.createElement(h,{binding:e.form.bindInput("captcha"),siteKey:this._context.get("SETTINGS").recaptcha_site_key}))}}]),t}();r.ReCaptcha=v;var g=function(){function e(){f(this,e)}return p(e,[{key:"init",value:function(e,t,r,n){switch(e.get("SETTINGS").captcha_type){case"no":this._captcha=new y;break;case"qa":this._captcha=new b;break;case"re":this._captcha=new v}this._captcha.init(e,t,r,n)}},{key:"load",value:function(){return this._captcha.load()}},{key:"validator",value:function(){return this._captcha.validator()}},{key:"component",value:function(e){return this._captcha.component(e)}}]),e}(),_=new(r.Captcha=g);r.default=_},{"../components/form-group":55,react:"react"}],368:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Include=void 0;var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e){this._staticUrl=e,this._included=[]}},{key:"include",value:function(e,t){var r=1<arguments.length&&void 0!==t&&t;-1===this._included.indexOf(e)&&(this._included.push(e),this._include(e,r))}},{key:"_include",value:function(e,t){$.ajax({url:(t?"":this._staticUrl)+e,cache:!0,dataType:"script"})}}])&&a(t.prototype,r),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),o=new(r.Include=n);r.default=o},{}],369:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.LocalStorage=void 0;var o=window.localStorage,n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e){var n=this;this._prefix=e,this._watchers=[],window.addEventListener("storage",function(t){var r=JSON.parse(t.newValue);n._watchers.forEach(function(e){e.key===t.key&&t.oldValue!==t.newValue&&e.callback(r)})})}},{key:"set",value:function(e,t){o.setItem(this._prefix+e,JSON.stringify(t))}},{key:"get",value:function(e){var t=o.getItem(this._prefix+e);return t?JSON.parse(t):null}},{key:"watch",value:function(e,t){this._watchers.push({key:this._prefix+e,callback:t})}}])&&a(t.prototype,r),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),l=new(r.LocalStorage=n);r.default=l},{}],370:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.MobileNavbarDropdown=void 0;var n,a=(n=e("../utils/mount-component"))&&n.__esModule?n:{default:n};function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var l=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e){this._element=e,this._component=null}},{key:"show",value:function(e){this._component===e?this.hide():(this._component=e,(0,a.default)(e,this._element.id),$(this._element).addClass("open"))}},{key:"showConnected",value:function(e,t){this._component===e?this.hide():(this._component=e,(0,a.default)(t,this._element.id,!0),$(this._element).addClass("open"))}},{key:"hide",value:function(){$(this._element).removeClass("open"),this._component=null}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),i=new(r.MobileNavbarDropdown=l);r.default=i},{"../utils/mount-component":386}],371:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Modal=void 0;var a=n(e("react-dom")),o=n(e("../utils/mount-component"));function n(e){return e&&e.__esModule?e:{default:e}}function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var i=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e){var t=this;this._element=e,this._modal=$(e).modal({show:!1}),this._modal.on("hidden.bs.modal",function(){a.default.unmountComponentAtNode(t._element)})}},{key:"show",value:function(e){(0,o.default)(e,this._element.id),this._modal.modal("show")}},{key:"hide",value:function(){this._modal.modal("hide")}}])&&l(t.prototype,r),n&&l(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),u=new(r.Modal=i);r.default=u},{"../utils/mount-component":386,"react-dom":"react-dom"}],372:[function(e,t,r){"use strict";function n(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.OneBox=void 0,r.cleanUrl=u,r.default=void 0,r.getVideoIdFromUrl=s,r.parseYoutubeUrl=i;var a=new RegExp("^.*(?:(?:youtu.be/|v/|vi/|u/w/|embed/)|(?:(?:watch)??v(?:i)?=|&v(?:i)?=))([^#&?]*).*"),o=function(){function a(){var e,t,r,n=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),r=function(e){e&&(n.highlightCode(e),n.embedYoutubePlayers(e))},(t="render")in(e=this)?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,this._youtube={}}var e,t,r;return e=a,(t=[{key:"highlightCode",value:function(e){for(var t=e.querySelectorAll("pre>code"),r=0;r<t.length;r++){var n=t[r];hljs.highlightBlock(n)}}},{key:"embedYoutubePlayers",value:function(e){for(var t=e.querySelectorAll("p>a"),r=0;r<t.length;r++){var n=t[r],a=1===n.parentNode.childNodes.length;this._youtube[n.href]||(this._youtube[n.href]=i(n.href));var o=this._youtube[n.href];a&&o&&!1!==o.data&&this.swapYoutubePlayer(n,o)}}},{key:"swapYoutubePlayer",value:function(e,t){var r="https://www.youtube.com/embed/";r+=t.video,r+="?rel=0",t.start&&(r+="&start="+t.start);var n=$('<iframe class="embed-responsive-item" src="'+r+'" allowfullscreen></iframe>');$(e).replaceWith(n),n.wrap('<div class="embed-responsive embed-responsive-16by9"></div>')}}])&&n(e.prototype,t),r&&n(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}(),l=new(r.OneBox=o);function i(e){var t=u(e),r=s(t);if(!r)return null;var n,a,o=0;return 0<t.indexOf("?")&&((n=t.substr(t.indexOf("?")+1).split("&").filter(function(e){return"t="===e.substr(0,2)})[0])&&("s"===(a=n.substr(2).split("m"))[0].substr(-1)?o+=parseInt(a[0].substr(0,a[0].length-1)):(o+=60*parseInt(a[0]),a[1]&&"s"===a[1].substr(-1)&&(o+=parseInt(a[1].substr(0,a[1].length-1)))))),{start:o,video:r}}function u(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}function s(e){if(-1===e.indexOf("youtu"))return null;var t=e.match(a);return t?t[1]:null}r.default=l},{}],373:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.PageTitle=void 0;var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e,t){this._indexTitle=e,this._forumName=t}},{key:"set",value:function(e){var t;e?("string"==typeof e&&(e={title:e}),t=e.title,1<e.page&&(t+=" ("+interpolate(gettext("page: %(page)s"),{page:e.page},!0)+")"),e.parent&&(t+=" | "+e.parent),document.title=t+" | "+this._forumName):document.title=this._indexTitle||this._forumName}}])&&a(t.prototype,r),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),o=new(r.PageTitle=n);r.default=o},{}],374:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Polls=void 0;var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e,t){this._ajax=e,this._snackbar=t,this._polls={}}},{key:"start",value:function(t){var r=this;this.stop(t.poll);function n(){r._polls[t.poll]=t,r._ajax.get(t.url,t.data||null).then(function(e){r._polls[t.poll]._stopped||(t.update(e),r._polls[t.poll].timeout=window.setTimeout(n,t.frequency))},function(e){r._polls[t.poll]._stopped||(t.error?t.error(e):r._snackbar.apiError(e))})}t.delayed?this._polls[t.poll]={timeout:window.setTimeout(n,t.frequency)}:n()}},{key:"stop",value:function(e){this._polls[e]&&(window.clearTimeout(this._polls[e].timeout),this._polls[e]._stopped=!0)}}])&&a(t.prototype,r),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),o=new(r.Polls=n);r.default=o},{}],375:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Posting=void 0;var n=a(e("react")),o=a(e("react-dom")),l=e("../components/poll"),i=a(e("../components/posting")),u=a(e("../utils/mount-component"));function a(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var c=function(){function a(){var e,t,r,n=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),r=function(){n._isOpen&&!n._isClosing&&(n._isClosing=!0,n._placeholder.removeClass("slide-in"),window.setTimeout(function(){o.default.unmountComponentAtNode(document.getElementById("posting-mount")),n._isClosing=!1,n._isOpen=!1},300))},(t="close")in(e=this)?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}var e,t,r;return e=a,(t=[{key:"init",value:function(e,t,r){this._ajax=e,this._snackbar=t,this._placeholder=$(r),this._mode=null,this._isOpen=!1,this._isClosing=!1}},{key:"open",value:function(e){var t;!1===this._isOpen?(this._mode=e.mode,this._isOpen=e.submit,this._realOpen(e)):this._isOpen!==e.submit?(t=gettext("You are already working on other message. Do you want to discard it?"),"POLL"==this._mode&&(t=gettext("You are already working on a poll. Do you want to discard it?")),window.confirm(t)&&(this._mode=e.mode,this._isOpen=e.submit,this._realOpen(e))):"REPLY"==this._mode&&"REPLY"==e.mode&&this._realOpen(e)}},{key:"_realOpen",value:function(e){"POLL"==e.mode?(0,u.default)(n.default.createElement(l.PollForm,e),"posting-mount"):(0,u.default)(n.default.createElement(i.default,e),"posting-mount"),this._placeholder.addClass("slide-in"),$("html, body").animate({scrollTop:this._placeholder.offset().top},1e3)}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}(),f=new(r.Posting=c);r.default=f},{"../components/poll":106,"../components/posting":134,"../utils/mount-component":386,react:"react","react-dom":"react-dom"}],376:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Snackbar=void 0;var a=e("../reducers/snackbar");function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e){this._store=e,this._timeout=null}},{key:"alert",value:function(e,t){var r=this;this._timeout?(window.clearTimeout(this._timeout),this._store.dispatch((0,a.hideSnackbar)()),this._timeout=window.setTimeout(function(){r._timeout=null,r.alert(e,t)},300)):(this._store.dispatch((0,a.showSnackbar)(e,t)),this._timeout=window.setTimeout(function(){r._store.dispatch((0,a.hideSnackbar)()),r._timeout=null},5e3))}},{key:"info",value:function(e){this.alert(e,"info")}},{key:"success",value:function(e){this.alert(e,"success")}},{key:"warning",value:function(e){this.alert(e,"warning")}},{key:"error",value:function(e){this.alert(e,"error")}},{key:"apiError",value:function(e){var t=(t=e.detail)||(404===e.status?gettext("Action link is invalid."):gettext("Unknown error has occured."));403===e.status&&"Permission denied"===t&&(t=gettext("You don't have permission to perform this action.")),this.error(t)}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),l=new(r.Snackbar=n);r.default=l},{"../reducers/snackbar":359}],377:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.StoreWrapper=void 0;var a=e("redux");function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._store=null,this._reducers={},this._initialState={}}var t,r,n;return t=e,(r=[{key:"addReducer",value:function(e,t,r){this._reducers[e]=t,this._initialState[e]=r}},{key:"init",value:function(){this._store=(0,a.createStore)((0,a.combineReducers)(this._reducers),this._initialState)}},{key:"getStore",value:function(){return this._store}},{key:"getState",value:function(){return this._store.getState()}},{key:"dispatch",value:function(e){return this._store.dispatch(e)}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),l=new(r.StoreWrapper=n);r.default=l},{redux:"redux"}],378:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Zxcvbn=void 0;var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e){this._include=e,this._isLoaded=!1}},{key:"scorePassword",value:function(e,t){return this._isLoaded?zxcvbn(e,t).score:0}},{key:"load",value:function(){return this._isLoaded?this._loadedPromise():(this._include.include("misago/js/zxcvbn.js"),this._loadingPromise())}},{key:"_loadingPromise",value:function(){var o=this;return new Promise(function(n,a){!function e(t){var r=0<arguments.length&&void 0!==t?t:0;200<(r+=1)?a():"undefined"==typeof zxcvbn?window.setTimeout(function(){e(r)},200):(o._isLoaded=!0,n())}()})}},{key:"_loadedPromise",value:function(){return new Promise(function(e){e()})}}])&&a(t.prototype,r),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),o=new(r.Zxcvbn=n);r.default=o},{}],379:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e,t){{var r;o.default.render(a.default.createElement(l.Provider,{store:s.default.getStore()},a.default.createElement(f,{message:e.message,expires:e.expires_on?(0,n.default)(e.expires_on):null})),document.getElementById("page-mount")),void 0!==t&&!t||(r=u.default.get("SETTINGS").forum_name,document.title=gettext("You are banned")+" | "+r,window.history.pushState({},"",u.default.get("BANNED_URL")))}};var n=c(e("moment")),a=c(e("react")),o=c(e("react-dom")),l=e("react-redux"),i=c(e("../components/banned-page")),u=c(e("./..")),s=c(e("../services/store"));function c(e){return e&&e.__esModule?e:{default:e}}var f=(0,l.connect)(function(e){return e.tick})(i.default)},{"../components/banned-page":7,"../services/store":377,"./..":302,moment:"moment",react:"react","react-dom":"react-dom","react-redux":"react-redux"}],380:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e,t){var r=2<arguments.length&&void 0!==arguments[2]&&arguments[2],n=[],a=[];if(e.forEach(function(e){a.push(e),a.length===t&&(n.push(a),a=[])}),!1!==r&&0<a.length&&a.length<t)for(var o=a.length;o<t;o++)a.push(r);a.length&&n.push(a);return n}},{}],381:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e,t){var r=[];return e.concat(t).filter(function(e){return-1===r.indexOf(e.id)&&(r.push(e.id),!0)})}},{}],382:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=function(){function r(e,t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,r),this._callback=e,this._count=t}var e,t,n;return e=r,(t=[{key:"count",value:function(){--this._count,0===this._count&&this._callback()}}])&&a(e.prototype,t),n&&a(e,n),Object.defineProperty(e,"prototype",{writable:!1}),r}();r.default=n},{}],383:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.replace(/[&<>"']/g,function(e){return n[e]})};var n={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"}},{}],384:[function(e,t,r){"use strict";function n(e){return e.toFixed(1)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return 1073741824<e?n(e/1073741824)+" GB":1048576<e?n(e/1048576)+" MB":1024<e?n(e/1024)+" KB":n(e)+" B"},r.roundSize=n},{}],385:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.test($.trim(e))};var n=new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i")},{}],386:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e,t){var r=!(2<arguments.length&&void 0!==arguments[2])||arguments[2],n=document.getElementById(t),a=e.props?e:o.default.createElement(e,null);n&&(r?l.default.render(o.default.createElement(i.Provider,{store:u.default.getStore()},a),n):l.default.render(a,n))};var o=n(e("react")),l=n(e("react-dom")),i=e("react-redux"),u=n(e("../services/store"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../services/store":377,react:"react","react-dom":"react-dom","react-redux":"react-redux"}],387:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=function(){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),this.isOrdered=!1,this._items=e||[]}var e,r,n;return e=t,(r=[{key:"add",value:function(e,t,r){this._items.push({key:e,item:t,after:r&&r.after||null,before:r&&r.before||null})}},{key:"get",value:function(e,t){for(var r=0;r<this._items.length;r++)if(this._items[r].key===e)return this._items[r].item;return t}},{key:"has",value:function(e){return void 0!==this.get(e)}},{key:"values",value:function(){for(var e=[],t=0;t<this._items.length;t++)e.push(this._items[t].item);return e}},{key:"order",value:function(e){return this.isOrdered||(this._items=this._order(this._items),this.isOrdered=!0),e||void 0===e?this.values():this._items}},{key:"orderedValues",value:function(){return this.order(!0)}},{key:"_order",value:function(e){var t=[];e.forEach(function(e){t.push(e.key)});var r=[],n=[];function a(e){var t=-1;-1===n.indexOf(e.key)&&(e.after?-1!==(t=n.indexOf(e.after))&&(t+=1):e.before&&(t=n.indexOf(e.before)),-1!==t&&(r.splice(t,0,e),n.splice(t,0,e.key)))}e.forEach(function(e){e.after||e.before||(r.push(e),n.push(e.key))}),e.forEach(function(e){"_end"===e.before&&(r.push(e),n.push(e.key))});for(var o=200;0<o&&t.length!==n.length;)--o,e.forEach(a);return r}}])&&a(e.prototype,r),n&&a(e,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();r.default=n},{}],388:[function(e,t,r){"use strict";function a(e,t){return Math.floor(Math.random()*(t-e+1))+e}Object.defineProperty(r,"__esModule",{value:!0}),r.int=a,r.range=function(e,t){for(var r=new Array(a(e,t)),n=0;n<r.length;n++)r[n]=n;return r}},{}],389:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(){window.scrollTo(0,0)}},{}],390:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(r){var e={component:r.component||null,childRoutes:[]};r.root?e.childRoutes=[{path:r.root,onEnter:function(e,t){t(null,r.paths[0].path)}}].concat(r.paths):e.childRoutes=r.paths;a.default.render(n.default.createElement(o.Provider,{store:i.default.getStore()},n.default.createElement(l.Router,{routes:e,history:l.browserHistory})),s)};var n=u(e("react")),a=u(e("react-dom")),o=e("react-redux"),l=e("react-router"),i=u(e("../services/store"));function u(e){return e&&e.__esModule?e:{default:e}}var s=document.getElementById("page-mount")},{"../services/store":377,react:"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router"}],391:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.push=function(e,t){{if(-1!==e.indexOf(t))return e;var r=e.slice();return r.push(t),r}},r.remove=function(e,t){return 0<=e.indexOf(t)?e.filter(function(e){return e!==t}):e},r.toggle=function(e,t){{if(-1!==e.indexOf(t))return e.filter(function(e){return e!==t});var r=e.slice();return r.push(t),r}}},{}],392:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e,t){if(e=(e+"").toLowerCase(),(t=(t+"").toLowerCase()).length<=0)return 0;var r=0,n=0,a=t.length;for(;0<=(n=e.indexOf(t,n));)r+=1,n+=a;return r}},{}],393:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.email=function(t){return function(e){if(!n.test(e))return t||gettext("Enter a valid email address.")}},r.maxLength=i,r.minLength=l,r.passwordMinLength=function(n){return function(e){var t=e.length;if(t<n){var r=ngettext("Valid password must be at least %(limit_value)s character long.","Valid password must be at least %(limit_value)s characters long.",n);return interpolate(r,{limit_value:n,show_value:t},!0)}}},r.required=o,r.requiredPrivacyPolicy=function(e){var t=gettext("You have to accept the privacy policy.");return o(e||t)},r.requiredTermsOfService=function(e){var t=gettext("You have to accept the terms of service.");return o(e||t)},r.usernameContent=function(){return function(e){if(!a.test($.trim(e)))return gettext("Username can only contain latin alphabet letters and digits.")}},r.usernameMaxLength=function(e){return i(e,function(e){return ngettext("Username cannot be longer than %(limit_value)s character.","Username cannot be longer than %(limit_value)s characters.",e)})},r.usernameMinLength=function(e){return l(e,function(e){return ngettext("Username must be at least %(limit_value)s character long.","Username must be at least %(limit_value)s characters long.",e)})};var n=/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i,a=new RegExp("^[0-9a-z]+$","i");function o(t){return function(e){if(!1===e||null===e||0===$.trim(e).length)return t||gettext("This field is required.")}}function l(n,a){return function(e){var t="",r=$.trim(e).length;if(r<n)return t=a?a(n,r):ngettext("Ensure this value has at least %(limit_value)s character (it has %(show_value)s).","Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).",n),interpolate(t,{limit_value:n,show_value:r},!0)}}function i(n,a){return function(e){var t="",r=$.trim(e).length;if(n<r)return t=a?a(n,r):ngettext("Ensure this value has at most %(limit_value)s character (it has %(show_value)s).","Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).",n),interpolate(t,{limit_value:n,show_value:r},!0)}}},{}]},{},[302,303,304,305,306,323,324,325,326,327,328,329,330,346,347,348,349,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345]);
+!function o(l,i,u){function s(t,e){if(!i[t]){if(!l[t]){var r="function"==typeof require&&require;if(!e&&r)return r(t,!0);if(c)return c(t,!0);var n=new Error("Cannot find module '"+t+"'");throw n.code="MODULE_NOT_FOUND",n}var a=i[t]={exports:{}};l[t][0].call(a.exports,function(e){return s(l[t][1][e]||e)},a,a.exports,o,l,i,u)}return i[t].exports}for(var c="function"==typeof require&&require,e=0;e<u.length;e++)s(u[e]);return s}({1:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var c=n(e("react")),f=n(e("./..")),s=n(e("../utils/escape-html"));function n(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=e.errors,r=e.privacyPolicy,n=e.termsOfService,a=e.onPrivacyPolicyChange,o=e.onTermsOfServiceChange,l=f.default.get("TERMS_OF_SERVICE_ID"),i=f.default.get("TERMS_OF_SERVICE_URL"),u=f.default.get("PRIVACY_POLICY_ID"),s=f.default.get("PRIVACY_POLICY_URL");return l||u?c.default.createElement("div",null,c.default.createElement(d,{agreement:gettext("the terms of service"),checked:null!==n,errors:t.termsOfService,url:i,value:l,onChange:o}),c.default.createElement(d,{agreement:gettext("the privacy policy"),checked:null!==r,errors:t.privacyPolicy,url:s,value:u,onChange:a})):null}var d=function(e){var t=e.agreement,r=e.checked,n=e.errors,a=e.url,o=e.value,l=e.onChange;if(!a)return null;var i=interpolate('<a href="%(url)s" target="_blank">%(agreement)s</a>',{agreement:(0,s.default)(t),url:(0,s.default)(a)},!0),u=interpolate(gettext("I have read and accept %(agreement)s."),{agreement:i},!0);return c.default.createElement("div",{className:"checkbox legal-footnote"},c.default.createElement("label",null,c.default.createElement("input",{checked:r,type:"checkbox",value:o,onChange:l}),c.default.createElement("span",{dangerouslySetInnerHTML:{__html:u}})),n&&n.map(function(e,t){return c.default.createElement("div",{className:"help-block errors",key:t},e)}))};r.default=a},{"../utils/escape-html":383,"./..":302,react:"react"}],2:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var f=n(e("react")),o=n(e("./.."));function n(e){return e&&e.__esModule?e:{default:e}}function a(e){var s=e.buttonClassName,c=e.buttonLabel,t=e.formLabel,r=e.header,n=e.labelClassName,a=o.default.get("SOCIAL_AUTH");return 0===a.length?null:f.default.createElement("div",{className:"form-group form-social-auth"},f.default.createElement(l,{className:n,text:r}),f.default.createElement("div",{className:"row"},a.map(function(e){var t=e.id,r=e.name,n=e.button_text,a=e.button_color,o=e.url,l="btn btn-block btn-default btn-social-"+t,i=a?{color:a}:null,u=n||interpolate(c,{site:r},!0);return f.default.createElement("div",{className:s||"col-xs-12",key:t},f.default.createElement("a",{className:l,style:i,href:o},u))})),f.default.createElement("hr",null),f.default.createElement(l,{className:n,text:t}))}var l=function(e){var t=e.className,r=e.text;return r?f.default.createElement("h5",{className:t||""},r):null};r.default=a},{"./..":302,react:"react"}],3:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../services/ajax"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=f(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return c(e)}(this,n?(e=f(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function f(e){return(f=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function d(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),d(c(t=n.call(this,e)),"handleDecline",function(){t.state.submiting||window.confirm(gettext("Declining will result in immediate deactivation and deletion of your account. This action is not reversible."))&&(t.setState({submiting:!0}),l.default.post(t.props.api,{accept:!1}).then(function(){window.location.reload(!0)}))}),d(c(t),"handleAccept",function(){t.state.submiting||(t.setState({submiting:!0}),l.default.post(t.props.api,{accept:!0}).then(function(){window.location.reload(!0)}))}),t.state={submiting:!1},t}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",null,o.default.createElement("button",{className:"btn btn-default",disabled:this.state.submiting,type:"buton",onClick:this.handleDecline},gettext("Decline")),o.default.createElement("button",{className:"btn btn-primary",disabled:this.state.submiting,type:"buton",onClick:this.handleAccept},gettext("Accept and continue")))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../services/ajax":365,react:"react"}],4:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ModalHeader=E,r.default=void 0;var n=o(e("react")),a=o(e("./form")),u=o(e("./form-group")),s=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=y(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../reducers/participants")),c=e("../reducers/thread"),f=o(e("../services/ajax")),d=o(e("../services/modal")),p=o(e("../services/snackbar")),m=o(e("../services/store"));function y(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(y=function(e){return e?r:t})(e)}function o(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return g(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(l,a.default);var e,t,r,o=v(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=g(t),a=function(e){t.changeValue("username",e.target.value)},(n="onUsernameChange")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1,username:""},t}return e=l,(t=[{key:"clean",value:function(){return!!this.state.username.trim().length||(p.default.error(gettext("You have to enter user name.")),!1)}},{key:"send",value:function(){return f.default.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){m.default.dispatch((0,c.updateAcl)(e)),m.default.dispatch(s.replace(e.participants)),p.default.success(gettext("New participant has been added to thread.")),d.default.hide()}},{key:"render",value:function(){return n.default.createElement("div",{className:"modal-dialog modal-sm",role:"document"},n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"modal-content"},n.default.createElement(E,null),n.default.createElement("div",{className:"modal-body"},n.default.createElement(u.default,{for:"id_username",label:gettext("User to add")},n.default.createElement("input",{id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.onUsernameChange,type:"text",value:this.state.username}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("button",{className:"btn btn-block btn-primary",disabled:this.state.isLoading},gettext("Add participant")),n.default.createElement("button",{className:"btn btn-block btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel"))))))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function E(e){return n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Add participant")))}r.default=_},{"../reducers/participants":351,"../reducers/thread":360,"../services/ajax":365,"../services/modal":371,"../services/snackbar":376,"../services/store":377,"./form":56,"./form-group":55,react:"react"}],5:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.select=function(e){return{user:e.auth.user,signedIn:e.auth.signedIn,signedOut:e.auth.signedOut}};var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"refresh",value:function(){window.location.reload()}},{key:"getMessage",value:function(){return this.props.signedIn?interpolate(gettext("You have signed in as %(username)s. Please refresh the page before continuing."),{username:this.props.signedIn.username},!0):this.props.signedOut?interpolate(gettext("%(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"),o.default.createElement("div",{className:e},o.default.createElement("div",{className:"container"},o.default.createElement("p",{className:"lead"},this.getMessage()),o.default.createElement("p",null,o.default.createElement("button",{className:"btn btn-default",type:"button",onClick:this.refresh},gettext("Reload page")),o.default.createElement("span",{className:"hidden-xs hidden-sm"}," "+gettext("or press F5 key.")))))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],6:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.size||100,r=e.size2x||t;return n.default.createElement("img",{alt:"",className:e.className||"user-avatar",src:l(e.user,t),srcSet:l(e.user,r),width:t,height:t})},r.getSrc=l,r.resolveAvatarForSize=i;var n=o(e("react")),a=o(e("./.."));function o(e){return e&&e.__esModule?e:{default:e}}function l(e,t){return e&&e.id?i(e.avatars,t).url:a.default.get("BLANK_AVATAR_URL")}function i(e,t){var r=e[0];return e.forEach(function(e){e.size>=t&&(r=e)}),r}},{"./..":302,react:"react"}],7:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("moment")),l=n(e("react"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,l.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getReasonMessage",value:function(){return this.props.message.html?l.default.createElement("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.props.message.html}}):l.default.createElement("p",{className:"lead"},this.props.message.plain)}},{key:"getExpirationMessage",value:function(){if(this.props.expires){if(this.props.expires.isAfter((0,o.default)())){var e=interpolate(gettext("This ban expires on %(expires_on)s."),{expires_on:this.props.expires.format("LL, LT")},!0),t=interpolate(gettext("This ban expires %(expires_on)s."),{expires_on:this.props.expires.fromNow()},!0);return l.default.createElement("abbr",{title:e},t)}return gettext("This ban has expired.")}return gettext("This ban is permanent.")}},{key:"render",value:function(){return l.default.createElement("div",{className:"page page-error page-error-banned"},l.default.createElement("div",{className:"container"},l.default.createElement("div",{className:"message-panel"},l.default.createElement("div",{className:"message-icon"},l.default.createElement("span",{className:"material-icon"},"highlight_off")),l.default.createElement("div",{className:"message-body"},this.getReasonMessage(),l.default.createElement("p",{className:"message-footnote"},this.getExpirationMessage())))))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{moment:"moment",react:"react"}],8:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./loader"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){var e="btn "+this.props.className,t=this.props.disabled;return this.props.loading&&(e+=" btn-loading",t=!0),o.default.createElement("button",{className:e,disabled:t,onClick:this.props.onClick,type:this.props.onClick?"button":"submit"},this.props.children,this.props.loading?o.default.createElement(l.default,null):null)}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();(r.default=f).defaultProps={className:"btn-default",type:"submit",loading:!1,disabled:!1,onClick:null}},{"./loader":58,react:"react"}],9:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return a.default.createElement("div",{className:"categories-list"},a.default.createElement("ul",{className:"list-group"},a.default.createElement("li",{className:"list-group-item empty-message"},a.default.createElement("p",{className:"lead"},gettext("No categories exist or you don't have permission to see them.")))))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],10:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.categories;return n.default.createElement("div",{className:"categories-list"},t.map(function(e){return n.default.createElement(a.default,{category:e,key:e.id})}))};var n=o(e("react")),a=o(e("./category"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./category":11,react:"react"}],11:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category,r="list-group list-group-category";t.css_class&&(r+=" list-group-category-has-flavor",r+=" list-group-category-"+t.css_class);return n.default.createElement("ul",{className:r},n.default.createElement(a.default,{category:t,isFirst:!0}),t.subcategories.map(function(e){return n.default.createElement(a.default,{category:e,isFirst:!1,key:e.id})}))};var n=o(e("react")),a=o(e("./list-item"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./list-item":14,react:"react"}],12:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category;return t.description?a.default.createElement("div",{className:"category-description",dangerouslySetInnerHTML:{__html:t.description.html}}):null};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],13:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category;return a.default.createElement("div",{className:o(t),title:l(t)},a.default.createElement("span",{className:"material-icon"},i(t)))},r.getClassName=o,r.getIcon=i,r.getTitle=l;var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){return e.is_read?"read-status item-read":"read-status item-new"}function l(e){return e.is_closed?e.is_read?gettext("This category has no new posts. (closed)"):gettext("This category has new posts. (closed)"):e.is_read?gettext("This category has no new posts."):gettext("This category has new posts.")}function i(e){return e.is_closed?e.is_read?"lock_outline":"lock":e.is_read?"chat_bubble_outline":"chat_bubble"}},{react:"react"}],14:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category,r=e.isFirst,n="list-group-item";t.description?n+=" list-group-category-has-description":n+=" list-group-category-no-description";r&&(n+=" list-group-item-first");t.css_class&&(n+=" list-group-category-has-flavor",n+=" list-group-item-category-"+t.css_class);return a.default.createElement("li",{className:n},a.default.createElement("div",{className:"row"},a.default.createElement(o.default,{category:t}),a.default.createElement(i.default,{category:t}),a.default.createElement(l.default,{category:t})),a.default.createElement(u.default,{category:t,isFirst:r}))};var a=n(e("react")),o=n(e("./main")),l=n(e("./last-thread")),i=n(e("./stats")),u=n(e("./subcategories"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./last-thread":15,"./main":16,"./stats":17,"./subcategories":18,react:"react"}],15:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Empty=s,r.LastPosterAvatar=i,r.LastPosterName=u,r.LastThread=l,r.Message=d,r.Private=c,r.Protected=f,r.default=function(e){var t=e.category;return n.default.createElement("div",{className:"col-xs-12 col-sm-6 col-md-4 category-last-thread"},n.default.createElement(l,{category:t}),n.default.createElement(s,{category:t}),n.default.createElement(c,{category:t}),n.default.createElement(f,{category:t}))};var n=o(e("react")),a=o(e("../../../avatar"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e){var t=e.category;return t.acl.can_browse&&t.acl.can_see_all_threads&&t.last_thread_title?n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left hidden-xs"},n.default.createElement(i,{category:t})),n.default.createElement("div",{className:"media-body"},n.default.createElement("div",{className:"media-heading"},n.default.createElement("a",{className:"item-title thread-title",href:t.url.last_thread_new,title:t.last_thread_title},t.last_thread_title)),n.default.createElement("ul",{className:"list-inline"},n.default.createElement("li",{className:"category-last-thread-poster"},n.default.createElement(u,{category:t})),n.default.createElement("li",{className:"divider"},"—"),n.default.createElement("li",{className:"category-last-thread-date"},n.default.createElement("a",{href:t.url.last_post},t.last_post_on.fromNow()))))):null}function i(e){var t=e.category;return t.last_poster?n.default.createElement("a",{className:"last-poster-avatar",href:t.last_poster.url,title:t.last_poster_name},n.default.createElement(a.default,{className:"media-object",size:40,user:t.last_poster})):n.default.createElement("span",{className:"last-poster-avatar",title:t.last_poster_name},n.default.createElement(a.default,{className:"media-object",size:40}))}function u(e){var t=e.category;return t.last_poster?n.default.createElement("a",{className:"item-title",href:t.last_poster.url},t.last_poster_name):n.default.createElement("span",{className:"item-title"},t.last_poster_name)}function s(e){var t=e.category;return!t.acl.can_browse||!t.acl.can_see_all_threads||t.last_thread_title?null:n.default.createElement(d,{message:gettext("This category is empty. No threads were posted within it so far.")})}function c(e){var t=e.category;return!t.acl.can_browse||t.acl.can_see_all_threads?null:n.default.createElement(d,{message:gettext("This category is private. You can see only your own threads within it.")})}function f(e){return e.category.acl.can_browse?null:n.default.createElement(d,{message:gettext("This category is protected. You can't browse its contents.")})}function d(e){var t=e.message;return n.default.createElement("div",{className:"media category-thread-message"},n.default.createElement("div",{className:"media-left"},n.default.createElement("span",{className:"material-icon"},"info_outline")),n.default.createElement("div",{className:"media-body"},n.default.createElement("p",null,t)))}},{"../../../avatar":6,react:"react"}],16:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category;return n.default.createElement("div",{className:"col-xs-12 col-sm-6 col-md-6 category-main"},n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left"},n.default.createElement(o.default,{category:t})),n.default.createElement("div",{className:"media-body"},n.default.createElement("h4",{className:"media-heading"},n.default.createElement("a",{href:t.url.index},t.name)),n.default.createElement(a.default,{category:t}))))};var n=l(e("react")),a=l(e("./description")),o=l(e("./icon"));function l(e){return e&&e.__esModule?e:{default:e}}},{"./description":12,"./icon":13,react:"react"}],17:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Posts=l,r.Threads=o,r.default=function(e){var t=e.category;return n.default.createElement("div",{className:"col-md-2 hidden-xs hidden-sm"},n.default.createElement("ul",{className:"list-unstyled category-stats"},n.default.createElement(o,{threads:t.threads}),n.default.createElement(l,{posts:t.posts})))};var n=a(e("react"));a(e("../../../avatar"));function a(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=e.threads,r=ngettext("%(threads)s thread","%(threads)s threads",t);return n.default.createElement("li",{className:"category-stat-threads"},interpolate(r,{threads:t},!0))}function l(e){var t=e.posts,r=ngettext("%(posts)s post","%(posts)s posts",t);return n.default.createElement("li",{className:"category-stat-posts"},interpolate(r,{posts:t},!0))}},{"../../../avatar":6,react:"react"}],18:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category;return e.isFirst||0===t.subcategories.length?null:n.default.createElement("div",{className:"row subcategories-list"},t.subcategories.map(function(e){return n.default.createElement(a.default,{category:e,key:e.id})}))};var n=o(e("react")),a=o(e("./list-item"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./list-item":19,react:"react"}],19:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category,r="btn btn-default btn-block btn-sm btn-subcategory";t.is_read||(r+=" btn-subcategory-new");return a.default.createElement("div",{className:"col-xs-12 col-sm-4 col-md-3"},a.default.createElement("a",{className:r,href:t.url.index},a.default.createElement("span",{className:"material-icon"},o(t)),a.default.createElement("span",{className:"icon-text"},t.name)))},r.getIcon=o;var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){return e.is_closed?e.is_read?"lock_outline":"lock":e.is_read?"chat_bubble_outline":"chat_bubble"}},{react:"react"}],20:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.select=function(e){return{tick:e.tick.tick}};var n=o(e("moment")),i=o(e("react")),u=o(e("./blankslate")),s=o(e("./categories-list")),c=o(e("../..")),f=o(e("../../services/polls"));function o(e){return e&&e.__esModule?e:{default:e}}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var b=function e(t){return Object.assign({},t,{last_post_on:t.last_post_on?(0,n.default)(t.last_post_on):null,subcategories:t.subcategories.map(e)})},h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(l,i.default.Component);var e,t,r,o=m(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=y(t),a=function(e){t.setState({categories:e.map(b)})},(n="update")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={categories:c.default.get("CATEGORIES").map(b)},t.startPolling(c.default.get("CATEGORIES_API")),t}return e=l,(t=[{key:"startPolling",value:function(e){f.default.start({poll:"categories",url:e,frequency:18e4,update:this.update})}},{key:"render",value:function(){var e=this.state.categories;return 0===e.length?i.default.createElement(u.default,null):i.default.createElement(s.default,{categories:e})}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=h},{"../..":302,"../../services/polls":374,"./blankslate":9,"./categories-list":10,moment:"moment",react:"react"}],21:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return a.default.createElement("select",{className:e.className||"form-control",disabled:e.disabled||!1,id:e.id||null,onChange:e.onChange,value:e.value},e.choices.map(function(e){return a.default.createElement("option",{disabled:e.disabled||!1,key:e.value,value:e.value},"- - ".repeat(e.level)+e.label)}))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],22:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),i=(o(e("../avatar")),o(e("../button"))),u=o(e("../../services/ajax")),s=o(e("../../services/snackbar"));function o(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return p(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var m=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(l,n.default.Component);var e,t,r,o=d(l);function l(e){var a,t,r,n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),a=o.call(this,e),t=p(a),n=function(){if(a.state.isLoading)return!1;a.setState({isLoading:!0});var e=a.props.upload?"crop_tmp":"crop_src",t=$(".crop-form"),r=t.cropit("exportZoom"),n=t.cropit("offset");u.default.post(a.props.user.api.avatar,{avatar:e,crop:{offset:{x:n.x*r,y:n.y*r},zoom:t.cropit("zoom")*r}}).then(function(e){a.props.onComplete(e),s.default.success(e.detail)},function(e){400===e.status?(s.default.error(e.detail),a.setState({isLoading:!1})):a.props.showError(e)})},(r="cropAvatar")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,a.state={isLoading:!1,deviceRatio:1},a}return e=l,(t=[{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 o=this,l=$(".crop-form"),e=this.getAvatarSize(),t=l.width();t<e;)e/=2;var r=this.getAvatarSize()/e;l.width(e),l.cropit({width:e,height:e,exportZoom:r,imageState:{src:this.getImagePath()},onImageLoaded:function(){var e,t,r,n,a;o.props.upload?(e=l.cropit("zoom"),(t=l.cropit("imageSize")).width>t.height?(r=(t.width*e-o.getAvatarSize())/-2,l.cropit("offset",{x:r,y:0})):t.width<t.height?(n=(t.height*e-o.getAvatarSize())/-2,l.cropit("offset",{x:0,y:n})):l.cropit("offset",{x:0,y:0})):(a=o.props.options.crop_src.crop)&&(l.cropit("zoom",a.zoom),l.cropit("offset",{x:a.x,y:a.y}))}})}},{key:"componentWillUnmount",value:function(){$(".crop-form").cropit("disable")}},{key:"render",value:function(){return n.default.createElement("div",null,n.default.createElement("div",{className:"modal-body modal-avatar-crop"},n.default.createElement("div",{className:"crop-form"},n.default.createElement("div",{className:"cropit-preview"}),n.default.createElement("input",{type:"range",className:"cropit-image-zoom-input"}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("div",{className:"col-md-6 col-md-offset-3"},n.default.createElement(i.default,{onClick:this.cropAvatar,loading:this.state.isLoading,className:"btn-primary btn-block"},this.props.upload?gettext("Set avatar"):gettext("Crop image")),n.default.createElement(i.default,{onClick:this.props.showIndex,disabled:this.state.isLoading,className:"btn-default btn-block"},gettext("Cancel")))))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=m},{"../../services/ajax":365,"../../services/snackbar":376,"../avatar":6,"../button":8,react:"react"}],23:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.GalleryItem=r.Gallery=void 0;var l=s(e("react")),o=(s(e("../avatar")),s(e("../button"))),i=(s(e("../..")),s(e("../../services/ajax"))),u=s(e("../../services/snackbar")),n=s(e("../../utils/batch"));function s(e){return e&&e.__esModule?e:{default:e}}function c(){return(c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t,r){return t&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function m(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=v(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=v(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function g(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var _=function(){m(o,l.default.Component);var a=b(o);function o(){var e;f(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"select",function(){e.props.select(e.props.id)}),e}return p(o,[{key:"getClassName",value:function(){return this.props.selection===this.props.id?this.props.disabled?"btn btn-avatar btn-disabled avatar-selected":"btn btn-avatar avatar-selected":this.props.disabled?"btn btn-avatar btn-disabled":"btn btn-avatar"}},{key:"render",value:function(){return l.default.createElement("button",{type:"button",className:this.getClassName(),disabled:this.props.disabled,onClick:this.select},l.default.createElement("img",{src:this.props.url}))}}]),o}();r.GalleryItem=_;var E=function(){m(t,l.default.Component);var e=b(t);function t(){return f(this,t),e.apply(this,arguments)}return p(t,[{key:"render",value:function(){var r=this;return l.default.createElement("div",{className:"avatars-gallery"},l.default.createElement("h3",null,this.props.name),l.default.createElement("div",{className:"avatars-gallery-images"},(0,n.default)(this.props.images,4,null).map(function(e,t){return l.default.createElement("div",{className:"row",key:t},e.map(function(e,t){return l.default.createElement("div",{className:"col-xs-3",key:t},e?l.default.createElement(_,c({disabled:r.props.disabled,select:r.props.select,selection:r.props.selection},e)):l.default.createElement("div",{className:"blank-avatar"}))}))})))}}]),t}();r.Gallery=E;var w=function(){m(n,l.default.Component);var r=b(n);function n(e){var t;return f(this,n),g(h(t=r.call(this,e)),"select",function(e){t.setState({selection:e})}),g(h(t),"save",function(){return!t.state.isLoading&&(t.setState({isLoading:!0}),void i.default.post(t.props.user.api.avatar,{avatar:"galleries",image:t.state.selection}).then(function(e){t.setState({isLoading:!1}),u.default.success(e.detail),t.props.onComplete(e),t.props.showIndex()},function(e){400===e.status?(u.default.error(e.detail),t.setState({isLoading:!1})):t.props.showError(e)}))}),t.state={selection:null,isLoading:!1},t}return p(n,[{key:"render",value:function(){var r=this;return l.default.createElement("div",null,l.default.createElement("div",{className:"modal-body modal-avatar-gallery"},this.props.options.galleries.map(function(e,t){return l.default.createElement(E,{name:e.name,images:e.images,selection:r.state.selection,disabled:r.state.isLoading,select:r.select,key:t})})),l.default.createElement("div",{className:"modal-footer"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-md-6 col-md-offset-3"},l.default.createElement(o.default,{onClick:this.save,loading:this.state.isLoading,disabled:!this.state.selection,className:"btn-primary btn-block"},this.state.selection?gettext("Save choice"):gettext("Select avatar")),l.default.createElement(o.default,{onClick:this.props.showIndex,disabled:this.state.isLoading,className:"btn-default btn-block"},gettext("Cancel"))))))}}]),n}();r.default=w},{"../..":302,"../../services/ajax":365,"../../services/snackbar":376,"../../utils/batch":380,"../avatar":6,"../button":8,react:"react"}],24:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../avatar")),i=n(e("../button")),u=n(e("../loader")),s=n(e("../../services/ajax")),c=n(e("../../services/snackbar"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,o.default.Component);var e,t,r,n=p(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),b(m(t=n.call(this,e)),"setGravatar",function(){t.callApi("gravatar")}),b(m(t),"setGenerated",function(){t.callApi("generated")}),t.state={isLoading:!1},t}return e=a,(t=[{key:"callApi",value:function(e){var t=this;if(this.state.isLoading)return!1;this.setState({isLoading:!0}),s.default.post(this.props.user.api.avatar,{avatar:e}).then(function(e){t.setState({isLoading:!1}),c.default.success(e.detail),t.props.onComplete(e)},function(e){400===e.status?(c.default.error(e.detail),t.setState({isLoading:!1})):t.props.showError(e)})}},{key:"getGravatarButton",value:function(){return this.props.options.gravatar?o.default.createElement(i.default,{onClick:this.setGravatar,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-gravatar"},gettext("Download my Gravatar")):null}},{key:"getCropButton",value:function(){return this.props.options.crop_src?o.default.createElement(i.default,{className:"btn-default btn-block btn-avatar-crop",disabled:this.state.isLoading,onClick:this.props.showCrop},gettext("Re-crop uploaded image")):null}},{key:"getUploadButton",value:function(){return this.props.options.upload?o.default.createElement(i.default,{className:"btn-default btn-block btn-avatar-upload",disabled:this.state.isLoading,onClick:this.props.showUpload},gettext("Upload new image")):null}},{key:"getGalleryButton",value:function(){return this.props.options.galleries?o.default.createElement(i.default,{className:"btn-default btn-block btn-avatar-gallery",disabled:this.state.isLoading,onClick:this.props.showGallery},gettext("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?o.default.createElement("div",{className:"avatar-preview preview-loading"},o.default.createElement(l.default,{size:"200",user:e}),o.default.createElement(u.default,null)):o.default.createElement("div",{className:"avatar-preview"},o.default.createElement(l.default,{size:"200",user:e}))}},{key:"render",value:function(){return o.default.createElement("div",{className:"modal-body modal-avatar-index"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-md-5"},this.getAvatarPreview()),o.default.createElement("div",{className:"col-md-7"},this.getGravatarButton(),o.default.createElement(i.default,{onClick:this.setGenerated,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-generate"},gettext("Generate my individual avatar")),this.getCropButton(),this.getUploadButton(),this.getGalleryButton())))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h},{"../../services/ajax":365,"../../services/snackbar":376,"../avatar":6,"../button":8,"../loader":58,react:"react"}],25:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.ChangeAvatarError=void 0,r.select=function(e){return{user:e.auth.user}};var n=o(e("react")),l=o(e("./index")),i=o(e("./crop")),u=o(e("./upload")),s=o(e("./gallery")),c=o(e("../modal-loader")),f=e("../../reducers/users"),d=o(e("../../services/ajax")),p=o(e("../../services/store"));function o(e){return e&&e.__esModule?e:{default:e}}function m(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function y(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t,r){return t&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function v(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=w(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=w(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function w(e){return(w=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var O=function(){v(t,n.default.Component);var e=_(t);function t(){return y(this,t),e.apply(this,arguments)}return h(t,[{key:"getErrorReason",value:function(){return this.props.reason?n.default.createElement("p",{dangerouslySetInnerHTML:{__html:this.props.reason}}):null}},{key:"render",value:function(){return n.default.createElement("div",{className:"modal-body"},n.default.createElement("div",{className:"message-icon"},n.default.createElement("span",{className:"material-icon"},"remove_circle_outline")),n.default.createElement("div",{className:"message-body"},n.default.createElement("p",{className:"lead"},this.props.message),this.getErrorReason(),n.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok"))))}}]),t}();r.ChangeAvatarError=O;var j=function(){v(o,n.default.Component);var a=_(o);function o(){var t;y(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return m(E(t=a.call.apply(a,[this].concat(r))),"showError",function(e){t.setState({error:e})}),m(E(t),"showIndex",function(){t.setState({component:l.default})}),m(E(t),"showUpload",function(){t.setState({component:u.default})}),m(E(t),"showCrop",function(){t.setState({component:i.default})}),m(E(t),"showGallery",function(){t.setState({component:s.default})}),m(E(t),"completeFlow",function(e){p.default.dispatch((0,f.updateAvatar)(t.props.user,e.avatars)),t.setState({component:l.default,options:e})}),t}return h(o,[{key:"componentDidMount",value:function(){var t=this;d.default.get(this.props.user.api.avatar).then(function(e){t.setState({component:l.default,options:e,error:null})},function(e){t.showError(e)})}},{key:"getBody",value:function(){return this.state?this.state.error?n.default.createElement(O,{message:this.state.error.detail,reason:this.state.error.reason}):n.default.createElement(this.state.component,{options:this.state.options,user:this.props.user,onComplete:this.completeFlow,showError:this.showError,showIndex:this.showIndex,showCrop:this.showCrop,showUpload:this.showUpload,showGallery:this.showGallery}):n.default.createElement(c.default,null)}},{key:"getClassName",value:function(){return this.state&&this.state.error?"modal-dialog modal-message modal-change-avatar":"modal-dialog modal-change-avatar"}},{key:"render",value:function(){return n.default.createElement("div",{className:this.getClassName(),role:"document"},n.default.createElement("div",{className:"modal-content"},n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Change your avatar"))),this.getBody()))}}]),o}();r.default=j},{"../../reducers/users":364,"../../services/ajax":365,"../../services/store":377,"../modal-loader":61,"./crop":22,"./gallery":23,"./index":24,"./upload":26,react:"react"}],26:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),l=o(e("./crop")),i=o(e("../button")),u=o(e("../../services/ajax")),s=o(e("../../services/snackbar")),c=o(e("../../utils/file-size"));function o(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(o,n.default.Component);var e,t,r,a=p(o);function o(e){var n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o),b(m(n=a.call(this,e)),"pickFile",function(){document.getElementById("avatar-hidden-upload").click()}),b(m(n),"uploadFile",function(){var e,t,r=document.getElementById("avatar-hidden-upload").files[0];r&&((e=n.validateFile(r))?s.default.error(e):(n.setState({image:r,preview:URL.createObjectURL(r),progress:0}),(t=new FormData).append("avatar","upload"),t.append("image",r),u.default.upload(n.props.user.api.avatar,t,function(e){n.setState({progress:e})}).then(function(e){n.setState({options:e,uploaded:e.detail}),s.default.info(gettext("Your image has been uploaded and you may now crop it."))},function(e){400===e.status||413===e.status?(s.default.error(e.detail),n.setState({isLoading:!1,image:null,progress:0})):n.props.showError(e)})))}),n.state={image:null,preview:null,progress:0,uploaded:null,dataUrl:null},n}return e=o,(t=[{key:"validateFile",value:function(e){if(e.size>this.props.options.upload.limit)return interpolate(gettext("Selected file is too big. (%(filesize)s)"),{filesize:(0,c.default)(e.size)},!0);var t=gettext("Selected file type is not supported.");if(-1===this.props.options.upload.allowed_mime_types.indexOf(e.type))return t;var r=!1,n=e.name.toLowerCase();return this.props.options.upload.allowed_extensions.map(function(e){n.substr(-1*e.length)===e&&(r=!0)}),!r&&t}},{key:"getUploadRequirements",value:function(e){var t=e.allowed_extensions.map(function(e){return e.substr(1)});return interpolate(gettext("%(files)s files smaller than %(limit)s"),{files:t.join(", "),limit:(0,c.default)(e.limit)},!0)}},{key:"getUploadButton",value:function(){return n.default.createElement("div",{className:"modal-body modal-avatar-upload"},n.default.createElement(i.default,{className:"btn-pick-file",onClick:this.pickFile},n.default.createElement("div",{className:"material-icon"},"input"),gettext("Select file")),n.default.createElement("p",{className:"text-muted"},this.getUploadRequirements(this.props.options.upload)))}},{key:"getUploadProgressLabel",value:function(){return interpolate(gettext("%(progress)s % complete"),{progress:this.state.progress},!0)}},{key:"getUploadProgress",value:function(){return n.default.createElement("div",{className:"modal-body modal-avatar-upload"},n.default.createElement("div",{className:"upload-progress"},n.default.createElement("img",{src:this.state.preview}),n.default.createElement("div",{className:"progress"},n.default.createElement("div",{className:"progress-bar",role:"progressbar","aria-valuenow":"{this.state.progress}","aria-valuemin":"0","aria-valuemax":"100",style:{width:this.state.progress+"%"}},n.default.createElement("span",{className:"sr-only"},this.getUploadProgressLabel())))))}},{key:"renderUpload",value:function(){return n.default.createElement("div",null,n.default.createElement("input",{type:"file",id:"avatar-hidden-upload",className:"hidden-file-upload",onChange:this.uploadFile}),this.state.image?this.getUploadProgress():this.getUploadButton(),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("div",{className:"col-md-6 col-md-offset-3"},n.default.createElement(i.default,{onClick:this.props.showIndex,disabled:!!this.state.image,className:"btn-default btn-block"},gettext("Cancel")))))}},{key:"renderCrop",value:function(){return n.default.createElement(l.default,{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()}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=h},{"../../services/ajax":365,"../../services/snackbar":376,"../../utils/file-size":384,"../button":8,"./crop":22,react:"react"}],27:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getClassName",value:function(){return this.props.dropdown?"btn btn-default btn-aligned btn-icon btn-dropdown-toggle open hidden-md hidden-lg":"btn btn-default btn-aligned btn-icon btn-dropdown-toggle hidden-md hidden-lg"}},{key:"render",value:function(){return o.default.createElement("button",{className:this.getClassName(),type:"button",onClick:this.props.toggleNav,"aria-haspopup":"true","aria-expanded":this.props.dropdown?"true":"false"},o.default.createElement("i",{className:"material-icon"},"menu"))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],28:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.display?n.default.createElement(a.default,{helpText:gettext("No profile details are editable at this time."),message:gettext("This option is currently unavailable.")}):null};var n=o(e("react")),a=o(e("../panel-message"));function o(e){return e&&e.__esModule?e:{default:e}}},{"../panel-message":94,react:"react"}],29:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../select"));function n(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(u,o.default.Component);var e,t,r,i=f(u);function u(){var n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var e,t,r,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return n=i.call.apply(i,[this].concat(o)),e=d(n),r=function(e){var t=n.props,r=t.field;(0,t.onChange)(r.fieldname,e.target.value)},(t="onChange")in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,n}return e=u,(t=[{key:"render",value:function(){var e=this.props,t=e.disabled,r=e.field,n=e.value,a=r.input;return"select"===a.type?o.default.createElement(l.default,{choices:a.choices,disabled:t,id:"id_"+r.fieldname,onChange:this.onChange,value:n}):"textarea"===a.type?o.default.createElement("textarea",{className:"form-control",disabled:t,id:"id_"+r.fieldname,onChange:this.onChange,rows:"4",type:"text",value:n}):"text"===a.type?o.default.createElement("input",{className:"form-control",disabled:t,id:"id_"+r.fieldname,onChange:this.onChange,type:"text",value:n}):null}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../select":210,react:"react"}],30:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.disabled,r=e.errors,n=e.fields,a=e.name,o=e.onChange,l=e.value;return i.default.createElement("fieldset",null,i.default.createElement("legend",null,a),n.map(function(e){return i.default.createElement(s.default,{for:"id_"+e.fieldname,helpText:e.help_text,key:e.fieldname,label:e.label,validation:r[e.fieldname]},i.default.createElement(u.default,{disabled:t,field:e,onChange:o,value:l[e.fieldname]}))}))};var i=n(e("react")),u=n(e("./field-input")),s=n(e("../form-group"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../form-group":55,"./field-input":29,react:"react"}],31:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.CancelButton=v,r.default=void 0;var n=s(e("react")),o=s(e("./fieldset")),l=s(e("../button")),i=s(e("../form")),u=s(e("../../services/ajax")),f=s(e("../../services/snackbar"));function s(e){return e&&e.__esModule?e:{default:e}}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(c,i.default);var e,t,r,s=m(c);function c(e){var r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,c),b(y(r=s.call(this,e)),"onChange",function(e,t){r.setState(b({},e,t))}),r.state={isLoading:!1,errors:{}};for(var t=e.groups.length,n=0;n<t;n++)for(var a=e.groups[n],o=a.fields.length,l=0;l<o;l++){var i=a.fields[l].fieldname,u=a.fields[l].initial;r.state[i]=u}return r}return e=c,(t=[{key:"send",value:function(){var e=Object.assign({},this.state,{errors:null,isLoading:null});return u.default.post(this.props.api,e)}},{key:"handleSuccess",value:function(e){this.props.onSuccess(e)}},{key:"handleError",value:function(e){400===e.status?(f.default.error(gettext("Form contains errors.")),this.setState({errors:e})):f.default.apiError(e)}},{key:"render",value:function(){var r=this;return n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"panel-body"},this.props.groups.map(function(e,t){return n.default.createElement(o.default,{disabled:r.state.isLoading,errors:r.state.errors,fields:e.fields,name:e.name,key:t,onChange:r.onChange,value:r.state})})),n.default.createElement("div",{className:"panel-footer text-right"},n.default.createElement(v,{disabled:this.state.isLoading,onCancel:this.props.onCancel})," ",n.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Save changes"))))}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),c}();function v(e){var t=e.onCancel,r=e.disabled;return t?n.default.createElement("button",{className:"btn btn-default",disabled:r,onClick:t,type:"button"},gettext("Cancel")):null}r.default=h},{"../../services/ajax":365,"../../services/snackbar":376,"../button":8,"../form":56,"./fieldset":30,react:"react"}],32:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.FormDisplay=b,r.default=void 0;var l=n(e("react")),o=n(e("./blankslate")),i=n(e("./loader")),u=n(e("./form")),s=n(e("../../services/ajax")),c=n(e("../../services/snackbar"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=m(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=m(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var y=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,l.default.Component);var e,t,r,n=p(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={loading:!0,groups:null},t}return e=a,(t=[{key:"componentDidMount",value:function(){var t=this;s.default.get(this.props.api).then(function(e){t.setState({loading:!1,groups:e})},function(e){c.default.apiError(e),t.props.cancel&&t.props.cancel()})}},{key:"render",value:function(){var e=this.state,t=e.groups,r=e.loading;return l.default.createElement("div",{className:"panel panel-default panel-form"},l.default.createElement("div",{className:"panel-heading"},l.default.createElement("h3",{className:"panel-title"},gettext("Edit details"))),l.default.createElement(i.default,{display:r}),l.default.createElement(o.default,{display:!r&&!t.length}),l.default.createElement(b,{api:this.props.api,display:!r&&t.length,groups:t,onCancel:this.props.onCancel,onSuccess:this.props.onSuccess}))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function b(e){var t=e.api,r=e.display,n=e.groups,a=e.onCancel,o=e.onSuccess;return r?l.default.createElement(u.default,{api:t,groups:n,onCancel:a,onSuccess:o}):null}r.default=y},{"../../services/ajax":365,"../../services/snackbar":376,"./blankslate":28,"./form":31,"./loader":33,react:"react"}],33:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.display?n.default.createElement("div",{className:"panel-body"},n.default.createElement(a.default,null)):null};var n=o(e("react")),a=o(e("../loader"));function o(e){return e&&e.__esModule?e:{default:e}}},{"../loader":58,react:"react"}],34:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return f(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(u,o.default.Component);var e,t,r,i=c(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=f(e),n=function(){e.props.replaceSelection(e.props.execAction)},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return o.default.createElement("button",{className:"btn btn-icon "+this.props.className,disabled:this.props.disabled,onClick:this.onClick,title:this.props.title,type:"button"},this.props.children)}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{react:"react"}],35:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Insert code")},e),n.default.createElement("span",{className:"material-icon"},"functions"))},r.insertCode=i;var n=o(e("react")),a=o(e("./action"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){t("\n\n```"+$.trim(prompt(gettext("Enter name of syntax of your code (optional)")+":"))+"\n"+e+"\n```\n\n")}},{"./action":34,react:"react"}],36:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Emphase selection")},e),n.default.createElement("span",{className:"material-icon"},"format_italic"))},r.makeEmphasis=i;var n=o(e("react")),a=o(e("./action"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){e.length&&t("*"+e+"*")}},{"./action":34,react:"react"}],37:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Insert horizontal ruler")},e),n.default.createElement("span",{className:"material-icon"},"remove"))},r.insertHr=i;var n=o(e("react")),a=o(e("./action"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){t("\n\n- - - - -\n\n")}},{"./action":34,react:"react"}],38:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,i({execAction:u,title:gettext("Insert image")},e),n.default.createElement("span",{className:"material-icon"},"insert_photo"))},r.insertImage=u;var n=l(e("react")),a=l(e("./action")),o=l(e("../../../utils/is-url"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){return(i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function u(e,t){var r="",n="";e.length&&((0,o.default)(e)?r=e:n=e),(r=$.trim(prompt(gettext("Enter link to image")+":",r))).length&&(0<(n=$.trim(prompt(gettext("Enter image label (optional)")+":",n))).length?t("!["+n+"]("+r+")"):t("!("+r+")"))}},{"../../../utils/is-url":385,"./action":34,react:"react"}],39:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,i({execAction:u,title:gettext("Insert link")},e),n.default.createElement("span",{className:"material-icon"},"insert_link"))},r.insertLink=u;var n=l(e("react")),a=l(e("./action")),o=l(e("../../../utils/is-url"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){return(i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function u(e,t){var r="",n="";if(e.length&&((0,o.default)(e)?r=e:n=e),0===(r=$.trim(prompt(gettext("Enter link address")+":",r)||"")).length)return!1;n=$.trim(prompt(gettext("Enter link label (optional)")+":",n)),r.length&&(0<n.length?t("["+n+"]("+r+")"):t(r))}},{"../../../utils/is-url":385,"./action":34,react:"react"}],40:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Insert quote")},e),n.default.createElement("span",{className:"material-icon"},"format_quote"))},r.insertQuote=i;var n=o(e("react")),a=o(e("./action"));o(e("../../../utils/is-url"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){var r=$.trim(prompt(gettext("Enter quote autor, prefix usernames with @")+":",r));t(r?'\n\n[quote="'+r+'"]\n'+e+"\n[/quote]\n\n":"\n\n[quote]\n"+e+"\n[/quote]\n\n")}},{"../../../utils/is-url":385,"./action":34,react:"react"}],41:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Insert spoiler")},e),n.default.createElement("span",{className:"material-icon"},"not_interested"))},r.insertSpoiler=i;var n=o(e("react")),a=o(e("./action"));o(e("../../../utils/is-url"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){t("\n\n[spoiler]\n"+e+"\n[/spoiler]\n\n")}},{"../../../utils/is-url":385,"./action":34,react:"react"}],42:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Strikethrough selection")},e),n.default.createElement("span",{className:"material-icon"},"format_strikethrough"))},r.makeStrikethrough=i;var n=o(e("react")),a=o(e("./action"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){e.length&&t("~~"+e+"~~")}},{"./action":34,react:"react"}],43:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,l({execAction:i,title:gettext("Bolder selection")},e),n.default.createElement("span",{className:"material-icon"},"format_bold"))},r.makeStrong=i;var n=o(e("react")),a=o(e("./action"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){e.length&&t("**"+e+"**")}},{"./action":34,react:"react"}],44:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Actions=j,r.Details=O,r.Filename=w,r.Icon=E,r.Image=_,r.Insert=P,r.Preview=g,r.Remove=k,r.Undo=x,r.default=void 0;var l=n(e("react")),o=(n(e("../../../..")),n(e("../../../../utils/escape-html"))),i=n(e("../../../../utils/file-size"));function n(e){return e&&e.__esModule?e:{default:e}}function u(){return(u=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=p(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=p(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function p(e){return(p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function m(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var y='<abbr title="%(absolute)s">%(relative)s</abbr>',b='<span class="item-title">%(user)s</span>',h='<a href="%(url)s" class="item-title">%(user)s</a>',v=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(o,l.default.Component);var e,t,r,a=f(o);function o(){var n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return m(d(n=a.call.apply(a,[this].concat(t))),"onInsert",function(){n.props.replaceSelection(n.insertAttachment)}),m(d(n),"insertAttachment",function(e,t){var r=n.props.item;r.is_image?r.url.thumb?t("[!["+r.filename+"]("+r.url.thumb+")]("+r.url.index+")"):t("[!["+r.filename+"]("+r.url.index+")]("+r.url.index+")"):t("["+r.filename+"]("+r.url.index+")")}),m(d(n),"onRemove",function(){n.updateItem({isRemoved:!0})}),m(d(n),"onUndo",function(){n.updateItem({isRemoved:!1})}),m(d(n),"updateItem",function(t){var e=n.props.attachments.map(function(e){return e.id===n.props.item.id?Object.assign({},e,t):e});n.props.onAttachmentsChange(e)}),n}return e=o,(t=[{key:"render",value:function(){return l.default.createElement("li",{className:"editor-attachment-complete"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-xs-12 col-sm-8 col-md-9"},l.default.createElement(g,this.props),l.default.createElement("div",{className:"editor-attachment-details"},l.default.createElement(w,this.props),l.default.createElement(O,this.props))),l.default.createElement("div",{className:"col-xs-12 col-sm-4 col-md-3 xs-margin-top-half"},l.default.createElement(j,u({onInsert:this.onInsert,onRemove:this.onRemove,onUndo:this.onUndo},this.props)))))}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();function g(e){return e.item.is_image?l.default.createElement(_,e):l.default.createElement(E,e)}function _(e){var t=e.item.url.thumb||e.item.url.index;return l.default.createElement("div",{className:"editor-attachment-image"},l.default.createElement("a",{href:e.item.url.index+"?shva=1",style:{backgroundImage:"url('"+t+"?shva=1')"},target:"_blank"}))}function E(e){return l.default.createElement("div",{className:"editor-attachment-icon"},l.default.createElement("span",{className:"material-icon"},"insert_drive_file"))}function w(e){return l.default.createElement("h4",null,l.default.createElement("a",{className:"item-title",href:e.item.url.index+"?shva=1",target:"_blank"},e.item.filename))}function O(e){var t=null,t=e.item.url.uploader?interpolate(h,{url:(0,o.default)(e.item.url.uploader),user:(0,o.default)(e.item.uploader_name)},!0):interpolate(b,{user:(0,o.default)(e.item.uploader_name)},!0),r=interpolate(y,{absolute:(0,o.default)(e.item.uploaded_on.format("LLL")),relative:(0,o.default)(e.item.uploaded_on.fromNow())},!0),n=interpolate((0,o.default)(gettext("%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.")),{filetype:e.item.filetype,size:(0,i.default)(e.item.size),uploader:t,uploaded_on:r},!0);return l.default.createElement("p",{dangerouslySetInnerHTML:{__html:n}})}function j(e){return l.default.createElement("div",{className:"editor-attachment-actions"},l.default.createElement("div",{className:"row"},l.default.createElement(P,e),l.default.createElement(k,e),l.default.createElement(x,e)))}function P(e){return e.item.isRemoved?null:l.default.createElement("div",{className:"col-xs-6"},l.default.createElement("button",{className:"btn btn-default btn-sm btn-block",onClick:e.onInsert,type:"button"},gettext("Insert")))}function k(e){return e.item.isRemoved&&e.item.acl.can_delete?null:l.default.createElement("div",{className:"col-xs-6"},l.default.createElement("button",{className:"btn btn-default btn-sm btn-block",onClick:e.onRemove,type:"button"},gettext("Remove")))}function x(e){return e.item.isRemoved?l.default.createElement("div",{className:"col-xs-12"},l.default.createElement("button",{className:"btn btn-default btn-sm btn-block",onClick:e.onUndo,type:"button"},gettext("Undo removal"))):null}r.default=v},{"../../../..":302,"../../../../utils/escape-html":383,"../../../../utils/file-size":384,react:"react"}],45:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=l(e("react")),o=l(e("../../../../utils/escape-html"));function l(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(u,n.default.Component);var e,t,r,i=f(u);function u(){var t;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var e,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return t=i.call.apply(i,[this].concat(o)),e=d(t),n=function(){var e=t.props.attachments.filter(function(e){return e.key!==t.props.item.key});t.props.onAttachmentsChange(e)},(r="onClick")in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,t}return e=u,(t=[{key:"render",value:function(){var e=interpolate("<strong>%(name)s</strong>",{name:(0,o.default)(this.props.item.filename)},!0),t=interpolate(gettext("Error uploading %(filename)s"),{filename:e,progress:this.props.item.progress+"%"},!0);return n.default.createElement("li",{className:"editor-attachment-error"},n.default.createElement("div",{className:"editor-attachment-error-icon"},n.default.createElement("span",{className:"material-icon"},"warning")),n.default.createElement("div",{className:"editor-attachment-error-message"},n.default.createElement("h4",{dangerouslySetInnerHTML:{__html:t+":"}}),n.default.createElement("p",null,this.props.item.error),n.default.createElement("button",{className:"btn btn-default btn-sm",onClick:this.onClick,type:"button"},gettext("Dismiss"))))}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../../../../utils/escape-html":383,react:"react"}],46:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){if(e.item.id)return n.default.createElement(a.default,e);if(e.item.error)return n.default.createElement(o.default,e);return n.default.createElement(l.default,e)};var n=i(e("react")),a=i(e("./complete")),o=i(e("./error")),l=i(e("./upload"));i(e("../../../..")),i(e("../../../../utils/escape-html"));function i(e){return e&&e.__esModule?e:{default:e}}},{"../../../..":302,"../../../../utils/escape-html":383,"./complete":44,"./error":45,"./upload":47,react:"react"}],47:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=interpolate(l,{name:(0,a.default)(e.item.filename)},!0),r=interpolate(gettext("Uploading %(filename)s... %(progress)s"),{filename:t,progress:e.item.progress+"%"},!0);return n.default.createElement("li",{className:"editor-attachment-upload"},n.default.createElement("div",{className:"editor-attachment-progress-bar"},n.default.createElement("div",{className:"editor-attachment-progress",style:{width:e.item.progress+"%"}})),n.default.createElement("p",{className:"editor-attachment-upload-message",dangerouslySetInnerHTML:{__html:r}}))};var n=o(e("react")),a=o(e("../../../../utils/escape-html"));function o(e){return e&&e.__esModule?e:{default:e}}var l="<strong>%(name)s</strong>"},{"../../../../utils/escape-html":383,react:"react"}],48:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return l.default.get("user").acl.max_attachment_size?n.default.createElement("div",{className:"editor-attachments"},n.default.createElement(a.default,e),n.default.createElement(o.default,e)):null};var n=i(e("react")),a=i(e("./list")),o=i(e("./uploader")),l=i(e("../../.."));function i(e){return e&&e.__esModule?e:{default:e}}},{"../../..":302,"./list":49,"./uploader":51,react:"react"}],49:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(t){return n.default.createElement("ul",{className:"list-unstyled editor-attachments-list"},t.attachments.map(function(e){return n.default.createElement(a.default,l({item:e,key:e.id||e.key},t))}))};var n=o(e("react")),a=o(e("./attachment"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}},{"./attachment":46,react:"react"}],50:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=l(e("react")),o=l(e("../../.."));function l(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(u,n.default.Component);var e,t,r,i=f(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=d(e),n=function(){document.getElementById("editor-upload-field").click()},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return o.default.get("user").acl.max_attachment_size?n.default.createElement("button",{className:"btn btn-icon "+this.props.className,disabled:this.props.disabled,onClick:this.onClick,title:gettext("Upload file"),type:"button"},n.default.createElement("span",{className:"material-icon"},"file_upload")):null}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../../..":302,react:"react"}],51:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.getRandomKey=b;var n=o(e("react")),s=o(e("moment")),c=o(e("../../..")),f=o(e("../../../services/ajax")),d=o(e("../../../services/snackbar"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(u,n.default.Component);var e,t,r,i=m(u);function u(){var a;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var e,t,r,n=arguments.length,o=new Array(n),l=0;l<n;l++)o[l]=arguments[l];return a=i.call.apply(i,[this].concat(o)),e=y(a),r=function(e){var t,r,n=e.target.files[0];n&&(t={id:null,key:b(),progress:0,error:null,filename:n.name},a.props.onAttachmentsChange([t].concat(a.props.attachments)),(r=new FormData).append("upload",n),f.default.upload(c.default.get("ATTACHMENTS_API"),r,function(e){t.progress=e,a.props.onAttachmentsChange(a.props.attachments.concat())}).then(function(e){e.uploaded_on=(0,s.default)(e.uploaded_on),Object.assign(t,e),a.props.onAttachmentsChange(a.props.attachments.concat())},function(e){400===e.status||413===e.status?(t.error=e.detail,a.props.onAttachmentsChange(a.props.attachments.concat())):d.default.apiError(e)}))},(t="onChange")in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,a}return e=u,(t=[{key:"render",value:function(){return n.default.createElement("input",{id:"editor-upload-field",onChange:this.onChange,type:"file"})}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();function b(){return"upld-"+Math.round((new Date).getTime())}r.default=u},{"../../..":302,"../../../services/ajax":365,"../../../services/snackbar":376,moment:"moment",react:"react"}],52:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Protect=M,r.default=void 0;var o=n(e("react")),l=n(e("./actions/code")),u=n(e("./actions/emphasis")),s=n(e("./actions/hr")),c=n(e("./actions/image")),f=n(e("./actions/link")),d=n(e("./actions/spoiler")),p=n(e("./actions/strikethrough")),m=n(e("./actions/strong")),y=n(e("./actions/quote")),b=n(e("./attachments")),h=n(e("./attachments/upload-button")),v=n(e("./markup-preview")),g=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=P(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./textutils")),_=n(e("../button")),E=n(e("../..")),w=n(e("../../services/ajax")),O=n(e("../../services/modal")),j=n(e("../../services/snackbar"));function P(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(P=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function k(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function x(e,t){return(x=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function N(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return S(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function S(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function R(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var C=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&x(e,t)}(a,o.default.Component);var e,t,r,n=N(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),R(S(t=n.call(this,e)),"onPreviewClick",function(){t.state.isPreviewLoading||(t.setState({isPreviewLoading:!0}),w.default.post(E.default.get("PARSE_MARKUP_API"),{post:t.props.value}).then(function(e){O.default.show(o.default.createElement(v.default,{markup:e.parsed})),t.setState({isPreviewLoading:!1})},function(e){400===e.status?j.default.error(e.detail):j.default.apiError(e),t.setState({isPreviewLoading:!1})}))}),R(S(t),"replaceSelection",function(e){e(g.getSelectionText(),t._replaceSelection)}),R(S(t),"_replaceSelection",function(e){t.props.onChange({target:{value:g.replace(e)}})}),t.state={isPreviewLoading:!1},t}return e=a,(t=[{key:"componentDidMount",value:function(){var n=this;$("#editor-textarea").atwho({at:"@",displayTpl:'<li><img src="${avatar}" alt="">${username}</li>',insertTpl:"@${username}",searchKey:"username",callbacks:{remoteFilter:function(e,t){$.getJSON(E.default.get("MENTION_API"),{q:e},t)}}}),$("#editor-textarea").on("inserted.atwho",function(e,t,r){n.props.onChange(e)})}},{key:"render",value:function(){return o.default.createElement("div",{className:"editor-border"},o.default.createElement("textarea",{className:"form-control",value:this.props.value,disabled:this.props.loading,id:"editor-textarea",onChange:this.props.onChange,rows:"9"}),o.default.createElement("div",{className:"editor-footer"},o.default.createElement("div",{className:"buttons-list pull-left"},o.default.createElement(m.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(u.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(p.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(s.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(f.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(c.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(y.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(d.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(l.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,replaceSelection:this.replaceSelection}),o.default.createElement(h.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading})),o.default.createElement(_.default,{className:"btn-default btn-sm pull-left",disabled:this.props.loading||this.state.isPreviewLoading,onClick:this.onPreviewClick,type:"button"},gettext("Preview")),o.default.createElement(_.default,{className:"btn-primary btn-sm pull-right",loading:this.props.loading},this.props.submitLabel||gettext("Post")),o.default.createElement("button",{className:"btn btn-default btn-sm pull-right",disabled:this.props.loading,onClick:this.props.onCancel,type:"button"},gettext("Cancel")),o.default.createElement("div",{className:"clearfix visible-xs-block"}),o.default.createElement(M,{canProtect:this.props.canProtect,disabled:this.props.loading,onProtect:this.props.onProtect,onUnprotect:this.props.onUnprotect,protect:this.props.protect})),o.default.createElement(b.default,{attachments:this.props.attachments,onAttachmentsChange:this.props.onAttachmentsChange,placeholder:this.props.placeholder,replaceSelection:this.replaceSelection}))}}])&&k(e.prototype,t),r&&k(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function M(e){if(!e.canProtect)return null;var t=e.protect?gettext("Protected"):gettext("Protect");return o.default.createElement("button",{className:"btn btn-icon btn-default btn-protect btn-sm pull-right",disabled:e.disabled,onClick:e.protect?e.onUnprotect:e.onProtect,title:t,type:"button"},o.default.createElement("span",{className:"material-icon"},e.protect?"lock":"lock_outline"),o.default.createElement("span",{className:"btn-text hidden-md hidden-lg"},t))}r.default=C},{"../..":302,"../../services/ajax":365,"../../services/modal":371,"../../services/snackbar":376,"../button":8,"./actions/code":35,"./actions/emphasis":36,"./actions/hr":37,"./actions/image":38,"./actions/link":39,"./actions/quote":40,"./actions/spoiler":41,"./actions/strikethrough":42,"./actions/strong":43,"./attachments":48,"./attachments/upload-button":50,"./markup-preview":53,"./textutils":54,react:"react"}],53:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement("div",{className:"modal-dialog",role:"document"},n.default.createElement("div",{className:"modal-content"},n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Preview message"))),n.default.createElement("div",{className:"modal-body markup-preview"},n.default.createElement(a.default,{markup:e.markup}))))};var n=o(e("react")),a=o(e("../misago-markup"));function o(e){return e&&e.__esModule?e:{default:e}}},{"../misago-markup":60,react:"react"}],54:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r._replace=s,r.getSelection=i,r.getSelectionRange=l,r.getSelectionText=function(){var e=i();return $.trim(a().substring(e.start,e.end))},r.getTextarea=o,r.getValue=a,r.replace=function(e){return s(i(),e)},r.setSelection=u,r.textareaId=void 0;var n="editor-textarea";function o(){return document.getElementById(n)}function a(){return document.getElementById(n).value}function l(e,t){return{start:e,end:t}}function i(){var e=o();if(document.selection){e.focus();var t=document.selection.createRange(),r=t.text.length;return t.moveStart("character",-e.value.length),l(t.text.length-r,t.text.length)}if(e.selectionStart||"0"==e.selectionStart)return l(e.selectionStart,e.selectionEnd)}function u(e){var t,r=o();r.setSelectionRange?(r.focus(),r.setSelectionRange(e.start,e.end)):r.createTextRange&&((t=r.createTextRange()).collapse(!0),t.moveStart("character",e.start),t.moveEnd("character",e.end),t.select())}function s(e,t){var r=o(),n=r.value,a=n.substring(0,e.start);return r.value=n.substring(0,e.start)+t+n.substring(e.end),u(l(a.length+t.length,a.length+t.length)),r.value}r.textareaId=n},{}],55:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{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 r=this;return this.props.validation?o.default.createElement("div",{className:"help-block errors"},this.props.validation.map(function(e,t){return o.default.createElement("p",{key:r.props.for+"FeedbackItem"+t},e)})):null}},{key:"getFeedbackDescription",value:function(){return this.isValidated()?o.default.createElement("span",{id:this.props.for+"_status",className:"sr-only"},this.props.validation?gettext("(error)"):gettext("(success)")):null}},{key:"getHelpText",value:function(){return this.props.helpText?o.default.createElement("p",{className:"help-block"},this.props.helpText):null}},{key:"render",value:function(){return o.default.createElement("div",{className:this.getClassName()},o.default.createElement("label",{className:"control-label "+(this.props.labelClass||""),htmlFor:this.props.for||""},this.props.label+":"),o.default.createElement("div",{className:this.props.controlClass||""},this.props.children,this.getFeedbackDescription(),this.getFeedback(),this.getHelpText(),this.props.extra||null))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],56:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var l=o(e("react")),n=e("../utils/validators"),i=o(e("../services/snackbar"));function o(e){return e&&e.__esModule?e:{default:e}}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=d(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return f(e)}(this,n?(e=d(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function d(e){return(d=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function p(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var m=(0,n.required)(),y=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(o,l.default.Component);var e,t,r,n=c(o);function o(){var a;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return p(f(a=n.call.apply(n,[this].concat(t))),"bindInput",function(t){return function(e){a.changeValue(t,e.target.value)}}),p(f(a),"changeValue",function(e,t){var r=p({},e,t),n=a.state.errors||{};n[e]=a.validateField(e,r[e]),r.errors=n,a.setState(r)}),p(f(a),"handleSubmit",function(e){var t;e&&e.preventDefault(),a.state.isLoading||a.clean()&&(a.setState({isLoading:!0}),(t=a.send())?t.then(function(e){a.setState({isLoading:!1}),a.handleSuccess(e)},function(e){a.setState({isLoading:!1}),a.handleError(e)}):a.setState({isLoading:!1}))}),a}return e=o,(t=[{key:"validate",value:function(){var e={};if(!this.state.validators)return e;var t={required:this.state.validators.required||this.state.validators,optional:this.state.validators.optional||{}},r=[];for(var n in t.required)t.required.hasOwnProperty(n)&&t.required[n]&&r.push(n);for(var a in t.optional)t.optional.hasOwnProperty(a)&&t.optional[a]&&r.push(a);for(var o in r){var l=r[o],i=this.validateField(l,this.state[l]);null===i?e[l]=null:i&&(e[l]=i)}return e}},{key:"isValid",value:function(){var e=this.validate();for(var t in e)if(e.hasOwnProperty(t)&&null!==e[t])return!1;return!0}},{key:"validateField",value:function(e,t){var r=[];if(!this.state.validators)return r;var n={required:(this.state.validators.required||this.state.validators)[e],optional:(this.state.validators.optional||{})[e]},a=m(t)||!1;if(n.required){if(a)r=[a];else for(var o in n.required){var l=n.required[o](t);l&&r.push(l)}return r.length?r:null}if(!1===a&&n.optional){for(var i in n.optional){var u=n.optional[i](t);u&&r.push(u)}return r.length?r:null}return!1}},{key:"clean",value:function(){return!0}},{key:"send",value:function(){return null}},{key:"handleSuccess",value:function(){}},{key:"handleError",value:function(e){i.default.apiError(e)}}])&&u(e.prototype,t),r&&u(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=y},{"../services/snackbar":376,"../utils/validators":393,react:"react"}],57:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{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 o.default.createElement("li",{className:this.getClassName()},this.props.children)}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],58:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return a.default.createElement("div",{className:e.className||"loader"},a.default.createElement("div",{className:"loader-spinning-wheel"}))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],59:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.BestAnswerSelect=v,r.PollSelect=g,r.default=void 0;var o=n(e("react")),l=n(e("./button")),i=n(e("./form")),u=n(e("./form-group")),s=n(e("../services/ajax")),c=n(e("../services/modal"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,i.default);var e,t,r,n=p(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),b(m(t=n.call(this,e)),"handleSuccess",function(e){t.props.onSuccess(e),c.default.hide()}),b(m(t),"handleError",function(e){t.props.onError(e)}),b(m(t),"onBestAnswerChange",function(e){t.changeValue("bestAnswer",e.target.value)}),b(m(t),"onPollChange",function(e){t.changeValue("poll",e.target.value)}),t.state={isLoading:!1,bestAnswer:"0",poll:"0"},t}return e=a,(t=[{key:"clean",value:function(){return!this.props.polls||"0"!==this.state.poll||window.confirm(gettext("Are you sure you want to delete all polls?"))}},{key:"send",value:function(){var e=Object.assign({},this.props.data,{best_answer:this.state.bestAnswer,poll:this.state.poll});return s.default.post(this.props.api,e)}},{key:"render",value:function(){return o.default.createElement("div",{className:"modal-dialog",role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Merge threads"))),o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"modal-body"},o.default.createElement(v,{choices:this.props.bestAnswers,onChange:this.onBestAnswerChange,value:this.state.bestAnswer}),o.default.createElement(g,{choices:this.props.polls,onChange:this.onPollChange,value:this.state.poll})),o.default.createElement("div",{className:"modal-footer"},o.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Merge threads"))))))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function v(e){var t=e.choices,r=e.onChange,n=e.value;return t?o.default.createElement(u.default,{label:gettext("Best answer"),helpText:gettext("Please select the best answer for your newly merged thread. No posts will be deleted during the merge."),for:"id_best_answer"},o.default.createElement("select",{className:"form-control",id:"id_best_answer",onChange:r,value:n},t.map(function(e){return o.default.createElement("option",{value:e[0],key:e[0]},e[1])}))):null}function g(e){var t=e.choices,r=e.onChange,n=e.value;return t?o.default.createElement(u.default,{label:gettext("Poll"),helpText:gettext("Please select the poll for your newly merged thread. Rejected polls will be permanently deleted and cannot be recovered."),for:"id_poll"},o.default.createElement("select",{className:"form-control",id:"id_poll",onChange:r,value:n},t.map(function(e){return o.default.createElement("option",{value:e[0],key:e[0]},e[1])}))):null}r.default=h},{"../services/ajax":365,"../services/modal":371,"./button":8,"./form":56,"./form-group":55,react:"react"}],60:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../services/one-box"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"componentDidMount",value:function(){l.default.render(this.documentNode),$(this.documentNode).find(".spoiler-reveal").click(d)}},{key:"componentDidUpdate",value:function(){l.default.render(this.documentNode),$(this.documentNode).find(".spoiler-reveal").click(d)}},{key:"shouldComponentUpdate",value:function(e){return e.markup!==this.props.markup}},{key:"render",value:function(){var t=this;return o.default.createElement("article",{className:"misago-markup",dangerouslySetInnerHTML:{__html:this.props.markup},ref:function(e){t.documentNode=e}})}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function d(e){var t=e.target;$(t).parent().parent().addClass("revealed")}r.default=f},{"../services/one-box":372,react:"react"}],61:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./loader"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"modal-body modal-loader"},o.default.createElement(l.default,null))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./loader":58,react:"react"}],62:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./panel-message"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,l.default);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getHelpText",value:function(){return this.props.helpText?o.default.createElement("p",{className:"help-block"},this.props.helpText):null}},{key:"render",value:function(){return o.default.createElement("div",{className:"modal-body"},o.default.createElement("div",{className:"message-icon"},o.default.createElement("span",{className:"material-icon"},this.props.icon||"info_outline")),o.default.createElement("div",{className:"message-body"},o.default.createElement("p",{className:"lead"},this.props.message),this.getHelpText(),o.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok"))))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./panel-message":94,react:"react"}],63:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.filter(function(e){return 0<e.results.count}).map(function(e){return Object.assign({},e,{count:e.results.count,results:e.results.results.slice(0,n)})})};var n=5},{}],64:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.RESULT=r.HEADER=r.FOOTER=void 0;r.HEADER="HEADER";r.RESULT="RESULT";r.FOOTER="FOOTER"},{}],65:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.children,r=e.onChange,n=e.query;return a.default.createElement("ul",{className:"dropdown-menu dropdown-search-results",role:"menu"},a.default.createElement("li",{className:"form-group"},a.default.createElement(o.default,{value:n,onChange:r})),t)};var a=n(e("react")),o=n(e("./input"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./input":69,react:"react"}],66:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(){return a.default.createElement("li",{className:"dropdown-search-message"},gettext("Search returned no results."))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],67:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=[];return function(e,t){for(var r=e.length,n=0;n<r;n++){var a=e[n];t.push({provider:a,type:o.HEADER}),function(e,t){for(var r=e.results.length,n=0;n<r;n++){var a=e.results[n];t.push({provider:e,result:a,type:o.RESULT})}t.push({provider:e,type:o.FOOTER})}(a,t)}}(e,t),t};var o=e("./constants")},{"./constants":64}],68:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.isLoading,r=e.onChange,n=e.results,a=e.query;if(!a.trim().length)return l.default.createElement(u.default,{onChange:r,query:a});{if(n.length){var o=(0,d.default)(n);return l.default.createElement(u.default,{onChange:r,query:a},o.map(function(e){var t=e.type,r=e.provider,n=e.result;return t===i.RESULT?l.default.createElement(f.default,p({key:[r.id,t,n.id].join("_")},e)):l.default.createElement(f.default,p({key:[r.id,t].join("_"),query:a},e))}))}if(t)return l.default.createElement(u.default,{onChange:r,query:a},l.default.createElement(c.default,null))}return l.default.createElement(u.default,{onChange:r,query:a},l.default.createElement(s.default,null))};var l=n(e("react")),i=e("./constants"),u=n(e("./dropdown-menu")),s=n(e("./empty")),c=n(e("./loader")),f=n(e("./result")),d=n(e("./flatten-results"));function n(e){return e&&e.__esModule?e:{default:e}}function p(){return(p=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}},{"./constants":64,"./dropdown-menu":65,"./empty":66,"./flatten-results":67,"./loader":70,"./result":73,react:"react"}],69:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.value,r=e.onChange;return a.default.createElement("input",{"aria-haspopup":"true","aria-expanded":"false","aria-controls":"dropdown-menu dropdown-search-results",autoComplete:"off",className:"form-control",value:t,onChange:r,placeholder:gettext("Search"),role:"combobox",type:"text"})};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],70:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){e.message;return n.default.createElement("li",{className:"dropdown-search-loader"},n.default.createElement(a.default,null))};var n=o(e("react")),a=o(e("../../loader"));function o(e){return e&&e.__esModule?e:{default:e}}},{"../../loader":58,react:"react"}],71:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.provider,r=e.query,n=t.url+"?q="+encodeURI(r),a=ngettext('See full "%(provider)s" results page with %(count)s result.','See full "%(provider)s" results page with %(count)s results.',t.count);return o.default.createElement("li",{className:"dropdown-search-footer"},o.default.createElement("a",{href:n},interpolate(a,{count:t.count,provider:t.name},!0)))};var n,o=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],72:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.provider;return a.default.createElement("li",{className:"dropdown-search-header"},t.name)};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],73:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.provider,r=e.result,n=e.type,a=e.query;{if(n===l.HEADER)return o.default.createElement(u.default,{provider:t});if(n===l.FOOTER)return o.default.createElement(i.default,{provider:t,query:a})}return o.default.createElement(s.default,{provider:t,result:r})};var o=n(e("react")),l=e("../constants"),i=n(e("./footer")),u=n(e("./header")),s=n(e("./result"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../constants":64,"./footer":71,"./header":72,"./result":74,react:"react"}],74:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.provider,r=e.result;return"threads"!==t.id?n.default.createElement(o.default,{result:r}):n.default.createElement(a.default,{result:r})};var n=l(e("react")),a=l(e("./thread")),o=l(e("./user"));function l(e){return e&&e.__esModule?e:{default:e}}},{"./thread":75,"./user":76,react:"react"}],75:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.result,r=(t.poster,t.thread),n=gettext("Posted by %(poster)s on %(posted_on)s in %(category)s.");return o.default.createElement("li",null,o.default.createElement("a",{href:t.url.index,className:"dropdown-search-thread"},o.default.createElement("h5",null,r.title),o.default.createElement("small",{className:"dropdown-search-post-content"},$(t.content).text()),o.default.createElement("small",{className:"dropdown-search-post-footer"},interpolate(n,{category:t.category.name,posted_on:(0,a.default)(t.posted_on).format("LL"),poster:t.poster_name},!0))))};var a=n(e("moment")),o=n(e("react"));function n(e){return e&&e.__esModule?e:{default:e}}},{moment:"moment",react:"react"}],76:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.result,r=t.rank,n=gettext("%(title)s, joined on %(joined_on)s"),a=t.title||r.title||r.name;return l.default.createElement("li",null,l.default.createElement("a",{href:t.url,className:"dropdown-search-user"},l.default.createElement("div",{className:"media"},l.default.createElement("div",{className:"media-left"},l.default.createElement(i.default,{size:38,user:t})),l.default.createElement("div",{className:"media-body"},l.default.createElement("h5",{className:"media-heading"},t.username),l.default.createElement("small",null,interpolate(n,{title:a,joined_on:(0,o.default)(t.joined_on).format("LL")},!0))))))};var o=n(e("moment")),l=n(e("react")),i=n(e("../../../avatar"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../../../avatar":6,moment:"moment",react:"react"}],77:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),l=o(e("../../services/ajax")),i=o(e("../../services/snackbar")),u=o(e("../..")),s=o(e("./clean-results")),c=o(e("./dropdown"));function o(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(o,n.default.Component);var e,t,r,a=p(o);function o(){var n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o),b(m(n=a.call(this)),"onToggle",function(e){n.setState(function(e,t){return e.isOpen||window.setTimeout(function(){n.container.querySelector("input").focus()},100),{isOpen:!e.isOpen}})}),b(m(n),"onDocumentMouseDown",function(e){for(var t=!0,r=e.target;null!==r&&r!==document;){if(r===n.container)return void(t=!1);r=r.parentNode}t&&n.setState({isOpen:!1})}),b(m(n),"onEscape",function(e){"Escape"===e.key&&n.setState({isOpen:!1})}),b(m(n),"onChange",function(e){var t=e.target.value;n.setState({query:t}),n.loadResults(t.trim())}),n.state={isLoading:!1,isOpen:!1,query:"",results:[]},n.intervalId=null,n}return e=o,(t=[{key:"componentDidMount",value:function(){document.addEventListener("mousedown",this.onDocumentMouseDown),document.addEventListener("keydown",this.onEscape)}},{key:"componentWillUnmount",value:function(){document.removeEventListener("mousedown",this.onDocumentMouseDown),document.removeEventListener("keydown",this.onEscape)}},{key:"loadResults",value:function(e){var t,r=this;e.length&&(t=300+300*Math.random(),this.intervalId&&window.clearTimeout(this.intervalId),this.setState({isLoading:!0}),this.intervalId=window.setTimeout(function(){l.default.get(u.default.get("SEARCH_API"),{q:e}).then(function(e){r.setState({intervalId:null,isLoading:!1,results:(0,s.default)(e)})},function(e){i.default.apiError(e),r.setState({intervalId:null,isLoading:!1,results:[]})})},t))}},{key:"render",value:function(){var t=this,e="navbar-search dropdown";return this.state.isOpen&&(e+=" open"),n.default.createElement("div",{className:e,ref:function(e){return t.container=e}},n.default.createElement("a",{"aria-haspopup":"true","aria-expanded":"false",className:"navbar-icon","data-toggle":"dropdown",href:u.default.get("SEARCH_URL"),onClick:this.onToggle},n.default.createElement("i",{className:"material-icon"},"search")),n.default.createElement(c.default,{isLoading:this.state.isLoading,onChange:this.onChange,results:this.state.results,query:this.state.query}))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=h},{"../..":302,"../../services/ajax":365,"../../services/snackbar":376,"./clean-results":63,"./dropdown":68,react:"react"}],78:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(){return n.default.createElement("div",{className:"panel panel-default panel-form"},n.default.createElement("div",{className:"panel-heading"},n.default.createElement("h3",{className:"panel-title"},gettext("Change username"))),n.default.createElement(a.default,null))};var n=o(e("react")),a=o(e("../../panel-loader"));function o(e){return e&&e.__esModule?e:{default:e}}},{"../../panel-loader":93,react:"react"}],79:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../panel-message"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getHelpText",value:function(){return this.props.options.next_on?interpolate(gettext("You will be able to change your username %(next_change)s."),{next_change:this.props.options.next_on.fromNow()},!0):gettext("You have used up available name changes.")}},{key:"render",value:function(){return o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Change username"))),o.default.createElement(l.default,{helpText:this.getHelpText(),message:gettext("You can't change your username at the moment.")}))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"../../panel-message":94,react:"react"}],80:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../button")),u=n(e("../../form")),s=n(e("../../form-group")),c=n(e("../../../services/ajax")),f=n(e("../../../services/snackbar")),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=p(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/validators"));function p(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(p=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function m(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(a,u.default);var e,t,r,n=b(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={username:"",validators:{username:[d.usernameContent(),d.usernameMinLength(e.options.length_min),d.usernameMaxLength(e.options.length_max)]},isLoading:!1},t}return e=a,(t=[{key:"getHelpText",value:function(){var e,t,r=[];return 0<this.props.options.changes_left&&(e=ngettext("You can change your username %(changes_left)s more time.","You can change your username %(changes_left)s more times.",this.props.options.changes_left),r.push(interpolate(e,{changes_left:this.props.options.changes_left},!0))),0<this.props.user.acl.name_changes_expire&&(t=ngettext("Used changes become available again after %(name_changes_expire)s day.","Used changes become available again after %(name_changes_expire)s days.",this.props.user.acl.name_changes_expire),r.push(interpolate(t,{name_changes_expire:this.props.user.acl.name_changes_expire},!0))),r.length?r.join(" "):null}},{key:"clean",value:function(){var e=this.validate();return e.username?(f.default.error(e.username[0]),!1):this.state.username.trim()!==this.props.user.username||(f.default.info(gettext("Your new username is same as current one.")),!1)}},{key:"send",value:function(){return c.default.post(this.props.user.api.username,{username:this.state.username})}},{key:"handleSuccess",value:function(e){this.setState({username:""}),this.props.complete(e.username,e.slug,e.options)}},{key:"handleError",value:function(e){f.default.apiError(e)}},{key:"render",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Change username"))),o.default.createElement("div",{className:"panel-body"},o.default.createElement(s.default,{label:gettext("New username"),for:"id_username",helpText:this.getHelpText()},o.default.createElement("input",{type:"text",id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username}))),o.default.createElement("div",{className:"panel-footer"},o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Change username")))))}}])&&m(e.prototype,t),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h},{"../../../services/ajax":365,"../../../services/snackbar":376,"../../../utils/validators":393,"../../button":8,"../../form":56,"../../form-group":55,react:"react"}],81:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("moment")),i=o(e("react")),u=o(e("./form-loading")),s=o(e("./form-locked")),c=o(e("./form")),f=o(e("../../username-history/root")),d=o(e("../../..")),p=e("../../../reducers/username-history"),m=e("../../../reducers/users"),y=o(e("../../../services/ajax")),b=o(e("../../../services/page-title")),h=o(e("../../../services/snackbar")),v=o(e("../../../services/store"));function o(e){return e&&e.__esModule?e:{default:e}}function g(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var O=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}(l,i.default.Component);var e,t,r,o=E(l);function l(e){var n,t,r,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),n=o.call(this,e),t=w(n),a=function(e,t,r){n.setState({options:r}),v.default.dispatch((0,p.addNameChange)({username:e,slug:t},n.props.user,n.props.user)),v.default.dispatch((0,m.updateUsername)(n.props.user,e,t)),h.default.success(gettext("Your username has been changed successfully."))},(r="onComplete")in t?Object.defineProperty(t,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[r]=a,n.state={isLoaded:!1,options:null},n}return e=l,(t=[{key:"componentDidMount",value:function(){var t=this;b.default.set({title:gettext("Change username"),parent:gettext("Change your options")}),Promise.all([y.default.get(this.props.user.api.username),y.default.get(d.default.get("USERNAME_CHANGES_API"),{user:this.props.user.id})]).then(function(e){v.default.dispatch((0,p.hydrate)(e[1].results)),t.setState({isLoaded:!0,options:{changes_left:e[0].changes_left,length_min:e[0].length_min,length_max:e[0].length_max,next_on:e[0].next_on?(0,n.default)(e[0].next_on):null}})})}},{key:"getChangeForm",value:function(){return this.state.isLoaded?0===this.state.options.changes_left?i.default.createElement(s.default,{options:this.state.options}):i.default.createElement(c.default,{complete:this.onComplete,options:this.state.options,user:this.props.user}):i.default.createElement(u.default,null)}},{key:"render",value:function(){return i.default.createElement("div",null,this.getChangeForm(),i.default.createElement(f.default,{changes:this.props["username-history"],isLoaded:this.state.isLoaded}))}}])&&g(e.prototype,t),r&&g(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=O},{"../../..":302,"../../../reducers/username-history":363,"../../../reducers/users":364,"../../../services/ajax":365,"../../../services/page-title":373,"../../../services/snackbar":376,"../../../services/store":377,"../../username-history/root":280,"./form":80,"./form-loading":78,"./form-locked":79,moment:"moment",react:"react"}],82:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../button")),i=n(e("../../services/ajax")),u=n(e("../../services/page-title")),s=n(e("../../services/snackbar")),c=(n(e("../../services/store")),n(e("../..")));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,o.default.Component);var e,t,r,n=p(a);function a(e){var o;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),b(m(o=n.call(this,e)),"onPasswordChange",function(e){o.setState({password:e.target.value})}),b(m(o),"handleSubmit",function(e){e.preventDefault();var t=o.state,r=t.isLoading,n=t.password,a=o.props.user;return 0==n.length?(s.default.error(gettext("Enter your password to confirm account deletion.")),!1):!r&&(o.setState({isLoading:!0}),void i.default.post(a.api.delete,{password:n}).then(function(e){window.location.href=c.default.get("MISAGO_PATH")},function(e){o.setState({isLoading:!1}),e.password?s.default.error(e.password[0]):s.default.apiError(e)}))}),o.state={isLoading:!1,password:""},o}return e=a,(t=[{key:"componentDidMount",value:function(){u.default.set({title:gettext("Delete account"),parent:gettext("Change your options")})}},{key:"render",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"panel panel-danger panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Delete account"))),o.default.createElement("div",{className:"panel-body"},o.default.createElement("p",{className:"lead"},gettext("You are going to delete your account. This action is nonreversible, and will result in following data being deleted:")),o.default.createElement("p",null,"-"," ",gettext("Stored IP addresses associated with content that you have posted will be deleted.")),o.default.createElement("p",null,"-"," ",gettext("Your username will become available for other user to rename to or for new user to register their account with.")),o.default.createElement("p",null,"-"," ",gettext("Your e-mail will become available for use in new account registration.")),o.default.createElement("hr",null),o.default.createElement("p",null,gettext("All your posted content will NOT be deleted, but username associated with it will be changed to one shared by all deleted accounts."))),o.default.createElement("div",{className:"panel-footer"},o.default.createElement("div",{className:"input-group"},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,name:"password-confirmation",type:"password",placeholder:gettext("Enter your password to confirm account deletion."),value:this.state.password,onChange:this.onPasswordChange}),o.default.createElement("span",{className:"input-group-btn"},o.default.createElement(l.default,{className:"btn-danger",loading:this.state.isLoading},gettext("Delete my account")))))))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h},{"../..":302,"../../services/ajax":365,"../../services/page-title":373,"../../services/snackbar":376,"../../services/store":377,"../button":8,react:"react"}],83:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("moment")),i=n(e("../button")),u=n(e("../../services/ajax")),s=n(e("../../services/page-title")),c=n(e("../../services/snackbar"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,o.default.Component);var e,t,r,n=p(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),b(m(t=n.call(this,e)),"handleLoadDownloads",function(){u.default.get(t.props.user.api.data_downloads).then(function(e){t.setState({isLoading:!1,downloads:e})},function(e){c.default.apiError(e)})}),b(m(t),"handleRequestDataDownload",function(){t.setState({isSubmiting:!0}),u.default.post(t.props.user.api.request_data_download).then(function(){t.handleLoadDownloads(),c.default.success(gettext("Your request for data download has been registered.")),t.setState({isSubmiting:!1})},function(e){console.log(e),c.default.apiError(e),t.setState({isSubmiting:!1})})}),t.state={isLoading:!1,isSubmiting:!1,downloads:[]},t}return e=a,(t=[{key:"componentDidMount",value:function(){s.default.set({title:gettext("Download your data"),parent:gettext("Change your options")}),this.handleLoadDownloads()}},{key:"render",value:function(){return o.default.createElement("div",null,o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Download your data"))),o.default.createElement("div",{className:"panel-body"},o.default.createElement("p",null,gettext('To download your data from the site, click the "Request data download" button. Depending on amount of data to be archived and number of users wanting to download their data at same time it may take up to few days for your download to be prepared. An e-mail with notification will be sent to you when your data is ready to be downloaded.')),o.default.createElement("p",null,gettext("The download will only be available for limited amount of time, after which it will be deleted from the site and marked as expired."))),o.default.createElement("table",{className:"table"},o.default.createElement("thead",null,o.default.createElement("tr",null,o.default.createElement("th",null,gettext("Requested on")),o.default.createElement("th",{className:"col-md-4"},gettext("Download")))),o.default.createElement("tbody",null,this.state.downloads.map(function(e){return o.default.createElement("tr",{key:e.id},o.default.createElement("td",{style:v},(0,l.default)(e.requested_on).fromNow()),o.default.createElement("td",null,o.default.createElement(g,{exportFile:e.file,status:e.status})))}),0==this.state.downloads.length?o.default.createElement("tr",null,o.default.createElement("td",{colSpan:"2"},gettext("You have no data downloads."))):null)),o.default.createElement("div",{className:"panel-footer text-right"},o.default.createElement(i.default,{className:"btn-primary",loading:this.state.isSubmiting,type:"button",onClick:this.handleRequestDataDownload},gettext("Request data download")))))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h;var v={verticalAlign:"middle"},g=function(e){var t=e.exportFile,r=e.status;return 0===r||1===r?o.default.createElement(i.default,{className:"btn-info btn-sm btn-block",disabled:!0,type:"button"},gettext("Download is being prepared")):t?o.default.createElement("a",{className:"btn btn-success btn-sm btn-block",href:t},gettext("Download your data")):o.default.createElement(i.default,{className:"btn-default btn-sm btn-block",disabled:!0,type:"button"},gettext("Download is expired"))}},{"../../services/ajax":365,"../../services/page-title":373,"../../services/snackbar":376,"../button":8,moment:"moment",react:"react"}],84:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=i(e("react")),o=i(e("../edit-details")),l=i(e("../../services/page-title")),s=i(e("../../services/snackbar"));function i(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=u(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return p(e)}(this,n?(e=u(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function u(e){return(u=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var m=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(u,n.default.Component);var e,t,r,i=d(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=p(e),n=function(){s.default.info(gettext("Your details have been updated."))},(r="onSuccess")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"componentDidMount",value:function(){l.default.set({title:gettext("Edit details"),parent:gettext("Change your options")})}},{key:"render",value:function(){return n.default.createElement(o.default,{api:this.props.user.api.edit_details,onSuccess:this.onSuccess})}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=m},{"../../services/page-title":373,"../../services/snackbar":376,"../edit-details":32,react:"react"}],85:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../button")),i=n(e("../form")),u=n(e("../form-group")),s=n(e("../select")),c=n(e("../yes-no-switch")),f=e("../../reducers/auth"),d=n(e("../../services/ajax")),p=n(e("../../services/page-title")),m=n(e("../../services/snackbar")),y=n(e("../../services/store"));function n(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(a,i.default);var e,t,r,n=v(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={isLoading:!1,is_hiding_presence:e.user.is_hiding_presence,limits_private_thread_invites_to:e.user.limits_private_thread_invites_to,subscribe_to_started_threads:e.user.subscribe_to_started_threads,subscribe_to_replied_threads:e.user.subscribe_to_replied_threads,errors:{}},t.privateThreadInvitesChoices=[{value:0,icon:"help_outline",label:gettext("Everybody")},{value:1,icon:"done_all",label:gettext("Users I follow")},{value:2,icon:"highlight_off",label:gettext("Nobody")}],t.subscribeToChoices=[{value:0,icon:"star_border",label:gettext("No")},{value:1,icon:"star_half",label:gettext("Notify")},{value:2,icon:"star",label:gettext("Notify with e-mail")}],t}return e=a,(t=[{key:"send",value:function(){return d.default.post(this.props.user.api.options,{is_hiding_presence:this.state.is_hiding_presence,limits_private_thread_invites_to:this.state.limits_private_thread_invites_to,subscribe_to_started_threads:this.state.subscribe_to_started_threads,subscribe_to_replied_threads:this.state.subscribe_to_replied_threads})}},{key:"handleSuccess",value:function(){y.default.dispatch((0,f.patch)({is_hiding_presence:this.state.is_hiding_presence,limits_private_thread_invites_to:this.state.limits_private_thread_invites_to,subscribe_to_started_threads:this.state.subscribe_to_started_threads,subscribe_to_replied_threads:this.state.subscribe_to_replied_threads})),m.default.success(gettext("Your forum options have been changed."))}},{key:"handleError",value:function(e){400===e.status?m.default.error(gettext("Please reload page and try again.")):m.default.apiError(e)}},{key:"componentDidMount",value:function(){p.default.set({title:gettext("Forum options"),parent:gettext("Change your options")})}},{key:"render",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Change forum options"))),o.default.createElement("div",{className:"panel-body"},o.default.createElement("fieldset",null,o.default.createElement("legend",null,gettext("Privacy settings")),o.default.createElement(u.default,{label:gettext("Hide my presence"),helpText:gettext("If you hide your presence, only members with permission to see hidden users will see when you are online."),for:"id_is_hiding_presence"},o.default.createElement(c.default,{id:"id_is_hiding_presence",disabled:this.state.isLoading,iconOn:"visibility_off",iconOff:"visibility",labelOn:gettext("Hide my presence from other users"),labelOff:gettext("Show my presence to other users"),onChange:this.bindInput("is_hiding_presence"),value:this.state.is_hiding_presence})),o.default.createElement(u.default,{label:gettext("Private thread invitations"),for:"id_limits_private_thread_invites_to"},o.default.createElement(s.default,{id:"id_limits_private_thread_invites_to",disabled:this.state.isLoading,onChange:this.bindInput("limits_private_thread_invites_to"),value:this.state.limits_private_thread_invites_to,choices:this.privateThreadInvitesChoices}))),o.default.createElement("fieldset",null,o.default.createElement("legend",null,gettext("Automatic subscriptions")),o.default.createElement(u.default,{label:gettext("Threads I start"),for:"id_subscribe_to_started_threads"},o.default.createElement(s.default,{id:"id_subscribe_to_started_threads",disabled:this.state.isLoading,onChange:this.bindInput("subscribe_to_started_threads"),value:this.state.subscribe_to_started_threads,choices:this.subscribeToChoices})),o.default.createElement(u.default,{label:gettext("Threads I reply to"),for:"id_subscribe_to_replied_threads"},o.default.createElement(s.default,{id:"id_subscribe_to_replied_threads",disabled:this.state.isLoading,onChange:this.bindInput("subscribe_to_replied_threads"),value:this.state.subscribe_to_replied_threads,choices:this.subscribeToChoices})))),o.default.createElement("div",{className:"panel-footer"},o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Save changes")))))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=_},{"../../reducers/auth":350,"../../services/ajax":365,"../../services/page-title":373,"../../services/snackbar":376,"../../services/store":377,"../button":8,"../form":56,"../form-group":55,"../select":210,"../yes-no-switch":300,react:"react"}],86:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.CompactNav=function(t){return n.default.createElement("ul",{className:t.className||"dropdown-menu stick-to-bottom",role:"menu"},t.options.map(function(e){return n.default.createElement(o.default,{path:t.baseUrl+e.component+"/",key:e.component},n.default.createElement(a.Link,{to:t.baseUrl+e.component+"/",onClick:t.hideNav},n.default.createElement("span",{className:"material-icon hidden-sm"},e.icon),e.name))}))},r.SideNav=function(t){return n.default.createElement("div",{className:"list-group nav-side"},t.options.map(function(e){return n.default.createElement(a.Link,{to:t.baseUrl+e.component+"/",className:"list-group-item",activeClassName:"active",key:e.component},n.default.createElement("span",{className:"material-icon"},e.icon),e.name)}))};var n=l(e("react")),a=e("react-router"),o=l(e("../li"));l(e("../.."));function l(e){return e&&e.__esModule?e:{default:e}}},{"../..":302,"../li":57,react:"react","react-router":"react-router"}],87:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.paths=function(){var e=[{path:m.default.get("USERCP_URL")+"forum-options/",component:(0,n.connect)(E)(c.default)},{path:m.default.get("USERCP_URL")+"edit-details/",component:(0,n.connect)(E)(u.default)}];e.push({path:m.default.get("USERCP_URL")+"change-username/",component:(0,n.connect)(E)(f.default)}),e.push({path:m.default.get("USERCP_URL")+"sign-in-credentials/",component:(0,n.connect)(E)(d.default)}),m.default.get("ENABLE_DOWNLOAD_OWN_DATA")&&e.push({path:m.default.get("USERCP_URL")+"download-data/",component:(0,n.connect)(E)(s.default)});m.default.get("ENABLE_DELETE_OWN_ACCOUNT")&&e.push({path:m.default.get("USERCP_URL")+"delete-account/",component:(0,n.connect)(E)(i.default)});return e},r.select=E;var o=y(e("react")),n=e("react-redux"),l=(y(e("../dropdown-toggle")),e("./navs")),i=y(e("./delete-account")),u=y(e("./edit-details")),s=y(e("./download-data")),c=y(e("./forum-options")),f=y(e("./change-username/root")),d=y(e("./sign-in-credentials/root")),p=y(e("../with-dropdown")),m=y(e("../.."));function y(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(a,p.default);var e,t,r,n=v(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"page page-options"},o.default.createElement("div",{className:"page-header-bg"},o.default.createElement("div",{className:"page-header"},o.default.createElement("div",{className:"container"},o.default.createElement("h1",null,gettext("Change your options"))),o.default.createElement("div",{className:"page-tabs visible-xs-block visible-sm-block"},o.default.createElement("div",{className:"container"},o.default.createElement(l.CompactNav,{className:"nav nav-pills",baseUrl:m.default.get("USERCP_URL"),options:m.default.get("USER_OPTIONS")}))))),o.default.createElement("div",{className:"container"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-md-3 hidden-xs hidden-sm"},o.default.createElement(l.SideNav,{baseUrl:m.default.get("USERCP_URL"),options:m.default.get("USER_OPTIONS")})),o.default.createElement("div",{className:"col-md-9"},this.props.children))))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function E(e){return{tick:e.tick.tick,user:e.auth.user,"username-history":e["username-history"]}}r.default=_},{"../..":302,"../dropdown-toggle":27,"../with-dropdown":299,"./change-username/root":81,"./delete-account":82,"./download-data":83,"./edit-details":84,"./forum-options":85,"./navs":86,"./sign-in-credentials/root":91,react:"react","react-redux":"react-redux"}],88:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),a=o(e("../../.."));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return n.default.createElement("div",{className:"panel panel-default panel-form"},n.default.createElement("div",{className:"panel-heading"},n.default.createElement("h3",{className:"panel-title"},gettext("Change email or password"))),n.default.createElement("div",{className:"panel-body panel-message-body"},n.default.createElement("div",{className:"message-icon"},n.default.createElement("span",{className:"material-icon"},"info_outline")),n.default.createElement("div",{className:"message-body"},n.default.createElement("p",{className:"lead"},gettext("You need to set a password for your account to be able to change your username or email.")),n.default.createElement("p",{className:"help-block"},n.default.createElement("a",{className:"btn btn-primary",href:a.default.get("FORGOTTEN_PASSWORD_URL")},gettext("Set password"))))))}r.default=l},{"../../..":302,react:"react"}],89:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../button")),u=n(e("../../form")),s=n(e("../../form-group")),c=n(e("../../../services/ajax")),f=n(e("../../../services/snackbar")),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=p(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/validators"));function p(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(p=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function m(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(a,u.default);var e,t,r,n=b(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={new_email:"",password:"",validators:{new_email:[d.email()],password:[]},isLoading:!1},t}return e=a,(t=[{key:"clean",value:function(){var e=this.validate();return-1!==[this.state.new_email.trim().length,this.state.password.trim().length].indexOf(0)?(f.default.error(gettext("Fill out all fields.")),!1):!e.new_email||(f.default.error(e.new_email[0]),!1)}},{key:"send",value:function(){return c.default.post(this.props.user.api.change_email,{new_email:this.state.new_email,password:this.state.password})}},{key:"handleSuccess",value:function(e){this.setState({new_email:"",password:""}),f.default.success(e.detail)}},{key:"handleError",value:function(e){400===e.status?e.new_email?f.default.error(e.new_email):f.default.error(e.password):f.default.apiError(e)}},{key:"render",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("input",{type:"type",style:{display:"none"}}),o.default.createElement("input",{type:"password",style:{display:"none"}}),o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Change e-mail address"))),o.default.createElement("div",{className:"panel-body"},o.default.createElement(s.default,{label:gettext("New e-mail"),for:"id_new_email"},o.default.createElement("input",{type:"text",id:"id_new_email",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("new_email"),value:this.state.new_email})),o.default.createElement("hr",null),o.default.createElement(s.default,{label:gettext("Your current password"),for:"id_confirm_email"},o.default.createElement("input",{type:"password",id:"id_confirm_email",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),o.default.createElement("div",{className:"panel-footer"},o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Change e-mail")))))}}])&&m(e.prototype,t),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h},{"../../../services/ajax":365,"../../../services/snackbar":376,"../../../utils/validators":393,"../../button":8,"../../form":56,"../../form-group":55,react:"react"}],90:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../button")),i=n(e("../../form")),u=n(e("../../form-group")),s=n(e("../../../services/ajax")),c=n(e("../../../services/snackbar"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=m(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=m(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var y=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,i.default);var e,t,r,n=p(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={new_password:"",repeat_password:"",password:"",validators:{new_password:[],repeat_password:[],password:[]},isLoading:!1},t}return e=a,(t=[{key:"clean",value:function(){var e=this.validate();return-1!==[this.state.new_password.trim().length,this.state.repeat_password.trim().length,this.state.password.trim().length].indexOf(0)?(c.default.error(gettext("Fill out all fields.")),!1):e.new_password?(c.default.error(e.new_password[0]),!1):this.state.new_password===this.state.repeat_password||(c.default.error(gettext("New passwords are different.")),!1)}},{key:"send",value:function(){return s.default.post(this.props.user.api.change_password,{new_password:this.state.new_password,password:this.state.password})}},{key:"handleSuccess",value:function(e){this.setState({new_password:"",repeat_password:"",password:""}),c.default.success(e.detail)}},{key:"handleError",value:function(e){400===e.status?e.new_password?c.default.error(e.new_password):c.default.error(e.password):c.default.apiError(e)}},{key:"render",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("input",{type:"type",style:{display:"none"}}),o.default.createElement("input",{type:"password",style:{display:"none"}}),o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-heading"},o.default.createElement("h3",{className:"panel-title"},gettext("Change password"))),o.default.createElement("div",{className:"panel-body"},o.default.createElement(u.default,{label:gettext("New password"),for:"id_new_password"},o.default.createElement("input",{type:"password",id:"id_new_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("new_password"),value:this.state.new_password})),o.default.createElement(u.default,{label:gettext("Repeat password"),for:"id_repeat_password"},o.default.createElement("input",{type:"password",id:"id_repeat_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("repeat_password"),value:this.state.repeat_password})),o.default.createElement("hr",null),o.default.createElement(u.default,{label:gettext("Your current password"),for:"id_confirm_password"},o.default.createElement("input",{type:"password",id:"id_confirm_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),o.default.createElement("div",{className:"panel-footer"},o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Change password")))))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=y},{"../../../services/ajax":365,"../../../services/snackbar":376,"../../button":8,"../../form":56,"../../form-group":55,react:"react"}],91:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./change-email")),i=n(e("./change-password")),u=n(e("../../..")),s=n(e("../../../services/page-title")),c=n(e("./UnusablePasswordMessage"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=m(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=m(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var y=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,o.default.Component);var e,t,r,n=p(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"componentDidMount",value:function(){s.default.set({title:gettext("Change email or password"),parent:gettext("Change your options")})}},{key:"render",value:function(){return this.props.user.has_usable_password?o.default.createElement("div",null,o.default.createElement(l.default,{user:this.props.user}),o.default.createElement(i.default,{user:this.props.user}),o.default.createElement("p",{className:"message-line"},o.default.createElement("span",{className:"material-icon"},"warning"),o.default.createElement("a",{href:u.default.get("FORGOTTEN_PASSWORD_URL")},gettext("Change forgotten password")))):o.default.createElement(c.default,null)}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=y},{"../../..":302,"../../../services/page-title":373,"./UnusablePasswordMessage":88,"./change-email":89,"./change-password":90,react:"react"}],92:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../utils/string-count"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getClassName",value:function(){return this.props.copy&&this.props.copy.length&&1===(0,l.default)(this.props.copy,"<p")&&-1===this.props.copy.indexOf("<br")?"page-lead lead":"page-lead"}},{key:"render",value:function(){return this.props.copy&&this.props.copy.length?o.default.createElement("div",{className:this.getClassName(),dangerouslySetInnerHTML:{__html:this.props.copy}}):null}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"../utils/string-count":392,react:"react"}],93:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./loader"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"panel-body panel-body-loading"},o.default.createElement(l.default,{className:"loader loader-spaced"}))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./loader":58,react:"react"}],94:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getHelpText",value:function(){return this.props.helpText?o.default.createElement("p",{className:"help-block"},this.props.helpText):null}},{key:"render",value:function(){return o.default.createElement("div",{className:"panel-body panel-message-body"},o.default.createElement("div",{className:"message-icon"},o.default.createElement("span",{className:"material-icon"},this.props.icon||"info_outline")),o.default.createElement("div",{className:"message-body"},o.default.createElement("p",{className:"lead"},this.props.message),this.getHelpText()))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],95:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var s=n(e("react")),c=n(e("../add-participant")),f=n(e("../../services/modal"));function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function l(e,t){return(l=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return p(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&l(e,t)}(u,s.default.Component);var e,t,r,i=d(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=p(e),n=function(){f.default.show(s.default.createElement(c.default,{thread:e.props.thread}))},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return this.props.thread.acl.can_add_participants?s.default.createElement("div",{className:"col-xs-12 col-sm-3"},s.default.createElement("button",{className:"btn btn-default btn-block",onClick:this.onClick,type:"button"},s.default.createElement("span",{className:"material-icon"},"person_add"),gettext("Add participant"))):null}}])&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../../services/modal":371,"../add-participant":4,react:"react"}],96:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.changeOwner=function(e,r){l.default.patch(e.api.index,[{op:"replace",path:"owner",value:r.id},{op:"add",path:"acl",value:1}]).then(function(e){s.default.dispatch((0,a.updateAcl)(e)),s.default.dispatch(n.replace(e.participants));var t=gettext("%(user)s has been made new thread owner.");u.default.success(interpolate(t,{user:r.username},!0))},function(e){u.default.apiError(e)})},r.leave=function(e,t){l.default.patch(e.api.index,[{op:"remove",path:"participants",value:t.id}]).then(function(){u.default.success(gettext("You have left this thread.")),window.setTimeout(function(){window.location=o.default.get("PRIVATE_THREADS_URL")},3e3)},function(e){u.default.apiError(e)})},r.remove=function(e,r){l.default.patch(e.api.index,[{op:"remove",path:"participants",value:r.id},{op:"add",path:"acl",value:1}]).then(function(e){s.default.dispatch((0,a.updateAcl)(e)),s.default.dispatch(n.replace(e.participants));var t=gettext("%(user)s has been removed from this thread.");u.default.success(interpolate(t,{user:r.username},!0))},function(e){u.default.apiError(e)})};var n=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=f(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/participants")),a=e("../../../reducers/thread"),o=c(e("../../..")),l=c(e("../../../services/ajax")),u=c(e("../../../services/snackbar")),s=c(e("../../../services/store"));function c(e){return e&&e.__esModule?e:{default:e}}function f(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(f=function(e){return e?r:t})(e)}},{"../../..":302,"../../../reducers/participants":351,"../../../reducers/thread":360,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377}],97:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.UserStatus=u,r.default=function(e){var t=e.participant,r="btn btn-default";t.is_owner&&(r="btn btn-primary");return r+=" btn-user btn-block",n.default.createElement("div",{className:"col-xs-12 col-sm-3 col-md-2 participant-card"},n.default.createElement("div",{className:"dropdown"},n.default.createElement("button",{"aria-haspopup":"true","aria-expanded":"false",className:r,"data-toggle":"dropdown",type:"button"},n.default.createElement(l.default,{size:"34",user:t}),n.default.createElement("span",{className:"btn-text"},t.username)),n.default.createElement("ul",{className:"dropdown-menu stick-to-bottom"},n.default.createElement(u,{isOwner:t.is_owner}),n.default.createElement("li",{className:"dropdown-header"}),n.default.createElement("li",null,n.default.createElement("a",{href:t.url},gettext("See profile"))),n.default.createElement("li",{role:"separator",className:"divider"}),n.default.createElement(a.default,e),n.default.createElement(o.default,e))))};var n=i(e("react")),a=i(e("./make-owner")),o=i(e("./remove")),l=i(e("../../avatar"));function i(e){return e&&e.__esModule?e:{default:e}}function u(e){return e.isOwner?n.default.createElement("li",{className:"dropdown-header dropdown-header-owner"},n.default.createElement("span",{className:"material-icon"},"start"),n.default.createElement("span",{className:"icon-text"},gettext("Thread owner"))):null}},{"../../avatar":6,"./make-owner":99,"./remove":100,react:"react"}],98:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.participants,r=e.thread,n=e.user,a=e.userIsOwner;return o.default.createElement("div",{className:"participants-cards"},o.default.createElement("div",{className:"row"},t.map(function(e){return o.default.createElement(l.default,{key:e.id,participant:e,thread:r,user:n,userIsOwner:a})})))};var o=n(e("react")),l=n(e("./card"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./card":97,react:"react"}],99:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,i=(n=e("react"))&&n.__esModule?n:{default:n},u=e("./actions");function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=o(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=o(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var l=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(l,i.default.Component);var e,t,r,o=f(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=d(t),a=function(){var e;(t.isUser?window.confirm(gettext("Are you sure you want to take over this thread?")):(e=gettext("Are you sure you want to change thread owner to %(user)s?"),window.confirm(interpolate(e,{user:t.props.participant.username},!0))))&&(0,u.changeOwner)(t.props.thread,t.props.participant)},(n="onClick")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.isUser=e.participant.id===e.user.id,t}return e=l,(t=[{key:"render",value:function(){return!this.props.participant.is_owner&&this.props.thread.acl.can_change_owner?i.default.createElement("li",null,i.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},gettext("Make owner"))):null}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=l},{"./actions":96,react:"react"}],100:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,i=(n=e("react"))&&n.__esModule?n:{default:n},u=e("./actions");function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=o(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=o(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var l=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(l,i.default.Component);var e,t,r,o=f(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=d(t),a=function(){var e;(t.isUser?window.confirm(gettext("Are you sure you want to leave this thread?")):(e=gettext("Are you sure you want to remove %(user)s from this thread?"),window.confirm(interpolate(e,{user:t.props.participant.username},!0))))&&(t.isUser?(0,u.leave):(0,u.remove))(t.props.thread,t.props.participant)},(n="onClick")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.isUser=e.participant.id===e.user.id,t}return e=l,(t=[{key:"render",value:function(){var e=this.props.user.acl.can_moderate_private_threads;return this.props.userIsOwner||this.isUser||e?i.default.createElement("li",null,i.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},this.isUser?gettext("Leave thread"):gettext("Remove"))):null}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=l},{"./actions":96,react:"react"}],101:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.participants.length?n.default.createElement("div",{className:"panel panel-default panel-participants"},n.default.createElement("div",{className:"panel-body"},n.default.createElement(o.default,c({userIsOwner:f(e.user,e.participants)},e)),n.default.createElement("div",{className:"row"},n.default.createElement(a.default,{thread:e.thread}),n.default.createElement("div",{className:"col-xs-12 col-sm-9"},n.default.createElement("p",null,l.getParticipantsCopy(e.participants)))))):null},r.getUserIsOwner=f;var n=s(e("react")),a=s(e("./add-participant")),o=s(e("./cards-list")),l=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./utils"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e){return e&&e.__esModule?e:{default:e}}function c(){return(c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function f(e,t){return t[0].id===e.id}},{"./add-participant":95,"./cards-list":98,"./utils":102,react:"react"}],102:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.getParticipantsCopy=function(e){var t=e.length,r=ngettext("This thread has %(users)s participant.","This thread has %(users)s participants.",t);return interpolate(r,{users:t},!0)}},{}],103:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.STYLES=r.LABELS=void 0;var o=n(e("react")),l=n(e("../services/zxcvbn"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=["progress-bar-danger","progress-bar-warning","progress-bar-warning","progress-bar-primary","progress-bar-success"];r.STYLES=f;var d=[gettext("Entered password is very weak."),gettext("Entered password is weak."),gettext("Entered password is average."),gettext("Entered password is strong."),gettext("Entered password is very strong.")];r.LABELS=d;var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e))._score=0,t._password=null,t._inputs=[],t.state={loaded:!1},t}return e=a,(t=[{key:"componentDidMount",value:function(){var e=this;l.default.load().then(function(){e.setState({loaded:!0})})}},{key:"getScore",value:function(e,t){var r=this,n=!1;return e!==this._password&&(n=!0),t.length!==this._inputs.length?n=!0:t.map(function(e,t){e.trim()!==r._inputs[t]&&(n=!0)}),n&&(this._score=l.default.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 o.default.createElement("div",{className:"help-block password-strength"},o.default.createElement("div",{className:"progress"},o.default.createElement("div",{className:"progress-bar "+f[e],style:{width:20+20*e+"%"},role:"progress-bar","aria-valuenow":e,"aria-valuemin":"0","aria-valuemax":"4"},o.default.createElement("span",{className:"sr-only"},d[e]))),o.default.createElement("p",{className:"text-small"},d[e]))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../services/zxcvbn":378,react:"react"}],104:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.PollChoice=void 0,r.generateRandomHash=h;var n,l=(n=e("react"))&&n.__esModule?n:{default:n};function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t,r){return t&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=p(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=p(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function p(e){return(p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function m(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var y=function(){s(o,l.default.Component);var a=f(o);function o(){var n;i(this,o);for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return m(d(n=a.call.apply(a,[this].concat(t))),"onAdd",function(){var e=n.props.choices.slice();e.push({hash:h(),label:""}),n.props.setChoices(e)}),m(d(n),"onChange",function(t,r){var e=n.props.choices.map(function(e){return e.hash===t&&(e.label=r),e});n.props.setChoices(e)}),m(d(n),"onDelete",function(t){var e=n.props.choices.filter(function(e){return e.hash!==t});n.props.setChoices(e)}),n}return u(o,[{key:"render",value:function(){var t=this;return l.default.createElement("div",{className:"poll-choices-control"},l.default.createElement("ul",{className:"list-group"},this.props.choices.map(function(e){return l.default.createElement(b,{canDelete:2<t.props.choices.length,choice:e,disabled:t.props.disabled,key:e.hash,onChange:t.onChange,onDelete:t.onDelete})})),l.default.createElement("button",{className:"btn btn-default btn-sm",disabled:this.props.disabled,onClick:this.onAdd,type:"button"},gettext("Add choice")))}}]),o}();r.default=y;var b=function(){s(o,l.default.Component);var a=f(o);function o(){var t;i(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return m(d(t=a.call.apply(a,[this].concat(r))),"onChange",function(e){t.props.onChange(t.props.choice.hash,e.target.value)}),m(d(t),"onDelete",function(){window.confirm(gettext("Are you sure you want to delete this choice?"))&&t.props.onDelete(t.props.choice.hash)}),t}return u(o,[{key:"render",value:function(){return l.default.createElement("li",{className:"list-group-item"},l.default.createElement("button",{className:"btn",disabled:!this.props.canDelete||this.props.disabled,onClick:this.onDelete,title:gettext("Delete this choice"),type:"button"},l.default.createElement("span",{className:"material-icon"},"close")),l.default.createElement("input",{disabled:this.props.disabled,maxLength:"255",placeholder:gettext("choice label"),type:"text",onChange:this.onChange,value:this.props.choice.label}))}}]),o}();function h(){for(var e="";12!=e.length;)e=Math.random().toString(36).replace(/[^a-zA-Z0-9]+/g,"").substr(1,12);return e}r.PollChoice=b},{react:"react"}],105:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.PollPublicSwitch=j,r.default=void 0;var o=n(e("react")),l=n(e("./choices-control")),u=n(e("../../button")),s=n(e("../../form")),c=n(e("../../form-group")),f=n(e("../../yes-no-switch")),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=h(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/poll")),p=n(e("../../../services/ajax")),m=n(e("../../../services/posting")),y=n(e("../../../services/snackbar")),b=n(e("../../../services/store"));function h(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(h=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function v(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function w(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var O=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}(a,s.default);var e,t,r,n=_(a);function a(e){var r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),w(E(r=n.call(this,e)),"setChoices",function(e){var t=Object.assign({},t,{choices:null});r.setState({choices:e,errors:t})}),w(E(r),"onCancel",function(){window.confirm(gettext("Are you sure you want to discard poll?"))&&m.default.close()});var t=e.poll||{question:"",choices:[{hash:"choice-10000",label:""},{hash:"choice-20000",label:""}],length:0,allowed_choices:1,allow_revotes:0,is_public:0};return r.state={isLoading:!1,isEdit:!!t.question,question:t.question,choices:t.choices,length:t.length,allowed_choices:t.allowed_choices,allow_revotes:t.allow_revotes,is_public:t.is_public,validators:{question:[],choices:[],length:[],allowed_choices:[]},errors:{}},r}return e=a,(t=[{key:"send",value:function(){var e={question:this.state.question,choices:this.state.choices,length:this.state.length,allowed_choices:this.state.allowed_choices,allow_revotes:this.state.allow_revotes,is_public:this.state.is_public};return this.state.isEdit?p.default.put(this.props.poll.api.index,e):p.default.post(this.props.thread.api.poll,e)}},{key:"handleSuccess",value:function(e){b.default.dispatch(d.replace(e)),this.state.isEdit?y.default.success(gettext("Poll has been edited.")):y.default.success(gettext("Poll has been posted.")),m.default.close()}},{key:"handleError",value:function(e){400===e.status?(e.non_field_errors&&(e.allowed_choices=e.non_field_errors),this.setState({errors:Object.assign({},e)}),y.default.error(gettext("Form contains errors."))):y.default.apiError(e)}},{key:"render",value:function(){return o.default.createElement("div",{className:"poll-form"},o.default.createElement("div",{className:"container"},o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"panel panel-default panel-form"},o.default.createElement("div",{className:"panel-body"},o.default.createElement("fieldset",null,o.default.createElement("legend",null,gettext("Question and choices")),o.default.createElement(c.default,{label:gettext("Poll question"),for:"id_questions",validation:this.state.errors.question},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,id:"id_questions",onChange:this.bindInput("question"),type:"text",maxLength:"255",value:this.state.question})),o.default.createElement(c.default,{label:gettext("Available choices"),validation:this.state.errors.choices},o.default.createElement(l.default,{choices:this.state.choices,disabled:this.state.isLoading,setChoices:this.setChoices}))),o.default.createElement("fieldset",null,o.default.createElement("legend",null,gettext("Voting")),o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-xs-12 col-sm-6"},o.default.createElement(c.default,{label:gettext("Poll length"),helpText:gettext("Enter number of days for which voting in this poll should be possible or zero to run this poll indefinitely."),for:"id_length",validation:this.state.errors.length},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,id:"id_length",onChange:this.bindInput("length"),type:"text",value:this.state.length}))),o.default.createElement("div",{className:"col-xs-12 col-sm-6"},o.default.createElement(c.default,{label:gettext("Allowed choices"),for:"id_allowed_choices",validation:this.state.errors.allowed_choices},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,id:"id_allowed_choices",onChange:this.bindInput("allowed_choices"),type:"text",maxLength:"255",value:this.state.allowed_choices})))),o.default.createElement("div",{className:"row"},o.default.createElement(j,{bindInput:this.bindInput,disabled:this.state.isLoading,isEdit:this.state.isEdit,value:this.state.is_public}),o.default.createElement("div",{className:"col-xs-12 col-sm-6"},o.default.createElement(c.default,{label:gettext("Allow vote changes"),for:"id_allow_revotes"},o.default.createElement(f.default,{id:"id_allow_revotes",disabled:this.state.isLoading,iconOn:"check",iconOff:"close",labelOn:gettext("Allow participants to change their vote"),labelOff:gettext("Don't allow participants to change their vote"),onChange:this.bindInput("allow_revotes"),value:this.state.allow_revotes})))))),o.default.createElement("div",{className:"panel-footer text-right"},o.default.createElement("button",{className:"btn btn-default",disabled:this.state.isLoading,onClick:this.onCancel,type:"button"},gettext("Cancel"))," ",o.default.createElement(u.default,{className:"btn-primary",loading:this.state.isLoading},this.state.isEdit?gettext("Save changes"):gettext("Post poll")))))))}}])&&v(e.prototype,t),r&&v(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function j(e){return e.isEdit?null:o.default.createElement("div",{className:"col-xs-12 col-sm-6"},o.default.createElement(c.default,{label:gettext("Make voting public"),helpText:gettext("Making voting public will allow everyone to access detailed list of votes, showing which users voted for which choices and at which times. This option can't be changed after poll's creation. Moderators may see voting details for all polls."),for:"id_is_public"},o.default.createElement(f.default,{id:"id_is_public",disabled:e.disabled,iconOn:"visibility",iconOff:"visibility_off",labelOn:gettext("Votes are public"),labelOff:gettext("Votes are hidden"),onChange:e.bindInput("is_public"),value:e.value})))}r.default=O},{"../../../reducers/poll":352,"../../../services/ajax":365,"../../../services/posting":375,"../../../services/snackbar":376,"../../../services/store":377,"../../button":8,"../../form":56,"../../form-group":55,"../../yes-no-switch":300,"./choices-control":104,react:"react"}],106:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"Poll",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(r,"PollForm",{enumerable:!0,get:function(){return a.default}});var n=o(e("./poll")),a=o(e("./form"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./form":105,"./poll":108}],107:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.PollCreation=s,r.PollIsPublic=y,r.PollLength=d,r.PollVotes=m,r.default=function(e){return n.default.createElement("ul",{className:"list-unstyled list-inline poll-details"},n.default.createElement(m,{votes:e.poll.votes}),n.default.createElement(d,{poll:e.poll}),n.default.createElement(y,{poll:e.poll}),n.default.createElement(s,{poll:e.poll}))},r.getEndsOn=p,r.getPostedOn=f,r.getPoster=c;var n=o(e("react")),a=o(e("../../utils/escape-html"));function o(e){return e&&e.__esModule?e:{default:e}}var l='<abbr title="%(absolute)s">%(relative)s</abbr>',i='<span class="item-title">%(user)s</span>',u='<a href="%(url)s" class="item-title">%(user)s</a>';function s(e){var t=interpolate((0,a.default)(gettext("Posted by %(poster)s %(posted_on)s.")),{poster:c(e.poll),posted_on:f(e.poll)},!0);return n.default.createElement("li",{className:"poll-info-creation",dangerouslySetInnerHTML:{__html:t}})}function c(e){return e.url.poster?interpolate(u,{url:(0,a.default)(e.url.poster),user:(0,a.default)(e.poster_name)},!0):interpolate(i,{user:(0,a.default)(e.poster_name)},!0)}function f(e){return interpolate(l,{absolute:(0,a.default)(e.posted_on.format("LLL")),relative:(0,a.default)(e.posted_on.fromNow())},!0)}function d(e){if(!e.poll.length)return null;var t=interpolate((0,a.default)(gettext("Voting ends %(ends_on)s.")),{ends_on:p(e.poll)},!0);return n.default.createElement("li",{className:"poll-info-ends-on",dangerouslySetInnerHTML:{__html:t}})}function p(e){return interpolate(l,{absolute:(0,a.default)(e.endsOn.format("LLL")),relative:(0,a.default)(e.endsOn.fromNow())},!0)}function m(e){var t=ngettext("%(votes)s vote.","%(votes)s votes.",e.votes),r=interpolate(t,{votes:e.votes},!0);return n.default.createElement("li",{className:"poll-info-votes"},r)}function y(e){return e.poll.is_public?n.default.createElement("li",{className:"poll-info-public"},gettext("Votes are public.")):null}},{"../../utils/escape-html":383,react:"react"}],108:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.getIsPollOver=h;var o=u(e("react")),n=u(e("moment")),l=u(e("./results")),i=u(e("./voting"));function u(e){return e&&e.__esModule?e:{default:e}}function s(){return(s=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=m(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return p(e)}(this,n?(e=m(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function y(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var b=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(a,o.default.Component);var e,t,r,n=d(a);function a(e){var t;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),y(p(t=n.call(this,e)),"showResults",function(){t.setState({showResults:!0})}),y(p(t),"showVoting",function(){t.setState({showResults:!1})});var r=!0;return e.user.id&&!e.poll.hasSelectedChoices&&(r=!1),t.state={showResults:r},t}return e=a,(t=[{key:"render",value:function(){if(!this.props.thread.poll)return null;var e=h(this.props.poll);return e||!this.props.poll.acl.can_vote||this.state.showResults?o.default.createElement(l.default,s({isPollOver:e,showVoting:this.showVoting},this.props)):o.default.createElement(i.default,s({showResults:this.showResults},this.props))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function h(e){return!!e.length&&(0,n.default)().isAfter(e.endsOn)}r.default=b},{"./results":110,"./voting":114,moment:"moment",react:"react"}],109:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.ChoiceVotes=l,r.PollChoice=o,r.UserChoice=u,r.default=function(t){return a.default.createElement("div",{className:"poll-choices-bars"},t.poll.choices.map(function(e){return a.default.createElement(o,{choice:e,key:e.hash,poll:t.poll})}))},r.getVotesLabel=i;var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){var t=0;return e.choice.votes&&e.poll.votes&&(t=Math.ceil(100*e.choice.votes/e.poll.votes)),a.default.createElement("dl",{className:"dl-horizontal"},a.default.createElement("dt",null,e.choice.label),a.default.createElement("dd",null,a.default.createElement("div",{className:"progress"},a.default.createElement("div",{className:"progress-bar",role:"progressbar","aria-valuenow":t,"aria-valuemin":"0","aria-valuemax":"100",style:{width:t+"%"}},a.default.createElement("span",{className:"sr-only"},i(e.votes,e.proc)))),a.default.createElement("ul",{className:"list-unstyled list-inline poll-chart"},a.default.createElement(l,{proc:t,votes:e.choice.votes}),a.default.createElement(u,{selected:e.choice.selected}))))}function l(e){return a.default.createElement("li",{className:"poll-chart-votes"},i(e.votes,e.proc))}function i(e,t){var r=ngettext("%(votes)s vote, %(proc)s% of total.","%(votes)s votes, %(proc)s% of total.",e);return interpolate(r,{votes:e,proc:t},!0)}function u(e){return e.selected?a.default.createElement("li",{className:"poll-chart-selected"},a.default.createElement("span",{className:"material-icon"},"check_box"),gettext("Your choice.")):null}},{react:"react"}],110:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement("div",{className:"panel panel-default panel-poll"},n.default.createElement("div",{className:"panel-body"},n.default.createElement("h2",null,e.poll.question),n.default.createElement(l.default,{poll:e.poll}),n.default.createElement(a.default,{poll:e.poll}),n.default.createElement(o.default,{isPollOver:e.isPollOver,poll:e.poll,showVoting:e.showVoting,thread:e.thread})))};var n=i(e("react")),a=i(e("./chart")),o=i(e("./options")),l=i(e("../info"));function i(e){return e&&e.__esModule?e:{default:e}}},{"../info":107,"./chart":109,"./options":112,react:"react"}],111:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ChoiceDetails=v,r.ChoicesList=h,r.ModalBody=b,r.VoteDate=w,r.Voter=E,r.VotesCount=g,r.VotesList=_,r.default=void 0;var o=s(e("react")),l=s(e("moment")),n=s(e("../../modal-message")),i=s(e("../../modal-loader")),u=s(e("../../../services/ajax"));function s(e){return e&&e.__esModule?e:{default:e}}function c(){return(c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=m(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=m(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var y=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,o.default.Component);var e,t,r,n=p(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={isLoading:!0,error:null,data:[]},t}return e=a,(t=[{key:"componentDidMount",value:function(){var r=this;u.default.get(this.props.poll.api.votes).then(function(e){var t=e.map(function(e){return Object.assign({},e,{voters:e.voters.map(function(e){return Object.assign({},e,{voted_on:(0,l.default)(e.voted_on)})})})});r.setState({isLoading:!1,data:t})},function(e){r.setState({isLoading:!1,error:e.detail})})}},{key:"render",value:function(){return o.default.createElement("div",{className:"modal-dialog"+(this.state.error?" modal-message":" modal-sm"),role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Poll votes"))),o.default.createElement(b,{data:this.state.data,error:this.state.error,isLoading:this.state.isLoading})))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function b(e){return e.isLoading?o.default.createElement(i.default,null):e.error?o.default.createElement(n.default,{icon:"error_outline",message:e.error}):o.default.createElement(h,{data:e.data})}function h(e){return o.default.createElement("div",{className:"modal-body modal-poll-votes"},o.default.createElement("ul",{className:"list-unstyled votes-details"},e.data.map(function(e){return o.default.createElement(v,c({key:e.hash},e))})))}function v(e){return o.default.createElement("li",null,o.default.createElement("h4",null,e.label),o.default.createElement(g,{votes:e.votes}),o.default.createElement(_,{voters:e.voters}),o.default.createElement("hr",null))}function g(e){var t=ngettext("%(votes)s user has voted for this choice.","%(votes)s users have voted for this choice.",e.votes),r=interpolate(t,{votes:e.votes},!0);return o.default.createElement("p",null,r)}function _(e){return e.voters.length?o.default.createElement("ul",{className:"list-unstyled"},e.voters.map(function(e){return o.default.createElement(E,c({key:e.username},e))})):null}function E(e){return e.url?o.default.createElement("li",null,o.default.createElement("a",{className:"item-title",href:e.url},e.username)," ",o.default.createElement(w,{voted_on:e.voted_on})):o.default.createElement("li",null,o.default.createElement("strong",null,e.username)," ",o.default.createElement(w,{voted_on:e.voted_on}))}function w(e){return o.default.createElement("abbr",{className:"text-muted",title:e.voted_on.format("LLL")},e.voted_on.fromNow())}r.default=y},{"../../../services/ajax":365,"../../modal-loader":61,"../../modal-message":62,moment:"moment",react:"react"}],112:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ChangeVote=x,r.SeeVotes=r.Edit=r.Delete=void 0,r.default=function(e){var t=e.isPollOver,r=e.poll,n=e.showVoting,a=e.thread;if(!P(t,r.acl,r))return null;var o=[],l=r.acl.can_vote,i=!r.hasSelectedChoices||r.allow_revotes;l&&i&&o.push(0);(r.is_public||r.acl.can_see_votes)&&o.push(1);r.acl.can_edit&&o.push(2);r.acl.can_delete&&o.push(3);return u.default.createElement("div",{className:"row poll-options"},u.default.createElement(x,{controls:o,isPollOver:t,poll:r,showVoting:n}),u.default.createElement(N,{controls:o,poll:r}),u.default.createElement(S,{controls:o,poll:r,thread:a}),u.default.createElement(R,{controls:o,poll:r}))},r.getClassName=k,r.isVisible=P;var u=a(e("react")),l=a(e("./modal")),s=n(e("../../../reducers/poll")),c=n(e("../../../reducers/thread")),f=a(e("../../../services/ajax")),d=a(e("../../../services/modal")),p=a(e("../../../services/posting")),m=a(e("../../../services/snackbar")),y=a(e("../../../services/store"));function b(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(b=function(e){return e?r:t})(e)}function n(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=b(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function a(e){return e&&e.__esModule?e:{default:e}}function h(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function v(e,t,r){return t&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=O(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=O(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function O(e){return(O=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function j(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function P(e,t,r){return r.is_public||t.can_delete||t.can_edit||t.can_see_votes||t.can_vote&&!e&&(!r.hasSelectedChoices||r.allow_revotes)}function k(e,t){var r="col-xs-6";return 1===e.length&&(r="col-xs-12"),3===e.length&&e[0]===t&&(r="col-xs-12"),r+" col-sm-3 col-md-2"}function x(e){var t=e.poll.acl.can_vote,r=!e.poll.hasSelectedChoices||e.poll.allow_revotes;return t&&r?u.default.createElement("div",{className:k(e.controls,0)},u.default.createElement("button",{className:"btn btn-default btn-block btn-sm",disabled:e.poll.isBusy,onClick:e.showVoting,type:"button"},gettext("Vote"))):null}var N=function(){g(o,u.default.Component);var a=E(o);function o(){var e;h(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return j(w(e=a.call.apply(a,[this].concat(r))),"onClick",function(){d.default.show(u.default.createElement(l.default,{poll:e.props.poll}))}),e}return v(o,[{key:"render",value:function(){return this.props.poll.is_public||this.props.poll.acl.can_see_votes?u.default.createElement("div",{className:k(this.props.controls,1)},u.default.createElement("button",{className:"btn btn-default btn-block btn-sm",disabled:this.props.poll.isBusy,onClick:this.onClick,type:"button"},gettext("See votes"))):null}}]),o}();r.SeeVotes=N;var S=function(){g(o,u.default.Component);var a=E(o);function o(){var e;h(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return j(w(e=a.call.apply(a,[this].concat(r))),"onClick",function(){p.default.open({submit:e.props.poll.api.index,thread:e.props.thread,poll:e.props.poll,mode:"POLL"})}),e}return v(o,[{key:"render",value:function(){return this.props.poll.acl.can_edit?u.default.createElement("div",{className:k(this.props.controls,2)},u.default.createElement("button",{className:"btn btn-default btn-block btn-sm",disabled:this.props.poll.isBusy,onClick:this.onClick,type:"button"},gettext("Edit"))):null}}]),o}();r.Edit=S;var R=function(){g(o,u.default.Component);var a=E(o);function o(){var e;h(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return j(w(e=a.call.apply(a,[this].concat(r))),"onClick",function(){return!!window.confirm(gettext("Are you sure you want to delete this poll? This action is not reversible."))&&(y.default.dispatch(s.busy()),void f.default.delete(e.props.poll.api.index).then(e.handleSuccess,e.handleError))}),j(w(e),"handleSuccess",function(e){m.default.success("Poll has been deleted"),y.default.dispatch(s.remove()),y.default.dispatch(c.updateAcl(e))}),j(w(e),"handleError",function(e){m.default.apiError(e),y.default.dispatch(s.release())}),e}return v(o,[{key:"render",value:function(){return this.props.poll.acl.can_delete?u.default.createElement("div",{className:k(this.props.controls,3)},u.default.createElement("button",{className:"btn btn-default btn-block btn-sm",disabled:this.props.poll.isBusy,onClick:this.onClick,type:"button"},gettext("Delete"))):null}}]),o}();r.Delete=R},{"../../../reducers/poll":352,"../../../reducers/thread":360,"../../../services/ajax":365,"../../../services/modal":371,"../../../services/posting":375,"../../../services/snackbar":376,"../../../services/store":377,"./modal":111,react:"react"}],113:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.PollAllowRevote=l,r.PollChoicesLeft=o,r.default=function(e){return a.default.createElement("ul",{className:"list-unstyled list-inline poll-help"},a.default.createElement(o,{choicesLeft:e.choicesLeft}),a.default.createElement(l,{poll:e.poll}))};var a=n(e("react"));n(e("../../../utils/escape-html"));function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=e.choicesLeft;if(0===t)return a.default.createElement("li",{className:"poll-help-choices-left"},gettext("You can't select any more choices."));var r=ngettext("You can select %(choices)s more choice.","You can select %(choices)s more choices.",t),n=interpolate(r,{choices:t},!0);return a.default.createElement("li",{className:"poll-help-choices-left"},n)}function l(e){return e.poll.allow_revotes?a.default.createElement("li",{className:"poll-help-allow-revotes"},gettext("You can change your vote later.")):a.default.createElement("li",{className:"poll-help-no-revotes"},gettext("Votes are final."))}},{"../../../utils/escape-html":383,react:"react"}],114:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var a=n(e("react")),l=n(e("./help")),u=n(e("./select")),s=e("./utils"),c=n(e("../info")),f=e("../results/options"),d=n(e("../../button")),p=n(e("../../form")),m=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=v(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/poll")),y=n(e("../../../services/ajax")),b=n(e("../../../services/snackbar")),h=n(e("../../../services/store"));function v(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(v=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function g(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=o(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=o(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function O(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var j=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}(o,p.default);var e,t,r,n=E(o);function o(e){var a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o),O(w(a=n.call(this,e)),"toggleChoice",function(e){var t=(0,s.getChoiceFromHash)(a.state.choices,e),r=null,r=t.selected?a.deselectChoice(t,e):a.selectChoice(t,e);a.setState({choices:r,choicesLeft:(0,s.getChoicesLeft)(a.props.poll,r)})}),O(w(a),"selectChoice",function(e,t){if(!(0,s.getChoicesLeft)(a.props.poll,a.state.choices))for(var r in a.state.choices.slice()){var n=a.state.choices[r];if(n.selected&&n.hash!=t){n.selected=!1;break}}return a.state.choices.map(function(e){return Object.assign({},e,{selected:e.hash==t||e.selected})})}),O(w(a),"deselectChoice",function(e,t){return a.state.choices.map(function(e){return Object.assign({},e,{selected:e.hash!=t&&e.selected})})}),a.state={isLoading:!1,choices:e.poll.choices,choicesLeft:(0,s.getChoicesLeft)(e.poll,e.poll.choices)},a}return e=o,(t=[{key:"clean",value:function(){return this.state.choicesLeft!==this.props.poll.allowed_choices||(b.default.error(gettext("You need to select at least one choice")),!1)}},{key:"send",value:function(){var e=[];for(var t in this.state.choices.slice()){var r=this.state.choices[t];r.selected&&e.push(r.hash)}return y.default.post(this.props.poll.api.votes,e)}},{key:"handleSuccess",value:function(e){h.default.dispatch(m.replace(e)),b.default.success(gettext("Your vote has been saved.")),this.props.showResults()}},{key:"handleError",value:function(e){400===e.status?b.default.error(e.detail):b.default.apiError(e)}},{key:"render",value:function(){var e=[];return this.props.poll.acl.can_vote&&e.push(0),(this.props.poll.is_public||this.props.poll.acl.can_see_votes)&&e.push(1),this.props.poll.acl.can_edit&&e.push(2),this.props.poll.acl.can_delete&&e.push(3),a.default.createElement("div",{className:"panel panel-default panel-poll"},a.default.createElement("form",{onSubmit:this.handleSubmit},a.default.createElement("div",{className:"panel-body"},a.default.createElement("h2",null,this.props.poll.question),a.default.createElement(c.default,{poll:this.props.poll}),a.default.createElement(u.default,{choices:this.state.choices,toggleChoice:this.toggleChoice}),a.default.createElement(l.default,{choicesLeft:this.state.choicesLeft,poll:this.props.poll})),a.default.createElement("div",{className:"panel-footer"},a.default.createElement("div",{className:"row"},a.default.createElement("div",{className:(0,f.getClassName)(e,0)},a.default.createElement(d.default,{className:"btn-primary btn-block btn-sm",loading:this.state.isLoading},gettext("Save your vote"))),a.default.createElement("div",{className:(0,f.getClassName)(e,1)},a.default.createElement("button",{className:"btn btn-default btn-block btn-sm",disabled:this.state.isLoading,onClick:this.props.showResults,type:"button"},gettext("See results"))),a.default.createElement(f.Edit,{controls:e,poll:this.props.poll,thread:this.props.thread}),a.default.createElement(f.Delete,{controls:e,poll:this.props.poll})))))}}])&&g(e.prototype,t),r&&g(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=j},{"../../../reducers/poll":352,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377,"../../button":8,"../../form":56,"../info":107,"../results/options":112,"./help":113,"./select":115,"./utils":116,react:"react"}],115:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ChoiceSelect=void 0,r.default=function(t){return o.default.createElement("ul",{className:"list-unstyled poll-select-choices"},t.choices.map(function(e){return o.default.createElement(u,{choice:e,key:e.hash,toggleChoice:t.toggleChoice})}))};var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return f(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(u,o.default.Component);var e,t,r,i=c(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=f(e),n=function(){e.props.toggleChoice(e.props.choice.hash)},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return o.default.createElement("li",{className:"poll-select-choice"},o.default.createElement("button",{className:this.props.choice.selected?"btn btn-selected":"btn",onClick:this.onClick,type:"button"},o.default.createElement("span",{className:"material-icon"},this.props.choice.selected?"check_box":"check_box_outline_blank"),o.default.createElement("strong",null,this.props.choice.label)))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.ChoiceSelect=u},{react:"react"}],116:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.getChoiceFromHash=function(e,t){for(var r in e){var n=e[r];if(n.hash===t)return n}return null},r.getChoicesLeft=function(e,t){var r=[];for(var n in t){var a=t[n];a.selected&&r.push(a)}return e.allowed_choices-r.length}},{}],117:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.DiffItem=o,r.cleanItem=i,r.default=function(e){return a.default.createElement("div",{className:"modal-body post-changelog-diff"},a.default.createElement("ul",{className:"list-unstyled"},e.diff.map(function(e,t){return a.default.createElement(o,{item:e,key:t})})))},r.getItemClassName=l;var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){return"?"===e.item[0]?null:a.default.createElement("li",{className:l(e.item)},i(e.item))}function l(e){var t="diff-item";return"-"===e[0]?t+=" diff-item-sub":"+"===e[0]&&(t+=" diff-item-add"),t}function i(e){return e.substr(2)}},{react:"react"}],118:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=l(e("react")),o=l(e("../button"));function l(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(u,n.default.Component);var e,t,r,i=f(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=d(e),n=function(){e.props.revertEdit(e.props.edit.id)},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return this.props.canRevert?n.default.createElement("div",{className:"modal-footer visible-xs-block"},n.default.createElement(o.default,{className:"btn-default btn-sm btn-block",disabled:this.props.disabled,onClick:this.onClick,title:gettext("Revert post to state from before this edit.")},gettext("Revert"))):null}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../button":8,react:"react"}],119:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ModalDialog=P,r.default=void 0;var o=n(e("react")),l=n(e("./diff")),u=n(e("./footer")),s=n(e("./toolbar")),c=e("./utils"),f=n(e("../modal-message")),d=n(e("../modal-loader")),p=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=v(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/post")),m=n(e("../../services/ajax")),y=n(e("../../services/modal")),b=n(e("../../services/snackbar")),h=n(e("../../services/store"));function v(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(v=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function g(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function O(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var j=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}(a,o.default.Component);var e,t,r,n=E(a);function a(e){var r;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),O(w(r=n.call(this,e)),"goToEdit",function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:null;r.setState({isBusy:!0});var t=r.props.post.api.edits;null!==e&&(t+="?edit="+e),m.default.get(t).then(function(e){r.setState({isReady:!0,isBusy:!1,edit:(0,c.hydrateEdit)(e)})},function(e){r.setState({isReady:!0,isBusy:!1,error:e.detail})})}),O(w(r),"revertEdit",function(e){var t;r.state.isBusy||window.confirm(gettext("Are you sure you with to revert this post to the state from before this edit?"))&&(r.setState({isBusy:!0}),t=r.props.post.api.edits+"?edit="+e,m.default.post(t).then(function(e){var t=p.hydrate(e);h.default.dispatch(p.patch(e,t)),b.default.success(gettext("Post has been reverted to previous state.")),y.default.hide()},function(e){b.default.apiError(e),r.setState({isBusy:!1})}))}),r.state={isReady:!1,isBusy:!0,canRevert:e.post.acl.can_edit,error:null,edit:null},r}return e=a,(t=[{key:"componentDidMount",value:function(){this.goToEdit()}},{key:"render",value:function(){return this.state.error?o.default.createElement(P,{className:"modal-dialog modal-message"},o.default.createElement(f.default,{message:this.state.error})):this.state.isReady?o.default.createElement(P,null,o.default.createElement(s.default,{canRevert:this.state.canRevert,disabled:this.state.isBusy,edit:this.state.edit,goToEdit:this.goToEdit,revertEdit:this.revertEdit}),o.default.createElement(l.default,{diff:this.state.edit.diff}),o.default.createElement(u.default,{canRevert:this.state.canRevert,disabled:this.state.isBusy,edit:this.state.edit,revertEdit:this.revertEdit})):o.default.createElement(P,null,o.default.createElement(d.default,null))}}])&&g(e.prototype,t),r&&g(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function P(e){return o.default.createElement("div",{className:e.className||"modal-dialog",role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Post edits history"))),e.children))}r.default=j},{"../../reducers/post":353,"../../services/ajax":365,"../../services/modal":371,"../../services/snackbar":376,"../../services/store":377,"../modal-loader":61,"../modal-message":62,"./diff":117,"./footer":118,"./toolbar":120,"./utils":121,react:"react"}],120:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.GoBackBtn=v,r.GoForwardBtn=g,r.GoLastBtn=_,r.Label=w,r.RevertBtn=E,r.default=void 0;var l=i(e("react")),n=i(e("../button")),o=i(e("../../utils/escape-html"));function i(e){return e&&e.__esModule?e:{default:e}}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=d(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return f(e)}(this,n?(e=d(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function d(e){return(d=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function p(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var m='<abbr title="%(absolute)s">%(relative)s</abbr>',y='<span class="item-title">%(user)s</span>',b='<a href="%(url)s" class="item-title">%(user)s</a>',h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(o,l.default.Component);var e,t,r,a=c(o);function o(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return p(f(e=a.call.apply(a,[this].concat(r))),"goLast",function(){e.props.goToEdit()}),p(f(e),"goForward",function(){e.props.goToEdit(e.props.edit.next)}),p(f(e),"goBack",function(){e.props.goToEdit(e.props.edit.previous)}),p(f(e),"revertEdit",function(){e.props.revertEdit(e.props.edit.id)}),e}return e=o,(t=[{key:"render",value:function(){return l.default.createElement("div",{className:"modal-toolbar post-changelog-toolbar"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-xs-12 col-sm-4"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-xs-4"},l.default.createElement(v,{disabled:this.props.disabled,edit:this.props.edit,onClick:this.goBack})),l.default.createElement("div",{className:"col-xs-4"},l.default.createElement(g,{disabled:this.props.disabled,edit:this.props.edit,onClick:this.goForward})),l.default.createElement("div",{className:"col-xs-4"},l.default.createElement(_,{disabled:this.props.disabled,edit:this.props.edit,onClick:this.goLast})))),l.default.createElement("div",{className:"col-xs-12 col-sm-5 xs-margin-top-half post-change-label"},l.default.createElement(w,{edit:this.props.edit})),l.default.createElement(E,{canRevert:this.props.canRevert,disabled:this.props.disabled,onClick:this.revertEdit})))}}])&&u(e.prototype,t),r&&u(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();function v(e){return l.default.createElement(n.default,{className:"btn-default btn-block btn-icon btn-sm",disabled:e.disabled||!e.edit.previous,onClick:e.onClick,title:gettext("See previous change")},l.default.createElement("span",{className:"material-icon"},"chevron_left"))}function g(e){return l.default.createElement(n.default,{className:"btn-default btn-block btn-icon btn-sm",disabled:e.disabled||!e.edit.next,onClick:e.onClick,title:gettext("See next change")},l.default.createElement("span",{className:"material-icon"},"chevron_right"))}function _(e){return l.default.createElement(n.default,{className:"btn-default btn-block btn-icon btn-sm",disabled:e.disabled||!e.edit.next,onClick:e.onClick,title:gettext("See previous change")},l.default.createElement("span",{className:"material-icon"},"last_page"))}function E(e){return e.canRevert?l.default.createElement("div",{className:"col-sm-3 hidden-xs"},l.default.createElement(n.default,{className:"btn-default btn-sm btn-block",disabled:e.disabled,onClick:e.onClick,title:gettext("Revert post to state from before this edit.")},gettext("Revert"))):null}function w(e){var t=null,t=e.edit.url.editor?interpolate(b,{url:(0,o.default)(e.edit.url.editor),user:(0,o.default)(e.edit.editor_name)},!0):interpolate(y,{user:(0,o.default)(e.edit.editor_name)},!0),r=interpolate(m,{absolute:(0,o.default)(e.edit.edited_on.format("LLL")),relative:(0,o.default)(e.edit.edited_on.fromNow())},!0),n=interpolate((0,o.default)(gettext("By %(edited_by)s %(edited_on)s.")),{edited_by:t,edited_on:r},!0);return l.default.createElement("p",{dangerouslySetInnerHTML:{__html:n}})}r.default=h},{"../../utils/escape-html":383,"../button":8,react:"react"}],121:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.hydrateEdit=function(e){return Object.assign({},e,{edited_on:(0,a.default)(e.edited_on)})};var n,a=(n=e("moment"))&&n.__esModule?n:{default:n}},{moment:"moment"}],122:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.isReady,r=e.posts,n=e.poster;return t?a.default.createElement("ul",{className:"posts-list post-feed ui-ready"},r.map(function(e){return a.default.createElement(o.default,{key:e.id,post:e,poster:n})})):a.default.createElement(l.default,null)};var a=n(e("react")),o=n(e("./post")),l=n(e("./preview"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./post":125,"./preview":131,react:"react"}],123:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Default=l,r.Invalid=i,r.default=function(e){return e.post.content?n.default.createElement(l,e):n.default.createElement(i,e)};var n=o(e("react")),a=o(e("../../misago-markup"));o(e("../../../utils/escape-html"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e){return n.default.createElement("div",{className:"post-body"},n.default.createElement(a.default,{markup:e.post.content}))}function i(e){return n.default.createElement("div",{className:"post-body post-body-invalid"},n.default.createElement("p",{className:"lead"},gettext("This post's contents cannot be displayed.")),n.default.createElement("p",{className:"text-muted"},gettext("This error is caused by invalid post content manipulation.")))}},{"../../../utils/escape-html":383,"../../misago-markup":60,react:"react"}],124:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post,r=t.category,n=t.thread,a=interpolate(gettext("posted %(posted_on)s"),{posted_on:t.posted_on.format("LL, LT")},!0);return o.default.createElement("div",{className:"post-heading"},o.default.createElement("a",{className:"btn btn-link item-title",href:n.url},n.title),o.default.createElement("a",{className:"btn btn-link post-category",href:r.url.index},r.name),o.default.createElement("a",{href:t.url.index,className:"btn btn-link posted-on",title:a},t.posted_on.fromNow()))};var n,o=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],125:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post,r=e.poster||t.poster,n="post";r&&r.rank.css_class&&(n+=" post-"+r.rank.css_class);return a.default.createElement("li",{className:n,id:"post-"+t.id},a.default.createElement("div",{className:"panel panel-default panel-post"},a.default.createElement("div",{className:"panel-body"},a.default.createElement(i.default,{post:t,poster:r}),a.default.createElement(l.default,{post:t}),a.default.createElement(o.default,{post:t}))))};var a=n(e("react")),o=n(e("./body")),l=n(e("./header")),i=n(e("./post-side"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./body":123,"./header":124,"./post-side":128,react:"react"}],126:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post;return n.default.createElement("div",{className:"post-side post-side-anonymous"},n.default.createElement(o.default,{post:t}),n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left"},n.default.createElement("span",null,n.default.createElement(a.default,{className:"poster-avatar",size:50}))),n.default.createElement("div",{className:"media-body"},n.default.createElement("div",{className:"media-heading"},n.default.createElement("span",{className:"item-title"},t.poster_name)),n.default.createElement("span",{className:"user-title user-title-anonymous"},gettext("Removed user")))))};var n=l(e("react")),a=l(e("../../../avatar")),o=l(e("./button"));function l(e){return e&&e.__esModule?e:{default:e}}},{"../../../avatar":6,"./button":127,react:"react"}],127:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post;return a.default.createElement("a",{className:"btn btn-default btn-icon pull-right",href:t.url.index},a.default.createElement("span",{className:"btn-text-left hidden-xs"},gettext("See post")),a.default.createElement("span",{className:"material-icon"},"chevron_right"))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],128:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post,r=e.poster;if(r.id)return n.default.createElement(o.default,{post:t,poster:r});return n.default.createElement(a.default,{post:t})};var n=l(e("react")),a=l(e("./anonymous")),o=l(e("./registered"));function l(e){return e&&e.__esModule?e:{default:e}}},{"./anonymous":126,"./registered":129,react:"react"}],129:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post,r=e.poster;return n.default.createElement("div",{className:"post-side post-side-registered"},n.default.createElement(o.default,{post:t}),n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left"},n.default.createElement("a",{href:r.url},n.default.createElement(a.default,{className:"poster-avatar",size:50,user:r}))),n.default.createElement("div",{className:"media-body"},n.default.createElement("div",{className:"media-heading"},n.default.createElement("a",{className:"item-title",href:r.url},r.username)),n.default.createElement(l.default,{title:r.title,rank:r.rank}))))};var n=i(e("react")),a=i(e("../../../avatar")),o=i(e("./button")),l=i(e("./user-title"));function i(e){return e&&e.__esModule?e:{default:e}}},{"../../../avatar":6,"./button":127,"./user-title":130,react:"react"}],130:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.rank,r=e.title||t.title||t.name,n="user-title";t.css_class&&(n+=" user-title-"+t.css_class);if(t.is_tab)return a.default.createElement("a",{className:n,href:t.url},r);return a.default.createElement("span",{className:n},r)};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],131:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(){return n.default.createElement("ul",{className:"posts-list post-feed ui-preview"},n.default.createElement("li",{className:"post"},n.default.createElement("div",{className:"panel panel-default panel-post"},n.default.createElement("div",{className:"panel-body"},n.default.createElement("div",{className:"post-side post-side-anonymous"},n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left"},n.default.createElement("span",null,n.default.createElement(a.default,{className:"poster-avatar",size:50}))),n.default.createElement("div",{className:"media-body"},n.default.createElement("div",{className:"media-heading"},n.default.createElement("span",{className:"item-title"},n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,200)+"px"}}," "))),n.default.createElement("span",{className:"user-title user-title-anonymous"},n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,200)+"px"}}," "))))),n.default.createElement("div",{className:"post-heading"},n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,200)+"px"}}," ")),n.default.createElement("div",{className:"post-body"},n.default.createElement("article",{className:"misago-markup"},n.default.createElement("p",null,n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,200)+"px"}}," ")," ",n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,200)+"px"}}," ")," ",n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,200)+"px"}}," "))))))))};var n=l(e("react")),a=l(e("../avatar")),o=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../utils/random"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}},{"../../utils/random":388,"../avatar":6,react:"react"}],132:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.LikeDate=E,r.LikeDetails=_,r.LikesList=g,r.ModalDialog=v,r.default=void 0,r.hydrateLike=h;var i=c(e("react")),n=c(e("moment")),o=c(e("./avatar")),l=c(e("./modal-message")),u=c(e("./modal-loader")),s=c(e("../services/ajax"));function c(e){return e&&e.__esModule?e:{default:e}}function f(){return(f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var b=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(a,i.default.Component);var e,t,r,n=m(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={isReady:!1,error:null,likes:[]},t}return e=a,(t=[{key:"componentDidMount",value:function(){var t=this;s.default.get(this.props.post.api.likes).then(function(e){t.setState({isReady:!0,likes:e.map(h)})},function(e){t.setState({isReady:!0,error:e.detail})})}},{key:"render",value:function(){return this.state.error?i.default.createElement(v,{className:"modal-message"},i.default.createElement(l.default,{message:this.state.error})):this.state.isReady?this.state.likes.length?i.default.createElement(v,{className:"modal-sm",likes:this.state.likes},i.default.createElement(g,{likes:this.state.likes})):i.default.createElement(v,{className:"modal-message"},i.default.createElement(l.default,{message:gettext("No users have liked this post.")})):i.default.createElement(v,{className:"modal-sm"},i.default.createElement(u.default,null))}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function h(e){return Object.assign({},e,{liked_on:(0,n.default)(e.liked_on)})}function v(e){var t,r,n=e.className,a=e.children,o=e.likes,l=gettext("Post Likes");return o&&(t=o.length,r=ngettext("%(likes)s like","%(likes)s likes",t),l=interpolate(r,{likes:t},!0)),i.default.createElement("div",{className:"modal-dialog "+(n||""),role:"document"},i.default.createElement("div",{className:"modal-content"},i.default.createElement("div",{className:"modal-header"},i.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},i.default.createElement("span",{"aria-hidden":"true"},"×")),i.default.createElement("h4",{className:"modal-title"},l)),a))}function g(e){return i.default.createElement("div",{className:"modal-body modal-post-likers"},i.default.createElement("ul",{className:"media-list"},e.likes.map(function(e){return i.default.createElement(_,f({key:e.id},e))})))}function _(e){if(e.url){var t={id:e.liker_id,avatars:e.avatars};return i.default.createElement("li",{className:"media"},i.default.createElement("div",{className:"media-left"},i.default.createElement("a",{className:"user-avatar",href:e.url},i.default.createElement(o.default,{size:"50",user:t}))),i.default.createElement("div",{className:"media-body"},i.default.createElement("a",{className:"item-title",href:e.url},e.username)," ",i.default.createElement(E,{likedOn:e.liked_on})))}return i.default.createElement("li",{className:"media"},i.default.createElement("div",{className:"media-left"},i.default.createElement("span",{className:"user-avatar"},i.default.createElement(o.default,{size:"50"}))),i.default.createElement("div",{className:"media-body"},i.default.createElement("strong",null,e.username)," ",i.default.createElement(E,{likedOn:e.liked_on})))}function E(e){return i.default.createElement("span",{className:"text-muted",title:e.likedOn.format("LLL")},e.likedOn.fromNow())}r.default=b},{"../services/ajax":365,"./avatar":6,"./modal-loader":61,"./modal-message":62,moment:"moment",react:"react"}],133:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../editor")),u=n(e("../form")),s=n(e("./utils/container")),c=n(e("./utils/loader")),f=n(e("./utils/message")),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=h(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./utils/attachments")),p=e("./utils/validators"),m=n(e("../../services/ajax")),y=n(e("../../services/posting")),b=n(e("../../services/snackbar"));function h(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(h=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function v(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function w(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var O=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}(a,u.default);var e,t,r,n=_(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),w(E(t=n.call(this,e)),"loadSuccess",function(e){t.setState({isReady:!0,post:e.post,attachments:d.hydrate(e.attachments),protect:e.is_protected,canProtect:e.can_protect})}),w(E(t),"loadError",function(e){t.setState({isErrored:e.detail})}),w(E(t),"onCancel",function(){window.confirm(gettext("Are you sure you want to discard changes?"))&&y.default.close()}),w(E(t),"onProtect",function(){t.setState({protect:!0})}),w(E(t),"onUnprotect",function(){t.setState({protect:!1})}),w(E(t),"onPostChange",function(e){t.changeValue("post",e.target.value)}),w(E(t),"onAttachmentsChange",function(e){t.setState({attachments:e})}),t.state={isReady:!1,isLoading:!1,isErrored:!1,post:"",attachments:[],protect:!1,canProtect:!1,validators:{post:(0,p.getPostValidators)()},errors:{}},t}return e=a,(t=[{key:"componentDidMount",value:function(){m.default.get(this.props.config).then(this.loadSuccess,this.loadError)}},{key:"clean",value:function(){if(!this.state.post.trim().length)return b.default.error(gettext("You have to enter a message.")),!1;var e=this.validate();return!e.post||(b.default.error(e.post[0]),!1)}},{key:"send",value:function(){return m.default.put(this.props.submit,{post:this.state.post,attachments:d.clean(this.state.attachments),protect:this.state.protect})}},{key:"handleSuccess",value:function(e){b.default.success(gettext("Reply has been edited.")),window.location=e.url.index,this.setState({isLoading:!0})}},{key:"handleError",value:function(e){var t;400===e.status?(t=[].concat(e.non_field_errors||[],e.category||[],e.title||[],e.post||[],e.attachments||[]),b.default.error(t[0])):b.default.apiError(e)}},{key:"render",value:function(){return this.state.isReady?o.default.createElement(s.default,{className:"posting-form"},o.default.createElement("form",{onSubmit:this.handleSubmit,method:"POST"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-md-12"},o.default.createElement(l.default,{attachments:this.state.attachments,canProtect:this.state.canProtect,loading:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onCancel:this.onCancel,onChange:this.onPostChange,onProtect:this.onProtect,onUnprotect:this.onUnprotect,protect:this.state.protect,submitLabel:gettext("Edit reply"),value:this.state.post}))))):this.state.isErrored?o.default.createElement(f.default,{message:this.state.isErrored}):o.default.createElement(c.default,null)}}])&&v(e.prototype,t),r&&v(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=O},{"../../services/ajax":365,"../../services/posting":375,"../../services/snackbar":376,"../editor":52,"../form":56,"./utils/attachments":138,"./utils/container":139,"./utils/loader":140,"./utils/message":141,"./utils/validators":144,react:"react"}],134:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return"START"===e.mode?n.default.createElement(a.default,e):"START_PRIVATE"===e.mode?n.default.createElement(o.default,e):"REPLY"===e.mode?n.default.createElement(l.default,e):"EDIT"===e.mode?n.default.createElement(i.default,e):null};var n=u(e("react")),a=u(e("./start")),o=u(e("./start-private")),l=u(e("./reply")),i=u(e("./edit"));function u(e){return e&&e.__esModule?e:{default:e}}},{"./edit":133,"./reply":135,"./start":137,"./start-private":136,react:"react"}],135:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../editor")),u=n(e("../form")),s=n(e("./utils/container")),c=n(e("./utils/loader")),f=n(e("./utils/message")),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=h(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./utils/attachments")),p=e("./utils/validators"),m=n(e("../../services/ajax")),y=n(e("../../services/posting")),b=n(e("../../services/snackbar"));function h(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(h=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function v(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function w(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var O=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}(a,u.default);var e,t,r,n=_(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),w(E(t=n.call(this,e)),"loadSuccess",function(e){t.setState({isReady:!0,post:e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]":""})}),w(E(t),"loadError",function(e){t.setState({isErrored:e.detail})}),w(E(t),"appendData",function(e){var r=e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]\n\n":"";t.setState(function(e,t){return 0<e.post.length?{post:e.post+"\n\n"+r}:{post:r}})}),w(E(t),"onCancel",function(){window.confirm(gettext("Are you sure you want to discard your reply?"))&&y.default.close()}),w(E(t),"onPostChange",function(e){t.changeValue("post",e.target.value)}),w(E(t),"onAttachmentsChange",function(e){t.setState({attachments:e})}),t.state={isReady:!1,isLoading:!1,isErrored:!1,post:"",attachments:[],validators:{post:(0,p.getPostValidators)()},errors:{}},t}return e=a,(t=[{key:"componentDidMount",value:function(){m.default.get(this.props.config,this.props.context||null).then(this.loadSuccess,this.loadError)}},{key:"componentWillReceiveProps",value:function(e){var t=this.props.context,r=e.context;t&&r&&t.reply===r.reply||m.default.get(e.config,e.context||null).then(this.appendData,b.default.apiError)}},{key:"clean",value:function(){if(!this.state.post.trim().length)return b.default.error(gettext("You have to enter a message.")),!1;var e=this.validate();return!e.post||(b.default.error(e.post[0]),!1)}},{key:"send",value:function(){return m.default.post(this.props.submit,{post:this.state.post,attachments:d.clean(this.state.attachments)})}},{key:"handleSuccess",value:function(e){b.default.success(gettext("Your reply has been posted.")),window.location=e.url.index,this.setState({isLoading:!0})}},{key:"handleError",value:function(e){var t;400===e.status?(t=[].concat(e.non_field_errors||[],e.post||[],e.attachments||[]),b.default.error(t[0])):b.default.apiError(e)}},{key:"render",value:function(){return this.state.isReady?o.default.createElement(s.default,{className:"posting-form"},o.default.createElement("form",{onSubmit:this.handleSubmit,method:"POST"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-md-12"},o.default.createElement(l.default,{attachments:this.state.attachments,loading:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onCancel:this.onCancel,onChange:this.onPostChange,submitLabel:gettext("Post reply"),value:this.state.post}))))):this.state.isErrored?o.default.createElement(f.default,{message:this.state.isErrored}):o.default.createElement(c.default,null)}}])&&v(e.prototype,t),r&&v(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=O},{"../../services/ajax":365,"../../services/posting":375,"../../services/snackbar":376,"../editor":52,"../form":56,"./utils/attachments":138,"./utils/container":139,"./utils/loader":140,"./utils/message":141,"./utils/validators":144,react:"react"}],136:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../editor")),u=n(e("../form")),s=n(e("./utils/container")),c=(n(e("./utils/message")),function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=b(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./utils/attachments"))),f=n(e("./utils/usernames")),d=e("./utils/validators"),p=n(e("../../services/ajax")),m=n(e("../../services/posting")),y=n(e("../../services/snackbar"));function b(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(b=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function h(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function v(e,t){return(v=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function g(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return _(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function _(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function E(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var w=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&v(e,t)}(a,u.default);var e,t,r,n=g(a);function a(e){var t;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),E(_(t=n.call(this,e)),"onCancel",function(){window.confirm(gettext("Are you sure you want to discard private thread?"))&&m.default.close()}),E(_(t),"onToChange",function(e){t.changeValue("to",e.target.value)}),E(_(t),"onTitleChange",function(e){t.changeValue("title",e.target.value)}),E(_(t),"onPostChange",function(e){t.changeValue("post",e.target.value)}),E(_(t),"onAttachmentsChange",function(e){t.setState({attachments:e})});var r=(e.to||[]).map(function(e){return e.username}).join(", ");return t.state={isLoading:!1,to:r,title:"",post:"",attachments:[],validators:{title:(0,d.getTitleValidators)(),post:(0,d.getPostValidators)()},errors:{}},t}return e=a,(t=[{key:"clean",value:function(){if(!(0,f.default)(this.state.to).length)return y.default.error(gettext("You have to enter at least one recipient.")),!1;if(!this.state.title.trim().length)return y.default.error(gettext("You have to enter thread title.")),!1;if(!this.state.post.trim().length)return y.default.error(gettext("You have to enter a message.")),!1;var e=this.validate();return e.title?(y.default.error(e.title[0]),!1):!e.post||(y.default.error(e.post[0]),!1)}},{key:"send",value:function(){return p.default.post(this.props.submit,{to:(0,f.default)(this.state.to),title:this.state.title,post:this.state.post,attachments:c.clean(this.state.attachments)})}},{key:"handleSuccess",value:function(e){y.default.success(gettext("Your thread has been posted.")),window.location=e.url,this.setState({isLoading:!0})}},{key:"handleError",value:function(e){var t;400===e.status?(t=[].concat(e.non_field_errors||[],e.to||[],e.title||[],e.post||[],e.attachments||[]),y.default.error(t[0])):y.default.apiError(e)}},{key:"render",value:function(){return o.default.createElement(s.default,{className:"posting-form",withFirstRow:!0},o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"row first-row"},o.default.createElement("div",{className:"col-xs-12"},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onToChange,placeholder:gettext("Comma separated list of user names, eg.: Danny, Lisa"),type:"text",value:this.state.to}))),o.default.createElement("div",{className:"row first-row"},o.default.createElement("div",{className:"col-xs-12"},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onTitleChange,placeholder:gettext("Thread title"),type:"text",value:this.state.title}))),o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-xs-12"},o.default.createElement(l.default,{attachments:this.state.attachments,loading:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onCancel:this.onCancel,onChange:this.onPostChange,submitLabel:gettext("Post thread"),value:this.state.post})))))}}])&&h(e.prototype,t),r&&h(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=w},{"../../services/ajax":365,"../../services/posting":375,"../../services/snackbar":376,"../editor":52,"../form":56,"./utils/attachments":138,"./utils/container":139,"./utils/message":141,"./utils/usernames":143,"./utils/validators":144,react:"react"}],137:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../category-select")),u=n(e("../editor")),s=n(e("../form")),c=n(e("./utils/container")),f=n(e("./utils/loader")),d=n(e("./utils/message")),p=n(e("./utils/options")),m=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=g(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./utils/attachments")),y=e("./utils/validators"),b=n(e("../../services/ajax")),h=n(e("../../services/posting")),v=n(e("../../services/snackbar"));function g(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(g=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function _(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function E(e,t){return(E=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function w(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return O(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function O(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function j(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var P=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&E(e,t)}(a,s.default);var e,t,r,n=w(a);function a(e){var o;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),j(O(o=n.call(this,e)),"loadSuccess",function(e){var t=null,r=!1,n=null,a=e.map(function(e){return!1===e.post||t&&e.id!=o.state.category||(t=e.id,n=e.post),e.post&&(e.post.close||e.post.hide||e.post.pin)&&(r=!0),Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id})});o.setState({isReady:!0,showOptions:r,categories:a,category:t,categoryOptions:n})}),j(O(o),"loadError",function(e){o.setState({isErrored:e.detail})}),j(O(o),"onCancel",function(){window.confirm(gettext("Are you sure you want to discard thread?"))&&h.default.close()}),j(O(o),"onTitleChange",function(e){o.changeValue("title",e.target.value)}),j(O(o),"onCategoryChange",function(t){var e=o.state.categories.find(function(e){return t.target.value==e.value}),r=o.state.pin;e.post.pin&&e.post.pin<r&&(r=e.post.pin),o.setState({category:e.id,categoryOptions:e.post,pin:r})}),j(O(o),"onPostChange",function(e){o.changeValue("post",e.target.value)}),j(O(o),"onAttachmentsChange",function(e){o.setState({attachments:e})}),j(O(o),"onClose",function(){o.changeValue("close",!0)}),j(O(o),"onOpen",function(){o.changeValue("close",!1)}),j(O(o),"onPinGlobally",function(){o.changeValue("pin",2)}),j(O(o),"onPinLocally",function(){o.changeValue("pin",1)}),j(O(o),"onUnpin",function(){o.changeValue("pin",0)}),j(O(o),"onHide",function(){o.changeValue("hide",!0)}),j(O(o),"onUnhide",function(){o.changeValue("hide",!1)}),o.state={isReady:!1,isLoading:!1,isErrored:!1,showOptions:!1,categoryOptions:null,title:"",category:e.category||null,categories:[],post:"",attachments:[],close:!1,hide:!1,pin:0,validators:{title:(0,y.getTitleValidators)(),post:(0,y.getPostValidators)()},errors:{}},o}return e=a,(t=[{key:"componentDidMount",value:function(){b.default.get(this.props.config).then(this.loadSuccess,this.loadError)}},{key:"clean",value:function(){if(!this.state.title.trim().length)return v.default.error(gettext("You have to enter thread title.")),!1;if(!this.state.post.trim().length)return v.default.error(gettext("You have to enter a message.")),!1;var e=this.validate();return e.title?(v.default.error(e.title[0]),!1):!e.post||(v.default.error(e.post[0]),!1)}},{key:"send",value:function(){return b.default.post(this.props.submit,{title:this.state.title,category:this.state.category,post:this.state.post,attachments:m.clean(this.state.attachments),close:this.state.close,hide:this.state.hide,pin:this.state.pin})}},{key:"handleSuccess",value:function(e){v.default.success(gettext("Your thread has been posted.")),window.location=e.url,this.setState({isLoading:!0})}},{key:"handleError",value:function(e){var t;400===e.status?(t=[].concat(e.non_field_errors||[],e.category||[],e.title||[],e.post||[],e.attachments||[]),v.default.error(t[0])):v.default.apiError(e)}},{key:"render",value:function(){if(this.state.isErrored)return o.default.createElement(d.default,{message:this.state.isErrored});if(!this.state.isReady)return o.default.createElement(f.default,null);var e=0;this.state.categoryOptions.close&&(e+=1),this.state.categoryOptions.hide&&(e+=1),this.state.categoryOptions.pin&&(e+=1);var t=null,t=1===e?"col-sm-6":"col-sm-8";return t+=3===e?" col-md-6":e?" col-md-7":" col-md-9",o.default.createElement(c.default,{className:"posting-form",withFirstRow:!0},o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"row first-row"},o.default.createElement("div",{className:t},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onTitleChange,placeholder:gettext("Thread title"),type:"text",value:this.state.title})),o.default.createElement("div",{className:"col-xs-12 col-sm-4 col-md-3 xs-margin-top"},o.default.createElement(l.default,{choices:this.state.categories,disabled:this.state.isLoading,onChange:this.onCategoryChange,value:this.state.category})),o.default.createElement(p.default,{close:this.state.close,columns:e,disabled:this.state.isLoading,hide:this.state.hide,onClose:this.onClose,onHide:this.onHide,onOpen:this.onOpen,onPinGlobally:this.onPinGlobally,onPinLocally:this.onPinLocally,onUnhide:this.onUnhide,onUnpin:this.onUnpin,options:this.state.categoryOptions,pin:this.state.pin,showOptions:this.state.showOptions})),o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-md-12"},o.default.createElement(u.default,{attachments:this.state.attachments,loading:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onCancel:this.onCancel,onChange:this.onPostChange,submitLabel:gettext("Post thread"),value:this.state.post})))))}}])&&_(e.prototype,t),r&&_(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=P},{"../../services/ajax":365,"../../services/posting":375,"../../services/snackbar":376,"../category-select":21,"../editor":52,"../form":56,"./utils/attachments":138,"./utils/container":139,"./utils/loader":140,"./utils/message":141,"./utils/options":142,"./utils/validators":144,react:"react"}],138:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.clean=function(e){return e.filter(function(e){return e.id&&!e.isRemoved}).map(function(e){return e.id})},r.hydrate=function(e){return e.map(function(e){return Object.assign({},e,{uploaded_on:(0,a.default)(e.uploaded_on)})})};var n,a=(n=e("moment"))&&n.__esModule?n:{default:n}},{moment:"moment"}],139:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return a.default.createElement("div",{className:e.className},a.default.createElement("div",{className:"container"},e.children))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],140:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,{className:"posting-loader"},n.default.createElement(o.default,null))};var n=l(e("react")),a=l(e("./container")),o=l(e("../../loader"));function l(e){return e&&e.__esModule?e:{default:e}}},{"../../loader":58,"./container":139,react:"react"}],141:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement(a.default,{className:"posting-message"},n.default.createElement("div",{className:"message-body"},n.default.createElement("p",null,n.default.createElement("span",{className:"material-icon"},"error_outline"),e.message),n.default.createElement("button",{type:"button",className:"btn btn-default",onClick:o.default.close},gettext("Dismiss"))))};var n=l(e("react")),a=l(e("./container")),o=l(e("../../../services/posting"));function l(e){return e&&e.__esModule?e:{default:e}}},{"../../../services/posting":375,"./container":139,react:"react"}],142:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.CloseOptions=l,r.HideOptions=i,r.PinOptions=u,r.default=function(e){if(!e.showOptions)return null;var t=e.columns,r="col-xs-12 xs-margin-top";r+=1===t?" col-sm-2":" sm-margin-top";r+=3===t?" col-md-3":" col-md-2";r+=" posting-options";var n="col-xs-"+12/t,a="btn-text";a+=3===t?" visible-sm-inline-block":2===t?" hidden-md hidden-lg":" hidden-sm";return o.default.createElement("div",{className:r},o.default.createElement("div",{className:"row"},o.default.createElement(u,{className:n,disabled:e.disabled,onPinGlobally:e.onPinGlobally,onPinLocally:e.onPinLocally,onUnpin:e.onUnpin,pin:e.pin,show:e.options.pin,textClassName:a}),o.default.createElement(i,{className:n,disabled:e.disabled,hide:e.hide,onHide:e.onHide,onUnhide:e.onUnhide,show:e.options.hide,textClassName:a}),o.default.createElement(l,{className:n,close:e.close,disabled:e.disabled,onClose:e.onClose,onOpen:e.onOpen,show:e.options.close,textClassName:a})))};var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e){if(!e.show)return null;var t=e.close?gettext("Closed"):gettext("Open");return o.default.createElement("div",{className:e.className},o.default.createElement("button",{className:"btn btn-default btn-block",disabled:e.disabled,onClick:e.close?e.onOpen:e.onClose,title:t,type:"button"},o.default.createElement("span",{className:"material-icon"},e.close?"lock":"lock_outline"),o.default.createElement("span",{className:e.textClassName},t)))}function i(e){if(!e.show)return null;var t=e.hide?gettext("Hidden"):gettext("Not hidden");return o.default.createElement("div",{className:e.className},o.default.createElement("button",{className:"btn btn-default btn-block",disabled:e.disabled,onClick:e.hide?e.onUnhide:e.onHide,title:t,type:"button"},o.default.createElement("span",{className:"material-icon"},e.hide?"visibility_off":"visibility"),o.default.createElement("span",{className:e.textClassName},t)))}function u(e){if(!e.show)return null;var t=null,r=null,n=null;switch(e.pin){case 0:t="radio_button_unchecked",r=e.onPinLocally,n=gettext("Unpinned");break;case 1:t="bookmark_outline",r=e.onPinGlobally,n=gettext("Pinned locally"),r=2==e.show?e.onPinGlobally:e.onUnpin;break;case 2:t="bookmark",r=e.onUnpin,n=gettext("Pinned globally")}return o.default.createElement("div",{className:e.className},o.default.createElement("button",{className:"btn btn-default btn-block",disabled:e.disabled,onClick:r,title:n,type:"button"},o.default.createElement("span",{className:"material-icon"},t),o.default.createElement("span",{className:e.textClassName},n)))}},{react:"react"}],143:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var r=e.split(",").map(function(e){return e.trim().toLowerCase()}).filter(function(e){return 0<e.length});return r.filter(function(e,t){return r.indexOf(e)==t})}},{}],144:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.getPostValidators=function(){return o.default.get("SETTINGS").post_length_max?[u(),s()]:[u()]},r.getTitleLengthMax=i,r.getTitleLengthMin=l,r.getTitleValidators=function(){return[l(),i()]},r.validatePostLengthMax=s,r.validatePostLengthMin=u;var n,a=e("../../../utils/validators"),o=(n=e("../../.."))&&n.__esModule?n:{default:n};function l(){return(0,a.minLength)(o.default.get("SETTINGS").thread_title_length_min,function(e,t){var r=ngettext("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(r,{limit_value:e,show_value:t},!0)})}function i(){return(0,a.maxLength)(o.default.get("SETTINGS").thread_title_length_max,function(e,t){var r=ngettext("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(r,{limit_value:e,show_value:t},!0)})}function u(){return(0,a.minLength)(o.default.get("SETTINGS").post_length_min,function(e,t){var r=ngettext("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(r,{limit_value:e,show_value:t},!0)})}function s(){return(0,a.maxLength)(o.default.get("SETTINGS").post_length_max||1e6,function(e,t){var r=ngettext("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(r,{limit_value:e,show_value:t},!0)})}},{"../../..":302,"../../../utils/validators":393}],145:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Unhide=r.Hide=r.Delete=void 0,r.default=function(e){return E(e.post.acl)?n.default.createElement("li",{className:"event-controls"},n.default.createElement(w,e),n.default.createElement(O,e),n.default.createElement(j,e)):null},r.isVisible=E;var n=a(e("react")),l=a(e("moment")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/post")),s=a(e("../../../services/ajax")),c=a(e("../../../services/snackbar")),f=a(e("../../../services/store"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function a(e){return e&&e.__esModule?e:{default:e}}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t,r){return t&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function y(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function E(e){return e.can_hide}var w=function(){y(o,n.default.Component);var a=h(o);function o(){var t;p(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return _(v(t=a.call.apply(a,[this].concat(r))),"onClick",function(){f.default.dispatch(u.patch(t.props.post,{is_hidden:!0,hidden_on:(0,l.default)(),hidden_by_name:t.props.user.username,url:Object.assign(t.props.post.url,{hidden_by:t.props.user.url})}));s.default.patch(t.props.post.api.index,[{op:"replace",path:"is-hidden",value:!0}]).then(function(e){f.default.dispatch(u.patch(t.props.post,e))},function(e){400===e.status?c.default.error(e.detail[0]):c.default.apiError(e),f.default.dispatch(u.patch(t.props.post,{is_hidden:!1}))})}),t}return m(o,[{key:"render",value:function(){return this.props.post.is_hidden?null:n.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},gettext("Hide"))}}]),o}();r.Hide=w;var O=function(){y(o,n.default.Component);var a=h(o);function o(){var t;p(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return _(v(t=a.call.apply(a,[this].concat(r))),"onClick",function(){f.default.dispatch(u.patch(t.props.post,{is_hidden:!1}));s.default.patch(t.props.post.api.index,[{op:"replace",path:"is-hidden",value:!1}]).then(function(e){f.default.dispatch(u.patch(t.props.post,e))},function(e){400===e.status?c.default.error(e.detail[0]):c.default.apiError(e),f.default.dispatch(u.patch(t.props.post,{is_hidden:!0}))})}),t}return m(o,[{key:"render",value:function(){return this.props.post.is_hidden?n.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},gettext("Unhide")):null}}]),o}();r.Unhide=O;var j=function(){y(o,n.default.Component);var a=h(o);function o(){var t;p(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return _(v(t=a.call.apply(a,[this].concat(r))),"onClick",function(){window.confirm(gettext("Are you sure you wish to delete this event? This action is not reversible!"))&&t.delete()}),_(v(t),"delete",function(){f.default.dispatch(u.patch(t.props.post,{isDeleted:!0})),s.default.delete(t.props.post.api.index).then(function(){c.default.success(gettext("Event has been deleted."))},function(e){400===e.status?c.default.error(e.detail[0]):c.default.apiError(e),f.default.dispatch(u.patch(t.props.post,{isDeleted:!1}))})}),t}return m(o,[{key:"render",value:function(){return n.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},gettext("Delete"))}}]),o}();r.Delete=j},{"../../../reducers/post":353,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377,moment:"moment",react:"react"}],146:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return a.default.createElement("div",{className:"post-avatar"},a.default.createElement("span",{className:"material-icon"},o[e.post.event_type]))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n};var o={changed_title:"edit",pinned_globally:"bookmark",pinned_locally:"bookmark_border",unpinned:"panorama_fish_eye",moved:"arrow_forward",merged:"call_merge",approved:"done",opened:"lock_open",closed:"lock_outline",unhid:"visibility",hid:"visibility_off",changed_owner:"grade",tookover:"grade",added_participant:"person_add",owner_left:"person_outline",participant_left:"person_outline",removed_participant:"remove_circle_outline"}},{react:"react"}],147:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t="event";e.post.isDeleted?t="hide":e.post.is_hidden&&(t="event post-hidden");return n.default.createElement("li",{id:"post-"+e.post.id,className:t},n.default.createElement(i.default,{post:e.post}),n.default.createElement("div",{className:"row"},n.default.createElement("div",{className:"col-xs-2 col-sm-3 text-right"},n.default.createElement(a.default,e)),n.default.createElement("div",{className:"col-xs-10 col-sm-9 text-left"},n.default.createElement(u.default,{post:e.post},n.default.createElement(l.default,e),n.default.createElement(o.default,e)))))};var n=s(e("react")),a=s(e("./icon")),o=s(e("./info")),l=s(e("./message")),i=s(e("./unread-label")),u=s(e("../waypoint"));function s(e){return e&&e.__esModule?e:{default:e}}},{"../waypoint":173,"./icon":146,"./info":148,"./message":149,"./unread-label":150,react:"react"}],148:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Hidden=f,r.Poster=d,r.default=function(e){return a.default.createElement("ul",{className:"list-inline event-info"},a.default.createElement(f,e),a.default.createElement(d,e),a.default.createElement(n.default,e))};var a=l(e("react")),o=l(e("../../../utils/escape-html")),n=l(e("./controls"));function l(e){return e&&e.__esModule?e:{default:e}}var i='<abbr title="%(absolute)s">%(relative)s</abbr>',u='<a href="%(url)s" title="%(absolute)s">%(relative)s</a>',s='<span class="item-title">%(user)s</span>',c='<a href="%(url)s" class="item-title">%(user)s</a>';function f(e){if(e.post.is_hidden){var t=null,t=e.post.url.hidden_by?interpolate(c,{url:(0,o.default)(e.post.url.hidden_by),user:(0,o.default)(e.post.hidden_by_name)},!0):interpolate(s,{user:(0,o.default)(e.post.hidden_by_name)},!0),r=interpolate(i,{absolute:(0,o.default)(e.post.hidden_on.format("LLL")),relative:(0,o.default)(e.post.hidden_on.fromNow())},!0),n=interpolate((0,o.default)(gettext("Hidden by %(event_by)s %(event_on)s.")),{event_by:t,event_on:r},!0);return a.default.createElement("li",{className:"event-hidden-message",dangerouslySetInnerHTML:{__html:n}})}return null}function d(e){var t=null,t=e.post.poster?interpolate(c,{url:(0,o.default)(e.post.poster.url),user:(0,o.default)(e.post.poster_name)},!0):interpolate(s,{user:(0,o.default)(e.post.poster_name)},!0),r=interpolate(u,{url:(0,o.default)(e.post.url.index),absolute:(0,o.default)(e.post.posted_on.format("LLL")),relative:(0,o.default)(e.post.posted_on.fromNow())},!0),n=interpolate((0,o.default)(gettext("By %(event_by)s %(event_on)s.")),{event_by:t,event_on:r},!0);return a.default.createElement("li",{className:"event-posters",dangerouslySetInnerHTML:{__html:n}})}},{"../../../utils/escape-html":383,"./controls":145,react:"react"}],149:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.AddedParticipant=p,r.ChangedOwner=d,r.ChangedTitle=s,r.Merged=f,r.Moved=c,r.RemovedParticipant=m,r.default=function(e){return l[e.post.event_type]?a.default.createElement("p",{className:"event-message"},l[e.post.event_type]):"changed_title"===e.post.event_type?a.default.createElement(s,e):"moved"===e.post.event_type?a.default.createElement(c,e):"merged"===e.post.event_type?a.default.createElement(f,e):"changed_owner"===e.post.event_type?a.default.createElement(d,e):"added_participant"===e.post.event_type?a.default.createElement(p,e):"removed_participant"===e.post.event_type?a.default.createElement(m,e):null};var a=n(e("react")),o=n(e("../../../utils/escape-html"));function n(e){return e&&e.__esModule?e:{default:e}}var l={pinned_globally:gettext("Thread has been pinned globally."),pinned_locally:gettext("Thread has been pinned locally."),unpinned:gettext("Thread has been unpinned."),approved:gettext("Thread has been approved."),opened:gettext("Thread has been opened."),closed:gettext("Thread has been closed."),unhid:gettext("Thread has been revealed."),hid:gettext("Thread has been made hidden."),tookover:gettext("Took thread over."),owner_left:gettext("Owner has left thread. This thread is now closed."),participant_left:gettext("Participant has left thread.")},i='<a href="%(url)s" class="item-title">%(name)s</a>',u='<span class="item-title">%(name)s</span>';function s(e){var t=(0,o.default)(gettext("Thread title has been changed from %(old_title)s.")),r=interpolate(u,{name:(0,o.default)(e.post.event_context.old_title)},!0),n=interpolate(t,{old_title:r},!0);return a.default.createElement("p",{className:"event-message",dangerouslySetInnerHTML:{__html:n}})}function c(e){var t=(0,o.default)(gettext("Thread has been moved from %(from_category)s.")),r=interpolate(i,{url:(0,o.default)(e.post.event_context.from_category.url),name:(0,o.default)(e.post.event_context.from_category.name)},!0),n=interpolate(t,{from_category:r},!0);return a.default.createElement("p",{className:"event-message",dangerouslySetInnerHTML:{__html:n}})}function f(e){var t=(0,o.default)(gettext("The %(merged_thread)s thread has been merged into this thread.")),r=interpolate(u,{name:(0,o.default)(e.post.event_context.merged_thread)},!0),n=interpolate(t,{merged_thread:r},!0);return a.default.createElement("p",{className:"event-message",dangerouslySetInnerHTML:{__html:n}})}function d(e){var t=(0,o.default)(gettext("Changed thread owner to %(user)s.")),r=interpolate(i,{url:(0,o.default)(e.post.event_context.user.url),name:(0,o.default)(e.post.event_context.user.username)},!0),n=interpolate(t,{user:r},!0);return a.default.createElement("p",{className:"event-message",dangerouslySetInnerHTML:{__html:n}})}function p(e){var t=(0,o.default)(gettext("Added %(user)s to thread.")),r=interpolate(i,{url:(0,o.default)(e.post.event_context.user.url),name:(0,o.default)(e.post.event_context.user.username)},!0),n=interpolate(t,{user:r},!0);return a.default.createElement("p",{className:"event-message",dangerouslySetInnerHTML:{__html:n}})}function m(e){var t=(0,o.default)(gettext("Removed %(user)s from thread.")),r=interpolate(i,{url:(0,o.default)(e.post.event_context.user.url),name:(0,o.default)(e.post.event_context.user.username)},!0),n=interpolate(t,{user:r},!0);return a.default.createElement("p",{className:"event-message",dangerouslySetInnerHTML:{__html:n}})}},{"../../../utils/escape-html":383,react:"react"}],150:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.post.is_read?null:a.default.createElement("div",{className:"row"},a.default.createElement("div",{className:"col-xs-10 col-xs-offset-2 col-sm-9 col-sm-offset-3 text-left"},a.default.createElement("div",{className:"event-label"},a.default.createElement("span",{className:"label label-unread"},gettext("New event")))))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],151:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.ListItem=s,r.default=function(t){return t.posts.isLoaded?n.default.createElement("ul",{className:"posts-list ui-ready"},t.posts.results.map(function(e){return n.default.createElement(s,u({key:e.id,post:e},t))})):n.default.createElement("ul",{className:"posts-list ui-preview"},n.default.createElement(l.default,null))};var n=i(e("react")),a=i(e("./event")),o=i(e("./post")),l=i(e("./post/preview"));function i(e){return e&&e.__esModule?e:{default:e}}function u(){return(u=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function s(e){return e.post.is_event?n.default.createElement(a.default,e):n.default.createElement(o.default,e)}},{"./event":147,"./post":163,"./post/preview":171,react:"react"}],152:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.AttachmentDetails=p,r.AttachmentIcon=f,r.AttachmentPreview=c,r.AttachmentThumbnail=d,r.default=function(e){return a.default.createElement("div",{className:"col-xs-12 col-md-6"},a.default.createElement(c,e),a.default.createElement("div",{className:"post-attachment"},a.default.createElement("a",{href:e.attachment.url.index,className:"attachment-name item-title"},e.attachment.filename),a.default.createElement(p,e)))};var a=n(e("react")),o=(n(e("../../../..")),n(e("../../../../utils/escape-html"))),l=n(e("../../../../utils/file-size"));function n(e){return e&&e.__esModule?e:{default:e}}var i='<abbr title="%(absolute)s">%(relative)s</abbr>',u='<span class="item-title">%(user)s</span>',s='<a href="%(url)s" class="item-title">%(user)s</a>';function c(e){return e.attachment.is_image?a.default.createElement("div",{className:"post-attachment-preview"},a.default.createElement(d,e)):a.default.createElement("div",{className:"post-attachment-preview"},a.default.createElement(f,e))}function f(e){return a.default.createElement("a",{href:e.attachment.url.index,className:"material-icon"},"insert_drive_file")}function d(e){var t=e.attachment.url.thumb||e.attachment.url.index;return a.default.createElement("a",{className:"post-thumbnail",href:e.attachment.url.index,style:{backgroundImage:'url("'+(0,o.default)(t)+'")'}})}function p(e){var t=null,t=e.attachment.url.uploader?interpolate(s,{url:(0,o.default)(e.attachment.url.uploader),user:(0,o.default)(e.attachment.uploader_name)},!0):interpolate(u,{user:(0,o.default)(e.attachment.uploader_name)},!0),r=interpolate(i,{absolute:(0,o.default)(e.attachment.uploaded_on.format("LLL")),relative:(0,o.default)(e.attachment.uploaded_on.fromNow())},!0),n=interpolate((0,o.default)(gettext("%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.")),{filetype:e.attachment.filetype,size:(0,l.default)(e.attachment.size),uploader:t,uploaded_on:r},!0);return a.default.createElement("p",{className:"post-attachment-description",dangerouslySetInnerHTML:{__html:n}})}},{"../../../..":302,"../../../../utils/escape-html":383,"../../../../utils/file-size":384,react:"react"}],153:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Row=u,r.default=function(e){return i(e.post)?n.default.createElement("div",{className:"post-attachments"},(0,a.default)(e.post.attachments,2).map(function(e){var t=e.map(function(e){return e?e.id:0}).join("_");return n.default.createElement(u,{key:t,row:e})})):null},r.isVisible=i;var n=l(e("react")),a=l(e("../../../../utils/batch")),o=l(e("./attachment"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){return(!e.is_hidden||e.acl.can_see_hidden)&&e.attachments}function u(e){return n.default.createElement("div",{className:"row"},e.row.map(function(e){return n.default.createElement(o.default,{attachment:e,key:e?e.id:0})}))}},{"../../../../utils/batch":380,"./attachment":152,react:"react"}],154:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Default=f,r.Hidden=d,r.Invalid=p,r.default=function(e){return e.post.is_hidden&&!e.post.acl.can_see_hidden?a.default.createElement(d,e):e.post.content?a.default.createElement(f,e):a.default.createElement(p,e)};var a=i(e("react")),o=i(e("../waypoint")),n=i(e("../../misago-markup")),l=i(e("../../../utils/escape-html"));function i(e){return e&&e.__esModule?e:{default:e}}var u='<a href="%(url)s" class="item-title">%(user)s</a>',s='<span class="item-title">%(user)s</span>',c='<abbr class="last-title" title="%(absolute)s">%(relative)s</abbr>';function f(e){return a.default.createElement(o.default,{className:"post-body",post:e.post},a.default.createElement(n.default,{markup:e.post.content}))}function d(e){var t=null,t=e.post.hidden_by?interpolate(u,{url:(0,l.default)(e.post.url.hidden_by),user:(0,l.default)(e.post.hidden_by_name)},!0):interpolate(s,{user:(0,l.default)(e.post.hidden_by_name)},!0),r=interpolate(c,{absolute:(0,l.default)(e.post.hidden_on.format("LLL")),relative:(0,l.default)(e.post.hidden_on.fromNow())},!0),n=interpolate((0,l.default)(gettext("Hidden by %(hidden_by)s %(hidden_on)s.")),{hidden_by:t,hidden_on:r},!0);return a.default.createElement(o.default,{className:"post-body post-body-hidden",post:e.post},a.default.createElement("p",{className:"lead"},gettext("This post is hidden. You cannot see its contents.")),a.default.createElement("p",{className:"text-muted",dangerouslySetInnerHTML:{__html:n}}))}function p(e){return a.default.createElement(o.default,{className:"post-body post-body-invalid",post:e.post},a.default.createElement("p",{className:"lead"},gettext("This post's contents cannot be displayed.")),a.default.createElement("p",{className:"text-muted"},gettext("This error is caused by invalid post content manipulation.")))}},{"../../../utils/escape-html":383,"../../misago-markup":60,"../waypoint":173,react:"react"}],155:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.approve=function(e){s.default.dispatch(u.patch(e.post,{is_unapproved:!1}));var t={is_unapproved:e.post.is_unapproved};p(e,[{op:"replace",path:"is-unapproved",value:!1}],t)},r.hide=function(e){s.default.dispatch(u.patch(e.post,{is_hidden:!0,hidden_on:(0,o.default)(),hidden_by_name:e.user.username,url:Object.assign(e.post.url,{hidden_by:e.user.url})}));var t={is_hidden:e.post.is_hidden,hidden_on:e.post.hidden_on,hidden_by_name:e.post.hidden_by_name,url:e.post.url};p(e,[{op:"replace",path:"is-hidden",value:!0}],t)},r.like=function(e){var t=e.post.last_likes||[],r=[e.user].concat(t),n=3<r.length?r.slice(0,-1):r;s.default.dispatch(u.patch(e.post,{is_liked:!0,likes:e.post.likes+1,last_likes:n}));var a={is_liked:e.post.is_liked,likes:e.post.likes,last_likes:e.post.last_likes};p(e,[{op:"replace",path:"is-liked",value:!0}],a)},r.markAsBestAnswer=function(e){var t=e.post,r=e.user;s.default.dispatch(l.update({best_answer:t.id,best_answer_is_protected:t.is_protected,best_answer_marked_on:(0,o.default)(),best_answer_marked_by:r.id,best_answer_marked_by_name:r.username,best_answer_marked_by_slug:r.slug}));var n=[{op:"replace",path:"best-answer",value:t.id},{op:"add",path:"acl",value:!0}],a={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};m(e,n,a)},r.patch=p,r.patchThread=m,r.protect=function(e){s.default.dispatch(u.patch(e.post,{is_protected:!0}));var t={is_protected:e.post.is_protected};p(e,[{op:"replace",path:"is-protected",value:!0}],t)},r.remove=function(t){if(!window.confirm(gettext("Are you sure you want to delete this post? This action is not reversible!")))return;s.default.dispatch(u.patch(t.post,{isDeleted:!0})),n.default.delete(t.post.api.index).then(function(){a.default.success(gettext("Post has been deleted."))},function(e){400===e.status?a.default.error(e.detail):a.default.apiError(e),s.default.dispatch(u.patch(t.post,{isDeleted:!1}))})},r.unhide=function(e){s.default.dispatch(u.patch(e.post,{is_hidden:!1}));var t={is_hidden:e.post.is_hidden};p(e,[{op:"replace",path:"is-hidden",value:!1}],t)},r.unlike=function(t){s.default.dispatch(u.patch(t.post,{is_liked:!1,likes:t.post.likes-1,last_likes:t.post.last_likes.filter(function(e){return!e.id||e.id!==t.user.id})}));var e={is_liked:t.post.is_liked,likes:t.post.likes,last_likes:t.post.last_likes};p(t,[{op:"replace",path:"is-liked",value:!1}],e)},r.unmarkBestAnswer=function(e){var t=e.post;s.default.dispatch(l.update({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}));var r=[{op:"remove",path:"best-answer",value:t.id},{op:"add",path:"acl",value:!0}],n={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};m(e,r,n)},r.unprotect=function(e){s.default.dispatch(u.patch(e.post,{is_protected:!1}));var t={is_protected:e.post.is_protected};p(e,[{op:"replace",path:"is-protected",value:!1}],t)};var o=d(e("moment")),l=f(e("../../../../reducers/thread")),u=f(e("../../../../reducers/post")),n=d(e("../../../../services/ajax")),a=d(e("../../../../services/snackbar")),s=d(e("../../../../services/store"));function c(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(c=function(e){return e?r:t})(e)}function f(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=c(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function d(e){return e&&e.__esModule?e:{default:e}}function p(t,e,r){n.default.patch(t.post.api.index,e).then(function(e){s.default.dispatch(u.patch(t.post,e))},function(e){400===e.status?a.default.error(e.detail[0]):a.default.apiError(e),s.default.dispatch(u.patch(t.post,r))})}function m(e,t,r){n.default.patch(e.thread.api.index,t).then(function(e){e.best_answer_marked_on&&(e.best_answer_marked_on=(0,o.default)(e.best_answer_marked_on)),s.default.dispatch(l.update(e))},function(e){400===e.status?a.default.error(e.detail[0]):a.default.apiError(e),s.default.dispatch(l.update(r))})}},{"../../../../reducers/post":353,"../../../../reducers/thread":360,"../../../../services/ajax":365,"../../../../services/snackbar":376,"../../../../services/store":377,moment:"moment"}],156:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Unprotect=r.UnmarkMarkBestAnswer=r.Unhide=r.Split=r.Protect=r.PostEdits=r.Permalink=r.Move=r.MarkAsBestAnswer=r.Hide=r.Edit=r.Delete=r.Approve=void 0,r.default=function(e){return l.default.createElement("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},l.default.createElement(w,e),l.default.createElement(O,e),l.default.createElement(j,e),l.default.createElement(P,e),l.default.createElement(k,e),l.default.createElement(x,e),l.default.createElement(N,e),l.default.createElement(S,e),l.default.createElement(R,e),l.default.createElement(C,e),l.default.createElement(M,e),l.default.createElement(T,e),l.default.createElement(L,e))};var l=n(e("react")),u=n(e("../../../../services/modal")),s=n(e("../../../../services/posting")),c=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=m(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./actions")),f=n(e("./move")),d=n(e("../../../post-changelog")),p=n(e("./split"));function m(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(m=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function y(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t,r){return t&&a(e.prototype,t),r&&a(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function h(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&o(e,t)}function o(e,t){return(o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=_(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return g(e)}(this,n?(e=_(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _(e){return(_=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function E(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var w=function(){h(o,l.default.Component);var a=v(o);function o(){var t;y(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return E(g(t=a.call.apply(a,[this].concat(r))),"onClick",function(){var e=window.location.protocol+"//";e+=window.location.host,e+=t.props.post.url.index,prompt(gettext("Permament link to this post:"),e)}),t}return b(o,[{key:"render",value:function(){return l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"link"),gettext("Permament link")))}}]),o}();r.Permalink=w;var O=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.default.open({mode:"EDIT",config:e.props.post.api.editor,submit:e.props.post.api.index})}),e}return b(o,[{key:"render",value:function(){return this.props.post.acl.can_edit?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"edit"),gettext("Edit"))):null}}]),o}();r.Edit=O;var j=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.markAsBestAnswer(e.props)}),e}return b(o,[{key:"render",value:function(){var e=this.props,t=e.post,r=e.thread;return!r.acl.can_mark_best_answer||!t.acl.can_mark_as_best_answer||t.id===r.best_answer||r.best_answer&&!r.acl.can_change_best_answer?null:l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"check_box"),gettext("Mark as best answer")))}}]),o}();r.MarkAsBestAnswer=j;var P=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.unmarkBestAnswer(e.props)}),e}return b(o,[{key:"render",value:function(){var e=this.props,t=e.post,r=e.thread;return t.id===r.best_answer&&r.acl.can_unmark_best_answer?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"check_box_outline_blank"),gettext("Unmark best answer"))):null}}]),o}();r.UnmarkMarkBestAnswer=P;var k=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.default.show(l.default.createElement(d.default,{post:e.props.post}))}),e}return b(o,[{key:"render",value:function(){var e=this.props.post.is_hidden&&!this.props.post.acl.can_see_hidden,t=0===this.props.post.edits;if(e||t)return null;var r=ngettext("This post was edited %(edits)s time.","This post was edited %(edits)s times.",this.props.post.edits);interpolate(r,{edits:this.props.post.edits},!0);return l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"edit"),gettext("Changes history")))}}]),o}();r.PostEdits=k;var x=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.approve(e.props)}),e}return b(o,[{key:"render",value:function(){return this.props.post.acl.can_approve&&this.props.post.is_unapproved?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"done"),gettext("Approve"))):null}}]),o}();r.Approve=x;var N=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.default.show(l.default.createElement(f.default,e.props))}),e}return b(o,[{key:"render",value:function(){return this.props.post.acl.can_move?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"arrow_forward"),gettext("Move"))):null}}]),o}();r.Move=N;var S=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.default.show(l.default.createElement(p.default,e.props))}),e}return b(o,[{key:"render",value:function(){return this.props.post.acl.can_move?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"call_split"),gettext("Split"))):null}}]),o}();r.Split=S;var R=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.protect(e.props)}),e}return b(o,[{key:"render",value:function(){return!this.props.post.acl.can_protect||this.props.post.is_protected?null:l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"lock_outline"),gettext("Protect")))}}]),o}();r.Protect=R;var C=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.unprotect(e.props)}),e}return b(o,[{key:"render",value:function(){return this.props.post.acl.can_protect&&this.props.post.is_protected?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"lock_open"),gettext("Remove protection"))):null}}]),o}();r.Unprotect=C;var M=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.hide(e.props)}),e}return b(o,[{key:"render",value:function(){var e=this.props,t=e.post,r=e.thread;return t.id===r.best_answer||!t.acl.can_hide||t.is_hidden?null:l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"visibility_off"),gettext("Hide")))}}]),o}();r.Hide=M;var T=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.unhide(e.props)}),e}return b(o,[{key:"render",value:function(){return this.props.post.acl.can_unhide&&this.props.post.is_hidden?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"visibility"),gettext("Unhide"))):null}}]),o}();r.Unhide=T;var L=function(){h(o,l.default.Component);var a=v(o);function o(){var e;y(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return E(g(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.remove(e.props)}),e}return b(o,[{key:"render",value:function(){var e=this.props,t=e.post,r=e.thread;return t.id!==r.best_answer&&t.acl.can_delete?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"clear"),gettext("Delete"))):null}}]),o}();r.Delete=L},{"../../../../services/modal":371,"../../../../services/posting":375,"../../../post-changelog":119,"./actions":155,"./move":158,"./split":159,react:"react"}],157:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement("div",{className:"pull-right dropdown"},n.default.createElement("button",{"aria-expanded":"true","aria-haspopup":"true",className:"btn btn-default btn-icon dropdown-toggle","data-toggle":"dropdown",type:"button"},n.default.createElement("span",{className:"material-icon"},"expand_more")),n.default.createElement(a.default,e))};var n=o(e("react")),a=o(e("./dropdown"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./dropdown":156,react:"react"}],158:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ModalHeader=_,r.default=void 0;var n=o(e("react")),a=(o(e("../../../button")),o(e("../../../form"))),u=o(e("../../../form-group")),s=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=m(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../../reducers/post")),c=o(e("../../../../services/ajax")),f=o(e("../../../../services/modal")),d=o(e("../../../../services/snackbar")),p=o(e("../../../../services/store"));function m(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(m=function(e){return e?r:t})(e)}function o(e){return e&&e.__esModule?e:{default:e}}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(l,a.default);var e,t,r,o=h(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=v(t),a=function(e){t.changeValue("url",e.target.value)},(n="onUrlChange")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1,url:"",validators:{url:[]},errors:{}},t}return e=l,(t=[{key:"clean",value:function(){return!!this.state.url.trim().length||(d.default.error(gettext("You have to enter link to the other thread.")),!1)}},{key:"send",value:function(){return c.default.post(this.props.thread.api.posts.move,{new_thread:this.state.url,posts:[this.props.post.id]})}},{key:"handleSuccess",value:function(){p.default.dispatch(s.patch(this.props.post,{isDeleted:!0})),f.default.hide(),d.default.success(gettext("Selected post was moved to the other thread."))}},{key:"handleError",value:function(e){400===e.status?d.default.error(e.detail):d.default.apiError(e)}},{key:"render",value:function(){return n.default.createElement("div",{className:"modal-dialog",role:"document"},n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"modal-content"},n.default.createElement(_,null),n.default.createElement("div",{className:"modal-body"},n.default.createElement(u.default,{for:"id_url",label:gettext("Link to thread you want to move post to")},n.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,id:"id_url",onChange:this.onUrlChange,value:this.state.url}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("button",{className:"btn btn-primary",loading:this.state.isLoading},gettext("Move post"))))))}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function _(e){return n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Move post")))}r.default=g},{"../../../../reducers/post":353,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../button":8,"../../../form":56,"../../../form-group":55,react:"react"}],159:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Error=M,r.Loader=C,r.Modal=T,r.PostingConfig=r.ModerationForm=void 0,r.default=function(e){return a.default.createElement(S,N({},e,{Form:R}))};var a=g(e("react")),n=g(e("../../../button")),u=g(e("../../../form")),s=g(e("../../../form-group")),c=g(e("../../../category-select")),o=g(e("../../../modal-loader")),f=g(e("../../../select")),d=l(e("../../../../reducers/post")),p=g(e("../../../../services/ajax")),m=g(e("../../../../services/modal")),y=g(e("../../../../services/snackbar")),b=g(e("../../../../services/store")),h=l(e("../../../../utils/validators"));function v(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(v=function(e){return e?r:t})(e)}function l(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=v(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function g(e){return e&&e.__esModule?e:{default:e}}function _(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function E(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function w(e,t,r){return t&&E(e.prototype,t),r&&E(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function O(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&j(e,t)}function j(e,t){return(j=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function P(r){var 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}}();return function(){var e,t=x(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return k(e)}(this,n?(e=x(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function k(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function x(e){return(x=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function N(){return(N=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}var S=function(){O(n,a.default.Component);var r=P(n);function n(e){var t;return _(this,n),(t=r.call(this,e)).state={isLoaded:!1,isError:!1,categories:[]},t}return w(n,[{key:"componentDidMount",value:function(){var r=this;p.default.get(misago.get("THREAD_EDITOR_API")).then(function(e){var t=e.map(function(e){return Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id,post:e.post})});r.setState({isLoaded:!0,categories:t})},function(e){r.setState({isError:e.detail})})}},{key:"render",value:function(){return this.state.isError?a.default.createElement(M,{message:this.state.isError}):this.state.isLoaded?a.default.createElement(R,N({},this.props,{categories:this.state.categories})):a.default.createElement(C,null)}}]),n}();r.PostingConfig=S;var R=function(){O(l,u.default);var o=P(l);function l(e){var n,t,r,a;return _(this,l),n=o.call(this,e),t=k(n),a=function(e){var t=e.target.value,r={category:t};n.acl[t].can_pin_threads<r.weight&&(r.weight=0),n.acl[t].can_hide_threads||(r.is_hidden=0),n.acl[t].can_close_threads||(r.is_closed=!1),n.setState(r)},(r="onCategoryChange")in t?Object.defineProperty(t,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[r]=a,n.state={isLoading:!1,title:"",category:null,categories:e.categories,weight:0,is_hidden:0,is_closed:!1,validators:{title:[h.required()]},errors:{}},n.isHiddenChoices=[{value:0,icon:"visibility",label:gettext("No")},{value:1,icon:"visibility_off",label:gettext("Yes")}],n.isClosedChoices=[{value:!1,icon:"lock_outline",label:gettext("No")},{value:!0,icon:"lock",label:gettext("Yes")}],n.acl={},n.props.categories.forEach(function(e){e.post&&(n.state.category||(n.state.category=e.id),n.acl[e.id]={can_pin_threads:e.post.pin,can_close_threads:e.post.close,can_hide_threads:e.post.hide})}),n}return w(l,[{key:"clean",value:function(){return!!this.isValid()||(y.default.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}},{key:"send",value:function(){return p.default.post(this.props.thread.api.posts.split,{title:this.state.title,category:this.state.category,weight:this.state.weight,is_hidden:this.state.is_hidden,is_closed:this.state.is_closed,posts:[this.props.post.id]})}},{key:"handleSuccess",value:function(){b.default.dispatch(d.patch(this.props.post,{isDeleted:!0})),m.default.hide(),y.default.success(gettext("Selected post was split into new thread."))}},{key:"handleError",value:function(e){400===e.status?(this.setState({errors:Object.assign({},this.state.errors,e)}),y.default.error(gettext("Form contains errors."))):y.default.apiError(e)}},{key:"getWeightChoices",value:function(){var e=[{value:0,icon:"remove",label:gettext("Not pinned")},{value:1,icon:"bookmark_border",label:gettext("Pinned locally")}];return 2==this.acl[this.state.category].can_pin_threads&&e.push({value:2,icon:"bookmark",label:gettext("Pinned globally")}),e}},{key:"renderWeightField",value:function(){return this.acl[this.state.category].can_pin_threads?a.default.createElement(s.default,{label:gettext("Thread weight"),for:"id_weight",labelClass:"col-sm-4",controlClass:"col-sm-8"},a.default.createElement(f.default,{id:"id_weight",onChange:this.bindInput("weight"),value:this.state.weight,choices:this.getWeightChoices()})):null}},{key:"renderHiddenField",value:function(){return this.acl[this.state.category].can_hide_threads?a.default.createElement(s.default,{label:gettext("Hide thread"),for:"id_is_hidden",labelClass:"col-sm-4",controlClass:"col-sm-8"},a.default.createElement(f.default,{id:"id_is_closed",onChange:this.bindInput("is_hidden"),value:this.state.is_hidden,choices:this.isHiddenChoices})):null}},{key:"renderClosedField",value:function(){return this.acl[this.state.category].can_close_threads?a.default.createElement(s.default,{label:gettext("Close thread"),for:"id_is_closed",labelClass:"col-sm-4",controlClass:"col-sm-8"},a.default.createElement(f.default,{id:"id_is_closed",onChange:this.bindInput("is_closed"),value:this.state.is_closed,choices:this.isClosedChoices})):null}},{key:"render",value:function(){return a.default.createElement(T,{className:"modal-dialog"},a.default.createElement("form",{onSubmit:this.handleSubmit},a.default.createElement("div",{className:"modal-body"},a.default.createElement(s.default,{label:gettext("Thread title"),for:"id_title",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.title},a.default.createElement("input",{id:"id_title",className:"form-control",type:"text",onChange:this.bindInput("title"),value:this.state.title})),a.default.createElement("div",{className:"clearfix"}),a.default.createElement(s.default,{label:gettext("Category"),for:"id_category",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.category},a.default.createElement(c.default,{id:"id_category",onChange:this.onCategoryChange,value:this.state.category,choices:this.state.categories})),a.default.createElement("div",{className:"clearfix"}),this.renderWeightField(),this.renderHiddenField(),this.renderClosedField()),a.default.createElement("div",{className:"modal-footer"},a.default.createElement(n.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Split post")))))}}]),l}();function C(){return a.default.createElement(T,{className:"modal-dialog"},a.default.createElement(o.default,null))}function M(e){return a.default.createElement(T,{className:"modal-dialog modal-message"},a.default.createElement("div",{className:"message-icon"},a.default.createElement("span",{className:"material-icon"},"info_outline")),a.default.createElement("div",{className:"message-body"},a.default.createElement("p",{className:"lead"},gettext("You can't move this post at the moment.")),a.default.createElement("p",null,e.message)))}function T(e){return a.default.createElement("div",{className:e.className,role:"document"},a.default.createElement("div",{className:"modal-content"},a.default.createElement("div",{className:"modal-header"},a.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},a.default.createElement("span",{"aria-hidden":"true"},"×")),a.default.createElement("h4",{className:"modal-title"},gettext("Split post into new thread"))),e.children))}r.ModerationForm=R},{"../../../../reducers/post":353,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../../utils/validators":393,"../../../button":8,"../../../category-select":21,"../../../form":56,"../../../form-group":55,"../../../modal-loader":61,"../../../select":210,react:"react"}],160:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.FlagBestAnswer=function(e){var t=e.post,r=e.thread,n=e.user;if(!l(t)||t.id!==r.best_answer)return null;var a=null;a=n.id&&r.best_answer_marked_by===n.id?interpolate(gettext("Marked as best answer by you %(marked_on)s."),{marked_on:r.best_answer_marked_on.fromNow()},!0):interpolate(gettext("Marked as best answer by %(marked_by)s %(marked_on)s."),{marked_by:r.best_answer_marked_by_name,marked_on:r.best_answer_marked_on.fromNow()},!0);return o.default.createElement("div",{className:"post-status-message post-status-best-answer"},o.default.createElement("span",{className:"material-icon"},"check_box"),o.default.createElement("p",null,a))},r.FlagHidden=function(e){return l(e.post)&&e.post.is_hidden?o.default.createElement("div",{className:"post-status-message post-status-hidden"},o.default.createElement("span",{className:"material-icon"},"visibility_off"),o.default.createElement("p",null,gettext("This post is hidden. Only users with permission may see its contents."))):null},r.FlagProtected=function(e){return l(e.post)&&e.post.is_protected?o.default.createElement("div",{className:"post-status-message post-status-protected visible-xs-block"},o.default.createElement("span",{className:"material-icon"},"lock_outline"),o.default.createElement("p",null,gettext("This post is protected. Only moderators may change it."))):null},r.FlagUnapproved=function(e){return l(e.post)&&e.post.is_unapproved?o.default.createElement("div",{className:"post-status-message post-status-unapproved"},o.default.createElement("span",{className:"material-icon"},"remove_circle_outline"),o.default.createElement("p",null,gettext("This post is unapproved. Only users with permission to approve posts and its author may see its contents."))):null},r.isVisible=l;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e){return!e.is_hidden||e.acl.can_see_hidden}},{react:"react"}],161:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Reply=r.MarkAsBestAnswerCompact=r.MarkAsBestAnswer=r.LikesCompact=r.Likes=r.Like=r.Edit=void 0,r.default=function(e){return E(e.post)?l.default.createElement("div",{className:"post-footer"},l.default.createElement(w,e),l.default.createElement(O,e),l.default.createElement(j,e),l.default.createElement(P,_({lastLikes:e.post.last_likes,likes:e.post.likes},e)),l.default.createElement(k,_({likes:e.post.likes},e)),l.default.createElement(N,e),l.default.createElement(S,e)):null},r.getLikesMessage=x,r.isVisible=E;var l=n(e("react")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./controls/actions")),s=n(e("../../post-likes")),c=n(e("../../../services/modal")),f=n(e("../../../services/posting"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t,r){return t&&a(e.prototype,t),r&&a(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function y(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&o(e,t)}function o(e,t){return(o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=v(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=v(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function g(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _(){return(_=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function E(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)}var w=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.markAsBestAnswer(e.props)}),e}return m(o,[{key:"render",value:function(){var e=this.props,t=e.post,r=e.thread;return!r.acl.can_mark_best_answer||!t.acl.can_mark_as_best_answer||r.best_answer&&!r.acl.can_change_best_answer?null:l.default.createElement("button",{className:"hidden-xs btn btn-default btn-sm pull-left",disabled:this.props.post.isBusy||t.id===r.best_answer,onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"check_box"),gettext("Best answer"))}}]),o}();r.MarkAsBestAnswer=w;var O=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.markAsBestAnswer(e.props)}),e}return m(o,[{key:"render",value:function(){var e=this.props,t=e.post,r=e.thread;return!r.acl.can_mark_best_answer||!t.acl.can_mark_as_best_answer||r.best_answer&&!r.acl.can_change_best_answer?null:l.default.createElement("button",{className:"visible-xs-inline-block btn btn-default btn-sm pull-left",disabled:this.props.post.isBusy||t.id===r.best_answer,onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"check_box"))}}]),o}();r.MarkAsBestAnswerCompact=O;var j=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){e.props.post.is_liked?u.unlike(e.props):u.like(e.props)}),e}return m(o,[{key:"render",value:function(){if(!this.props.post.acl.can_like)return null;var e="btn btn-default btn-sm pull-left";return this.props.post.is_liked&&(e="btn btn-success btn-sm pull-left"),l.default.createElement("button",{className:e,disabled:this.props.post.isBusy,onClick:this.onClick,type:"button"},this.props.post.is_liked?gettext("Liked"):gettext("Like"))}}]),o}();r.Like=j;var P=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){c.default.show(l.default.createElement(s.default,{post:e.props.post}))}),e}return m(o,[{key:"render",value:function(){var e=0<(this.props.post.last_likes||[]).length;return this.props.post.acl.can_see_likes&&e?2===this.props.post.acl.can_see_likes?l.default.createElement("button",{className:"btn btn-link btn-sm pull-left hidden-xs",onClick:this.onClick,type:"button"},x(this.props.likes,this.props.lastLikes)):l.default.createElement("p",{className:"pull-left hidden-xs"},x(this.props.likes,this.props.lastLikes)):null}}]),o}();r.Likes=P;var k=function(){y(t,P);var e=b(t);function t(){return p(this,t),e.apply(this,arguments)}return m(t,[{key:"render",value:function(){var e=0<(this.props.post.last_likes||[]).length;return this.props.post.acl.can_see_likes&&e?2===this.props.post.acl.can_see_likes?l.default.createElement("button",{className:"btn btn-link btn-sm likes-compact pull-left visible-xs-block",onClick:this.onClick,type:"button"},l.default.createElement("span",{className:"material-icon"},"favorite"),this.props.likes):l.default.createElement("p",{className:"likes-compact pull-left visible-xs-block"},l.default.createElement("span",{className:"material-icon"},"favorite"),this.props.likes):null}}]),t}();function x(e,t){var r=t.slice(0,3).map(function(e){return e.username});if(1==r.length)return interpolate(gettext("%(user)s likes this."),{user:r[0]},!0);var n=e-r.length,a=r.slice(0,-1).join(", "),o=r.slice(-1)[0],l=interpolate(gettext("%(users)s and %(last_user)s"),{users:a,last_user:o},!0);if(0==n)return interpolate(gettext("%(users)s like this."),{users:l},!0);var i=ngettext("%(users)s and %(likes)s other user like this.","%(users)s and %(likes)s other users like this.",n);return interpolate(i,{users:r.join(", "),likes:n},!0)}r.LikesCompact=k;var N=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){f.default.open({mode:"REPLY",config:e.props.thread.api.editor,submit:e.props.thread.api.posts.index,context:{reply:e.props.post.id}})}),e}return m(o,[{key:"render",value:function(){return this.props.post.acl.can_reply?l.default.createElement("button",{className:"btn btn-primary btn-sm pull-right",type:"button",onClick:this.onClick},gettext("Reply")):null}}]),o}();r.Reply=N;var S=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){f.default.open({mode:"EDIT",config:e.props.post.api.editor,submit:e.props.post.api.index})}),e}return m(o,[{key:"render",value:function(){return this.props.post.acl.can_edit?l.default.createElement("button",{className:"hidden-xs btn btn-default btn-sm pull-right",type:"button",onClick:this.onClick},gettext("Edit")):null}}]),o}();r.Edit=S},{"../../../services/modal":371,"../../../services/posting":375,"../../post-likes":132,"./controls/actions":155,react:"react"}],162:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.PostEditsCompacts=r.PostEdits=void 0,r.PostedOn=_,r.PostedOnCompact=E,r.ProtectedLabel=j,r.UnreadCompact=g,r.UnreadLabel=v,r.default=function(e){return s.default.createElement("div",{className:"post-heading"},s.default.createElement(v,e),s.default.createElement(g,e),s.default.createElement(_,e),s.default.createElement(E,e),s.default.createElement(w,e),s.default.createElement(O,e),s.default.createElement(j,e),s.default.createElement(o.default,e),s.default.createElement(n.default,e))};var s=l(e("react")),n=l(e("./controls")),o=l(e("./select")),c=(e("../../user-status"),l(e("../../post-changelog"))),f=l(e("../../../services/modal"));function l(e){return e&&e.__esModule?e:{default:e}}function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t,r){return t&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function m(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function y(r){var 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}}();return function(){var e,t=h(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return b(e)}(this,n?(e=h(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function b(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function h(e){return(h=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function v(e){return e.post.is_read?null:s.default.createElement("span",{className:"label label-unread hidden-xs"},gettext("New post"))}function g(e){return e.post.is_read?null:s.default.createElement("span",{className:"label label-unread visible-xs-inline-block"},gettext("New"))}function _(e){var t=interpolate(gettext("posted %(posted_on)s"),{posted_on:e.post.posted_on.format("LL, LT")},!0);return s.default.createElement("a",{href:e.post.url.index,className:"btn btn-link posted-on hidden-xs",title:t},e.post.posted_on.fromNow())}function E(e){return s.default.createElement("a",{href:e.post.url.index,className:"btn btn-link posted-on visible-xs-inline-block"},e.post.posted_on.fromNow(!0))}var w=function(){m(u,s.default.Component);var i=y(u);function u(){var e;d(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=b(e),n=function(){f.default.show(s.default.createElement(c.default,{post:e.props.post}))},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return p(u,[{key:"render",value:function(){var e=this.props.post.is_hidden&&!this.props.post.acl.can_see_hidden,t=0===this.props.post.edits;if(e||t)return null;var r=ngettext("This post was edited %(edits)s time.","This post was edited %(edits)s times.",this.props.post.edits),n=interpolate(r,{edits:this.props.post.edits},!0),a=ngettext("edited %(edits)s time","edited %(edits)s times",this.props.post.edits);return s.default.createElement("button",{className:"btn btn-link btn-see-edits hidden-xs",onClick:this.onClick,title:n,type:"button"},interpolate(a,{edits:this.props.post.edits},!0))}}]),u}();r.PostEdits=w;var O=function(){m(t,w);var e=y(t);function t(){return d(this,t),e.apply(this,arguments)}return p(t,[{key:"render",value:function(){var e=this.props.post.is_hidden&&!this.props.post.acl.can_see_hidden,t=0===this.props.post.edits;if(e||t)return null;var r=ngettext("%(edits)s edit","%(edits)s edits",this.props.post.edits);return s.default.createElement("button",{className:"btn btn-link btn-see-edits visible-xs-inline-block",onClick:this.onClick,type:"button"},interpolate(r,{edits:this.props.post.edits},!0))}}]),t}();function j(e){var t=e.post.poster&&e.post.poster.id===e.user.id,r=e.post.acl.can_protect;return e.user.id&&e.post.is_protected&&(t||r)?s.default.createElement("span",{className:"label label-protected hidden-xs",title:gettext("This post is protected and may not be edited.")},s.default.createElement("span",{className:"material-icon"},"lock_outline"),gettext("protected")):null}r.PostEditsCompacts=O},{"../../../services/modal":371,"../../post-changelog":119,"../../user-status":274,"./controls":157,"./select":172,react:"react"}],163:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t="post";e.post.isDeleted?t="hide":e.post.is_hidden&&!e.post.acl.can_see_hidden&&(t="post post-hidden");e.post.poster&&e.post.poster.rank.css_class&&(t+=" post-"+e.post.poster.rank.css_class);e.post.is_read||(t+=" post-new");return n.default.createElement("li",{id:"post-"+e.post.id,className:t},n.default.createElement("div",{className:"panel panel-default panel-post"},n.default.createElement("div",{className:"panel-body"},n.default.createElement("div",{className:"row"},n.default.createElement(s.default,e),n.default.createElement("div",{className:"col-xs-12 col-md-9"},n.default.createElement(u.default,e),n.default.createElement(l.FlagBestAnswer,e),n.default.createElement(l.FlagUnapproved,e),n.default.createElement(l.FlagProtected,e),n.default.createElement(l.FlagHidden,e),n.default.createElement(o.default,e),n.default.createElement(a.default,e),n.default.createElement(i.default,e))))))};var n=c(e("react")),a=c(e("./attachments")),o=c(e("./body")),l=e("./flags"),i=c(e("./footer")),u=c(e("./header")),s=c(e("./post-side"));function c(e){return e&&e.__esModule?e:{default:e}}},{"./attachments":153,"./body":154,"./flags":160,"./footer":161,"./header":162,"./post-side":166,react:"react"}],164:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post,r=e.thread;return n.default.createElement("div",{className:"col-xs-12 col-md-3 post-side post-side-anonymous"},n.default.createElement(l.default,{post:t,thread:r}),n.default.createElement(o.default,{post:t,thread:r}),n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left"},n.default.createElement("span",null,n.default.createElement(a.default,{className:"poster-avatar",size:100}))),n.default.createElement("div",{className:"media-body"},n.default.createElement("span",{className:"media-heading item-title"},t.poster_name),n.default.createElement("span",{className:"user-title user-title-anonymous"},gettext("Removed user")))))};var n=s(e("react")),a=s(e("../../../avatar")),o=s(e("../controls")),l=s(e("../select"));(function(e,t){if(!t&&e&&e.__esModule)return;if(null===e||"object"!==i(e)&&"function"!=typeof e)return;var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n)})(e("../../../user-status")),s(e("./user-postcount")),s(e("./user-title"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e){return e&&e.__esModule?e:{default:e}}},{"../../../avatar":6,"../../../user-status":274,"../controls":157,"../select":172,"./user-postcount":168,"./user-title":170,react:"react"}],165:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.title,r=e.rank;return r.is_tab||!!t||!!r.title}},{}],166:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){if(e.post.poster)return n.default.createElement(o.default,e);return n.default.createElement(a.default,e)};var n=l(e("react")),a=l(e("./anonymous")),o=l(e("./registered"));function l(e){return e&&e.__esModule?e:{default:e}}},{"./anonymous":164,"./registered":167,react:"react"}],167:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.post,r=e.thread,n=t.poster;return a.default.createElement("div",{className:"col-xs-12 col-md-3 post-side post-side-registered"},a.default.createElement(u.default,{post:t,thread:r}),a.default.createElement(l.default,{post:t,thread:r}),a.default.createElement("div",{className:"media"},a.default.createElement("div",{className:"media-left"},a.default.createElement("a",{href:n.url},a.default.createElement(o.default,{className:"poster-avatar",size:100,user:n}))),a.default.createElement("div",{className:"media-body"},a.default.createElement("div",{className:"media-heading"},a.default.createElement("a",{className:"item-title",href:n.url},n.username),a.default.createElement(s.default,{status:n.status},a.default.createElement(s.StatusIcon,{status:n.status}))),a.default.createElement(d.default,{rank:n.rank,title:n.title}),a.default.createElement(f.default,{poster:n}),a.default.createElement(c.default,{poster:n}))))};var a=n(e("react")),o=n(e("../../../avatar")),l=n(e("../controls")),u=n(e("../select")),s=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=p(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../user-status")),c=n(e("./user-postcount")),f=n(e("./user-status")),d=n(e("./user-title"));function p(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(p=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}},{"../../../avatar":6,"../../../user-status":274,"../controls":157,"../select":172,"./user-postcount":168,"./user-status":169,"./user-title":170,react:"react"}],168:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.poster,r=ngettext("%(posts)s post","%(posts)s posts",t.posts),n="user-postcount";(0,o.default)(t)&&(n+=" hidden-xs hidden-sm");return a.default.createElement("span",{className:n},interpolate(r,{posts:t.posts},!0))};var a=n(e("react")),o=n(e("./has-visible-title"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./has-visible-title":165,react:"react"}],169:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.poster,r="hidden-xs";(0,o.default)(t)&&(r+=" hidden-sm");return n.default.createElement("span",{className:r},n.default.createElement(a.default,{status:t.status},n.default.createElement(a.StatusLabel,{status:t.status,user:t})))};var n=l(e("react")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../user-status")),o=l(e("./has-visible-title"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}},{"../../../user-status":274,"./has-visible-title":165,react:"react"}],170:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.rank,r=e.title||t.title;!r&&t.is_tab&&(r=t.name);if(!r)return null;var n="user-title";t.css_class&&(n+=" user-title-"+t.css_class);if(t.is_tab)return a.default.createElement("div",{className:n},a.default.createElement("a",{href:t.url},r));return a.default.createElement("div",{className:n},r)};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],171:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement("li",{className:"post"},n.default.createElement("div",{className:"post-border"},n.default.createElement("div",{className:"post-avatar"},n.default.createElement(a.default,{size:"100"})),n.default.createElement("div",{className:"post-body"},n.default.createElement("div",{className:"panel panel-default panel-post"},n.default.createElement("div",{className:"panel-heading post-heading"},n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,100)+"px"}}," "),n.default.createElement("span",{className:"ui-preview-text",style:{width:o.int(30,100)+"px"}}," ")),n.default.createElement("div",{className:"panel-body"},n.default.createElement("article",{className:"misago-markup"},n.default.createElement("p",{className:"ui-preview-text",style:{width:o.int(50,100)+"%"}}," "),n.default.createElement("p",{className:"ui-preview-text",style:{width:o.int(50,100)+"%"}}," "),n.default.createElement("p",{className:"ui-preview-text",style:{width:o.int(50,100)+"%"}}," ")))))))};var n=l(e("react")),a=l(e("../../avatar")),o=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/random"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}},{"../../../utils/random":388,"../../avatar":6,react:"react"}],172:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.isVisible=y;var n=a(e("react")),s=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/posts")),c=a(e("../../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function a(e){return e&&e.__esModule?e:{default:e}}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function l(e,t){return(l=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=p(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=p(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function p(e){return(p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var m=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&l(e,t)}(u,n.default.Component);var e,t,r,i=f(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=d(e),n=function(){e.props.post.isSelected?c.default.dispatch(s.deselect(e.props.post)):c.default.dispatch(s.select(e.props.post))},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return this.props.thread.acl.can_merge_posts||y(this.props.post.acl)?n.default.createElement("div",{className:"pull-right hidden-xs"},n.default.createElement("button",{className:"btn btn-default btn-icon",onClick:this.onClick,type:"button"},n.default.createElement("span",{className:"material-icon"},this.props.post.isSelected?"check_box":"check_box_outline_blank"))):null}}])&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();function y(e){return e.can_approve||e.can_hide||e.can_protect||e.can_unhide||e.can_delete||e.can_move}r.default=m},{"../../../reducers/posts":354,"../../../services/store":377,react:"react"}],173:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=a(e("react")),l=n(e("../../reducers/post")),u=n(e("../../reducers/thread")),s=a(e("../../services/ajax")),c=a(e("../../services/snackbar")),f=a(e("../../services/store"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function n(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function a(e){return e&&e.__esModule?e:{default:e}}function p(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t){return(m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function y(r){var 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}}();return function(){var e,t=b(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=b(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function b(e){return(b=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&m(e,t)}(a,o.default.Component);var e,t,r,n=y(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"componentDidMount",value:function(){var n=this;this.props.post.is_read||$(this.documentNode).waypoint({handler:function(e){"down"!==e||n.props.post.is_read||window.setTimeout(function(){var e=n.documentNode.getBoundingClientRect(),t=e.height+e.top,r=document.documentElement.clientHeight;t<5||r<t||(f.default.dispatch(l.patch(n.props.post,{is_read:!0})),s.default.post(n.props.post.api.read).then(function(e){f.default.dispatch(u.update(n.props.thread,{is_read:e.thread_is_read}))},function(e){c.default.apiError(e)}))},1e3)},offset:"bottom-in-view"})}},{key:"render",value:function(){var t=this;return o.default.createElement("div",{className:this.props.className,ref:function(e){t.documentNode=e}},this.props.children)}}])&&p(e.prototype,t),r&&p(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h},{"../../reducers/post":353,"../../reducers/thread":360,"../../services/ajax":365,"../../services/snackbar":376,"../../services/store":377,react:"react"}],174:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("moment")),l=n(e("react")),i=n(e("../panel-loader")),u=n(e("../panel-message")),s=n(e("../..")),c=n(e("../../services/polls")),f=n(e("../../services/page-title"));function n(e){return e&&e.__esModule?e:{default:e}}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=b(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=b(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function b(e){return(b=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function h(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var v=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(a,l.default.Component);var e,t,r,n=m(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),h(y(t=n.call(this,e)),"update",function(e){e.expires_on&&(e.expires_on=(0,o.default)(e.expires_on)),t.setState({isLoaded:!0,error:null,ban:e})}),h(y(t),"error",function(e){t.setState({isLoaded:!0,error:e.detail,ban:null})}),s.default.has("PROFILE_BAN")?t.initWithPreloadedData(s.default.pop("PROFILE_BAN")):t.initWithoutPreloadedData(),t.startPolling(e.profile.api.ban),t}return e=a,(t=[{key:"initWithPreloadedData",value:function(e){e.expires_on&&(e.expires_on=(0,o.default)(e.expires_on)),this.state={isLoaded:!0,ban:e}}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1}}},{key:"startPolling",value:function(e){c.default.start({poll:"ban-details",url:e,frequency:9e4,update:this.update,error:this.error})}},{key:"componentDidMount",value:function(){f.default.set({title:gettext("Ban details"),parent:this.props.profile.username})}},{key:"componentWillUnmount",value:function(){c.default.stop("ban-details")}},{key:"getUserMessage",value:function(){return this.state.ban.user_message?l.default.createElement("div",{className:"panel-body ban-message ban-user-message"},l.default.createElement("h4",null,gettext("User-shown ban message")),l.default.createElement("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.state.ban.user_message.html}})):null}},{key:"getStaffMessage",value:function(){return this.state.ban.staff_message?l.default.createElement("div",{className:"panel-body ban-message ban-staff-message"},l.default.createElement("h4",null,gettext("Team-shown ban message")),l.default.createElement("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((0,o.default)())){var e=interpolate(gettext("This ban expires on %(expires_on)s."),{expires_on:this.state.ban.expires_on.format("LL, LT")},!0),t=interpolate(gettext("This ban expires %(expires_on)s."),{expires_on:this.state.ban.expires_on.fromNow()},!0);return l.default.createElement("abbr",{title:e},t)}return gettext("This ban has expired.")}return interpolate(gettext("%(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?l.default.createElement("div",null,this.getUserMessage(),this.getStaffMessage(),l.default.createElement("div",{className:"panel-body ban-expires"},l.default.createElement("h4",null,gettext("Ban expiration")),l.default.createElement("p",{className:"lead"},this.getExpirationMessage()))):l.default.createElement("div",null,l.default.createElement(u.default,{message:gettext("No ban is active at the moment.")})):this.state.error?l.default.createElement("div",null,l.default.createElement(u.default,{icon:"error_outline",message:this.state.error})):l.default.createElement("div",null,l.default.createElement(i.default,null))}},{key:"render",value:function(){return l.default.createElement("div",{className:"profile-ban-details"},l.default.createElement("div",{className:"panel panel-default"},l.default.createElement("div",{className:"panel-heading"},l.default.createElement("h3",{className:"panel-title"},gettext("Ban details"))),this.getPanelBody()))}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=v},{"../..":302,"../../services/page-title":373,"../../services/polls":374,"../panel-loader":93,"../panel-message":94,moment:"moment",react:"react"}],175:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.isAuthenticated,r=e.profile,n=null;n=t?gettext("You are not sharing any details with others."):interpolate(gettext("%(username)s is not sharing any details with others."),{username:r.username},!0);return a.default.createElement("div",{className:"panel panel-default"},a.default.createElement("div",{className:"panel-body text-center lead"},n))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],176:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SafeValue=o,r.default=function(e){var t=e.html,r=e.text,n=e.url;if(t)return a.default.createElement("div",{className:"form-control-static col-md-9",dangerouslySetInnerHTML:{__html:t}});return a.default.createElement("div",{className:"form-control-static col-md-9"},a.default.createElement(o,{text:r,url:n}))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){var t=e.text,r=e.url;return r?a.default.createElement("p",null,a.default.createElement("a",{href:r,target:"_blank",rel:"nofollow"},t||r)):t?a.default.createElement("p",null,t):null}},{react:"react"}],177:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement("div",{className:"form-group"},n.default.createElement("strong",{className:"control-label col-md-3"},e.name,":"),n.default.createElement(a.default,e))};var n=o(e("react")),a=o(e("./field-value"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./field-value":176,react:"react"}],178:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.api,r=e.display,n=e.onCancel,a=e.onSuccess;return r?o.default.createElement(l.default,{api:t,onCancel:n,onSuccess:a}):null};var o=n(e("react")),l=n(e("../../edit-details"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../../edit-details":32,react:"react"}],179:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.fields,r=e.name;return l.default.createElement("div",{className:"panel panel-default panel-profile-details-group"},l.default.createElement("div",{className:"panel-heading"},l.default.createElement("h3",{className:"panel-title"},r)),l.default.createElement("div",{className:"panel-body"},l.default.createElement("div",{className:"form-horizontal"},t.map(function(e){var t=e.fieldname,r=e.html,n=e.name,a=e.text,o=e.url;return l.default.createElement(i.default,{key:t,name:n,html:r,text:a,url:o})}))))};var l=n(e("react")),i=n(e("./field"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./field":177,react:"react"}],180:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.display,r=e.groups,n=e.isAuthenticated,a=e.loading,o=e.profile;if(!t)return null;if(a)return l.default.createElement(s.default,null);return r.length?l.default.createElement("div",null,r.map(function(e,t){return l.default.createElement(u.default,{fields:e.fields,key:t,name:e.name})})):l.default.createElement(i.default,{isAuthenticated:n,profile:o})};var l=n(e("react")),i=n(e("./empty-message")),u=n(e("./group")),s=n(e("../../loader"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../../loader":58,"./empty-message":175,"./group":179,react:"react"}],181:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.EditButton=o,r.default=function(e){var t=e.onEdit,r=e.showEditButton;return a.default.createElement("div",null,a.default.createElement("nav",{className:"toolbar"},a.default.createElement("div",{className:"row"},a.default.createElement("div",{className:"col-sm-8 col-md-10"},a.default.createElement("h3",{className:"md-margin-top-no"},gettext("Details"))),a.default.createElement(o,{onEdit:t,showEditButton:r}))))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){var t=e.onEdit;return e.showEditButton?a.default.createElement("div",{className:"col-sm-4 col-md-2"},a.default.createElement("button",{className:"btn btn-default btn-outline btn-block",onClick:t,type:"button"},gettext("Edit"))):null}},{react:"react"}],182:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var l=n(e("react")),i=n(e("./form")),u=n(e("./groups-list")),s=n(e("./header")),c=n(e("../../../data/profile-details")),f=e("../../../reducers/profile-details"),o=n(e("../../../services/page-title")),d=n(e("../../../services/snackbar"));function n(e){return e&&e.__esModule?e:{default:e}}function p(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t){return(m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function y(r){var 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}}();return function(){var e,t=h(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return b(e)}(this,n?(e=h(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function b(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function h(e){return(h=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function v(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&m(e,t)}(a,l.default.Component);var e,t,r,n=y(a);function a(e){var l;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),v(b(l=n.call(this,e)),"onCancel",function(){l.setState({editing:!1})}),v(b(l),"onEdit",function(){l.setState({editing:!0})}),v(b(l),"onSuccess",function(e){var t=l.props,r=t.dispatch,n=t.isAuthenticated,a=t.profile,o=null,o=n?gettext("Your details have been updated."):interpolate(gettext("%(username)s's details have been updated."),{username:a.username},!0);d.default.info(o),r((0,f.load)(e)),l.setState({editing:!1})}),l.state={editing:!1},l}return e=a,(t=[{key:"componentDidMount",value:function(){o.default.set({title:gettext("Details"),parent:this.props.profile.username})}},{key:"render",value:function(){var e=this.props,t=e.dispatch,r=e.isAuthenticated,n=e.profile,a=e.profileDetails,o=a.id!==n.id;return l.default.createElement(c.default,{data:a,dispatch:t,user:n},l.default.createElement("div",{className:"profile-details"},l.default.createElement(s.default,{onEdit:this.onEdit,showEditButton:!!a.edit&&!this.state.editing}),l.default.createElement(u.default,{display:!this.state.editing,groups:a.groups,isAuthenticated:r,loading:o,profile:n}),l.default.createElement(i.default,{api:n.api.edit_details,dispatch:t,display:this.state.editing,onCancel:this.onCancel,onSuccess:this.onSuccess})))}}])&&p(e.prototype,t),r&&p(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=g},{"../../../data/profile-details":301,"../../../reducers/profile-details":355,"../../../services/page-title":373,"../../../services/snackbar":376,"./form":178,"./groups-list":180,"./header":181,react:"react"}],183:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Posts=function(e){var t=null;t=e.user.id===e.profile.id?gettext("You have posted no messages."):interpolate(gettext("%(username)s posted no messages."),{username:e.profile.username},!0);var r=null;{var n,a;r=e.posts.isLoaded?e.profile.id===e.user.id?(n=ngettext("You have posted %(posts)s message.","You have posted %(posts)s messages.",e.profile.posts),interpolate(n,{posts:e.profile.posts},!0)):(a=ngettext("%(username)s has posted %(posts)s message.","%(username)s has posted %(posts)s messages.",e.profile.posts),interpolate(a,{username:e.profile.username,posts:e.profile.posts},!0)):gettext("Loading...")}return o.default.createElement(l.default,i({api:e.profile.api.posts,emptyMessage:t,header:r,title:gettext("Posts")},e))},r.Threads=function(e){var t=null;t=e.user.id===e.profile.id?gettext("You have no started threads."):interpolate(gettext("%(username)s started no threads."),{username:e.profile.username},!0);var r=null;{var n,a;r=e.posts.isLoaded?e.profile.id===e.user.id?(n=ngettext("You have started %(threads)s thread.","You have started %(threads)s threads.",e.profile.threads),interpolate(n,{threads:e.profile.threads},!0)):(a=ngettext("%(username)s has started %(threads)s thread.","%(username)s has started %(threads)s threads.",e.profile.threads),interpolate(a,{username:e.profile.username,threads:e.profile.threads},!0)):gettext("Loading...")}return o.default.createElement(l.default,i({api:e.profile.api.threads,emptyMessage:t,header:r,title:gettext("Threads")},e))};var o=n(e("react")),l=n(e("./route"));function n(e){return e&&e.__esModule?e:{default:e}}function i(){return(i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}},{"./route":184,react:"react"}],184:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Feed=E,r.LoadMoreButton=w,r.default=void 0;var n=l(e("react")),a=l(e("../../post-feed")),o=l(e("../../button")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=p(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/posts")),s=l(e("../../../services/page-title")),c=l(e("../../../services/ajax")),f=l(e("../../../services/snackbar")),d=l(e("../../../services/store"));function p(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(p=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function m(){return(m=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(l,n.default.Component);var e,t,r,o=h(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=v(t),a=function(){t.setState({isLoading:!0}),t.loadItems(t.props.posts.next)},(n="loadMore")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1},t}return e=l,(t=[{key:"loadItems",value:function(e){var t=this,r=0<arguments.length&&void 0!==e?e:0;c.default.get(this.props.api,{start:r||0}).then(function(e){0===r?d.default.dispatch(u.load(e)):d.default.dispatch(u.append(e)),t.setState({isLoading:!1})},function(e){t.setState({isLoading:!1}),f.default.apiError(e)})}},{key:"componentDidMount",value:function(){s.default.set({title:this.props.title,parent:this.props.profile.username}),this.loadItems()}},{key:"render",value:function(){return n.default.createElement("div",{className:"profile-feed"},n.default.createElement("nav",{className:"toolbar"},n.default.createElement("h3",{className:"toolbar-left"},this.props.header)),n.default.createElement(E,m({isLoading:this.state.isLoading,loadMore:this.loadMore},this.props)))}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function E(e){return e.posts.results.length?n.default.createElement("div",null,n.default.createElement(a.default,{isReady:e.posts.isLoaded,posts:e.posts.results,poster:e.profile}),n.default.createElement(w,{isLoading:e.isLoading,loadMore:e.loadMore,next:e.posts.next})):n.default.createElement("p",{className:"lead"},e.emptyMessage)}function w(e){return e.next?n.default.createElement("div",{className:"pager-more"},n.default.createElement(o.default,{className:"btn btn-default btn-outline",loading:e.isLoading,onClick:e.loadMore},gettext("Show older activity"))):null}r.default=_},{"../../../reducers/posts":354,"../../../services/ajax":365,"../../../services/page-title":373,"../../../services/snackbar":376,"../../../services/store":377,"../../button":8,"../../post-feed":122,react:"react"}],185:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),i=o(e("../button")),u=e("../../reducers/profile"),s=o(e("../../services/ajax")),c=o(e("../../services/snackbar")),f=o(e("../../services/store"));function o(e){return e&&e.__esModule?e:{default:e}}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var b=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(l,n.default.Component);var e,t,r,o=m(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=y(t),a=function(){t.setState({isLoading:!0}),t.props.profile.is_followed?f.default.dispatch((0,u.patch)({is_followed:!1,followers:t.props.profile.followers-1})):f.default.dispatch((0,u.patch)({is_followed:!0,followers:t.props.profile.followers+1})),s.default.post(t.props.profile.api.follow).then(function(e){t.setState({isLoading:!1}),f.default.dispatch((0,u.patch)(e))},function(e){t.setState({isLoading:!1}),c.default.apiError(e)})},(n="action")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1},t}return e=l,(t=[{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?gettext("Following"):gettext("Follow")}},{key:"render",value:function(){return n.default.createElement(i.default,{className:this.getClassName(),disabled:this.state.isLoading,onClick:this.action},n.default.createElement("span",{className:"material-icon"},this.getIcon()),this.getLabel())}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=b},{"../../reducers/profile":356,"../../services/ajax":365,"../../services/snackbar":376,"../../services/store":377,"../button":8,react:"react"}],186:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../button")),i=n(e("../quick-search")),u=n(e("../users-list")),s=n(e("../..")),c=e("../../reducers/users"),f=n(e("../../services/ajax")),d=n(e("../../services/snackbar")),p=n(e("../../services/store")),m=n(e("../../services/page-title"));function n(e){return e&&e.__esModule?e:{default:e}}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var E=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(a,o.default.Component);var e,t,r,n=h(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),_(v(t=n.call(this,e)),"loadMore",function(){t.setState({isBusy:!0}),t.loadUsers(t.state.page+1,t.state.search)}),_(v(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(),s.default.has(t.PRELOADED_DATA_KEY)?t.initWithPreloadedData(s.default.pop(t.PRELOADED_DATA_KEY)):t.initWithoutPreloadedData(),t}return e=a,(t=[{key:"setSpecialProps",value:function(){this.PRELOADED_DATA_KEY="PROFILE_FOLLOWERS",this.TITLE=gettext("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},p.default.dispatch((0,c.hydrate)(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(e,t){var r=this,n=0<arguments.length&&void 0!==e?e:1,a=1<arguments.length&&void 0!==t?t:null,o=this.props.profile.api[this.API_FILTER];f.default.get(o,{search:a,page:n||1},"user-"+this.API_FILTER).then(function(e){1===n?p.default.dispatch((0,c.hydrate)(e.results)):p.default.dispatch((0,c.append)(e.results)),r.setState({isLoaded:!0,isBusy:!1,count:e.count,more:e.more,page:e.page,pages:e.pages})},function(e){d.default.apiError(e)})}},{key:"componentDidMount",value:function(){m.default.set({title:this.TITLE,parent:this.props.profile.username})}},{key:"getLabel",value:function(){if(this.state.isLoaded){if(this.state.search){var e=ngettext("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=ngettext("You have %(users)s follower.","You have %(users)s followers.",this.state.count);return interpolate(t,{users:this.state.count},!0)}var r=ngettext("%(username)s has %(users)s follower.","%(username)s has %(users)s followers.",this.state.count);return interpolate(r,{username:this.props.profile.username,users:this.state.count},!0)}return gettext("Loading...")}},{key:"getEmptyMessage",value:function(){return this.state.search?gettext("Search returned no users matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("You have no followers."):interpolate(gettext("%(username)s has no followers."),{username:this.props.profile.username},!0)}},{key:"getMoreButton",value:function(){return this.state.more?o.default.createElement("div",{className:"pager-more"},o.default.createElement(l.default,{className:"btn btn-default btn-outline",loading:this.state.isBusy,onClick:this.loadMore},interpolate(gettext("Show more (%(more)s)"),{more:this.state.more},!0))):null}},{key:"getListBody",value:function(){return this.state.isLoaded&&0===this.state.count?o.default.createElement("p",{className:"lead"},this.getEmptyMessage()):o.default.createElement("div",null,o.default.createElement(u.default,{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 o.default.createElement("div",{className:this.getClassName()},o.default.createElement("nav",{className:"toolbar"},o.default.createElement("h3",{className:"toolbar-left"},this.getLabel()),o.default.createElement(i.default,{className:"toolbar-right",value:this.state.search,onChange:this.search,placeholder:gettext("Search users...")})),this.getListBody())}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=E},{"../..":302,"../../reducers/users":364,"../../services/ajax":365,"../../services/page-title":373,"../../services/snackbar":376,"../../services/store":377,"../button":8,"../quick-search":197,"../users-list":284,react:"react"}],187:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;n(e("react"));var o=n(e("./followers"));function n(e){return e&&e.__esModule?e:{default:e}}function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"setSpecialProps",value:function(){this.PRELOADED_DATA_KEY="PROFILE_FOLLOWS",this.TITLE=gettext("Follows"),this.API_FILTER="follows"}},{key:"getLabel",value:function(){if(this.state.isLoaded){if(this.state.search){var e=ngettext("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=ngettext("You are following %(users)s user.","You are following %(users)s users.",this.state.count);return interpolate(t,{users:this.state.count},!0)}var r=ngettext("%(username)s is following %(users)s user.","%(username)s is following %(users)s users.",this.state.count);return interpolate(r,{username:this.props.profile.username,users:this.state.count},!0)}return gettext("Loading...")}},{key:"getEmptyMessage",value:function(){return this.state.search?gettext("Search returned no users matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("You are not following any users."):interpolate(gettext("%(username)s is not following any users."),{username:this.props.profile.username},!0)}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{"./followers":186,react:"react"}],188:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.IsDisabledMessage=v,r.default=void 0,r.getColStyle=g;var l=n(e("react")),u=n(e("../avatar")),o=(n(e("../dropdown-toggle")),n(e("./follow-button"))),s=n(e("./message-button")),c=n(e("./moderation/nav")),f=e("./navs"),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=p(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../user-status"));function p(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(p=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function m(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(a,l.default.Component);var e,t,r,n=b(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getUserStatus",value:function(){return l.default.createElement("li",{className:"user-status-display"},l.default.createElement(d.default,{user:this.props.profile,status:this.props.profile.status},l.default.createElement(d.StatusIcon,{user:this.props.profile,status:this.props.profile.status}),l.default.createElement(d.StatusLabel,{user:this.props.profile,status:this.props.profile.status,className:"status-label"})))}},{key:"getUserRank",value:function(){return this.props.profile.rank.is_tab?l.default.createElement("li",{className:"user-rank"},l.default.createElement("a",{href:this.props.profile.rank.url,className:"item-title"},this.props.profile.rank.name)):l.default.createElement("li",{className:"user-rank"},l.default.createElement("span",{className:"item-title"},this.props.profile.rank.name))}},{key:"getUserTitle",value:function(){return this.props.profile.title?l.default.createElement("li",{className:"user-title"},this.props.profile.title):this.props.profile.rank.title?l.default.createElement("li",{className:"user-title"},this.props.profile.rank.title):null}},{key:"getJoinedOn",value:function(){var e=interpolate(gettext("Joined on %(joined_on)s"),{joined_on:this.props.profile.joined_on.format("LL, LT")},!0),t=interpolate(gettext("Joined %(joined_on)s"),{joined_on:this.props.profile.joined_on.fromNow()},!0);return l.default.createElement("li",{className:"user-joined-on"},l.default.createElement("abbr",{title:e},t))}},{key:"getEmail",value:function(){return this.props.profile.email?l.default.createElement("li",{className:"user-email"},l.default.createElement("a",{href:"mailto:"+this.props.profile.email,className:"item-title"},this.props.profile.email)):null}},{key:"getFollowButton",value:function(){return this.props.profile.acl.can_follow?l.default.createElement(o.default,{className:"btn btn-block btn-outline",profile:this.props.profile}):null}},{key:"getModerationButton",value:function(){return this.props.profile.acl.can_moderate?l.default.createElement("div",{className:"btn-group btn-group-justified"},l.default.createElement("div",{className:"btn-group"},l.default.createElement("button",{className:"btn btn-default btn-moderate btn-outline dropdown-toggle",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},l.default.createElement("span",{className:"material-icon"},"tonality"),gettext("Moderation")),l.default.createElement(c.default,{profile:this.props.profile}))):null}},{key:"render",value:function(){var e=this.props.profile.acl.can_follow,t=this.props.profile.acl.can_moderate,r=!(this.props.user.id===this.props.profile.id)&&this.props.user.acl.can_start_private_threads,n=0;e&&(n+=1),t&&(n+=1),r&&(n+=1);var a=n?2*n+1:0,o="page-header";return this.props.profile.rank.css_class&&(o+=" page-header-rank-"+this.props.profile.rank.css_class),l.default.createElement("div",{className:"page-header-bg"},l.default.createElement("div",{className:o},l.default.createElement("div",{className:"container"},l.default.createElement(v,{isActive:this.props.profile.is_active,isDeletingAccount:this.props.profile.is_deleting_account}),l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-md-9 col-md-offset-3"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-sm-"+(12-a)},l.default.createElement(u.default,{className:"user-avatar user-avatar-sm",user:this.props.profile,size:"100",size2x:"200"}),l.default.createElement("h1",null,this.props.profile.username)),!!n&&l.default.createElement("div",{className:"col-sm-"+a},l.default.createElement("div",{className:"row xs-margin-top sm-margin-top"},!!r&&l.default.createElement("div",{className:g(n,0)},l.default.createElement(s.default,{className:"btn btn-default btn-block btn-outline",profile:this.props.profile,user:this.props.user})),!!e&&l.default.createElement("div",{className:g(n,1)},this.getFollowButton()),!!t&&l.default.createElement("div",{className:g(n,2)},this.getModerationButton()))))))),l.default.createElement("div",{className:"header-stats"},l.default.createElement("div",{className:"container"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-md-9 col-md-offset-3"},l.default.createElement("ul",{className:"list-inline"},this.getUserStatus(),this.getUserRank(),this.getUserTitle(),this.getJoinedOn(),this.getEmail()))))),l.default.createElement(f.CompactNav,{baseUrl:this.props.baseUrl,pages:this.props.pages,profile:this.props.profile})))}}])&&m(e.prototype,t),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function v(e){var t=e.isActive,r=e.isDeletingAccount;if(!1!==t&&!0!==r)return null;var n=null,n=r?gettext("This user is deleting their account."):gettext("This user's account has been disabled by administrator.");return l.default.createElement("div",{className:"alert alert-danger"},l.default.createElement("p",null,n))}function g(e,t){var r=2==e?"col-xs-6 col-sm-6":1==e?"col-xs-12":"";return 3==e&&(2==t?r="col-xs-12 col-sm-4 xs-margin-top":r+="col-xs-6 col-sm-4"),r}r.default=h},{"../avatar":6,"../dropdown-toggle":27,"../user-status":274,"./follow-button":185,"./message-button":189,"./moderation/nav":193,"./navs":194,react:"react"}],189:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),s=o(e("../../services/posting")),c=o(e("../.."));function o(e){return e&&e.__esModule?e:{default:e}}function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return p(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(u,n.default.Component);var e,t,r,i=d(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=p(e),n=function(){s.default.open({mode:"START_PRIVATE",submit:c.default.get("PRIVATE_THREADS_API"),to:[e.props.profile]})},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){var e=this.props.user.acl.can_start_private_threads,t=this.props.user.id===this.props.profile.id;return!e||t?null:n.default.createElement("button",{className:this.props.className,onClick:this.onClick,type:"button"},n.default.createElement("span",{className:"material-icon"},"comment"),gettext("Message"))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../..":302,"../../services/posting":375,react:"react"}],190:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../button")),i=n(e("../../form")),u=n(e("../../form-group")),s=n(e("../../modal-loader")),c=n(e("../../yes-no-switch")),f=n(e("../../modal-message")),d=e("../../../reducers/users"),p=n(e("../../../services/ajax")),m=n(e("../../../services/snackbar")),y=n(e("../../../services/store"));function n(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(a,i.default);var e,t,r,n=v(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={isLoaded:!1,isLoading:!1,error:null,is_avatar_locked:"",avatar_lock_user_message:"",avatar_lock_staff_message:""},t}return e=a,(t=[{key:"componentDidMount",value:function(){var t=this;p.default.get(this.props.profile.api.moderate_avatar).then(function(e){t.setState({isLoaded:!0,is_avatar_locked:e.is_avatar_locked,avatar_lock_user_message:e.avatar_lock_user_message||"",avatar_lock_staff_message:e.avatar_lock_staff_message||""})},function(e){t.setState({isLoaded:!0,error:e.detail})})}},{key:"clean",value:function(){return!!this.isValid()||(m.default.error(this.validate().username[0]),!1)}},{key:"send",value:function(){return p.default.post(this.props.profile.api.moderate_avatar,{is_avatar_locked:this.state.is_avatar_locked,avatar_lock_user_message:this.state.avatar_lock_user_message,avatar_lock_staff_message:this.state.avatar_lock_staff_message})}},{key:"handleSuccess",value:function(e){y.default.dispatch((0,d.updateAvatar)(this.props.profile,e.avatar_hash)),m.default.success(gettext("Avatar controls have been changed."))}},{key:"getFormBody",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"modal-body"},o.default.createElement(u.default,{label:gettext("Lock avatar"),helpText:gettext("Locking user avatar will prohibit user from changing his avatar and will reset his/her avatar to default one."),for:"id_is_avatar_locked"},o.default.createElement(c.default,{id:"id_is_avatar_locked",disabled:this.state.isLoading,iconOn:"lock_outline",iconOff:"lock_open",labelOn:gettext("Disallow user from changing avatar"),labelOff:gettext("Allow user to change avatar"),onChange:this.bindInput("is_avatar_locked"),value:this.state.is_avatar_locked})),o.default.createElement(u.default,{label:gettext("User message"),helpText:gettext("Optional message for user explaining why he/she is prohibited form changing avatar."),for:"id_avatar_lock_user_message"},o.default.createElement("textarea",{id:"id_avatar_lock_user_message",className:"form-control",rows:"4",disabled:this.state.isLoading,onChange:this.bindInput("avatar_lock_user_message"),value:this.state.avatar_lock_user_message})),o.default.createElement(u.default,{label:gettext("Staff message"),helpText:gettext("Optional message for forum team members explaining why user is prohibited form changing avatar."),for:"id_avatar_lock_staff_message"},o.default.createElement("textarea",{id:"id_avatar_lock_staff_message",className:"form-control",rows:"4",disabled:this.state.isLoading,onChange:this.bindInput("avatar_lock_staff_message"),value:this.state.avatar_lock_staff_message}))),o.default.createElement("div",{className:"modal-footer"},o.default.createElement("button",{type:"button",className:"btn btn-default","data-dismiss":"modal"},gettext("Close")),o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Save changes"))))}},{key:"getModalBody",value:function(){return this.state.error?o.default.createElement(f.default,{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.getFormBody():o.default.createElement(s.default,null)}},{key:"getClassName",value:function(){return this.state.error?"modal-dialog modal-message modal-avatar-controls":"modal-dialog modal-avatar-controls"}},{key:"render",value:function(){return o.default.createElement("div",{className:this.getClassName(),role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Avatar controls"))),this.getModalBody()))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=_},{"../../../reducers/users":364,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377,"../../button":8,"../../form":56,"../../form-group":55,"../../modal-loader":61,"../../modal-message":62,"../../yes-no-switch":300,react:"react"}],191:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../button")),u=n(e("../../form")),s=n(e("../../form-group")),c=n(e("../../modal-loader")),f=n(e("../../modal-message")),d=e("../../../reducers/username-history"),p=e("../../../reducers/users"),m=n(e("../../../services/ajax")),y=n(e("../../../services/snackbar")),b=n(e("../../../services/store")),h=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=v(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/validators"));function v(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(v=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function g(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var w=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}(a,u.default);var e,t,r,n=E(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={isLoaded:!1,isLoading:!1,error:null,username:"",validators:{username:[h.usernameContent()]}},t}return e=a,(t=[{key:"componentDidMount",value:function(){var t=this;m.default.get(this.props.profile.api.moderate_username).then(function(){t.setState({isLoaded:!0})},function(e){t.setState({isLoaded:!0,error:e.detail})})}},{key:"clean",value:function(){return!!this.isValid()||(y.default.error(this.validate().username[0]),!1)}},{key:"send",value:function(){return m.default.post(this.props.profile.api.moderate_username,{username:this.state.username})}},{key:"handleSuccess",value:function(e){this.setState({username:""}),b.default.dispatch((0,d.addNameChange)(e,this.props.profile,this.props.user)),b.default.dispatch((0,p.updateUsername)(this.props.profile,e.username,e.slug)),y.default.success(gettext("Username has been changed."))}},{key:"getFormBody",value:function(){return o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"modal-body"},o.default.createElement(s.default,{label:gettext("New username"),for:"id_username"},o.default.createElement("input",{type:"text",id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username}))),o.default.createElement("div",{className:"modal-footer"},o.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),o.default.createElement(l.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Change username"))))}},{key:"getModalBody",value:function(){return this.state.error?o.default.createElement(f.default,{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.getFormBody():o.default.createElement(c.default,null)}},{key:"getClassName",value:function(){return this.state.error?"modal-dialog modal-message modal-rename-user":"modal-dialog modal-rename-user"}},{key:"render",value:function(){return o.default.createElement("div",{className:this.getClassName(),role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Change username"))),this.getModalBody()))}}])&&g(e.prototype,t),r&&g(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=w},{"../../../reducers/username-history":363,"../../../reducers/users":364,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377,"../../../utils/validators":393,"../../button":8,"../../form":56,"../../form-group":55,"../../modal-loader":61,"../../modal-message":62,react:"react"}],192:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),i=o(e("../../button")),u=o(e("../../form")),s=o(e("../../form-group")),c=o(e("../../modal-loader")),f=o(e("../../modal-message")),d=o(e("../../yes-no-switch")),p=o(e("../../..")),m=o(e("../../../services/ajax")),y=o(e("../../../services/polls"));function o(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return g(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(l,u.default);var e,t,r,o=v(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=g(t),a=function(){window.setTimeout(function(){1<t.state.countdown?(t.setState({countdown:t.state.countdown-1}),t.countdown()):t.state.confirm||t.setState({confirm:!0})},1e3)},(n="countdown")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoaded:!1,isLoading:!1,isDeleted:!1,error:null,countdown:5,confirm:!1,with_content:!1},t}return e=l,(t=[{key:"componentDidMount",value:function(){var t=this;m.default.get(this.props.profile.api.delete).then(function(){t.setState({isLoaded:!0}),t.countdown()},function(e){t.setState({isLoaded:!0,error:e.detail})})}},{key:"send",value:function(){return m.default.post(this.props.profile.api.delete,{with_content:this.state.with_content})}},{key:"handleSuccess",value:function(){y.default.stop("user-profile"),this.state.with_content?this.setState({isDeleted:interpolate(gettext("%(username)s's account, threads, posts and other content has been deleted."),{username:this.props.profile.username},!0)}):this.setState({isDeleted:interpolate(gettext("%(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(gettext("Delete %(username)s"),{username:this.props.profile.username},!0):interpolate(gettext("Please wait... (%(countdown)ss)"),{countdown:this.state.countdown},!0)}},{key:"getForm",value:function(){return n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"modal-body"},n.default.createElement(s.default,{label:gettext("User content"),for:"id_with_content"},n.default.createElement(d.default,{id:"id_with_content",disabled:this.state.isLoading,labelOn:gettext("Delete together with user's account"),labelOff:gettext("Hide after deleting user's account"),onChange:this.bindInput("with_content"),value:this.state.with_content}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("button",{type:"button",className:"btn btn-default","data-dismiss":"modal"},gettext("Cancel")),n.default.createElement(i.default,{className:"btn-danger",loading:this.state.isLoading,disabled:!this.state.confirm},this.getButtonLabel())))}},{key:"getDeletedBody",value:function(){return n.default.createElement("div",{className:"modal-body"},n.default.createElement("div",{className:"message-icon"},n.default.createElement("span",{className:"material-icon"},"info_outline")),n.default.createElement("div",{className:"message-body"},n.default.createElement("p",{className:"lead"},this.state.isDeleted),n.default.createElement("p",null,n.default.createElement("a",{href:p.default.get("USERS_LIST_URL")},gettext("Return to users list")))))}},{key:"getModalBody",value:function(){return this.state.error?n.default.createElement(f.default,{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.state.isDeleted?this.getDeletedBody():this.getForm():n.default.createElement(c.default,null)}},{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 n.default.createElement("div",{className:this.getClassName(),role:"document"},n.default.createElement("div",{className:"modal-content"},n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Delete user account"))),this.getModalBody()))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=_},{"../../..":302,"../../../services/ajax":365,"../../../services/polls":374,"../../button":8,"../../form":56,"../../form-group":55,"../../modal-loader":61,"../../modal-message":62,"../../yes-no-switch":300,react:"react"}],193:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),l=e("react-redux"),i=o(e("./avatar-controls")),u=o(e("./change-username")),s=o(e("./delete-account")),c=o(e("../../../services/modal"));function o(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h=function(e){return{tick:e.tick,user:e.auth,profile:e.profile}},v=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(o,n.default.Component);var e,t,r,a=p(o);function o(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return b(m(e=a.call.apply(a,[this].concat(r))),"showAvatarDialog",function(){c.default.show((0,l.connect)(h)(i.default))}),b(m(e),"showRenameDialog",function(){c.default.show((0,l.connect)(h)(u.default))}),b(m(e),"showDeleteDialog",function(){c.default.show((0,l.connect)(h)(s.default))}),e}return e=o,(t=[{key:"getAvatarButton",value:function(){return this.props.profile.acl.can_moderate_avatar?n.default.createElement("li",null,n.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.showAvatarDialog},n.default.createElement("span",{className:"material-icon"},"portrait"),gettext("Avatar controls"))):null}},{key:"getRenameButton",value:function(){return this.props.profile.acl.can_rename?n.default.createElement("li",null,n.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.showRenameDialog},n.default.createElement("span",{className:"material-icon"},"credit_card"),gettext("Change username"))):null}},{key:"getDeleteButton",value:function(){return this.props.profile.acl.can_delete?n.default.createElement("li",null,n.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.showDeleteDialog},n.default.createElement("span",{className:"material-icon"},"clear"),gettext("Delete account"))):null}},{key:"render",value:function(){return n.default.createElement("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom",role:"menu"},this.getAvatarButton(),this.getRenameButton(),this.getDeleteButton())}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=v},{"../../../services/modal":371,"./avatar-controls":190,"./change-username":191,"./delete-account":192,react:"react","react-redux":"react-redux"}],194:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.CompactNav=function(t){return o.default.createElement("div",{className:"page-tabs hidden-md hidden-lg"},o.default.createElement("div",{className:"container"},o.default.createElement("ul",{className:"nav nav-pills",role:"menu"},t.pages.map(function(e){return o.default.createElement(n.default,{path:t.baseUrl+e.component+"/",key:e.component},o.default.createElement(l.Link,{to:t.baseUrl+e.component+"/",onClick:t.hideNav},o.default.createElement("span",{className:"material-icon"},e.icon),e.name))}))))},r.SideNav=void 0;var o=i(e("react")),l=e("react-router"),n=i(e("../li"));i(e("./follow-button")),i(e("../.."));function i(e){return e&&e.__esModule?e:{default:e}}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=f(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=f(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){return(f=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var d=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(a,o.default.Component);var e,t,r,n=c(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){var t=this;return o.default.createElement("div",{className:"list-group nav-side"},this.props.pages.map(function(e){return o.default.createElement(l.Link,{to:t.props.baseUrl+e.component+"/",className:"list-group-item",activeClassName:"active",key:e.component},o.default.createElement("span",{className:"material-icon"},e.icon),e.name)}))}}])&&u(e.prototype,t),r&&u(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.SideNav=d},{"../..":302,"../li":57,"./follow-button":185,react:"react","react-router":"react-router"}],195:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.paths=function(){var t=[];return b.default.get("PROFILE_PAGES").forEach(function(e){t.push(Object.assign({},e,{path:b.default.get("PROFILE").url+e.component+"/",component:(0,o.connect)(x)(N[e.component])}))}),t},r.select=x;var n=_(e("react")),o=e("react-redux"),l=_(e("./ban-details")),i=_(e("./details")),u=e("./feed"),s=_(e("./followers")),c=_(e("./follows")),f=_(e("./username-history")),d=_(e("./header")),p=(_(e("./moderation/nav")),e("./navs")),m=_(e("../avatar")),y=_(e("../with-dropdown")),b=_(e("../..")),h=e("../../reducers/profile"),v=_(e("../../services/polls")),g=_(e("../../services/store"));function _(e){return e&&e.__esModule?e:{default:e}}function E(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function w(e,t){return(w=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function O(r){var 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}}();return function(){var e,t=P(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return j(e)}(this,n?(e=P(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function j(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function P(e){return(P=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var k=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&w(e,t)}(l,y.default);var e,t,r,o=O(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=j(t),a=function(e){g.default.dispatch((0,h.hydrate)(e))},(n="update")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.startPolling(e.profile.api.index),t}return e=l,(t=[{key:"startPolling",value:function(e){v.default.start({poll:"user-profile",url:e,frequency:9e4,update:this.update})}},{key:"render",value:function(){var e=b.default.get("PROFILE").url,t=b.default.get("PROFILE_PAGES");return n.default.createElement("div",{className:"page page-user-profile"},n.default.createElement(d.default,{baseUrl:e,pages:t,profile:this.props.profile,toggleNav:this.toggleNav,toggleModeration:this.toggleModeration,user:this.props.user}),n.default.createElement("div",{className:"container"},n.default.createElement("div",{className:"row"},n.default.createElement("div",{className:"col-md-3 hidden-xs hidden-sm"},n.default.createElement("div",{className:"profile-side-avatar"},n.default.createElement(m.default,{user:this.props.profile,size:"400"})),n.default.createElement(p.SideNav,{baseUrl:e,pages:t,profile:this.props.profile})),n.default.createElement("div",{className:"col-md-9"},this.props.children))))}}])&&E(e.prototype,t),r&&E(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function x(e){return{isAuthenticated:e.auth.user.id===e.profile.id,tick:e.tick.tick,user:e.auth.user,users:e.users,posts:e.posts,profile:e.profile,profileDetails:e["profile-details"],"username-history":e["username-history"]}}r.default=k;var N={posts:u.Posts,threads:u.Threads,followers:s.default,follows:c.default,details:i.default,"username-history":f.default,"ban-details":l.default}},{"../..":302,"../../reducers/profile":356,"../../services/polls":374,"../../services/store":377,"../avatar":6,"../with-dropdown":299,"./ban-details":174,"./details":182,"./feed":183,"./followers":186,"./follows":187,"./header":188,"./moderation/nav":193,"./navs":194,"./username-history":196,react:"react","react-redux":"react-redux"}],196:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../button")),i=n(e("../quick-search")),u=n(e("../username-history/root")),s=n(e("../..")),c=e("../../reducers/username-history"),f=n(e("../../services/ajax")),d=n(e("../../services/snackbar")),p=n(e("../../services/store")),m=n(e("../../services/page-title"));function n(e){return e&&e.__esModule?e:{default:e}}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=g(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=g(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var E=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(a,o.default.Component);var e,t,r,n=h(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),_(v(t=n.call(this,e)),"loadMore",function(){t.setState({isBusy:!0}),t.loadChanges(t.state.page+1,t.state.search)}),_(v(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)}),s.default.has("PROFILE_NAME_HISTORY")?t.initWithPreloadedData(s.default.pop("PROFILE_NAME_HISTORY")):t.initWithoutPreloadedData(),t}return e=a,(t=[{key:"initWithPreloadedData",value:function(e){this.state={isLoaded:!0,isBusy:!1,search:"",count:e.count,more:e.more,page:e.page,pages:e.pages},p.default.dispatch((0,c.hydrate)(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(e,t){var r=this,n=0<arguments.length&&void 0!==e?e:1,a=1<arguments.length&&void 0!==t?t:null;f.default.get(s.default.get("USERNAME_CHANGES_API"),{user:this.props.profile.id,search:a,page:n||1},"search-username-history").then(function(e){1===n?p.default.dispatch((0,c.hydrate)(e.results)):p.default.dispatch((0,c.append)(e.results)),r.setState({isLoaded:!0,isBusy:!1,count:e.count,more:e.more,page:e.page,pages:e.pages})},function(e){d.default.apiError(e)})}},{key:"componentDidMount",value:function(){m.default.set({title:gettext("Username history"),parent:this.props.profile.username})}},{key:"getLabel",value:function(){if(this.state.isLoaded){if(this.state.search){var e=ngettext("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=ngettext("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 r=ngettext("%(username)s's username was changed %(changes)s time.","%(username)s's username was changed %(changes)s times.",this.state.count);return interpolate(r,{username:this.props.profile.username,changes:this.state.count},!0)}return gettext("Loading...")}},{key:"getEmptyMessage",value:function(){return this.state.search?gettext("Search returned no username changes matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("No name changes have been recorded for your account."):interpolate(gettext("%(username)s's username was never changed."),{username:this.props.profile.username},!0)}},{key:"getMoreButton",value:function(){return this.state.more?o.default.createElement("div",{className:"pager-more"},o.default.createElement(l.default,{className:"btn btn-default btn-outline",loading:this.state.isBusy,onClick:this.loadMore},interpolate(gettext("Show older (%(more)s)"),{more:this.state.more},!0))):null}},{key:"render",value:function(){return o.default.createElement("div",{className:"profile-username-history"},o.default.createElement("nav",{className:"toolbar"},o.default.createElement("h3",{className:"toolbar-left"},this.getLabel()),o.default.createElement(i.default,{className:"toolbar-right",value:this.state.search,onChange:this.search,placeholder:gettext("Search history...")})),o.default.createElement(u.default,{isLoaded:this.state.isLoaded,emptyMessage:this.getEmptyMessage(),changes:this.props["username-history"]}),this.getMoreButton())}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=E},{"../..":302,"../../reducers/username-history":363,"../../services/ajax":365,"../../services/page-title":373,"../../services/snackbar":376,"../../services/store":377,"../button":8,"../quick-search":197,"../username-history/root":280,react:"react"}],197:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getClassName",value:function(){return this.props.className?"form-search "+this.props.className:"form-search"}},{key:"render",value:function(){return o.default.createElement("div",{className:this.getClassName()},o.default.createElement("input",{type:"text",className:"form-control",value:this.props.value,onChange:this.props.onChange,placeholder:this.props.placeholder||gettext("Search...")}),o.default.createElement("span",{className:"material-icon"},"search"))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],198:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var i=o(e("react")),n=o(e("./loader")),u=o(e("./register.js")),s=o(e("../services/ajax")),c=o(e("../services/captcha")),f=o(e("../services/modal")),d=o(e("../services/snackbar"));function o(e){return e&&e.__esModule?e:{default:e}}function p(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t){return(m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function y(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return b(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function b(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&m(e,t)}(l,i.default.Component);var e,t,r,o=y(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=b(t),a=function(){"closed"===misago.get("SETTINGS").account_activation?d.default.info(gettext("New registrations are currently disabled.")):t.state.isLoaded?f.default.show(i.default.createElement(u.default,{criteria:t.state.criteria})):(t.setState({isLoading:!0}),Promise.all([c.default.load(),s.default.get(misago.get("AUTH_CRITERIA_API"))]).then(function(e){t.setState({isLoading:!1,isLoaded:!0,criteria:e[1]}),f.default.show(i.default.createElement(u.default,{criteria:e[1]}))},function(){t.setState({isLoading:!1}),d.default.error(gettext("Registration is currently unavailable due to an error."))}))},(n="showRegisterForm")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1,isLoaded:!1,criteria:null},t}return e=l,(t=[{key:"getClassName",value:function(){return this.props.className+(this.state.isLoading?" btn-loading":"")}},{key:"render",value:function(){return i.default.createElement("button",{className:"btn "+this.getClassName(),disabled:this.state.isLoading,onClick:this.showRegisterForm,type:"button"},gettext("Register"),this.state.isLoading?i.default.createElement(n.default,null):null)}}])&&p(e.prototype,t),r&&p(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=h},{"../services/ajax":365,"../services/captcha":367,"../services/modal":371,"../services/snackbar":376,"./loader":58,"./register.js":199,react:"react"}],199:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.RegisterForm=r.RegisterComplete=void 0;var a=_(e("react")),n=_(e("./button")),o=_(e("./form")),s=_(e("./form-group")),c=_(e("./password-strength")),f=_(e("./RegisterLegalFootnote")),d=_(e("./StartSocialAuth")),p=_(e("./..")),m=_(e("../services/ajax")),l=_(e("../services/auth")),y=_(e("../services/captcha")),b=_(e("../services/modal")),h=_(e("../services/snackbar")),v=_(e("../utils/banned-page")),g=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../utils/validators"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function _(e){return e&&e.__esModule?e:{default:e}}function E(){return(E=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function w(t,e){var r,n=Object.keys(t);return Object.getOwnPropertySymbols&&(r=Object.getOwnPropertySymbols(t),e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,r)),n}function O(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?w(Object(r),!0).forEach(function(e){M(t,e,r[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):w(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))})}return t}function j(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function P(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function k(e,t,r){return t&&P(e.prototype,t),r&&P(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function x(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&N(e,t)}function N(e,t){return(N=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function S(r){var 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}}();return function(){var e,t=C(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return R(e)}(this,n?(e=C(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function R(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function C(e){return(C=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function M(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var T=function(){x(u,o.default);var l=S(u);function u(e){var i;j(this,u),M(R(i=l.call(this,e)),"handlePrivacyPolicyChange",function(e){var t=e.target.value;i.handleToggleAgreement("privacyPolicy",t)}),M(R(i),"handleTermsOfServiceChange",function(e){var t=e.target.value;i.handleToggleAgreement("termsOfService",t)}),M(R(i),"handleToggleAgreement",function(o,l){i.setState(function(e,t){if(null===e[o]){var r=O(O({},e.errors),{},M({},o,null));return M({errors:r},o,l)}var n=i.state.validators[o][0],a=O(O({},e.errors),{},M({},o,[n(null)]));return M({errors:a},o,null)})});var t=i.props.criteria,r=t.username,n=t.password,a=0;n.forEach(function(e){"MinimumLengthValidator"===e.name&&(a=e.min_length)});var o={username:[g.usernameContent(),g.usernameMinLength(r.min_length),g.usernameMaxLength(r.max_length)],email:[g.email()],password:[g.passwordMinLength(a)],captcha:y.default.validator()};return p.default.get("TERMS_OF_SERVICE_ID")&&(o.termsOfService=[g.requiredTermsOfService()]),p.default.get("PRIVACY_POLICY_ID")&&(o.privacyPolicy=[g.requiredPrivacyPolicy()]),i.state={isLoading:!1,username:"",email:"",password:"",captcha:"",termsOfService:null,privacyPolicy:null,validators:o,errors:{}},i}return k(u,[{key:"clean",value:function(){return!!this.isValid()||(h.default.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}},{key:"send",value:function(){return m.default.post(p.default.get("USERS_API"),{username:this.state.username,email:this.state.email,password:this.state.password,captcha:this.state.captcha,terms_of_service:this.state.termsOfService,privacy_policy:this.state.privacyPolicy})}},{key:"handleSuccess",value:function(e){this.props.callback(e)}},{key:"handleError",value:function(e){400===e.status?(this.setState({errors:Object.assign({},this.state.errors,e)}),e.__all__&&0<e.__all__.length?h.default.error(e.__all__[0]):h.default.error(gettext("Form contains errors."))):403===e.status&&e.ban?((0,v.default)(e.ban),b.default.hide()):h.default.apiError(e)}},{key:"render",value:function(){return a.default.createElement("div",{className:"modal-dialog modal-register",role:"document"},a.default.createElement("div",{className:"modal-content"},a.default.createElement("div",{className:"modal-header"},a.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},a.default.createElement("span",{"aria-hidden":"true"},"×")),a.default.createElement("h4",{className:"modal-title"},gettext("Register"))),a.default.createElement("form",{onSubmit:this.handleSubmit},a.default.createElement("input",{type:"type",style:{display:"none"}}),a.default.createElement("input",{type:"password",style:{display:"none"}}),a.default.createElement("div",{className:"modal-body"},a.default.createElement(d.default,{buttonClassName:"col-xs-12 col-sm-6",buttonLabel:gettext("Join with %(site)s"),formLabel:gettext("Or create forum account:")}),a.default.createElement(s.default,{label:gettext("Username"),for:"id_username",validation:this.state.errors.username},a.default.createElement("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})),a.default.createElement(s.default,{label:gettext("E-mail"),for:"id_email",validation:this.state.errors.email},a.default.createElement("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})),a.default.createElement(s.default,{label:gettext("Password"),for:"id_password",validation:this.state.errors.password,extra:a.default.createElement(c.default,{password:this.state.password,inputs:[this.state.username,this.state.email]})},a.default.createElement("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})),y.default.component({form:this}),a.default.createElement(f.default,{errors:this.state.errors,privacyPolicy:this.state.privacyPolicy,termsOfService:this.state.termsOfService,onPrivacyPolicyChange:this.handlePrivacyPolicyChange,onTermsOfServiceChange:this.handleTermsOfServiceChange})),a.default.createElement("div",{className:"modal-footer"},a.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),a.default.createElement(n.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Register account"))))))}}]),u}();r.RegisterForm=T;var L=function(){x(t,a.default.Component);var e=S(t);function t(){return j(this,t),e.apply(this,arguments)}return k(t,[{key:"getLead",value:function(){return"user"===this.props.activation?gettext("%(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?gettext("%(username)s, your account has been created but board 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?gettext("We have sent an e-mail to %(email)s with link that you have to click to activate your account."):"admin"===this.props.activation?gettext("We will send an e-mail to %(email)s when this takes place."):void 0}},{key:"render",value:function(){return a.default.createElement("div",{className:"modal-dialog modal-message modal-register",role:"document"},a.default.createElement("div",{className:"modal-content"},a.default.createElement("div",{className:"modal-header"},a.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},a.default.createElement("span",{"aria-hidden":"true"},"×")),a.default.createElement("h4",{className:"modal-title"},gettext("Registration complete"))),a.default.createElement("div",{className:"modal-body"},a.default.createElement("div",{className:"message-icon"},a.default.createElement("span",{className:"material-icon"},"info_outline")),a.default.createElement("div",{className:"message-body"},a.default.createElement("p",{className:"lead"},interpolate(this.getLead(),{username:this.props.username},!0)),a.default.createElement("p",null,interpolate(this.getSubscript(),{email:this.props.email},!0)),a.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok"))))))}}]),t}();r.RegisterComplete=L;var D=function(){x(n,a.default.Component);var r=S(n);function n(e){var t;return j(this,n),M(R(t=r.call(this,e)),"completeRegistration",function(e){"active"===e.activation?(b.default.hide(),l.default.signIn(e)):t.setState({complete:e})}),t.state={complete:!1},t}return k(n,[{key:"render",value:function(){return this.state.complete?a.default.createElement(L,{activation:this.state.complete.activation,email:this.state.complete.email,username:this.state.complete.username}):a.default.createElement(T,E({callback:this.completeRegistration},this.props))}}]),n}();r.default=D},{"../services/ajax":365,"../services/auth":366,"../services/captcha":367,"../services/modal":371,"../services/snackbar":376,"../utils/banned-page":379,"../utils/validators":393,"./..":302,"./RegisterLegalFootnote":1,"./StartSocialAuth":2,"./button":8,"./form":56,"./form-group":55,"./password-strength":103,react:"react"}],200:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.RequestLinkForm=r.LinkSent=void 0;var a=n(e("react")),o=n(e("./..")),l=n(e("./button")),u=n(e("./form")),s=n(e("../services/ajax")),c=n(e("../services/snackbar")),f=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=p(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../utils/validators")),d=n(e("../utils/banned-page"));function p(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(p=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function m(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function y(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t,r){return t&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function v(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=w(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=w(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function w(e){return(w=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var O=function(){v(n,u.default);var r=_(n);function n(e){var t;return y(this,n),(t=r.call(this,e)).state={isLoading:!1,email:"",validators:{email:[f.email()]}},t}return h(n,[{key:"clean",value:function(){return!!this.isValid()||(c.default.error(gettext("Enter a valid email address.")),!1)}},{key:"send",value:function(){return s.default.post(o.default.get("SEND_ACTIVATION_API"),{email:this.state.email})}},{key:"handleSuccess",value:function(e){this.props.callback(e)}},{key:"handleError",value:function(e){-1<["already_active","inactive_admin"].indexOf(e.code)?c.default.info(e.detail):403===e.status&&e.ban?(0,d.default)(e.ban):c.default.apiError(e)}},{key:"render",value:function(){return a.default.createElement("div",{className:"well well-form well-form-request-activation-link"},a.default.createElement("form",{onSubmit:this.handleSubmit},a.default.createElement("div",{className:"form-group"},a.default.createElement("div",{className:"control-input"},a.default.createElement("input",{type:"text",className:"form-control",placeholder:gettext("Your e-mail address"),disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email}))),a.default.createElement(l.default,{className:"btn-primary btn-block",loading:this.state.isLoading},gettext("Send link"))))}}]),n}();r.RequestLinkForm=O;var j=function(){v(t,a.default.Component);var e=_(t);function t(){return y(this,t),e.apply(this,arguments)}return h(t,[{key:"getMessage",value:function(){return interpolate(gettext("Activation link was sent to %(email)s"),{email:this.props.user.email},!0)}},{key:"render",value:function(){return a.default.createElement("div",{className:"well well-form well-form-request-activation-link well-done"},a.default.createElement("div",{className:"done-message"},a.default.createElement("div",{className:"message-icon"},a.default.createElement("span",{className:"material-icon"},"check")),a.default.createElement("div",{className:"message-body"},a.default.createElement("p",null,this.getMessage())),a.default.createElement("button",{className:"btn btn-primary btn-block",type:"button",onClick:this.props.callback},gettext("Request another link"))))}}]),t}();r.LinkSent=j;var P=function(){v(n,a.default.Component);var r=_(n);function n(e){var t;return y(this,n),m(E(t=r.call(this,e)),"complete",function(e){t.setState({complete:e})}),m(E(t),"reset",function(){t.setState({complete:!1})}),t.state={complete:!1},t}return h(n,[{key:"render",value:function(){return this.state.complete?a.default.createElement(j,{user:this.state.complete,callback:this.reset}):a.default.createElement(O,{callback:this.complete})}}]),n}();r.default=P},{"../services/ajax":365,"../services/snackbar":376,"../utils/banned-page":379,"../utils/validators":393,"./..":302,"./button":8,"./form":56,react:"react"}],201:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.RequestResetForm=r.LinkSent=r.AccountInactivePage=void 0;var a=n(e("react")),o=n(e("react-dom")),l=n(e("./..")),u=n(e("./button")),s=n(e("./form")),c=n(e("../services/ajax")),f=n(e("../services/snackbar")),d=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=m(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../utils/validators")),p=n(e("../utils/banned-page"));function m(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(m=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function y(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function b(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function h(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function v(e,t,r){return t&&h(e.prototype,t),r&&h(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=O(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=O(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function O(e){return(O=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var j=function(){g(n,s.default);var r=E(n);function n(e){var t;return b(this,n),(t=r.call(this,e)).state={isLoading:!1,email:"",validators:{email:[d.email()]}},t}return v(n,[{key:"clean",value:function(){return!!this.isValid()||(f.default.error(gettext("Enter a valid email address.")),!1)}},{key:"send",value:function(){return c.default.post(l.default.get("SEND_PASSWORD_RESET_API"),{email:this.state.email})}},{key:"handleSuccess",value:function(e){this.props.callback(e)}},{key:"handleError",value:function(e){-1<["inactive_user","inactive_admin"].indexOf(e.code)?this.props.showInactivePage(e):403===e.status&&e.ban?(0,p.default)(e.ban):f.default.apiError(e)}},{key:"render",value:function(){return a.default.createElement("div",{className:"well well-form well-form-request-password-reset"},a.default.createElement("form",{onSubmit:this.handleSubmit},a.default.createElement("div",{className:"form-group"},a.default.createElement("div",{className:"control-input"},a.default.createElement("input",{type:"text",className:"form-control",placeholder:gettext("Your e-mail address"),disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email}))),a.default.createElement(u.default,{className:"btn-primary btn-block",loading:this.state.isLoading},gettext("Send link"))))}}]),n}();r.RequestResetForm=j;var P=function(){g(t,a.default.Component);var e=E(t);function t(){return b(this,t),e.apply(this,arguments)}return v(t,[{key:"getMessage",value:function(){return interpolate(gettext("Reset password link was sent to %(email)s"),{email:this.props.user.email},!0)}},{key:"render",value:function(){return a.default.createElement("div",{className:"well well-form well-form-request-password-reset well-done"},a.default.createElement("div",{className:"done-message"},a.default.createElement("div",{className:"message-icon"},a.default.createElement("span",{className:"material-icon"},"check")),a.default.createElement("div",{className:"message-body"},a.default.createElement("p",null,this.getMessage())),a.default.createElement("button",{type:"button",className:"btn btn-primary btn-block",onClick:this.props.callback},gettext("Request another link"))))}}]),t}();r.LinkSent=P;var k=function(){g(t,a.default.Component);var e=E(t);function t(){return b(this,t),e.apply(this,arguments)}return v(t,[{key:"getActivateButton",value:function(){return"inactive_user"===this.props.activation?a.default.createElement("p",null,a.default.createElement("a",{href:l.default.get("REQUEST_ACTIVATION_URL")},gettext("Activate your account."))):null}},{key:"render",value:function(){return a.default.createElement("div",{className:"page page-message page-message-info page-forgotten-password-inactive"},a.default.createElement("div",{className:"container"},a.default.createElement("div",{className:"message-panel"},a.default.createElement("div",{className:"message-icon"},a.default.createElement("span",{className:"material-icon"},"info_outline")),a.default.createElement("div",{className:"message-body"},a.default.createElement("p",{className:"lead"},gettext("Your account is inactive.")),a.default.createElement("p",null,this.props.message),this.getActivateButton()))))}}]),t}();r.AccountInactivePage=k;var x=function(){g(n,a.default.Component);var r=E(n);function n(e){var t;return b(this,n),y(w(t=r.call(this,e)),"complete",function(e){t.setState({complete:e})}),y(w(t),"reset",function(){t.setState({complete:!1})}),t.state={complete:!1},t}return v(n,[{key:"showInactivePage",value:function(e){o.default.render(a.default.createElement(k,{activation:e.code,message:e.detail}),document.getElementById("page-mount"))}},{key:"render",value:function(){return this.state.complete?a.default.createElement(P,{callback:this.reset,user:this.state.complete}):a.default.createElement(j,{callback:this.complete,showInactivePage:this.showInactivePage})}}]),n}();r.default=x},{"../services/ajax":365,"../services/snackbar":376,"../utils/banned-page":379,"../utils/validators":393,"./..":302,"./button":8,"./form":56,react:"react","react-dom":"react-dom"}],202:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.ResetPasswordForm=r.PasswordChangedPage=void 0;var s=y(e("react")),c=y(e("react-dom")),o=y(e("./..")),l=y(e("./button")),i=y(e("./form")),n=y(e("./sign-in.js")),u=y(e("../services/ajax")),f=y(e("../services/auth")),d=y(e("../services/modal")),p=y(e("../services/snackbar")),m=y(e("../utils/banned-page"));function y(e){return e&&e.__esModule?e:{default:e}}function b(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function h(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function v(e,t,r){return t&&h(e.prototype,t),r&&h(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=O(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=O(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function O(e){return(O=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var j=function(){g(n,i.default);var r=E(n);function n(e){var t;return b(this,n),(t=r.call(this,e)).state={isLoading:!1,password:""},t}return v(n,[{key:"clean",value:function(){return!!this.state.password.trim().length||(p.default.error(gettext("Enter new password.")),!1)}},{key:"send",value:function(){return u.default.post(o.default.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,m.default)(e.ban):p.default.apiError(e)}},{key:"render",value:function(){return s.default.createElement("div",{className:"well well-form well-form-reset-password"},s.default.createElement("form",{onSubmit:this.handleSubmit},s.default.createElement("div",{className:"form-group"},s.default.createElement("div",{className:"control-input"},s.default.createElement("input",{type:"password",className:"form-control",placeholder:gettext("Enter new password"),disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),s.default.createElement(l.default,{className:"btn-primary btn-block",loading:this.state.isLoading},gettext("Change password"))))}}]),n}();r.ResetPasswordForm=j;var P=function(){g(t,s.default.Component);var e=E(t);function t(){return b(this,t),e.apply(this,arguments)}return v(t,[{key:"getMessage",value:function(){return interpolate(gettext("%(username)s, your password has been changed successfully."),{username:this.props.user.username},!0)}},{key:"showSignIn",value:function(){d.default.show(n.default)}},{key:"render",value:function(){return s.default.createElement("div",{className:"page page-message page-message-success page-forgotten-password-changed"},s.default.createElement("div",{className:"container"},s.default.createElement("div",{className:"message-panel"},s.default.createElement("div",{className:"message-icon"},s.default.createElement("span",{className:"material-icon"},"check")),s.default.createElement("div",{className:"message-body"},s.default.createElement("p",{className:"lead"},this.getMessage()),s.default.createElement("p",null,gettext("You will have to sign in using new password before continuing.")),s.default.createElement("p",null,s.default.createElement("button",{type:"button",className:"btn btn-primary",onClick:this.showSignIn},gettext("Sign in")))))))}}]),t}();r.PasswordChangedPage=P;var k=function(){g(u,s.default.Component);var i=E(u);function u(){var e;b(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=w(e),n=function(e){f.default.softSignOut(),$('#hidden-login-form input[name="redirect_to"]').remove(),c.default.render(s.default.createElement(P,{user:e}),document.getElementById("page-mount"))},(r="complete")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return v(u,[{key:"render",value:function(){return s.default.createElement(j,{callback:this.complete})}}]),u}();r.default=k},{"../services/ajax":365,"../services/auth":366,"../services/modal":371,"../services/snackbar":376,"../utils/banned-page":379,"./..":302,"./button":8,"./form":56,"./sign-in.js":211,react:"react","react-dom":"react-dom"}],203:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),i=o(e("../..")),u=o(e("../form")),s=e("../../reducers/posts"),c=e("../../reducers/search"),f=e("../../reducers/users"),d=o(e("../../services/ajax")),p=o(e("../../services/snackbar")),m=o(e("../../services/store"));function o(e){return e&&e.__esModule?e:{default:e}}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(l,u.default);var e,t,r,o=h(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=v(t),a=function(e){t.changeValue("query",e.target.value)},(n="onQueryChange")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1,query:e.search.query},t}return e=l,(t=[{key:"componentDidMount",value:function(){this.state.query.length&&this.handleSubmit()}},{key:"clean",value:function(){return!!this.state.query.trim().length||(p.default.error(gettext("You have to enter search query.")),!1)}},{key:"send",value:function(){return m.default.dispatch((0,c.update)({isLoading:!0})),d.default.get(i.default.get("SEARCH_API"),{q:this.state.query.trim()})}},{key:"handleSuccess",value:function(e){m.default.dispatch((0,c.update)({query:this.state.query.trim(),isLoading:!1,providers:e})),e.forEach(function(e){"users"===e.id?m.default.dispatch((0,f.hydrate)(e.results.results)):"threads"===e.id&&m.default.dispatch((0,s.load)(e.results))})}},{key:"handleError",value:function(e){p.default.apiError(e),m.default.dispatch((0,c.update)({isLoading:!1}))}},{key:"render",value:function(){return n.default.createElement("div",{className:"page-header-bg"},n.default.createElement("div",{className:"page-header page-search-form"},n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"container"},n.default.createElement("div",{className:"row"},n.default.createElement("div",{className:"col-xs-12 col-md-3"},n.default.createElement("h1",null,gettext("Search"))),n.default.createElement("div",{className:"col-xs-12 col-md-9"},n.default.createElement("div",{className:"row xs-margin-top sm-margin-top"},n.default.createElement("div",{className:"col-xs-12 col-sm-8 col-md-9"},n.default.createElement("div",{className:"form-group"},n.default.createElement("input",{className:"form-control",disabled:this.props.search.isLoading||this.state.isLoading,onChange:this.onQueryChange,type:"text",value:this.state.query}))),n.default.createElement("div",{className:"col-xs-12 col-sm-4 col-md-3"},n.default.createElement("button",{className:"btn btn-primary btn-block btn-outline",disabled:this.props.search.isLoading||this.state.isLoading},gettext("Search"))))))))))}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=g},{"../..":302,"../../reducers/posts":354,"../../reducers/search":357,"../../reducers/users":364,"../../services/ajax":365,"../../services/snackbar":376,"../../services/store":377,"../form":56,react:"react"}],204:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.map(function(e){return{path:e.url,component:(0,n.connect)(u)(i[e.id]),provider:e}})},r.select=u;var n=e("react-redux"),a=l(e("./threads")),o=l(e("./users"));function l(e){return e&&e.__esModule?e:{default:e}}var i={threads:a.default,users:o.default};function u(e){return{posts:e.posts,search:e.search,tick:e.tick.tick,user:e.auth.user,users:e.users}}},{"./threads":207,"./users":209,"react-redux":"react-redux"}],205:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SearchTime=i,r.default=function(e){return n.default.createElement("div",{className:"page page-search"},n.default.createElement(a.default,{provider:e.provider,search:e.search}),n.default.createElement("div",{className:"container"},n.default.createElement("div",{className:"row"},n.default.createElement("div",{className:"col-md-3"},n.default.createElement(o.default,{providers:e.search.providers})),n.default.createElement("div",{className:"col-md-9"},e.children,n.default.createElement(i,{provider:e.provider,search:e.search})))))};var n=l(e("react")),a=l(e("./form")),o=l(e("./sidenav"));function l(e){return e&&e.__esModule?e:{default:e}}function i(t){var r=null;if(t.search.providers.forEach(function(e){e.id===t.provider.id&&(r=e.time)}),null===r)return null;var e=gettext("Search took %(time)s s to complete");return n.default.createElement("footer",{className:"search-footer"},n.default.createElement("p",null,interpolate(e,{time:r},!0)))}},{"./form":203,"./sidenav":206,react:"react"}],206:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Badge=l,r.default=function(e){return a.default.createElement("div",{className:"list-group nav-side"},e.providers.map(function(e){return a.default.createElement(o.Link,{activeClassName:"active",className:"list-group-item",key:e.id,to:e.url},a.default.createElement("span",{className:"material-icon"},e.icon),e.name,a.default.createElement(l,{results:e.results}))}))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n},o=e("react-router");function l(e){if(!e.results)return null;var t=e.results.count;return 1e6<t?t=Math.ceil(t/1e6)+"KK":1e3<t&&(t=Math.ceil(t/1e3)+"K"),a.default.createElement("span",{className:"badge"},t)}},{react:"react","react-router":"react-router"}],207:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Blankslate=u,r.default=function(e){return n.default.createElement(a.default,{provider:e.route.provider,search:e.search},n.default.createElement(u,{query:e.search.query,posts:e.posts},n.default.createElement(o.default,i({provider:e.route.provider,query:e.search.query},e.posts))))};var n=l(e("react")),a=l(e("../page")),o=l(e("./results"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){return(i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function u(e){return e.posts&&e.posts.count?e.children:e.query.length?n.default.createElement("p",{className:"lead"},gettext("No threads matching search query have been found.")):n.default.createElement("p",{className:"lead"},gettext("Enter at least two characters to search threads."))}},{"../page":205,"./results":208,react:"react"}],208:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.LoadMore=void 0,r.default=function(e){return n.default.createElement("div",null,n.default.createElement(o.default,{isReady:!0,posts:e.results}),n.default.createElement(v,e))};var n=i(e("react")),o=i(e("../../post-feed")),l=i(e("../../button")),s=(i(e("../../misago-markup")),e("../../../reducers/posts")),c=e("../../../reducers/search"),f=i(e("../../../services/ajax")),d=i(e("../../../services/snackbar")),p=i(e("../../../services/store"));function i(e){return e&&e.__esModule?e:{default:e}}function m(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=u(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=u(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function u(e){return(u=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var v=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(u,n.default.Component);var e,t,r,i=b(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=h(e),n=function(){p.default.dispatch((0,s.update)({isBusy:!0})),f.default.get(e.props.provider.api,{q:e.props.query,page:e.props.next}).then(function(e){e.forEach(function(e){"threads"===e.id&&(p.default.dispatch((0,s.append)(e.results)),p.default.dispatch((0,c.updateProvider)(e)))}),p.default.dispatch((0,s.update)({isBusy:!1}))},function(e){d.default.apiError(e),p.default.dispatch((0,s.update)({isBusy:!1}))})},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){return this.props.more?n.default.createElement("div",{className:"pager-more"},n.default.createElement(l.default,{className:"btn btn-default btn-outline",loading:this.props.isBusy,onClick:this.onClick},gettext("Show more"))):null}}])&&m(e.prototype,t),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.LoadMore=v},{"../../../reducers/posts":354,"../../../reducers/search":357,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377,"../../button":8,"../../misago-markup":60,"../../post-feed":122,react:"react"}],209:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Blankslate=i,r.default=function(e){return n.default.createElement(a.default,{provider:e.route.provider,search:e.search},n.default.createElement(i,{query:e.search.query,users:e.users},n.default.createElement(o.default,{cols:3,isReady:!0,users:e.users})))};var n=l(e("react")),a=l(e("../page")),o=l(e("../../users-list"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){return e.users.length?e.children:e.query.length?n.default.createElement("p",{className:"lead"},gettext("No users matching search query have been found.")):n.default.createElement("p",{className:"lead"},gettext("Enter at least two characters to search users."))}},{"../../users-list":284,"../page":205,react:"react"}],210:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Icon=d,r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return f(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(u,o.default.Component);var e,t,r,i=c(u);function u(){var t;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var e,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return t=i.call.apply(i,[this].concat(o)),e=f(t),n=function(e){return function(){t.props.onChange({target:{value:e}})}},(r="change")in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,t}return e=u,(t=[{key:"getChoice",value:function(){var t=this,r=null;return this.props.choices.map(function(e){e.value===t.props.value&&(r=e)}),r}},{key:"getIcon",value:function(){return this.getChoice().icon}},{key:"getLabel",value:function(){return this.getChoice().label}},{key:"render",value:function(){var r=this;return o.default.createElement("div",{className:"btn-group btn-select-group"},o.default.createElement("button",{type:"button",className:"btn btn-select dropdown-toggle",id:this.props.id||null,"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-describedby":this.props["aria-describedby"]||null,disabled:this.props.disabled||!1},o.default.createElement(d,{icon:this.getIcon()}),this.getLabel()),o.default.createElement("ul",{className:"dropdown-menu"},this.props.choices.map(function(e,t){return o.default.createElement("li",{key:t},o.default.createElement("button",{type:"button",className:"btn-link",onClick:r.change(e.value)},o.default.createElement(d,{icon:e.icon}),e.label))})))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();function d(e){var t=e.icon;return t?o.default.createElement("span",{className:"material-icon"},t):null}r.default=u},{react:"react"}],211:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./..")),i=n(e("./button")),u=n(e("./form")),s=n(e("./StartSocialAuth")),c=n(e("../services/ajax")),f=n(e("../services/modal")),d=n(e("../services/snackbar")),p=n(e("../utils/banned-page"));function n(e){return e&&e.__esModule?e:{default:e}}function m(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=h(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=h(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){return(h=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var v=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(a,u.default);var e,t,r,n=b(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),(t=n.call(this,e)).state={isLoading:!1,showActivation:!1,username:"",password:"",validators:{username:[],password:[]}},t}return e=a,(t=[{key:"clean",value:function(){return!!this.isValid()||(d.default.error(gettext("Fill out both fields.")),!1)}},{key:"send",value:function(){return c.default.post(l.default.get("AUTH_API"),{username:this.state.username,password:this.state.password})}},{key:"handleSuccess",value:function(){var e=$("#hidden-login-form");e.append('<input type="text" name="username" />'),e.append('<input type="password" name="password" />'),e.find('input[type="hidden"]').val(c.default.getCsrfToken()),e.find('input[name="redirect_to"]').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?d.default.info(e.detail):"inactive_user"===e.code?(d.default.info(e.detail),this.setState({showActivation:!0})):"banned"===e.code?((0,p.default)(e.detail),f.default.hide()):d.default.error(e.detail):403===e.status&&e.ban?((0,p.default)(e.ban),f.default.hide()):d.default.apiError(e)}},{key:"getActivationButton",value:function(){return this.state.showActivation?o.default.createElement("a",{className:"btn btn-success btn-block",href:l.default.get("REQUEST_ACTIVATION_URL")},gettext("Activate account")):null}},{key:"render",value:function(){return o.default.createElement("div",{className:"modal-dialog modal-sm modal-sign-in",role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Sign in"))),o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"modal-body"},o.default.createElement(s.default,{buttonLabel:gettext("Sign in with %(site)s"),formLabel:gettext("Or use your forum account:"),labelClassName:"text-center"}),o.default.createElement("div",{className:"form-group"},o.default.createElement("div",{className:"control-input"},o.default.createElement("input",{className:"form-control input-lg",disabled:this.state.isLoading,id:"id_username",onChange:this.bindInput("username"),placeholder:gettext("Username or e-mail"),type:"text",value:this.state.username}))),o.default.createElement("div",{className:"form-group"},o.default.createElement("div",{className:"control-input"},o.default.createElement("input",{className:"form-control input-lg",disabled:this.state.isLoading,id:"id_password",onChange:this.bindInput("password"),placeholder:gettext("Password"),type:"password",value:this.state.password})))),o.default.createElement("div",{className:"modal-footer"},this.getActivationButton(),o.default.createElement(i.default,{className:"btn-primary btn-block",loading:this.state.isLoading},gettext("Sign in")),o.default.createElement("a",{className:"btn btn-default btn-block",href:l.default.get("FORGOTTEN_PASSWORD_URL")},gettext("Forgot password?"))))))}}])&&m(e.prototype,t),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=v},{"../services/ajax":365,"../services/modal":371,"../services/snackbar":376,"../utils/banned-page":379,"./..":302,"./StartSocialAuth":2,"./button":8,"./form":56,react:"react"}],212:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Snackbar=void 0,r.select=function(e){return e.snackbar};var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c={info:"alert-info",success:"alert-success",warning:"alert-warning",error:"alert-danger"},f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getSnackbarClass",value:function(){var e="alerts-snackbar";return this.props.isVisible?e+=" in":e+=" out",e}},{key:"render",value:function(){return o.default.createElement("div",{className:this.getSnackbarClass()},o.default.createElement("p",{className:"alert "+c[this.props.type]},this.props.message))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.Snackbar=f},{react:"react"}],213:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var l=n(e("react")),i=n(e("./header")),u=n(e("../.."));function n(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=e.activation,r=e.backend_name,n=e.username,a="",o="",o="user"===t?gettext("%(username)s, your account has been created but you need to activate it before you will be able to sign in."):"admin"===t?gettext("%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in."):gettext("%(username)s, your account has been created and you have been signed in to it."),a="active"===t?"check":"info_outline";return l.default.createElement("div",{className:"page page-social-auth page-social-sauth-register"},l.default.createElement(i.default,{backendName:r}),l.default.createElement("div",{className:"container"},l.default.createElement("div",{className:"row"},l.default.createElement("div",{className:"col-md-6 col-md-offset-3"},l.default.createElement("div",{className:"panel panel-default panel-form"},l.default.createElement("div",{className:"panel-heading"},l.default.createElement("h3",{className:"panel-title"},gettext("Registration completed!"))),l.default.createElement("div",{className:"panel-body panel-message-body"},l.default.createElement("div",{className:"message-icon"},l.default.createElement("span",{className:"material-icon"},a)),l.default.createElement("div",{className:"message-body"},l.default.createElement("p",{className:"lead"},interpolate(o,{username:n},!0)),l.default.createElement("p",{className:"help-block"},l.default.createElement("a",{className:"btn btn-default",href:u.default.get("MISAGO_PATH")},gettext("Return to forum index"))))))))))}r.default=a},{"../..":302,"./header":214,react:"react"}],214:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){var t=e.backendName,r=gettext("Sign in with %(backend)s"),n=interpolate(r,{backend:t},!0);return a.default.createElement("div",{className:"page-header-bg"},a.default.createElement("div",{className:"page-header"},a.default.createElement("div",{className:"container"},a.default.createElement("h1",null,n))))}r.default=o},{react:"react"}],215:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var u=n(e("react")),s=n(e("./register")),c=n(e("./complete"));function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return d(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(l,u.default.Component);var e,t,r,a=f(l);function l(e){var o,t,r,n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),o=a.call(this,e),t=d(o),n=function(e){var t=e.activation,r=e.email,n=e.step,a=e.username;o.setState({activation:t,email:r,step:n,username:a})},(r="handleRegistrationComplete")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,o.state={step:e.step,activation:e.activation||"",email:e.email||"",username:e.username||""},o}return e=l,(t=[{key:"render",value:function(){var e=this.props,t=e.backend_name,r=e.url,n=this.state,a=n.activation,o=n.email,l=n.step,i=n.username;return"register"===l?u.default.createElement(s.default,{backend_name:t,email:o,url:r,username:i,onRegistrationComplete:this.handleRegistrationComplete}):u.default.createElement(c.default,{activation:a,backend_name:t,email:o,url:r,username:i})}}])&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=p},{"./complete":213,"./register":216,react:"react"}],216:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var u=n(e("react")),o=n(e("../..")),s=n(e("../RegisterLegalFootnote")),c=n(e("../button")),l=n(e("../form")),f=n(e("../form-group")),d=n(e("../../services/ajax")),p=n(e("../../services/snackbar")),m=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=b(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../utils/validators")),y=n(e("./header"));function b(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(b=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function a(t,e){var r,n=Object.keys(t);return Object.getOwnPropertySymbols&&(r=Object.getOwnPropertySymbols(t),e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,r)),n}function h(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?a(Object(r),!0).forEach(function(e){O(t,e,r[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))})}return t}function v(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=w(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=w(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function w(e){return(w=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function O(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var j=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}(a,l.default);var e,t,r,n=_(a);function a(e){var i;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),O(E(i=n.call(this,e)),"handlePrivacyPolicyChange",function(e){var t=e.target.value;i.handleToggleAgreement("privacyPolicy",t)}),O(E(i),"handleTermsOfServiceChange",function(e){var t=e.target.value;i.handleToggleAgreement("termsOfService",t)}),O(E(i),"handleToggleAgreement",function(o,l){i.setState(function(e,t){if(null===e[o]){var r=h(h({},e.errors),{},O({},o,null));return O({errors:r},o,l)}var n=i.state.validators[o][0],a=h(h({},e.errors),{},O({},o,[n(null)]));return O({errors:a},o,null)})});var t={email:[m.email()],username:[m.usernameContent()]};return o.default.get("TERMS_OF_SERVICE_ID")&&(t.termsOfService=[m.requiredTermsOfService()]),o.default.get("PRIVACY_POLICY_ID")&&(t.privacyPolicy=[m.requiredPrivacyPolicy()]),i.state={email:e.email||"",emailProtected:!!e.email,username:e.username||"",termsOfService:null,privacyPolicy:null,validators:t,errors:{},isLoading:!1},i}return e=a,(t=[{key:"clean",value:function(){this.validate();if(-1!==[this.state.email.trim().length,this.state.username.trim().length].indexOf(0))return p.default.error(gettext("Fill out all fields.")),!1;var e=this.state.validators;return o.default.get("TERMS_OF_SERVICE_ID")&&null===this.state.termsOfService?(p.default.error(e.termsOfService[0](null)),!1):!o.default.get("PRIVACY_POLICY_ID")||null!==this.state.privacyPolicy||(p.default.error(e.privacyPolicy[0](null)),p.default.error(gettext("You need to accept the privacy policy.")),!1)}},{key:"send",value:function(){return d.default.post(this.props.url,{email:this.state.email,username:this.state.username,terms_of_service:this.state.termsOfService,privacy_policy:this.state.privacyPolicy})}},{key:"handleSuccess",value:function(e){(0,this.props.onRegistrationComplete)(e)}},{key:"handleError",value:function(e){var t;200===e.status?(0,this.props.onRegistrationComplete)({activation:"active",step:"done",username:this.state.username}):400===e.status?(t={errors:e},e.email&&(t.emailProtected=!1),this.setState(t)):p.default.apiError(e)}},{key:"render",value:function(){var e,t=this.props.backend_name,r=this.state,n=r.email,a=r.emailProtected,o=r.username,l=r.isLoading,i=null;return a&&(e=gettext("Your e-mail address has been verified by %(backend)s."),i=interpolate(e,{backend:t},!0)),u.default.createElement("div",{className:"page page-social-auth page-social-sauth-register"},u.default.createElement(y.default,{backendName:t}),u.default.createElement("div",{className:"container"},u.default.createElement("div",{className:"row"},u.default.createElement("div",{className:"col-md-6 col-md-offset-3"},u.default.createElement("form",{onSubmit:this.handleSubmit},u.default.createElement("div",{className:"panel panel-default panel-form"},u.default.createElement("div",{className:"panel-heading"},u.default.createElement("h3",{className:"panel-title"},gettext("Complete your details"))),u.default.createElement("div",{className:"panel-body"},u.default.createElement(f.default,{for:"id_username",label:gettext("Username"),validation:this.state.errors.username},u.default.createElement("input",{type:"text",id:"id_username",className:"form-control",disabled:l,onChange:this.bindInput("username"),value:o})),u.default.createElement(f.default,{for:"id_email",label:gettext("E-mail address"),helpText:i,validation:a?null:this.state.errors.email},u.default.createElement("input",{type:"email",id:"id_email",className:"form-control",disabled:l||a,onChange:this.bindInput("email"),value:n})),u.default.createElement(s.default,{errors:this.state.errors,privacyPolicy:this.state.privacyPolicy,termsOfService:this.state.termsOfService,onPrivacyPolicyChange:this.handlePrivacyPolicyChange,onTermsOfServiceChange:this.handleTermsOfServiceChange})),u.default.createElement("div",{className:"panel-footer"},u.default.createElement(c.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Sign in")))))))))}}])&&v(e.prototype,t),r&&v(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=j},{"../..":302,"../../services/ajax":365,"../../services/snackbar":376,"../../utils/validators":393,"../RegisterLegalFootnote":1,"../button":8,"../form":56,"../form-group":55,"./header":214,react:"react"}],217:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Breadcrumb=o,r.GoBack=l,r.default=function(e){return a.default.createElement("div",{className:"page-breadcrumbs"},a.default.createElement("div",{className:"container"},a.default.createElement("ol",{className:"breadcrumb hidden-xs"},e.path.map(function(e){return a.default.createElement(o,{key:e.id,node:e})})),a.default.createElement(l,e)))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){return a.default.createElement("li",null,a.default.createElement("a",{href:e.node.url.index},e.node.name))}function l(e){var t=e.path[e.path.length-1];return a.default.createElement("a",{href:t.url.index,className:"go-back-sm visible-xs-block"},a.default.createElement("span",{className:"material-icon"},"chevron_left"),t.name)}},{react:"react"}],218:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Moderation=j,r.default=void 0;var o=n(e("react")),l=n(e("./breadcrumbs")),u=e("../moderation/thread"),s=n(e("./stats")),c=n(e("../../form")),f=e("../../posting/utils/validators"),d=n(e("../../../services/ajax")),p=n(e("../../../services/snackbar")),m=n(e("../../../services/store")),y=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=b(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/thread"));function b(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(b=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function h(){return(h=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function v(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function g(e,t){return(g=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function _(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return E(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function E(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function w(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var O=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&g(e,t)}(a,c.default);var e,t,r,n=_(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),w(E(t=n.call(this,e)),"onChange",function(e){t.changeValue("title",e.target.value)}),w(E(t),"onEdit",function(){t.setState({isEditing:!0})}),w(E(t),"onCancel",function(){t.setState({title:t.props.thread.title,isEditing:!1})}),t.state={isEditing:!1,isLoading:!1,title:e.thread.title,validators:{title:(0,f.getTitleValidators)()},errors:{}},t}return e=a,(t=[{key:"clean",value:function(){if(!this.state.title.trim().length)return p.default.error(gettext("You have to enter thread title.")),!1;var e=this.validate();return!e.title||(p.default.error(e.title[0]),!1)}},{key:"send",value:function(){return d.default.patch(this.props.thread.api.index,[{op:"replace",path:"title",value:this.state.title}])}},{key:"handleSuccess",value:function(e){m.default.dispatch(y.update(e)),this.setState({isEditing:!1})}},{key:"handleError",value:function(e){400===e.status?p.default.error(e.detail[0]):p.default.apiError(e)}},{key:"render",value:function(){var e=this.props,t=e.thread,r=e.user,n=!!r.id&&(0,u.isModerationVisible)(t);return this.state.isEditing?o.default.createElement("div",{className:"page-header"},o.default.createElement(l.default,{path:t.path}),o.default.createElement("div",{className:"container"},o.default.createElement("div",{className:"row xs-margin-top title-edit-form"},o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"col-sm-6 col-md-6"},o.default.createElement("input",{className:"form-control",type:"text",value:this.state.title,onChange:this.onChange})),o.default.createElement("div",{className:"col-sm-6 col-md-4"},o.default.createElement("div",{className:"row xs-margin-top-half sm-margin-top-no md-margin-top-no"},o.default.createElement("div",{className:"col-xs-6"},o.default.createElement("button",{className:"btn btn-primary btn-block btn-outline",disabled:this.state.isLoading,title:gettext("Change title")},gettext("Save changes"))),o.default.createElement("div",{className:"col-xs-6"},o.default.createElement("button",{className:"btn btn-default btn-block btn-outline",disabled:this.state.isLoading,onClick:this.onCancel,title:gettext("Cancel"),type:"button"},gettext("Cancel")))))))),o.default.createElement(s.default,{thread:t})):r.id&&t.acl.can_edit?o.default.createElement("div",{className:"page-header"},o.default.createElement(l.default,{path:t.path}),o.default.createElement("div",{className:"container"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:n?"col-sm-9 col-md-8":"col-sm-10 col-md-10"},o.default.createElement("h1",null,t.title)),o.default.createElement("div",{className:n?"col-sm-3 col-md-4":"col-sm-3 col-md-2"},o.default.createElement("div",{className:"row xs-margin-top md-margin-top-no"},o.default.createElement("div",{className:n?"col-xs-6":"col-xs-12"},o.default.createElement("button",{className:"btn btn-default btn-block btn-outline",onClick:this.onEdit,title:gettext("Edit title"),type:"button"},o.default.createElement("span",{className:"material-icon"},"edit"),o.default.createElement("span",{className:"hidden-sm"},gettext("Edit")))),n&&o.default.createElement(j,this.props))))),o.default.createElement(s.default,{thread:t})):n?o.default.createElement("div",{className:"page-header"},o.default.createElement(l.default,{path:t.path}),o.default.createElement("div",{className:"container"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-sm-9 col-md-10"},o.default.createElement("h1",null,t.title)),o.default.createElement("div",{className:"col-sm-3 col-md-2"},o.default.createElement("div",{className:"row xs-margin-top md-margin-top-no"},o.default.createElement(j,h({isSingle:!0},this.props)))))),o.default.createElement(s.default,{thread:t})):o.default.createElement("div",{className:"page-header"},o.default.createElement(l.default,{path:t.path}),o.default.createElement("div",{className:"container"},o.default.createElement("h1",null,t.title)),o.default.createElement(s.default,{thread:t}))}}])&&v(e.prototype,t),r&&v(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function j(e){return o.default.createElement("div",{className:e.isSingle?"col-xs-12":"col-xs-6"},o.default.createElement("div",{className:"btn-group btn-group-justified"},o.default.createElement("div",{className:"btn-group"},o.default.createElement("button",{"aria-expanded":"false","aria-haspopup":"true",className:"btn btn-default btn-outline dropdown-toggle","data-toggle":"dropdown",disabled:e.thread.isBusy,type:"button"},o.default.createElement("span",{className:"material-icon"},"settings"),o.default.createElement("span",{className:e.isSingle?"":"hidden-sm"},gettext("Moderation"))),o.default.createElement(u.ModerationControls,{posts:e.posts,thread:e.thread,user:e.user}))))}r.default=O},{"../../../reducers/thread":360,"../../../services/ajax":365,"../../../services/snackbar":376,"../../../services/store":377,"../../form":56,"../../posting/utils/validators":144,"../moderation/thread":227,"./breadcrumbs":217,"./stats":219,react:"react"}],219:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.IsClosed=d,r.IsHidden=f,r.LastReply=m,r.Replies=p,r.Unapproved=c,r.Weight=s,r.default=function(e){return a.default.createElement("div",{className:"header-stats"},a.default.createElement("div",{className:"container"},a.default.createElement("ul",{className:"list-inline"},a.default.createElement(s,{thread:e.thread}),a.default.createElement(c,{thread:e.thread}),a.default.createElement(f,{thread:e.thread}),a.default.createElement(d,{thread:e.thread}),a.default.createElement(p,{thread:e.thread}),a.default.createElement(m,{thread:e.thread}))))};var a=n(e("react")),o=n(e("../../../utils/escape-html"));function n(e){return e&&e.__esModule?e:{default:e}}var l='<a href="%(url)s" class="poster-title">%(user)s</a>',i='<span class="poster-title">%(user)s</span>',u='<abbr class="last-title" title="%(absolute)s">%(relative)s</abbr>';function s(e){return 2==e.thread.weight?a.default.createElement("li",{className:"thread-pinned-globally"},a.default.createElement("span",{className:"material-icon"},"bookmark"),a.default.createElement("span",{className:"icon-legend"},gettext("Pinned globally"))):1==e.thread.weight?a.default.createElement("li",{className:"thread-pinned-locally"},a.default.createElement("span",{className:"material-icon"},"bookmark_border"),a.default.createElement("span",{className:"icon-legend"},gettext("Pinned locally"))):null}function c(e){return e.thread.is_unapproved?a.default.createElement("li",{className:"thread-unapproved"},a.default.createElement("span",{className:"material-icon"},"remove_circle"),a.default.createElement("span",{className:"icon-legend"},gettext("Unapproved"))):e.thread.has_unapproved_posts?a.default.createElement("li",{className:"thread-unapproved-posts"},a.default.createElement("span",{className:"material-icon"},"remove_circle_outline"),a.default.createElement("span",{className:"icon-legend"},gettext("Unapproved posts"))):null}function f(e){return e.thread.is_hidden?a.default.createElement("li",{className:"thread-hidden"},a.default.createElement("span",{className:"material-icon"},"visibility_off"),a.default.createElement("span",{className:"icon-legend"},gettext("Hidden"))):null}function d(e){return e.thread.is_closed?a.default.createElement("li",{className:"thread-closed"},a.default.createElement("span",{className:"material-icon"},"lock_outline"),a.default.createElement("span",{className:"icon-legend"},gettext("Closed"))):null}function p(e){var t=ngettext("%(replies)s reply","%(replies)s replies",e.thread.replies),r=interpolate(t,{replies:e.thread.replies},!0);return a.default.createElement("li",{className:"thread-replies"},a.default.createElement("span",{className:"material-icon"},"forum"),a.default.createElement("span",{className:"icon-legend"},r))}function m(e){var t=null,t=e.thread.url.last_poster?interpolate(l,{url:(0,o.default)(e.thread.url.last_poster),user:(0,o.default)(e.thread.last_poster_name)},!0):interpolate(i,{user:(0,o.default)(e.thread.last_poster_name)},!0),r=interpolate(u,{absolute:(0,o.default)(e.thread.last_post_on.format("LLL")),relative:(0,o.default)(e.thread.last_post_on.fromNow())},!0),n=interpolate((0,o.default)(gettext("last reply by %(user)s %(date)s")),{date:r,user:t},!0);return a.default.createElement("li",{className:"thread-last-reply",dangerouslySetInnerHTML:{__html:n}})}},{"../../../utils/escape-html":383,react:"react"}],220:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.approve=function(e){var t=e.selection,r=t.map(function(e){return{id:e.id,is_unapproved:!1}}),n=t.map(function(e){return{id:e.id,is_unapproved:e.is_unapproved}});l(e,[{op:"replace",path:"is-unapproved",value:!1}],r,n)},r.hide=function(t){var e=t.selection,r=e.map(function(e){return{id:e.id,is_hidden:!0,hidden_on:(0,a.default)(),hidden_by_name:t.user.username,url:Object.assign(e.url,{hidden_by:t.user.url})}}),n=e.map(function(e){return{id:e.id,is_hidden:e.is_hidden,hidden_on:e.hidden_on,hidden_by_name:e.hidden_by_name,url:e.url}});l(t,[{op:"replace",path:"is-hidden",value:!0}],r,n)},r.merge=function(t){if(!window.confirm(gettext("Are you sure you want to merge selected posts? This action is not reversible!")))return;t.selection.slice(1).map(function(e){m.default.dispatch(s.patch(e,{isDeleted:!0}))}),f.default.post(t.thread.api.posts.merge,{posts:t.selection.map(function(e){return e.id})}).then(function(e){m.default.dispatch(s.patch(e,s.hydrate(e)))},function(e){400===e.status?p.default.error(e.detail):p.default.apiError(e),t.selection.slice(1).map(function(e){m.default.dispatch(s.patch(e,{isDeleted:!1}))})}),m.default.dispatch(c.deselectAll())},r.patch=l,r.protect=function(e){var t=e.selection,r=t.map(function(e){return{id:e.id,is_protected:!0}}),n=t.map(function(e){return{id:e.id,is_protected:e.is_protected}});l(e,[{op:"replace",path:"is-protected",value:!0}],r,n)},r.remove=function(t){if(!window.confirm(gettext("Are you sure you want to delete selected posts? This action is not reversible!")))return;t.selection.map(function(e){m.default.dispatch(s.patch(e,{isDeleted:!0}))});var e=t.selection.map(function(e){return e.id});f.default.delete(t.thread.api.posts.index,e).then(function(){},function(e){400===e.status?p.default.error(e.detail):p.default.apiError(e),t.selection.map(function(e){m.default.dispatch(s.patch(e,{isDeleted:!1}))})}),m.default.dispatch(c.deselectAll())},r.unhide=function(t){var e=t.selection,r=e.map(function(e){return{id:e.id,is_hidden:!1,hidden_on:(0,a.default)(),hidden_by_name:t.user.username,url:Object.assign(e.url,{hidden_by:t.user.url})}}),n=e.map(function(e){return{id:e.id,is_hidden:e.is_hidden,hidden_on:e.hidden_on,hidden_by_name:e.hidden_by_name,url:e.url}});l(t,[{op:"replace",path:"is-hidden",value:!1}],r,n)},r.unprotect=function(e){var t=e.selection,r=t.map(function(e){return{id:e.id,is_protected:!1}}),n=t.map(function(e){return{id:e.id,is_protected:e.is_protected}});l(e,[{op:"replace",path:"is-protected",value:!1}],r,n)};var a=o(e("moment")),u=o(e("react")),s=n(e("../../../../reducers/post")),c=n(e("../../../../reducers/posts")),f=o(e("../../../../services/ajax")),d=o(e("../../../../services/modal")),p=o(e("../../../../services/snackbar")),m=o(e("../../../../services/store")),y=o(e("./errors-list"));function b(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(b=function(e){return e?r:t})(e)}function n(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=b(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function o(e){return e&&e.__esModule?e:{default:e}}function l(e,t,r,a){var o=e.selection,n=e.thread;r.forEach(function(e){s.patch(e,e)}),m.default.dispatch(c.deselectAll());var l={ops:t,ids:o.map(function(e){return e.id})};f.default.patch(n.api.posts.index,l).then(function(e){e.forEach(function(e){m.default.dispatch(s.patch(e,e))})},function(e){if(400!==e.status)return a.forEach(function(e){m.default.dispatch(s.patch(e,e))}),p.default.apiError(e);var t=[],r=[];e.forEach(function(e){e.detail?(t.push(e),r.push(e.id)):m.default.dispatch(s.patch(e,e)),a.forEach(function(e){-1!==r.indexOf(e)&&m.default.dispatch(s.patch(e,e))})});var n={};o.forEach(function(e){n[e.id]=e}),d.default.show(u.default.createElement(y.default,{errors:t,posts:n}))})}},{"../../../../reducers/post":353,"../../../../reducers/posts":354,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"./errors-list":222,moment:"moment",react:"react"}],221:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Unprotect=r.Unhide=r.Split=r.Protect=r.Move=r.Merge=r.Hide=r.Delete=r.Approve=void 0,r.default=function(e){return l.default.createElement("ul",{className:"dropdown-menu"},l.default.createElement(_,e),l.default.createElement(E,e),l.default.createElement(w,e),l.default.createElement(O,e),l.default.createElement(j,e),l.default.createElement(P,e),l.default.createElement(x,e),l.default.createElement(k,e),l.default.createElement(N,e))};var l=n(e("react")),u=n(e("../../../../services/modal")),s=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./actions")),c=n(e("./move")),f=n(e("./split"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t,r){return t&&a(e.prototype,t),r&&a(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function y(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&o(e,t)}function o(e,t){return(o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=v(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=v(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function g(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var _=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.approve(e.props)}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.acl.can_approve&&e.is_unapproved})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"done"),gettext("Approve"))):null}}]),o}();r.Approve=_;var E=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.merge(e.props)}),e}return m(o,[{key:"render",value:function(){return 1<this.props.selection.length&&this.props.selection.find(function(e){return e.acl.can_merge})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"call_merge"),gettext("Merge"))):null}}]),o}();r.Merge=E;var w=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.default.show(l.default.createElement(c.default,e.props))}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.acl.can_move})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"arrow_forward"),gettext("Move"))):null}}]),o}();r.Move=w;var O=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){u.default.show(l.default.createElement(f.default,e.props))}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.acl.can_move})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"call_split"),gettext("Split"))):null}}]),o}();r.Split=O;var j=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.protect(e.props)}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return!e.is_protected&&e.acl.can_protect})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"lock_outline"),gettext("Protect"))):null}}]),o}();r.Protect=j;var P=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.unprotect(e.props)}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.is_protected&&e.acl.can_protect})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"lock_open"),gettext("Unprotect"))):null}}]),o}();r.Unprotect=P;var k=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.hide(e.props)}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.acl.can_hide&&!e.is_hidden})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"visibility_off"),gettext("Hide"))):null}}]),o}();r.Hide=k;var x=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.unhide(e.props)}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.acl.can_unhide&&e.is_hidden})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"visibility"),gettext("Unhide"))):null}}]),o}();r.Unhide=x;var N=function(){y(o,l.default.Component);var a=b(o);function o(){var e;p(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){s.remove(e.props)}),e}return m(o,[{key:"render",value:function(){return this.props.selection.find(function(e){return e.acl.can_delete})?l.default.createElement("li",null,l.default.createElement("button",{type:"button",className:"btn btn-link",onClick:this.onClick},l.default.createElement("span",{className:"material-icon"},"clear"),gettext("Delete"))):null}}]),o}();r.Delete=N},{"../../../../services/modal":371,"./actions":220,"./move":224,"./split":225,react:"react"}],222:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.PostErrors=o,r.default=function(e){var t=e.errors,r=e.posts;return a.default.createElement("div",{className:"modal-dialog",role:"document"},a.default.createElement("div",{className:"modal-content"},a.default.createElement("div",{className:"modal-header"},a.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},a.default.createElement("span",{"aria-hidden":"true"},"×")),a.default.createElement("h4",{className:"modal-title"},gettext("Moderation"))),a.default.createElement("div",{className:"modal-body"},a.default.createElement("p",{className:"lead"},gettext("One or more posts could not be changed:")),a.default.createElement("ul",{className:"list-unstyled list-errored-items"},t.map(function(e){return a.default.createElement(o,{errors:e.detail,key:e.id,post:r[e.id]})})))))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){var t=e.errors,r=e.post,n=interpolate(gettext("%(username)s on %(posted_on)s"),{posted_on:r.posted_on.format("LL, LT"),username:r.poster_name},!0);return a.default.createElement("li",null,a.default.createElement("h5",null,n,":"),t.map(function(e,t){return a.default.createElement("p",{key:t},e)}))}},{react:"react"}],223:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){if(!e.user.id||!i(e.thread,e.posts.results))return null;var t=e.posts.results.filter(function(e){return e.isSelected});return n.default.createElement("div",{className:"dropup"},n.default.createElement("button",{"aria-expanded":"true","aria-haspopup":"true",className:"btn btn-default dropdown-toggle btn-block btn-outline","data-toggle":"dropdown",disabled:!t.length,type:"button"},gettext("Posts options")),n.default.createElement(a.default,l({selection:t},e)))},r.isVisible=i;var n=o(e("react")),a=o(e("./dropdown"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function i(e,t){if(e.acl.can_merge_posts&&1<t.length)return!0;var r=!1;return t.forEach(function(e){e.is_event||(e.acl.can_approve&&e.is_unapproved||e.acl.can_delete||!e.is_hidden&&e.acl.can_hide||e.acl.can_move||e.acl.can_merge||e.acl.can_protect||e.is_hidden&&e.acl.can_unhide||e.acl.can_unprotect)&&(r=!0)}),r}},{"./dropdown":221,react:"react"}],224:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ModalHeader=_,r.default=void 0;var n=o(e("react")),a=(o(e("../../../button")),o(e("../../../form"))),u=o(e("../../../form-group")),s=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=m(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../../reducers/post")),c=o(e("../../../../services/ajax")),f=o(e("../../../../services/modal")),d=o(e("../../../../services/snackbar")),p=o(e("../../../../services/store"));function m(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(m=function(e){return e?r:t})(e)}function o(e){return e&&e.__esModule?e:{default:e}}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(l,a.default);var e,t,r,o=h(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=v(t),a=function(e){t.changeValue("url",e.target.value)},(n="onUrlChange")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isLoading:!1,url:"",validators:{url:[]},errors:{}},t}return e=l,(t=[{key:"clean",value:function(){return!!this.state.url.trim().length||(d.default.error(gettext("You have to enter link to the other thread.")),!1)}},{key:"send",value:function(){return c.default.post(this.props.thread.api.posts.move,{new_thread:this.state.url,posts:this.props.selection.map(function(e){return e.id})})}},{key:"handleSuccess",value:function(){this.props.selection.forEach(function(e){p.default.dispatch(s.patch(e,{isDeleted:!0}))}),f.default.hide(),d.default.success(gettext("Selected posts were moved to the other thread."))}},{key:"handleError",value:function(e){400===e.status?d.default.error(e.detail):d.default.apiError(e)}},{key:"render",value:function(){return n.default.createElement("div",{className:"modal-dialog",role:"document"},n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"modal-content"},n.default.createElement(_,null),n.default.createElement("div",{className:"modal-body"},n.default.createElement(u.default,{for:"id_url",label:gettext("Link to thread you want to move posts to")},n.default.createElement("input",{className:"form-control",disabled:this.state.isLoading,id:"id_url",onChange:this.onUrlChange,value:this.state.url}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),n.default.createElement("button",{className:"btn btn-primary",loading:this.state.isLoading},gettext("Move posts"))))))}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function _(e){return n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Move posts")))}r.default=g},{"../../../../reducers/post":353,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../button":8,"../../../form":56,"../../../form-group":55,react:"react"}],225:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Error=T,r.Loader=M,r.Modal=L,r.PostingConfig=r.ModerationForm=void 0,r.default=function(e){return a.default.createElement(R,S({},e,{Form:C}))};var a=_(e("react")),n=_(e("../../../button")),u=_(e("../../../form")),s=_(e("../../../form-group")),c=_(e("../../../category-select")),o=_(e("../../../modal-loader")),f=_(e("../../../select")),d=l(e("../../../../reducers/post")),p=_(e("../../../../services/ajax")),m=_(e("../../../../services/modal")),y=_(e("../../../../services/snackbar")),b=_(e("../../../../services/store")),h=l(e("../../../../utils/validators")),v=_(e("./errors-list"));function g(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(g=function(e){return e?r:t})(e)}function l(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=g(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function _(e){return e&&e.__esModule?e:{default:e}}function E(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function w(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function O(e,t,r){return t&&w(e.prototype,t),r&&w(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function j(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&P(e,t)}function P(e,t){return(P=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function k(r){var 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}}();return function(){var e,t=N(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return x(e)}(this,n?(e=N(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function x(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function N(e){return(N=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function S(){return(S=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}var R=function(){j(n,a.default.Component);var r=k(n);function n(e){var t;return E(this,n),(t=r.call(this,e)).state={isLoaded:!1,isError:!1,categories:[]},t}return O(n,[{key:"componentDidMount",value:function(){var r=this;p.default.get(misago.get("THREAD_EDITOR_API")).then(function(e){var t=e.map(function(e){return Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id,post:e.post})});r.setState({isLoaded:!0,categories:t})},function(e){r.setState({isError:e.detail})})}},{key:"render",value:function(){return this.state.isError?a.default.createElement(T,{message:this.state.isError}):this.state.isLoaded?a.default.createElement(C,S({},this.props,{categories:this.state.categories})):a.default.createElement(M,null)}}]),n}();r.PostingConfig=R;var C=function(){j(l,u.default);var o=k(l);function l(e){var n,t,r,a;return E(this,l),n=o.call(this,e),t=x(n),a=function(e){var t=e.target.value,r={category:t};n.acl[t].can_pin_threads<r.weight&&(r.weight=0),n.acl[t].can_hide_threads||(r.is_hidden=0),n.acl[t].can_close_threads||(r.is_closed=!1),n.setState(r)},(r="onCategoryChange")in t?Object.defineProperty(t,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[r]=a,n.state={isLoading:!1,title:"",category:null,categories:e.categories,weight:0,is_hidden:0,is_closed:!1,validators:{title:[h.required()]},errors:{}},n.isHiddenChoices=[{value:0,icon:"visibility",label:gettext("No")},{value:1,icon:"visibility_off",label:gettext("Yes")}],n.isClosedChoices=[{value:!1,icon:"lock_outline",label:gettext("No")},{value:!0,icon:"lock",label:gettext("Yes")}],n.acl={},n.props.categories.forEach(function(e){e.post&&(n.state.category||(n.state.category=e.id),n.acl[e.id]={can_pin_threads:e.post.pin,can_close_threads:e.post.close,can_hide_threads:e.post.hide})}),n}return O(l,[{key:"clean",value:function(){return!!this.isValid()||(y.default.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}},{key:"send",value:function(){return p.default.post(this.props.thread.api.posts.split,{title:this.state.title,category:this.state.category,weight:this.state.weight,is_hidden:this.state.is_hidden,is_closed:this.state.is_closed,posts:this.props.selection.map(function(e){return e.id})})}},{key:"handleSuccess",value:function(){this.props.selection.forEach(function(e){b.default.dispatch(d.patch(e,{isDeleted:!0}))}),m.default.hide(),y.default.success(gettext("Selected posts were split into new thread."))}},{key:"handleError",value:function(e){400===e.status?(this.setState({errors:Object.assign({},this.state.errors,e)}),y.default.error(gettext("Form contains errors."))):403===e.status&&Array.isArray(e)?m.default.show(a.default.createElement(v.default,{errors:e})):y.default.apiError(e)}},{key:"getWeightChoices",value:function(){var e=[{value:0,icon:"remove",label:gettext("Not pinned")},{value:1,icon:"bookmark_border",label:gettext("Pinned locally")}];return 2==this.acl[this.state.category].can_pin_threads&&e.push({value:2,icon:"bookmark",label:gettext("Pinned globally")}),e}},{key:"renderWeightField",value:function(){return this.acl[this.state.category].can_pin_threads?a.default.createElement(s.default,{label:gettext("Thread weight"),for:"id_weight",labelClass:"col-sm-4",controlClass:"col-sm-8"},a.default.createElement(f.default,{id:"id_weight",onChange:this.bindInput("weight"),value:this.state.weight,choices:this.getWeightChoices()})):null}},{key:"renderHiddenField",value:function(){return this.acl[this.state.category].can_hide_threads?a.default.createElement(s.default,{label:gettext("Hide thread"),for:"id_is_hidden",labelClass:"col-sm-4",controlClass:"col-sm-8"},a.default.createElement(f.default,{id:"id_is_closed",onChange:this.bindInput("is_hidden"),value:this.state.is_hidden,choices:this.isHiddenChoices})):null}},{key:"renderClosedField",value:function(){return this.acl[this.state.category].can_close_threads?a.default.createElement(s.default,{label:gettext("Close thread"),for:"id_is_closed",labelClass:"col-sm-4",controlClass:"col-sm-8"},a.default.createElement(f.default,{id:"id_is_closed",onChange:this.bindInput("is_closed"),value:this.state.is_closed,choices:this.isClosedChoices})):null}},{key:"render",value:function(){return a.default.createElement(L,{className:"modal-dialog"},a.default.createElement("form",{onSubmit:this.handleSubmit},a.default.createElement("div",{className:"modal-body"},a.default.createElement(s.default,{label:gettext("Thread title"),for:"id_title",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.title},a.default.createElement("input",{id:"id_title",className:"form-control",type:"text",onChange:this.bindInput("title"),value:this.state.title})),a.default.createElement("div",{className:"clearfix"}),a.default.createElement(s.default,{label:gettext("Category"),for:"id_category",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.category},a.default.createElement(c.default,{id:"id_category",onChange:this.onCategoryChange,value:this.state.category,choices:this.state.categories})),a.default.createElement("div",{className:"clearfix"}),this.renderWeightField(),this.renderHiddenField(),this.renderClosedField()),a.default.createElement("div",{className:"modal-footer"},a.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),a.default.createElement(n.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Split posts")))))}}]),l}();function M(){return a.default.createElement(L,{className:"modal-dialog"},a.default.createElement(o.default,null))}function T(e){return a.default.createElement(L,{className:"modal-dialog modal-message"},a.default.createElement("div",{className:"message-icon"},a.default.createElement("span",{className:"material-icon"},"info_outline")),a.default.createElement("div",{className:"message-body"},a.default.createElement("p",{className:"lead"},gettext("You can't move selected posts at the moment.")),a.default.createElement("p",null,e.message),a.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok"))))}function L(e){return a.default.createElement("div",{className:e.className,role:"document"},a.default.createElement("div",{className:"modal-content"},a.default.createElement("div",{className:"modal-header"},a.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},a.default.createElement("span",{"aria-hidden":"true"},"×")),a.default.createElement("h4",{className:"modal-title"},gettext("Split posts into new thread"))),e.children))}r.ModerationForm=C},{"../../../../reducers/post":353,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../../utils/validators":393,"../../../button":8,"../../../category-select":21,"../../../form":56,"../../../form-group":55,"../../../modal-loader":61,"../../../select":210,"./errors-list":222,react:"react"}],226:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var l=n(e("react")),u=n(e("./merge")),s=n(e("./move")),c=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=y(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../../reducers/thread")),f=n(e("../../../../services/ajax")),d=n(e("../../../../services/modal")),p=n(e("../../../../services/snackbar")),m=n(e("../../../../services/store"));function y(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(y=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return g(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var o=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(o,l.default.Component);var e,t,r,a=v(o);function o(){var r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return _(g(r=a.call.apply(a,[this].concat(t))),"callApi",function(e,t){m.default.dispatch(c.busy()),e.push({op:"add",path:"acl",value:!0}),f.default.patch(r.props.thread.api.index,e).then(function(e){m.default.dispatch(c.update(e)),m.default.dispatch(c.release()),p.default.success(t)},function(e){m.default.dispatch(c.release()),400===e.status?p.default.error(e.detail[0]):p.default.apiError(e)})}),_(g(r),"pinGlobally",function(){r.callApi([{op:"replace",path:"weight",value:2}],gettext("Thread has been pinned globally."))}),_(g(r),"pinLocally",function(){r.callApi([{op:"replace",path:"weight",value:1}],gettext("Thread has been pinned locally."))}),_(g(r),"unpin",function(){r.callApi([{op:"replace",path:"weight",value:0}],gettext("Thread has been unpinned."))}),_(g(r),"approve",function(){r.callApi([{op:"replace",path:"is-unapproved",value:!1}],gettext("Thread has been approved."))}),_(g(r),"open",function(){r.callApi([{op:"replace",path:"is-closed",value:!1}],gettext("Thread has been opened."))}),_(g(r),"close",function(){r.callApi([{op:"replace",path:"is-closed",value:!0}],gettext("Thread has been closed."))}),_(g(r),"unhide",function(){r.callApi([{op:"replace",path:"is-hidden",value:!1}],gettext("Thread has been made visible."))}),_(g(r),"hide",function(){r.callApi([{op:"replace",path:"is-hidden",value:!0}],gettext("Thread has been made hidden."))}),_(g(r),"move",function(){d.default.show(l.default.createElement(s.default,{posts:r.props.posts,thread:r.props.thread}))}),_(g(r),"merge",function(){d.default.show(l.default.createElement(u.default,{thread:r.props.thread}))}),_(g(r),"delete",function(){window.confirm(gettext("Are you sure you want to delete this thread?"))&&(m.default.dispatch(c.busy()),f.default.delete(r.props.thread.api.index).then(function(e){p.default.success(gettext("Thread has been deleted.")),window.location=r.props.thread.category.url.index},function(e){m.default.dispatch(c.release()),p.default.apiError(e)}))}),r}return e=o,(t=[{key:"getPinGloballyButton",value:function(){return 2!==this.props.thread.weight&&this.props.thread.acl.can_pin_globally?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.pinGlobally,type:"button"},l.default.createElement("span",{className:"material-icon"},"bookmark"),gettext("Pin globally"))):null}},{key:"getPinLocallyButton",value:function(){return 1!==this.props.thread.weight&&this.props.thread.acl.can_pin?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.pinLocally,type:"button"},l.default.createElement("span",{className:"material-icon"},"bookmark_border"),gettext("Pin locally"))):null}},{key:"getUnpinButton",value:function(){return 0!==this.props.thread.weight&&this.props.thread.acl.can_pin?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.unpin,type:"button"},l.default.createElement("span",{className:"material-icon"},"panorama_fish_eye"),gettext("Unpin"))):null}},{key:"getMoveButton",value:function(){return this.props.thread.acl.can_move?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.move,type:"button"},l.default.createElement("span",{className:"material-icon"},"arrow_forward"),gettext("Move"))):null}},{key:"getMergeButton",value:function(){return this.props.thread.acl.can_merge?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.merge,type:"button"},l.default.createElement("span",{className:"material-icon"},"call_merge"),gettext("Merge"))):null}},{key:"getApproveButton",value:function(){return this.props.thread.is_unapproved&&this.props.thread.acl.can_approve?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.approve,type:"button"},l.default.createElement("span",{className:"material-icon"},"done"),gettext("Approve"))):null}},{key:"getOpenButton",value:function(){return this.props.thread.is_closed&&this.props.thread.acl.can_close?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.open,type:"button"},l.default.createElement("span",{className:"material-icon"},"lock_open"),gettext("Open"))):null}},{key:"getCloseButton",value:function(){return!this.props.thread.is_closed&&this.props.thread.acl.can_close?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.close,type:"button"},l.default.createElement("span",{className:"material-icon"},"lock_outline"),gettext("Close"))):null}},{key:"getUnhideButton",value:function(){return this.props.thread.is_hidden&&this.props.thread.acl.can_unhide?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.unhide,type:"button"},l.default.createElement("span",{className:"material-icon"},"visibility"),gettext("Unhide"))):null}},{key:"getHideButton",value:function(){return!this.props.thread.is_hidden&&this.props.thread.acl.can_hide?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.hide,type:"button"},l.default.createElement("span",{className:"material-icon"},"visibility_off"),gettext("Hide"))):null}},{key:"getDeleteButton",value:function(){return this.props.thread.acl.can_delete?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.delete,type:"button"},l.default.createElement("span",{className:"material-icon"},"clear"),gettext("Delete"))):null}},{key:"render",value:function(){return l.default.createElement("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},this.getPinGloballyButton(),this.getPinLocallyButton(),this.getUnpinButton(),this.getMoveButton(),this.getMergeButton(),this.getApproveButton(),this.getOpenButton(),this.getCloseButton(),this.getUnhideButton(),this.getHideButton(),this.getDeleteButton())}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=o},{"../../../../reducers/thread":360,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"./merge":229,"./move":230,react:"react"}],227:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ModerationControls",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(r,"isModerationVisible",{enumerable:!0,get:function(){return a.default}});var n=o(e("./controls")),a=o(e("./is-visible"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./controls":226,"./is-visible":228}],228:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return!!(e.acl.can_approve&&e.is_unapproved||e.acl.can_close||e.acl.can_delete||e.acl.can_hide||e.acl.can_move||e.acl.can_merge||e.acl.can_pin||e.acl.can_pin_globally&&2!==e.weight||e.acl.can_unhide&&e.is_hidden)}},{}],229:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ModalHeader=w,r.default=void 0;var o=n(e("react")),l=n(e("../../../form")),u=n(e("../../../form-group")),s=n(e("../../../merge-conflict")),c=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=y(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../../reducers/thread")),f=n(e("../../../../services/ajax")),d=n(e("../../../../services/modal")),p=n(e("../../../../services/snackbar")),m=n(e("../../../../services/store"));function y(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(y=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return g(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var E=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(a,l.default);var e,t,r,n=v(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),_(g(t=n.call(this,e)),"handleSuccess",function(e){t.handleSuccessUnmounted(e),t.setState({isLoading:!0})}),_(g(t),"handleSuccessUnmounted",function(e){p.default.success(gettext("Thread has been merged with other one.")),window.location=e.url}),_(g(t),"handleError",function(e){m.default.dispatch(c.release()),400===e.status?e.best_answers||e.polls?d.default.show(o.default.createElement(s.default,{api:t.props.thread.api.merge,bestAnswers:e.best_answers,data:{other_thread:t.state.url},polls:e.polls,onError:t.handleError,onSuccess:t.handleSuccessUnmounted})):e.best_answer?p.default.error(e.best_answer[0]):e.poll?p.default.error(e.poll[0]):p.default.error(e.detail):p.default.apiError(e)}),_(g(t),"onUrlChange",function(e){t.changeValue("url",e.target.value)}),t.state={isLoading:!1,url:"",validators:{url:[]},errors:{}},t}return e=a,(t=[{key:"clean",value:function(){return!!this.state.url.trim().length||(p.default.error(gettext("You have to enter link to the other thread.")),!1)}},{key:"send",value:function(){return m.default.dispatch(c.busy()),f.default.post(this.props.thread.api.merge,{other_thread:this.state.url})}},{key:"render",value:function(){return o.default.createElement("div",{className:"modal-dialog",role:"document"},o.default.createElement("form",{onSubmit:this.handleSubmit},o.default.createElement("div",{className:"modal-content"},o.default.createElement(w,null),o.default.createElement("div",{className:"modal-body"},o.default.createElement(u.default,{for:"id_url",label:gettext("Link to thread you want to merge with"),help_text:gettext("Merge will delete current thread and move its contents to the thread specified here.")},o.default.createElement("input",{className:"form-control",disabled:this.state.isLoading||this.props.thread.isBusy,id:"id_url",onChange:this.onUrlChange,value:this.state.url}))),o.default.createElement("div",{className:"modal-footer"},o.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),o.default.createElement("button",{className:"btn btn-primary",loading:this.state.isLoading||this.props.thread.isBusy},gettext("Merge thread"))))))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function w(e){return o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Merge thread")))}r.default=E},{"../../../../reducers/thread":360,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../form":56,"../../../form-group":55,"../../../merge-conflict":59,react:"react"}],230:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ModalHeader=P,r.ModalLoading=k,r.ModalMessage=x,r.default=void 0;var n=v(e("react")),a=v(e("../../../form")),u=v(e("../../../form-group")),s=v(e("../../../category-select")),o=v(e("../../../modal-loader")),c=l(e("../../../../reducers/posts")),f=l(e("../../../../reducers/thread")),d=v(e("../../../..")),p=v(e("../../../../services/ajax")),m=v(e("../../../../services/modal")),y=v(e("../../../../services/snackbar")),b=v(e("../../../../services/store"));function h(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(h=function(e){return e?r:t})(e)}function l(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=h(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function v(e){return e&&e.__esModule?e:{default:e}}function g(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _(e,t){return(_=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function E(r){var 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}}();return function(){var e,t=O(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return w(e)}(this,n?(e=O(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function O(e){return(O=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var j=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_(e,t)}(l,a.default);var e,t,r,o=E(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=w(t),a=function(e){t.changeValue("category",e.target.value)},(n="onCategoryChange")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isReady:!1,isLoading:!1,isError:!1,category:null,categories:[]},t}return e=l,(t=[{key:"componentDidMount",value:function(){var n=this;p.default.get(d.default.get("THREAD_EDITOR_API")).then(function(e){var t=null,r=e.map(function(e){return!1===e.post||t||(t=e.id),Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id})});n.setState({isReady:!0,category:t,categories:r})},function(e){n.setState({isError:e.detail})})}},{key:"send",value:function(){return b.default.dispatch(f.busy()),p.default.patch(this.props.thread.api.index,[{op:"replace",path:"category",value:this.state.category}])}},{key:"handleSuccess",value:function(){p.default.get(this.props.thread.api.posts.index,{page:this.props.posts.page}).then(function(e){b.default.dispatch(f.replace(e)),b.default.dispatch(c.load(e.post_set)),b.default.dispatch(f.release()),y.default.success(gettext("Thread has been moved.")),m.default.hide()},function(e){b.default.dispatch(f.release()),y.default.apiError(e)})}},{key:"handleError",value:function(e){400===e.status?y.default.error(e.detail[0]):y.default.apiError(e)}},{key:"render",value:function(){return this.state.isReady?n.default.createElement("div",{className:"modal-dialog",role:"document"},n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"modal-content"},n.default.createElement(P,null),n.default.createElement("div",{className:"modal-body"},n.default.createElement(u.default,{for:"id_category",label:gettext("New category")},n.default.createElement(s.default,{choices:this.state.categories,disabled:this.state.isLoading||this.props.thread.isBusy,id:"id_category",onChange:this.onCategoryChange,value:this.state.category}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),n.default.createElement("button",{className:"btn btn-primary",loading:this.state.isLoading||this.props.thread.isBusy},gettext("Move thread")))))):this.state.isError?n.default.createElement(x,{message:this.state.isError}):n.default.createElement(k,null)}}])&&g(e.prototype,t),r&&g(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function P(e){return n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Move thread")))}function k(e){return n.default.createElement("div",{className:"modal-dialog",role:"document"},n.default.createElement("div",{className:"modal-content"},n.default.createElement(P,null),n.default.createElement(o.default,null)))}function x(e){return n.default.createElement("div",{className:"modal-dialog modal-message",role:"document"},n.default.createElement("div",{className:"modal-content"},n.default.createElement(P,null),n.default.createElement("div",{className:"message-icon"},n.default.createElement("span",{className:"material-icon"},"info_outline")),n.default.createElement("div",{className:"message-body"},n.default.createElement("p",{className:"lead"},gettext("You can't move this thread at the moment.")),n.default.createElement("p",null,e.message),n.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok")))))}r.default=j},{"../../../..":302,"../../../../reducers/posts":354,"../../../../reducers/thread":360,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../category-select":21,"../../../form":56,"../../../form-group":55,"../../../modal-loader":61,react:"react"}],231:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.FirstPage=i,r.LastPage=c,r.More=f,r.NextPage=s,r.Pager=l,r.PreviousPage=u,r.default=function(e){return a.default.createElement("nav",{className:"misago-pagination pull-left"},a.default.createElement(l,e),a.default.createElement(f,{more:e.posts.more}))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n},o=e("react-router");function l(e){return a.default.createElement("div",{className:"row row-paginator"},a.default.createElement("div",{className:"col-xs-3"},a.default.createElement(i,e)),a.default.createElement("div",{className:"col-xs-3"},a.default.createElement(u,e)),a.default.createElement("div",{className:"col-xs-3"},a.default.createElement(s,e)),a.default.createElement("div",{className:"col-xs-3"},a.default.createElement(c,e)))}function i(e){return e.posts.isLoaded&&e.posts.first?a.default.createElement(o.Link,{className:"btn btn-default btn-block btn-outline btn-icon",to:e.thread.url.index,title:gettext("Go to first page")},a.default.createElement("span",{className:"material-icon"},"first_page")):a.default.createElement("span",{className:"btn btn-default btn-block btn-outline btn-icon disabled",title:gettext("Go to first page")},a.default.createElement("span",{className:"material-icon"},"first_page"))}function u(e){if(e.posts.isLoaded&&1<e.posts.page){var t="";return e.posts.previous&&(t=e.posts.previous+"/"),a.default.createElement(o.Link,{className:"btn btn-default btn-block btn-outline btn-icon",to:e.thread.url.index+t,title:gettext("Go to previous page")},a.default.createElement("span",{className:"material-icon"},"chevron_left"))}return a.default.createElement("span",{className:"btn btn-default btn-block btn-outline btn-icon disabled",title:gettext("Go to previous page")},a.default.createElement("span",{className:"material-icon"},"chevron_left"))}function s(e){if(e.posts.isLoaded&&e.posts.more){var t="";return e.posts.next&&(t=e.posts.next+"/"),a.default.createElement(o.Link,{className:"btn btn-default btn-block btn-outline btn-icon",to:e.thread.url.index+t,title:gettext("Go to next page")},a.default.createElement("span",{className:"material-icon"},"chevron_right"))}return a.default.createElement("span",{className:"btn btn-default btn-block btn-outline btn-icon disabled",title:gettext("Go to next page")},a.default.createElement("span",{className:"material-icon"},"chevron_right"))}function c(e){return e.posts.isLoaded&&e.posts.last?a.default.createElement(o.Link,{className:"btn btn-default btn-block btn-outline btn-icon",to:e.thread.url.index+e.posts.last+"/",title:gettext("Go to last page")},a.default.createElement("span",{className:"material-icon"},"last_page")):a.default.createElement("span",{className:"btn btn-default btn-block btn-outline btn-icon disabled",title:gettext("Go to last page")},a.default.createElement("span",{className:"material-icon"},"last_page"))}function f(e){var t=null,t=e.more?(t=ngettext("There is %(more)s more post in this thread.","There are %(more)s more posts in this thread.",e.more),interpolate(t,{more:e.more},!0)):gettext("There are no more posts in this thread.");return a.default.createElement("p",null,t)}},{react:"react","react-router":"react-router"}],232:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return a.default.createElement("button",{className:e.className||"btn btn-primary btn-outline",onClick:e.onClick,type:"button"},a.default.createElement("span",{className:"material-icon"},"chat"),gettext("Reply"))};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],233:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.paths=function(){var e=o.default.get("THREAD"),t=e.url.index.replace(e.slug+"-"+e.pk,":slug");return[{path:t,component:(0,n.connect)(i)(a.default)},{path:t+":page/",component:(0,n.connect)(i)(a.default)}]},r.select=i;var n=e("react-redux"),a=l(e("./route")),o=l(e("../.."));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){return{participants:e.participants,poll:e.poll,posts:e.posts,thread:e.thread,tick:e.tick.tick,user:e.auth.user}}},{"../..":302,"./route":234,"react-redux":"react-redux"}],234:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),l=o(e("../participants")),u=e("../poll"),s=o(e("../posts-list")),c=o(e("./header")),f=o(e("./toolbar-top")),d=o(e("./toolbar-bottom")),p=a(e("../../reducers/participants")),m=a(e("../../reducers/poll")),y=a(e("../../reducers/posts")),b=a(e("../../reducers/thread")),h=o(e("../../services/ajax")),v=o(e("../../services/polls")),g=o(e("../../services/snackbar")),_=o(e("../../services/posting")),E=o(e("../../services/store")),w=o(e("../../services/page-title"));function O(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(O=function(e){return e?r:t})(e)}function a(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=O(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function o(e){return e&&e.__esModule?e:{default:e}}function j(){return(j=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function P(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function k(e,t){return(k=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function x(r){var 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}}();return function(){var e,t=S(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return N(e)}(this,n?(e=S(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function N(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function S(e){return(S=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function R(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var C=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&k(e,t)}(o,n.default.Component);var e,t,r,a=x(o);function o(){var t;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return R(N(t=a.call.apply(a,[this].concat(r))),"update",function(e){E.default.dispatch(b.replace(e)),E.default.dispatch(y.load(e.post_set)),e.participants&&E.default.dispatch(p.replace(e.participants)),e.poll&&E.default.dispatch(m.replace(e.poll)),t.setPageTitle()}),R(N(t),"openReplyForm",function(){_.default.open({mode:"REPLY",config:t.props.thread.api.editor,submit:t.props.thread.api.posts.index})}),t}return e=o,(t=[{key:"componentDidMount",value:function(){this.shouldFetchData()&&(this.fetchData(),this.setPageTitle()),this.startPollingApi()}},{key:"componentDidUpdate",value:function(){this.shouldFetchData()&&(this.fetchData(),this.startPollingApi(),this.setPageTitle())}},{key:"componentWillUnmount",value:function(){this.stopPollingApi()}},{key:"shouldFetchData",value:function(){return!!this.props.posts.isLoaded&&+(this.props.params.page||1)!=this.props.posts.page}},{key:"fetchData",value:function(){var t=this;E.default.dispatch(y.unload()),h.default.get(this.props.thread.api.posts.index,{page:this.props.params.page||1},"posts").then(function(e){t.update(e)},function(e){g.default.apiError(e)})}},{key:"startPollingApi",value:function(){v.default.start({poll:"thread-posts",url:this.props.thread.api.posts.index,data:{page:this.props.params.page||1},update:this.update,frequency:12e4,delayed:!0})}},{key:"stopPollingApi",value:function(){v.default.stop("thread-posts")}},{key:"setPageTitle",value:function(){w.default.set({title:this.props.thread.title,parent:this.props.thread.category.name,page:+(this.props.params.page||1)})}},{key:"render",value:function(){var e="page page-thread";return this.props.thread.category.css_class&&(e+=" page-thread-"+this.props.thread.category.css_class),n.default.createElement("div",{className:e},n.default.createElement("div",{className:"page-header-bg"},n.default.createElement(c.default,this.props)),n.default.createElement("div",{className:"container"},n.default.createElement(f.default,j({openReplyForm:this.openReplyForm},this.props)),n.default.createElement(u.Poll,{poll:this.props.poll,thread:this.props.thread,user:this.props.user}),n.default.createElement(l.default,{participants:this.props.participants,thread:this.props.thread,user:this.props.user}),n.default.createElement(s.default,this.props),n.default.createElement(d.default,j({openReplyForm:this.openReplyForm},this.props))))}}])&&P(e.prototype,t),r&&P(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=C},{"../../reducers/participants":351,"../../reducers/poll":352,"../../reducers/posts":354,"../../reducers/thread":360,"../../services/ajax":365,"../../services/page-title":373,"../../services/polls":374,"../../services/posting":375,"../../services/snackbar":376,"../../services/store":377,"../participants":101,"../poll":106,"../posts-list":151,"./header":218,"./toolbar-bottom":236,"./toolbar-top":237,react:"react"}],235:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Disable=void 0,r.Dropdown=w,r.Enable=r.Email=void 0,r.default=function(e){return e.user.id?n.default.createElement("div",{className:e.className},n.default.createElement("button",{"aria-expanded":"true","aria-haspopup":"true",className:"btn btn-default dropdown-toggle btn-block btn-outline","data-toggle":"dropdown",type:"button"},n.default.createElement("span",{className:"material-icon"},_(e.thread.subscription)),E(e.thread.subscription)),n.default.createElement(w,e)):null},r.getIcon=_,r.getLabel=E,r.update=k;var n=c(e("react")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/thread")),o=c(e("../../services/ajax")),l=c(e("../../services/snackbar")),u=c(e("../../services/store"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function c(e){return e&&e.__esModule?e:{default:e}}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t,r){return t&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function m(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=v(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=v(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function g(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _(e){return!0===e?"star":!1===e?"star_half":"star_border"}function E(e){return!0===e?gettext("E-mail"):!1===e?gettext("Enabled"):gettext("Disabled")}function w(e){return n.default.createElement("ul",{className:e.dropdownClassName||"dropdown-menu stick-to-bottom"},n.default.createElement(O,e),n.default.createElement(j,e),n.default.createElement(P,e))}var O=function(){m(o,n.default.Component);var a=b(o);function o(){var e;f(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){null!==e.props.thread.subscription&&k(e.props.thread,null,"unsubscribe")}),e}return p(o,[{key:"render",value:function(){return n.default.createElement("li",null,n.default.createElement("button",{className:"btn btn-link",onClick:this.onClick},n.default.createElement("span",{className:"material-icon"},"star_border"),gettext("Unsubscribe")))}}]),o}();r.Disable=O;var j=function(){m(o,n.default.Component);var a=b(o);function o(){var e;f(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){!1!==e.props.thread.subscription&&k(e.props.thread,!1,"notify")}),e}return p(o,[{key:"render",value:function(){return n.default.createElement("li",null,n.default.createElement("button",{className:"btn btn-link",onClick:this.onClick},n.default.createElement("span",{className:"material-icon"},"star_half"),gettext("Subscribe")))}}]),o}();r.Enable=j;var P=function(){m(o,n.default.Component);var a=b(o);function o(){var e;f(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return g(h(e=a.call.apply(a,[this].concat(r))),"onClick",function(){!0!==e.props.thread.subscription&&k(e.props.thread,!0,"email")}),e}return p(o,[{key:"render",value:function(){return n.default.createElement("li",null,n.default.createElement("button",{className:"btn btn-link",onClick:this.onClick},n.default.createElement("span",{className:"material-icon"},"star"),gettext("Subscribe with e-mail")))}}]),o}();function k(e,t,r){var n={subscription:e.subscription};u.default.dispatch(a.update({subscription:t})),o.default.patch(e.api.index,[{op:"replace",path:"subscription",value:r}]).then(function(e){u.default.dispatch(a.update(e))},function(e){400===e.status?l.default.error(e.detail[0]):l.default.apiError(e),u.default.dispatch(a.update(n))})}r.Email=P},{"../../reducers/thread":360,"../../services/ajax":365,"../../services/snackbar":376,"../../services/store":377,react:"react"}],236:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Moderation=f,r.Options=c,r.Reply=p,r.Spacer=m,r.Subscription=d,r.default=function(e){return n.default.createElement("div",{className:"row row-toolbar"},n.default.createElement("div",{className:"col-xs-12 text-center visible-xs-block"},n.default.createElement(a.More,{more:e.posts.more}),n.default.createElement("div",{className:"toolbar-vertical-spacer"})),n.default.createElement("div",{className:"col-md-7"},n.default.createElement("div",{className:"row"},n.default.createElement("div",{className:"col-sm-4 col-md-5"},n.default.createElement(a.Pager,e)),n.default.createElement("div",{className:"col-sm-8 col-md-7 hidden-xs"},n.default.createElement(a.More,{more:e.posts.more})))),n.default.createElement(c,{visible:!!e.user.id},n.default.createElement("div",{className:"toolbar-vertical-spacer hidden-md hidden-lg"}),n.default.createElement("div",{className:"row"},n.default.createElement(m,e),n.default.createElement(f,e),n.default.createElement(d,e),n.default.createElement(p,{thread:e.thread,onClick:e.openReplyForm}))))};var n=u(e("react")),a=e("./paginator"),o=u(e("./moderation/posts")),l=u(e("./reply-button")),i=u(e("./subscription"));function u(e){return e&&e.__esModule?e:{default:e}}function s(){return(s=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function c(e){return e.visible?n.default.createElement("div",{className:"col-md-5"},e.children):null}function f(e){return e.user.id?n.default.createElement("div",{className:"col-sm-4 hidden-xs"},n.default.createElement(o.default,e)):null}function d(e){var t="col-xs-6";return e.thread.acl.can_reply||(t="col-xs-12"),n.default.createElement("div",{className:t+" col-sm-4"},n.default.createElement(i.default,s({btnClassName:"btn-block",className:"dropup"},e)))}function p(e){return e.thread.acl.can_reply?n.default.createElement("div",{className:"col-xs-6 col-sm-4"},n.default.createElement(l.default,{className:"btn btn-primary btn-block btn-outline",onClick:e.onClick})):null}function m(e){return e.thread.acl.can_reply?null:n.default.createElement("div",{className:"hidden-xs hidden-sm col-sm-4"})}},{"./moderation/posts":223,"./paginator":231,"./reply-button":232,"./subscription":235,react:"react"}],237:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.CompactOptions=O,r.GotoBestAnswer=_,r.GotoLast=w,r.GotoLastCompact=k,r.GotoMenu=v,r.GotoNew=g,r.GotoNewCompact=j,r.GotoUnapproved=E,r.GotoUnapprovedCompact=P,r.Reply=x,r.Spacer=C,r.StartPollCompact=r.StartPoll=void 0,r.SubscriptionMenu=N,r.default=function(e){var t=!e.thread.acl.can_start_poll||e.thread.poll;return n.default.createElement("div",{className:"row row-toolbar row-toolbar-bottom-margin"},n.default.createElement(v,e),n.default.createElement("div",{className:"col-xs-9 col-md-5 col-md-offset-2"},n.default.createElement("div",{className:"row"},n.default.createElement(C,{visible:!e.user.id}),n.default.createElement(C,{visible:t}),n.default.createElement(N,e),n.default.createElement(S,e),n.default.createElement(x,e))))};var n=i(e("react")),o=i(e("./reply-button")),l=i(e("./subscription")),s=i(e("../../services/posting"));function i(e){return e&&e.__esModule?e:{default:e}}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t,r){return t&&u(e.prototype,t),r&&u(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function d(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=b(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=b(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function b(e){return(b=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function h(){return(h=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function v(e){var t="col-xs-3 col-sm-3 col-md-5";return e.user.is_anonymous&&(t="col-xs-12 col-sm-3 col-md-5"),n.default.createElement("div",{className:t},n.default.createElement("div",{className:"row hidden-xs hidden-sm"},n.default.createElement(w,{thread:e.thread}),n.default.createElement(g,{thread:e.thread}),n.default.createElement(_,{thread:e.thread}),n.default.createElement(E,{thread:e.thread})),n.default.createElement(O,e))}function g(e){return e.thread.is_new?n.default.createElement("div",{className:"col-sm-4"},n.default.createElement("a",{href:e.thread.url.new_post,className:"btn btn-default btn-block btn-outline",title:gettext("Go to first new post")},gettext("New"))):null}function _(e){return e.thread.best_answer?n.default.createElement("div",{className:"col-sm-4"},n.default.createElement("a",{href:e.thread.url.best_answer,className:"btn btn-default btn-block btn-outline",title:gettext("Go to best answer")},gettext("Best answer"))):null}function E(e){return e.thread.has_unapproved_posts&&e.thread.acl.can_approve?n.default.createElement("div",{className:"col-sm-4"},n.default.createElement("a",{href:e.thread.url.unapproved_post,className:"btn btn-default btn-block btn-outline",title:gettext("Go to first unapproved post")},gettext("Unapproved"))):null}function w(e){return n.default.createElement("div",{className:"col-sm-4"},n.default.createElement("a",{href:e.thread.url.last_post,className:"btn btn-default btn-block btn-outline",title:gettext("Go to last post")},gettext("Last")))}function O(e){return e.user.is_anonymous?n.default.createElement("div",{className:"visible-xs-block visible-sm-block"},n.default.createElement("a",{href:e.thread.url.last_post,className:"btn btn-default btn-block btn-outline"},gettext("Last post"))):n.default.createElement("div",{className:"dropdown visible-xs-block visible-sm-block"},n.default.createElement("button",{"aria-expanded":"true","aria-haspopup":"true",className:"btn btn-default dropdown-toggle btn-block btn-outline","data-toggle":"dropdown",type:"button"},n.default.createElement("span",{className:"material-icon"},"expand_more"),n.default.createElement("span",{className:"btn-text hidden-xs"},gettext("Options"))),n.default.createElement("ul",{className:"dropdown-menu"},n.default.createElement(R,e),n.default.createElement(j,e),n.default.createElement(P,e),n.default.createElement(k,e)))}function j(e){return e.thread.is_new?n.default.createElement("li",null,n.default.createElement("a",{href:e.thread.url.new_post,className:"btn btn-link"},gettext("Go to first new post"))):null}function P(e){return e.thread.has_unapproved_posts&&e.thread.acl.can_approve?n.default.createElement("li",null,n.default.createElement("a",{href:e.thread.url.unapproved_post,className:"btn btn-link"},gettext("Go to first unapproved post"))):null}function k(e){return n.default.createElement("li",null,n.default.createElement("a",{href:e.thread.url.last_post,className:"btn btn-link"},gettext("Go to last post")))}function x(e){return e.thread.acl.can_reply?n.default.createElement("div",{className:"col-sm-4 hidden-xs"},n.default.createElement(o.default,{className:"btn btn-primary btn-block btn-outline",onClick:e.openReplyForm})):null}function N(e){return e.user.id?n.default.createElement("div",{className:"col-xs-12 col-sm-4"},n.default.createElement(l.default,h({className:"dropdown",dropdownClassName:"dropdown-menu dropdown-menu-right stick-to-bottom"},e))):null}var S=function(){d(u,n.default.Component);var i=m(u);function u(){var e;c(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=y(e),n=function(){s.default.open({mode:"POLL",submit:e.props.thread.api.poll,thread:e.props.thread,poll:null})},(r="onClick")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return f(u,[{key:"render",value:function(){return!this.props.thread.acl.can_start_poll||this.props.thread.poll?null:n.default.createElement("div",{className:"col-sm-4 hidden-xs"},n.default.createElement("button",{className:"btn btn-default btn-block btn-outline",onClick:this.onClick,type:"button"},n.default.createElement("span",{className:"material-icon"},"poll"),gettext("Add poll")))}}]),u}();r.StartPoll=S;var R=function(){d(t,S);var e=m(t);function t(){return c(this,t),e.apply(this,arguments)}return f(t,[{key:"render",value:function(){return!this.props.thread.acl.can_start_poll||this.props.thread.poll?null:n.default.createElement("li",null,n.default.createElement("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},gettext("Add poll")))}}]),t}();function C(e){return e.visible?n.default.createElement("div",{className:"col-sm-4 hidden-xs"}):null}r.StartPollCompact=R},{"../../services/posting":375,"./reply-button":232,"./subscription":235,react:"react"}],238:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.isLoaded?0!==e.threads.length?n.default.createElement(o.default,{activeCategory:e.category,categories:e.categories,list:e.list,threads:e.threads,diffSize:e.diffSize,applyDiff:e.applyDiff,showOptions:e.showOptions,selection:e.selection,busyThreads:e.busyThreads}):n.default.createElement(a.default,{diffSize:e.diffSize,applyDiff:e.applyDiff},e.children):n.default.createElement(l.default,null)};var n=i(e("react")),a=i(e("./list/empty")),o=i(e("./list/ready")),l=i(e("./list/preview"));function i(e){return e&&e.__esModule?e:{default:e}}},{"./list/empty":240,"./list/preview":241,"./list/ready":242,react:"react"}],239:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.applyDiff,r=e.diffSize;return 0===r?null:a.default.createElement("li",{className:"list-group-item threads-diff-message"},a.default.createElement("button",{type:"button",className:"btn btn-block btn-default",onClick:t},a.default.createElement("span",{className:"material-icon"},"cached"),a.default.createElement("span",{className:"diff-message"},o(r))))},r.getMessage=o;var n,a=(n=e("react"))&&n.__esModule?n:{default:n};function o(e){var t=ngettext("There is %(threads)s new or updated thread. Click this message to show it.","There are %(threads)s new or updated threads. Click this message to show them.",e);return interpolate(t,{threads:e},!0)}},{react:"react"}],240:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./diff-message"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getDiffMessage",value:function(){return 0===this.props.diffSize?null:o.default.createElement(l.default,{applyDiff:this.props.applyDiff,diffSize:this.props.diffSize})}},{key:"render",value:function(){return o.default.createElement("div",{className:"threads-list ui-ready"},o.default.createElement("ul",{className:"list-group"},this.getDiffMessage(),this.props.children))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./diff-message":239,react:"react"}],241:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../thread/preview"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return o.default.createElement("div",{className:"threads-list ui-preview"},o.default.createElement("ul",{className:"list-group"},o.default.createElement(l.default,null)))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"../thread/preview":249,react:"react"}],242:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(t){return n.default.createElement("div",{className:"threads-list ui-ready"},n.default.createElement("ul",{className:"list-group"},n.default.createElement(a.default,{diffSize:t.diffSize,applyDiff:t.applyDiff}),t.threads.map(function(e){return n.default.createElement(o.default,{activeCategory:t.activeCategory,categories:t.categories,list:t.list,thread:e,showOptions:t.showOptions,isSelected:0<=t.selection.indexOf(e.id),isBusy:0<=t.busyThreads.indexOf(e.id),key:e.id})})))};var n=l(e("react")),a=l(e("./diff-message")),o=l(e("../thread/ready"));function l(e){return e&&e.__esModule?e:{default:e}}},{"../thread/ready":250,"./diff-message":239,react:"react"}],243:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.BestAnswerLabel=y,r.ClosedLabel=p,r.HiddenLabel=d,r.LastPoster=v,r.LastReplyLabel=h,r.PollLabel=m,r.RepliesLabel=b,r.default=function(e){var t=e.category,r=e.isBusy,n=e.showOptions,a=e.isSelected,o=e.thread,l="col-xs-12 col-sm-12";n&&(l=o.moderation.length?"col-xs-6 col-sm-12":"col-xs-9 col-sm-12");var i=0;o.is_hidden&&(i+=1);o.is_closed&&(i+=1);o.has_poll&&(i+=1);var u="detail-text hidden-xs";n&&3===i&&(u+=" hidden-sm");return s.default.createElement("div",{className:"row thread-details-bottom"},s.default.createElement("div",{className:l},s.default.createElement(c.default,{className:"item-title thread-detail-category hidden-xs",category:t}),s.default.createElement(d,{textClassName:u,display:o.is_hidden}),s.default.createElement(p,{textClassName:u,display:o.is_closed}),s.default.createElement(m,{textClassName:u,display:o.has_poll}),s.default.createElement(y,{thread:o}),s.default.createElement(b,{forceFullText:!n||i<2,replies:o.replies}),s.default.createElement(h,{datetime:o.last_post_on,url:o.url.last_post}),s.default.createElement(v,{posterName:o.last_poster_name,url:o.url.last_poster})),s.default.createElement(f.OptionsXs,{disabled:r,display:n,isSelected:a,thread:o}))};var s=n(e("react")),c=n(e("./category")),f=e("../options");function n(e){return e&&e.__esModule?e:{default:e}}function d(e){var t=e.display,r=e.textClassName;return t?s.default.createElement("span",{className:"thread-detail-hidden"},s.default.createElement("span",{className:"material-icon"},"visibility_off"),s.default.createElement("span",{className:r},gettext("Hidden"))):null}function p(e){var t=e.display,r=e.textClassName;return t?s.default.createElement("span",{className:"thread-detail-closed"},s.default.createElement("span",{className:"material-icon"},"lock_outline"),s.default.createElement("span",{className:r},gettext("Closed"))):null}function m(e){var t=e.display,r=e.textClassName;return t?s.default.createElement("span",{className:"thread-detail-poll"},s.default.createElement("span",{className:"material-icon"},"assessment"),s.default.createElement("span",{className:r},gettext("Poll"))):null}function y(e){var t=e.thread;return t.best_answer?s.default.createElement("a",{className:"visible-xs-inline-block thread-detail-answered",href:t.url.best_answer},s.default.createElement("span",{className:"material-icon"},"check_box")):null}function b(e){var t=e.replies,r=e.forceFullText,n=ngettext("%(replies)s reply","%(replies)s replies",t),a="",o="",o=r?(a="detail-text hide","detail-text"):(a="detail-text visible-xs-inline-block","detail-text hidden-xs");return s.default.createElement("span",{className:"thread-detail-replies"},s.default.createElement("span",{className:"material-icon"},"forum"),s.default.createElement("span",{className:a},t),s.default.createElement("span",{className:o},interpolate(n,{replies:t},!0)))}function h(e){var t=e.datetime,r=e.url;return s.default.createElement("a",{className:"visible-sm-inline-block thread-detail-last-reply",href:r,title:t.format("LLL")},t.fromNow(!0))}function v(e){var t=e.posterName,r=e.url,n="visible-sm-inline-block item-title thread-last-poster";return r?s.default.createElement("a",{className:n,href:r},t):s.default.createElement("span",{className:n},t)}},{"../options":248,"./category":244,react:"react"}],244:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.category,r=e.className;if(!t)return null;t.css_class&&(r+=" thread-detail-category-"+t.css_class);return a.default.createElement("a",{className:r,href:t.url.index},t.name)};var n,a=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],245:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"BottomDetails",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(r,"TopDetails",{enumerable:!0,get:function(){return a.default}});var n=o(e("./bottom")),a=o(e("./top"));function o(e){return e&&e.__esModule?e:{default:e}}},{"./bottom":243,"./top":246}],246:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.BestAnswerLabel=s,r.LastPoster=f,r.LastReplyLabel=c,r.NewLabel=o,r.PinnedLabel=i,r.UnapprovedLabel=u,r.default=function(e){var t=e.category,r=e.thread;return l.default.createElement("div",{className:"thread-details-top"},l.default.createElement(o,{isRead:r.is_read,url:r.url.new_post}),l.default.createElement(i,{weight:r.weight}),l.default.createElement(u,{thread:r.is_unapproved,posts:r.has_unapproved_posts}),l.default.createElement(s,{thread:r}),l.default.createElement(n.default,{className:"item-title thread-detail-category visible-xs-inline-block",category:t}),l.default.createElement(c,{datetime:r.last_post_on,url:r.url.last_post}),l.default.createElement(f,{posterName:r.last_poster_name,url:r.url.last_poster}))};var l=a(e("react")),n=a(e("./category"));function a(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=e.isRead,r=e.url;return t?null:l.default.createElement("a",{className:"thread-detail-new",href:r},l.default.createElement("span",{className:"material-icon"},"comment"),l.default.createElement("span",{className:"detail-text"},gettext("New posts")))}function i(e){var t=e.weight;if(0===t)return null;var r="thread-detail-pinned-globally",n="bookmark",a=gettext("Pinned globally");return 1===t&&(r="thread-detail-pinned-locally",n="bookmark_border",a=gettext("Pinned locally")),l.default.createElement("span",{className:r},l.default.createElement("span",{className:"material-icon"},n),l.default.createElement("span",{className:"detail-text"},a))}function u(e){var t=e.posts,r=e.thread;if(!t&&!r)return null;var n="thread-detail-unapproved-posts",a="remove_circle_outline",o=gettext("Unapproved posts");return r&&(n="thread-detail-unapproved",a="remove_circle",o=gettext("Unapproved")),l.default.createElement("span",{className:n},l.default.createElement("span",{className:"material-icon"},a),l.default.createElement("span",{className:"detail-text"},o))}function s(e){var t=e.thread;return t.best_answer?l.default.createElement("a",{className:"hidden-xs thread-detail-answered",href:t.url.best_answer},l.default.createElement("span",{className:"material-icon"},"check_box"),l.default.createElement("span",{className:"detail-text"},gettext("Answered"))):null}function c(e){var t=e.datetime,r=e.url;return l.default.createElement("a",{className:"visible-xs-inline-block thread-detail-last-reply",href:r,title:t.format("LLL")},t.fromNow(!0))}function f(e){var t=e.posterName,r=e.url;return r?l.default.createElement("a",{className:"visible-xs-inline-block item-title thread-last-poster",href:r},t):l.default.createElement("span",{className:"visible-xs-inline-block item-title thread-last-poster"},t)}},{"./category":244,react:"react"}],247:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Timestamp=i,r.default=function(e){var t=e.thread;return n.default.createElement("div",{className:"media"},n.default.createElement("div",{className:"media-left"},n.default.createElement(o.default,{className:"thread-last-poster-avatar",title:t.last_poster_name,url:t.url.last_poster},n.default.createElement(a.default,{className:"media-object",size:40,user:t.last_poster}))),n.default.createElement("div",{className:"media-body"},n.default.createElement(o.default,{className:"item-title thread-last-poster",url:t.url.last_poster},t.last_poster_name),n.default.createElement(i,{datetime:t.last_post_on,url:t.url.last_post})))};var n=l(e("react")),a=l(e("../../avatar")),o=l(e("./user-url"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=e.datetime,r=e.url;return n.default.createElement("a",{className:"thread-last-reply",href:r,title:t.format("LLL")},t.fromNow(!0))}},{"../../avatar":6,"./user-url":255,react:"react"}],248:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Checkbox=void 0,r.Options=function(e){var t=e.display,r=e.disabled,n=e.isSelected,a=e.thread;if(!t)return null;var o="col-sm-2 col-md-2 hidden-xs";a.moderation.length&&(o="col-sm-3 col-md-2 hidden-xs");return l.default.createElement("div",{className:o},l.default.createElement("div",{className:"row thread-options"},l.default.createElement(s.default,{thread:a,disabled:r}),l.default.createElement(u.default,{thread:a,disabled:r}),l.default.createElement(b,{thread:a,disabled:r,isSelected:n})))},r.OptionsXs=function(e){var t=e.display,r=e.disabled,n=e.isSelected,a=e.thread;if(!t)return null;var o="";a.moderation.length?o+="col-xs-6":o+="col-xs-3";return o+=" visible-xs-block thread-options-xs",l.default.createElement("div",{className:o},l.default.createElement("div",{className:"row thread-options"},l.default.createElement(s.default,{thread:a,disabled:r}),l.default.createElement(u.default,{thread:a,disabled:r}),l.default.createElement(b,{thread:a,disabled:r,isSelected:n})))};var l=n(e("react")),u=n(e("./subscription/compact")),s=n(e("./subscription/full")),c=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/selection")),f=n(e("../../../services/store"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function o(e,t){return(o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var b=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&o(e,t)}(u,l.default.Component);var e,t,r,i=p(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=m(e),n=function(){f.default.dispatch(c.item(e.props.thread.id))},(r="toggleSelection")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){var e=this.props,t=e.disabled,r=e.isSelected;return e.thread.moderation.length?l.default.createElement("div",{className:"col-xs-6"},l.default.createElement("button",{className:"btn btn-default btn-icon btn-block",onClick:this.toggleSelection,disabled:t},l.default.createElement("span",{className:"material-icon"},r?"check_box":"check_box_outline_blank"))):null}}])&&a(e.prototype,t),r&&a(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.Checkbox=b},{"../../../reducers/selection":358,"../../../services/store":377,"./subscription/compact":251,"./subscription/full":252,react:"react"}],249:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n},l=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/random"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var d=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(a,o.default.Component);var e,t,r,n=f(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return o.default.createElement("li",{className:"list-group-item thread-preview"},o.default.createElement("div",{className:"thread-details-top visible-xs-block"},o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(30,80)+"px"}}," "),o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(30,80)+"px"}}," "),o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(30,80)+"px"}}," ")),o.default.createElement("span",{className:"item-title thread-title"},o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(60,200)+"px"}}," "),o.default.createElement("span",{className:"ui-preview-text hidden-xs",style:{width:l.int(60,200)+"px"}}," "),o.default.createElement("span",{className:"ui-preview-text hidden-xs",style:{width:l.int(60,200)+"px"}}," ")),o.default.createElement("div",{className:"thread-details-bottom"},o.default.createElement("div",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(30,80)+"px"}}," "),o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(30,80)+"px"}}," "),o.default.createElement("span",{className:"ui-preview-text",style:{width:l.int(30,80)+"px"}}," "))))}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=d},{"../../../utils/random":388,react:"react"}],250:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.activeCategory,r=e.categories,n=(e.list,e.thread),a=e.isBusy,o=e.isSelected,l=e.showOptions,i=null;t.id!==n.category&&(i=r[n.category]);var u=i||t,s="thread-main col-xs-12";l?n.moderation.length?s+=" col-sm-9 col-md-7":s+=" col-sm-10 col-md-7":s+=" col-sm-12 col-md-9";return c.default.createElement("li",{className:b(n.is_read,a,o,u)},c.default.createElement(d.TopDetails,{category:i,thread:n}),c.default.createElement("div",{className:"row thread-row"},c.default.createElement("div",{className:s},c.default.createElement("div",{className:"media"},c.default.createElement("div",{className:"media-left hidden-xs"},c.default.createElement(y.default,{className:"thread-starter-avatar",title:n.starter_name,url:n.url.starter},c.default.createElement(f.default,{size:40,user:n.starter}))),c.default.createElement("div",{className:"media-body"},c.default.createElement("a",{href:n.url.index,className:"item-title thread-title"},n.title),c.default.createElement(d.BottomDetails,{category:i,disabled:a,isSelected:o,showOptions:l,thread:n})))),c.default.createElement("div",{className:"col-md-3 hidden-xs hidden-sm thread-last-action"},c.default.createElement(p.default,{thread:n})),c.default.createElement(m.Options,{disabled:a,display:l,isSelected:o,thread:n})))},r.getClassName=b;var c=n(e("react")),f=n(e("../../avatar")),d=e("./details"),p=n(e("./last-action")),m=e("./options"),y=n(e("./user-url"));function n(e){return e&&e.__esModule?e:{default:e}}function b(e,t,r,n){var a=["list-group-item"];return n&&n.css_class&&(a.push("list-group-category-has-flavor"),a.push("list-group-item-category-"+n.css_class)),e?a.push("thread-read"):a.push("thread-new"),t?a.push("thread-busy"):r&&a.push("thread-selected"),a.join(" ")}},{"../../avatar":6,"./details":245,"./last-action":247,"./options":248,"./user-url":255,react:"react"}],251:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var s=o(e("react")),n=o(e("./full")),c=o(e("./modal")),f=o(e("../../../../services/modal"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(u,n.default);var e,t,r,i=p(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=m(e),n=function(){f.default.show(s.default.createElement(c.default,{thread:e.props.thread}))},(r="showOptions")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"render",value:function(){var e="";return this.props.thread.moderation.length?e+="col-xs-6":e+="col-xs-12",e+=" hidden-md hidden-lg",s.default.createElement("div",{className:e},s.default.createElement("button",{type:"button",className:this.getClassName(),disabled:this.props.disabled,onClick:this.showOptions},s.default.createElement("span",{className:"material-icon"},this.getIcon())))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{"../../../../services/modal":371,"./full":252,"./modal":253,react:"react"}],252:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Label=d,r.default=void 0;var o=n(e("react")),l=n(e("./options"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getIcon",value:function(){return!0===this.props.thread.subscription?"star":!1===this.props.thread.subscription?"star_half":"star_border"}},{key:"getClassName",value:function(){return!0===this.props.thread.subscription?"btn btn-default btn-icon btn-block btn-subscribe btn-subscribe-full dropdown-toggle":!1===this.props.thread.subscription?"btn btn-default btn-icon btn-block btn-subscribe btn-subscribe-half dropdown-toggle":"btn btn-default btn-icon btn-block btn-subscribe dropdown-toggle"}},{key:"render",value:function(){var e=this.props.thread,t=e.moderation,r=e.subscription,n=!t.length?"col-xs-12":"col-xs-6";return n+=" hidden-xs hidden-sm",o.default.createElement("div",{className:n},o.default.createElement("div",{className:"btn-group btn-group-justified"},o.default.createElement("div",{className:"btn-group"},o.default.createElement("button",{type:"button",className:this.getClassName(),disabled:this.props.disabled,"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},o.default.createElement("span",{className:"material-icon"},this.getIcon()),o.default.createElement(d,{moderation:t,subscription:r})),o.default.createElement(l.default,{className:"dropdown-menu dropdown-menu-right",thread:this.props.thread}))))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function d(e){var t=e.moderation,r=e.subscription;if(t.length)return null;var n=gettext("Disabled");return!0===r?n=gettext("E-mail"):!1===r&&(n=gettext("Enabled")),o.default.createElement("span",{className:"btn-text"},n)}r.default=f},{"./options":254,react:"react"}],253:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./options"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"modal-dialog modal-sm",role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Change subscription"))),o.default.createElement(l.default,{className:"modal-menu",thread:this.props.thread})))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./options":254,react:"react"}],254:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=(n(e("../../../button")),e("../../../../reducers/threads")),i=n(e("../../../../services/ajax")),u=n(e("../../../../services/modal")),s=n(e("../../../../services/snackbar")),c=n(e("../../../../services/store"));function n(e){return e&&e.__esModule?e:{default:e}}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return m(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var h={unsubscribe:null,notify:!1,email:!0},v=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(a,o.default.Component);var e,t,r,n=p(a);function a(e){var r;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),b(m(r=n.call(this,e)),"setSubscription",function(e){u.default.hide(),r.setState({isLoading:!0});var t=r.props.thread.subscription;c.default.dispatch((0,l.patch)(r.props.thread,{subscription:h[e]})),i.default.patch(r.props.thread.api.index,[{op:"replace",path:"subscription",value:e}]).then(function(){r.setState({isLoading:!1})},function(e){r.setState({isLoading:!1}),c.default.dispatch((0,l.patch)(r.props.thread,{subscription:h[t]})),s.default.apiError(e)})}),b(m(r),"unsubscribe",function(){r.setSubscription("unsubscribe")}),b(m(r),"notify",function(){r.setSubscription("notify")}),b(m(r),"email",function(){r.setSubscription("email")}),r.state={isLoading:!1},r}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("ul",{className:this.props.className},o.default.createElement("li",null,o.default.createElement("button",{className:"btn-link",onClick:this.unsubscribe},o.default.createElement("span",{className:"material-icon"},"star_border"),gettext("Unsubscribe"))),o.default.createElement("li",null,o.default.createElement("button",{className:"btn-link",onClick:this.notify},o.default.createElement("span",{className:"material-icon"},"star_half"),gettext("Subscribe"))),o.default.createElement("li",null,o.default.createElement("button",{className:"btn-link",onClick:this.email},o.default.createElement("span",{className:"material-icon"},"star"),gettext("Subscribe with e-mail"))))}}])&&f(e.prototype,t),r&&f(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=v},{"../../../../reducers/threads":361,"../../../../services/ajax":365,"../../../../services/modal":371,"../../../../services/snackbar":376,"../../../../services/store":377,"../../../button":8,react:"react"}],255:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.children,r=e.className,n=e.title,a=e.url;if(a)return o.default.createElement("a",{className:r,href:a,title:n},t);return o.default.createElement("span",{className:r,title:n},t)};var n,o=(n=e("react"))&&n.__esModule?n:{default:n}},{react:"react"}],256:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Subcategory=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n},l=e("react-router");function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t,r){return t&&u(e.prototype,t),r&&u(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=p(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=p(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){return(p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var m=function(){c(t,o.default.Component);var e=d(t);function t(){return i(this,t),e.apply(this,arguments)}return s(t,[{key:"getUrl",value:function(){return this.props.listPath?this.props.category.url.index+this.props.listPath:this.props.category.url.index}},{key:"render",value:function(){return o.default.createElement("li",null,o.default.createElement(l.Link,{to:this.getUrl(),className:"btn btn-link"},this.props.category.name))}}]),t}();r.Subcategory=m;var y=function(){c(t,o.default.Component);var e=d(t);function t(){return i(this,t),e.apply(this,arguments)}return s(t,[{key:"render",value:function(){var t=this;return o.default.createElement("div",{className:"dropdown category-picker"},o.default.createElement("button",{type:"button",className:"btn btn-default btn-outline dropdown-toggle btn-block","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},o.default.createElement("span",{className:"material-icon"},"label_outline"),o.default.createElement("span",{className:"hidden-xs"},gettext("Category"))),o.default.createElement("ul",{className:"dropdown-menu stick-to-bottom categories-menu"},this.props.choices.map(function(e){return t.props.categories[e]?o.default.createElement(m,{category:t.props.categories[e],listPath:t.props.list.path,key:e}):null})))}}]),t}();r.default=y},{react:"react","react-router":"react-router"}],257:[function(e,t,r){"use strict";function n(e,t){return e.last_post>t.last_post?-1:e.last_post<t.last_post?1:0}Object.defineProperty(r,"__esModule",{value:!0}),r.compareGlobalWeight=function(e,t){return 2===e.weight&&e.weight>t.weight?-1:2===t.weight&&e.weight<t.weight?1:n(e,t)},r.compareLastPostAge=n,r.compareWeight=function(e,t){return e.weight>t.weight?-1:e.weight<t.weight?1:n(e,t)}},{}],258:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../page-lead")),i=n(e("./toolbar"));function n(e){return e&&e.__esModule?e:{default:e}}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=f(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=f(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){return(f=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var d=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(a,o.default.Component);var e,t,r,n=c(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getCategoryDescription",value:function(){return this.props.pageLead?o.default.createElement("div",{className:"category-description"},o.default.createElement("div",{className:"page-lead"},o.default.createElement("p",null,this.props.pageLead))):this.props.route.category.description?o.default.createElement("div",{className:"category-description"},o.default.createElement(l.default,{copy:this.props.route.category.description.html})):null}},{key:"getDisableToolbar",value:function(){return!this.props.isLoaded||this.props.isBusy||this.props.busyThreads.length}},{key:"getToolbar",value:function(){return this.props.subcategories.length||this.props.user.id?o.default.createElement(i.default,{subcategories:this.props.subcategories,categories:this.props.route.categories,categoriesMap:this.props.route.categoriesMap,list:this.props.route.list,threads:this.props.threads,moderation:this.props.moderation,selection:this.props.selection,selectAllThreads:this.props.selectAllThreads,selectNoneThreads:this.props.selectNoneThreads,addThreads:this.props.addThreads,freezeThread:this.props.freezeThread,deleteThread:this.props.deleteThread,updateThread:this.props.updateThread,api:this.props.api,route:this.props.route,disabled:this.getDisableToolbar(),user:this.props.user}):null}},{key:"render",value:function(){return o.default.createElement("div",{className:"container"},this.getCategoryDescription(),this.getToolbar(),this.props.children)}}])&&u(e.prototype,t),r&&u(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=d},{"../page-lead":92,"./toolbar":269,react:"react"}],259:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ParentCategory=h,r.default=void 0;var i=o(e("react")),u=e("react-router"),n=o(e("../button")),s=(o(e("../dropdown-toggle")),o(e("./nav"))),c=(o(e("../../services/ajax")),o(e("../../services/posting"))),f=(o(e("../../services/snackbar")),o(e("../../services/store")),o(e("../..")));function o(e){return e&&e.__esModule?e:{default:e}}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return y(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var b=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(l,i.default.Component);var e,t,r,o=m(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=y(t),a=function(){c.default.open(t.props.startThread||{mode:"START",config:f.default.get("THREAD_EDITOR_API"),submit:f.default.get("THREADS_API"),category:t.props.route.category.id})},(n="startThread")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,t.state={isBusy:!1},t}return e=l,(t=[{key:"hasGoBackButton",value:function(){return!!this.props.route.category.parent}},{key:"getGoBackButton",value:function(){if(!this.props.route.category.parent)return null;var e=this.props.categories[this.props.route.category.parent];return i.default.createElement("div",{className:"hidden-xs col-sm-2 col-lg-1"},i.default.createElement(u.Link,{className:"btn btn-default btn-icon btn-aligned btn-go-back btn-block btn-outline",to:e.url.index+this.props.route.list.path},i.default.createElement("span",{className:"material-icon"},"keyboard_arrow_left")))}},{key:"getStartThreadButton",value:function(){return this.props.user.id?i.default.createElement(n.default,{className:"btn-primary btn-block btn-outline",onClick:this.startThread,disabled:this.props.disabled},i.default.createElement("span",{className:"material-icon"},"chat"),gettext("Start thread")):null}},{key:"render",value:function(){var e="col-xs-12";this.hasGoBackButton()&&(e+=" col-sm-10 col-lg-11 sm-align-row-buttons");var t=!!this.props.user.id;return i.default.createElement("div",{className:"page-header-bg"},i.default.createElement("div",{className:"page-header"},i.default.createElement("div",{className:"container"},i.default.createElement("div",{className:"row"},i.default.createElement("div",{className:t?"col-sm-9 col-md-10":"col-xs-12"},i.default.createElement("div",{className:"row"},this.getGoBackButton(),i.default.createElement("div",{className:e},i.default.createElement(h,{categories:this.props.categories,category:this.props.route.category.parent}),i.default.createElement("h1",null,this.props.title)))),t&&i.default.createElement("div",{className:"col-sm-3 col-md-2 xs-margin-top"},this.getStartThreadButton()))),i.default.createElement(s.default,{baseUrl:this.props.route.category.url.index,list:this.props.route.list,lists:this.props.route.lists})))}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();function h(e){var t=e.categories,r=e.category;if(!r)return null;var n=t[r];return i.default.createElement(u.Link,{className:"go-back-sm visible-xs-block",to:n.url.index},i.default.createElement("span",{className:"material-icon"},"chevron_left"),n.parent?n.name:gettext("Threads"))}r.default=b},{"../..":302,"../../services/ajax":365,"../../services/posting":375,"../../services/snackbar":376,"../../services/store":377,"../button":8,"../dropdown-toggle":27,"./nav":266,react:"react","react-router":"react-router"}],260:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return"all"===this.props.list.type?this.props.emptyMessage?o.default.createElement("li",{className:"list-group-item empty-message"},o.default.createElement("p",{className:"lead"},this.props.emptyMessage),o.default.createElement("p",null,gettext("Why not start one yourself?"))):o.default.createElement("li",{className:"list-group-item empty-message"},o.default.createElement("p",{className:"lead"},this.props.category.special_role?gettext("There are no threads on this forum... yet!"):gettext("There are no threads in this category.")),o.default.createElement("p",null,gettext("Why not start one yourself?"))):o.default.createElement("li",{className:"list-group-item empty-message"},gettext("No threads matching specified criteria were found."))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],261:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var l=n(e("react")),u=n(e("./errors-list")),s=n(e("./merge")),c=n(e("./move")),f=(function(e,t){if(!t&&e&&e.__esModule)return;if(null===e||"object"!==i(e)&&"function"!=typeof e)return;var r=m(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n)}(e("../../../reducers/selection")),n(e("../../../services/ajax"))),d=n(e("../../../services/modal")),p=n(e("../../../services/snackbar"));n(e("../../../services/store")),n(e("../../../utils/countdown"));function m(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(m=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function v(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(a,l.default.Component);var e,t,r,n=b(a);function a(){var o;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a);for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return v(h(o=n.call.apply(n,[this].concat(t))),"callApi",function(e,t){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;o.props.threads.forEach(function(e){o.props.freezeThread(e.id)});var n=o.props.threads.map(function(e){return e.id});e.push({op:"add",path:"acl",value:!0}),f.default.patch(o.props.api,{ids:n,ops:e}).then(function(e){o.props.threads.forEach(function(e){o.props.freezeThread(e.id)}),e.forEach(function(e){o.props.updateThread(e)}),p.default.success(t),r&&r()},function(e){if(o.props.threads.forEach(function(e){o.props.freezeThread(e.id)}),400!==e.status)return p.default.apiError(e);var n=[],a={};o.props.threads.forEach(function(e){a[e.id]=e}),e.forEach(function(e){var t=e.id,r=e.detail;void 0!==a[t]&&n.push({errors:r,thread:a[t]})}),d.default.show(l.default.createElement(u.default,{errors:n}))})}),v(h(o),"pinGlobally",function(){o.callApi([{op:"replace",path:"weight",value:2}],gettext("Selected threads were pinned globally."))}),v(h(o),"pinLocally",function(){o.callApi([{op:"replace",path:"weight",value:1}],gettext("Selected threads were pinned locally."))}),v(h(o),"unpin",function(){o.callApi([{op:"replace",path:"weight",value:0}],gettext("Selected threads were unpinned."))}),v(h(o),"approve",function(){o.callApi([{op:"replace",path:"is-unapproved",value:!1}],gettext("Selected threads were approved."))}),v(h(o),"open",function(){o.callApi([{op:"replace",path:"is-closed",value:!1}],gettext("Selected threads were opened."))}),v(h(o),"close",function(){o.callApi([{op:"replace",path:"is-closed",value:!0}],gettext("Selected threads were closed."))}),v(h(o),"unhide",function(){o.callApi([{op:"replace",path:"is-hidden",value:!1}],gettext("Selected threads were unhidden."))}),v(h(o),"hide",function(){o.callApi([{op:"replace",path:"is-hidden",value:!0}],gettext("Selected threads were hidden."))}),v(h(o),"move",function(){d.default.show(l.default.createElement(c.default,{callApi:o.callApi,categories:o.props.categories,categoriesMap:o.props.categoriesMap,route:o.props.route,user:o.props.user}))}),v(h(o),"merge",function(){var t=[];if(o.props.threads.forEach(function(e){e.acl.can_merge||t.append({id:e.id,title:e.title,errors:[gettext("You don't have permission to merge this thread with others.")]})}),o.props.threads.length<2)p.default.info(gettext("You have to select at least two threads to merge."));else{if(t.length)return void d.default.show(l.default.createElement(u.default,{errors:t}));d.default.show(l.default.createElement(s.default,o.props))}}),v(h(o),"delete",function(){var e;window.confirm(gettext("Are you sure you want to delete selected threads?"))&&(o.props.threads.map(function(e){o.props.freezeThread(e.id)}),e=o.props.threads.map(function(e){return e.id}),f.default.delete(o.props.api,e).then(function(){o.props.threads.map(function(e){o.props.freezeThread(e.id),o.props.deleteThread(e)}),p.default.success(gettext("Selected threads were deleted."))},function(e){var t;400===e.status?(t=e.map(function(e){return e.id}),o.props.threads.map(function(e){o.props.freezeThread(e.id),-1===t.indexOf(e.id)&&o.props.deleteThread(e)}),d.default.show(l.default.createElement(u.default,{errors:e}))):p.default.apiError(e)}))}),o}return e=a,(t=[{key:"getPinGloballyButton",value:function(){return this.props.moderation.can_pin_globally?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.pinGlobally,type:"button"},l.default.createElement("span",{className:"material-icon"},"bookmark"),gettext("Pin threads globally"))):null}},{key:"getPinLocallyButton",value:function(){return this.props.moderation.can_pin?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.pinLocally,type:"button"},l.default.createElement("span",{className:"material-icon"},"bookmark_border"),gettext("Pin threads locally"))):null}},{key:"getUnpinButton",value:function(){return this.props.moderation.can_pin?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.unpin,type:"button"},l.default.createElement("span",{className:"material-icon"},"panorama_fish_eye"),gettext("Unpin threads"))):null}},{key:"getMoveButton",value:function(){return this.props.moderation.can_move?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.move,type:"button"},l.default.createElement("span",{className:"material-icon"},"arrow_forward"),gettext("Move threads"))):null}},{key:"getMergeButton",value:function(){return this.props.moderation.can_merge?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.merge,type:"button"},l.default.createElement("span",{className:"material-icon"},"call_merge"),gettext("Merge threads"))):null}},{key:"getApproveButton",value:function(){return this.props.moderation.can_approve?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.approve,type:"button"},l.default.createElement("span",{className:"material-icon"},"done"),gettext("Approve threads"))):null}},{key:"getOpenButton",value:function(){return this.props.moderation.can_close?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.open,type:"button"},l.default.createElement("span",{className:"material-icon"},"lock_open"),gettext("Open threads"))):null}},{key:"getCloseButton",value:function(){return this.props.moderation.can_close?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.close,type:"button"},l.default.createElement("span",{className:"material-icon"},"lock_outline"),gettext("Close threads"))):null}},{key:"getUnhideButton",value:function(){return this.props.moderation.can_unhide?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.unhide,type:"button"},l.default.createElement("span",{className:"material-icon"},"visibility"),gettext("Unhide threads"))):null}},{key:"getHideButton",value:function(){return this.props.moderation.can_hide?l.default.createElement("li",null,l.default.createElement("button",{onClick:this.hide,type:"button",className:"btn btn-link"},l.default.createElement("span",{className:"material-icon"},"visibility_off"),gettext("Hide threads"))):null}},{key:"getDeleteButton",value:function(){return this.props.moderation.can_delete?l.default.createElement("li",null,l.default.createElement("button",{className:"btn btn-link",onClick:this.delete,type:"button"},l.default.createElement("span",{className:"material-icon"},"clear"),gettext("Delete threads"))):null}},{key:"render",value:function(){return l.default.createElement("ul",{className:this.props.className},this.getPinGloballyButton(),this.getPinLocallyButton(),this.getUnpinButton(),this.getMoveButton(),this.getMergeButton(),this.getApproveButton(),this.getOpenButton(),this.getCloseButton(),this.getUnhideButton(),this.getHideButton(),this.getDeleteButton())}}])&&o(e.prototype,t),r&&o(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=g},{"../../../reducers/selection":358,"../../../services/ajax":365,"../../../services/modal":371,"../../../services/snackbar":376,"../../../services/store":377,"../../../utils/countdown":382,"./errors-list":262,"./merge":263,"./move":264,react:"react"}],262:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.ThreadErrors=f,r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"modal-dialog",role:"document"},o.default.createElement("div",{className:"modal-content"},o.default.createElement("div",{className:"modal-header"},o.default.createElement("button",{"aria-label":gettext("Close"),className:"close","data-dismiss":"modal",type:"button"},o.default.createElement("span",{"aria-hidden":"true"},"×")),o.default.createElement("h4",{className:"modal-title"},gettext("Threads moderation"))),o.default.createElement("div",{className:"modal-body"},o.default.createElement("p",{className:"lead"},gettext("One or more threads could not be deleted:")),o.default.createElement("ul",{className:"list-unstyled list-errored-items"},this.props.errors.map(function(e){return o.default.createElement(f,{errors:e.errors,key:e.thread.id,thread:e.thread})})))))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function f(e){var t=e.errors,r=e.thread;return o.default.createElement("li",null,o.default.createElement("h5",null,r.title),t.map(function(e,t){return o.default.createElement("p",null,e)}))}r.default=c},{react:"react"}],263:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var l=o(e("react")),n=o(e("../../button")),u=o(e("../../form")),s=o(e("../../form-group")),c=o(e("../../category-select")),f=o(e("../../select")),d=o(e("../../..")),p=e("../../../reducers/threads"),m=a(e("../../../reducers/selection")),y=o(e("./errors-list")),b=o(e("../../merge-conflict")),h=o(e("../../../services/ajax")),v=o(e("../../../services/modal")),g=o(e("../../../services/snackbar")),_=o(e("../../../services/store")),E=a(e("../../../utils/validators"));function w(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(w=function(e){return e?r:t})(e)}function a(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=w(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function o(e){return e&&e.__esModule?e:{default:e}}function O(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function j(e,t){return(j=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function P(r){var 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}}();return function(){var e,t=x(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return k(e)}(this,n?(e=x(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function k(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function x(e){return(x=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function N(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var S=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&j(e,t)}(o,u.default);var e,t,r,a=P(o);function o(e){var n,t;for(var r in!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o),N(k(n=a.call(this,e)),"getFormdata",function(){return{threads:n.props.threads.map(function(e){return e.id}),title:n.state.title,category:n.state.category,weight:n.state.weight,is_hidden:n.state.is_hidden,is_closed:n.state.is_closed}}),N(k(n),"handleSuccess",function(e){n.props.threads.forEach(function(e){n.props.freezeThread(e.id),n.props.deleteThread(e)}),_.default.dispatch(m.none()),n.props.addThreads([e]),_.default.dispatch((0,p.filterThreads)(n.props.route.category,n.props.categoriesMap)),v.default.hide()}),N(k(n),"handleError",function(e){400===e.status?e.best_answers||e.polls?v.default.show(l.default.createElement(b.default,{api:d.default.get("MERGE_THREADS_API"),bestAnswers:e.best_answers,data:n.getFormdata(),polls:e.polls,onError:n.handleError,onSuccess:n.handleSuccess})):(n.setState({errors:Object.assign({},n.state.errors,e)}),g.default.error(gettext("Form contains errors."))):403===e.status&&Array.isArray(e)?v.default.show(l.default.createElement(y.default,{errors:e})):e.best_answer?g.default.error(e.best_answer[0]):e.poll?g.default.error(e.poll[0]):g.default.apiError(e)}),N(k(n),"onCategoryChange",function(e){var t=e.target.value,r={category:t};n.acl[t].can_pin_threads<r.weight&&(r.weight=0),n.acl[t].can_hide_threads||(r.is_hidden=0),n.acl[t].can_close_threads||(r.is_closed=!1),n.setState(r)}),n.state={isLoading:!1,title:"",category:null,weight:0,is_hidden:0,is_closed:!1,validators:{title:[E.required()]},errors:{}},n.acl={},e.user.acl.categories){e.user.acl.categories.hasOwnProperty(r)&&(t=e.user.acl.categories[r],n.acl[t.id]=t)}return n.categoryChoices=[],e.categories.forEach(function(e){var t,r;0<e.level&&(r=!(t=n.acl[e.id]).can_start_threads||e.is_closed&&!t.can_close_threads,n.categoryChoices.push({value:e.id,disabled:r,level:e.level-1,label:e.name}),r||n.state.category||(n.state.category=e.id))}),n.isHiddenChoices=[{value:0,icon:"visibility",label:gettext("No")},{value:1,icon:"visibility_off",label:gettext("Yes")}],n.isClosedChoices=[{value:!1,icon:"lock_outline",label:gettext("No")},{value:!0,icon:"lock",label:gettext("Yes")}],n}return e=o,(t=[{key:"clean",value:function(){return!!this.isValid()||(g.default.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}},{key:"send",value:function(){return h.default.post(d.default.get("MERGE_THREADS_API"),this.getFormdata())}},{key:"getWeightChoices",value:function(){var e=[{value:0,icon:"remove",label:gettext("Not pinned")},{value:1,icon:"bookmark_border",label:gettext("Pinned locally")}];return 2==this.acl[this.state.category].can_pin_threads&&e.push({value:2,icon:"bookmark",label:gettext("Pinned globally")}),e}},{key:"renderWeightField",value:function(){return this.acl[this.state.category].can_pin_threads?l.default.createElement(s.default,{label:gettext("Thread weight"),for:"id_weight"},l.default.createElement(f.default,{id:"id_weight",onChange:this.bindInput("weight"),value:this.state.weight,choices:this.getWeightChoices()})):null}},{key:"renderHiddenField",value:function(){return this.acl[this.state.category].can_hide_threads?l.default.createElement(s.default,{label:gettext("Hide thread"),for:"id_is_hidden"},l.default.createElement(f.default,{id:"id_is_closed",onChange:this.bindInput("is_hidden"),value:this.state.is_hidden,choices:this.isHiddenChoices})):null}},{key:"renderClosedField",value:function(){return this.acl[this.state.category].can_close_threads?l.default.createElement(s.default,{label:gettext("Close thread"),for:"id_is_closed"},l.default.createElement(f.default,{id:"id_is_closed",onChange:this.bindInput("is_closed"),value:this.state.is_closed,choices:this.isClosedChoices})):null}},{key:"renderForm",value:function(){return l.default.createElement("form",{onSubmit:this.handleSubmit},l.default.createElement("div",{className:"modal-body"},l.default.createElement(s.default,{label:gettext("Thread title"),for:"id_title",validation:this.state.errors.title},l.default.createElement("input",{id:"id_title",className:"form-control",type:"text",onChange:this.bindInput("title"),value:this.state.title})),l.default.createElement("div",{className:"clearfix"}),l.default.createElement(s.default,{label:gettext("Category"),for:"id_category",validation:this.state.errors.category},l.default.createElement(c.default,{id:"id_category",onChange:this.onCategoryChange,value:this.state.category,choices:this.categoryChoices})),l.default.createElement("div",{className:"clearfix"}),this.renderWeightField(),this.renderHiddenField(),this.renderClosedField()),l.default.createElement("div",{className:"modal-footer"},l.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),l.default.createElement(n.default,{className:"btn-primary",loading:this.state.isLoading},gettext("Merge threads"))))}},{key:"renderCantMergeMessage",value:function(){return l.default.createElement("div",{className:"modal-body"},l.default.createElement("div",{className:"message-icon"},l.default.createElement("span",{className:"material-icon"},"info_outline")),l.default.createElement("div",{className:"message-body"},l.default.createElement("p",{className:"lead"},gettext("You can't move threads because there are no categories you are allowed to move them to.")),l.default.createElement("p",null,gettext("You need permission to start threads in category to be able to merge threads to it.")),l.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok"))))}},{key:"getClassName",value:function(){return this.state.category?"modal-dialog":"modal-dialog modal-message"}},{key:"render",value:function(){return l.default.createElement("div",{className:this.getClassName(),role:"document"},l.default.createElement("div",{className:"modal-content"},l.default.createElement("div",{className:"modal-header"},l.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},l.default.createElement("span",{"aria-hidden":"true"},"×")),l.default.createElement("h4",{className:"modal-title"},gettext("Merge threads"))),this.state.category?this.renderForm():this.renderCantMergeMessage()))}}])&&O(e.prototype,t),r&&O(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=S},{"../../..":302,"../../../reducers/selection":358,"../../../reducers/threads":361,"../../../services/ajax":365,"../../../services/modal":371,"../../../services/snackbar":376,"../../../services/store":377,"../../../utils/validators":393,"../../button":8,"../../category-select":21,"../../form":56,"../../form-group":55,"../../merge-conflict":59,"../../select":210,"./errors-list":262,react:"react"}],264:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=s(e("react")),a=s(e("../../form")),o=s(e("../../form-group")),l=s(e("../../category-select")),c=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/selection")),f=e("../../../reducers/threads"),d=s(e("../../../services/modal")),p=s(e("../../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e){return e&&e.__esModule?e:{default:e}}function m(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,t){return(y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function b(r){var 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}}();return function(){var e,t=v(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return h(e)}(this,n?(e=v(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(s,a.default);var e,t,r,u=b(s);function s(e){var n,t,r,a;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,s),n=u.call(this,e),t=h(n),a=function(e){e.preventDefault(),d.default.hide();n.props.callApi([{op:"replace",path:"category",value:n.state.category},{op:"replace",path:"flatten-categories",value:null},{op:"add",path:"acl",value:!0}],gettext("Selected threads were moved."),function(){p.default.dispatch((0,f.filterThreads)(n.props.route.category,n.props.categoriesMap));var e=p.default.getState(),t=e.threads.map(function(e){return e.id});p.default.dispatch(c.all(e.selection.filter(function(e){return-1!==t.indexOf(e)})))})},(r="handleSubmit")in t?Object.defineProperty(t,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[r]=a,n.state={category:null};var o,l={};for(var i in e.user.acl.categories){e.user.acl.categories.hasOwnProperty(i)&&(o=e.user.acl.categories[i],l[o.id]=o)}return n.categoryChoices=[],e.categories.forEach(function(e){var t,r;0<e.level&&(r=!(t=l[e.id]).can_start_threads||e.is_closed&&!t.can_close_threads,n.categoryChoices.push({value:e.id,disabled:r,level:e.level-1,label:e.name}),r||n.state.category||(n.state.category=e.id))}),n}return e=s,(t=[{key:"getClassName",value:function(){return this.state.category?"modal-dialog":"modal-dialog modal-message"}},{key:"renderForm",value:function(){return n.default.createElement("form",{onSubmit:this.handleSubmit},n.default.createElement("div",{className:"modal-body"},n.default.createElement(o.default,{label:gettext("New category"),for:"id_new_category"},n.default.createElement(l.default,{id:"id_new_category",onChange:this.bindInput("category"),value:this.state.category,choices:this.categoryChoices}))),n.default.createElement("div",{className:"modal-footer"},n.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},gettext("Cancel")),n.default.createElement("button",{className:"btn btn-primary"},gettext("Move threads"))))}},{key:"renderCantMoveMessage",value:function(){return n.default.createElement("div",{className:"modal-body"},n.default.createElement("div",{className:"message-icon"},n.default.createElement("span",{className:"material-icon"},"info_outline")),n.default.createElement("div",{className:"message-body"},n.default.createElement("p",{className:"lead"},gettext("You can't move threads because there are no categories you are allowed to move them to.")),n.default.createElement("p",null,gettext("You need permission to start threads in category to be able to move threads to it.")),n.default.createElement("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},gettext("Ok"))))}},{key:"render",value:function(){return n.default.createElement("div",{className:this.getClassName(),role:"document"},n.default.createElement("div",{className:"modal-content"},n.default.createElement("div",{className:"modal-header"},n.default.createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},n.default.createElement("span",{"aria-hidden":"true"},"×")),n.default.createElement("h4",{className:"modal-title"},gettext("Move threads"))),this.state.category?this.renderForm():this.renderCantMoveMessage()))}}])&&m(e.prototype,t),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),s}();r.default=g},{"../../../reducers/selection":358,"../../../reducers/threads":361,"../../../services/modal":371,"../../../services/store":377,"../../category-select":21,"../../form":56,"../../form-group":55,react:"react"}],265:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=a(e("react")),l=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../reducers/selection")),u=a(e("../../../services/store"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function a(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=o(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return p(e)}(this,n?(e=o(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function m(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var y=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(o,n.default.Component);var e,t,r,a=d(o);function o(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return m(p(e=a.call.apply(a,[this].concat(r))),"selectAll",function(){u.default.dispatch(l.all(e.props.threads.map(function(e){return e.id})))}),m(p(e),"selectNone",function(){u.default.dispatch(l.none())}),e}return e=o,(t=[{key:"render",value:function(){return n.default.createElement("ul",{className:this.props.className},n.default.createElement("li",null,n.default.createElement("button",{className:"btn btn-link",type:"button",onClick:this.selectAll},n.default.createElement("span",{className:"material-icon"},"check_box"),gettext("Select all"))),n.default.createElement("li",null,n.default.createElement("button",{className:"btn btn-link",type:"button",onClick:this.selectNone},n.default.createElement("span",{className:"material-icon"},"check_box_outline_blank"),gettext("Select none"))))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),o}();r.default=y},{"../../../reducers/selection":358,"../../../services/store":377,react:"react"}],266:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.baseUrl,r=e.list,n=e.lists;return n.length<2?null:a.default.createElement("div",{className:"page-tabs"},a.default.createElement("div",{className:"container"},a.default.createElement("ul",{className:"nav nav-pills"},n.map(function(e){return a.default.createElement(l.default,{isControlled:!0,isActive:e.path===r.path,key:t+e.path},a.default.createElement(o.Link,{to:t+e.path},e.name))}))))};var a=n(e("react")),o=e("react-router"),l=n(e("../li"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../li":57,react:"react","react-router":"react-router"}],267:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.getLists=c,r.getSelect=s,r.paths=function(e,r){var n=c(e),a=[],o={};return u.default.get("CATEGORIES").forEach(function(t){n.forEach(function(e){o[t.id]=t,a.push({path:t.url.index+e.path,component:(0,l.connect)(s(r))(i.default),categories:u.default.get("CATEGORIES"),categoriesMap:o,category:t,lists:n,list:e})})}),a};var l=e("react-redux"),i=n(e("./route")),u=n(e("../.."));function n(e){return e&&e.__esModule?e:{default:e}}function s(t){return function(e){return{options:t,selection:e.selection,threads:e.threads,tick:e.tick.tick,user:e.auth.user}}}function c(e){var t=[{type:"all",path:"",name:gettext("All"),longName:gettext("All threads")}];return e.id&&(t.push({type:"my",path:"my/",name:gettext("My"),longName:gettext("My threads")}),t.push({type:"new",path:"new/",name:gettext("New"),longName:gettext("New threads")}),t.push({type:"unread",path:"unread/",name:gettext("Unread"),longName:gettext("Unread threads")}),t.push({type:"subscribed",path:"subscribed/",name:gettext("Subscribed"),longName:gettext("Subscribed threads")}),e.acl.can_see_unapproved_content_lists&&t.push({type:"unapproved",path:"unapproved/",name:gettext("Unapproved"),longName:gettext("Unapproved content")})),t}},{"../..":302,"./route":268,"react-redux":"react-redux"}],268:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=a(e("react")),l=a(e("../button")),u=e("./compare"),s=a(e("./container")),c=a(e("./header")),f=e("./utils"),d=a(e("../threads-list")),p=a(e("./list-empty")),m=a(e("../with-dropdown")),y=a(e("../..")),b=n(e("../../reducers/selection")),h=e("../../reducers/threads"),v=a(e("../../services/ajax")),g=a(e("../../services/polls")),_=a(e("../../services/snackbar")),E=a(e("../../services/store")),w=a(e("../../services/page-title")),O=n(e("../../utils/sets"));function j(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(j=function(e){return e?r:t})(e)}function n(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=j(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function a(e){return e&&e.__esModule?e:{default:e}}function P(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function k(e,t){return(k=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function x(r){var 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}}();return function(){var e,t=S(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return N(e)}(this,n?(e=S(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function N(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function S(e){return(S=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function R(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var C=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&k(e,t)}(a,m.default);var e,t,r,n=x(a);function a(e){var r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),R(N(r=n.call(this,e)),"loadMore",function(){r.setState({isBusy:!0}),r.loadThreads(r.getCategory(),r.state.next)}),R(N(r),"pollResponse",function(e){r.setState({diff:Object.assign({},e,{results:(0,f.diffThreads)(r.props.threads,e.results)})})}),R(N(r),"addThreads",function(e){E.default.dispatch((0,h.append)(e,r.getSorting()))}),R(N(r),"applyDiff",function(){r.addThreads(r.state.diff.results),r.setState(Object.assign({},r.state.diff,{moderation:(0,f.getModerationActions)(E.default.getState().threads),diff:{results:[]}}))}),R(N(r),"freezeThread",function(t){r.setState(function(e){return{busyThreads:O.toggle(e.busyThreads,t)}})}),R(N(r),"updateThread",function(e){E.default.dispatch((0,h.patch)(e,e,r.getSorting()))}),R(N(r),"deleteThread",function(e){E.default.dispatch((0,h.deleteThread)(e))}),r.state={isMounted:!0,isLoaded:!1,isBusy:!1,diff:{results:[]},moderation:[],busyThreads:[],dropdown:!1,subcategories:[],next:0};var t=r.getCategory();return y.default.has("THREADS")?r.initWithPreloadedData(t,y.default.get("THREADS")):r.initWithoutPreloadedData(t),r}return e=a,(t=[{key:"getCategory",value:function(){return this.props.route.category.special_role?null:this.props.route.category.id}},{key:"initWithPreloadedData",value:function(e,t){this.state=Object.assign(this.state,{moderation:(0,f.getModerationActions)(t.results),subcategories:t.subcategories,next:t.next}),this.startPolling(e)}},{key:"initWithoutPreloadedData",value:function(e){this.loadThreads(e)}},{key:"loadThreads",value:function(t,e){var r=this,n=1<arguments.length&&void 0!==e?e:0;v.default.get(this.props.options.api,{category:t,list:this.props.route.list.type,start:n||0},"threads").then(function(e){r.state.isMounted&&(0===n?E.default.dispatch((0,h.hydrate)(e.results)):E.default.dispatch((0,h.append)(e.results,r.getSorting())),r.setState({isLoaded:!0,isBusy:!1,moderation:(0,f.getModerationActions)(E.default.getState().threads),subcategories:e.subcategories,next:e.next}),r.startPolling(t))},function(e){_.default.apiError(e)})}},{key:"startPolling",value:function(e){g.default.start({poll:"threads",url:this.props.options.api,data:{category:e,list:this.props.route.list.type},frequency:12e4,update:this.pollResponse})}},{key:"componentDidMount",value:function(){this.setPageTitle(),y.default.has("THREADS")&&(E.default.dispatch((0,h.hydrate)(y.default.pop("THREADS").results)),this.setState({isLoaded:!0})),E.default.dispatch(b.none())}},{key:"componentWillUnmount",value:function(){this.state.isMounted=!1,g.default.stop("threads")}},{key:"getTitle",value:function(){return this.props.options.title?this.props.options.title:(0,f.getTitle)(this.props.route)}},{key:"setPageTitle",value:function(){this.props.route.category.level||!y.default.get("THREADS_ON_INDEX")?w.default.set((0,f.getPageTitle)(this.props.route)):this.props.options.title?w.default.set(this.props.options.title):y.default.get("SETTINGS").index_title?document.title=y.default.get("SETTINGS").index_title:document.title=y.default.get("SETTINGS").forum_name}},{key:"getSorting",value:function(){return this.props.route.category.level?u.compareWeight:u.compareGlobalWeight}},{key:"getMoreButton",value:function(){return this.state.next?o.default.createElement("div",{className:"pager-more"},o.default.createElement(l.default,{className:"btn btn-default btn-outline",loading:this.state.isBusy||this.state.busyThreads.length,onClick:this.loadMore},gettext("Show more"))):null}},{key:"getClassName",value:function(){var e,t="page page-threads";return t+=" page-threads-"+this.props.route.list.type,(e=this.props).route.category.level||!y.default.get("THREADS_ON_INDEX")||e.options.title||(t+=" page-threads-index"),this.props.route.category.css_class&&(t+=" page-threads-"+this.props.route.category.css_class),t}},{key:"render",value:function(){return o.default.createElement("div",{className:this.getClassName()},o.default.createElement(c.default,{categories:this.props.route.categoriesMap,disabled:!this.state.isLoaded,startThread:this.props.options.startThread,threads:this.props.threads,title:this.getTitle(),toggleNav:this.toggleNav,route:this.props.route,user:this.props.user}),o.default.createElement(s.default,{api:this.props.options.api,route:this.props.route,subcategories:this.state.subcategories,user:this.props.user,pageLead:this.props.options.pageLead,threads:this.props.threads,threadsCount:this.state.count,moderation:this.state.moderation,selection:this.props.selection,busyThreads:this.state.busyThreads,addThreads:this.addThreads,freezeThread:this.freezeThread,deleteThread:this.deleteThread,updateThread:this.updateThread,isLoaded:this.state.isLoaded,isBusy:this.state.isBusy},o.default.createElement(d.default,{category:this.props.route.category,categories:this.props.route.categoriesMap,list:this.props.route.list,selection:this.props.selection,threads:this.props.threads,diffSize:this.state.diff.results.length,applyDiff:this.applyDiff,showOptions:!!this.props.user.id,isLoaded:this.state.isLoaded,busyThreads:this.state.busyThreads},o.default.createElement(p.default,{category:this.props.route.category,emptyMessage:this.props.options.emptyMessage,list:this.props.route.list})),this.getMoreButton()))}}])&&P(e.prototype,t),r&&P(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=C},{"../..":302,"../../reducers/selection":358,"../../reducers/threads":361,"../../services/ajax":365,"../../services/page-title":373,"../../services/polls":374,"../../services/snackbar":376,"../../services/store":377,"../../utils/sets":391,"../button":8,"../threads-list":238,"../with-dropdown":299,"./compare":257,"./container":258,"./header":259,"./list-empty":260,"./utils":270,react:"react"}],269:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./category-picker")),i=n(e("./moderation/controls")),u=n(e("./moderation/selection"));function n(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=d(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=d(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){return(d=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(a,o.default.Component);var e,t,r,n=f(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getCategoryPicker",value:function(){return this.props.subcategories.length?o.default.createElement(l.default,{categories:this.props.categoriesMap,choices:this.props.subcategories,list:this.props.list}):null}},{key:"showModerationOptions",value:function(){return this.props.user.id&&this.props.moderation.allow}},{key:"getSelectedThreads",value:function(){var t=this;return this.props.threads.filter(function(e){return 0<=t.props.selection.indexOf(e.id)})}},{key:"getModerationButton",value:function(){return this.showModerationOptions()?o.default.createElement("div",{className:"col-xs-6 col-sm-3 col-md-2"},o.default.createElement("div",{className:"btn-group btn-group-justified"},o.default.createElement("div",{className:"btn-group dropdown"},o.default.createElement("button",{type:"button",className:"btn btn-default btn-outline dropdown-toggle","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:this.props.disabled||!this.props.selection.length},o.default.createElement("span",{className:"material-icon"},"settings"),gettext("Options")),o.default.createElement(i.default,{addThreads:this.props.addThreads,api:this.props.api,categories:this.props.categories,categoriesMap:this.props.categoriesMap,className:"dropdown-menu dropdown-menu-right stick-to-bottom",deleteThread:this.props.deleteThread,freezeThread:this.props.freezeThread,moderation:this.props.moderation,route:this.props.route,threads:this.getSelectedThreads(),updateThread:this.props.updateThread,user:this.props.user})))):null}},{key:"getSelectionButton",value:function(){return this.showModerationOptions()?o.default.createElement("div",{className:"col-xs-3 col-sm-2 col-md-1"},o.default.createElement("div",{className:"btn-group btn-group-justified"},o.default.createElement("div",{className:"btn-group dropdown"},o.default.createElement("button",{type:"button",className:"btn btn-default btn-outline btn-icon dropdown-toggle","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:this.props.disabled},o.default.createElement("span",{className:"material-icon"},"select_all")),o.default.createElement(u.default,{className:"dropdown-menu dropdown-menu-right stick-to-bottom",threads:this.props.threads})))):null}},{key:"render",value:function(){return o.default.createElement("div",{className:"row row-toolbar row-toolbar-bottom-margin"},o.default.createElement("div",{className:"col-xs-3 col-sm-3 col-md-2 dropdown"},this.getCategoryPicker()),o.default.createElement("div",{className:"hidden-xs col-sm-4 col-md-7"}),this.getModerationButton(),this.getSelectionButton())}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"./category-picker":256,"./moderation/controls":261,"./moderation/selection":265,react:"react"}],270:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.diffThreads=function(e,t){var r={};return e.forEach(function(e){r[e.id]=e}),t.filter(function(e){return!r[e.id]||o(r[e.id],e)})},r.getModerationActions=function(e){var t={allow:!1,can_approve:0,can_close:0,can_delete:0,can_hide:0,can_merge:0,can_move:0,can_pin:0,can_pin_globally:0,can_unhide:0};return e.forEach(function(e){e.is_unapproved&&e.acl.can_approve>t.can_approve&&(t.can_approve=e.acl.can_approve),e.acl.can_close>t.can_close&&(t.can_close=e.acl.can_close),e.acl.can_delete>t.can_delete&&(t.can_delete=e.acl.can_delete),e.acl.can_hide>t.can_hide&&(t.can_hide=e.acl.can_hide),e.acl.can_merge>t.can_merge&&(t.can_merge=e.acl.can_merge),e.acl.can_move>t.can_move&&(t.can_move=e.acl.can_move),e.acl.can_pin>t.can_pin&&(t.can_pin=e.acl.can_pin),e.acl.can_pin_globally>t.can_pin_globally&&(t.can_pin_globally=e.acl.can_pin_globally),e.is_hidden&&e.acl.can_unhide>t.can_unhide&&(t.can_unhide=e.acl.can_unhide),t.allow=t.can_approve||t.can_close||t.can_delete||t.can_hide||t.can_merge||t.can_move||t.can_pin||t.can_pin_globally||t.can_unhide}),t},r.getPageTitle=function(e){return e.category.level?e.list.path?{title:e.list.longName,parent:e.category.name}:{title:e.category.name}:a.default.get("THREADS_ON_INDEX")?e.list.path?{title:e.list.longName}:null:e.list.path?{title:e.list.longName,parent:gettext("Threads")}:{title:gettext("Threads")}},r.getTitle=function(e){return e.category.level?e.category.name:a.default.get("THREADS_ON_INDEX")?a.default.get("SETTINGS").index_header?a.default.get("SETTINGS").index_header:a.default.get("SETTINGS").forum_name:gettext("Threads")},r.isThreadChanged=o;var n,a=(n=e("../.."))&&n.__esModule?n:{default:n};function o(e,t){return 0<=[e.title===t.title,e.weight===t.weight,e.category===t.category,e.last_post===t.last_post,e.last_poster_name===t.last_poster_name].indexOf(!1)}},{"../..":302}],271:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.GuestNav=r.GuestMenu=r.CompactGuestNav=void 0;var n=f(e("react")),o=f(e("../avatar")),l=f(e("../navbar-search")),i=f(e("../register-button")),u=f(e("../sign-in.js")),s=(f(e("../..")),f(e("../../services/mobile-navbar-dropdown"))),c=f(e("../../services/modal"));function f(e){return e&&e.__esModule?e:{default:e}}function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function p(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t,r){return t&&p(e.prototype,t),r&&p(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function y(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=v(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=v(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var g=function(){y(t,n.default.Component);var e=h(t);function t(){return d(this,t),e.apply(this,arguments)}return m(t,[{key:"showSignInModal",value:function(){c.default.show(u.default)}},{key:"render",value:function(){return n.default.createElement("ul",{className:"dropdown-menu user-dropdown dropdown-menu-right",role:"menu"},n.default.createElement("li",{className:"guest-preview"},n.default.createElement("h4",null,gettext("You are browsing as guest.")),n.default.createElement("p",null,gettext("Sign in or register to start and participate in discussions.")),n.default.createElement("div",{className:"row"},n.default.createElement("div",{className:"col-xs-6"},n.default.createElement("button",{className:"btn btn-default btn-sign-in btn-block",onClick:this.showSignInModal,type:"button"},gettext("Sign in"))),n.default.createElement("div",{className:"col-xs-6"},n.default.createElement(i.default,{className:"btn-primary btn-register btn-block"},gettext("Register"))))))}}]),t}();r.GuestMenu=g;var _=function(){y(t,g);var e=h(t);function t(){return d(this,t),e.apply(this,arguments)}return m(t,[{key:"render",value:function(){return n.default.createElement("div",{className:"nav nav-guest"},n.default.createElement("button",{className:"btn navbar-btn btn-default btn-sign-in",onClick:this.showSignInModal,type:"button"},gettext("Sign in")),n.default.createElement(i.default,{className:"navbar-btn btn-primary btn-register"},gettext("Register")),n.default.createElement("div",{className:"navbar-left"},n.default.createElement(l.default,null)))}}]),t}();r.GuestNav=_;var E=function(){y(t,n.default.Component);var e=h(t);function t(){return d(this,t),e.apply(this,arguments)}return m(t,[{key:"showGuestMenu",value:function(){s.default.show(g)}},{key:"render",value:function(){return n.default.createElement("button",{type:"button",onClick:this.showGuestMenu},n.default.createElement(o.default,{size:"64"}))}}]),t}();r.CompactGuestNav=E},{"../..":302,"../../services/mobile-navbar-dropdown":370,"../../services/modal":371,"../avatar":6,"../navbar-search":77,"../register-button":198,"../sign-in.js":211,react:"react"}],272:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.UserMenu=r.CompactUserMenu=void 0,r.select=function(e){return e.auth};var n,o=(n=e("react"))&&n.__esModule?n:{default:n},l=e("./guest-nav"),i=e("./user-nav");function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t,r){return t&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function f(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}function d(e,t){return(d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function p(r){var 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}}();return function(){var e,t=m(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=m(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var y=function(){f(t,o.default.Component);var e=p(t);function t(){return u(this,t),e.apply(this,arguments)}return c(t,[{key:"render",value:function(){return this.props.isAuthenticated?o.default.createElement(i.UserNav,{user:this.props.user}):o.default.createElement(l.GuestNav,null)}}]),t}();r.UserMenu=y;var b=function(){f(t,o.default.Component);var e=p(t);function t(){return u(this,t),e.apply(this,arguments)}return c(t,[{key:"render",value:function(){return this.props.isAuthenticated?o.default.createElement(i.CompactUserNav,{user:this.props.user}):o.default.createElement(l.CompactGuestNav,null)}}]),t}();r.CompactUserMenu=b},{"./guest-nav":271,"./user-nav":273,react:"react"}],273:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.CompactUserNav=void 0,r.PrivateThreadsBadge=w,r.UserMenu=void 0,r.UserNav=function(e){var t=e.user;return n.default.createElement("ul",{className:"ul nav navbar-nav nav-user"},n.default.createElement("li",null,n.default.createElement(u.default,null)),n.default.createElement(O,{user:t}),n.default.createElement("li",{className:"dropdown"},n.default.createElement("a",{"aria-haspopup":"true","aria-expanded":"false",className:"dropdown-toggle","data-toggle":"dropdown",href:t.url,role:"button"},n.default.createElement(o.default,{user:t,size:"64"})),n.default.createElement(E,{user:t})))},r.UserPrivateThreadsLink=O,r.selectUserMenu=j;var n=p(e("react")),a=e("react-redux"),o=p(e("../avatar")),l=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../change-avatar/root")),u=p(e("../navbar-search")),s=p(e("../..")),c=p(e("../../services/mobile-navbar-dropdown")),f=p(e("../../services/modal"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function p(e){return e&&e.__esModule?e:{default:e}}function m(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t,r){return t&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function h(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&v(e,t)}function v(e,t){return(v=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function g(r){var 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}}();return function(){var e,t=_(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=_(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function _(e){return(_=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var E=function(){h(t,n.default.Component);var e=g(t);function t(){return m(this,t),e.apply(this,arguments)}return b(t,[{key:"logout",value:function(){window.confirm(gettext("Are you sure you want to sign out?"))&&$("#hidden-logout-form").submit()}},{key:"changeAvatar",value:function(){f.default.show((0,a.connect)(l.select)(l.default))}},{key:"render",value:function(){var e=this.props.user;return n.default.createElement("ul",{className:"dropdown-menu user-dropdown dropdown-menu-right",role:"menu"},n.default.createElement("li",{className:"dropdown-header"},n.default.createElement("strong",null,e.username),n.default.createElement("div",{className:"row user-stats"},n.default.createElement("div",{className:"col-sm-3"},n.default.createElement("span",{className:"material-icon"},"message"),e.posts),n.default.createElement("div",{className:"col-sm-3"},n.default.createElement("span",{className:"material-icon"},"forum"),e.threads),n.default.createElement("div",{className:"col-sm-3"},n.default.createElement("span",{className:"material-icon"},"favorite"),e.followers),n.default.createElement("div",{className:"col-sm-3"},n.default.createElement("span",{className:"material-icon"},"favorite_outline"),e.following))),n.default.createElement("li",{className:"divider"}),n.default.createElement("li",null,n.default.createElement("a",{href:e.url},n.default.createElement("span",{className:"material-icon"},"account_circle"),gettext("See your profile"))),n.default.createElement("li",null,n.default.createElement("a",{href:s.default.get("USERCP_URL")},n.default.createElement("span",{className:"material-icon"},"done_all"),gettext("Change options"))),n.default.createElement("li",null,n.default.createElement("button",{className:"btn-link",onClick:this.changeAvatar,type:"button"},n.default.createElement("span",{className:"material-icon"},"portrait"),gettext("Change avatar"))),!!e.acl.can_use_private_threads&&n.default.createElement("li",null,n.default.createElement("a",{href:s.default.get("PRIVATE_THREADS_URL")},n.default.createElement("span",{className:"material-icon"},"message"),gettext("Private threads"),n.default.createElement(w,{user:e}))),n.default.createElement("li",{className:"divider"}),n.default.createElement("li",{className:"dropdown-buttons"},n.default.createElement("button",{className:"btn btn-default btn-block",onClick:this.logout,type:"button"},gettext("Log out"))))}}]),t}();function w(e){var t=e.user;return t.unread_private_threads?n.default.createElement("span",{className:"badge"},t.unread_private_threads):null}function O(e){var t=e.user;if(!t.acl.can_use_private_threads)return null;var r=null,r=t.unread_private_threads?gettext("You have unread private threads!"):gettext("Private threads");return n.default.createElement("li",null,n.default.createElement("a",{className:"navbar-icon",href:s.default.get("PRIVATE_THREADS_URL"),title:r},n.default.createElement("span",{className:"material-icon"},"message"),0<t.unread_private_threads&&n.default.createElement("span",{className:"badge"},t.unread_private_threads)))}function j(e){return{user:e.auth.user}}r.UserMenu=E;var P=function(){h(t,n.default.Component);var e=g(t);function t(){return m(this,t),e.apply(this,arguments)}return b(t,[{key:"showUserMenu",value:function(){c.default.showConnected("user-menu",(0,a.connect)(j)(E))}},{key:"render",value:function(){return n.default.createElement("button",{type:"button",onClick:this.showUserMenu},n.default.createElement(o.default,{user:this.props.user,size:"50"}))}}]),t}();r.CompactUserNav=P},{"../..":302,"../../services/mobile-navbar-dropdown":370,"../../services/modal":371,"../avatar":6,"../change-avatar/root":25,"../navbar-search":77,react:"react","react-redux":"react-redux"}],274:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.StatusLabel=r.StatusIcon=void 0,r.getStatusClassName=b,r.getStatusDescription=h;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t,r){return t&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=d(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=d(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){return(d=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){s(t,o.default.Component);var e=f(t);function t(){return l(this,t),e.apply(this,arguments)}return u(t,[{key:"getClass",value:function(){return b(this.props.status)}},{key:"render",value:function(){return o.default.createElement("span",{className:this.getClass()},this.props.children)}}]),t}();r.default=p;var m=function(){s(t,o.default.Component);var e=f(t);function t(){return l(this,t),e.apply(this,arguments)}return u(t,[{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 o.default.createElement("span",{className:"material-icon status-icon"},this.getIcon())}}]),t}();r.StatusIcon=m;var y=function(){s(t,o.default.Component);var e=f(t);function t(){return l(this,t),e.apply(this,arguments)}return u(t,[{key:"getHelp",value:function(){return h(this.props.user,this.props.status)}},{key:"getLabel",value:function(){return this.props.status.is_banned?gettext("Banned"):this.props.status.is_hidden?gettext("Hidden"):this.props.status.is_online_hidden?gettext("Online (hidden)"):this.props.status.is_offline_hidden?gettext("Offline (hidden)"):this.props.status.is_online?gettext("Online"):this.props.status.is_offline?gettext("Offline"):void 0}},{key:"render",value:function(){return o.default.createElement("span",{className:this.props.className||"status-label",title:this.getHelp()},this.getLabel())}}]),t}();function b(e){var t="";return 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}function h(e,t){return t.is_banned?t.banned_until?interpolate(gettext("%(username)s is banned until %(ban_expires)s"),{username:e.username,ban_expires:t.banned_until.format("LL, LT")},!0):interpolate(gettext("%(username)s is banned"),{username:e.username},!0):t.is_hidden?interpolate(gettext("%(username)s is hiding presence"),{username:e.username},!0):t.is_online_hidden?interpolate(gettext("%(username)s is online (hidden)"),{username:e.username},!0):t.is_offline_hidden?interpolate(gettext("%(username)s was last seen %(last_click)s (hidden)"),{username:e.username,last_click:t.last_click.fromNow()},!0):t.is_online?interpolate(gettext("%(username)s is online"),{username:e.username},!0):t.is_offline?interpolate(gettext("%(username)s was last seen %(last_click)s"),{username:e.username,last_click:t.last_click.fromNow()},!0):void 0}r.StatusLabel=y},{react:"react"}],275:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../avatar")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../utils/random"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(a,o.default.Component);var e,t,r,n=d(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{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 o.default.createElement("li",{className:this.getClassName()},o.default.createElement("div",{className:"change-avatar"},o.default.createElement("span",{className:"user-avatar"},o.default.createElement(l.default,{size:"100"}))),o.default.createElement("div",{className:"change-author"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,100)+"px"}}," ")),o.default.createElement("div",{className:"change"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,70)+"px"}}," "),o.default.createElement("span",{className:"material-icon"},"arrow_forward"),o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,70)+"px"}}," ")),o.default.createElement("div",{className:"change-date"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(80,140)+"px"}}," ")))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../../utils/random":388,"../avatar":6,react:"react"}],276:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../avatar"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"renderUserAvatar",value:function(){return this.props.change.changed_by?o.default.createElement("a",{href:this.props.change.changed_by.url,className:"user-avatar-wrapper"},o.default.createElement(l.default,{user:this.props.change.changed_by,size:"100"})):o.default.createElement("span",{className:"user-avatar-wrapper"},o.default.createElement(l.default,{size:"100"}))}},{key:"renderUsername",value:function(){return this.props.change.changed_by?o.default.createElement("a",{href:this.props.change.changed_by.url,className:"item-title"},this.props.change.changed_by.username):o.default.createElement("span",{className:"item-title"},this.props.change.changed_by_username)}},{key:"render",value:function(){return o.default.createElement("li",{className:"list-group-item",key:this.props.change.id},o.default.createElement("div",{className:"change-avatar"},this.renderUserAvatar()),o.default.createElement("div",{className:"change-author"},this.renderUsername()),o.default.createElement("div",{className:"change"},o.default.createElement("span",{className:"old-username"},this.props.change.old_username),o.default.createElement("span",{className:"material-icon"},"arrow_forward"),o.default.createElement("span",{className:"new-username"},this.props.change.new_username)),o.default.createElement("div",{className:"change-date"},o.default.createElement("abbr",{title:this.props.change.changed_on.format("LLL")},this.props.change.changed_on.fromNow())))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"../avatar":6,react:"react"}],277:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getEmptyMessage",value:function(){return this.props.emptyMessage?this.props.emptyMessage:gettext("No name changes have been recorded for your account.")}},{key:"render",value:function(){return o.default.createElement("div",{className:"username-history ui-ready"},o.default.createElement("ul",{className:"list-group"},o.default.createElement("li",{className:"list-group-item empty-message"},this.getEmptyMessage())))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],278:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./change-preview"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return o.default.createElement("div",{className:"username-history ui-preview"},o.default.createElement("ul",{className:"list-group"},[0,1,2].map(function(e){return o.default.createElement(l.default,{hiddenOnMobile:0<e,key:e})})))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./change-preview":275,react:"react"}],279:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./change"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"username-history ui-ready"},o.default.createElement("ul",{className:"list-group"},this.props.changes.map(function(e){return o.default.createElement(l.default,{change:e,key:e.id})})))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./change":276,react:"react"}],280:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./list-empty")),i=n(e("./list-ready")),u=n(e("./list-preview"));function n(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=d(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=d(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){return(d=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(a,o.default.Component);var e,t,r,n=f(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return this.props.isLoaded?this.props.changes.length?o.default.createElement(i.default,{changes:this.props.changes}):o.default.createElement(l.default,{emptyMessage:this.props.emptyMessage}):o.default.createElement(u.default,null)}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"./list-empty":277,"./list-preview":278,"./list-ready":279,react:"react"}],281:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.showStatus,r=e.user,n=r.rank,a="panel user-card";n.css_class&&(a+=" user-card-"+n.css_class);return o.default.createElement("div",{className:a},o.default.createElement("div",{className:"panel-body"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-xs-3 user-card-left"},o.default.createElement("div",{className:"user-card-small-avatar"},o.default.createElement("a",{href:r.url},o.default.createElement(l.default,{size:"50",size2x:"80",user:r})))),o.default.createElement("div",{className:"col-xs-9 col-sm-12 user-card-body"},o.default.createElement("div",{className:"user-card-avatar"},o.default.createElement("a",{href:r.url},o.default.createElement(l.default,{size:"150",size2x:"200",user:r}))),o.default.createElement("div",{className:"user-card-username"},o.default.createElement("a",{href:r.url},r.username)),o.default.createElement("div",{className:"user-card-title"},o.default.createElement(u.default,{rank:n,title:r.title})),o.default.createElement("div",{className:"user-card-stats"},o.default.createElement(i.default,{showStatus:t,user:r}))))))};var o=n(e("react")),l=n(e("../../avatar")),i=n(e("./stats")),u=n(e("./user-title"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../../avatar":6,"./stats":282,"./user-title":283,react:"react"}],282:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.Followers=d,r.JoinDate=s,r.Posts=c,r.Status=l,r.Threads=f,r.default=function(e){var t=e.showStatus,r=e.user;return a.default.createElement("ul",{className:"list-unstyled"},a.default.createElement(l,{showStatus:t,user:r}),a.default.createElement(s,{user:r}),a.default.createElement("li",{className:"user-stat-divider"}),a.default.createElement(c,{user:r}),a.default.createElement(f,{user:r}),a.default.createElement(d,{user:r}))},r.getStatClassName=p;var n,a=(n=e("react"))&&n.__esModule?n:{default:n},o=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../user-status"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){var t=e.showStatus,r=e.user;return t?a.default.createElement("li",{className:"user-stat-status"},a.default.createElement(o.default,{status:r.status},a.default.createElement(o.StatusLabel,{status:r.status,user:r}))):null}function s(e){var t=e.user.joined_on,r=interpolate(gettext("Joined on %(joined_on)s"),{joined_on:t.format("LL, LT")},!0),n=interpolate(gettext("Joined %(joined_on)s"),{joined_on:t.fromNow()},!0);return a.default.createElement("li",{className:"user-stat-join-date"},a.default.createElement("abbr",{title:r},n))}function c(e){var t=e.user,r=p("user-stat-posts",t.posts),n=ngettext("%(posts)s post","%(posts)s posts",t.posts);return a.default.createElement("li",{className:r},interpolate(n,{posts:t.posts},!0))}function f(e){var t=e.user,r=p("user-stat-threads",t.threads),n=ngettext("%(threads)s thread","%(threads)s threads",t.threads);return a.default.createElement("li",{className:r},interpolate(n,{threads:t.threads},!0))}function d(e){var t=e.user,r=p("user-stat-followers",t.followers),n=ngettext("%(followers)s follower","%(followers)s followers",t.followers);return a.default.createElement("li",{className:r},interpolate(n,{followers:t.followers},!0))}function p(e,t){return 0===t?e+" user-stat-empty":e}},{"../../user-status":274,react:"react"}],283:[function(e,t,r){arguments[4][130][0].apply(r,arguments)},{dup:130,react:"react"}],284:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=e.cols,r=e.isReady,n=e.showStatus,a=e.users,o="col-xs-12 col-sm-4";4===t&&(o+=" col-md-3");return r?l.default.createElement("div",{className:"users-cards-list ui-ready"},l.default.createElement("div",{className:"row"},a.map(function(e){return l.default.createElement("div",{className:o,key:e.id},l.default.createElement(i.default,{showStatus:n,user:e}))}))):l.default.createElement(u.default,{colClassName:o,cols:t})};var l=n(e("react")),i=n(e("./card")),u=n(e("./preview"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./card":281,"./preview":286,react:"react"}],285:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../avatar")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/random"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(a,o.default.Component);var e,t,r,n=d(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return o.default.createElement("div",{className:"panel user-card user-card-preview"},o.default.createElement("div",{className:"panel-body"},o.default.createElement("div",{className:"row"},o.default.createElement("div",{className:"col-xs-3 user-card-left"},o.default.createElement("div",{className:"user-card-small-avatar"},o.default.createElement("span",null,o.default.createElement(l.default,{size:"50",size2x:"80"})))),o.default.createElement("div",{className:"col-xs-9 col-sm-12 user-card-body"},o.default.createElement("div",{className:"user-card-avatar"},o.default.createElement("span",null,o.default.createElement(l.default,{size:"150",size2x:"200"}))),o.default.createElement("div",{className:"user-card-username"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(60,150)+"px"}}," ")),o.default.createElement("div",{className:"user-card-title"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(60,150)+"px"}}," ")),o.default.createElement("div",{className:"user-card-stats"},o.default.createElement("ul",{className:"list-unstyled"},o.default.createElement("li",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,70)+"px"}}," ")),o.default.createElement("li",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,70)+"px"}}," ")),o.default.createElement("li",{className:"user-stat-divider"}),o.default.createElement("li",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,70)+"px"}}," ")),o.default.createElement("li",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,70)+"px"}}," "))))))))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../../../utils/random":388,"../../avatar":6,react:"react"}],286:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var r=e.colClassName,t=e.cols,n=Array.apply(null,{length:t}).map(Number.call,Number);return a.default.createElement("div",{className:"users-cards-list ui-preview"},a.default.createElement("div",{className:"row"},n.map(function(e){var t=r;return 0!==e&&(t+=" hidden-xs"),3===e&&(t+=" hidden-sm"),a.default.createElement("div",{className:t,key:e},a.default.createElement(o.default,null))})))};var a=n(e("react")),o=n(e("./card"));function n(e){return e&&e.__esModule?e:{default:e}}},{"./card":285,react:"react"}],287:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=s(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=s(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var c=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getEmptyMessage",value:function(){return interpolate(gettext("No users have posted any new messages during last %(days)s days."),{days:this.props.trackedPeriod},!0)}},{key:"render",value:function(){return o.default.createElement("div",{className:"active-posters-list"},o.default.createElement("div",{className:"container"},o.default.createElement("p",{className:"lead"},this.getEmptyMessage())))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=c},{react:"react"}],288:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../avatar")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/random"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(a,o.default.Component);var e,t,r,n=d(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{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 o.default.createElement("li",{className:this.getClassName()},o.default.createElement("div",{className:"rank-user-avatar"},o.default.createElement("span",null,o.default.createElement(l.default,{size:"50"}))),o.default.createElement("div",{className:"rank-user"},o.default.createElement("div",{className:"user-name"},o.default.createElement("span",{className:"item-title"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,80)+"px"}}," "))),o.default.createElement("div",{className:"user-details"},o.default.createElement("span",{className:"user-status"},o.default.createElement("span",{className:"status-icon ui-preview-text"}," "),o.default.createElement("span",{className:"status-label ui-preview-text hidden-xs hidden-sm",style:{width:u.int(30,50)+"px"}}," ")),o.default.createElement("span",{className:"rank-name"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,50)+"px"}}," ")),o.default.createElement("span",{className:"user-title hidden-xs hidden-sm"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(30,50)+"px"}}," "))),o.default.createElement("div",{className:"user-compact-stats visible-xs-block"},o.default.createElement("span",{className:"rank-position"},o.default.createElement("strong",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(20,30)+"px"}}," ")),o.default.createElement("small",null,gettext("Rank"))),o.default.createElement("span",{className:"rank-posts-counted"},o.default.createElement("strong",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(20,30)+"px"}}," ")),o.default.createElement("small",null,gettext("Ranked posts"))))),o.default.createElement("div",{className:"rank-position hidden-xs"},o.default.createElement("strong",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(20,30)+"px"}}," ")),o.default.createElement("small",null,gettext("Rank"))),o.default.createElement("div",{className:"rank-posts-counted hidden-xs"},o.default.createElement("strong",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(20,30)+"px"}}," ")),o.default.createElement("small",null,gettext("Ranked posts"))),o.default.createElement("div",{className:"rank-posts-total hidden-xs"},o.default.createElement("strong",null,o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(20,30)+"px"}}," ")),o.default.createElement("small",null,gettext("Total posts"))))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../../../utils/random":388,"../../avatar":6,react:"react"}],289:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=a(e("react")),l=e("react-router"),u=a(e("../../avatar")),s=n(e("../../user-status")),c=a(e("../../..")),f=n(e("../../../utils/random"));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function n(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var n,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e){"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((n=o?Object.getOwnPropertyDescriptor(e,l):null)&&(n.get||n.set)?Object.defineProperty(a,l,n):a[l]=e[l])}return a.default=e,r&&r.set(e,a),a}function a(e){return e&&e.__esModule?e:{default:e}}function p(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function m(e,t){return(m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function y(r){var 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}}();return function(){var e,t=b(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=b(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function b(e){return(b=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var h=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&m(e,t)}(a,o.default.Component);var e,t,r,n=y(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getClassName",value:function(){return this.props.rank.css_class?"list-group-item list-group-rank-"+this.props.rank.css_class:"list-group-item"}},{key:"getUserStatus",value:function(){return this.props.user.status?o.default.createElement(s.default,{user:this.props.user,status:this.props.user.status},o.default.createElement(s.StatusIcon,{user:this.props.user,status:this.props.user.status}),o.default.createElement(s.StatusLabel,{user:this.props.user,status:this.props.user.status,className:"status-label hidden-xs hidden-sm"})):o.default.createElement("span",{className:"user-status"},o.default.createElement("span",{className:"status-icon ui-preview-text"}," "),o.default.createElement("span",{className:"status-label ui-preview-text hidden-xs hidden-sm",style:{width:f.int(30,50)+"px"}}," "))}},{key:"getRankName",value:function(){if(!this.props.rank.is_tab)return o.default.createElement("span",{className:"rank-name item-title"},this.props.rank.name);var e=c.default.get("USERS_LIST_URL")+this.props.rank.slug+"/";return o.default.createElement(l.Link,{to:e,className:"rank-name item-title"},this.props.rank.name)}},{key:"getUserTitle",value:function(){return this.props.user.title?o.default.createElement("span",{className:"user-title hidden-xs hidden-sm"},this.props.user.title):null}},{key:"render",value:function(){return o.default.createElement("li",{className:this.getClassName()},o.default.createElement("div",{className:"rank-user-avatar"},o.default.createElement("a",{href:this.props.user.url},o.default.createElement(u.default,{user:this.props.user,size:50,size2x:64}))),o.default.createElement("div",{className:"rank-user"},o.default.createElement("div",{className:"user-name"},o.default.createElement("a",{href:this.props.user.url,className:"item-title"},this.props.user.username)),o.default.createElement("div",{className:"user-details"},this.getUserStatus(),this.getRankName(),this.getUserTitle()),o.default.createElement("div",{className:"user-compact-stats visible-xs-block"},o.default.createElement("span",{className:"rank-position"},o.default.createElement("strong",null,"#",this.props.counter),o.default.createElement("small",null,gettext("Rank"))),o.default.createElement("span",{className:"rank-posts-counted"},o.default.createElement("strong",null,this.props.user.meta.score),o.default.createElement("small",null,gettext("Ranked posts"))))),o.default.createElement("div",{className:"rank-position hidden-xs"},o.default.createElement("strong",null,"#",this.props.counter),o.default.createElement("small",null,gettext("Rank"))),o.default.createElement("div",{className:"rank-posts-counted hidden-xs"},o.default.createElement("strong",null,this.props.user.meta.score),o.default.createElement("small",null,gettext("Ranked posts"))),o.default.createElement("div",{className:"rank-posts-total hidden-xs"},o.default.createElement("strong",null,this.props.user.posts),o.default.createElement("small",null,gettext("Total posts"))))}}])&&p(e.prototype,t),r&&p(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=h},{"../../..":302,"../../../utils/random":388,"../../avatar":6,"../../user-status":274,react:"react","react-router":"react-router"}],290:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./list-item-preview")),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../../utils/random"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function n(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function f(e,t){return(f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function d(r){var 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}}();return function(){var e,t=a(r);return function(e,t){{if(t&&("object"===i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=a(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(a,o.default.Component);var e,t,r,n=d(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return o.default.createElement("div",{className:"active-posters-list"},o.default.createElement("div",{className:"container"},o.default.createElement("p",{className:"lead ui-preview"},o.default.createElement("span",{className:"ui-preview-text",style:{width:u.int(50,220)+"px"}}," ")),o.default.createElement("div",{className:"active-posters ui-preview"},o.default.createElement("ul",{className:"list-group"},[0,1,2].map(function(e){return o.default.createElement(l.default,{hiddenOnMobile:0<e,key:e})})))))}}])&&c(e.prototype,t),r&&c(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../../../utils/random":388,"./list-item-preview":288,react:"react"}],291:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("./list-item"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"getLeadMessage",value:function(){var e=ngettext("%(posters)s top poster from last %(days)s days.","%(posters)s top posters from last %(days)s days.",this.props.count);return interpolate(e,{posters:this.props.count,days:this.props.trackedPeriod},!0)}},{key:"render",value:function(){return o.default.createElement("div",{className:"active-posters-list"},o.default.createElement("div",{className:"container"},o.default.createElement("p",{className:"lead"},this.getLeadMessage()),o.default.createElement("div",{className:"active-posters ui-ready"},o.default.createElement("ul",{className:"list-group"},this.props.users.map(function(e,t){return o.default.createElement(l.default,{user:e,rank:e.rank,counter:t+1,key:e.id})})))))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"./list-item":289,react:"react"}],292:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),i=o(e("./list-empty")),u=o(e("./list-preview")),s=o(e("./list-ready")),c=o(e("../../..")),f=e("../../../reducers/users"),d=o(e("../../../services/polls")),p=o(e("../../../services/store")),m=o(e("../../../services/page-title"));function o(e){return e&&e.__esModule?e:{default:e}}function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function b(e,t){return(b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function h(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return v(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var g=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&b(e,t)}(l,n.default.Component);var e,t,r,o=h(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=v(t),a=function(e){p.default.dispatch((0,f.hydrate)(e.results)),t.setState({isLoaded:!0,trackedPeriod:e.tracked_period,count:e.count})},(n="update")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,c.default.has("USERS")?t.initWithPreloadedData(c.default.pop("USERS")):t.initWithoutPreloadedData(),t.startPolling(),t}return e=l,(t=[{key:"initWithPreloadedData",value:function(e){this.state={isLoaded:!0,trackedPeriod:e.tracked_period,count:e.count},p.default.dispatch((0,f.hydrate)(e.results))}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1}}},{key:"startPolling",value:function(){d.default.start({poll:"active-posters",url:c.default.get("USERS_API"),data:{list:"active"},frequency:9e4,update:this.update})}},{key:"componentDidMount",value:function(){m.default.set({title:this.props.route.extra.name,parent:gettext("Users")})}},{key:"componentWillUnmount",value:function(){d.default.stop("active-posters")}},{key:"render",value:function(){return this.state.isLoaded?0<this.state.count?n.default.createElement(s.default,{users:this.props.users,trackedPeriod:this.state.trackedPeriod,count:this.state.count}):n.default.createElement(i.default,{trackedPeriod:this.state.trackedPeriod}):n.default.createElement(u.default,null)}}])&&y(e.prototype,t),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=g},{"../../..":302,"../../../reducers/users":364,"../../../services/page-title":373,"../../../services/polls":374,"../../../services/store":377,"./list-empty":287,"./list-preview":290,"./list-ready":291,react:"react"}],293:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var r=e.baseUrl,t=e.lists;return n.default.createElement("ul",{className:"nav nav-pills"},t.map(function(e){var t=i(r,e);return n.default.createElement(o.default,{path:t,key:t},n.default.createElement(a.Link,{to:t},e.name))}))};var n=l(e("react")),a=e("react-router"),o=l(e("../li"));l(e("../.."));function l(e){return e&&e.__esModule?e:{default:e}}var i=function(e,t){var r=e;return"rank"===t.component?r+=t.slug:r+=t.component,r+"/"}},{"../..":302,"../li":57,react:"react","react-router":"react-router"}],294:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=n(e("../../users-list"));function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var f=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}(a,o.default.Component);var e,t,r,n=s(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"shouldComponentUpdate",value:function(){return!1}},{key:"render",value:function(){return o.default.createElement("div",null,o.default.createElement(l.default,{cols:4,isReady:!1}))}}])&&i(e.prototype,t),r&&i(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=f},{"../../users-list":284,react:"react"}],295:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.default.createElement("div",null,n.default.createElement(o.default,{cols:4,isReady:!0,showStatus:!0,users:e.users}),n.default.createElement(a.default,e))};var n=l(e("react")),a=l(e("./pager")),o=l(e("../../users-list"));function l(e){return e&&e.__esModule?e:{default:e}}},{"../../users-list":284,"./pager":296,react:"react"}],296:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.FirstPage=u,r.LastPage=f,r.More=d,r.NextPage=c,r.Pager=i,r.PreviousPage=s,r.default=function(e){return 1===e.pages?null:n.default.createElement("div",{className:"row row-toolbar"},n.default.createElement("div",{className:"col-xs-12 text-center visible-xs-block"},n.default.createElement(d,{more:e.more}),n.default.createElement("div",{className:"toolbar-vertical-spacer"})),n.default.createElement("div",{className:"col-md-7"},n.default.createElement("div",{className:"row"},n.default.createElement("div",{className:"col-sm-4 col-md-5"},n.default.createElement(i,e)),n.default.createElement("div",{className:"col-sm-8 col-md-7 hidden-xs"},n.default.createElement(d,{more:e.more})))))};var n=l(e("react")),a=e("react-router"),o=l(e("../../../utils/reset-scroll"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){return n.default.createElement("div",{className:"row row-paginator"},n.default.createElement("div",{className:"col-xs-3"},n.default.createElement(u,e)),n.default.createElement("div",{className:"col-xs-3"},n.default.createElement(s,e)),n.default.createElement("div",{className:"col-xs-3"},n.default.createElement(c,e)),n.default.createElement("div",{className:"col-xs-3"},n.default.createElement(f,e)))}function u(e){return e.isLoaded&&e.first?n.default.createElement(a.Link,{className:"btn btn-default btn-block btn-icon btn-outline",onClick:o.default,to:e.baseUrl,title:gettext("Go to first page")},n.default.createElement("span",{className:"material-icon"},"first_page")):n.default.createElement("span",{className:"btn btn-default btn-block btn-icon btn-outline disabled",title:gettext("Go to first page")},n.default.createElement("span",{className:"material-icon"},"first_page"))}function s(e){if(e.isLoaded&&1<e.page){var t="";return e.previous&&(t=e.previous+"/"),n.default.createElement(a.Link,{className:"btn btn-default btn-block btn-icon btn-outline",onClick:o.default,to:e.baseUrl+t,title:gettext("Go to previous page")},n.default.createElement("span",{className:"material-icon"},"chevron_left"))}return n.default.createElement("span",{className:"btn btn-default btn-block btn-icon btn-outline disabled",title:gettext("Go to previous page")},n.default.createElement("span",{className:"material-icon"},"chevron_left"))}function c(e){if(e.isLoaded&&e.more){var t="";return e.next&&(t=e.next+"/"),n.default.createElement(a.Link,{className:"btn btn-default btn-block btn-icon btn-outline",onClick:o.default,to:e.baseUrl+t,title:gettext("Go to next page")},n.default.createElement("span",{className:"material-icon"},"chevron_right"))}return n.default.createElement("span",{className:"btn btn-default btn-block btn-icon btn-outline disabled",title:gettext("Go to next page")},n.default.createElement("span",{className:"material-icon"},"chevron_right"))}function f(e){return e.isLoaded&&e.last?n.default.createElement(a.Link,{className:"btn btn-default btn-block btn-icon btn-outline",onClick:o.default,to:e.baseUrl+e.last+"/",title:gettext("Go to last page")},n.default.createElement("span",{className:"material-icon"},"last_page")):n.default.createElement("span",{className:"btn btn-default btn-block btn-icon btn-outline disabled",title:gettext("Go to last page")},n.default.createElement("span",{className:"material-icon"},"last_page"))}function d(e){var t=null,t=e.more?(t=ngettext("There is %(more)s more member with this role.","There are %(more)s more members with this role.",e.more),interpolate(t,{more:e.more},!0)):gettext("There are no more members with this role.");return n.default.createElement("p",null,t)}},{"../../../utils/reset-scroll":389,react:"react","react-router":"react-router"}],297:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=o(e("react")),i=o(e("../../page-lead")),u=o(e("./list")),s=o(e("./list-loading")),c=o(e("../../..")),f=e("../../../reducers/users"),d=o(e("../../../services/polls")),p=o(e("../../../services/store")),m=o(e("../../../services/page-title"));function o(e){return e&&e.__esModule?e:{default:e}}function y(){return(y=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t){return(h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function v(r){var 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}}();return function(){var e,t=l(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return g(e)}(this,n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function g(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var _=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&h(e,t)}(l,n.default.Component);var e,t,r,o=v(l);function l(e){var t,r,n,a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),t=o.call(this,e),r=g(t),a=function(e){p.default.dispatch((0,f.hydrate)(e.results)),e.isLoaded=!0,t.setState(e)},(n="update")in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,c.default.has("USERS")?t.initWithPreloadedData(c.default.pop("USERS")):t.initWithoutPreloadedData(),t.startPolling(e.params.page||1),t}return e=l,(t=[{key:"initWithPreloadedData",value:function(e){this.state=Object.assign(e,{isLoaded:!0}),p.default.dispatch((0,f.hydrate)(e.results))}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1}}},{key:"startPolling",value:function(e){d.default.start({poll:"rank-users",url:c.default.get("USERS_API"),data:{rank:this.props.route.rank.id,page:e},frequency:9e4,update:this.update})}},{key:"componentDidMount",value:function(){m.default.set({title:this.props.route.rank.name,page:this.props.params.page||null,parent:gettext("Users")})}},{key:"componentWillUnmount",value:function(){d.default.stop("rank-users")}},{key:"componentWillReceiveProps",value:function(e){this.props.params.page!==e.params.page&&(m.default.set({title:this.props.route.rank.name,page:e.params.page||null,parent:gettext("Users")}),this.setState({isLoaded:!1}),d.default.stop("rank-users"),this.startPolling(e.params.page))}},{key:"getClassName",value:function(){return this.props.route.rank.css_class?"rank-users-list rank-users-"+this.props.route.rank.css_class:"rank-users-list"}},{key:"getRankDescription",value:function(){return this.props.route.rank.description?n.default.createElement("div",{className:"rank-description"},n.default.createElement(i.default,{copy:this.props.route.rank.description.html})):null}},{key:"getComponent",value:function(){if(this.state.isLoaded){if(0<this.state.count){var e=c.default.get("USERS_LIST_URL")+this.props.route.rank.slug+"/";return n.default.createElement(u.default,y({baseUrl:e,users:this.props.users},this.state))}return n.default.createElement("p",{className:"lead"},gettext("There are no users with this rank at the moment."))}return n.default.createElement(s.default,null)}},{key:"render",value:function(){return n.default.createElement("div",{className:this.getClassName()},n.default.createElement("div",{className:"container"},this.getRankDescription(),this.getComponent()))}}])&&b(e.prototype,t),r&&b(e,r),Object.defineProperty(e,"prototype",{writable:!1}),l}();r.default=_},{"../../..":302,"../../../reducers/users":364,"../../../services/page-title":373,"../../../services/polls":374,"../../../services/store":377,"../../page-lead":92,"./list":295,"./list-loading":294,react:"react"}],298:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0,r.paths=function(){var t=[];return c.default.get("USERS_LISTS").forEach(function(e){"rank"===e.component?(t.push({path:c.default.get("USERS_LIST_URL")+e.slug+"/:page/",component:(0,n.connect)(h)(u.default),rank:e}),t.push({path:c.default.get("USERS_LIST_URL")+e.slug+"/",component:(0,n.connect)(h)(u.default),rank:e})):"active-posters"===e.component&&t.push({path:c.default.get("USERS_LIST_URL")+e.component+"/",component:(0,n.connect)(h)(i.default),extra:{name:e.name}})}),t},r.select=h;var o=f(e("react")),n=e("react-redux"),l=(f(e("../dropdown-toggle")),f(e("./nav"))),i=f(e("./active-posters/root")),u=f(e("./rank/root")),s=f(e("../with-dropdown")),c=f(e("../.."));function f(e){return e&&e.__esModule?e:{default:e}}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t){return(p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function m(r){var 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}}();return function(){var e,t=y(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=y(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var b=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(a,s.default);var e,t,r,n=m(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"render",value:function(){return o.default.createElement("div",{className:"page page-users-lists"},o.default.createElement("div",{className:"page-header-bg"},o.default.createElement("div",{className:"page-header"},o.default.createElement("div",{className:"container"},o.default.createElement("h1",null,gettext("Users"))),o.default.createElement("div",{className:"page-tabs"},o.default.createElement("div",{className:"container"},o.default.createElement(l.default,{lists:c.default.get("USERS_LISTS"),baseUrl:c.default.get("USERS_LIST_URL")}))))),this.props.children)}}])&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();function h(e){return{tick:e.tick.tick,user:e.auth.user,users:e.users}}r.default=b},{"../..":302,"../dropdown-toggle":27,"../with-dropdown":299,"./active-posters/root":292,"./nav":293,"./rank/root":297,react:"react","react-redux":"react-redux"}],299:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return s(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function s(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function f(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var d=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&i(e,t)}(a,o.default.Component);var e,t,r,n=u(a);function a(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),f(s(t=n.call(this,e)),"toggleNav",function(){t.setState({dropdown:!t.state.dropdown})}),f(s(t),"hideNav",function(){t.setState({dropdown:!1})}),t.state={dropdown:!1},t}return e=a,(t=[{key:"getCompactNavClassName",value:function(){return this.state.dropdown?"compact-nav open":"compact-nav"}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=d},{react:"react"}],300:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n,o=(n=e("react"))&&n.__esModule?n:{default:n};function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return(s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var 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}}();return function(){var e,t=i(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return f(e)}(this,n?(e=i(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var u=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(u,o.default.Component);var e,t,r,i=c(u);function u(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u);for(var t,r,n,a=arguments.length,o=new Array(a),l=0;l<a;l++)o[l]=arguments[l];return e=i.call.apply(i,[this].concat(o)),t=f(e),n=function(){e.props.onChange({target:{value:!e.props.value}})},(r="toggle")in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,e}return e=u,(t=[{key:"getClassName",value:function(){return this.props.value?"btn btn-yes-no btn-yes-no-on":"btn btn-yes-no btn-yes-no-off"}},{key:"getIcon",value:function(){return this.props.value?this.props.iconOn||"check_box":this.props.iconOff||"check_box_outline_blank"}},{key:"getLabel",value:function(){return this.props.value?this.props.labelOn||gettext("yes"):this.props.labelOff||gettext("no")}},{key:"render",value:function(){return o.default.createElement("button",{type:"button",onClick:this.toggle,className:this.getClassName(),id:this.props.id||null,"aria-describedby":this.props["aria-describedby"]||null,disabled:this.props.disabled||!1},o.default.createElement("span",{className:"material-icon"},this.getIcon()),o.default.createElement("span",{className:"btn-text"},this.getLabel()))}}])&&l(e.prototype,t),r&&l(e,r),Object.defineProperty(e,"prototype",{writable:!1}),u}();r.default=u},{react:"react"}],301:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var o=n(e("react")),l=e("../reducers/profile-details"),i=n(e("../services/ajax")),u=n(e("../services/snackbar"));function n(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function f(r){var 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}}();return function(){var e,t=d(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=d(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function d(e){return(d=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var p=function(){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(a,o.default.Component);var e,t,r,n=f(a);function a(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),n.apply(this,arguments)}return e=a,(t=[{key:"componentDidMount",value:function(){var e=this.props,t=e.data,r=e.dispatch,n=e.user;t&&t.id===n.id||i.default.get(this.props.user.api.details).then(function(e){r((0,l.load)(e))},function(e){u.default.apiError(e)})}},{key:"render",value:function(){return this.props.children}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}();r.default=p},{"../reducers/profile-details":355,"../services/ajax":365,"../services/snackbar":376,react:"react"}],302:[function(l,e,i){(function(e){"use strict";Object.defineProperty(i,"__esModule",{value:!0}),i.default=i.Misago=void 0;var t,a=(t=l("./utils/ordered-list"))&&t.__esModule?t:{default:t};function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var r=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._initializers=[],this._context={}}var t,r,n;return t=e,(r=[{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 a.default(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}}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),n=new(i.Misago=r);e.misago=n,i.default=n}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./utils/ordered-list":387}],303:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/ajax"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){a.default.init(n.default.get("CSRF_COOKIE_NAME"))}n.default.addInitializer({name:"ajax",initializer:l})},{"../services/ajax":365,"./..":302}],304:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=c;var n=u(e("./..")),a=e("../reducers/auth"),o=u(e("../services/ajax")),l=u(e("../services/snackbar")),i=u(e("../services/store"));function u(e){return e&&e.__esModule?e:{default:e}}var s=45;function c(e){e.get("isAuthenticated")&&window.setInterval(function(){o.default.get(e.get("AUTH_API")).then(function(e){i.default.dispatch((0,a.patch)(e))},function(e){l.default.apiError(e)})},1e3*s)}n.default.addInitializer({name:"auth-sync",initializer:c,after:"auth"})},{"../reducers/auth":350,"../services/ajax":365,"../services/snackbar":376,"../services/store":377,"./..":302}],305:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=u(e("./..")),a=u(e("../services/auth")),o=u(e("../services/modal")),l=u(e("../services/store")),i=u(e("../services/local-storage"));function u(e){return e&&e.__esModule?e:{default:e}}function s(){a.default.init(l.default,i.default,o.default)}n.default.addInitializer({name:"auth",initializer:s,after:"store"})},{"../services/auth":366,"../services/local-storage":369,"../services/modal":371,"../services/store":377,"./..":302}],306:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=u(e("./..")),a=u(e("../services/ajax")),o=u(e("../services/captcha")),l=u(e("../services/include")),i=u(e("../services/snackbar"));function u(e){return e&&e.__esModule?e:{default:e}}function s(e){o.default.init(e,a.default,l.default,i.default)}n.default.addInitializer({name:"captcha",initializer:s})},{"../services/ajax":365,"../services/captcha":367,"../services/include":368,"../services/snackbar":376,"./..":302}],307:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=i(e("react")),a=i(e("../..")),o=i(e("../../components/accept-agreement")),l=i(e("../../utils/mount-component"));function i(e){return e&&e.__esModule?e:{default:e}}function u(e){document.getElementById("required-agreement-mount")&&(0,l.default)(n.default.createElement(o.default,{api:e.get("REQUIRED_AGREEMENT_API")}),"required-agreement-mount",!1)}a.default.addInitializer({name:"component:accept-agreement",initializer:u,after:"store"})},{"../..":302,"../../components/accept-agreement":3,"../../utils/mount-component":386,react:"react"}],308:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=c;var n=e("react-redux"),a=s(e("../..")),o=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../components/auth-message")),l=s(e("../../utils/mount-component"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e){return e&&e.__esModule?e:{default:e}}function c(){(0,l.default)((0,n.connect)(o.select)(o.default),"auth-message-mount")}a.default.addInitializer({name:"component:auth-message",initializer:c,after:"store"})},{"../..":302,"../../components/auth-message":5,"../../utils/mount-component":386,"react-redux":"react-redux"}],309:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("../..")),a=o(e("../../utils/banned-page"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e){e.has("BAN_MESSAGE")&&(0,a.default)(e.get("BAN_MESSAGE"),!1)}n.default.addInitializer({name:"component:banmed-page",initializer:l,after:"store"})},{"../..":302,"../../utils/banned-page":379}],310:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=c;var n=e("react-redux"),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../components/categories")),o=u(e("../..")),l=u(e("../../utils/mount-component"));function u(e){return e&&e.__esModule?e:{default:e}}function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function c(){document.getElementById("categories-mount")&&(0,l.default)((0,n.connect)(a.select)(a.default),"categories-mount")}o.default.addInitializer({name:"component:categories",initializer:c,after:"store"})},{"../..":302,"../../components/categories":20,"../../utils/mount-component":386,"react-redux":"react-redux"}],311:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../components/options/root")),a=l(e("../..")),o=l(e("../../utils/routed-component"));function l(e){return e&&e.__esModule?e:{default:e}}function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e){e.has("USER_OPTIONS")&&(0,o.default)({root:a.default.get("USERCP_URL"),component:n.default,paths:(0,n.paths)()})}a.default.addInitializer({name:"component:options",initializer:s,after:"store"})},{"../..":302,"../../components/options/root":87,"../../utils/routed-component":390}],312:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=c;var n=e("react-redux"),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../components/profile/root")),o=u(e("../..")),l=u(e("../../utils/routed-component"));function u(e){return e&&e.__esModule?e:{default:e}}function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function c(e){e.has("PROFILE")&&e.has("PROFILE_PAGES")&&(0,l.default)({root:o.default.get("PROFILE").url,component:(0,n.connect)(a.select)(a.default),paths:(0,a.paths)()})}o.default.addInitializer({name:"component:profile",initializer:c,after:"reducer:profile-hydrate"})},{"../..":302,"../../components/profile/root":195,"../../utils/routed-component":390,"react-redux":"react-redux"}],313:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../components/request-activation-link")),o=l(e("../../utils/mount-component"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){document.getElementById("request-activation-link-mount")&&(0,o.default)(a.default,"request-activation-link-mount",!1)}n.default.addInitializer({name:"component:request-activation-link",initializer:i,after:"store"})},{"../..":302,"../../components/request-activation-link":200,"../../utils/mount-component":386}],314:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../components/request-password-reset")),o=l(e("../../utils/mount-component"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){document.getElementById("request-password-reset-mount")&&(0,o.default)(a.default,"request-password-reset-mount",!1)}n.default.addInitializer({name:"component:request-password-reset",initializer:i,after:"store"})},{"../..":302,"../../components/request-password-reset":201,"../../utils/mount-component":386}],315:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../components/reset-password-form")),o=l(e("../../utils/mount-component"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){document.getElementById("reset-password-form-mount")&&(0,o.default)(a.default,"reset-password-form-mount",!1)}n.default.addInitializer({name:"component:reset-password-form",initializer:i,after:"store"})},{"../..":302,"../../components/reset-password-form":202,"../../utils/mount-component":386}],316:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../../components/search")),a=l(e("../..")),o=l(e("../../utils/routed-component"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){"misago:search"===e.get("CURRENT_LINK")&&(0,o.default)({paths:(0,n.default)(a.default.get("SEARCH_PROVIDERS"))})}a.default.addInitializer({name:"component:search",initializer:i,after:"store"})},{"../..":302,"../../components/search":204,"../../utils/routed-component":390}],317:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=e("react-redux"),a=i(e("../..")),o=e("../../components/snackbar"),l=i(e("../../utils/mount-component"));function i(e){return e&&e.__esModule?e:{default:e}}function u(){(0,l.default)((0,n.connect)(o.select)(o.Snackbar),"snackbar-mount")}a.default.addInitializer({name:"component:snackbar",initializer:u,after:"snackbar"})},{"../..":302,"../../components/snackbar":212,"../../utils/mount-component":386,"react-redux":"react-redux"}],318:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=i(e("react")),a=i(e("../../components/social-auth")),o=i(e("../..")),l=i(e("../../utils/mount-component"));function i(e){return e&&e.__esModule?e:{default:e}}function u(e){var t;"misago:social-complete"===e.get("CURRENT_LINK")&&(t=e.get("SOCIAL_AUTH_FORM"),(0,l.default)(n.default.createElement(a.default,t),"page-mount"))}o.default.addInitializer({name:"component:social-auth",initializer:u,after:"store"})},{"../..":302,"../../components/social-auth":215,"../../utils/mount-component":386,react:"react"}],319:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=e("../../components/thread/root"),a=l(e("../..")),o=l(e("../../utils/routed-component"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e){e.has("THREAD")&&e.has("POSTS")&&(0,o.default)({paths:(0,n.paths)()})}a.default.addInitializer({name:"component:thread",initializer:i,after:"store"})},{"../..":302,"../../components/thread/root":233,"../../utils/routed-component":390}],320:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u,r.getListOptions=s;var n=e("../../components/threads/root"),a=l(e("../..")),o=l(e("../../utils/routed-component"));function l(e){return e&&e.__esModule?e:{default:e}}var i="misago:private-threads";function u(e){e.has("THREADS")&&e.has("CATEGORIES")&&(0,o.default)({paths:(0,n.paths)(e.get("user"),s(e))})}function s(e){return e.get("CURRENT_LINK").substr(0,i.length)===i?{api:e.get("PRIVATE_THREADS_API"),startThread:{mode:"START_PRIVATE",submit:a.default.get("PRIVATE_THREADS_API")},title:gettext("Private threads"),pageLead:gettext("Private threads are threads which only those that started them and those they have invited may see and participate in."),emptyMessage:gettext("You aren't participating in any private threads.")}:{api:e.get("THREADS_API")}}a.default.addInitializer({name:"component:threads",initializer:u,after:"store"})},{"../..":302,"../../components/threads/root":267,"../../utils/routed-component":390}],321:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=e("react-redux"),a=i(e("../..")),o=e("../../components/user-menu/root"),l=i(e("../../utils/mount-component"));function i(e){return e&&e.__esModule?e:{default:e}}function u(){(0,l.default)((0,n.connect)(o.select)(o.UserMenu),"user-menu-mount"),(0,l.default)((0,n.connect)(o.select)(o.CompactUserMenu),"user-menu-compact-mount")}a.default.addInitializer({name:"component:user-menu",initializer:u,after:"store"})},{"../..":302,"../../components/user-menu/root":272,"../../utils/mount-component":386,"react-redux":"react-redux"}],322:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../components/users/root")),a=l(e("../..")),o=l(e("../../utils/routed-component"));function l(e){return e&&e.__esModule?e:{default:e}}function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function s(e){e.has("USERS_LISTS")&&(0,o.default)({root:a.default.get("USERS_LIST_URL"),component:n.default,paths:(0,n.paths)()})}a.default.addInitializer({name:"component:users",initializer:s,after:"store"})},{"../..":302,"../../components/users/root":298,"../../utils/routed-component":390}],323:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/include"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e){a.default.init(e.get("STATIC_URL"))}n.default.addInitializer({name:"include",initializer:l})},{"../services/include":368,"./..":302}],324:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/local-storage"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){a.default.init("misago_")}n.default.addInitializer({name:"local-storage",initializer:l})},{"../services/local-storage":369,"./..":302}],325:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/mobile-navbar-dropdown"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){var e=document.getElementById("mobile-navbar-dropdown-mount");e&&a.default.init(e)}n.default.addInitializer({name:"dropdown",initializer:l,before:"store"})},{"../services/mobile-navbar-dropdown":370,"./..":302}],326:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/modal"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){var e=document.getElementById("modal-mount");e&&a.default.init(e)}n.default.addInitializer({name:"modal",initializer:l,before:"store"})},{"../services/modal":371,"./..":302}],327:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=o;var n=a(e("moment"));function a(e){return e&&e.__esModule?e:{default:e}}function o(){n.default.locale($("html").attr("lang"))}a(e("./..")).default.addInitializer({name:"moment",initializer:o})},{"./..":302,moment:"moment"}],328:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/page-title"));function o(e){return e&&e.__esModule?e:{default:e}}function l(e){a.default.init(e.get("SETTINGS").forum_index_title,e.get("SETTINGS").forum_name)}n.default.addInitializer({name:"page-title",initializer:l})},{"../services/page-title":373,"./..":302}],329:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=i(e("./..")),a=i(e("../services/ajax")),o=i(e("../services/snackbar")),l=i(e("../services/polls"));function i(e){return e&&e.__esModule?e:{default:e}}function u(){l.default.init(a.default,o.default)}n.default.addInitializer({name:"polls",initializer:u})},{"../services/ajax":365,"../services/polls":374,"../services/snackbar":376,"./..":302}],330:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=i(e("./..")),a=i(e("../services/ajax")),o=i(e("../services/posting")),l=i(e("../services/snackbar"));function i(e){return e&&e.__esModule?e:{default:e}}function u(){o.default.init(a.default,l.default,document.getElementById("posting-placeholder"))}n.default.addInitializer({name:"posting",initializer:u})},{"../services/ajax":365,"../services/posting":375,"../services/snackbar":376,"./..":302}],331:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/auth")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(e){o.default.addReducer("auth",a.default,Object.assign({isAuthenticated:e.get("isAuthenticated"),isAnonymous:!e.get("isAuthenticated"),user:e.get("user")},a.initialState))}n.default.addInitializer({name:"reducer:auth",initializer:s,before:"store"})},{"../..":302,"../../reducers/auth":350,"../../services/store":377}],332:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/participants")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){var e=null;n.default.has("THREAD")&&(e=n.default.get("THREAD").participants),o.default.addReducer("participants",a.default,e||[])}n.default.addInitializer({name:"reducer:participants",initializer:i,before:"store"})},{"../..":302,"../../reducers/participants":351,"../../services/store":377}],333:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/poll")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(){var e=null,e=n.default.has("THREAD")&&n.default.get("THREAD").poll?(0,a.hydrate)(n.default.get("THREAD").poll):{isBusy:!1};o.default.addReducer("poll",a.default,e)}n.default.addInitializer({name:"reducer:poll",initializer:s,before:"store"})},{"../..":302,"../../reducers/poll":352,"../../services/store":377}],334:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/posts")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(){var e=null,e=n.default.has("POSTS")?(0,a.hydrate)(n.default.get("POSTS")):{isLoaded:!1,isBusy:!1};o.default.addReducer("posts",a.default,e)}n.default.addInitializer({name:"reducer:posts",initializer:s,before:"store"})},{"../..":302,"../../reducers/posts":354,"../../services/store":377}],335:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/profile-details")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){var e=null;n.default.has("PROFILE_DETAILS")&&(e=n.default.get("PROFILE_DETAILS")),o.default.addReducer("profile-details",a.default,e||{})}n.default.addInitializer({name:"reducer:profile-details",initializer:i,before:"store"})},{"../..":302,"../../reducers/profile-details":355,"../../services/store":377}],336:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=e("../../reducers/profile"),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){n.default.has("PROFILE")&&o.default.dispatch((0,a.hydrate)(n.default.get("PROFILE")))}n.default.addInitializer({name:"reducer:profile-hydrate",initializer:i,after:"store"})},{"../..":302,"../../reducers/profile":356,"../../services/store":377}],337:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/profile")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){o.default.addReducer("profile",a.default,{})}n.default.addInitializer({name:"reducer:profile",initializer:i,before:"store"})},{"../..":302,"../../reducers/profile":356,"../../services/store":377}],338:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/search")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(){o.default.addReducer("search",a.default,Object.assign({},a.initialState,{providers:n.default.get("SEARCH_PROVIDERS")||[],query:n.default.get("SEARCH_QUERY")||""}))}n.default.addInitializer({name:"reducer:search",initializer:s,before:"store"})},{"../..":302,"../../reducers/search":357,"../../services/store":377}],339:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/selection")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){o.default.addReducer("selection",a.default,[])}n.default.addInitializer({name:"reducer:selection",initializer:i,before:"store"})},{"../..":302,"../../reducers/selection":358,"../../services/store":377}],340:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/snackbar")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(){o.default.addReducer("snackbar",a.default,a.initialState)}n.default.addInitializer({name:"reducer:snackbar",initializer:s,before:"store"})},{"../..":302,"../../reducers/snackbar":359,"../../services/store":377}],341:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/thread")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(){var e=null,e=n.default.has("THREAD")?(0,a.hydrate)(n.default.get("THREAD")):{isBusy:!1};o.default.addReducer("thread",a.default,e)}n.default.addInitializer({name:"reducer:thread",initializer:s,before:"store"})},{"../..":302,"../../reducers/thread":360,"../../services/store":377}],342:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/threads")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){o.default.addReducer("threads",a.default,[])}n.default.addInitializer({name:"reducer:threads",initializer:i,before:"store"})},{"../..":302,"../../reducers/threads":361,"../../services/store":377}],343:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=s;var n=l(e("../..")),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("../../reducers/tick")),o=l(e("../../services/store"));function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function l(e){return e&&e.__esModule?e:{default:e}}function s(){o.default.addReducer("tick",a.default,a.initialState)}n.default.addInitializer({name:"reducer:tick",initializer:s,before:"store"})},{"../..":302,"../../reducers/tick":362,"../../services/store":377}],344:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/username-history")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){o.default.addReducer("username-history",a.default,[])}n.default.addInitializer({name:"reducer:username-history",initializer:i,before:"store"})},{"../..":302,"../../reducers/username-history":363,"../../services/store":377}],345:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("../..")),a=l(e("../../reducers/users")),o=l(e("../../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){o.default.addReducer("users",a.default,[])}n.default.addInitializer({name:"reducer:users",initializer:i,before:"store"})},{"../..":302,"../../reducers/users":364,"../../services/store":377}],346:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("./..")),a=l(e("../services/snackbar")),o=l(e("../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){a.default.init(o.default)}n.default.addInitializer({name:"snackbar",initializer:i,after:"store"})},{"../services/snackbar":376,"../services/store":377,"./..":302}],347:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=l;var n=o(e("./..")),a=o(e("../services/store"));function o(e){return e&&e.__esModule?e:{default:e}}function l(){a.default.init()}n.default.addInitializer({name:"store",initializer:l,before:"_end"})},{"../services/store":377,"./..":302}],348:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=l(e("./..")),a=e("../reducers/tick"),o=l(e("../services/store"));function l(e){return e&&e.__esModule?e:{default:e}}var i=5e4;function u(){window.setInterval(function(){o.default.dispatch((0,a.doTick)())},i)}n.default.addInitializer({name:"tick-start",initializer:u,after:"store"})},{"../reducers/tick":362,"../services/store":377,"./..":302}],349:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var n=l(e("./..")),a=l(e("../services/include")),o=l(e("../services/zxcvbn"));function l(e){return e&&e.__esModule?e:{default:e}}function i(){o.default.init(a.default)}n.default.addInitializer({name:"zxcvbn",initializer:i})},{"../services/include":368,"../services/zxcvbn":378,"./..":302}],350:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SIGN_OUT=r.SIGN_IN=r.PATCH_USER=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:l,t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case i:var r=Object.assign({},e);return r.user=Object.assign({},e.user,t.patch),r;case u:return Object.assign({},e,{signedIn:t.user});case s:return Object.assign({},e,{isAuthenticated:!1,isAnonymous:!0,signedOut:!t.soft});case o.UPDATE_AVATAR:if(e.isAuthenticated&&e.user.id===t.userId){var n=Object.assign({},e);return n.user=Object.assign({},e.user,{avatars:t.avatars}),n}return e;case o.UPDATE_USERNAME:if(e.isAuthenticated&&e.user.id===t.userId){var a=Object.assign({},e);return a.user=Object.assign({},e.user,{username:t.username,slug:t.slug}),a}return e;default:return e}},r.initialState=void 0,r.patch=function(e){return{type:i,patch:e}},r.signIn=function(e){return{type:u,user:e}},r.signOut=function(){var e=0<arguments.length&&void 0!==arguments[0]&&arguments[0];return{type:s,soft:e}};var o=e("./users"),l={signedIn:!1,signedOut:!1};r.initialState=l;var i="PATCH_USER";r.PATCH_USER=i;var u="SIGN_IN";r.SIGN_IN=u;var s="SIGN_OUT";r.SIGN_OUT=s},{"./users":364}],351:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.REPLACE_PARTICIPANTS=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[],t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return t.state;default:return e}},r.replace=function(e){return{type:n,state:e}};var n="REPLACE_PARTICIPANTS";r.REPLACE_PARTICIPANTS=n},{}],352:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.UPDATE_POLL=r.REPLACE_POLL=r.REMOVE_POLL=r.RELEASE_POLL=r.BUSY_POLL=void 0,r.busy=function(){return{type:o}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case o:return Object.assign({},e,{isBusy:!0});case l:return Object.assign({},e,{isBusy:!1});case i:return{isBusy:!1};case u:return t.state;case s:return Object.assign({},e,t.data);default:return e}},r.hydrate=c,r.release=function(){return{type:l}},r.remove=function(){return{type:i}},r.replace=function(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1];return{type:u,state:t?e:c(e)}},r.update=function(e){return{type:s,data:e}};var n,a=(n=e("moment"))&&n.__esModule?n:{default:n};var o="BUSY_POLL";r.BUSY_POLL=o;var l="RELEASE_POLL";r.RELEASE_POLL=l;var i="REMOVE_POLL";r.REMOVE_POLL=i;var u="REPLACE_POLL";r.REPLACE_POLL=u;var s="UPDATE_POLL";function c(e){var t=!1;for(var r in e.choices){if(e.choices[r].selected){t=!0;break}}return Object.assign({},e,{posted_on:(0,a.default)(e.posted_on),hasSelectedChoices:t,endsOn:e.length?(0,a.default)(e.posted_on).add(e.length,"days"):null,isBusy:!1})}r.UPDATE_POLL=s},{moment:"moment"}],353:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.PATCH_POST=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case l:return e.id==t.post.id?Object.assign({},e,t.patch):e;default:return e}},r.hydrate=function(e){return Object.assign({},e,{posted_on:(0,a.default)(e.posted_on),updated_on:(0,a.default)(e.updated_on),hidden_on:(0,a.default)(e.hidden_on),attachments:e.attachments?e.attachments.map(i):null,poster:e.poster?(0,o.hydrateUser)(e.poster):null,isSelected:!1,isBusy:!1,isDeleted:!1})},r.hydrateAttachment=i,r.patch=function(e,t){return{type:l,post:e,patch:t}};var n,a=(n=e("moment"))&&n.__esModule?n:{default:n},o=e("./users");var l="PATCH_POST";function i(e){return Object.assign({},e,{uploaded_on:(0,a.default)(e.uploaded_on)})}r.PATCH_POST=l},{"./users":364,moment:"moment"}],354:[function(e,t,r){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.UPDATE_POSTS=r.UNLOAD_POSTS=r.SELECT_POST=r.LOAD_POSTS=r.DESELECT_POSTS=r.DESELECT_POST=r.APPEND_POSTS=void 0,r.append=function(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1];return{type:c,state:t?e:n(e)}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case f:var r=e.results.map(function(e){return e.id==t.post.id?Object.assign({},e,{isSelected:!0}):e});return Object.assign({},e,{results:r});case d:var n=e.results.map(function(e){return e.id==t.post.id?Object.assign({},e,{isSelected:!1}):e});return Object.assign({},e,{results:n});case p:var a=e.results.map(function(e){return Object.assign({},e,{isSelected:!1})});return Object.assign({},e,{results:a});case c:var o=e.results.slice(),l=e.results.map(function(e){return e.id});return t.state.results.map(function(e){-1===l.indexOf(e.id)&&o.push(e)}),Object.assign({},t.state,{results:o});case m:return t.state;case y:return Object.assign({},e,{isLoaded:!1});case b:return Object.assign({},e,t.update);case u.PATCH_POST:var i=e.results.map(function(e){return(0,u.default)(e,t)});return Object.assign({},e,{results:i});default:return e}},r.deselect=function(e){return{type:d,post:e}},r.deselectAll=function(){return{type:p}},r.hydrate=n,r.load=function(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1];return{type:m,state:t?e:n(e)}},r.select=function(e){return{type:f,post:e}},r.unload=function(){return{type:y}},r.update=function(e){return{type:b,update:e}};var u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e){var l;"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&((l=a?Object.getOwnPropertyDescriptor(e,o):null)&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o])}n.default=e,r&&r.set(e,n);return n}(e("./post"));function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}var c="APPEND_POSTS";r.APPEND_POSTS=c;var f="SELECT_POST";r.SELECT_POST=f;var d="DESELECT_POST";r.DESELECT_POST=d;var p="DESELECT_POSTS";r.DESELECT_POSTS=p;var m="LOAD_POSTS";r.LOAD_POSTS=m;var y="UNLOAD_POSTS";r.UNLOAD_POSTS=y;var b="UPDATE_POSTS";function n(e){return Object.assign({},e,{results:e.results.map(u.hydrate),isLoaded:!0,isBusy:!1,isSelected:!1})}r.UPDATE_POSTS=b},{"./post":353}],355:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.LOAD_DETAILS=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return t.newState;default:return e}},r.load=function(e){return{type:n,newState:e}};var n="LOAD_DETAILS";r.LOAD_DETAILS=n},{}],356:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.PATCH_PROFILE=r.HYDRATE_PROFILE=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case l:return Object.assign({},t.profile,{joined_on:(0,a.default)(t.profile.joined_on),status:(0,o.hydrateStatus)(t.profile.status)});case i:return Object.assign({},e,t.patch);case o.UPDATE_AVATAR:return e.id===t.userId?Object.assign({},e,{avatars:t.avatars}):e;case o.UPDATE_USERNAME:return e.id===t.userId?Object.assign({},e,{username:t.username,slug:t.slug}):e;default:return e}},r.hydrate=function(e){return{type:l,profile:e}},r.patch=function(e){return{type:i,patch:e}};var n,a=(n=e("moment"))&&n.__esModule?n:{default:n},o=e("./users");var l="HYDRATE_PROFILE";r.HYDRATE_PROFILE=l;var i="PATCH_PROFILE";r.PATCH_PROFILE=i},{"./users":364,moment:"moment"}],357:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.UPDATE_SEARCH_PROVIDER=r.UPDATE_SEARCH=r.REPLACE_SEARCH=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return t.state;case a:return Object.assign({},e,t.update);case o:return Object.assign({},e,{providers:e.providers.map(function(e){return e.id===t.provider.id?t.provider:e})});default:return e}},r.initialState=void 0,r.replace=function(e){return{type:n,state:{isLoading:!1,providers:e}}},r.update=function(e){return{type:a,update:e}},r.updateProvider=function(e){return{type:o,provider:e}};var n="REPLACE_SEARCH";r.REPLACE_SEARCH=n;var a="UPDATE_SEARCH";r.UPDATE_SEARCH=a;var o="UPDATE_SEARCH_PROVIDER";r.UPDATE_SEARCH_PROVIDER=o;r.initialState={isLoading:!1,query:"",providers:[]}},{}],358:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SELECT_NONE=r.SELECT_ITEM=r.SELECT_ALL=void 0,r.all=function(e){return{type:a,items:e}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[],t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case a:return t.items;case o:return[];case l:return(0,n.toggle)(e,t.item);default:return e}},r.item=function(e){return{type:l,item:e}},r.none=function(){return{type:o}};var n=e("../utils/sets"),a="SELECT_ALL";r.SELECT_ALL=a;var o="SELECT_NONE";r.SELECT_NONE=o;var l="SELECT_ITEM";r.SELECT_ITEM=l},{"../utils/sets":391}],359:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SHOW_SNACKBAR=r.HIDE_SNACKBAR=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:n,t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;return t.type===a?{type:t.messageType,message:t.message,isVisible:!0}:t.type===o?Object.assign({},e,{isVisible:!1}):e},r.hideSnackbar=function(){return{type:o}},r.initialState=void 0;var n={type:"info",message:"",isVisible:!(r.showSnackbar=function(e,t){return{type:a,message:e,messageType:t}})};r.initialState=n;var a="SHOW_SNACKBAR";r.SHOW_SNACKBAR=a;var o="HIDE_SNACKBAR";r.HIDE_SNACKBAR=o},{}],360:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.UPDATE_THREAD_ACL=r.UPDATE_THREAD=r.REPLACE_THREAD=r.RELEASE_THREAD=r.BUSY_THREAD=void 0,r.busy=function(){return{type:l}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case l:return Object.assign({},e,{isBusy:!0});case i:return Object.assign({},e,{isBusy:!1});case o.REMOVE_POLL:return Object.assign({},e,{poll:null});case o.REPLACE_POLL:return Object.assign({},e,{poll:t.state});case u:return t.state;case s:return Object.assign({},e,t.data);case c:var r=Object.assign({},e.acl,t.data);return Object.assign({},e,{acl:r});default:return e}},r.hydrate=f,r.release=function(){return{type:i}},r.replace=function(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1];return{type:u,state:t?e:f(e)}},r.update=function(e){return{type:s,data:e}},r.updateAcl=function(e){return{type:c,data:e}};var n,a=(n=e("moment"))&&n.__esModule?n:{default:n},o=e("./poll");var l="BUSY_THREAD";r.BUSY_THREAD=l;var i="RELEASE_THREAD";r.RELEASE_THREAD=i;var u="REPLACE_THREAD";r.REPLACE_THREAD=u;var s="UPDATE_THREAD";r.UPDATE_THREAD=s;var c="UPDATE_THREAD_ACL";function f(e){return Object.assign({},e,{started_on:(0,a.default)(e.started_on),last_post_on:(0,a.default)(e.last_post_on),best_answer_marked_on:e.best_answer_marked_on?(0,a.default)(e.best_answer_marked_on):null,isBusy:!1})}r.UPDATE_THREAD_ACL=c},{"./poll":352,moment:"moment"}],361:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SORT_THREADS=r.PATCH_THREAD=r.MODERATION_PERMISSIONS=r.HYDRATE_THREADS=r.FILTER_THREADS=r.DELETE_THREAD=r.APPEND_THREADS=void 0,r.append=function(e,t){return{type:l,items:e,sorting:t}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[],r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(r.type){case l:return(0,a.default)(r.items.map(m),e).sort(r.sorting);case i:return e.filter(function(e){return e.id!==r.thread.id});case u:return e.filter(function(e){var t=r.categoriesMap[e.category];return t.lft>=r.category.lft&&t.rght<=r.category.rght||2==e.weight});case s:return r.items.map(m);case c:var t=e.map(function(e){return e.id===r.thread.id?Object.assign({},e,r.patch):e});return r.sorting?t.sort(r.sorting):t;case f:return e.sort(r.sorting);default:return e}},r.deleteThread=function(e){return{type:i,thread:e}},r.filterThreads=function(e,t){return{type:u,category:e,categoriesMap:t}},r.getThreadModerationOptions=p,r.hydrate=function(e){return{type:s,items:e}},r.hydrateThread=m,r.patch=function(e,t){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;return{type:c,thread:e,patch:t,sorting:r}},r.sort=function(e){return{type:f,sorting:e}};var n=o(e("moment")),a=o(e("../utils/concat-unique"));function o(e){return e&&e.__esModule?e:{default:e}}var l="APPEND_THREADS";r.APPEND_THREADS=l;var i="DELETE_THREAD";r.DELETE_THREAD=i;var u="FILTER_THREADS";r.FILTER_THREADS=u;var s="HYDRATE_THREADS";r.HYDRATE_THREADS=s;var c="PATCH_THREAD";r.PATCH_THREAD=c;var f="SORT_THREADS";r.SORT_THREADS=f;var d=["can_announce","can_approve","can_close","can_hide","can_move","can_merge","can_pin","can_review"];function p(t){var r=[];return d.forEach(function(e){t[e]&&r.push(e)}),r}function m(e){return Object.assign({},e,{started_on:(0,n.default)(e.started_on),last_post_on:(0,n.default)(e.last_post_on),moderation:p(e.acl)})}r.MODERATION_PERMISSIONS=d},{"../utils/concat-unique":381,moment:"moment"}],362:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.TICK=void 0,r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:n;return(1<arguments.length&&void 0!==arguments[1]?arguments[1]:null).type===a?Object.assign({},e,{tick:e.tick+1}):e},r.doTick=function(){return{type:a}},r.initialState=void 0;var n={tick:0};r.initialState=n;var a="TICK";r.TICK=a},{}],363:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.HYDRATE_HISTORY=r.APPEND_HISTORY=r.ADD_NAME_CHANGE=void 0,r.addNameChange=function(e,t,r){return{type:i,change:e,user:t,changedBy:r}},r.append=function(e){return{type:u,items:e}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[],t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case i:var r=e.slice();return r.unshift({id:Math.floor(Date.now()/1e3),changed_by:t.changedBy,changed_by_username:t.changedBy.username,changed_on:(0,n.default)(),new_username:t.change.username,old_username:t.user.username}),r;case u:return(0,o.default)(e,t.items.map(c));case s:return t.items.map(c);case a.UPDATE_AVATAR:return e.map(function(e){return(e=Object.assign({},e)).changed_by&&e.changed_by.id===t.userId&&(e.changed_by=Object.assign({},e.changed_by,{avatars:t.avatars})),e});case a.UPDATE_USERNAME:return e.map(function(e){return(e=Object.assign({},e)).changed_by&&e.changed_by.id===t.userId&&(e.changed_by=Object.assign({},e.changed_by,{username:t.username,slug:t.slug})),Object.assign({},e)});default:return e}},r.hydrate=function(e){return{type:s,items:e}},r.hydrateNamechange=c;var n=l(e("moment")),a=e("./users"),o=l(e("../utils/concat-unique"));function l(e){return e&&e.__esModule?e:{default:e}}var i="ADD_NAME_CHANGE";r.ADD_NAME_CHANGE=i;var u="APPEND_HISTORY";r.APPEND_HISTORY=u;var s="HYDRATE_HISTORY";function c(e){return Object.assign({},e,{changed_on:(0,n.default)(e.changed_on)})}r.HYDRATE_HISTORY=s},{"../utils/concat-unique":381,"./users":364,moment:"moment"}],364:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.UPDATE_USERNAME=r.UPDATE_AVATAR=r.HYDRATE_USERS=r.APPEND_USERS=void 0,r.append=function(e){return{type:l,items:e}},r.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[],t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case l:return(0,a.default)(e,t.items.map(f));case i:return t.items.map(f);case u:return e.map(function(e){return(e=Object.assign({},e)).id===t.userId&&(e.avatars=t.avatars),e});default:return e}},r.hydrate=function(e){return{type:i,items:e}},r.hydrateStatus=c,r.hydrateUser=f,r.updateAvatar=function(e,t){return{type:u,userId:e.id,avatars:t}},r.updateUsername=function(e,t,r){return{type:s,userId:e.id,username:t,slug:r}};var n=o(e("moment")),a=o(e("../utils/concat-unique"));function o(e){return e&&e.__esModule?e:{default:e}}var l="APPEND_USERS";r.APPEND_USERS=l;var i="HYDRATE_USERS";r.HYDRATE_USERS=i;var u="UPDATE_AVATAR";r.UPDATE_AVATAR=u;var s="UPDATE_USERNAME";function c(e){return e?Object.assign({},e,{last_click:e.last_click?(0,n.default)(e.last_click):null,banned_until:e.banned_until?(0,n.default)(e.banned_until):null}):null}function f(e){return Object.assign({},e,{joined_on:(0,n.default)(e.joined_on),status:c(e.status)})}r.UPDATE_USERNAME=s},{"../utils/concat-unique":381,moment:"moment"}],365:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Ajax=void 0;var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._cookieName=null,this._csrfToken=null,this._locks={}}var t,r,n;return t=e,(r=[{key:"init",value:function(e){this._cookieName=e}},{key:"getCsrfToken",value:function(){if(-1===document.cookie.indexOf(this._cookieName))return null;var e=new RegExp(this._cookieName+"=([^;]*)"),t=document.cookie.match(e)[0];return t?t.split("=")[1]:null}},{key:"request",value:function(n,a,o){var l=this;return new Promise(function(t,r){var e={url:a,method:n,headers:{"X-CSRFToken":l.getCsrfToken()},data:o?JSON.stringify(o):null,contentType:"application/json; charset=utf-8",dataType:"json",success:function(e){t(e)},error:function(e){var t=e.responseJSON||{};t.status=e.status,0===t.status&&(t.detail=gettext("Lost connection with application.")),404===t.status&&(t.detail&&"NOT FOUND"!==t.detail||(t.detail=gettext("Action link is invalid."))),500!==t.status||t.detail||(t.detail=gettext("Unknown error has occured.")),t.statusText=e.statusText,r(t)}};$.ajax(e)})}},{key:"get",value:function(o,e,l){if(e&&(o+="?"+$.param(e)),l){var i=this;return this._locks[l]&&(this._locks[l].url=o),this._locks[l]&&this._locks[l].waiter?{then:function(){}}:this._locks[l]&&this._locks[l].wait?(this._locks[l].waiter=!0,new Promise(function(n,a){window.setTimeout(function(){!function t(r){i._locks[l].wait?window.setTimeout(function(){t(r)},300):i._locks[l].url!==r?t(i._locks[l].url):(i._locks[l].waiter=!1,i.request("GET",i._locks[l].url).then(function(e){i._locks[l].url===r?n(e):(i._locks[l].waiter=!0,t(i._locks[l].url))},function(e){i._locks[l].url===r?a(e):(i._locks[l].waiter=!0,t(i._locks[l].url))}))}(o)},300)})):(this._locks[l]={url:o,wait:!0,waiter:!1},new Promise(function(t,r){i.request("GET",o).then(function(e){i._locks[l].wait=!1,i._locks[l].url===o&&t(e)},function(e){i._locks[l].wait=!1,i._locks[l].url===o&&r(e)})}))}return this.request("GET",o)}},{key:"post",value:function(e,t){return this.request("POST",e,t)}},{key:"patch",value:function(e,t){return this.request("PATCH",e,t)}},{key:"put",value:function(e,t){return this.request("PUT",e,t)}},{key:"delete",value:function(e,t){return this.request("DELETE",e,t)}},{key:"upload",value:function(n,a,o){var l=this;return new Promise(function(t,r){var e={url:n,method:"POST",headers:{"X-CSRFToken":l.getCsrfToken()},data:a,contentType:!1,processData:!1,xhr:function(){var e=new window.XMLHttpRequest;return e.upload.addEventListener("progress",function(e){e.lengthComputable&&o(Math.round(e.loaded/e.total*100))},!1),e},success:function(e){t(e)},error:function(e){var t=e.responseJSON||{};t.status=e.status,0===t.status&&(t.detail=gettext("Lost connection with application.")),413!==t.status||t.detail||(t.detail=gettext("Upload was rejected by server as too large.")),404===t.status&&(t.detail&&"NOT FOUND"!==t.detail||(t.detail=gettext("Action link is invalid."))),500!==t.status||t.detail||(t.detail=gettext("Unknown error has occured.")),t.statusText=e.statusText,r(t)}};$.ajax(e)})}}])&&a(t.prototype,r),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),o=new(r.Ajax=n);r.default=o},{}],366:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Auth=void 0;var a=e("../reducers/auth");function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e,t,r){this._store=e,this._local=t,this._modal=r,this.syncSession(),this.watchState()}},{key:"syncSession",value:function(){var e=this._store.getState().auth;e.isAuthenticated?this._local.set("auth",{isAuthenticated:!0,username:e.user.username}):this._local.set("auth",{isAuthenticated:!1})}},{key:"watchState",value:function(){var t=this,r=this._store.getState().auth;this._local.watch("auth",function(e){e.isAuthenticated?t._store.dispatch((0,a.signIn)({username:e.username})):r.isAuthenticated&&t._store.dispatch((0,a.signOut)())}),this._modal.hide()}},{key:"signIn",value:function(e){this._store.dispatch((0,a.signIn)(e)),this._local.set("auth",{isAuthenticated:!0,username:e.username}),this._modal.hide()}},{key:"signOut",value:function(){this._store.dispatch((0,a.signOut)()),this._local.set("auth",{isAuthenticated:!1}),this._modal.hide()}},{key:"softSignOut",value:function(){this._store.dispatch((0,a.signOut)(!0)),this._local.set("auth",{isAuthenticated:!1}),this._modal.hide()}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),l=new(r.Auth=n);r.default=l},{"../reducers/auth":350}],367:[function(e,t,r){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.ReCaptchaComponent=r.ReCaptcha=r.QACaptcha=r.NoCaptcha=r.Captcha=r.BaseCaptcha=void 0;var n=l(e("react")),o=l(e("../components/form-group"));function l(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}function u(e,t){return(u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(r){var 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}}();return function(){var e,t=c(r);return function(e,t){{if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined")}return function(e){if(void 0!==e)return e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e)}(this,n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments))}}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function p(e,t,r){return t&&d(e.prototype,t),r&&d(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}var m=function(){function e(){f(this,e)}return p(e,[{key:"init",value:function(e,t,r,n){this._context=e,this._ajax=t,this._include=r,this._snackbar=n}}]),e}();r.BaseCaptcha=m;var y=function(){i(t,m);var e=s(t);function t(){return f(this,t),e.apply(this,arguments)}return p(t,[{key:"load",value:function(){return new Promise(function(e){e()})}},{key:"validator",value:function(){return null}},{key:"component",value:function(){return null}}]),t}();r.NoCaptcha=y;var b=function(){i(t,m);var e=s(t);function t(){return f(this,t),e.apply(this,arguments)}return p(t,[{key:"load",value:function(){var r=this;return new Promise(function(t,e){r._ajax.get(r._context.get("CAPTCHA_API")).then(function(e){r.question=e.question,r.helpText=e.help_text,t()},function(){r._snackbar.error(gettext("Failed to load CAPTCHA.")),e()})})}},{key:"validator",value:function(){return[]}},{key:"component",value:function(e){return n.default.createElement(o.default,{label:this.question,for:"id_captcha",labelClass:e.labelClass||"",controlClass:e.controlClass||"",validation:e.form.state.errors.captcha,helpText:this.helpText||null},n.default.createElement("input",{"aria-describedby":"id_captcha_status",className:"form-control",disabled:e.form.state.isLoading,id:"id_captcha",onChange:e.form.bindInput("captcha"),type:"text",value:e.form.state.captcha}))}}]),t}();r.QACaptcha=b;var h=function(){i(t,n.default.Component);var e=s(t);function t(){return f(this,t),e.apply(this,arguments)}return p(t,[{key:"componentDidMount",value:function(){var t=this;grecaptcha.render("recaptcha",{sitekey:this.props.siteKey,callback:function(e){t.props.binding({target:{value:e}})}})}},{key:"render",value:function(){return n.default.createElement("div",{id:"recaptcha"})}}]),t}();r.ReCaptchaComponent=h;var v=function(){i(t,m);var e=s(t);function t(){return f(this,t),e.apply(this,arguments)}return p(t,[{key:"load",value:function(){return this._include.include("https://www.google.com/recaptcha/api.js",!0),new Promise(function(t){!function e(){"undefined"==typeof grecaptcha?window.setTimeout(function(){e()},200):t()}()})}},{key:"validator",value:function(){return[]}},{key:"component",value:function(e){return n.default.createElement(o.default,{label:gettext("Please solve the quick test"),for:"id_captcha",labelClass:e.labelClass||"",controlClass:e.controlClass||"",validation:e.form.state.errors.captcha,helpText:gettext("This test helps us prevent automated spam registrations on our site.")},n.default.createElement(h,{binding:e.form.bindInput("captcha"),siteKey:this._context.get("SETTINGS").recaptcha_site_key}))}}]),t}();r.ReCaptcha=v;var g=function(){function e(){f(this,e)}return p(e,[{key:"init",value:function(e,t,r,n){switch(e.get("SETTINGS").captcha_type){case"no":this._captcha=new y;break;case"qa":this._captcha=new b;break;case"re":this._captcha=new v}this._captcha.init(e,t,r,n)}},{key:"load",value:function(){return this._captcha.load()}},{key:"validator",value:function(){return this._captcha.validator()}},{key:"component",value:function(e){return this._captcha.component(e)}}]),e}(),_=new(r.Captcha=g);r.default=_},{"../components/form-group":55,react:"react"}],368:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Include=void 0;var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e){this._staticUrl=e,this._included=[]}},{key:"include",value:function(e,t){var r=1<arguments.length&&void 0!==t&&t;-1===this._included.indexOf(e)&&(this._included.push(e),this._include(e,r))}},{key:"_include",value:function(e,t){$.ajax({url:(t?"":this._staticUrl)+e,cache:!0,dataType:"script"})}}])&&a(t.prototype,r),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),o=new(r.Include=n);r.default=o},{}],369:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.LocalStorage=void 0;var o=window.localStorage,n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e){var n=this;this._prefix=e,this._watchers=[],window.addEventListener("storage",function(t){var r=JSON.parse(t.newValue);n._watchers.forEach(function(e){e.key===t.key&&t.oldValue!==t.newValue&&e.callback(r)})})}},{key:"set",value:function(e,t){o.setItem(this._prefix+e,JSON.stringify(t))}},{key:"get",value:function(e){var t=o.getItem(this._prefix+e);return t?JSON.parse(t):null}},{key:"watch",value:function(e,t){this._watchers.push({key:this._prefix+e,callback:t})}}])&&a(t.prototype,r),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),l=new(r.LocalStorage=n);r.default=l},{}],370:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.MobileNavbarDropdown=void 0;var n,a=(n=e("../utils/mount-component"))&&n.__esModule?n:{default:n};function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var l=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e){this._element=e,this._component=null}},{key:"show",value:function(e){this._component===e?this.hide():(this._component=e,(0,a.default)(e,this._element.id),$(this._element).addClass("open"))}},{key:"showConnected",value:function(e,t){this._component===e?this.hide():(this._component=e,(0,a.default)(t,this._element.id,!0),$(this._element).addClass("open"))}},{key:"hide",value:function(){$(this._element).removeClass("open"),this._component=null}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),i=new(r.MobileNavbarDropdown=l);r.default=i},{"../utils/mount-component":386}],371:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Modal=void 0;var a=n(e("react-dom")),o=n(e("../utils/mount-component"));function n(e){return e&&e.__esModule?e:{default:e}}function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var i=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e){var t=this;this._element=e,this._modal=$(e).modal({show:!1}),this._modal.on("hidden.bs.modal",function(){a.default.unmountComponentAtNode(t._element)})}},{key:"show",value:function(e){(0,o.default)(e,this._element.id),this._modal.modal("show")}},{key:"hide",value:function(){this._modal.modal("hide")}}])&&l(t.prototype,r),n&&l(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),u=new(r.Modal=i);r.default=u},{"../utils/mount-component":386,"react-dom":"react-dom"}],372:[function(e,t,r){"use strict";function n(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.OneBox=void 0,r.cleanUrl=u,r.default=void 0,r.getVideoIdFromUrl=s,r.parseYoutubeUrl=i;var a=new RegExp("^.*(?:(?:youtu.be/|v/|vi/|u/w/|embed/)|(?:(?:watch)??v(?:i)?=|&v(?:i)?=))([^#&?]*).*"),o=function(){function a(){var e,t,r,n=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),r=function(e){e&&(n.highlightCode(e),n.embedYoutubePlayers(e))},(t="render")in(e=this)?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,this._youtube={}}var e,t,r;return e=a,(t=[{key:"highlightCode",value:function(e){for(var t=e.querySelectorAll("pre>code"),r=0;r<t.length;r++){var n=t[r];hljs.highlightBlock(n)}}},{key:"embedYoutubePlayers",value:function(e){for(var t=e.querySelectorAll("p>a"),r=0;r<t.length;r++){var n=t[r],a=1===n.parentNode.childNodes.length;this._youtube[n.href]||(this._youtube[n.href]=i(n.href));var o=this._youtube[n.href];a&&o&&!1!==o.data&&this.swapYoutubePlayer(n,o)}}},{key:"swapYoutubePlayer",value:function(e,t){var r="https://www.youtube.com/embed/";r+=t.video,r+="?rel=0",t.start&&(r+="&start="+t.start);var n=$('<iframe class="embed-responsive-item" src="'+r+'" allowfullscreen></iframe>');$(e).replaceWith(n),n.wrap('<div class="embed-responsive embed-responsive-16by9"></div>')}}])&&n(e.prototype,t),r&&n(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}(),l=new(r.OneBox=o);function i(e){var t=u(e),r=s(t);if(!r)return null;var n,a,o=0;return 0<t.indexOf("?")&&((n=t.substr(t.indexOf("?")+1).split("&").filter(function(e){return"t="===e.substr(0,2)})[0])&&("s"===(a=n.substr(2).split("m"))[0].substr(-1)?o+=parseInt(a[0].substr(0,a[0].length-1)):(o+=60*parseInt(a[0]),a[1]&&"s"===a[1].substr(-1)&&(o+=parseInt(a[1].substr(0,a[1].length-1)))))),{start:o,video:r}}function u(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}function s(e){if(-1===e.indexOf("youtu"))return null;var t=e.match(a);return t?t[1]:null}r.default=l},{}],373:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.PageTitle=void 0;var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e,t){this._indexTitle=e,this._forumName=t}},{key:"set",value:function(e){var t;e?("string"==typeof e&&(e={title:e}),t=e.title,1<e.page&&(t+=" ("+interpolate(gettext("page: %(page)s"),{page:e.page},!0)+")"),e.parent&&(t+=" | "+e.parent),document.title=t+" | "+this._forumName):document.title=this._indexTitle||this._forumName}}])&&a(t.prototype,r),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),o=new(r.PageTitle=n);r.default=o},{}],374:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Polls=void 0;var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e,t){this._ajax=e,this._snackbar=t,this._polls={}}},{key:"start",value:function(t){var r=this;this.stop(t.poll);function n(){r._polls[t.poll]=t,r._ajax.get(t.url,t.data||null).then(function(e){r._polls[t.poll]._stopped||(t.update(e),r._polls[t.poll].timeout=window.setTimeout(n,t.frequency))},function(e){r._polls[t.poll]._stopped||(t.error?t.error(e):r._snackbar.apiError(e))})}t.delayed?this._polls[t.poll]={timeout:window.setTimeout(n,t.frequency)}:n()}},{key:"stop",value:function(e){this._polls[e]&&(window.clearTimeout(this._polls[e].timeout),this._polls[e]._stopped=!0)}}])&&a(t.prototype,r),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),o=new(r.Polls=n);r.default=o},{}],375:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Posting=void 0;var n=a(e("react")),o=a(e("react-dom")),l=e("../components/poll"),i=a(e("../components/posting")),u=a(e("../utils/mount-component"));function a(e){return e&&e.__esModule?e:{default:e}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var c=function(){function a(){var e,t,r,n=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),r=function(){n._isOpen&&!n._isClosing&&(n._isClosing=!0,n._placeholder.removeClass("slide-in"),window.setTimeout(function(){o.default.unmountComponentAtNode(document.getElementById("posting-mount")),n._isClosing=!1,n._isOpen=!1},300))},(t="close")in(e=this)?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}var e,t,r;return e=a,(t=[{key:"init",value:function(e,t,r){this._ajax=e,this._snackbar=t,this._placeholder=$(r),this._mode=null,this._isOpen=!1,this._isClosing=!1}},{key:"open",value:function(e){var t;!1===this._isOpen?(this._mode=e.mode,this._isOpen=e.submit,this._realOpen(e)):this._isOpen!==e.submit?(t=gettext("You are already working on other message. Do you want to discard it?"),"POLL"==this._mode&&(t=gettext("You are already working on a poll. Do you want to discard it?")),window.confirm(t)&&(this._mode=e.mode,this._isOpen=e.submit,this._realOpen(e))):"REPLY"==this._mode&&"REPLY"==e.mode&&this._realOpen(e)}},{key:"_realOpen",value:function(e){"POLL"==e.mode?(0,u.default)(n.default.createElement(l.PollForm,e),"posting-mount"):(0,u.default)(n.default.createElement(i.default,e),"posting-mount"),this._placeholder.addClass("slide-in"),$("html, body").animate({scrollTop:this._placeholder.offset().top},1e3)}}])&&s(e.prototype,t),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}(),f=new(r.Posting=c);r.default=f},{"../components/poll":106,"../components/posting":134,"../utils/mount-component":386,react:"react","react-dom":"react-dom"}],376:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Snackbar=void 0;var a=e("../reducers/snackbar");function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e){this._store=e,this._timeout=null}},{key:"alert",value:function(e,t){var r=this;this._timeout?(window.clearTimeout(this._timeout),this._store.dispatch((0,a.hideSnackbar)()),this._timeout=window.setTimeout(function(){r._timeout=null,r.alert(e,t)},300)):(this._store.dispatch((0,a.showSnackbar)(e,t)),this._timeout=window.setTimeout(function(){r._store.dispatch((0,a.hideSnackbar)()),r._timeout=null},5e3))}},{key:"info",value:function(e){this.alert(e,"info")}},{key:"success",value:function(e){this.alert(e,"success")}},{key:"warning",value:function(e){this.alert(e,"warning")}},{key:"error",value:function(e){this.alert(e,"error")}},{key:"apiError",value:function(e){var t=(t=e.detail)||(404===e.status?gettext("Action link is invalid."):gettext("Unknown error has occured."));403===e.status&&"Permission denied"===t&&(t=gettext("You don't have permission to perform this action.")),this.error(t)}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),l=new(r.Snackbar=n);r.default=l},{"../reducers/snackbar":359}],377:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.StoreWrapper=void 0;var a=e("redux");function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._store=null,this._reducers={},this._initialState={}}var t,r,n;return t=e,(r=[{key:"addReducer",value:function(e,t,r){this._reducers[e]=t,this._initialState[e]=r}},{key:"init",value:function(){this._store=(0,a.createStore)((0,a.combineReducers)(this._reducers),this._initialState)}},{key:"getStore",value:function(){return this._store}},{key:"getState",value:function(){return this._store.getState()}},{key:"dispatch",value:function(e){return this._store.dispatch(e)}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),l=new(r.StoreWrapper=n);r.default=l},{redux:"redux"}],378:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=r.Zxcvbn=void 0;var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,(r=[{key:"init",value:function(e){this._include=e,this._isLoaded=!1}},{key:"scorePassword",value:function(e,t){return this._isLoaded?zxcvbn(e,t).score:0}},{key:"load",value:function(){return this._isLoaded?this._loadedPromise():(this._include.include("misago/js/zxcvbn.js"),this._loadingPromise())}},{key:"_loadingPromise",value:function(){var o=this;return new Promise(function(n,a){!function e(t){var r=0<arguments.length&&void 0!==t?t:0;200<(r+=1)?a():"undefined"==typeof zxcvbn?window.setTimeout(function(){e(r)},200):(o._isLoaded=!0,n())}()})}},{key:"_loadedPromise",value:function(){return new Promise(function(e){e()})}}])&&a(t.prototype,r),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),o=new(r.Zxcvbn=n);r.default=o},{}],379:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e,t){{var r;o.default.render(a.default.createElement(l.Provider,{store:s.default.getStore()},a.default.createElement(f,{message:e.message,expires:e.expires_on?(0,n.default)(e.expires_on):null})),document.getElementById("page-mount")),void 0!==t&&!t||(r=u.default.get("SETTINGS").forum_name,document.title=gettext("You are banned")+" | "+r,window.history.pushState({},"",u.default.get("BANNED_URL")))}};var n=c(e("moment")),a=c(e("react")),o=c(e("react-dom")),l=e("react-redux"),i=c(e("../components/banned-page")),u=c(e("./..")),s=c(e("../services/store"));function c(e){return e&&e.__esModule?e:{default:e}}var f=(0,l.connect)(function(e){return e.tick})(i.default)},{"../components/banned-page":7,"../services/store":377,"./..":302,moment:"moment",react:"react","react-dom":"react-dom","react-redux":"react-redux"}],380:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e,t){var r=2<arguments.length&&void 0!==arguments[2]&&arguments[2],n=[],a=[];if(e.forEach(function(e){a.push(e),a.length===t&&(n.push(a),a=[])}),!1!==r&&0<a.length&&a.length<t)for(var o=a.length;o<t;o++)a.push(r);a.length&&n.push(a);return n}},{}],381:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e,t){var r=[];return e.concat(t).filter(function(e){return-1===r.indexOf(e.id)&&(r.push(e.id),!0)})}},{}],382:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=function(){function r(e,t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,r),this._callback=e,this._count=t}var e,t,n;return e=r,(t=[{key:"count",value:function(){--this._count,0===this._count&&this._callback()}}])&&a(e.prototype,t),n&&a(e,n),Object.defineProperty(e,"prototype",{writable:!1}),r}();r.default=n},{}],383:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return e.replace(/[&<>"']/g,function(e){return n[e]})};var n={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"}},{}],384:[function(e,t,r){"use strict";function n(e){return e.toFixed(1)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return 1073741824<e?n(e/1073741824)+" GB":1048576<e?n(e/1048576)+" MB":1024<e?n(e/1024)+" KB":n(e)+" B"},r.roundSize=n},{}],385:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){return n.test($.trim(e))};var n=new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i")},{}],386:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e,t){var r=!(2<arguments.length&&void 0!==arguments[2])||arguments[2],n=document.getElementById(t),a=e.props?e:o.default.createElement(e,null);n&&(r?l.default.render(o.default.createElement(i.Provider,{store:u.default.getStore()},a),n):l.default.render(a,n))};var o=n(e("react")),l=n(e("react-dom")),i=e("react-redux"),u=n(e("../services/store"));function n(e){return e&&e.__esModule?e:{default:e}}},{"../services/store":377,react:"react","react-dom":"react-dom","react-redux":"react-redux"}],387:[function(e,t,r){"use strict";function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var n=function(){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),this.isOrdered=!1,this._items=e||[]}var e,r,n;return e=t,(r=[{key:"add",value:function(e,t,r){this._items.push({key:e,item:t,after:r&&r.after||null,before:r&&r.before||null})}},{key:"get",value:function(e,t){for(var r=0;r<this._items.length;r++)if(this._items[r].key===e)return this._items[r].item;return t}},{key:"has",value:function(e){return void 0!==this.get(e)}},{key:"values",value:function(){for(var e=[],t=0;t<this._items.length;t++)e.push(this._items[t].item);return e}},{key:"order",value:function(e){return this.isOrdered||(this._items=this._order(this._items),this.isOrdered=!0),e||void 0===e?this.values():this._items}},{key:"orderedValues",value:function(){return this.order(!0)}},{key:"_order",value:function(e){var t=[];e.forEach(function(e){t.push(e.key)});var r=[],n=[];function a(e){var t=-1;-1===n.indexOf(e.key)&&(e.after?-1!==(t=n.indexOf(e.after))&&(t+=1):e.before&&(t=n.indexOf(e.before)),-1!==t&&(r.splice(t,0,e),n.splice(t,0,e.key)))}e.forEach(function(e){e.after||e.before||(r.push(e),n.push(e.key))}),e.forEach(function(e){"_end"===e.before&&(r.push(e),n.push(e.key))});for(var o=200;0<o&&t.length!==n.length;)--o,e.forEach(a);return r}}])&&a(e.prototype,r),n&&a(e,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();r.default=n},{}],388:[function(e,t,r){"use strict";function a(e,t){return Math.floor(Math.random()*(t-e+1))+e}Object.defineProperty(r,"__esModule",{value:!0}),r.int=a,r.range=function(e,t){for(var r=new Array(a(e,t)),n=0;n<r.length;n++)r[n]=n;return r}},{}],389:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(){window.scrollTo(0,0)}},{}],390:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(r){var e={component:r.component||null,childRoutes:[]};r.root?e.childRoutes=[{path:r.root,onEnter:function(e,t){t(null,r.paths[0].path)}}].concat(r.paths):e.childRoutes=r.paths;a.default.render(n.default.createElement(o.Provider,{store:i.default.getStore()},n.default.createElement(l.Router,{routes:e,history:l.browserHistory})),s)};var n=u(e("react")),a=u(e("react-dom")),o=e("react-redux"),l=e("react-router"),i=u(e("../services/store"));function u(e){return e&&e.__esModule?e:{default:e}}var s=document.getElementById("page-mount")},{"../services/store":377,react:"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router"}],391:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.push=function(e,t){{if(-1!==e.indexOf(t))return e;var r=e.slice();return r.push(t),r}},r.remove=function(e,t){return 0<=e.indexOf(t)?e.filter(function(e){return e!==t}):e},r.toggle=function(e,t){{if(-1!==e.indexOf(t))return e.filter(function(e){return e!==t});var r=e.slice();return r.push(t),r}}},{}],392:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e,t){if(e=(e+"").toLowerCase(),(t=(t+"").toLowerCase()).length<=0)return 0;var r=0,n=0,a=t.length;for(;0<=(n=e.indexOf(t,n));)r+=1,n+=a;return r}},{}],393:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.email=function(t){return function(e){if(!n.test(e))return t||gettext("Enter a valid email address.")}},r.maxLength=i,r.minLength=l,r.passwordMinLength=function(n){return function(e){var t=e.length;if(t<n){var r=ngettext("Valid password must be at least %(limit_value)s character long.","Valid password must be at least %(limit_value)s characters long.",n);return interpolate(r,{limit_value:n,show_value:t},!0)}}},r.required=o,r.requiredPrivacyPolicy=function(e){var t=gettext("You have to accept the privacy policy.");return o(e||t)},r.requiredTermsOfService=function(e){var t=gettext("You have to accept the terms of service.");return o(e||t)},r.usernameContent=function(){return function(e){if(!a.test($.trim(e)))return gettext("Username can only contain latin alphabet letters and digits.")}},r.usernameMaxLength=function(e){return i(e,function(e){return ngettext("Username cannot be longer than %(limit_value)s character.","Username cannot be longer than %(limit_value)s characters.",e)})},r.usernameMinLength=function(e){return l(e,function(e){return ngettext("Username must be at least %(limit_value)s character long.","Username must be at least %(limit_value)s characters long.",e)})};var n=/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i,a=new RegExp("^[0-9a-z]+$","i");function o(t){return function(e){if(!1===e||null===e||0===$.trim(e).length)return t||gettext("This field is required.")}}function l(n,a){return function(e){var t="",r=$.trim(e).length;if(r<n)return t=a?a(n,r):ngettext("Ensure this value has at least %(limit_value)s character (it has %(show_value)s).","Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).",n),interpolate(t,{limit_value:n,show_value:r},!0)}}function i(n,a){return function(e){var t="",r=$.trim(e).length;if(n<r)return t=a?a(n,r):ngettext("Ensure this value has at most %(limit_value)s character (it has %(show_value)s).","Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).",n),interpolate(t,{limit_value:n,show_value:r},!0)}}},{}]},{},[302,303,304,305,306,323,324,325,326,327,328,329,330,346,347,348,349,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345]);
 //# sourceMappingURL=misago.js.map

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
misago/static/misago/js/misago.js.map


+ 0 - 10
misago/templates/misago/admin/conf/sso_settings.html

@@ -1,10 +0,0 @@
-{% extends "misago/admin/conf/form.html" %}
-{% load i18n misago_admin_form %}
-
-
-{% block form-body %}
-{% form_row form.enable_sso %}
-{% form_row form.sso_public_key %}
-{% form_row form.sso_private_key %}
-{% form_row form.sso_url %}
-{% endblock form-body %}

+ 0 - 6
misago/templates/misago/admin/conf/users_settings.html

@@ -4,12 +4,6 @@
 
 {% block form-body %}
 <div class="form-fieldset">
-  {% if settings.enable_sso %}  
-    <div class="alert alert-warning" role="alert">
-      <strong>{% trans "Note" %}:</strong> {% trans "Single Sign-On is enabled. Site's registration, password and deletion features have been disabled and delegated to the third-party site." %}
-    </div>
-  {% endif %}
-
   <fieldset>
     <legend>{% trans "New accounts" %}</legend>
 

+ 0 - 6
misago/templates/misago/admin/socialauth/list.html

@@ -92,12 +92,6 @@
 
 
 {% block view %}
-{% if settings.enable_sso %}  
-  <div class="alert alert-warning" role="alert">
-    <strong>{% trans "Note" %}:</strong> {% trans "Single Sign-On is enabled. Social authentication has been disabled and delegated to the third-party site." %}
-  </div>
-{% endif %}
-
 {{ block.super }}
 
 <div class="card card-admin-table mt-3">

+ 0 - 2
misago/themes/__init__.py

@@ -1,3 +1 @@
-default_app_config = "misago.themes.apps.MisagoThemesConfig"
-
 THEME_CACHE = "theme"

+ 30 - 30
misago/themes/admin/__init__.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 from django.utils.translation import gettext_lazy as _
 
 from .views import (
@@ -26,64 +26,64 @@ from .views import (
 class MisagoAdminExtension:
     def register_urlpatterns(self, urlpatterns):
         # Themes
-        urlpatterns.namespace(r"^themes/", "themes")
+        urlpatterns.namespace("themes/", "themes")
         urlpatterns.patterns(
             "themes",
-            url(r"^$", ThemesList.as_view(), name="index"),
-            url(r"^new/$", NewTheme.as_view(), name="new"),
-            url(r"^edit/(?P<pk>\d+)/$", EditTheme.as_view(), name="edit"),
-            url(r"^delete/(?P<pk>\d+)/$", DeleteTheme.as_view(), name="delete"),
-            url(r"^activate/(?P<pk>\d+)/$", ActivateTheme.as_view(), name="activate"),
-            url(r"^export/(?P<pk>\d+)/$", ExportTheme.as_view(), name="export"),
-            url(r"^import/$", ImportTheme.as_view(), name="import"),
-            url(r"^assets/(?P<pk>\d+)/$", ThemeAssets.as_view(), name="assets"),
-            url(
-                r"^assets/(?P<pk>\d+)/delete-css/$",
+            path("", ThemesList.as_view(), name="index"),
+            path("new/", NewTheme.as_view(), name="new"),
+            path("edit/<int:pk>/", EditTheme.as_view(), name="edit"),
+            path("delete/<int:pk>/", DeleteTheme.as_view(), name="delete"),
+            path("activate/<int:pk>/", ActivateTheme.as_view(), name="activate"),
+            path("export/<int:pk>/", ExportTheme.as_view(), name="export"),
+            path("import/", ImportTheme.as_view(), name="import"),
+            path("assets/<int:pk>/", ThemeAssets.as_view(), name="assets"),
+            path(
+                "assets/<int:pk>/delete-css/",
                 DeleteThemeCss.as_view(),
                 name="delete-css",
             ),
-            url(
-                r"^assets/(?P<pk>\d+)/delete-media/$",
+            path(
+                "assets/<int:pk>/delete-media/",
                 DeleteThemeMedia.as_view(),
                 name="delete-media",
             ),
-            url(
-                r"^assets/(?P<pk>\d+)/upload-css/$",
+            path(
+                "assets/<int:pk>/upload-css/",
                 UploadThemeCss.as_view(),
                 name="upload-css",
             ),
-            url(
-                r"^assets/(?P<pk>\d+)/upload-media/$",
+            path(
+                "assets/<int:pk>/upload-media/",
                 UploadThemeMedia.as_view(),
                 name="upload-media",
             ),
-            url(
-                r"^assets/(?P<pk>\d+)/move-css-down/(?P<css_pk>\d+)/$",
+            path(
+                "assets/<int:pk>/move-css-down/<int:css_pk>/",
                 MoveThemeCssDown.as_view(),
                 name="move-css-down",
             ),
-            url(
-                r"^assets/(?P<pk>\d+)/move-css-up/(?P<css_pk>\d+)/$",
+            path(
+                "assets/<int:pk>/move-css-up/<int:css_pk>/",
                 MoveThemeCssUp.as_view(),
                 name="move-css-up",
             ),
-            url(
-                r"^assets/(?P<pk>\d+)/new-css/$",
+            path(
+                "assets/<int:pk>/new-css/",
                 NewThemeCss.as_view(),
                 name="new-css-file",
             ),
-            url(
-                r"^assets/(?P<pk>\d+)/edit-css/(?P<css_pk>\d+)/$",
+            path(
+                "assets/<int:pk>/edit-css/<int:css_pk>/",
                 EditThemeCss.as_view(),
                 name="edit-css-file",
             ),
-            url(
-                r"^assets/(?P<pk>\d+)/new-css-link/$",
+            path(
+                "assets/<int:pk>/new-css-link/",
                 NewThemeCssLink.as_view(),
                 name="new-css-link",
             ),
-            url(
-                r"^assets/(?P<pk>\d+)/edit-css-link/(?P<css_pk>\d+)/$",
+            path(
+                "assets/<int:pk>/edit-css-link/<int:css_pk>/",
                 EditThemeCssLink.as_view(),
                 name="edit-css-link",
             ),

+ 0 - 1
misago/threads/__init__.py

@@ -1 +0,0 @@
-default_app_config = "misago.threads.apps.MisagoThreadsConfig"

+ 10 - 12
misago/threads/admin/__init__.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 from django.utils.translation import gettext_lazy as _
 
 from .views.attachments import AttachmentsList, DeleteAttachment
@@ -13,24 +13,22 @@ from .views.attachmenttypes import (
 class MisagoAdminExtension:
     def register_urlpatterns(self, urlpatterns):
         # Attachment
-        urlpatterns.namespace(r"^attachments/", "attachments")
+        urlpatterns.namespace("attachments/", "attachments")
         urlpatterns.patterns(
             "attachments",
-            url(r"^$", AttachmentsList.as_view(), name="index"),
-            url(r"^(?P<page>\d+)/$", AttachmentsList.as_view(), name="index"),
-            url(r"^delete/(?P<pk>\d+)/$", DeleteAttachment.as_view(), name="delete"),
+            path("", AttachmentsList.as_view(), name="index"),
+            path("<int:page>/", AttachmentsList.as_view(), name="index"),
+            path("delete/<int:pk>/", DeleteAttachment.as_view(), name="delete"),
         )
 
         # AttachmentType
-        urlpatterns.namespace(r"^attachment-types/", "attachment-types", "settings")
+        urlpatterns.namespace("attachment-types/", "attachment-types", "settings")
         urlpatterns.patterns(
             "settings:attachment-types",
-            url(r"^$", AttachmentTypesList.as_view(), name="index"),
-            url(r"^new/$", NewAttachmentType.as_view(), name="new"),
-            url(r"^edit/(?P<pk>\d+)/$", EditAttachmentType.as_view(), name="edit"),
-            url(
-                r"^delete/(?P<pk>\d+)/$", DeleteAttachmentType.as_view(), name="delete"
-            ),
+            path("", AttachmentTypesList.as_view(), name="index"),
+            path("new/", NewAttachmentType.as_view(), name="new"),
+            path("edit/<int:pk>/", EditAttachmentType.as_view(), name="edit"),
+            path("delete/<int:pk>/", DeleteAttachmentType.as_view(), name="delete"),
         )
 
     def register_navigation_nodes(self, site):

+ 4 - 5
misago/threads/migrations/0001_initial.py

@@ -1,7 +1,6 @@
 import django.db.models.deletion
 import django.utils.timezone
 from django.conf import settings
-from django.contrib.postgres.fields import JSONField
 from django.contrib.postgres.search import SearchVectorField
 from django.db import migrations, models
 
@@ -35,7 +34,7 @@ class Migration(migrations.Migration):
                 ("original", models.TextField()),
                 ("parsed", models.TextField()),
                 ("checksum", models.CharField(max_length=64, default="-")),
-                ("attachments_cache", JSONField(null=True, blank=True)),
+                ("attachments_cache", models.JSONField(null=True, blank=True)),
                 ("posted_on", models.DateTimeField()),
                 ("updated_on", models.DateTimeField()),
                 ("edits", models.PositiveIntegerField(default=0)),
@@ -105,9 +104,9 @@ class Migration(migrations.Migration):
                 ),
                 ("is_event", models.BooleanField(default=False, db_index=True)),
                 ("event_type", models.CharField(max_length=255, null=True, blank=True)),
-                ("event_context", JSONField(null=True, blank=True)),
+                ("event_context", models.JSONField(null=True, blank=True)),
                 ("likes", models.PositiveIntegerField(default=0)),
-                ("last_likes", JSONField(blank=True, null=True)),
+                ("last_likes", models.JSONField(blank=True, null=True)),
                 ("search_document", models.TextField(blank=True, null=True)),
                 ("search_vector", SearchVectorField()),
             ],
@@ -517,7 +516,7 @@ class Migration(migrations.Migration):
                 ("posted_on", models.DateTimeField(default=django.utils.timezone.now)),
                 ("length", models.PositiveIntegerField(default=0)),
                 ("question", models.CharField(max_length=255)),
-                ("choices", django.contrib.postgres.fields.jsonb.JSONField()),
+                ("choices", models.JSONField()),
                 ("allowed_choices", models.PositiveIntegerField(default=1)),
                 ("allow_revotes", models.BooleanField(default=False)),
                 ("votes", models.PositiveIntegerField(default=0)),

+ 1 - 2
misago/threads/models/poll.py

@@ -2,7 +2,6 @@ from datetime import timedelta
 from math import ceil
 
 from django.conf import settings
-from django.contrib.postgres.fields import JSONField
 from django.db import models
 from django.utils import timezone
 
@@ -20,7 +19,7 @@ class Poll(models.Model):
     length = models.PositiveIntegerField(default=0)
 
     question = models.CharField(max_length=255)
-    choices = JSONField()
+    choices = models.JSONField()
     allowed_choices = models.PositiveIntegerField(default=1)
     allow_revotes = models.BooleanField(default=False)
 

+ 3 - 4
misago/threads/models/post.py

@@ -1,6 +1,5 @@
 import copy
 
-from django.contrib.postgres.fields import JSONField
 from django.contrib.postgres.indexes import GinIndex
 from django.contrib.postgres.search import SearchVector, SearchVectorField
 from django.db import models
@@ -28,7 +27,7 @@ class Post(models.Model):
         settings.AUTH_USER_MODEL, related_name="mention_set"
     )
 
-    attachments_cache = JSONField(null=True, blank=True)
+    attachments_cache = models.JSONField(null=True, blank=True)
 
     posted_on = models.DateTimeField(db_index=True)
     updated_on = models.DateTimeField()
@@ -63,10 +62,10 @@ class Post(models.Model):
 
     is_event = models.BooleanField(default=False, db_index=True)
     event_type = models.CharField(max_length=255, null=True, blank=True)
-    event_context = JSONField(null=True, blank=True)
+    event_context = models.JSONField(null=True, blank=True)
 
     likes = models.PositiveIntegerField(default=0)
-    last_likes = JSONField(null=True, blank=True)
+    last_likes = models.JSONField(null=True, blank=True)
 
     liked_by = models.ManyToManyField(
         settings.AUTH_USER_MODEL,

+ 2 - 2
misago/threads/serializers/moderation.py

@@ -289,8 +289,8 @@ class NewThreadSerializer(serializers.Serializer):
         max_value=Thread.WEIGHT_GLOBAL,
         min_value=Thread.WEIGHT_DEFAULT,
     )
-    is_hidden = serializers.NullBooleanField(required=False)
-    is_closed = serializers.NullBooleanField(required=False)
+    is_hidden = serializers.BooleanField(required=False, allow_null=True)
+    is_closed = serializers.BooleanField(required=False, allow_null=True)
 
     def validate_title(self, title):
         settings = self.context["settings"]

+ 2 - 2
misago/threads/signals.py

@@ -20,8 +20,8 @@ from .models import Attachment, Poll, PollVote, Post, PostEdit, PostLike, Thread
 
 delete_post = Signal()
 delete_thread = Signal()
-merge_post = Signal(providing_args=["other_post"])
-merge_thread = Signal(providing_args=["other_thread"])
+merge_post = Signal()
+merge_thread = Signal()
 move_post = Signal()
 move_thread = Signal()
 

+ 32 - 34
misago/threads/urls/__init__.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 
 from ...conf import settings
 
@@ -28,7 +28,7 @@ def threads_list_patterns(prefix, view, patterns):
             url_name = prefix
 
         urls.append(
-            url(
+            path(
                 pattern,
                 view.as_view(),
                 name=url_name,
@@ -42,19 +42,19 @@ if settings.MISAGO_THREADS_ON_INDEX:
     urlpatterns = threads_list_patterns(
         "threads",
         ForumThreadsList,
-        (r"^$", r"^my/$", r"^new/$", r"^unread/$", r"^subscribed/$", r"^unapproved/$"),
+        ("", "my/", "new/", "unread/", "subscribed/", "unapproved/"),
     )
 else:
     urlpatterns = threads_list_patterns(
         "threads",
         ForumThreadsList,
         (
-            r"^threads/$",
-            r"^threads/my/$",
-            r"^threads/new/$",
-            r"^threads/unread/$",
-            r"^threads/subscribed/$",
-            r"^threads/unapproved/$",
+            "threads/",
+            "threads/my/",
+            "threads/new/",
+            "threads/unread/",
+            "threads/subscribed/",
+            "threads/unapproved/",
         ),
     )
 
@@ -62,12 +62,12 @@ urlpatterns += threads_list_patterns(
     "category",
     CategoryThreadsList,
     (
-        r"^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/$",
-        r"^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/my/$",
-        r"^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/new/$",
-        r"^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/unread/$",
-        r"^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/subscribed/$",
-        r"^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/unapproved/$",
+        "c/<slug:slug>/<int:pk>/",
+        "c/<slug:slug>/<int:pk>/my/",
+        "c/<slug:slug>/<int:pk>/new/",
+        "c/<slug:slug>/<int:pk>/unread/",
+        "c/<slug:slug>/<int:pk>/subscribed/",
+        "c/<slug:slug>/<int:pk>/unapproved/",
     ),
 )
 
@@ -75,24 +75,24 @@ urlpatterns += threads_list_patterns(
     "private-threads",
     PrivateThreadsList,
     (
-        r"^private-threads/$",
-        r"^private-threads/my/$",
-        r"^private-threads/new/$",
-        r"^private-threads/unread/$",
-        r"^private-threads/subscribed/$",
+        "private-threads/",
+        "private-threads/my/",
+        "private-threads/new/",
+        "private-threads/unread/",
+        "private-threads/subscribed/",
     ),
 )
 
 
 def thread_view_patterns(prefix, view):
     urls = [
-        url(
-            r"^%s/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/$" % prefix[0],
+        path(
+            "%s/<slug:slug>/<int:pk>/" % prefix[0],
             view.as_view(),
             name=prefix,
         ),
-        url(
-            r"^%s/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/(?P<page>\d+)/$" % prefix[0],
+        path(
+            "%s/<slug:slug>/<int:pk>/<int:page>/" % prefix[0],
             view.as_view(),
             name=prefix,
         ),
@@ -109,20 +109,18 @@ def goto_patterns(prefix, **views):
 
     post_view = views.pop("post", None)
     if post_view:
-        url_pattern = (
-            r"^%s/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/post/(?P<post>\d+)/$" % prefix[0]
-        )
+        url_pattern = "%s/<slug:slug>/<int:pk>/post/<int:post>/" % prefix[0]
         url_name = "%s-post" % prefix
-        urls.append(url(url_pattern, post_view.as_view(), name=url_name))
+        urls.append(path(url_pattern, post_view.as_view(), name=url_name))
 
     for name, view in views.items():
         name = name.replace("_", "-")
-        url_pattern = r"^%s/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/%s/$" % (
+        url_pattern = "%s/<slug:slug>/<int:pk>/%s/" % (
             prefix[0],
             name,
         )
         url_name = "%s-%s" % (prefix, name)
-        urls.append(url(url_pattern, view.as_view(), name=url_name))
+        urls.append(path(url_pattern, view.as_view(), name=url_name))
 
     return urls
 
@@ -144,13 +142,13 @@ urlpatterns += goto_patterns(
 )
 
 urlpatterns += [
-    url(
-        r"^a/(?P<secret>[-a-zA-Z0-9]+)/(?P<pk>\d+)/",
+    path(
+        "a/<slug:secret>/<int:pk>/",
         attachment_server,
         name="attachment",
     ),
-    url(
-        r"^a/thumb/(?P<secret>[-a-zA-Z0-9]+)/(?P<pk>\d+)/",
+    path(
+        "a/thumb/<slug:secret>/<int:pk>/",
         attachment_server,
         name="attachment-thumbnail",
         kwargs={"thumbnail": True},

+ 22 - 22
misago/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls import include, url
+from django.urls import include, path
 from django.views.generic import TemplateView
 
 from . import hooks
@@ -9,17 +9,17 @@ app_name = "misago"
 
 # Register Misago Apps
 urlpatterns = hooks.urlpatterns + [
-    url(r"^", include("misago.analytics.urls")),
-    url(r"^", include("misago.legal.urls")),
-    url(r"^", include("misago.users.urls")),
-    url(r"^", include("misago.categories.urls")),
-    url(r"^", include("misago.threads.urls")),
-    url(r"^", include("misago.search.urls")),
-    url(r"^", include("misago.socialauth.urls")),
-    url(r"^", include("misago.healthcheck.urls")),
+    path("", include("misago.analytics.urls")),
+    path("", include("misago.legal.urls")),
+    path("", include("misago.users.urls")),
+    path("", include("misago.categories.urls")),
+    path("", include("misago.threads.urls")),
+    path("", include("misago.search.urls")),
+    path("", include("misago.socialauth.urls")),
+    path("", include("misago.healthcheck.urls")),
     # default robots.txt
-    url(
-        r"^robots.txt$",
+    path(
+        "robots.txt",
         TemplateView.as_view(
             content_type="text/plain", template_name="misago/robots.txt"
         ),
@@ -28,29 +28,29 @@ urlpatterns = hooks.urlpatterns + [
     # any request with path that falls below this one is assumed to be directed
     # at Misago and will be handled by misago.views.exceptionhandler if it
     # results in Http404 or PermissionDenied exception
-    url(r"^$", forum_index, name="index"),
+    path("", forum_index, name="index"),
 ]
 
 
 # Register API
 apipatterns = hooks.apipatterns + [
-    url(r"^", include("misago.categories.urls.api")),
-    url(r"^", include("misago.legal.urls.api")),
-    url(r"^", include("misago.markup.urls")),
-    url(r"^", include("misago.threads.urls.api")),
-    url(r"^", include("misago.users.urls.api")),
-    url(r"^", include("misago.search.urls.api")),
+    path("", include("misago.categories.urls.api")),
+    path("", include("misago.legal.urls.api")),
+    path("", include("misago.markup.urls")),
+    path("", include("misago.threads.urls.api")),
+    path("", include("misago.users.urls.api")),
+    path("", include("misago.search.urls.api")),
 ]
 
-urlpatterns += [url(r"^api/", include((apipatterns, "api"), namespace="api"))]
+urlpatterns += [path("api/", include((apipatterns, "api"), namespace="api"))]
 
 
 # Register Misago ACP
 if settings.MISAGO_ADMIN_PATH:
     # Admin patterns recognised by Misago
-    adminpatterns = [url(r"^", include("misago.admin.urls"))]
+    adminpatterns = [path("", include("misago.admin.urls"))]
 
-    admin_prefix = r"^%s/" % settings.MISAGO_ADMIN_PATH
+    admin_prefix = f"{settings.MISAGO_ADMIN_PATH}/"
     urlpatterns += [
-        url(admin_prefix, include((adminpatterns, "admin"), namespace="admin"))
+        path(admin_prefix, include((adminpatterns, "admin"), namespace="admin"))
     ]

+ 0 - 2
misago/users/__init__.py

@@ -1,3 +1 @@
-default_app_config = "misago.users.apps.MisagoUsersConfig"
-
 BANS_CACHE = "bans"

+ 25 - 25
misago/users/admin/__init__.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 from django.contrib import admin as djadmin
 from django.contrib.auth import get_user_model
 from django.utils.translation import gettext_lazy as _
@@ -24,49 +24,49 @@ djadmin.site.register(model_or_iterable=get_user_model(), admin_class=UserAdminM
 class MisagoAdminExtension:
     def register_urlpatterns(self, urlpatterns):
         # Users section
-        urlpatterns.namespace(r"^users/", "users")
+        urlpatterns.namespace("users/", "users")
 
         # Accounts
         urlpatterns.patterns(
             "users",
-            url(r"^$", UsersList.as_view(), name="index"),
-            url(r"^(?P<page>\d+)/$", UsersList.as_view(), name="index"),
-            url(r"^new/$", NewUser.as_view(), name="new"),
-            url(r"^edit/(?P<pk>\d+)/$", EditUser.as_view(), name="edit"),
+            path("", UsersList.as_view(), name="index"),
+            path("<int:page>/", UsersList.as_view(), name="index"),
+            path("new/", NewUser.as_view(), name="new"),
+            path("edit/<int:pk>/", EditUser.as_view(), name="edit"),
         )
 
         # Bans
-        urlpatterns.namespace(r"^bans/", "bans", "users")
+        urlpatterns.namespace("bans/", "bans", "users")
         urlpatterns.patterns(
             "users:bans",
-            url(r"^$", BansList.as_view(), name="index"),
-            url(r"^(?P<page>\d+)/$", BansList.as_view(), name="index"),
-            url(r"^new/$", NewBan.as_view(), name="new"),
-            url(r"^edit/(?P<pk>\d+)/$", EditBan.as_view(), name="edit"),
-            url(r"^delete/(?P<pk>\d+)/$", DeleteBan.as_view(), name="delete"),
+            path("", BansList.as_view(), name="index"),
+            path("<int:page>/", BansList.as_view(), name="index"),
+            path("new/", NewBan.as_view(), name="new"),
+            path("edit/<int:pk>/", EditBan.as_view(), name="edit"),
+            path("delete/<int:pk>/", DeleteBan.as_view(), name="delete"),
         )
 
         # Data Downloads
-        urlpatterns.namespace(r"^data-downloads/", "data-downloads", "users")
+        urlpatterns.namespace("data-downloads/", "data-downloads", "users")
         urlpatterns.patterns(
             "users:data-downloads",
-            url(r"^$", DataDownloadsList.as_view(), name="index"),
-            url(r"^(?P<page>\d+)/$", DataDownloadsList.as_view(), name="index"),
-            url(r"^request/$", RequestDataDownloads.as_view(), name="request"),
+            path("", DataDownloadsList.as_view(), name="index"),
+            path("<int:page>/", DataDownloadsList.as_view(), name="index"),
+            path("request/", RequestDataDownloads.as_view(), name="request"),
         )
 
         # Ranks
-        urlpatterns.namespace(r"^ranks/", "ranks")
+        urlpatterns.namespace("ranks/", "ranks")
         urlpatterns.patterns(
             "ranks",
-            url(r"^$", RanksList.as_view(), name="index"),
-            url(r"^new/$", NewRank.as_view(), name="new"),
-            url(r"^edit/(?P<pk>\d+)/$", EditRank.as_view(), name="edit"),
-            url(r"^default/(?P<pk>\d+)/$", DefaultRank.as_view(), name="default"),
-            url(r"^move/down/(?P<pk>\d+)/$", MoveDownRank.as_view(), name="down"),
-            url(r"^move/up/(?P<pk>\d+)/$", MoveUpRank.as_view(), name="up"),
-            url(r"^users/(?P<pk>\d+)/$", RankUsers.as_view(), name="users"),
-            url(r"^delete/(?P<pk>\d+)/$", DeleteRank.as_view(), name="delete"),
+            path("", RanksList.as_view(), name="index"),
+            path("new/", NewRank.as_view(), name="new"),
+            path("edit/<int:pk>/", EditRank.as_view(), name="edit"),
+            path("default/<int:pk>/", DefaultRank.as_view(), name="default"),
+            path("move/down/<int:pk>/", MoveDownRank.as_view(), name="down"),
+            path("move/up/<int:pk>/", MoveUpRank.as_view(), name="up"),
+            path("users/<int:pk>/", RankUsers.as_view(), name="users"),
+            path("delete/<int:pk>/", DeleteRank.as_view(), name="delete"),
         )
 
     def register_navigation_nodes(self, site):

+ 0 - 12
misago/users/api/auth.py

@@ -38,9 +38,6 @@ def login(request):
     POST /auth/ with CSRF, username and password
     will attempt to authenticate new user
     """
-    if request.settings.enable_sso:
-        raise PermissionDenied(_("Please use the 3rd party site to authenticate."))
-
     form = AuthenticationForm(request, data=request.data)
     if form.is_valid():
         auth.login(request, form.user_cache)
@@ -88,9 +85,6 @@ def send_activation(request):
     POST /auth/send-activation/ with CSRF token and email
     will mail account activation link to requester
     """
-    if request.settings.enable_sso:
-        raise PermissionDenied(_("Please use the 3rd party site to authenticate."))
-
     form = ResendActivationForm(request.data)
     if not form.is_valid():
         return Response(form.get_errors_dict(), status=status.HTTP_400_BAD_REQUEST)
@@ -126,9 +120,6 @@ def send_password_form(request):
     POST /auth/send-password-form/ with CSRF token and email
     will mail change password form link to requester
     """
-    if request.settings.enable_sso:
-        raise PermissionDenied(_("Please use the 3rd party site to authenticate."))
-
     form = ResetPasswordForm(request.data)
     if not form.is_valid():
         return Response(form.get_errors_dict(), status=status.HTTP_400_BAD_REQUEST)
@@ -170,9 +161,6 @@ def change_forgotten_password(request, pk, token):
     POST /auth/change-password/user/token/ with CSRF and new password
     will change forgotten password
     """
-    if request.settings.enable_sso:
-        raise PermissionDenied(_("Please use the 3rd party site to authenticate."))
-
     invalid_message = _("Form link is invalid. Please try again.")
     expired_message = _("Your link has expired. Please request new one.")
 

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

@@ -1,5 +1,5 @@
 from django.contrib.auth import get_user_model
-from django.contrib.staticfiles.templatetags.staticfiles import static
+from django.template.context_processors import static
 from rest_framework.decorators import api_view
 from rest_framework.response import Response
 

+ 0 - 23
misago/users/api/users.py

@@ -86,9 +86,6 @@ class UserViewSet(viewsets.GenericViewSet):
         return list_endpoint(request)
 
     def create(self, request):
-        if request.settings.enable_sso:
-            raise PermissionDenied(_("Please use the 3rd party site to register."))
-
         return create_endpoint(request)
 
     def retrieve(self, request, pk=None):
@@ -132,11 +129,6 @@ class UserViewSet(viewsets.GenericViewSet):
 
     @action(methods=["get", "post"], detail=True)
     def username(self, request, pk=None):
-        if request.settings.enable_sso:
-            raise PermissionDenied(
-                _("Please use the 3rd party site to change your username.")
-            )
-
         get_int_or_404(pk)
         allow_self_only(request.user, pk, _("You can't change other users names."))
 
@@ -156,11 +148,6 @@ class UserViewSet(viewsets.GenericViewSet):
         url_name="change-password",
     )
     def change_password(self, request, pk=None):
-        if request.settings.enable_sso:
-            raise PermissionDenied(
-                _("Please use the 3rd party site to change your password.")
-            )
-
         get_int_or_404(pk)
         allow_self_only(request.user, pk, _("You can't change other users passwords."))
 
@@ -170,11 +157,6 @@ class UserViewSet(viewsets.GenericViewSet):
         methods=["post"], detail=True, url_path="change-email", url_name="change-email"
     )
     def change_email(self, request, pk=None):
-        if request.settings.enable_sso:
-            raise PermissionDenied(
-                _("Please use the 3rd party site to change your e-mail.")
-            )
-
         get_int_or_404(pk)
         allow_self_only(
             request.user, pk, _("You can't change other users e-mail addresses.")
@@ -206,11 +188,6 @@ class UserViewSet(viewsets.GenericViewSet):
         url_name="delete-own-account",
     )
     def delete_own_account(self, request, pk=None):
-        if request.settings.enable_sso:
-            raise PermissionDenied(
-                _("Please use the 3rd party site to delete account.")
-            )
-
         serializer = DeleteOwnAccountSerializer(
             data=request.data, context={"user": request.user}
         )

+ 0 - 9
misago/users/apps.py

@@ -19,9 +19,6 @@ class MisagoUsersConfig(AppConfig):
         self.register_default_user_profile_pages()
 
     def register_default_usercp_pages(self):
-        def sso_is_disabled(request):
-            return not request.settings.enable_sso
-
         usercp.add_section(
             link="misago:usercp-change-forum-options",
             name=_("Forum options"),
@@ -39,14 +36,12 @@ class MisagoUsersConfig(AppConfig):
             name=_("Change username"),
             component="change-username",
             icon="card_membership",
-            visible_if=sso_is_disabled,
         )
         usercp.add_section(
             link="misago:usercp-change-email-password",
             name=_("Change email or password"),
             component="sign-in-credentials",
             icon="vpn_key",
-            visible_if=sso_is_disabled,
         )
 
         def can_download_own_data(request):
@@ -61,9 +56,6 @@ class MisagoUsersConfig(AppConfig):
         )
 
         def can_delete_own_account(request):
-            if request.settings.enable_sso:
-                return False
-
             return request.settings.allow_delete_own_account
 
         usercp.add_section(
@@ -71,7 +63,6 @@ class MisagoUsersConfig(AppConfig):
             name=_("Delete account"),
             component="delete-account",
             icon="cancel",
-            visible_if=can_delete_own_account,
         )
 
     def register_default_users_list_pages(self):

+ 2 - 2
misago/users/avatars/dynamic.py

@@ -69,8 +69,8 @@ def draw_avatar_flavour(user, image):
     size = int(image_size * 0.7)
     font = ImageFont.truetype(FONT_FILE, size=size)
 
-    text_size = font.getsize(string)
-    text_pos = ((image_size - text_size[0]) / 2, (image_size - text_size[1]) / 2)
+    text_box = font.getbbox(string)
+    text_pos = ((image_size - text_box[0]) / 2, (image_size - text_box[1]) / 2)
 
     writer = ImageDraw.Draw(image)
     writer.text(text_pos, string, font=font)

+ 2 - 2
misago/users/avatars/store.py

@@ -4,7 +4,7 @@ from io import BytesIO
 
 from django.core.files.base import ContentFile
 from django.utils.crypto import get_random_string
-from PIL import Image
+from PIL.Image import Resampling
 
 from ...conf import settings
 
@@ -36,7 +36,7 @@ def store_avatar(user, image):
     for size in sorted(settings.MISAGO_AVATARS_SIZES, reverse=True):
         image_stream = BytesIO()
 
-        image = image.resize((size, size), Image.ANTIALIAS)
+        image = image.resize((size, size), Resampling.LANCZOS)
         image.save(image_stream, "PNG")
 
         avatars.append(

+ 1 - 2
misago/users/migrations/0001_initial.py

@@ -1,7 +1,6 @@
 import django.db.models.deletion
 import django.utils.timezone
 from django.conf import settings
-from django.contrib.postgres.fields import JSONField
 from django.db import migrations, models
 
 import misago.users.avatars.store
@@ -123,7 +122,7 @@ class Migration(migrations.Migration):
                     "avatar_crop",
                     models.CharField(max_length=255, null=True, blank=True),
                 ),
-                ("avatars", JSONField(null=True, blank=True)),
+                ("avatars", models.JSONField(null=True, blank=True)),
                 ("is_avatar_locked", models.BooleanField(default=False)),
                 ("avatar_lock_user_message", models.TextField(null=True, blank=True)),
                 ("avatar_lock_staff_message", models.TextField(null=True, blank=True)),

+ 17 - 0
misago/users/migrations/0023_remove_user_sso_id.py

@@ -0,0 +1,17 @@
+# Generated by Django 3.2.15 on 2022-09-27 18:44
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("misago_users", "0022_deleteduser"),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name="user",
+            name="sso_id",
+        ),
+    ]

+ 1 - 1
misago/users/models/deleteduser.py

@@ -1,6 +1,6 @@
 from django.db import models
 from django.utils import timezone
-from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import gettext_lazy as _
 
 
 class DeletedUser(models.Model):

+ 2 - 4
misago/users/models/user.py

@@ -4,7 +4,7 @@ from django.contrib.auth.models import AbstractBaseUser
 from django.contrib.auth.models import AnonymousUser as DjangoAnonymousUser
 from django.contrib.auth.models import PermissionsMixin
 from django.contrib.auth.models import UserManager as BaseUserManager
-from django.contrib.postgres.fields import ArrayField, HStoreField, JSONField
+from django.contrib.postgres.fields import ArrayField, HStoreField
 from django.core.mail import send_mail
 from django.db import models
 from django.db.models import Q
@@ -173,7 +173,7 @@ class User(AbstractBaseUser, PermissionsMixin):
         max_length=255, upload_to=avatars_store.upload_to, null=True, blank=True
     )
     avatar_crop = models.CharField(max_length=255, null=True, blank=True)
-    avatars = JSONField(null=True, blank=True)
+    avatars = models.JSONField(null=True, blank=True)
     is_avatar_locked = models.BooleanField(default=False)
     avatar_lock_user_message = models.TextField(null=True, blank=True)
     avatar_lock_staff_message = models.TextField(null=True, blank=True)
@@ -216,8 +216,6 @@ class User(AbstractBaseUser, PermissionsMixin):
     profile_fields = HStoreField(default=dict)
     agreements = ArrayField(models.PositiveIntegerField(), default=list)
 
-    sso_id = models.PositiveIntegerField(null=True, blank=True, unique=True)
-
     USERNAME_FIELD = "slug"
     REQUIRED_FIELDS = ["email"]
 

+ 0 - 13
misago/users/tests/test_activation_views.py

@@ -82,19 +82,6 @@ class ActivationViewsTests(TestCase):
         user = User.objects.get(pk=user.pk)
         self.assertEqual(user.requires_activation, 0)
 
-    @override_dynamic_settings(enable_sso=True)
-    def test_account_activation_is_not_avaliable_when_sso_is_enabled(self):
-        user = create_test_user("User", "user@example.com", requires_activation=1)
-        activation_token = make_activation_token(user)
-
-        response = self.client.get(
-            reverse(
-                "misago:activate-by-token",
-                kwargs={"pk": user.pk, "token": activation_token},
-            )
-        )
-        self.assertEqual(response.status_code, 403)
-
     def test_view_activate_inactive(self):
         """activate inactive user passess"""
         user = create_test_user("User", "user@example.com", requires_activation=1)

+ 0 - 24
misago/users/tests/test_auth_api.py

@@ -227,15 +227,6 @@ class GatewayTests(TestCase):
         user_json = response.json()
         self.assertIsNone(user_json["id"])
 
-    @override_dynamic_settings(enable_sso=True)
-    def test_login_api_is_disabled_when_sso_is_enabled(self):
-        user = create_test_user("User", "user@example.com", "password")
-
-        response = self.client.post(
-            "/api/auth/", data={"username": "User", "password": "password"}
-        )
-        self.assertEqual(response.status_code, 403)
-
 
 class UserCredentialsTests(TestCase):
     def test_edge_returns_response(self):
@@ -361,11 +352,6 @@ class SendActivationApiTests(TestCase):
 
         self.assertTrue(mail.outbox)
 
-    @override_dynamic_settings(enable_sso=True)
-    def test_send_activation_api_is_disabled_when_sso_is_enabled(self):
-        response = self.client.post(self.link, data={"email": self.user.email})
-        self.assertEqual(response.status_code, 403)
-
 
 class SendPasswordFormApiTests(TestCase):
     def setUp(self):
@@ -477,11 +463,6 @@ class SendPasswordFormApiTests(TestCase):
 
         self.assertTrue(not mail.outbox)
 
-    @override_dynamic_settings(enable_sso=True)
-    def test_send_password_change_link_api_is_disabled_when_sso_is_enabled(self):
-        response = self.client.post(self.link, data={"email": self.user.email})
-        self.assertEqual(response.status_code, 403)
-
 
 class ChangePasswordApiTests(TestCase):
     def setUp(self):
@@ -606,8 +587,3 @@ class ChangePasswordApiTests(TestCase):
                 )
             },
         )
-
-    @override_dynamic_settings(enable_sso=True)
-    def test_password_change_api_is_disabled_when_sso_is_enabled(self):
-        response = self.client.post(self.link % (self.user.pk, "asda7ad89sa7d9s789as"))
-        self.assertEqual(response.status_code, 403)

+ 0 - 16
misago/users/tests/test_forgottenpassword_views.py

@@ -115,19 +115,3 @@ class ForgottenPasswordViewsTests(UserTestCase):
             )
         )
         self.assertContains(response, password_token)
-
-    @override_dynamic_settings(enable_sso=True)
-    def test_change_password_form_is_not_available_when_sso_is_enabled(self):
-        user = create_test_user(
-            "OtherUser", "otheruser@example.com", self.USER_PASSWORD
-        )
-
-        password_token = make_password_change_token(user)
-
-        response = self.client.get(
-            reverse(
-                "misago:forgotten-password-change-form",
-                kwargs={"pk": user.pk, "token": password_token},
-            )
-        )
-        self.assertEqual(response.status_code, 403)

+ 0 - 10
misago/users/tests/test_options_views.py

@@ -46,11 +46,6 @@ class ConfirmChangeEmailTests(AuthenticatedUserTestCase):
             response, "Change confirmation link is invalid.", status_code=400
         )
 
-    @override_dynamic_settings(enable_sso=True)
-    def test_email_change_fails_when_sso_is_enabled(self):
-        response = self.client.get(self.link)
-        self.assertEqual(response.status_code, 403)
-
     def test_change_email(self):
         """valid token changes email"""
         response = self.client.get(self.link)
@@ -90,11 +85,6 @@ class ConfirmChangePasswordTests(AuthenticatedUserTestCase):
             response, "Change confirmation link is invalid.", status_code=400
         )
 
-    @override_dynamic_settings(enable_sso=True)
-    def test_password_change_fails_when_sso_is_enabled(self):
-        response = self.client.get(self.link)
-        self.assertEqual(response.status_code, 403)
-
     def test_change_password(self):
         """valid token changes password"""
         response = self.client.get(self.link)

+ 14 - 12
misago/users/tests/test_realip_middleware.py

@@ -1,8 +1,12 @@
-from django.test import TestCase
+from django.http import HttpResponse
 
 from ..middleware import RealIPMiddleware
 
 
+def get_response(*_):
+    return HttpResponse("OK!")
+
+
 class MockRequest:
     def __init__(self, addr, forwarded_for=None):
         self.META = {"REMOTE_ADDR": addr}
@@ -11,17 +15,15 @@ class MockRequest:
             self.META["HTTP_X_FORWARDED_FOR"] = forwarded_for
 
 
-class RealIPMiddlewareTests(TestCase):
-    def test_middleware_sets_ip_from_remote_add(self):
-        """Middleware sets ip from remote_addr header"""
-        request = MockRequest("83.42.13.77")
-        RealIPMiddleware().process_request(request)
+def test_user_ip_middleware_sets_ip_from_remote_add_on_request():
+    request = MockRequest("83.42.13.77")
+    RealIPMiddleware(get_response)(request)
+
+    assert request.user_ip == request.META["REMOTE_ADDR"]
 
-        self.assertEqual(request.user_ip, request.META["REMOTE_ADDR"])
 
-    def test_middleware_sets_ip_from_forwarded_for(self):
-        """Middleware sets ip from forwarded_for header"""
-        request = MockRequest("127.0.0.1", "83.42.13.77")
-        RealIPMiddleware().process_request(request)
+def test_user_ip_middleware_sets_ip_from_forwarded_for_on_request():
+    request = MockRequest("127.0.0.1", "83.42.13.77")
+    RealIPMiddleware(get_response)(request)
 
-        self.assertEqual(request.user_ip, request.META["HTTP_X_FORWARDED_FOR"])
+    assert request.user_ip == request.META["HTTP_X_FORWARDED_FOR"]

+ 0 - 8
misago/users/tests/test_user_changeemail_api.py

@@ -73,14 +73,6 @@ class UserChangeEmailTests(AuthenticatedUserTestCase):
             response.json(), {"new_email": ["This e-mail address is not available."]}
         )
 
-    @override_dynamic_settings(enable_sso=True)
-    def test_email_change_fails_when_sso_is_enabled(self):
-        response = self.client.post(
-            self.link,
-            data={"new_email": "new@email.com", "password": self.USER_PASSWORD},
-        )
-        self.assertEqual(response.status_code, 403)
-
     @override_dynamic_settings(forum_address="http://test.com/")
     def test_change_email(self):
         """api allows users to change their e-mail addresses"""

+ 0 - 8
misago/users/tests/test_user_changepassword_api.py

@@ -68,14 +68,6 @@ class UserChangePasswordTests(AuthenticatedUserTestCase):
             },
         )
 
-    @override_dynamic_settings(enable_sso=True)
-    def test_password_change_fails_when_sso_is_enabled(self):
-        response = self.client.post(
-            self.link,
-            data={"new_password": "N3wP@55w0rd", "password": self.USER_PASSWORD},
-        )
-        self.assertEqual(response.status_code, 403)
-
     @override_dynamic_settings(forum_address="http://test.com/")
     def test_change_password(self):
         """api allows users to change their passwords"""

+ 0 - 12
misago/users/tests/test_user_create_api.py

@@ -434,18 +434,6 @@ class UserCreateTests(UserTestCase):
             },
         )
 
-    @override_dynamic_settings(enable_sso=True)
-    def test_registration_fails_when_sso_is_enabled(self):
-        response = self.client.post(
-            self.api_link,
-            data={
-                "username": "User",
-                "email": "user@example.com",
-                "password": self.USER_PASSWORD,
-            },
-        )
-        self.assertEqual(response.status_code, 403)
-
     @override_dynamic_settings(account_activation="none")
     def test_registration_creates_active_user(self):
         """api creates active and signed in user on POST"""

+ 0 - 5
misago/users/tests/test_user_username_api.py

@@ -68,11 +68,6 @@ class UserUsernameTests(AuthenticatedUserTestCase):
             {"detail": "Username can only contain latin alphabet letters and digits."},
         )
 
-    @override_dynamic_settings(enable_sso=True)
-    def test_username_change_fails_when_sso_is_enabled(self):
-        response = self.client.post(self.link, data={"username": "Pointless"})
-        self.assertEqual(response.status_code, 403)
-
     def test_change_username(self):
         """api changes username and records change"""
         response = self.client.get(self.link)

+ 0 - 5
misago/users/tests/test_users_api.py

@@ -534,11 +534,6 @@ class UserDeleteOwnAccountTests(AuthenticatedUserTestCase):
         self.assertTrue(self.user.is_active)
         self.assertFalse(self.user.is_deleting_account)
 
-    @override_dynamic_settings(allow_delete_own_account=True, enable_sso=True)
-    def test_own_account_deletion_fails_when_sso_is_enabled(self):
-        response = self.client.post(self.api_link, {"password": self.USER_PASSWORD})
-        self.assertEqual(response.status_code, 403)
-
     @override_dynamic_settings(allow_delete_own_account=True)
     def test_delete_own_account(self):
         """deactivates account and marks it for deletion"""

+ 52 - 52
misago/users/urls/__init__.py

@@ -1,4 +1,4 @@
-from django.conf.urls import include, url
+from django.urls import include, path
 
 from ...core.views import home_redirect
 
@@ -13,74 +13,74 @@ from ..views import (
 )
 
 urlpatterns = [
-    url(r"^banned/$", home_redirect, name="banned"),
-    url(r"^login/$", auth.login, name="login"),
-    url(r"^logout/$", auth.logout, name="logout"),
-    url(
-        r"^request-activation/$",
+    path("banned/", home_redirect, name="banned"),
+    path("login/", auth.login, name="login"),
+    path("logout/", auth.logout, name="logout"),
+    path(
+        "request-activation/",
         activation.request_activation,
         name="request-activation",
     ),
-    url(
-        r"^activation/(?P<pk>\d+)/(?P<token>[a-zA-Z0-9]+)/$",
+    path(
+        "activation/<int:pk>/<slug:token>/",
         activation.activate_by_token,
         name="activate-by-token",
     ),
-    url(
-        r"^forgotten-password/$",
+    path(
+        "forgotten-password/",
         forgottenpassword.request_reset,
         name="forgotten-password",
     ),
-    url(
-        r"^forgotten-password/(?P<pk>\d+)/(?P<token>[a-zA-Z0-9]+)/$",
+    path(
+        "forgotten-password/<int:pk>/<slug:token>/",
         forgottenpassword.reset_password_form,
         name="forgotten-password-change-form",
     ),
 ]
 
 urlpatterns += [
-    url(r"^options/$", options.index, name="options"),
-    url(r"^options/(?P<form_name>[-a-zA-Z]+)/$", options.index, name="options-form"),
-    url(r"^options/forum-options/$", options.index, name="usercp-change-forum-options"),
-    url(r"^options/edit-details/$", options.index, name="usercp-edit-details"),
-    url(r"^options/change-username/$", options.index, name="usercp-change-username"),
-    url(
-        r"^options/sign-in-credentials/$",
+    path("options/", options.index, name="options"),
+    path("options/<slug:form_name>/", options.index, name="options-form"),
+    path("options/forum-options/", options.index, name="usercp-change-forum-options"),
+    path("options/edit-details/", options.index, name="usercp-edit-details"),
+    path("options/change-username/", options.index, name="usercp-change-username"),
+    path(
+        "options/sign-in-credentials/",
         options.index,
         name="usercp-change-email-password",
     ),
-    url(
-        r"^options/change-email/(?P<token>[a-zA-Z0-9]+)/$",
+    path(
+        "options/change-email/<slug:token>/",
         options.confirm_email_change,
         name="options-confirm-email-change",
     ),
-    url(
-        r"^options/change-password/(?P<token>[a-zA-Z0-9]+)/$",
+    path(
+        "options/change-password/<slug:token>/",
         options.confirm_password_change,
         name="options-confirm-password-change",
     ),
-    url(r"^options/dowload-data/$", options.index, name="usercp-download-data"),
-    url(r"^options/delete-account/$", options.index, name="usercp-delete-account"),
+    path("options/dowload-data/", options.index, name="usercp-download-data"),
+    path("options/delete-account/", options.index, name="usercp-delete-account"),
 ]
 
 urlpatterns += [
-    url(
-        r"^users/",
+    path(
+        "users/",
         include(
             [
-                url(r"^$", lists.landing, name="users"),
-                url(
-                    r"^active-posters/$",
+                path("", lists.landing, name="users"),
+                path(
+                    "active-posters/",
                     lists.ActivePostersView.as_view(),
                     name="users-active-posters",
                 ),
-                url(
-                    r"^(?P<slug>[-a-zA-Z0-9]+)/$",
+                path(
+                    "<slug:slug>/",
                     lists.RankUsersView.as_view(),
                     name="users-rank",
                 ),
-                url(
-                    r"^(?P<slug>[-a-zA-Z0-9]+)/(?P<page>\d+)/$",
+                path(
+                    "<slug:slug>/<int:page>/",
                     lists.RankUsersView.as_view(),
                     name="users-rank",
                 ),
@@ -90,47 +90,47 @@ urlpatterns += [
 ]
 
 urlpatterns += [
-    url(
-        r"^u/(?P<slug>[a-zA-Z0-9]+)/(?P<pk>\d+)/",
+    path(
+        "u/<slug:slug>/<int:pk>/",
         include(
             [
-                url(r"^$", profile.LandingView.as_view(), name="user"),
-                url(r"^posts/$", profile.UserPostsView.as_view(), name="user-posts"),
-                url(
-                    r"^threads/$",
+                path("", profile.LandingView.as_view(), name="user"),
+                path("posts/", profile.UserPostsView.as_view(), name="user-posts"),
+                path(
+                    "threads/",
                     profile.UserThreadsView.as_view(),
                     name="user-threads",
                 ),
-                url(
-                    r"^followers/$",
+                path(
+                    "followers/",
                     profile.UserFollowersView.as_view(),
                     name="user-followers",
                 ),
-                url(
-                    r"^follows/$",
+                path(
+                    "follows/",
                     profile.UserFollowsView.as_view(),
                     name="user-follows",
                 ),
-                url(
-                    r"^details/$",
+                path(
+                    "details/",
                     profile.UserProfileDetailsView.as_view(),
                     name="user-details",
                 ),
-                url(
-                    r"^username-history/$",
+                path(
+                    "username-history/",
                     profile.UserUsernameHistoryView.as_view(),
                     name="username-history",
                 ),
-                url(r"^ban-details/$", profile.UserBanView.as_view(), name="user-ban"),
+                path("ban-details/", profile.UserBanView.as_view(), name="user-ban"),
             ]
         ),
     )
 ]
 
 urlpatterns += [
-    url(r"^avatar/$", avatarserver.blank_avatar, name="blank-avatar"),
-    url(
-        r"^avatar/(?P<pk>\d+)/(?P<size>\d+)/$",
+    path("avatar/", avatarserver.blank_avatar, name="blank-avatar"),
+    path(
+        "avatar/<int:pk>/<int:size>/",
         avatarserver.user_avatar,
         name="user-avatar",
     ),

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

@@ -1,4 +1,4 @@
-from django.conf.urls import url
+from django.urls import path
 
 from ...core.apirouter import MisagoApiRouter
 from ..api import auth, captcha, mention
@@ -7,21 +7,21 @@ from ..api.usernamechanges import UsernameChangesViewSet
 from ..api.users import UserViewSet
 
 urlpatterns = [
-    url(r"^auth/$", auth.gateway, name="auth"),
-    url(r"^auth/criteria/$", auth.get_criteria, name="auth-criteria"),
-    url(r"^auth/send-activation/$", auth.send_activation, name="send-activation"),
-    url(
-        r"^auth/send-password-form/$",
+    path("auth/", auth.gateway, name="auth"),
+    path("auth/criteria/", auth.get_criteria, name="auth-criteria"),
+    path("auth/send-activation/", auth.send_activation, name="send-activation"),
+    path(
+        "auth/send-password-form/",
         auth.send_password_form,
         name="send-password-form",
     ),
-    url(
-        r"^auth/change-password/(?P<pk>\d+)/(?P<token>[a-zA-Z0-9]+)/$",
+    path(
+        "auth/change-password/<int:pk>/<slug:token>/",
         auth.change_forgotten_password,
         name="change-forgotten-password",
     ),
-    url(r"^captcha-question/$", captcha.question, name="captcha-question"),
-    url(r"^mention/$", mention.mention_suggestions, name="mention-suggestions"),
+    path("captcha-question/", captcha.question, name="captcha-question"),
+    path("mention/", mention.mention_suggestions, name="mention-suggestions"),
 ]
 
 router = MisagoApiRouter()

+ 0 - 5
misago/users/views/activation.py

@@ -16,11 +16,6 @@ def activation_view(f):
     @deny_authenticated
     @deny_banned_ips
     def decorator(request, *args, **kwargs):
-        if request.settings.enable_sso:
-            raise PermissionDenied(
-                _("Please use the 3rd party site to activate your account.")
-            )
-
         return f(request, *args, **kwargs)
 
     return decorator

+ 2 - 2
misago/users/views/auth.py

@@ -4,7 +4,7 @@ from django.conf import settings
 from django.contrib import auth
 from django.shortcuts import redirect
 from django.urls import NoReverseMatch
-from django.utils.http import is_safe_url
+from django.utils.http import url_has_allowed_host_and_scheme
 from django.views.decorators.cache import never_cache
 from django.views.decorators.csrf import csrf_protect
 from django.views.decorators.debug import sensitive_post_parameters
@@ -17,7 +17,7 @@ def login(request):
     if request.method == "POST":
         redirect_to = request.POST.get("redirect_to")
         if redirect_to:
-            is_redirect_safe = is_safe_url(
+            is_redirect_safe = url_has_allowed_host_and_scheme(
                 url=redirect_to,
                 allowed_hosts={request.get_host()},
                 require_https=request.is_secure(),

+ 2 - 16
misago/users/views/forgottenpassword.py

@@ -1,5 +1,4 @@
 from django.contrib.auth import get_user_model
-from django.core.exceptions import PermissionDenied
 from django.shortcuts import get_object_or_404, render
 from django.urls import reverse
 from django.utils.translation import gettext as _
@@ -10,20 +9,7 @@ from ..decorators import deny_banned_ips
 from ..tokens import is_password_change_token_valid
 
 
-def reset_view(f):
-    @deny_banned_ips
-    def decorator(request, *args, **kwargs):
-        if request.settings.enable_sso:
-            raise PermissionDenied(
-                _("Please use the 3rd party site to change password.")
-            )
-
-        return f(request, *args, **kwargs)
-
-    return decorator
-
-
-@reset_view
+@deny_banned_ips
 def request_reset(request):
     request.frontend_context.update(
         {"SEND_PASSWORD_RESET_API": reverse("misago:api:send-password-form")}
@@ -35,7 +21,7 @@ class ResetError(Exception):
     pass
 
 
-@reset_view
+@deny_banned_ips
 def reset_password_form(request, pk, token):
     requesting_user = get_object_or_404(get_user_model(), pk=pk)
 

+ 0 - 6
misago/users/views/options.py

@@ -43,9 +43,6 @@ def confirm_change_view(f):
 
 @confirm_change_view
 def confirm_email_change(request, token):
-    if request.settings.enable_sso:
-        raise PermissionDenied(_("Please use the 3rd party site to change e-mail."))
-
     new_credential = read_new_credential(request, "email", token)
     if not new_credential:
         raise ChangeError()
@@ -66,9 +63,6 @@ def confirm_email_change(request, token):
 
 @confirm_change_view
 def confirm_password_change(request, token):
-    if request.settings.enable_sso:
-        raise PermissionDenied(_("Please use the 3rd party site to change password."))
-
     new_credential = read_new_credential(request, "password", token)
     if not new_credential:
         raise ChangeError()

+ 16 - 13
requirements.in

@@ -1,25 +1,28 @@
-ariadne>0.3
+ariadne
+ariadne_django
 beautifulsoup4<4.8
-bleach<3.2
+bleach
 celery[redis]
-django<2.3
-djangorestframework<3.10
-django-debug-toolbar<1.12
-django-htmlmin<0.12
+coveralls
+django<4
+djangorestframework
+django-debug-toolbar
+django-htmlmin
 django-mptt
 django-simple-sso
-Faker<1.1
-html5lib<1.1
-markdown<3
+Faker
+html5lib
+markdown
 social-auth-app-django
 pyjwt
-pillow<7
-psycopg2-binary<2.9
+pillow
+psycopg2-binary
 pytest
+pytest-cov
 pytest-django
 pytest-mock
 pytz
-requests<3
+requests
 responses
 snapshottest
-unidecode<1.1
+unidecode

+ 224 - 67
requirements.txt

@@ -1,72 +1,229 @@
 #
-# This file is autogenerated by pip-compile
+# This file is autogenerated by pip-compile with python 3.10
 # To update, run:
 #
 #    pip-compile --output-file=requirements.txt requirements.in
 #
-amqp==2.5.2               # via kombu
-ariadne==0.11.0           # via -r requirements.in
-attrs==19.3.0             # via pytest
-beautifulsoup4==4.7.1     # via -r requirements.in, django-htmlmin
-billiard==3.6.3.0         # via celery
-bleach==3.1.5             # via -r requirements.in
-celery[redis]==4.4.2      # via -r requirements.in
-certifi==2020.4.5.1       # via requests
-cffi==1.14.0              # via cryptography
-chardet==3.0.4            # via requests
-cryptography==2.9.2       # via social-auth-core
-defusedxml==0.6.0         # via python3-openid, social-auth-core
-django-debug-toolbar==1.11  # via -r requirements.in
-django-htmlmin==0.11.0    # via -r requirements.in
-django-js-asset==1.2.2    # via django-mptt
-django-mptt==0.11.0       # via -r requirements.in
-django-simple-sso==0.14.1  # via -r requirements.in
-django==2.2.12            # via -r requirements.in, django-debug-toolbar, django-mptt, django-simple-sso, webservices
-djangorestframework==3.9.4  # via -r requirements.in
-faker==1.0.8              # via -r requirements.in
-fastdiff==0.2.0           # via snapshottest
-graphql-core==3.0.5       # via ariadne
-html5lib==1.0.1           # via -r requirements.in, django-htmlmin
-idna==2.9                 # via requests
-importlib-metadata==1.6.0  # via kombu, pluggy, pytest
-itsdangerous==1.1.0       # via django-simple-sso, webservices
-kombu==4.6.8              # via celery
-markdown==2.6.11          # via -r requirements.in
-more-itertools==8.3.0     # via pytest
-oauthlib==3.1.0           # via requests-oauthlib, social-auth-core
-packaging==20.4           # via bleach, pytest
-pillow==6.2.2             # via -r requirements.in
-pluggy==0.13.1            # via pytest
-psycopg2-binary==2.8.5    # via -r requirements.in
-py==1.8.1                 # via pytest
-pycparser==2.20           # via cffi
-pyjwt==1.7.1              # via -r requirements.in, social-auth-core
-pyparsing==2.4.7          # via packaging
-pytest-django==3.9.0      # via -r requirements.in
-pytest-mock==3.1.0        # via -r requirements.in
-pytest==5.4.2             # via -r requirements.in, pytest-django, pytest-mock
-python-dateutil==2.8.1    # via faker
-python3-openid==3.1.0     # via social-auth-core
-pytz==2020.1              # via -r requirements.in, celery, django
-redis==3.5.2              # via celery
-requests-oauthlib==1.3.0  # via social-auth-core
-requests==2.23.0          # via -r requirements.in, requests-oauthlib, responses, social-auth-core, webservices
-responses==0.10.14        # via -r requirements.in
-six==1.15.0               # via bleach, cryptography, faker, html5lib, packaging, python-dateutil, responses, snapshottest, social-auth-app-django, social-auth-core
-snapshottest==0.5.1       # via -r requirements.in
-social-auth-app-django==3.1.0  # via -r requirements.in
-social-auth-core==3.3.3   # via social-auth-app-django
-soupsieve==2.0.1          # via beautifulsoup4
-sqlparse==0.3.1           # via django, django-debug-toolbar
-starlette==0.13.4         # via ariadne
-termcolor==1.1.0          # via snapshottest
-text-unidecode==1.2       # via faker
-typing-extensions==3.7.4.2  # via ariadne
-unidecode==1.0.23         # via -r requirements.in
-urllib3==1.25.9           # via requests
-vine==1.3.0               # via amqp, celery
-wasmer==0.4.1             # via fastdiff
-wcwidth==0.1.9            # via pytest
-webencodings==0.5.1       # via bleach, html5lib
-webservices[django]==0.7  # via django-simple-sso
-zipp==3.1.0               # via importlib-metadata
+amqp==5.1.1
+    # via kombu
+anyio==3.6.1
+    # via starlette
+ariadne==0.15.1
+    # via
+    #   -r requirements.in
+    #   ariadne-django
+ariadne-django==0.3.0
+    # via -r requirements.in
+asgiref==3.5.2
+    # via django
+async-timeout==4.0.2
+    # via redis
+attrs==22.1.0
+    # via pytest
+beautifulsoup4==4.7.1
+    # via
+    #   -r requirements.in
+    #   django-htmlmin
+billiard==3.6.4.0
+    # via celery
+bleach==5.0.1
+    # via -r requirements.in
+celery[redis]==5.2.7
+    # via -r requirements.in
+certifi==2022.6.15
+    # via requests
+cffi==1.15.1
+    # via cryptography
+charset-normalizer==2.1.0
+    # via requests
+click==8.1.3
+    # via
+    #   celery
+    #   click-didyoumean
+    #   click-plugins
+    #   click-repl
+click-didyoumean==0.3.0
+    # via celery
+click-plugins==1.1.1
+    # via celery
+click-repl==0.2.0
+    # via celery
+coverage[toml]==6.5.0
+    # via
+    #   coveralls
+    #   pytest-cov
+coveralls==3.3.1
+    # via -r requirements.in
+cryptography==37.0.4
+    # via social-auth-core
+defusedxml==0.7.1
+    # via
+    #   python3-openid
+    #   social-auth-core
+deprecated==1.2.13
+    # via redis
+django==3.2.15
+    # via
+    #   -r requirements.in
+    #   ariadne-django
+    #   django-debug-toolbar
+    #   django-js-asset
+    #   django-simple-sso
+    #   djangorestframework
+    #   webservices
+django-debug-toolbar==3.5.0
+    # via -r requirements.in
+django-htmlmin==0.11.0
+    # via -r requirements.in
+django-js-asset==2.0.0
+    # via django-mptt
+django-mptt==0.13.4
+    # via -r requirements.in
+django-simple-sso==1.1.0
+    # via -r requirements.in
+djangorestframework==3.13.1
+    # via -r requirements.in
+docopt==0.6.2
+    # via coveralls
+faker==13.15.1
+    # via -r requirements.in
+fastdiff==0.3.0
+    # via snapshottest
+graphql-core==3.2.1
+    # via ariadne
+html5lib==1.1
+    # via
+    #   -r requirements.in
+    #   django-htmlmin
+idna==3.3
+    # via
+    #   anyio
+    #   requests
+iniconfig==1.1.1
+    # via pytest
+itsdangerous==0.24
+    # via
+    #   django-simple-sso
+    #   webservices
+kombu==5.2.4
+    # via celery
+markdown==3.4.1
+    # via -r requirements.in
+oauthlib==3.2.0
+    # via
+    #   requests-oauthlib
+    #   social-auth-core
+packaging==21.3
+    # via
+    #   pytest
+    #   redis
+pillow==9.2.0
+    # via -r requirements.in
+pluggy==1.0.0
+    # via pytest
+prompt-toolkit==3.0.30
+    # via click-repl
+psycopg2-binary==2.9.3
+    # via -r requirements.in
+py==1.11.0
+    # via pytest
+pycparser==2.21
+    # via cffi
+pyjwt==2.4.0
+    # via
+    #   -r requirements.in
+    #   social-auth-core
+pyparsing==3.0.9
+    # via packaging
+pytest==7.1.2
+    # via
+    #   -r requirements.in
+    #   pytest-cov
+    #   pytest-django
+    #   pytest-mock
+pytest-cov==4.0.0
+    # via -r requirements.in
+pytest-django==4.5.2
+    # via -r requirements.in
+pytest-mock==3.8.2
+    # via -r requirements.in
+python-dateutil==2.8.2
+    # via faker
+python3-openid==3.2.0
+    # via social-auth-core
+pytz==2022.1
+    # via
+    #   -r requirements.in
+    #   celery
+    #   django
+    #   djangorestframework
+redis==4.3.4
+    # via celery
+requests==2.28.1
+    # via
+    #   -r requirements.in
+    #   coveralls
+    #   requests-oauthlib
+    #   responses
+    #   social-auth-core
+    #   webservices
+requests-oauthlib==1.3.1
+    # via social-auth-core
+responses==0.21.0
+    # via -r requirements.in
+six==1.16.0
+    # via
+    #   bleach
+    #   click-repl
+    #   html5lib
+    #   python-dateutil
+    #   snapshottest
+snapshottest==0.6.0
+    # via -r requirements.in
+sniffio==1.2.0
+    # via anyio
+social-auth-app-django==5.0.0
+    # via -r requirements.in
+social-auth-core==4.3.0
+    # via social-auth-app-django
+soupsieve==2.3.2.post1
+    # via beautifulsoup4
+sqlparse==0.4.2
+    # via
+    #   django
+    #   django-debug-toolbar
+starlette==0.20.4
+    # via ariadne
+termcolor==1.1.0
+    # via snapshottest
+tomli==2.0.1
+    # via
+    #   coverage
+    #   pytest
+typing-extensions==4.3.0
+    # via ariadne
+unidecode==1.3.4
+    # via -r requirements.in
+urllib3==1.26.11
+    # via
+    #   requests
+    #   responses
+vine==5.0.0
+    # via
+    #   amqp
+    #   celery
+    #   kombu
+wasmer==1.1.0
+    # via fastdiff
+wasmer-compiler-cranelift==1.1.0
+    # via fastdiff
+wcwidth==0.2.5
+    # via prompt-toolkit
+webencodings==0.5.1
+    # via
+    #   bleach
+    #   html5lib
+webservices[django]==0.7
+    # via django-simple-sso
+wrapt==1.14.1
+    # via deprecated

Некоторые файлы не были показаны из-за большого количества измененных файлов