[
  {
    "path": ".coveragerc",
    "content": "[run]\nsource = pybb\n\n[report]\nexclude_lines =\n    pragma: no cover\n    raise ImproperlyConfigured\n"
  },
  {
    "path": ".gitignore",
    "content": ".idea\n*.pyc\nlocal_path.py\nsettings_local.py\ndist\n*.egg-info\ntestdb.sqlite\ntest/example/media/pybb_upload\ndocs/_build/\nenv/\n\n#After a tox test run, some folders are created. Ignore these\n.tox/\n.coverage\nhtmlcov/\npybb_upload/\n"
  },
  {
    "path": ".hgignore",
    "content": "syntax: glob\n# Global\n*.pyc\n*.swp\n*.swo\n\n# Distutils\npybb.egg-info/\ndist/\n\n# Sphinx\ndocs/_build/\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: python\npython:\n  - \"2.7\"\n  - \"3.4\"\n  - \"3.5\"\nenv:\n  - DJANGO=\"Django>=1.8,<1.9\" DB=sqlite\n  - DJANGO=\"Django>=1.8,<1.9\" DB=postgres\n  - DJANGO=\"Django>=1.8,<1.9\" DB=mysql\n  - DJANGO=\"Django>=1.11,<2.0\" DB=sqlite DJANGO_LTS=true\n  - DJANGO=\"Django>=1.11,<2.0\" DB=postgres DJANGO_LTS=true\n  - DJANGO=\"Django>=1.11,<2.0\" DB=mysql DJANGO_LTS=true\n  - DJANGO=\"Django>=2.0,<2.1\" DB=sqlite\n  - DJANGO=\"Django>=2.0,<2.1\" DB=postgres\n  - DJANGO=\"Django>=2.0,<2.1\" DB=mysql\nmatrix:\n  exclude:\n    - python: \"2.7\"\n      env: DJANGO=\"Django>=2.0,<2.1\" DB=sqlite\n    - python: \"2.7\"\n      env: DJANGO=\"Django>=2.0,<2.1\" DB=postgres\n    - python: \"2.7\"\n      env: DJANGO=\"Django>=2.0,<2.1\" DB=mysql\ninstall:\n  - if [[ $DB == mysql ]]; then pip install -qU mysqlclient; fi\n  - if [[ $DB == postgres ]]; then pip install -qU psycopg2; fi\n  - pip install -qU $DJANGO\n  - if [[ $DB == postgres && $TRAVIS_PYTHON_VERSION == '3.5' && $DJANGO_LTS == true ]] ; then export WITH_COVERALL=true ; fi\n  - if [[ $WITH_COVERALL == true ]]; then pip install -qU coveralls ; fi\n  - CFLAGS=\"-O0\" pip install -qU -r test/test_project/requirements_test.txt\nbefore_script:\n  - if [[ $DB == mysql ]]; then mysql -e 'SET GLOBAL wait_timeout = 36000 ; create database pybbm;'; fi\n  - if [[ $DB == postgres ]]; then psql -c 'create database pybbm;' -U postgres; fi\nscript:\n  - if [[ $WITH_COVERALL == true ]]; then coverage run setup.py test; else python setup.py test ; fi\nafter_success:\n\n  - if [[ $WITH_COVERALL == true ]]; then coveralls ; fi\n"
  },
  {
    "path": "AUTHORS",
    "content": "Pavel Zhukov <gelios@gmail.com>\nGrigory Petukhov\nNikolai Sevostjanov <nikolai.sevostjanov@gmail.com>\nDenis Burij <denger@footter.com>\nAlexander Solovyov <piranha@piranha.org.ua>\nWilliam Grzybowski <william88@gmail.com>\nNikolai Zamkovoi <nickzam@gmail.com>\nLuke Petre\nFilip Wasilewski (en@ig.ma)\nSergey Fursov <geyser85@gmail.com>\nDylann Cordel <cordel.d@free.fr>\nMaksim Iakovlev <lampslave@gmail.com>\n"
  },
  {
    "path": "CHANGELOG",
    "content": "1.0.0\n    * PyBBM is now compatible with Django 3.2 (older versions not supported anymore)\n    * PyBBM is now compatible with Python 3.7+ (older versions not supported anymore)\n0.19.0\n    * PyBBM is now compatible with Django 1.8, 1.11, 2.0\n    * Fix permissions and add documentation for default permissions\n    * Allow moderators to move a topic or split posts\n    * Update translations\n    * Multiple other fixes, refactoring\n0.18.4\n    * Fix misspelling in Swedish translation\n0.18.3\n    * Fix 0005 and 0006 migrations (changes will not affect db, so it's ok if this migrations were already executed)\n0.18.2\n    * Minor fixes.\n0.18.1\n    * Minor fixes.\n0.18\n    * PyBBM is now compatible with Django>=1.8,<1.11\n    * Allow non-moderators to delete their own posts.\n    * Add setting to enable or disable admin post form.\n    * Add Swedish translation.\n    * Use FileField instead of ImageField when pillow is not available to make pillow depencency optional.\n    * Use staticfiles in all templates.\n    * Improve permission checking.\n    * Allow users to subscribe to a forum.\n    * Add a form to grant users moderator privileges.\n    * Add notification's emails HTML alternative.\n    * Add the ability to the user to use their attachments inside their posts to render it as link, image etc.\n    * Multiple fixes and improvements.\n0.17.3\n    * Fast fix for migrations for Posgres database.\n      If you already get and applied migrations from 0.17 version (for example on MySQL DB) you can skip new\n      migrations with `manage.py migrate pybb --fake`\n0.17\n    * Topic and post creation wrapped in transaction\n    * All topic/post/poll related forms can be overrided when custom view inherites pybbm view\n    * Demo data for example projects\n    * Using active markup engine when quoting posts via javascript\n    * Functionality to support disabling default pybbm subscriptions and notifications and\n      new settings: `PYBB_DISABLE_SUBSCRIPTIONS` and `PYBB_DISABLE_NOTIFICATIONS`\n    * Fixed sorl.thumbnail/easy_thumbnail compatibility in standard `pybb/avatar.html` template\n    * Improved example projects\n    * Removed applying `urlize` filter over html produced by markdown parser\n      (it doesn't play nicely with html markup as noted in django's docs)\n    * django 1.8 compatibility\n    * common django layout for test project\n    * use mysqlclient package for testing installation with mysql database backend on python 3\n    * optional enabling \"nice urls\" for entire forum,\n      that looks like '<forum prefix>/c/<category slug>/<forum slug>/<topic slug>/'\n0.16.1\n    * Fast fixes\n0.16\n    * Django 1.7 compatibility.\n    * Fixed creating custom profile model of any class defined in settings with right related name to user model.\n      *Migration note*: If you have workaround for creating profile in your code, you should remove it for\n      preventing possible dubplicate unique key error on user creating.\n    * New get_display_name method for profile model used to unification displaying username through forum\n    * New markup processing. See `markup`\n0.15.6\n    * Make all migrations compatible with custom user model. Break dependency on sorl.thumbnail in migrations\n    * Compatibility functions moved to compat.py module\n    * Email notifications optimization\n    * Example_bootstrap projects now based on bootstrap 3\n    * Fixes and improvements\n0.15.5\n    * Fixed bug when user can vote (or cancel vote) when topic was closed.\n    * Added `may_vote_in_topic` method to permission handler.\n    * Fixed blocking user view\n0.15.4\n    * Hot fixes to bbcode transform\n0.15.3\n    * bbcode engine simplified\n0.15.2\n    * Pybbm specific forms moved to views' attributes, added new functions to views to get such forms dynamically.\n      This makes overriding pybbm forms much easier\n    * Moving from unmaintained postmarkup package to bbcode project as default bbcode render engine\n      Changed output html for [code] tag. It will be <code></code> tags instead of <div class=\"code\"></div>.\n      So you should duplicate styles applied to div.code for code html tag.\n    * Japanese translation\n0.15.1\n    * Hot fixes for Python 3 support\n    * Fixes for Chinese translation\n0.15\n    * Python 3 support\n    * Chinese translation\n0.14.9\n    * Two new methods added to permission handler: `may_attach_files` and `may_create_poll`. First method used for\n      restrict attaching files to post by user. By default it depends on `PYBB_ATTACHMENT_ENABLE` setting.\n      Second may be used to restrict some users to create/edit polls. By default it always return `True`.\n      For disabling polls on your forum, just write custom permission handler and return from this method `False`\n0.14.8\n    * Improved javascript functionality: quote selected text, qoute full original message via ajax,\n      insert nickname in post body. For enabling this functionality you should satisfy `some requirements</javascript>`\n      in your templates\n    * Support for nested forums\n    * `PybbProfile` abstract model moved to `pybb.profiles` module to avoid circular imports when checking models.\n0.14.7\n    * Django 1.6 compatibility\n    * unblock user functionality added\n0.14.6\n    * Cache anonymous views count for topic and save it in database only when some count reached (100 by default).\n      This value can be changed by setting `PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER`. Also added custom filter\n      `pybbm_calc_topic_views` that calc actual views count for topic\n    * Fix for migration that may fails on clean mysql installation\n    * Fixed perfomance issue with feed views\n    * Using custom permissions handler in feed views\n0.14.5\n    * Minor fixes\n0.14.4\n    * Fix for migration that may fails on clean mysql installation (not fixed really, filxed after 0.14.5)\n    * Make example_thirdparty project bootstrap3 compatible\n0.14.3\n    * Show only available topics (by permission handler) in ForumView\n0.14.2\n    * Fixed MultipleObjectReturned when topic has more than one moderator\n0.14.1\n    * Fixed circular import issue\n0.14\n    * Restored views for rendering user's posts and topics and link to that views from profile info page\n    * Broken hard dependency from EditProfileView and EditProfileForm classes in forum\n    * Ability for users to cancel their poll vote\n    * Block user view accepts only POST requests\n    * If `block_and_delete_messages` passed to request.POST for block user view,\n      then all user's messages will be deleted\n0.13.1\n    * Hotfix for rendering avatars\n0.13\n    * You can add first-unread get parameter to the topic url to provide link to first unread post from topic\n    * Removed django-mailer, pytils, sorl-thumbnail, south, django-pure-pagination from hard dependencies\n    * Support Custom User model introduced in django 1.5. Do not forget to define `PYBB_PROFILE_RELATED_NAME`\n      in settings, if you don't use predefined `pybb.PybbProfile` model See `how to use custom user model\n      with pybbm</customuser>`\n    * Dropped support for django 1.3\n    * Experimental support for python 3\n    * Removed django-mailer from hard dependencies, you have to manually install it for using it's functionality\n0.12.5\n    * More flexible forms/forms fields rendering in templates\n      Strongly recommended to check rendering of pybbm forms on your site (edit profile, poll/topic create/edit)\n    * Additional template for markitup preview\n      You can override `pybb/_markitup_preview.html` to provide your styling for <code>, <pre> and other markitup tags\n    * Improved permissions handling see `PYBB_PERMISSION_HANDLER` setting in `settings</settings>`\n    * Fixed bugs and improved performance\n0.12.4\n    * `PYBB_USE_DJANGO_MAILER` setting\n0.12.3\n    * German translation\n0.12\n    * Fixed bug when the answers to poll unexpectedly deleted. Strongly recommendet to update to this version, if using polls subsystem\n    * Polish translation\n0.11.0\n    * Polls (by Geyser)\n0.10.0\n    * Bootstrap 2 (by nigma and Geyser) (WARNING!! - BACKWARD INCOMPATIBLE TEMPLATES)\n0.9.0\n    * Button in templates restyling (by nigma)\n    * Code cleanup (by nigma)\n0.8.2\n    * Docs touchup\n    * Fix links to project\n    * Fix read/unread tracking (by lpetre)\n0.8.1\n    * Support for django 1.4 timezones\n0.8.0\n    * Django 1.4 support (by djw)\n    * Fix misspellings (by djw)\n0.7.0\n    * Code cleanup\n    * Add post cleaners\n    * Rename BODY_CLEANER settings to PYBB_BODY_VALIDATOR\n0.6.3\n    * Changed pybbTimeNode to use get_profile # (thanks Shon)\n    * Disable admin for 'pybb.Profile' if different AUTH_PROFILE_MODULE is set\n    * Disable editing of 'user' field in Profile admin\n    * French translation (thanks Eric)\n0.6.1\n    * Russian translation updated\n0.6.0\n    * CSS file is now build with less\n    * You can disable default css inclusion in templates with PYBB_DISABLE_CSS settings\n      and manually include pybb.less file or build pybb.less to your styles.\n    * Default style and templates revisied, new templates system\n      is cleaned and fully compatible with twitter bootstrap\n      Be aware of next changes:\n          * pagination template moved from `templates/pybb/pagination/` to `templates/pybb`\n          * pagination template changed from plain links to ul/li list\n          * breadcrumb now live in separated template and changed from plain links to ul/li list\n          * `add_post_form.html` template renamed to `post_form.html`\n          * PYBB_FORUM_PAGE_SIZE default value changed from 10 to 20\n\n\n0.5.1\n    * Attachment system now fully worked and ready for usage\n0.5.0\n    * Add anonymous posting (disabled by default)\n    * Add pre-moderation system (disabled by default)\n0.4.1\n    * Fix category view context\n    * Add test for category view\n0.4.0\n    * Most views are now class-based\n    * Tests code cleanup\n    * Django versions prior 1.3 supported via django-cbv\n    * django-pure-pagination is now are requirement as a pagination system for class based list views\n    * Provide inline pagination for topic\n    * Add read/unread blue/gray indicator (customized via css3)\n0.3.6\n    * Fix migration issue on innodb tables\n    * Fix permission does not exists issue on first syncdb\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2014-today, Maksim Iakovlev, Pavel Zhukov\nCopyright (c) 2012-2014, Sergey Fursov, Pavel Zhukov\nCopyright (c) 2009-2012, Pavel Zhukov\nCopyright (c) 2008-2009, Grigoriy Petukhov (project forked)\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\nthis list of conditions and the following disclaimer in the documentation and/or\nother materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "MANIFEST.in",
    "content": "recursive-include pybb/static *\nrecursive-include pybb/templates *\nrecursive-include pybb/locale *\ninclude README.rst\n"
  },
  {
    "path": "README.rst",
    "content": "PyBBM - Django forum solution\n=============================\n\n.. |travis| image:: https://travis-ci.org/hovel/pybbm.png?branch=master\n.. |coveralls| image:: https://coveralls.io/repos/github/hovel/pybbm/badge.svg?branch=master\n\n|travis| |coveralls|\n\nPyBBM is a full-featured django forum solution with these features:\n\n* Avatars\n* Custom profiles and support of Custom User Model (since django 1.5)\n* Post editing\n* Pre-moderation\n* Custom sanitization\n* Anonymous posting\n* Subscriptions\n* Polls\n* ...\n\nAll features is based on:\n\n* +94% tests covered code\n* Twitter bootstrap compatible default theme\n* Ready to use example project\n\nThe main point in development of pybb is to build it so it could be\n*easily* integrated to existing django based site. This mean that pybb does not provide features like user registration, password restoring.  It does not provide authentication page. (But example project provides ;))\n\nPyBBM includes ready to use `example/test project with instructions <http://readthedocs.org/docs/pybbm/en/latest/example.html>`_\n\ni18n support\n============\nPYBB support English, Russian, Slovak, Ukrainian, Brazilian Portuguese, Polish, Hebrew, French, Chinese, Japanese,\nGerman, Spanish, Italian, Swedish translations now. Feel free to contribute translation for another language or to correct existing.\nYou should enable django.middleware.locale.LocaleMiddleware to activate\ndjango locale autodetecting.\n\nMore links\n==========\n* Support Forum and DEMO: http://pybbm.org/\n* PyPi: http://pypi.python.org/pypi/pybbm/\n* Sourcecode: https://github.com/hovel/pybbm/\n* Documentation: http://pybbm.readthedocs.org/en/latest/\n* Page on djangopackages.com: http://www.djangopackages.com/packages/p/pybbm/\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Makefile for Sphinx documentation\n# \n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = sphinx-build\nPAPER         =\nBUILDDIR      = _build\n\n# Internal variables.\nPAPEROPT_a4     = -D latex_paper_size=a4\nPAPEROPT_letter = -D latex_paper_size=letter\nALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .\n\n.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest\n\nhelp:\n\t@echo \"Please use \\`make <target>' where <target> is one of\"\n\t@echo \"  html       to make standalone HTML files\"\n\t@echo \"  dirhtml    to make HTML files named index.html in directories\"\n\t@echo \"  singlehtml to make a single large HTML file\"\n\t@echo \"  pickle     to make pickle files\"\n\t@echo \"  json       to make JSON files\"\n\t@echo \"  htmlhelp   to make HTML files and a HTML help project\"\n\t@echo \"  qthelp     to make HTML files and a qthelp project\"\n\t@echo \"  devhelp    to make HTML files and a Devhelp project\"\n\t@echo \"  epub       to make an epub\"\n\t@echo \"  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter\"\n\t@echo \"  latexpdf   to make LaTeX files and run them through pdflatex\"\n\t@echo \"  text       to make text files\"\n\t@echo \"  man        to make manual pages\"\n\t@echo \"  changes    to make an overview of all changed/added/deprecated items\"\n\t@echo \"  linkcheck  to check all external links for integrity\"\n\t@echo \"  doctest    to run all doctests embedded in the documentation (if enabled)\"\n\nclean:\n\t-rm -rf $(BUILDDIR)/*\n\nhtml:\n\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/html.\"\n\ndirhtml:\n\t$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/dirhtml.\"\n\nsinglehtml:\n\t$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml\n\t@echo\n\t@echo \"Build finished. The HTML page is in $(BUILDDIR)/singlehtml.\"\n\npickle:\n\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle\n\t@echo\n\t@echo \"Build finished; now you can process the pickle files.\"\n\njson:\n\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json\n\t@echo\n\t@echo \"Build finished; now you can process the JSON files.\"\n\nhtmlhelp:\n\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp\n\t@echo\n\t@echo \"Build finished; now you can run HTML Help Workshop with the\" \\\n\t      \".hhp project file in $(BUILDDIR)/htmlhelp.\"\n\nqthelp:\n\t$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp\n\t@echo\n\t@echo \"Build finished; now you can run \"qcollectiongenerator\" with the\" \\\n\t      \".qhcp project file in $(BUILDDIR)/qthelp, like this:\"\n\t@echo \"# qcollectiongenerator $(BUILDDIR)/qthelp/PyBBM.qhcp\"\n\t@echo \"To view the help file:\"\n\t@echo \"# assistant -collectionFile $(BUILDDIR)/qthelp/PyBBM.qhc\"\n\ndevhelp:\n\t$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp\n\t@echo\n\t@echo \"Build finished.\"\n\t@echo \"To view the help file:\"\n\t@echo \"# mkdir -p $$HOME/.local/share/devhelp/PyBBM\"\n\t@echo \"# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/PyBBM\"\n\t@echo \"# devhelp\"\n\nepub:\n\t$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub\n\t@echo\n\t@echo \"Build finished. The epub file is in $(BUILDDIR)/epub.\"\n\nlatex:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo\n\t@echo \"Build finished; the LaTeX files are in $(BUILDDIR)/latex.\"\n\t@echo \"Run \\`make' in that directory to run these through (pdf)latex\" \\\n\t      \"(use \\`make latexpdf' here to do that automatically).\"\n\nlatexpdf:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo \"Running LaTeX files through pdflatex...\"\n\tmake -C $(BUILDDIR)/latex all-pdf\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\ntext:\n\t$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text\n\t@echo\n\t@echo \"Build finished. The text files are in $(BUILDDIR)/text.\"\n\nman:\n\t$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man\n\t@echo\n\t@echo \"Build finished. The manual pages are in $(BUILDDIR)/man.\"\n\nchanges:\n\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes\n\t@echo\n\t@echo \"The overview file is in $(BUILDDIR)/changes.\"\n\nlinkcheck:\n\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck\n\t@echo\n\t@echo \"Link check complete; look for any errors in the above output \" \\\n\t      \"or in $(BUILDDIR)/linkcheck/output.txt.\"\n\ndoctest:\n\t$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest\n\t@echo \"Testing of doctests in the sources finished, look at the \" \\\n\t      \"results in $(BUILDDIR)/doctest/output.txt.\"\n"
  },
  {
    "path": "docs/anonymous.rst",
    "content": "Anonymous posting\n=================\n\nPyBBM allow you to enable anonymous posting on forum.\n\nBe very carefull by enabling anonymous posting, it is better to enable\n`BODY_CLEANER` setting to cleanup spam links from posts.\n\nEnable :ref:`PYBB_ENABLE_ANONYMOUS_POST` and set :ref:`PYBB_ANONYMOUS_USERNAME` for enabling anonymous posting::\n\n    PYBB_ENABLE_ANONYMOUS_POST = True\n    PYBB_ANONYMOUS_USERNAME = 'Anonymous'\n\nCarefully set :ref:`PYBB_ANONYMOUS_USERNAME`. It is better to create user with this username yourself rather than left\nit to autoregister on first anonymous post, somemone may want to use this username and register before first\nanonymous post will be posted, in that case anonymous post will share same account with this user.\n\nAnonymous topic views count cached for each topic. The reason to do this is not update database on each anonymous\nrequest. Default value that will be cached is 100, this values controlled by :ref:`PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER`\nsetting and can be disabled by this setting too."
  },
  {
    "path": "docs/conf.py",
    "content": "#\n# PyBBM documentation build configuration file, created by\n# sphinx-quickstart on Mon Aug 22 16:28:25 2011.\n#\n# This file is execfile()d with the current directory set to its containing dir.\n#\n# Note that not all possible configuration values are present in this\n# autogenerated file.\n#\n# All configuration values have a default; values that are commented out\n# serve to show the default.\n\nimport sys, os\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#sys.path.insert(0, os.path.abspath('.'))\n\n# -- General configuration -----------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\n#needs_sphinx = '1.0'\n\n# Add any Sphinx extension module names here, as strings. They can be extensions\n# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.\nextensions = []\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# The suffix of source filenames.\nsource_suffix = '.rst'\n\n# The encoding of source files.\n#source_encoding = 'utf-8-sig'\n\n# The master toctree document.\nmaster_doc = 'index'\n\n# General information about the project.\nproject = u'PyBBM'\ncopyright = u'2011, Pavel Zukov'\n\n# The version info for the project you're documenting, acts as replacement for\n# |version| and |release|, also used in various other places throughout the\n# built documents.\n#\n# The short X.Y version.\nversion = '0.3.1'\n# The full version, including alpha/beta/rc tags.\nrelease = 'rc'\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n#language = None\n\n# There are two options for replacing |today|: either, you set today to some\n# non-false value, then it is used:\n#today = ''\n# Else, today_fmt is used as the format for a strftime call.\n#today_fmt = '%B %d, %Y'\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\nexclude_patterns = ['_build']\n\n# The reST default role (used for this markup: `text`) to use for all documents.\n#default_role = None\n\n# If true, '()' will be appended to :func: etc. cross-reference text.\n#add_function_parentheses = True\n\n# If true, the current module name will be prepended to all description\n# unit titles (such as .. function::).\n#add_module_names = True\n\n# If true, sectionauthor and moduleauthor directives will be shown in the\n# output. They are ignored by default.\n#show_authors = False\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = 'sphinx'\n\n# A list of ignored prefixes for module index sorting.\n#modindex_common_prefix = []\n\n\n# -- Options for HTML output ---------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\nhtml_theme = 'default'\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\n#html_theme_options = {}\n\n# Add any paths that contain custom themes here, relative to this directory.\n#html_theme_path = []\n\n# The name for this set of Sphinx documents.  If None, it defaults to\n# \"<project> v<release> documentation\".\n#html_title = None\n\n# A shorter title for the navigation bar.  Default is the same as html_title.\n#html_short_title = None\n\n# The name of an image file (relative to this directory) to place at the top\n# of the sidebar.\n#html_logo = None\n\n# The name of an image file (within the static path) to use as favicon of the\n# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32\n# pixels large.\n#html_favicon = None\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = ['_static']\n\n# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,\n# using the given strftime format.\n#html_last_updated_fmt = '%b %d, %Y'\n\n# If true, SmartyPants will be used to convert quotes and dashes to\n# typographically correct entities.\n#html_use_smartypants = True\n\n# Custom sidebar templates, maps document names to template names.\n#html_sidebars = {}\n\n# Additional templates that should be rendered to pages, maps page names to\n# template names.\n#html_additional_pages = {}\n\n# If false, no module index is generated.\n#html_domain_indices = True\n\n# If false, no index is generated.\n#html_use_index = True\n\n# If true, the index is split into individual pages for each letter.\n#html_split_index = False\n\n# If true, links to the reST sources are added to the pages.\n#html_show_sourcelink = True\n\n# If true, \"Created using Sphinx\" is shown in the HTML footer. Default is True.\n#html_show_sphinx = True\n\n# If true, \"(C) Copyright ...\" is shown in the HTML footer. Default is True.\n#html_show_copyright = True\n\n# If true, an OpenSearch description file will be output, and all pages will\n# contain a <link> tag referring to it.  The value of this option must be the\n# base URL from which the finished HTML is served.\n#html_use_opensearch = ''\n\n# This is the file name suffix for HTML files (e.g. \".xhtml\").\n#html_file_suffix = None\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = 'PyBBMdoc'\n\n\n# -- Options for LaTeX output --------------------------------------------------\n\n# The paper size ('letter' or 'a4').\n#latex_paper_size = 'letter'\n\n# The font size ('10pt', '11pt' or '12pt').\n#latex_font_size = '10pt'\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title, author, documentclass [howto/manual]).\nlatex_documents = [\n  ('index', 'PyBBM.tex', u'PyBBM Documentation',\n   u'Pavel Zukov', 'manual'),\n]\n\n# The name of an image file (relative to this directory) to place at the top of\n# the title page.\n#latex_logo = None\n\n# For \"manual\" documents, if this is true, then toplevel headings are parts,\n# not chapters.\n#latex_use_parts = False\n\n# If true, show page references after internal links.\n#latex_show_pagerefs = False\n\n# If true, show URL addresses after external links.\n#latex_show_urls = False\n\n# Additional stuff for the LaTeX preamble.\n#latex_preamble = ''\n\n# Documents to append as an appendix to all manuals.\n#latex_appendices = []\n\n# If false, no module index is generated.\n#latex_domain_indices = True\n\n\n# -- Options for manual page output --------------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [\n    ('index', 'pybbm', u'PyBBM Documentation',\n     [u'Pavel Zukov'], 1)\n]\n"
  },
  {
    "path": "docs/contributing.rst",
    "content": "Contributing\n============\n\nDevelopment happens on github, with main repo: https://github.com/hovel/pybbm\n\nIssues, forks, patches and pull requests live here ;)\n\nThere are many ways to contribute to pybbm and you do not need to be a developper to do it:\n\n1) Find a bug and submit an issue. You should:\n\n* explain what was expected\n* explain what was really done\n* explain how to reproduce (environment, steps etc.)\n\n2) Improve documentation\n\n* you can correct typos or \"bad english\"\n* add a new documentation part (for example, a \"how to\" than could help people when using pybb in\nsome use-case. eg: how to add news fields to `Topic` model).\n\n3) Fix a bug. You should:\n\n* write a test which should fail because of this bug\n* write your bug fix\n* run all pybbm tests\n* be sure that code coverage does not decrease\n* create the pull request\n\n4) Add a new feature:\n\n* quick-document it\n* open an issue and discuss about it\n* document it completely\n* add tests for all parts of this new feature\n* write your new feature\n* run all pybbm tests\n* be sure that code coverage does not decrease\n* create the pull request"
  },
  {
    "path": "docs/customuser.rst",
    "content": "How to integrate custom user model in pybbm forum\n=================================================\n\n`Custom user model <https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#substituting-a-custom-user-model>`_\nis a great feature introduced in django framework since version 1.5. This topic describes how\nto integrate your custom user model in pybbm forum application.\n\nFirst of all pybbm uses some fields from standard User model and permission system.\nThe simplest way to make your custom model compatible with pybbm is to inherit from\n`django.contrib.auth.models.AbstractUser`\n\nSecond way is to meet next requirements:\n\n* define USERNAME_FIELD constant, which point to unique field on your model\n* define email, is_staff, is_superuser fields or properties\n* inherit from `django.contib.auth.models.PermissionsMixin` or reproduce django's\n  default permission system\n\nNext step is to decide which model will store all fields for pybb forum profiles.\nThis model should be referenced to current User model (custom or default) in OneToOne\nrelationship. To easily setup such model you can use predefined `pybb.profiles.PybbProfile`\nclass. If profile model is custom user model itself then you can use `PybbProfile` class\nas mixin for adding required fields. For more granunal control of fields in your forum\nprofile model you may not rely on `PybbProfile` and define all fields from\nthis model manually. You can use fields from another app (such as `avatar` or `language`),\nbut you have to define proxy properties in forum profile model and build custom\nedit profile view, which will be override default pybb profile edit view in urls.py.\n\nNext define `get_display_name` method for your profile model if you want custom username\nrendering everywhere in forum. Default `pybb.Profile` model return user's username field\nas display name, base `pybb.profiles.PybbProfile` class trying to return `self.user.get_username()`\nor `self.get_username()`.\n\nLast step is to correctly set `PYBB_PROFILE_RELATED_NAME` setting. You have to set this\nsetting to related_name parameter from profile's model from OneToOne relation to User model.\nIf you use custom user model and this model is profile model itself, then you have to set\nthis setting to `None`\n"
  },
  {
    "path": "docs/example.rst",
    "content": "Example projects\n================\n\nThe PyBBM source code contains two example projects under the ``test/example_bootstrap`` and ``test/example_thirdparty`` directories.\nBoth are fully deployed and ready to use forum applications.\n\nThere is only one difference between these projects:\n\n* ``example_bootstrap`` includes the LESS (a CSS preprocessor) files from Twitter Bootstrap.\n* ``example_thirdparty`` leaves this to the thirdparty app ``pinax-theme-bootstrap``.\n\nWe recommend to use ``example_thirdparty`` to start with. If you starting from scratch it's probaly the best way to begin.\n\nRunning the example projects\n----------------------------\n\nEach example directory contains requirements.txt file, you can run::\n\n    pip install -r requirements.txt\n\nto install all dependencies.\n\nAlso `example_bootstrap/fixtures` directory contains `demo_data.json` file with some example data.\nSo, you can run::\n\n    python manage.py loaddata <path to example_bootstrap>/fixtures/demo_data.json\n\nfrom root directory to load some models in you database.\n"
  },
  {
    "path": "docs/filters.rst",
    "content": "Filtering spam, urls and other 'bad' stuff\n==========================================\n\nPyBBM contains two settings :ref:`PYBB_BODY_VALIDATOR` and :ref:`PYBB_BODY_CLEANERS` that create\nvery flexible system for filtering posts. Read this settings description for more information."
  },
  {
    "path": "docs/index.rst",
    "content": "PyBBM - Django forum solution\n=============================\n\nPyBBM is a complete Django forum solution with the following features:\n\n* Avatars\n* Custom profiles and support of Custom User Model (since Django 1.5)\n* Editable posts\n* Pre-moderation\n* Custom sanitization\n* Anonymous posting\n* Subscriptions\n* Polls\n* ...\n\nAll features are based on:\n\n* 95% test code coverage\n* Twitter Bootstrap compatible default theme\n* Ready to use example projects\n\nThe main focus in the development of PyBMM is to build it in a way that allows *easy* integration in existing Django-based sites. This means that PyBMM does not provide features like user registration, password restoring or the user login page. (But the example projects show how to do these tasks ;))\n\n\nContents:\n\n.. toctree::\n   :maxdepth: 2\n\n   install\n   settings\n   customuser\n   premoderation\n   permissions\n   anonymous\n   templatetags\n   example\n   filters\n   markup\n   javascript\n   contributing\n   testing\n   updates\n   pybbmigrate\n   originalpybb\n   problems\n\nIndices and tables\n==================\n\n* :ref:`genindex`\n* :ref:`modindex`\n* :ref:`search`\n\n"
  },
  {
    "path": "docs/install.rst",
    "content": "Installation\n============\n\nMandatory dependencies\n----------------------\n\nPyBBM requires the following packages:\n\n* django\n* django-annoying\n* unidecode (for slugifying instances for nicer urls)\n\n\nBy installing PyBBM with ``pip`` or ``easy_install``, all the above dependencies will be installed automatically::\n\n    pip install pybbm\n\nOptional dependencies\n---------------------\n\nThe following dependencies are optional. You can install them with ``pip install``:\n\n* For better performance and easy images thumbnailing you can use any thumbnail django application.\n  PyBBM by default uses ``sorl.thumbnail`` if it is installed and included in your ``INSTALLED_APPS`` setting.\n  It is used for defining the `avatar` field in the `PybbProfile` model and for resizing the avatar\n  in the ``pybb/avatar.html`` template. If you decide to install ``sorl.thumbnail`` with django 1.7 you\n  have to install at least 11.12.1b version with::\n\n    pip install \"sorl-thumbnail>=11.12.1b\"\n\n* ``PIL`` (Python Imaging Library) or its more up-to-date fork ``Pillow`` is optional if you configure ``sorl.thumbnail``\n  to use different backend or don't use ``sorl.thumbnail`` in general, but remember that using an ImageField in forms\n  requires the Python Imaging Library to be installed (i.e. you should install it if you use the built-in profile).\n\n* PyBBM emulates the behavior and functionality of ``django-pure-pagination``, but we recommend to install it in your\n  project.\n\n* Choose from ``bbcode`` and ``markdown`` libraries if you use one of the attached to pybbm markup engines.\n  For more information see :doc:`markup`\n\nFresh project\n-------------\n\nIf you start a new project based on pybbm, checkout pybbm.org website codebase from https://github.com/hovel/pybbm_org\nand skip the next steps.\n\nEnable applications and edit settings\n-------------------------------------\n\n* Add the following apps to your ``INSTALLED_APPS`` to enable pybbm and required applications:\n\n  * pybb\n\n  ::\n\n    INSTALLED_APPS = (\n        ....\n        'pybb',\n        ...\n    )\n\n* Add ``pybb.context_processors.processor`` to your ``settings.TEMPLATE_CONTEXT_PROCESSORS``::\n\n    TEMPLATE_CONTEXT_PROCESSORS = (\n        ...\n        'pybb.context_processors.processor',\n        ...\n        )\n\n* Add ``pybb.middleware.PybbMiddleware`` to your ``settings.MIDDLEWARE``::\n\n    MIDDLEWARE = (\n        ...\n        'pybb.middleware.PybbMiddleware',\n        ...\n    )\n\nEnable PyBBM urlconf\n--------------------\n\nPut ``include('pybb.urls', namespace='pybb'))`` into main project ``urls.py`` file::\n\n    urlpatterns = [\n        ....\n        (r'^forum/', include('pybb.urls', namespace='pybb')),\n        ....\n    ]\n\nEnable your site profile\n------------------------\n\nSetup forum's profile model and ``PYBB_PROFILE_RELATED_NAME`` setting.\n\nIf you have no site profile, default settings will satisfy your needs.\n\nIf you have a custom user model, which stores all profile fields itself, or if you have custom site profile model, then check that it inherits from ``pybb.profiles.PybbProfile`` or contains all fields and properties from this class.\n\nThen set ``PYBB_PROFILE_RELATED_NAME`` to ``None`` for custom user model, or to related_name\nfrom OneToOne field related to User from custom site profile model.\n\nFor more information see :doc:`how to use custom user model with pybbm</customuser>`\n\nMigrate database\n----------------\n\nSince django 1.7 release you have several combinations of installed packages that affect database migrations:\n\n* **django >= 1.7**\n  Django since 1.7 version has it's own `migration engine <https://docs.djangoproject.com/en/1.7/topics/migrations/>`_.\n  Pybbm fully supports django 1.7 migrations, so just run::\n\n    python manage.py migrate pybb\n\n* We recommend to use database engine that supports transaction management (all django backends except sqlite).\n  Otherwise you have small chance to face some inconsistency in DB after failed post/topic creation.\n\nTemplates\n---------\n\nCheck that:\n\n* Your templates directory contains the \"base.html\" template. Otherwise, set a custom base template with :ref:`PYBB_TEMPLATE`.\n\n* Basic template contains at least a ``content`` block.\n"
  },
  {
    "path": "docs/javascript.rst",
    "content": "Javascript functionality\n========================\n\nPybb does not depend on any javascript code. But javascript can provide more rich user experience\nwhen interacting with forum.\n\nFor enabling javascript features your installation should meet some requirements:\n\n  * include in your templates link to `pybbjs.js` file, for example with ``{% static 'pybb/js/pybbjs.js' %}`` tag\n  * to enable deleting posts via ajax, add to your delete link inline onclick handler\n    with calling pybb_delete_post(url, post_id, confirm_text)\n  * to enable quoting selected text in post, add in each post link with `quote-selected-link` class\n  * to enable quoting full message via ajax, add in each post link with `quote-link` class and href\n    attribute pointed to view that return text to quote\n  * to enable insert in post body user's nickname by clicking with shift pressed, just wrap each post\n    with tag with `post-row` class and place inside it nickname wrapped by tag with `post-username` class\n\nAll of this features enabled in standard templates shipped with pybbm app."
  },
  {
    "path": "docs/make.bat",
    "content": "@ECHO OFF\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-build\n)\nset BUILDDIR=_build\nset ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .\nif NOT \"%PAPER%\" == \"\" (\n\tset ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%\n)\n\nif \"%1\" == \"\" goto help\n\nif \"%1\" == \"help\" (\n\t:help\n\techo.Please use `make ^<target^>` where ^<target^> is one of\n\techo.  html       to make standalone HTML files\n\techo.  dirhtml    to make HTML files named index.html in directories\n\techo.  singlehtml to make a single large HTML file\n\techo.  pickle     to make pickle files\n\techo.  json       to make JSON files\n\techo.  htmlhelp   to make HTML files and a HTML help project\n\techo.  qthelp     to make HTML files and a qthelp project\n\techo.  devhelp    to make HTML files and a Devhelp project\n\techo.  epub       to make an epub\n\techo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter\n\techo.  text       to make text files\n\techo.  man        to make manual pages\n\techo.  changes    to make an overview over all changed/added/deprecated items\n\techo.  linkcheck  to check all external links for integrity\n\techo.  doctest    to run all doctests embedded in the documentation if enabled\n\tgoto end\n)\n\nif \"%1\" == \"clean\" (\n\tfor /d %%i in (%BUILDDIR%\\*) do rmdir /q /s %%i\n\tdel /q /s %BUILDDIR%\\*\n\tgoto end\n)\n\nif \"%1\" == \"html\" (\n\t%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The HTML pages are in %BUILDDIR%/html.\n\tgoto end\n)\n\nif \"%1\" == \"dirhtml\" (\n\t%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.\n\tgoto end\n)\n\nif \"%1\" == \"singlehtml\" (\n\t%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.\n\tgoto end\n)\n\nif \"%1\" == \"pickle\" (\n\t%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can process the pickle files.\n\tgoto end\n)\n\nif \"%1\" == \"json\" (\n\t%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can process the JSON files.\n\tgoto end\n)\n\nif \"%1\" == \"htmlhelp\" (\n\t%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can run HTML Help Workshop with the ^\n.hhp project file in %BUILDDIR%/htmlhelp.\n\tgoto end\n)\n\nif \"%1\" == \"qthelp\" (\n\t%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can run \"qcollectiongenerator\" with the ^\n.qhcp project file in %BUILDDIR%/qthelp, like this:\n\techo.^> qcollectiongenerator %BUILDDIR%\\qthelp\\PyBBM.qhcp\n\techo.To view the help file:\n\techo.^> assistant -collectionFile %BUILDDIR%\\qthelp\\PyBBM.ghc\n\tgoto end\n)\n\nif \"%1\" == \"devhelp\" (\n\t%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished.\n\tgoto end\n)\n\nif \"%1\" == \"epub\" (\n\t%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The epub file is in %BUILDDIR%/epub.\n\tgoto end\n)\n\nif \"%1\" == \"latex\" (\n\t%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; the LaTeX files are in %BUILDDIR%/latex.\n\tgoto end\n)\n\nif \"%1\" == \"text\" (\n\t%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The text files are in %BUILDDIR%/text.\n\tgoto end\n)\n\nif \"%1\" == \"man\" (\n\t%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The manual pages are in %BUILDDIR%/man.\n\tgoto end\n)\n\nif \"%1\" == \"changes\" (\n\t%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.The overview file is in %BUILDDIR%/changes.\n\tgoto end\n)\n\nif \"%1\" == \"linkcheck\" (\n\t%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Link check complete; look for any errors in the above output ^\nor in %BUILDDIR%/linkcheck/output.txt.\n\tgoto end\n)\n\nif \"%1\" == \"doctest\" (\n\t%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Testing of doctests in the sources finished, look at the ^\nresults in %BUILDDIR%/doctest/output.txt.\n\tgoto end\n)\n\n:end\n"
  },
  {
    "path": "docs/markup.rst",
    "content": "Markup\n======\n\nHow it works\n------------\n\nEvery time user save new post, message parsed by markup parser to it's html representation.\nIt will include only allowed by engine html tags, html tags should be html-encoded and rendered\nas simple text to prevent XSS attacks.\n\nPybbm includes two default engines. Actions needed to use these engines:\n\n    - bbcode engine: install required package with ``pip install bbcode`` command and set :ref:`PYBB_MARKUP` to ``'bbcode'``\n    - markdown engine: install required package with ``pip install markdown`` command and set :ref:`PYBB_MARKUP` to ``'markdown'``\n\nEngine classes must inherit from `pybb.markup.base.BaseParser` \nwhich defines three required methods:\n\n    - ``def format(self, text)`` method receives post's text as parameter and returns parsed message as html fragment\n    - ``def quote(self, text, username='')`` method receives quoted post's text and username and returns quoted string\n      in terms of markup engine\n    - ``def get_widget_cls(cls)`` class method which return the class to use as the widget \n      for the body field\n\nHow to change\n-------------\n\nIf you want to write your custom engine you can write a new class which extends ``pybb.markup.base.BaseParser``\n\nTo change behavior of one of the default parsers you can override ``pybb.markup.bbcode.BBCodeParser`` or\n``pybb.markup.markdown.MarkdownParser``.\n\nFor example, for adding additional formatter to bbcode parser you can write your own class in myproject.markup_engines.py::\n\n    from pybb.markup.bbcode import BBCodeParser\n\n    class CustomBBCodeParser(BBCodeParser):\n        def __init__(self):\n            super(CustomBBCodeParser, self).__init__()\n            self._parser.add_simple_formatter('ul', '<ul>%(value)s</ul>', transform_newlines=False, strip=True)\n            self._parser.add_simple_formatter('li', '<li>%(value)s</li>', transform_newlines=False, strip=True)\n\n\ninclude it in :ref:`PYBB_MARKUP_ENGINES_PATHS` setting dict and point pybbm to use it by :ref:`PYBB_MARKUP` setting::\n\n    PYBB_MARKUP_ENGINES_PATHS = {'custom_bbcode': 'myproject.markup_engines.CustomBBCodeParser'}\n    PYBB_MARKUP = 'custom_bbcode'\n\nor you can override default bbcode engine in settings.py::\n\n    PYBB_MARKUP_ENGINES_PATHS = {'bbcode': 'myproject.markup_engines.CustomBBCodeParser'}\n    PYBB_MARKUP = 'bbcode' # don't required because 'bbcode' is default value\n\nUsing different media assets\n----------------------------\n\nWhen you define your custom markup parser you may want to control how it will be rendered.\nFor that purpose pybbm uses django's concept of `widgets <https://docs.djangoproject.com/en/1.7/ref/forms/widgets/>`_\nand their `media assets <https://docs.djangoproject.com/en/1.7/topics/forms/media/>`_.\nWidget class used by markup engine controlled by ``get_widget_cls`` class method of engine class.\nBy default it returns ``widget_class`` attribute value. Pybbm default parsers use next widgets:\n\n    - pybb.base.BaseParser - django.forms.Textarea\n    - pybb.bbcode.BBCodeParser - pybb.bbcode.BBCodeWidget\n    - pybb.bbcode.MarkdownParser - pybb.markdown.MarkdownWidget\n\nTo get it working in your templates include ``{{ form.media }}`` or ``{{ form.media.css }}`` / ``{{ form.media.js }}``\nin proper place in every template where you use post form.\n"
  },
  {
    "path": "docs/notifications.rst",
    "content": "Notifications\n=============\n\nConfigure notifications\n-----------------------\n\nSee those settings:\n* :ref:`PYBB_DISABLE_SUBSCRIPTIONS`\n* :ref:`PYBB_DEFAULT_AUTOSUBSCRIBE`\n* :ref:`PYBB_DISABLE_NOTIFICATIONS`\n* :ref:`PYBB_USE_DJANGO_MAILER`\n\nWhen notifications are sent\n---------------------------\n\nEach time a post is saved (created or updated), subscribers will receive an email.\nIf you configure PYBB to use django-mailer (see :ref:`PYBB_USE_DJANGO_MAILER`), emails\nwill be sent when your cron job will run. Else, emails will be sent when post is saved.\n\nOverwrite emails templates\n--------------------------\n\nYou can overwrite three templates:\n\n* `pybb/mail_templates/subscription_email_subject.html`: will be used to render the subject of the email\n* `pybb/mail_templates/subscription_email_body.html`: will be used to render the text version's body of the email\n* `pybb/mail_templates/subscription_email_body-html.html`: will be used to render the html version's body of the email\n\n\nMy test user is not receiving emails ?!\n---------------------------------------\n\nEmails matching this rules are not sent: <username>@example.com\n"
  },
  {
    "path": "docs/originalpybb.rst",
    "content": "PyBB Modified (PyBBM) and original PyBB\n=======================================\n\nPyBB originally developed by lorien in 2008-2010 has ben dropped from development in mid 2010.\n\nThis is a list of differences between PyBB and PyBBM as of mid 2011.\n\n* All settings of pybbm have default values, see default.py file for detailed list.\n* pybbm templates fill *content*, *head*, *title* and *breadcrumb* blocks for template defined in settings as :ref:`PYBB_TEMPLATE` (\"base.html\" by default).\n* Markup engines can be configured as an ordinary settings.\n* PyBBM designed to fit django-staticfiles (django <= 1.2) or django.contrib.staticfiles (django >= 1.3).\n* Default pybbm templates and css files include only layout, minimal design and no coloring, so it's easy to fit any existed site colorscheme.\n* PyBBM code covered with tests more than 80%\n* PyBBM provides completely rewritten unread tracking with big performance improvement on large database\n* Views rewritten to use as many generics as possible\n* Number of external dependencies significantly reduced\n* `PyBBM well documented <http://readthedocs.org/projects/pybbm/>`_\n* PyBBM included two example projects for fast start."
  },
  {
    "path": "docs/permissions.rst",
    "content": "Permissions\n===========\n\nPybb allow you to manage permissions by overwriting a Permission handler.\nSee ``PYBB_PERMISSION_HANDLER`` setting.\n\nBelow are the current pybb permissions managed by the default Permission handler for each type of\n\"user\".\n\n\nPermissions for anonymous:\n\n+----------------------------------+---------------------+---------------------+\n|              action              |     can do with     |     can do with     |\n|                                  | PREMODERATION False | PREMODERATION True  |\n+==================================+=====================+=====================+\n| view normal forum                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view hidden forum                | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| view other topic                 | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view other post                  | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view own on moderation topic     | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| view own on moderation post      | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| view other on moderation topic   | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| view other on moderation post    | yes                 | no                  |\n+----------------------------------+---------------------+---------------------+\n| add post in normal topic         | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| add post in on moderation topic  | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| add post in closed topic         | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| edit own normal post             | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| edit own on moderation post      | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| edit other post                  | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| delete own normal post           | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| delete own on moderation post    | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| delete other post                | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| close and unclose topic          | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| stick and unstick topic          | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| manage moderators                | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n\n\nPermissions for a logged-in user:\n\n+----------------------------------+---------------------+---------------------+\n|              action              |     can do with     |     can do with     |\n|                                  | PREMODERATION False | PREMODERATION True  |\n+==================================+=====================+=====================+\n| view normal forum                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view hidden forum                | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| view other topic                 | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view other post                  | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view own on moderation topic     | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view own on moderation post      | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view other on moderation topic   | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| view other on moderation post    | yes                 | no                  |\n+----------------------------------+---------------------+---------------------+\n| add post in normal topic         | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| add post in on moderation topic  | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| add post in closed topic         | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| edit own normal post             | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| edit own on moderation post      | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| edit other post                  | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| delete own normal post           | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| delete own on moderation post    | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| delete other post                | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| close and unclose topic          | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| stick and unstick topic          | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| manage moderators                | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n\n\nPermissions for a moderator of the current forum:\n\n+----------------------------------+---------------------+---------------------+\n|              action              |     can do with     |     can do with     |\n|                                  | PREMODERATION False | PREMODERATION True  |\n+==================================+=====================+=====================+\n| view normal forum                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view hidden forum                | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| view other topic                 | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view other post                  | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view own on moderation topic     | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| view own on moderation post      | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| view other on moderation topic   | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view other on moderation post    | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| add post in normal topic         | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| add post in on moderation topic  | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| add post in closed topic         | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| edit own normal post             | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| edit own on moderation post      | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| edit other post                  | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| delete own normal post           | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| delete own on moderation post    | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| delete other post                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| close and unclose topic          | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| stick and unstick topic          | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| manage moderators                | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n\n\nPermissions for a \"is_staff\" user without pybb permissions:\n\n+----------------------------------+---------------------+---------------------+\n|              action              |     can do with     |     can do with     |\n|                                  | PREMODERATION False | PREMODERATION True  |\n+==================================+=====================+=====================+\n| view normal forum                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view hidden forum                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view other topic                 | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view other post                  | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view own on moderation topic     | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| view own on moderation post      | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| view other on moderation topic   | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| view other on moderation post    | yes                 | no                  |\n+----------------------------------+---------------------+---------------------+\n| add post in normal topic         | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| add post in on moderation topic  | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| add post in closed topic         | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| edit own normal post             | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| edit own on moderation post      | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| edit other post                  | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| delete own normal post           | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| delete own on moderation post    | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| delete other post                | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| close and unclose topic          | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| stick and unstick topic          | no                  | no                  |\n+----------------------------------+---------------------+---------------------+\n| manage moderators                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n\n\nPermissions for a \"is_staff\" user with pybb permissions:\n\n+----------------------------------+---------------------+---------------------+\n|              action              |     can do with     |     can do with     |\n|                                  | PREMODERATION False | PREMODERATION True  |\n+==================================+=====================+=====================+\n| view normal forum                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view hidden forum                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view other topic                 | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view other post                  | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view own on moderation topic     | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| view own on moderation post      | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| view other on moderation topic   | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view other on moderation post    | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| add post in normal topic         | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| add post in on moderation topic  | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| add post in closed topic         | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| edit own normal post             | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| edit own on moderation post      | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| edit other post                  | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| delete own normal post           | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| delete own on moderation post    | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| delete other post                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| close and unclose topic          | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| stick and unstick topic          | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| manage moderators                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n\n\nPermissions for superuser:\n\n+----------------------------------+---------------------+---------------------+\n|              action              |     can do with     |     can do with     |\n|                                  | PREMODERATION False | PREMODERATION True  |\n+==================================+=====================+=====================+\n| view normal forum                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view hidden forum                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view other topic                 | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view other post                  | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view own on moderation topic     | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| view own on moderation post      | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| view other on moderation topic   | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| view other on moderation post    | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| add post in normal topic         | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| add post in on moderation topic  | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| add post in closed topic         | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| edit own normal post             | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| edit own on moderation post      | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| edit other post                  | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| delete own normal post           | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| delete own on moderation post    | see logged-in user  | see logged-in user  |\n+----------------------------------+---------------------+---------------------+\n| delete other post                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| close and unclose topic          | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| stick and unstick topic          | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n| manage moderators                | yes                 | yes                 |\n+----------------------------------+---------------------+---------------------+\n"
  },
  {
    "path": "docs/premoderation.rst",
    "content": "Pre-moderation\n==============\n\nPyBBM shipped with fully customizable pre-moderation system.\n\nBecause in different circumstances you may need different pre-moderation conditions,\npybbm gives you ability to create custom filter for messages that require pre-moderation.\n\nAll you need is to provide function from two arguments: `user` and `body`. This function\nshould return `True` if message pass filter and `False` if message require pre-moderation.\n\nFor example, next filter allow to post without pre-moderation only for superusers::\n\n    def check_superuser(user, post):\n        if user.is_superuser:\n            return True\n        return False\n\nTold pybbm to use this function by setting :ref:`PYBB_PREMODERATION` in settings::\n\n    PYBB_PREMODERATION = check_superuser\n\n"
  },
  {
    "path": "docs/problems.rst",
    "content": "Known problems\n==============\n\nUsing with a database that doest not support microseconds\n---------------------------------------------------------\n\nIf you are using a database which does not support microseconds (MySQL before v5.7 for eg.), a\nforum can be wrongly marked read. It can happens if a user who read the only unread topic from\na forum in the same time an other user create / update an other topic on the same forum."
  },
  {
    "path": "docs/pybbmigrate.rst",
    "content": "Migrating from pybb (lorien package)\n====================================\n\nPyBBM was drop-in replacement for pybb in 2010, but current\nreplacing current version was not checked.\n\nYou can try to:\n\n* Replace `pybb` package with `pybbm`\n* Migrate forward\n* Set AUTH_PROFILE\n* Migrate old profiles with `manage.py migrate_profile` command\n"
  },
  {
    "path": "docs/settings.rst",
    "content": "Settings\n========\n\nBasic settings\n--------------\n\n.. _PYBB_TOPIC_PAGE_SIZE:\n\nPYBB_TOPIC_PAGE_SIZE\n....................\n\nNumber of posts in topic page\n\nDefault: 10\n\n.. _PYBB_FORUM_PAGE_SIZE:\n\nPYBB_FORUM_PAGE_SIZE\n....................\n\nNumber of topics in forum page\n\nDefault: 10\n\n.. _PYBB_FREEZE_FIRST_POST:\n\nPYBB_FREEZE_FIRST_POST\n......................\n\nFreeze first post in topics (show on every page)\n\nDefault: False\n\n.. _PYBB_DEFAULT_TITLE:\n\nPYBB_DEFAULT_TITLE\n..................\n\nDefault title for forum index page\n\nDefault: 'PYBB Powered Forum'\n\n.. _PYBB_DEFAULT_AUTOSUBSCRIBE:\n\nPYBB_DEFAULT_AUTOSUBSCRIBE\n..........................\n\nUsers will be automatically subscribed to topic when create post in it.\n\nDefault: True\n\n.. _PYBB_DISABLE_SUBSCRIPTIONS:\n\nPYBB_DISABLE_SUBSCRIPTIONS\n..........................\n\nUsers won't be able to subscribe to topic.\nIf you want to have a more advanced mode than enable / disable (for example, use model permissions),\nyou just have to overwrite the \"may_subscribe_topic\" method of the Permission handler.\nIf you disabled topic subscriptions, already subscribed users will still receive notifications:\nsee ``PYBB_DISABLE_NOTIFICATIONS`` to stop notifications sending.\n\nDefault: False\n\n.. _PYBB_DISABLE_NOTIFICATIONS:\n\nPYBB_DISABLE_NOTIFICATIONS\n..........................\n\nUsers which have subscribed to a topic won't receive notifications but still be able to subscribe\nto topics. See ``PYBB_DISABLE_NOTIFICATIONS`` to disable topic subscription too.\nThis is usefull if you want to to use your own notification system. Additionally, if your custom\nuser model has a ``receive_emails`` field, it will be used to determine whether to send notification\nemails to each user.\n\nDefault: False\n\n.. _PYBB_USE_DJANGO_MAILER:\n\nPYBB_USE_DJANGO_MAILER\n......................\n\nWhen True and django-mailer app installed, then for sending email pybbm will use this app. With django-mailer you can\nmanage emails from your site in queue. But in this case you have to periodically actually\nsend emails from queue. For more information see `app home page <https://github.com/pinax/django-mailer/>`_.\n\nDefault: False\n\n\nEmoticons\n---------\n\n.. _PYBB_SMILES_PREFIX:\n\nPYBB_SMILES_PREFIX\n..................\n\nPrefix for emoticons images set, related to STATIC_URL.\n\nDefault: 'pybb/emoticons'\n\n.. _PYBB_SMILES:\n\nPYBB_SMILES\n...........\n\nDict for emoticon replacement.\nKey - text to be replaced, value - image name.\n\nDefault::\n\n    {\n        '&gt;_&lt;': 'angry.png',\n        ':.(': 'cry.png',\n        'o_O': 'eyes.png',\n        '[]_[]': 'geek.png',\n        '8)': 'glasses.png',\n        ':D': 'lol.png',\n        ':(': 'sad.png',\n        ':O': 'shok.png',\n        '-_-': 'shy.png',\n        ':)': 'smile.png',\n        ':P': 'tongue.png',\n        ';)': 'wink.png'\n    }\n\ne.g. text  \";)\" in post will be replaced to::\n\n    <img src=\"{{ STATIC_URL }}{{ PYBB_SMILES_PREFIX }}wink.png\">\n\nwith default setting.\n\n\nUser profile settings\n---------------------\n\nNext settings used only if you don't customize user profile model,\nuser profile creation form or templates.\n\n.. _PYBB_PROFILE_RELATED_NAME:\n\nPYBB_PROFILE_RELATED_NAME\n.........................\n\nRelated name from profile's OneToOne relationship to User model. If profile model is User\nmodel itself then set it to `None`.\n\nDefault: 'pybb_profile'\n\nFor more information see :doc:`how to use custom user model with pybbm</customuser>`\n\n.. _PYBB_AVATAR_WIDTH:\n\nPYBB_AVATAR_WIDTH\n.................\n\nAvatar width to use in templates (avatars scaled using sorl.thumbnail\nif it installed and included in project).\n\nDefault: 80\n\n.. _PYBB_AVATAR_HEIGHT:\n\nPYBB_AVATAR_HEIGHT\n..................\n\nAvatar height to use in templates (avatars scaled using sorl.thumbnail\nif it installed and included in project)\n\nDefault: 80\n\n.. _PYBB_MAX_AVATAR_SIZE:\n\nPYBB_MAX_AVATAR_SIZE\n....................\n\nMaximum avatar size, in bytes\n\nDefault: 51200 (50 Kb)\n\n.. _PYBB_DEFAULT_TIME_ZONE:\n\nPYBB_DEFAULT_TIME_ZONE\n......................\n\nDefault time zone for forum as integer. E.g. setting to 1 means GMT+1 zone.\n\nDefault: 3 (Moscow)\n\n.. _PYBB_SIGNATURE_MAX_LENGTH:\n\nPYBB_SIGNATURE_MAX_LENGTH\n.........................\n\nLimit of symbols in user signature\n\nDefault: 1024\n\n.. _PYBB_SIGNATURE_MAX_LINES:\n\nPYBB_SIGNATURE_MAX_LINES\n........................\n\nLimit of lines in user signature\n\nDefault: 3\n\n.. _PYBB_DEFAULT_AVATAR_URL:\n\nPYBB_DEFAULT_AVATAR_URL\n.......................\n\nWill be used if user doesn't upload avatar\n\nDefault: settings.STATIC_URL + 'pybb/img/default_avatar.jpg'\n\nStyle\n-----\n\nYou can use builtin templates with custom basic template.\n\n.. _PYBB_TEMPLATE:\n\nPYBB_TEMPLATE\n.............\n\nBuiltin templates will inherit this template\n\nDefault: 'base.html\n\n.. _PYBB_TEMPLATE_MAIL_TXT:\n\nPYBB_TEMPLATE_MAIL_TXT\n.............\n\nBuiltin `txt` emails templates will inherit this template\n\nDefault: 'pybb/mail_templates/base.html\n\n.. _PYBB_TEMPLATE_MAIL_HTML:\n\nPYBB_TEMPLATE_MAIL_HTML\n.............\n\nBuiltin `html` emails templates will inherit this template\n\nDefault: 'pybb/mail_templates/base-html.html\n\n\nMarkup engines\n--------------\n\n.. _PYBB_MARKUP:\n\nPYBB_MARKUP\n...........\n\nMarkup engine used in forum. Also see :ref:`PYBB_MARKUP_ENGINES` below\n\nDefault: 'bbcode`\n\n.. _PYBB_MARKUP_ENGINES_PATHS:\n\nPYBB_MARKUP_ENGINES_PATHS\n.........................\n\nDict with avaiable markup engines path. One of them should be selected with PYBB_MARKUP\n\nMarkup engine should be a path to a class, that inherits from `pybb.markup.base.BaseParser`.\nMarkup engine should take care of replacing smiles in body with related emoticons.\n\nby default PyBBM support `bbcode` and `markdown` markup::\n\n    {\n        'bbcode': 'pybb.markup.bbcode.BBCodeParser',\n        'markdown': 'pybb.markup.markdown.MarkdownParser'\n    }\n\nPlease note, that previous version of pybb used two different settings : \n`PYBB_MARKUP_ENGINES` and `PYBB_QUOTE_ENGINES` which were callables.\nThis is still supported, but is deprecated.\n\n.. _PYBB_MARKUP_ENGINES:\n\nPYBB_MARKUP_ENGINES (deprecated)\n................................\n\nShould be the same dict with paths to markup engine classes as `PYBB_MARKUP_ENGINES_PATH` setting\n\nDefault: `PYBB_MARKUP_ENGINES_PATHS`.\n\nFor more information see :doc:`markup`\n\n.. _PYBB_QUOTE_ENGINES:\n\nPYBB_QUOTE_ENGINES (deprecated)\n...............................\n\n**Deprecation note: Every markup class must inherit from** `pybb.markup.base.BaseParser`\n\n**For more information see** :doc:`markup`\n\nShould be the same dict with paths to markup engine classes as `PYBB_MARKUP_ENGINES_PATH` setting\n\nDefault: `PYBB_MARKUP_ENGINES_PATHS`.\n\n\nPost cleaning/validation\n------------------------\n\n.. _PYBB_BODY_CLEANERS:\n\nPYBB_BODY_CLEANERS\n..................\n\nList of paths to 'cleaner' functions for body post to automatically remove undesirable content from posts.\nCleaners are user-aware, so you can disable them for some types of users.\n\nEach function in list should accept `auth.User` instance as first argument and `string` instance as second, returned value will be sended to next function on list or saved and rendered as post body.\n\nFor example this is enabled by default `rstrip_str` cleaner::\n\n    def rstrip_str(user, str):\n        if user.is_staff:\n            return str\n        return '\\n'.join([s.rstrip() for s in str.splitlines()])\n\nDefault::\n\n    PYBB_BODY_CLEANERS = ['pybb.markup.base.rstrip_str', 'pybb.markup.base.filter_blanks']\n\n.. _PYBB_BODY_VALIDATOR:\n\nPYBB_BODY_VALIDATOR\n...................\n\nExtra form validation for body of post.\n\nCalled as::\n\n    PYBB_BODY_VALIDATOR(user, body)\n\nat `clean_body` method of `PostForm` Here you can do various checks based on user stats.\nE.g. allow moderators to post links and don't allow others. By raising::\n\n    forms.ValidationError('Here Error Message')\n\nYou can show user what is going wrong during validation.\n\nYou can use it for example for time limit between posts, preventing URLs, etc.\n\nDefault: None\n\n\nAnonymous/guest posting\n-----------------------\n\n.. _PYBB_ENABLE_ANONYMOUS_POST:\n\nPYBB_ENABLE_ANONYMOUS_POST\n..........................\n\nAllow post for not-authenticated users.\n\nDefault: False\n\nSee :doc:`anonymous posting</anonymous>` for details.\n\n.. _PYBB_ANONYMOUS_USERNAME:\n\nPYBB_ANONYMOUS_USERNAME\n.......................\n\nUsername for anonymous posts. If no user with this username exists it will be created on first anonymous post.\n\nDefault: 'Anonymous'\n\n.. _PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER:\n\nPYBB_ANONYMOUS_VIEWS_CACHE_BUFFER\n.................................\n\nNumber of anonymous views for each topic, that will be cached. For disabling caching anonymous views\njust set it to `None`.\n\nDefault: 100\n\n\nPremoderation\n-------------\n\n.. _PYBB_PREMODERATION:\n\nPYBB_PREMODERATION\n..................\n\nFilter for messages that require pre-moderation.\n\nDefault: False\n\nSee :doc:`Pre-moderation</premoderation>` for details.\n\n\nAttachments\n-----------\n\n.. _PYBB_ATTACHMENT_ENABLE:\n\nPYBB_ATTACHMENT_ENABLE\n......................\n\nEnable attahcments for all users.\n\nDefault: False\n\n.. _PYBB_ATTACHMENT_SIZE_LIMIT:\n\nPYBB_ATTACHMENT_SIZE_LIMIT\n..........................\n\nMaximum attachment limit (in bytes).\n\nDefault: 1048576 (1Mb)\n\n.. _PYBB_ATTACHMENT_UPLOAD_TO:\n\nPYBB_ATTACHMENT_UPLOAD_TO\n.........................\n\nDirectory in your media path for uploaded attacments.\n\nDefault: 'pybb_upload/attachments'\n\nPolls\n-----\n\nNote: For disabling polls on your forum, write custom permission handler and return from `may_create_poll` method `False`\nSee `PYBB_PERMISSION_HANDLER` setting.\n\n.. _PYBB_POLL_MAX_ANSWERS:\n\nPYBB_POLL_MAX_ANSWERS\n.....................\n\nMax count of answers, that user can add to topic.\n\nDefault: 10\n\n\nPermissions\n-----------\n\n.. _PYBB_AUTO_USER_PERMISSIONS:\n\nPYBB_AUTO_USER_PERMISSIONS\n..........................\n\nAutomatically adds add post and add topic permissions to users on user.save().\n\nDefault: True\n\n.. _PYBB_PERMISSION_HANDLER:\n\nPYBB_PERMISSION_HANDLER\n.......................\n\nIf you need custom permissions (for example, private forums based on application-specific \nuser groups), you can set :ref:`PYBB_PERMISSION_HANDLER` to a class which inherits from\n`pybb.permissions.DefaultPermissionHandler` (default), and override any of the `filter_*` and\n`may_*` method. For details, look at the source of `pybb.permissions.DefaultPermissionHandler`.\nAll methods from permission handler (custom or default) can be used in templates as filters,\nif loaded pybb_tags. In template will be loaded methods which start with 'may' or 'filter'\nand with three or two arguments (include 'self' argument)\n\nDefault: 'pybb.permissions.DefaultPermissionHandler'\n\n\nUrls\n----\n\n.. _PYBB_NICE_URL:\n\nPYBB_NICE_URL\n.............\n\nChanges old/classics URLs to more semantic URLs using Category/Forum/Topic's slug.\nFor example www.yourforum.com/forum/1 becomes www.yourforum.com/c/category_slug/forum_slug.\nOld URLs will have a permanent redirections to new ones.\n\nDefault: False\n\n.. _PYBB_NICE_URL_PERMANENT_REDIRECT:\n\nPYBB_NICE_URL_PERMANENT_REDIRECT\n................................\n\nWhen PYBB is set to use PYBB_NICE_URL, this setting changes the HTTP response code used\nto redirect old style URL to new one. True (default) use 301 (permantent) redirect. If set to False,\nit uses 302 (temporary) redirect. `False` value is usefull for testing period to not loose SEO related\nto old URLs, then, once testing period is over, setting this to True will ensure that your old URLs will\nbe updated to the new ones next time the Search Engine will check it.\n\nDefault: True\n\n.. _PYBB_NICE_URL_SLUG_DUPLICATE_LIMIT:\n\nPYBB_NICE_URL_SLUG_DUPLICATE_LIMIT\n..................................\n\nLimit for checking duplicate slugs.\nAfter reaching this limit while trying to find unique slug ValidationError will be raised.\n\nDefault: 100\n\n.. PYBB_ENABLE_ADMIN_POST_FORM:\n\nPYBB_ENABLE_ADMIN_POST_FORM\n...........................\n\nEnable admin post form that allowed staff to post with any username automagically creating it if it did not exist.\n\nDefault: True\n\n.. PYBB_ALLOW_DELETE_OWN_POST:\n\nPYBB_ALLOW_DELETE_OWN_POST\n..........................\n\nAllow non-superusers to delete their own posts.\n\nDefault: True\n"
  },
  {
    "path": "docs/templatetags.rst",
    "content": "Useful template tags and filters\n================================\n\nNext filters and tags can be used when `pybb_tags` loaded in template:\n\n* PyBBM passes all filter_* and may_* methods from current permission handler\n  to templates as filters with pybb_ prefix. So you can use they as::\n\n    {% if user|may_view_topic:topic %}\n      you can view {{ topic }}\n    {% endif %}\n\n  or::\n\n    {% with queryset=user|filter_topics:topic_queryset %}\n      {# operations on queryset there #}\n    {% endwith %}\n\n* `pybb_get_latest_topic` and `pybb_get_latest_posts` assignment tags you can use on\n  every page for getting latest topics ans posts, for example for rendering in side block.\n  Also you can pass `user` parameter (default to user from template context) for geting topics\n  or posts available for specific user and `cnt` parameter for get specific count of topics\n  or posts::\n\n    {% pybb_get_latest_topic cnt=30 as topics %}\n    {# operation on topics list there #}\n\n* `pybb_get_profile` assignment tag can be used to get forum profile instance for any user\n  passed as `user` argument::\n\n    {% pybb_get_profile user=post.user as post_user_profile %}\n    {# use profile fields there #}\n"
  },
  {
    "path": "docs/testing.rst",
    "content": "Testing\n=======\n\nPyBBM has good unittest coverage. There is two way to test pybbm: a \"multi-env way\" via tox\n(multiple versions of Django, Python...), and a \"local env way\" with your\nversion of python and locally installed python packages.\n\n\nTesting with tox (recommended)\n------------------------------\n\nThis is the recommended way to test pybbm if you want to contribute.\nYou must have tox installed on your system. (eg: `sudo pip install tox`)\n\n1) Clone your github pybbm fork and go in its directory::\n\n    git clone git@github.com:yourGithubUsername/pybbm.git\n    cd pybbm\n\n2) run tox::\n\n    tox\n\nThat's all ;-). Tox will tests pybbm in multiple environnements configured in the pybbm's tox.ini.\nIf you want to test only a specific environment from that list, you can run tox with the \"-e\"\noption. For example, this command will test pybbm only with python 2.7 and Django 1.8::\n\n    tox -e py27-django18\n\nThere is a special tox env to check code coverage called `coverage`. By running it, it will output\na summary of code coverage and will generate a HTML rapport (in `htmlcov/index.html`) to see which\npart of code is not yet tested.\n\n**If you add new features to pybbm, ensure that lines you add are covered by tests** ;-)\n\n\nTesting in your local environment\n-----------------------------------\n\nIf you want to contribute, you should use the \"tox way\" to test your contributions before\ncreating a pull-request ! This testing way will allow you to test pybbm in your current local\nenvironment. It is usefull if you have a specific environment which is not covered by tox.ini.\n\nIf you already have a working pybb in your environment, you can go to the step 4.\nElse, steps 1-3 will allow you to have a minimal environment to run pybb test project.\n\n1) Your environment must be ready to use pip and install Pillow and lxml python packages.\n   For Debian, the simplest way is to install debian python packages with their dependencies::\n\n    sudo apt-get install python-pip python-lxml python-pillow\n\n2) Now, your environment is ready to install python packages via pip. Install pybbm from your\n   github fork with the \"-e\" option to be able to contribute, and install the test requirements::\n\n    mkdir -p ~/tests/ && cd ~/tests/\n    pip install --user -e git+git@github.com:yourGithubUsername/pybbm.git#egg=pybbm\n    pip install --user -r src/pybbm/test/test_project/requirements_test.txt\n\n3) Now, add your user-local pip install directory and the pybbm directory to your PYTHONPATH::\n\n    export PYTHONPATH=$PYTHONPATH:~/.local/lib/python3.7/site-packages/:~/tests/src/pybbm\n\n4) Now, you have an editable version of pybbm and you can run tests from the \"test_project\"::\n\n    cd ~/tests/src/pybbm/test/test_project/\n    python manage.py test pybb\n\n5) If you want to display a coverage summary and create a coverage HTML report::\n\n    pip install --user coveralls\n    PATH=$PATH:~/.local/bin/\n    cd ~/tests/src/pybbm/test/test_project/\n    coverage run --rcfile ../../.coveragerc manage.py test pybb\n    coverage report\n    coverage html\n\n   Index HTML report is created in `htmlcov/index.html`\n"
  },
  {
    "path": "docs/updates.rst",
    "content": "PyBBM Changelog\n===============\n\n0.18.4 -> 0.19.0\n----------------\n* PyBBM is now compatible with Django 1.8, 1.11, 2.0\n* Fix permissions and add documentation for default permissions\n* Allow moderators to move a topic or split posts\n* Update translations\n* Multiple other fixes, refactoring\n\n0.18.3 -> 0.18.4\n----------------\n* Fix misspelling in Swedish translation\n\n0.18.2 -> 0.18.3\n----------------\n* Fix 0005 and 0006 migrations (changes will not affect db, so it's ok if this migrations were already executed)\n\n0.18.1 -> 0.18.2\n----------------\n* Minor fixes.\n\n0.18 -> 0.18.1\n--------------\n* Minor fixes.\n\n0.17.3 -> 0.18\n--------------\n* PyBBM is now compatible with Django>=1.8,<1.11\n* Allow non-moderators to delete their own posts.\n* Add setting to enable or disable admin post form.\n* Add Swedish translation.\n* Use FileField instead of ImageField when pillow is not available to make pillow depencency optional.\n* Use staticfiles in all templates.\n* Improve permission checking.\n* Allow users to subscribe to a forum.\n* Add a form to grant users moderator privileges.\n* Add notification's emails HTML alternative.\n* Add the ability to the user to use their attachments inside their posts to render it as link, image etc.\n* Multiple fixes and improvements.\n\n0.17 -> 0.17.3\n--------------\n* Fast fix for migrations for Posgres database.\n  If you already get and applied migrations from 0.17 version (for example on MySQL DB) you can skip new\n  migrations with `manage.py migrate pybb --fake`\n\n0.16.1 -> 0.17\n--------------\n* Topic and post creation wrapped in transaction\n* All topic/post/poll related forms can be overridden when custom view inherites pybbm view\n* Demo data for example projects\n* Using active markup engine when quoting posts via javascript\n* Functionality to support disabling default pybbm subscriptions and notifications and\n  new settings: :ref:`PYBB_DISABLE_SUBSCRIPTIONS` and :ref:`PYBB_DISABLE_NOTIFICATIONS`\n* Fixed sorl.thumbnail/easy_thumbnail compatibility in standard `pybb/avatar.html` template\n* Improved example projects\n* Removed applying `urlize` filter over html produced by markdown parser\n  (it doesn't play nicely with html markup as noted in django's docs)\n* django 1.8 compatibility\n* common django layout for test project\n* use mysqlclient package for testing installation with mysql database backend on python 3\n* optional enabling \"nice urls\" for entire forum,\n  that looks like '<forum prefix>/c/<category slug>/<forum slug>/<topic slug>/'\n\n0.16 -> 0.16.1\n--------------\n* Fast fixes\n\n0.15.6 -> 0.16\n--------------\n* Django 1.7 compatibility.\n* Fixed creating custom profile model of any class defined in settings with right related name to user model.\n  *Migration note*: If you have workaround for creating profile in your code, you should remove it for\n  preventing possible dubplicate unique key error on user creating.\n* New get_display_name method for profile model used to unification displaying username through forum\n* New markup processing. See :doc:`markup`\n\n0.15.5 -> 0.15.6\n----------------\n* Make all migrations compatible with custom user model. Break dependency on sorl.thumbnail in migrations\n* Compatibility functions moved to compat.py module\n* Email notifications optimization\n* Example_bootstrap projects now based on bootstrap 3\n* Fixes and improvements\n\n0.15.4 -> 0.15.5\n----------------\n* Fixed bug when user can vote (or cancel vote) when topic was closed.\n* Added `may_vote_in_topic` method to permission handler.\n* Fixed blocking user view\n\n0.15.3 -> 0.15.4\n----------------\n* Hot fixes to bbcode transform\n\n0.15.2 -> 0.15.3\n----------------\n* bbcode engine simplified\n\n0.15.1 -> 0.15.2\n----------------\n* Pybbm specific forms moved to views' attributes, added new functions to views to get such forms dynamically.\n  This makes overriding pybbm forms much easier\n* Moving from unmaintained postmarkup package to bbcode project as default bbcode render engine\n  Changed output html for [code] tag. It will be <code></code> tags instead of <div class=\"code\"></div>.\n  So you should duplicate styles applied to div.code for code html tag.\n* Japanese translation\n\n0.15 -> 0.15.1\n--------------\n* Hot fixes for Python 3 support\n* Fixes for Chinese translation\n\n0.14.9 -> 0.15\n--------------\n* Python 3 support\n* Chinese translation\n\n0.14.8 -> 0.14.9\n----------------\n* Two new methods added to permission handler: `may_attach_files` and `may_create_poll`. First method used for\n  restrict attaching files to post by user. By default it depends on :ref:`PYBB_ATTACHMENT_ENABLE` setting.\n  Second may be used to restrict some users to create/edit polls. By default it always return `True`.\n  For disabling polls on your forum, just write custom permission handler and return from this method `False`\n\n0.14.7 -> 0.14.8\n----------------\n* Improved javascript functionality: quote selected text, qoute full original message via ajax,\n  insert nickname in post body. For enabling this functionality you should satisfy :doc:`some requirements</javascript>`\n  in your templates\n* Support for nested forums\n* `PybbProfile` abstract model moved to `pybb.profiles` module to avoid circular imports when checking models.\n\n0.14.6 -> 0.14.7\n----------------\n* Django 1.6 compatibility\n* unblock user functionality added\n\n0.14.5 -> 0.14.6\n----------------\n* Cache anonymous views count for topic and save it in database only when some count reached (100 by default).\n  This value can be changed by setting :ref:`PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER`. Also added custom filter\n  `pybbm_calc_topic_views` that calc actual views count for topic\n* Fix for migration that may fails on clean mysql installation\n* Fixed performance issue with feed views\n* Using custom permissions handler in feed views\n\n0.14.4 -> 0.14.5\n----------------\n* Minor fixes\n\n0.14.3 -> 0.14.4\n----------------\n* Fix for migration that may fails on clean mysql installation (not fixed really, filxed after 0.14.5)\n* Make example_thirdparty project bootstrap3 compatible\n\n0.14.2 -> 0.14.3\n----------------\n* Show only available topics (by permission handler) in ForumView\n\n0.14.1 -> 0.14.2\n----------------\n* Fixed MultipleObjectReturned when topic has more than one moderator\n\n0.14 -> 0.14.1\n--------------\n* Fixed circular import issue\n\n0.13.1 -> 0.14\n--------------\n\n* Restored views for rendering user's posts and topics and link to that views from profile info page\n* Broken hard dependency from EditProfileView and EditProfileForm classes in forum\n* Ability for users to cancel their poll vote\n* Block user view accepts only POST requests\n* If `block_and_delete_messages` passed to request.POST for block user view,\n  then all user's messages will be deleted\n\n0.13 -> 0.13.1\n--------------\n\n* Hotfix for rendering avatars\n\n0.12.5 -> 0.13\n--------------\n\n* You can add first-unread get parameter to the topic url to provide link to first unread post from topic\n* Removed django-mailer, pytils, sorl-thumbnail, south, django-pure-pagination from hard dependencies\n* Support Custom User model introduced in django 1.5. Do not forget to define :ref:`PYBB_PROFILE_RELATED_NAME`\n  in settings, if you don't use predefined `pybb.PybbProfile` model See :doc:`how to use custom user model\n  with pybbm</customuser>`\n* Dropped support for django 1.3\n* Experimental support for python 3\n* Removed django-mailer from hard dependencies, you have to manually install it for using it's functionality\n\n0.12.4 -> 0.12.5\n----------------\n\n* More flexible forms/forms fields rendering in templates\n  Strongly recommended to check rendering of pybbm forms on your site (edit profile, poll/topic create/edit)\n* Additional template for markitup preview\n  You can override `pybb/_markitup_preview.html` to provide your styling for <code>, <pre> and other markitup tags\n* Improved permissions handling see :ref:`PYBB_PERMISSION_HANDLER` setting in :doc:`settings</settings>`\n* Fixed bugs and improved performance\n\n0.12.3 -> 0.12.4\n----------------\n\n* :ref:`PYBB_USE_DJANGO_MAILER` setting\n\n0.12.2 -> 0.12.3\n----------------\n\n* German translation\n\n0.11 -> 0.12\n------------\n\n* Fixed bug when the answers to poll unexpectedly deleted. Strongly recommended to update to this version, if using\n  polls subsystem\n\n* Polish translation\n\n\n0.10 -> 0.11\n------------\n\n* Ability to override standard message when user doesn't login and not alowed anonymous posts by\n  :ref:`PYBB_ENABLE_ANONYMOUS_POST` setting. It may be useful when project doesn't have ``registration_register``\n  and/or ``auth_login`` url names in ``urls.py``\n\n* Content in each ``topic.html`` and ``forum.html`` is wrapped in ``<div>`` tag with ``topic`` and ``forum`` classes\n  accordingly\n\n0.9 -> 0.10\n-----------\n\n* Templates are updated for 2nd version of twitter bootstrap\n* Bootstrap less files removed from pybb.\n* Refactored example projects. `test` folder now contains two examples:\n    * `example_bootstrap` shows how to include bootstrap files in your project\n    * `example_thirdparty` shows how to use another project like `pinax-theme-bootstrap <https://github.com/pinax/pinax-theme-bootstrap>`_ to style forum\n* New poll feature added. When user creates new topic he can add poll question and some answers. Answers count\n  can vary from 2 to :ref:`PYBB_POLL_MAX_ANSWERS` setting (10 by default)\n* Dropped support for self containing CSS in pybb.css file and PYBB_ENABLE_SELF_CSS setting.\n\n0.8 -> 0.9\n----------\n\nThe PYBB_BUTTONS setting is removed and overridable `pybb/_button_*.html`\ntemplates for `save`, `new topic` and `submit` buttons are provided in case\ncss styling methods are not enough.\n\n0.6 -> 0.7\n----------\n\nIf you use custom BODY_CLEANER in your settings, rename this setting to :ref:`PYBB_BODY_VALIDATOR`\n\n0.5 -> 0.6\n----------\n\nVersion 0.6 has significant changes in template subsystem, with main goal to make them more configurable and simple.\n\n* CSS now not included with project.\n    * For a limited time legacy `pybb.css` can be enabled by activating :ref:`PYBB_ENABLE_SELF_CSS` settings (just set it for True).\n* Twitter bootstrap now included in project tree\n* Default templates now provide fine theme with twitter bootstrap, corresponded .less file 'pybb_bootstrap.less'\n  and builded `pybb_bootstrap.css` can be located in static. You can find example of usage in test directory.\n* Pagination and breadcrumb templates changed:\n    * pagination template moved from `templates/pybb/pagination/` to `templates/pybb`\n    * pagination template changed from plain links to ul/li list\n    * breadcrumb now live in separated template and changed from plain links to ul/li list\n    * `add_post_form.html` template renamed to `post_form.html`\n* :ref:`PYBB_FORUM_PAGE_SIZE` default value changed from 10 to 20\n"
  },
  {
    "path": "pybb/__init__.py",
    "content": "default_app_config = 'pybb.apps.PybbConfig'\n"
  },
  {
    "path": "pybb/admin.py",
    "content": "# -*- coding: utf-8\nfrom copy import deepcopy\nfrom django.utils.translation import gettext_lazy as _\nfrom django.contrib import admin\nfrom django.urls import reverse\n\nfrom pybb import permissions\nfrom pybb.models import Category, Forum, Topic, Post, Profile, Attachment, PollAnswer\n\nfrom pybb import compat, util\nusername_field = compat.get_username_field()\n\n\nclass ForumInlineAdmin(admin.TabularInline):\n    model = Forum\n    fields = ['name', 'hidden', 'position']\n    extra = 0\n\n\nclass CategoryAdmin(admin.ModelAdmin):\n    prepopulated_fields = {'slug': ('name',)}\n    list_display = ['name', 'position', 'hidden', 'forum_count']\n    list_per_page = 20\n    ordering = ['position']\n    search_fields = ['name']\n    list_editable = ['position']\n\n    inlines = [ForumInlineAdmin]\n\n\nclass ForumAdmin(admin.ModelAdmin):\n    prepopulated_fields = {'slug': ('name',)}\n    list_display = ['name', 'category', 'hidden', 'position', 'topic_count', ]\n    list_per_page = 20\n    raw_id_fields = ['moderators']\n    ordering = ['-category']\n    search_fields = ['name', 'category__name']\n    list_editable = ['position', 'hidden']\n    fieldsets = (\n        (None, {\n                'fields': ('category', 'parent', 'name', 'hidden', 'position', )\n                }\n         ),\n        (_('Additional options'), {\n                'classes': ('collapse',),\n                'fields': ('updated', 'description', 'headline', 'post_count', 'slug')\n                }\n            ),\n        )\n\n    def get_fieldsets(self, request, obj=None):\n        \"\"\"\n        adds moderators field to Additionnal options fieldset only if\n        the request user has permission to manage moderators\n        \"\"\"\n\n        fieldsets = super(ForumAdmin, self).get_fieldsets(request, obj)\n        if permissions.perms.may_manage_moderators(request.user):\n            fieldsets = deepcopy(fieldsets)\n            fieldsets[-1][1]['fields'] += ('moderators',)\n        return fieldsets\n\n\nclass PollAnswerAdmin(admin.TabularInline):\n    model = PollAnswer\n    fields = ['text', ]\n    extra = 0\n\n\nclass TopicAdmin(admin.ModelAdmin):\n    prepopulated_fields = {'slug': ('name',)}\n    list_display = ['name', 'forum', 'created', 'head', 'post_count', 'poll_type',]\n    list_per_page = 20\n    raw_id_fields = ['user', 'subscribers']\n    ordering = ['-created']\n    date_hierarchy = 'created'\n    search_fields = ['name']\n    fieldsets = (\n        (None, {\n                'fields': ('forum', 'name', 'user', ('created', 'updated'), 'poll_type',)\n                }\n         ),\n        (_('Additional options'), {\n                'classes': ('collapse',),\n                'fields': (('views', 'post_count'), ('sticky', 'closed'), 'subscribers', 'slug')\n                }\n         ),\n        )\n    inlines = [PollAnswerAdmin, ]\n\nclass TopicReadTrackerAdmin(admin.ModelAdmin):\n    list_display = ['topic', 'user', 'time_stamp']\n    search_fields = ['user__%s' % username_field]\n\nclass ForumReadTrackerAdmin(admin.ModelAdmin):\n    list_display = ['forum', 'user', 'time_stamp']\n    search_fields = ['user__%s' % username_field]\n\nclass PostAdmin(admin.ModelAdmin):\n    list_display = ['topic', 'user', 'created', 'updated', 'summary']\n    list_per_page = 20\n    raw_id_fields = ['user', 'topic']\n    ordering = ['-created']\n    date_hierarchy = 'created'\n    search_fields = ['body']\n    fieldsets = (\n        (None, {\n                'fields': ('topic', 'user')\n                }\n         ),\n        (_('Additional options'), {\n                'classes': ('collapse',),\n                'fields' : (('created', 'updated'), 'user_ip')\n                }\n         ),\n        (_('Message'), {\n                'fields': ('body', 'body_html', 'body_text')\n                }\n         ),\n        )\n\n\nclass ProfileAdmin(admin.ModelAdmin):\n    list_display = ['user', 'time_zone', 'language', 'post_count']\n    list_per_page = 20\n    ordering = ['-user']\n    search_fields = ['user__%s' % username_field]\n    fieldsets = (\n        (None, {\n                'fields': ('time_zone', 'language')\n                }\n         ),\n        (_('Additional options'), {\n                'classes': ('collapse',),\n                'fields' : ('avatar', 'signature', 'show_signatures')\n                }\n         ),\n        )\n\n\nclass AttachmentAdmin(admin.ModelAdmin):\n    list_display = ['file', 'size', 'admin_view_post', 'admin_edit_post']\n\n    def admin_view_post(self, obj):\n        return '<a href=\"%s\">view</a>' % obj.post.get_absolute_url()\n    admin_view_post.allow_tags = True\n    admin_view_post.short_description = _('View post')\n\n    def admin_edit_post(self, obj):\n        return '<a href=\"%s\">edit</a>' % reverse('admin:pybb_post_change', args=[obj.post.pk])\n    admin_edit_post.allow_tags = True\n    admin_edit_post.short_description = _('Edit post')\n\n\nadmin.site.register(Category, CategoryAdmin)\nadmin.site.register(Forum, ForumAdmin)\nadmin.site.register(Topic, TopicAdmin)\nadmin.site.register(Post, PostAdmin)\nadmin.site.register(Attachment, AttachmentAdmin)\n\nif util.get_pybb_profile_model() == Profile:\n    admin.site.register(Profile, ProfileAdmin)\n\n# This can be used to debug read/unread trackers\n\n#admin.site.register(TopicReadTracker, TopicReadTrackerAdmin)\n#admin.site.register(ForumReadTracker, ForumReadTrackerAdmin)\n"
  },
  {
    "path": "pybb/apps.py",
    "content": "from django.apps import AppConfig\nfrom django.utils.translation import gettext_lazy as _\n\n\nclass PybbConfig(AppConfig):\n    name = 'pybb'\n    verbose_name = _('Pybbm forum solution')\n    default_auto_field = 'django.db.models.AutoField'\n\n    def ready(self):\n        from pybb import signals\n        signals.setup()\n"
  },
  {
    "path": "pybb/compat.py",
    "content": "import django\nfrom django.conf import settings\nfrom django.utils.encoding import force_str\nfrom django.utils.text import slugify as django_slugify\nfrom unidecode import unidecode\nfrom pybb import defaults\n\nif defaults.PYBB_USE_DJANGO_MAILER:\n    from mailer import send_html_mail, send_mail\nelse:\n    from django.core.mail import send_mail, get_connection\n    from django.core.mail.message import EmailMultiAlternatives\n\n    def send_html_mail(subject, text_msg, html_msg, sender, recipient,\n            fail_silently=False, auth_user=None, auth_password=None, connection=None):\n        \"\"\"Sends an email with HTML alternative.\"\"\"\n        connection = connection or get_connection(username=auth_user,\n                                    password=auth_password,\n                                    fail_silently=fail_silently)\n        msg = EmailMultiAlternatives(subject, text_msg, sender, recipient, connection=connection)\n        msg.attach_alternative(html_msg, \"text/html\")\n        msg.send()\n\n\ndef send_mass_html_mail(emails, *args, **kwargs):\n    \"\"\"\n    Sends emails with html alternative if email item has html content.\n    Email item is a tuple with an optional html message version :\n        (subject, text_msg, sender, recipient, [html_msg])\n    \"\"\"\n    for email in emails:\n        subject, text_msg, sender, recipient = email[0:4]\n        html_msg = email[4] if len(email) > 4 else ''\n        if html_msg:\n            send_html_mail(subject, text_msg, html_msg, sender, recipient, *args, **kwargs)\n        else:\n            send_mail(subject, text_msg, sender, recipient, *args, **kwargs)\n\ndef get_image_field_class():\n    try:\n        from PIL import Image\n    except ImportError:\n        from django.db.models import FileField\n        return FileField\n    try:\n        from sorl.thumbnail import ImageField\n    except ImportError:\n        from django.db.models import ImageField\n    return ImageField\n\n\ndef get_image_field_full_name():\n    try:\n        from PIL import Image\n    except ImportError:\n        return 'django.db.models.fields.files.FileField'\n    try:\n        from sorl.thumbnail import ImageField\n        name = 'sorl.thumbnail.fields.ImageField'\n    except ImportError:\n        from django.db.models import ImageField\n        name = 'django.db.models.fields.files.ImageField'\n    return name\n\n\ndef get_user_model():\n    from django.contrib.auth import get_user_model\n    return get_user_model()\n\n\ndef get_user_model_path():\n    return getattr(settings, 'AUTH_USER_MODEL', 'auth.User')\n\n\ndef get_username_field():\n    return get_user_model().USERNAME_FIELD\n\n\ndef get_atomic_func():\n    from django.db.transaction import atomic as atomic_func\n    return atomic_func\n\n\ndef get_paginator_class():\n    try:\n        from pure_pagination import Paginator\n        pure_pagination = True\n    except ImportError:\n        # the simplest emulation of django-pure-pagination behavior\n        from django.core.paginator import Paginator, Page\n        class PageRepr(int):\n            def querystring(self):\n                return 'page=%s' % self\n        Page.pages = lambda self: [PageRepr(i) for i in range(1, self.paginator.num_pages + 1)]\n        pure_pagination = False\n\n    return Paginator, pure_pagination\n\n\ndef is_installed(app_name):\n    from django.apps import apps\n    return apps.is_installed(app_name)\n\n\ndef get_related_model_class(parent_model, field_name):\n    return parent_model._meta.get_field(field_name).related_model\n\n\ndef slugify(text):\n    \"\"\"\n    Slugify function that supports unicode symbols\n    :param text: any unicode text\n    :return: slugified version of passed text\n    \"\"\"\n    return django_slugify(force_str(unidecode(text)))\n"
  },
  {
    "path": "pybb/context_processors.py",
    "content": "\nfrom pybb import defaults\n\n__author__ = 'zeus'\n\n\ndef processor(request):\n    context = {}\n    for i in (\n        'PYBB_TEMPLATE',\n        'PYBB_TEMPLATE_MAIL_HTML',\n        'PYBB_TEMPLATE_MAIL_TXT',\n        'PYBB_DEFAULT_AVATAR_URL',\n        'PYBB_MARKUP',\n        'PYBB_DEFAULT_TITLE',\n        'PYBB_ENABLE_ANONYMOUS_POST',\n        'PYBB_ATTACHMENT_ENABLE', # deprecated, should be used pybb_may_attach_files filter, will be removed\n        'PYBB_AVATAR_WIDTH',\n        'PYBB_AVATAR_HEIGHT'\n    ):\n        context[i] = getattr(defaults, i, None)\n    context['PYBB_AVATAR_DIMENSIONS'] = '%sx%s' % (defaults.PYBB_AVATAR_WIDTH, defaults.PYBB_AVATAR_WIDTH)\n    return context\n"
  },
  {
    "path": "pybb/defaults.py",
    "content": "import os.path\nimport warnings\nfrom django.conf import settings\nfrom django.core.exceptions import ImproperlyConfigured\n\nPYBB_TOPIC_PAGE_SIZE = getattr(settings, 'PYBB_TOPIC_PAGE_SIZE', 10)\nPYBB_FORUM_PAGE_SIZE = getattr(settings, 'PYBB_FORUM_PAGE_SIZE', 20)\nPYBB_AVATAR_WIDTH = getattr(settings, 'PYBB_AVATAR_WIDTH', 80)\nPYBB_AVATAR_HEIGHT = getattr(settings, 'PYBB_AVATAR_HEIGHT', 80)\nPYBB_MAX_AVATAR_SIZE = getattr(settings, 'PYBB_MAX_AVATAR_SIZE', 1024 * 50)\nPYBB_DEFAULT_TIME_ZONE = getattr(settings, 'PYBB_DEFAULT_TIME_ZONE', 3)\n\nPYBB_SIGNATURE_MAX_LENGTH = getattr(settings, 'PYBB_SIGNATURE_MAX_LENGTH', 1024)\nPYBB_SIGNATURE_MAX_LINES = getattr(settings, 'PYBB_SIGNATURE_MAX_LINES', 3)\n\nPYBB_DEFAULT_MARKUP = getattr(settings, 'PYBB_DEFAULT_MARKUP', 'bbcode')\nPYBB_FREEZE_FIRST_POST = getattr(settings, 'PYBB_FREEZE_FIRST_POST', False)\n\nPYBB_ATTACHMENT_SIZE_LIMIT = getattr(settings, 'PYBB_ATTACHMENT_SIZE_LIMIT', 1024 * 1024)\nPYBB_ATTACHMENT_ENABLE = getattr(settings, 'PYBB_ATTACHMENT_ENABLE', False)\nPYBB_ATTACHMENT_UPLOAD_TO = getattr(settings, 'PYBB_ATTACHMENT_UPLOAD_TO', os.path.join('pybb_upload', 'attachments'))\n\nPYBB_DEFAULT_AVATAR_URL = getattr(settings, 'PYBB_DEFAULT_AVATAR_URL',\n                                  getattr(settings, 'STATIC_URL', '') + 'pybb/img/default_avatar.jpg')\n\nPYBB_DEFAULT_TITLE = getattr(settings, 'PYBB_DEFAULT_TITLE', 'PYBB Powered Forum')\n\nPYBB_SMILES_PREFIX = getattr(settings, 'PYBB_SMILES_PREFIX', 'pybb/emoticons/')\n\nPYBB_SMILES = getattr(settings, 'PYBB_SMILES', {\n    '&gt;_&lt;': 'angry.png',\n    ':.(': 'cry.png',\n    'o_O': 'eyes.png',\n    '[]_[]': 'geek.png',\n    '8)': 'glasses.png',\n    ':D': 'lol.png',\n    ':(': 'sad.png',\n    ':O': 'shok.png',\n    '-_-': 'shy.png',\n    ':)': 'smile.png',\n    ':P': 'tongue.png',\n    ';)': 'wink.png'\n})\n\nPYBB_NICE_URL = getattr(settings, 'PYBB_NICE_URL', False)\nPYBB_NICE_URL_PERMANENT_REDIRECT = getattr(settings, 'PYBB_NICE_URL_PERMANENT_REDIRECT', True)\nPYBB_NICE_URL_SLUG_DUPLICATE_LIMIT = getattr(settings, 'PYBB_NICE_URL_SLUG_DUPLICATE_LIMIT', 100)\n\n# TODO In a near future, this code will be deleted when callable settings will not supported anymore.\ncallable_warning = ('%(setting_name)s should not be a callable anymore but a path to the parser classes.'\n                    'ex : myproject.markup.CustomBBCodeParser. It will stop working in next pybbm release.')\nwrong_setting_warning = ('%s setting will be removed in next pybbm version. '\n                         'Place your custom quote functions in markup class and override '\n                         'PYBB_MARKUP_ENGINES_PATHS/PYBB_MARKUP settings')\nbad_function_warning = '%(bad)s function is deprecated. Use %(good)s instead.'\n\n\ndef getsetting_with_deprecation_check(all_settings, setting_name):  # pragma: no cover\n    setting_value = getattr(all_settings, setting_name)\n    values = setting_value if type(setting_value) is not dict else setting_value.values()\n    for value in values:\n        if isinstance(value, str):\n            continue\n        warnings.warn(\n            callable_warning % {'setting_name': setting_name, },\n            DeprecationWarning\n        )\n    return setting_value\n\n\nPYBB_MARKUP_ENGINES_PATHS = getattr(settings, 'PYBB_MARKUP_ENGINES_PATHS', {\n    'bbcode': 'pybb.markup.bbcode.BBCodeParser',\n    'markdown': 'pybb.markup.markdown.MarkdownParser'})\n\n# TODO in the next major release : delete PYBB_MARKUP_ENGINES and PYBB_QUOTE_ENGINES settings\nif not hasattr(settings, 'PYBB_MARKUP_ENGINES'):\n    PYBB_MARKUP_ENGINES = PYBB_MARKUP_ENGINES_PATHS\nelse:  # pragma: no cover\n    warnings.warn(wrong_setting_warning % 'PYBB_MARKUP_ENGINES', DeprecationWarning)\n    PYBB_MARKUP_ENGINES = getsetting_with_deprecation_check(settings, 'PYBB_MARKUP_ENGINES')\n\nif not hasattr(settings, 'PYBB_QUOTE_ENGINES'):\n    PYBB_QUOTE_ENGINES = PYBB_MARKUP_ENGINES_PATHS\nelse:  # pragma: no cover\n    warnings.warn(wrong_setting_warning % 'PYBB_QUOTE_ENGINES', DeprecationWarning)\n    PYBB_QUOTE_ENGINES = getsetting_with_deprecation_check(settings, 'PYBB_QUOTE_ENGINES')\n\nPYBB_MARKUP = getattr(settings, 'PYBB_MARKUP', None)\nif not PYBB_MARKUP or PYBB_MARKUP not in PYBB_MARKUP_ENGINES:\n    if not PYBB_MARKUP_ENGINES:  # pragma: no cover\n        warnings.warn('There is no markup engines defined in your settings. '\n                      'Default pybb.base.BaseParser will be used.'\n                      'Please set correct PYBB_MARKUP_ENGINES_PATHS and PYBB_MARKUP settings.',\n                      DeprecationWarning)\n        PYBB_MARKUP = None\n    elif 'bbcode' in PYBB_MARKUP_ENGINES:\n        # Backward compatibility. bbcode is the default markup\n        PYBB_MARKUP = 'bbcode'\n    else:\n        raise ImproperlyConfigured('PYBB_MARKUP must be defined to an existing key of '\n                                   'PYBB_MARKUP_ENGINES_PATHS')\n\nPYBB_TEMPLATE = getattr(settings, 'PYBB_TEMPLATE', \"base.html\")\nPYBB_TEMPLATE_MAIL_TXT = getattr(settings,\n                                 'PYBB_TEMPLATE_MAIL_TXT',\n                                 'pybb/mail_templates/base.html')\nPYBB_TEMPLATE_MAIL_HTML = getattr(settings,\n                                  'PYBB_TEMPLATE_MAIL_HTML',\n                                  'pybb/mail_templates/base-html.html')\nPYBB_DEFAULT_AUTOSUBSCRIBE = getattr(settings, 'PYBB_DEFAULT_AUTOSUBSCRIBE', True)\nPYBB_ENABLE_ANONYMOUS_POST = getattr(settings, 'PYBB_ENABLE_ANONYMOUS_POST', False)\nPYBB_ANONYMOUS_USERNAME = getattr(settings, 'PYBB_ANONYMOUS_USERNAME', 'Anonymous')\nPYBB_ANONYMOUS_VIEWS_CACHE_BUFFER = getattr(settings, 'PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER', 100)\n\nPYBB_DISABLE_SUBSCRIPTIONS = getattr(settings, 'PYBB_DISABLE_SUBSCRIPTIONS', False)\nPYBB_DISABLE_NOTIFICATIONS = getattr(settings, 'PYBB_DISABLE_NOTIFICATIONS', False)\nPYBB_PREMODERATION = getattr(settings, 'PYBB_PREMODERATION', False)\n\nif not hasattr(settings, 'PYBB_BODY_CLEANERS'):\n    PYBB_BODY_CLEANERS = ['pybb.markup.base.rstrip_str', 'pybb.markup.base.filter_blanks']\nelse:  # pragma: no cover\n    PYBB_BODY_CLEANERS = getsetting_with_deprecation_check(settings, 'PYBB_BODY_CLEANERS')\n\nPYBB_BODY_VALIDATOR = getattr(settings, 'PYBB_BODY_VALIDATOR', None)\n\nPYBB_POLL_MAX_ANSWERS = getattr(settings, 'PYBB_POLL_MAX_ANSWERS', 10)\n\nPYBB_AUTO_USER_PERMISSIONS = getattr(settings, 'PYBB_AUTO_USER_PERMISSIONS', True)\n\nPYBB_USE_DJANGO_MAILER = getattr(settings, 'PYBB_USE_DJANGO_MAILER', False)\n\nPYBB_PERMISSION_HANDLER = getattr(settings, 'PYBB_PERMISSION_HANDLER', 'pybb.permissions.DefaultPermissionHandler')\n\nPYBB_PROFILE_RELATED_NAME = getattr(settings, 'PYBB_PROFILE_RELATED_NAME', 'pybb_profile')\n\nPYBB_ENABLE_ADMIN_POST_FORM = getattr(settings, 'PYBB_ENABLE_ADMIN_POST_FORM', True)\n\nPYBB_ALLOW_DELETE_OWN_POST = getattr(settings, 'PYBB_ALLOW_DELETE_OWN_POST', True)\n\n# Backward compatibility : define old functions which was defined here if some devs did used it\n# TODO in a near future : delete those functions\n\ndef bbcode(s):  # pragma: no cover\n    warnings.warn(\n        bad_function_warning % {\n            'bad': 'pybb.defaults.bbcode',\n            'good': 'pybb.markup.bbcode.BBCodeParser',\n        },\n        DeprecationWarning)\n    from pybb.markup.bbcode import BBCodeParser\n\n    return BBCodeParser().format(s)\n\n\ndef markdown(s):  # pragma: no cover\n    warnings.warn(\n        bad_function_warning % {\n            'bad': 'pybb.defaults.markdown',\n            'good': 'pybb.markup.markdown.MarkdownParser',\n        },\n        DeprecationWarning)\n    from pybb.markup.markdown import MarkdownParser\n\n    return MarkdownParser().format(s)\n\n\ndef _render_quote(name, value, options, parent, context):  # pragma: no cover\n    warnings.warn('pybb.defaults._render_quote function is deprecated. '\n                  'This function is internal of new pybb.markup.bbcode.BBCodeParser class.',\n                  DeprecationWarning)\n    from pybb.markup.bbcode import BBCodeParser\n\n    return BBCodeParser()._render_quote(name, value, options, parent, context)\n\n\ndef smile_it(s):  # pragma: no cover\n    warnings.warn(\n        bad_function_warning % {\n            'bad': 'pybb.defaults.smile_it',\n            'good': 'pybb.markup.base.smile_it',\n        },\n        DeprecationWarning)\n    from pybb.markup.base import smile_it as real_smile_it\n\n    return real_smile_it(s)\n"
  },
  {
    "path": "pybb/feeds.py",
    "content": "\nfrom django.contrib.syndication.views import Feed\nfrom django.urls import reverse\nfrom django.utils.feedgenerator import Atom1Feed\nfrom django.utils.translation import gettext_lazy as _\n\nfrom pybb.models import Post, Topic\n\nfrom pybb.permissions import perms\n\nclass PybbFeed(Feed):\n    feed_type = Atom1Feed\n\n    def link(self):\n        return reverse('pybb:index')\n\n    def item_guid(self, obj):\n        return str(obj.id)\n\n    def item_pubdate(self, obj):\n        return obj.created\n\n\nclass LastPosts(PybbFeed):\n    title = _('Latest posts on forum')\n    description = _('Latest posts on forum')\n    title_template = 'pybb/feeds/posts_title.html'\n    description_template = 'pybb/feeds/posts_description.html'\n\n    def get_object(self, request, *args, **kwargs):\n        return request.user\n\n    def items(self, user):\n        ids = [p.id for p in perms.filter_posts(user, Post.objects.only('id')).order_by('-created', '-id')[:15]]\n        return Post.objects.filter(id__in=ids).select_related('topic', 'topic__forum', 'user')\n\n\nclass LastTopics(PybbFeed):\n    title = _('Latest topics on forum')\n    description = _('Latest topics on forum')\n    title_template = 'pybb/feeds/topics_title.html'\n    description_template = 'pybb/feeds/topics_description.html'\n\n    def get_object(self, request, *args, **kwargs):\n        return request.user\n\n    def items(self, user):\n        return perms.filter_topics(user, Topic.objects.all()).select_related('forum').order_by('-created', '-id')[:15]\n"
  },
  {
    "path": "pybb/forms.py",
    "content": "\nimport re\nimport inspect\n\nimport django\nfrom django import forms\nfrom django.core.exceptions import FieldError, PermissionDenied\nfrom django.forms.models import inlineformset_factory, BaseInlineFormSet\nfrom django.utils.decorators import method_decorator\nfrom django.utils.text import Truncator\nfrom django.utils.translation import gettext, gettext_lazy\nfrom django.utils.timezone import now as tznow\nfrom django.utils.translation import gettext as _\n\nfrom pybb import compat, defaults, util, permissions\nfrom pybb.models import Topic, Post, Attachment, PollAnswer, \\\n    ForumSubscription, Category, Forum, create_or_check_slug\n\n\nUser = compat.get_user_model()\nusername_field = compat.get_username_field()\n\n\nclass AttachmentForm(forms.ModelForm):\n    class Meta(object):\n        model = Attachment\n        fields = ('file', )\n\n    def clean_file(self):\n        if self.cleaned_data['file'].size > defaults.PYBB_ATTACHMENT_SIZE_LIMIT:\n            raise forms.ValidationError(gettext('Attachment is too big'))\n        return self.cleaned_data['file']\n\nAttachmentFormSet = inlineformset_factory(Post, Attachment, extra=1, form=AttachmentForm)\n\n\nclass PollAnswerForm(forms.ModelForm):\n    class Meta:\n        model = PollAnswer\n        fields = ('text', )\n\n\nclass BasePollAnswerFormset(BaseInlineFormSet):\n    def clean(self):\n        forms_cnt = (len(self.initial_forms) + len([form for form in self.extra_forms if form.has_changed()]) -\n                     len(self.deleted_forms))\n        if forms_cnt > defaults.PYBB_POLL_MAX_ANSWERS:\n            raise forms.ValidationError(\n                gettext('You can''t add more than %s answers for poll' % defaults.PYBB_POLL_MAX_ANSWERS))\n        if forms_cnt < 2:\n            raise forms.ValidationError(gettext('Add two or more answers for this poll'))\n\n\nPollAnswerFormSet = inlineformset_factory(Topic, PollAnswer, extra=2, max_num=defaults.PYBB_POLL_MAX_ANSWERS,\n                                          form=PollAnswerForm, formset=BasePollAnswerFormset)\n\n\nclass PostForm(forms.ModelForm):\n    name = forms.CharField(label=gettext_lazy('Subject'))\n    poll_type = forms.TypedChoiceField(label=gettext_lazy('Poll type'), choices=Topic.POLL_TYPE_CHOICES, coerce=int)\n    poll_question = forms.CharField(\n        label=gettext_lazy('Poll question'),\n        required=False,\n        widget=forms.Textarea(attrs={'class': 'no-markitup'}))\n    slug = forms.CharField(label=gettext_lazy('Topic slug'), required=False)\n\n    class Meta(object):\n        model = Post\n        fields = ('body',)\n        widgets = {\n            'body': util.get_markup_engine().get_widget_cls(),\n        }\n\n    def __init__(self, *args, **kwargs):\n        # Move args to kwargs\n        if args:\n            kwargs.update(dict(zip(inspect.getargspec(super(PostForm, self).__init__)[0][1:], args)))\n        self.user = kwargs.pop('user', None)\n        self.ip = kwargs.pop('ip', None)\n        self.topic = kwargs.pop('topic', None)\n        self.forum = kwargs.pop('forum', None)\n        self.may_create_poll = kwargs.pop('may_create_poll', True)\n        self.may_edit_topic_slug = kwargs.pop('may_edit_topic_slug', False)\n        if not (self.topic or self.forum or ('instance' in kwargs)):\n            raise ValueError('You should provide topic, forum or instance')\n            # Handle topic subject, poll type and question if editing topic head\n        if kwargs.get('instance', None) and (kwargs['instance'].topic.head == kwargs['instance']):\n            kwargs.setdefault('initial', {})['name'] = kwargs['instance'].topic.name\n            kwargs.setdefault('initial', {})['poll_type'] = kwargs['instance'].topic.poll_type\n            kwargs.setdefault('initial', {})['poll_question'] = kwargs['instance'].topic.poll_question\n\n        super(PostForm, self).__init__(**kwargs)\n\n        # remove topic specific fields\n        if not (self.forum or (self.instance.pk and (self.instance.topic.head == self.instance))):\n            del self.fields['name']\n            del self.fields['poll_type']\n            del self.fields['poll_question']\n            del self.fields['slug']\n        else:\n            if not self.may_create_poll:\n                del self.fields['poll_type']\n                del self.fields['poll_question']\n            if not self.may_edit_topic_slug:\n                del self.fields['slug']\n\n        self.available_smiles = defaults.PYBB_SMILES\n        self.smiles_prefix = defaults.PYBB_SMILES_PREFIX\n\n    def clean_body(self):\n        body = self.cleaned_data['body']\n        user = self.user or self.instance.user\n        if defaults.PYBB_BODY_VALIDATOR:\n            defaults.PYBB_BODY_VALIDATOR(user, body)\n\n        for cleaner in defaults.PYBB_BODY_CLEANERS:\n            body = util.get_body_cleaner(cleaner)(user, body)\n        return body\n\n    def clean(self):\n        poll_type = self.cleaned_data.get('poll_type', None)\n        poll_question = self.cleaned_data.get('poll_question', None)\n        if poll_type is not None and poll_type != Topic.POLL_TYPE_NONE and not poll_question:\n            raise forms.ValidationError(gettext('Poll''s question is required when adding a poll'))\n\n        return self.cleaned_data\n\n    def save(self, commit=True):\n        if self.instance.pk:\n            post = super(PostForm, self).save(commit=False)\n            if self.user:\n                post.user = self.user\n            if post.topic.head == post:\n                post.topic.name = self.cleaned_data['name']\n                if self.may_create_poll:\n                    post.topic.poll_type = self.cleaned_data['poll_type']\n                    post.topic.poll_question = self.cleaned_data['poll_question']\n                post.topic.updated = tznow()\n                if commit:\n                    post.topic.save()\n            post.updated = tznow()\n            if commit:\n                post.save()\n            return post, post.topic\n\n        allow_post = True\n        if defaults.PYBB_PREMODERATION:\n            allow_post = defaults.PYBB_PREMODERATION(self.user, self.cleaned_data['body'])\n        if self.forum:\n            topic = Topic(\n                forum=self.forum,\n                user=self.user,\n                name=self.cleaned_data['name'],\n                poll_type=self.cleaned_data.get('poll_type', Topic.POLL_TYPE_NONE),\n                poll_question=self.cleaned_data.get('poll_question', None),\n                slug=self.cleaned_data.get('slug', None),\n            )\n            if not allow_post:\n                topic.on_moderation = True\n        else:\n            topic = self.topic\n        post = Post(user=self.user, user_ip=self.ip, body=self.cleaned_data['body'])\n        if not allow_post:\n            post.on_moderation = True\n        if commit:\n            topic.save()\n            post.topic = topic\n            post.save()\n        return post, topic\n\n\nclass MovePostForm(forms.Form):\n\n    def __init__(self, instance, user, *args, **kwargs):\n        super(MovePostForm, self).__init__(*args, **kwargs)\n        self.instance = instance\n        self.user = user\n        self.post = self.instance\n        self.category, self.forum, self.topic = self.post.get_parents()\n\n        if not self.post.is_topic_head:\n            # we do not move an entire topic but a part of it's posts. Let's select those posts.\n            self.posts_to_move = Post.objects.filter(created__gte=self.post.created,\n                                                     topic=self.topic).order_by('created', 'pk')\n            # if multiple posts exists with the same created datetime, it's important to keep the\n            # same order and do not move some posts which could be \"before\" our post.\n            # We can not just filter by adding `pk__gt=self.post.pk` because we could exclude\n            # some posts if for some reasons, a lesser pk has a greater \"created\" datetime\n            # Most of the time, we just do one extra request to be sure the first post is\n            # the wanted one\n            first_pk = self.posts_to_move.values_list('pk', flat=True)[0]\n            while first_pk != self.post.pk:\n                self.posts_to_move = self.posts_to_move.exclude(pk=first_pk)\n                first_pk = self.posts_to_move.values_list('pk', flat=True)[0]\n\n            i = 0\n            choices = []\n            for post in self.posts_to_move[1:]:  # all except the current one\n                i += 1\n                bvars = {'author': util.get_pybb_profile(post.user).get_display_name(),\n                         'abstract': Truncator(post.body_text).words(8),\n                         'i': i}\n                label = _('%(i)d (%(author)s: \"%(abstract)s\")') % bvars\n                choices.append((i, label))\n            choices.insert(0, (0, _('None')))\n            choices.insert(0, (-1, _('All')))\n            self.fields['number'] = forms.TypedChoiceField(\n                label=gettext_lazy('Number of following posts to move with'),\n                choices=choices, required=True, coerce=int,\n            )\n            # we move the entire topic, so we want to change it's forum.\n            # So, let's exclude the current one\n\n        # get all forum where we can move this post (and the others)\n        move_to_forums = permissions.perms.filter_forums(self.user, Forum.objects.all())\n        if self.post.is_topic_head:\n            # we move the entire topic, so we want to change it's forum.\n            # So, let's exclude the current one\n            move_to_forums = move_to_forums.exclude(pk=self.forum.pk)\n        last_cat_pk = None\n        choices = []\n        for forum in move_to_forums.order_by('category__position', 'position', 'name'):\n            if not permissions.perms.may_create_topic(self.user, forum):\n                continue\n            if last_cat_pk != forum.category.pk:\n                last_cat_pk = forum.category.pk\n                choices.append(('%s' % forum.category, []))\n            if self.forum.pk == forum.pk:\n                name = '%(forum)s (forum of the current post)' % {'forum': self.forum}\n            else:\n                name = '%s' % forum\n            choices[-1][1].append((forum.pk, name))\n\n        self.fields['move_to'] = forms.ChoiceField(label=gettext_lazy('Move to forum'),\n                                                   initial=self.forum.pk,\n                                                   choices=choices, required=True,)\n        self.fields['name'] = forms.CharField(label=_('New subject'),\n                                              initial=self.topic.name,\n                                              max_length=255, required=True)\n        if permissions.perms.may_edit_topic_slug(self.user):\n            self.fields['slug'] = forms.CharField(label=_('New topic slug'),\n                                                  initial=self.topic.slug,\n                                                  max_length=255, required=False)\n\n    def get_new_topic(self):\n        if hasattr(self, '_new_topic'):\n            return self._new_topic\n        if self.post.is_topic_head:\n            topic = self.topic\n        else:\n            topic = Topic(user=self.post.user)\n\n        if topic.name != self.cleaned_data['name']:\n            topic.name = self.cleaned_data['name']\n            # force slug auto-rebuild if slug is not speficied and topic is renamed\n            topic.slug = self.cleaned_data.get('slug', None)\n        elif self.cleaned_data.get('slug', None):\n            topic.slug = self.cleaned_data['slug']\n\n        topic.forum = Forum.objects.get(pk=self.cleaned_data['move_to'])\n        topic.slug = create_or_check_slug(topic, Topic, forum=topic.forum)\n        topic.save()\n        return topic\n\n    @method_decorator(compat.get_atomic_func())\n    def save(self):\n        data = self.cleaned_data\n        topic = self.get_new_topic()\n\n        if not self.post.is_topic_head:\n            # we move some posts\n            posts = self.posts_to_move\n            if data['number'] != -1:\n                number = data['number'] + 1  # we want to move at least the current post ;-)\n                posts = posts[0:number]\n            # update posts\n            # we can not update with subqueries on same table with mysql 5.5\n            # it raises: You can't specify target table 'pybb_post' for update in FROM clause\n            # so we need to get all pks... It's bad for perfs, but posts are not often splitted...\n            posts_pks = [p.pk for p in posts]\n            Post.objects.filter(pk__in=posts_pks).update(topic_id=topic.pk)\n\n        topic.update_counters()\n        topic.forum.update_counters()\n\n        if topic.pk != self.topic.pk:\n            # we just created a new topic. let's update the counters\n            self.topic.update_counters()\n        if self.forum.pk != topic.forum.pk:\n            self.forum.update_counters()\n        return Post.objects.get(pk=self.post.pk)\n\n\nclass AdminPostForm(PostForm):\n    \"\"\"\n    Superusers can post messages from any user and from any time\n    If no user with specified name - new user will be created\n    \"\"\"\n    login = forms.CharField(label=gettext_lazy('User'))\n\n    def __init__(self, *args, **kwargs):\n        if args:\n            kwargs.update(dict(zip(inspect.getargspec(forms.ModelForm.__init__)[0][1:], args)))\n        if 'instance' in kwargs and kwargs['instance']:\n            kwargs.setdefault('initial', {}).update({'login': getattr(kwargs['instance'].user, username_field)})\n        super(AdminPostForm, self).__init__(**kwargs)\n\n    def save(self, *args, **kwargs):\n        try:\n            self.user = User.objects.filter(**{username_field: self.cleaned_data['login']}).get()\n        except User.DoesNotExist:\n            if username_field != 'email':\n                create_data = {username_field: self.cleaned_data['login'],\n                               'email': '%s@example.com' % self.cleaned_data['login'],\n                               'is_staff': False}\n            else:\n                create_data = {'email': '%s@example.com' % self.cleaned_data['login'],\n                               'is_staff': False}\n            self.user = User.objects.create(**create_data)\n        return super(AdminPostForm, self).save(*args, **kwargs)\n\n\ntry:\n    class EditProfileForm(forms.ModelForm):\n        class Meta(object):\n            model = util.get_pybb_profile_model()\n            fields = ['signature', 'time_zone', 'language', 'show_signatures', 'avatar']\n\n        def __init__(self, *args, **kwargs):\n            super(EditProfileForm, self).__init__(*args, **kwargs)\n            self.fields['signature'].widget = forms.Textarea(attrs={'rows': 2, 'cols:': 60})\n\n        def clean_avatar(self):\n            if self.cleaned_data['avatar'] and (self.cleaned_data['avatar'].size > defaults.PYBB_MAX_AVATAR_SIZE):\n                forms.ValidationError(gettext('Avatar is too large, max size: %s bytes' %\n                                               defaults.PYBB_MAX_AVATAR_SIZE))\n            return self.cleaned_data['avatar']\n\n        def clean_signature(self):\n            value = self.cleaned_data['signature'].strip()\n            if len(re.findall(r'\\n', value)) > defaults.PYBB_SIGNATURE_MAX_LINES:\n                raise forms.ValidationError('Number of lines is limited to %d' % defaults.PYBB_SIGNATURE_MAX_LINES)\n            if len(value) > defaults.PYBB_SIGNATURE_MAX_LENGTH:\n                raise forms.ValidationError('Length of signature is limited to %d' % defaults.PYBB_SIGNATURE_MAX_LENGTH)\n            return value\nexcept FieldError:\n    pass\n\n\nclass UserSearchForm(forms.Form):\n    query = forms.CharField(required=False, label='')\n\n    def filter(self, qs):\n        if self.is_valid():\n            query = self.cleaned_data['query']\n            return qs.filter(**{'%s__contains' % username_field: query})\n        else:\n            return qs\n\n\nclass PollForm(forms.Form):\n    def __init__(self, topic, *args, **kwargs):\n        self.topic = topic\n\n        super(PollForm, self).__init__(*args, **kwargs)\n\n        qs = PollAnswer.objects.filter(topic=topic)\n        if topic.poll_type == Topic.POLL_TYPE_SINGLE:\n            self.fields['answers'] = forms.ModelChoiceField(\n                label='', queryset=qs, empty_label=None,\n                widget=forms.RadioSelect())\n        elif topic.poll_type == Topic.POLL_TYPE_MULTIPLE:\n            self.fields['answers'] = forms.ModelMultipleChoiceField(\n                label='', queryset=qs,\n                widget=forms.CheckboxSelectMultiple())\n\n    def clean_answers(self):\n        answers = self.cleaned_data['answers']\n        if self.topic.poll_type == Topic.POLL_TYPE_SINGLE:\n            return [answers]\n        else:\n            return answers\n\n\nclass ForumSubscriptionForm(forms.Form):\n    def __init__(self, user, forum, instance=None, *args, **kwargs):\n        super(ForumSubscriptionForm, self).__init__(*args, **kwargs)\n        self.user = user\n        self.forum = forum\n        self.instance = instance\n\n        type_choices = list(ForumSubscription.TYPE_CHOICES)\n        if instance :\n            type_choices.append(\n                ('unsubscribe', _('be unsubscribe from this forum')))\n            type_initial = instance.type\n        else:\n            type_initial = ForumSubscription.TYPE_NOTIFY\n        self.fields['type'] = forms.ChoiceField(\n            label=_('You want to'), choices=type_choices, initial=type_initial,\n            widget=forms.RadioSelect())\n\n        topic_choices = (\n            ('new', _('only new topics')),\n            ('all', _('all topics of the forum')),\n        )\n        self.fields['topics'] = forms.ChoiceField(\n            label=_('Concerned topics'), choices=topic_choices,\n            initial=topic_choices[0][0], widget=forms.RadioSelect())\n\n    def process(self):\n        \"\"\"\n        saves or deletes the ForumSubscription's instance\n        \"\"\"\n        action = self.cleaned_data.get('type')\n        all_topics = self.cleaned_data.get('topics') == 'all'\n        if action == 'unsubscribe':\n            self.instance.delete(all_topics=all_topics)\n            return 'delete-all' if all_topics else 'delete'\n        else:\n            if not self.instance:\n                self.instance = ForumSubscription()\n                self.instance.user = self.user\n                self.instance.forum = self.forum\n            self.instance.type = int(self.cleaned_data.get('type'))\n            self.instance.save(all_topics=all_topics)\n            return 'subscribe-all' if all_topics else 'subscribe'\n\n\nclass ModeratorForm(forms.Form):\n\n    def __init__(self, user, *args, **kwargs):\n\n        \"\"\"\n        Creates the form to grant moderator privileges, checking if the request user has the\n        permission to do so.\n\n        :param user: request user\n        \"\"\"\n\n        super(ModeratorForm, self).__init__(*args, **kwargs)\n        categories = Category.objects.all()\n        self.authorized_forums = []\n        if not permissions.perms.may_manage_moderators(user):\n            raise PermissionDenied()\n        for category in categories:\n            forums = [forum.pk for forum in category.forums.all() if permissions.perms.may_change_forum(user, forum)]\n            if forums:\n                self.authorized_forums += forums\n                self.fields['cat_%d' % category.pk] = forms.ModelMultipleChoiceField(\n                    label=category.name,\n                    queryset=category.forums.filter(pk__in=forums),\n                    widget=forms.CheckboxSelectMultiple(),\n                    required=False\n                )\n\n    def process(self, target_user):\n        \"\"\"\n        Updates the target user moderator privileges\n\n        :param target_user: user to update\n        \"\"\"\n\n        cleaned_forums = self.cleaned_data.values()\n        initial_forum_set = target_user.forum_set.all()\n        # concatenation of the lists into one\n        checked_forums = [forum for queryset in cleaned_forums for forum in queryset]\n        # keep all the forums, the request user does't have the permission to change\n        untouchable_forums = [forum for forum in initial_forum_set if forum.pk not in self.authorized_forums]\n        if django.VERSION < (1, 9):\n            target_user.forum_set = checked_forums + untouchable_forums\n        else:\n            target_user.forum_set.set(checked_forums + untouchable_forums)\n"
  },
  {
    "path": "pybb/locale/de/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pybbm\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-01-11 14:06+0100\\n\"\n\"PO-Revision-Date: 2017-01-11 14:11+0100\\n\"\n\"Last-Translator: DylannCordel <d.cordel@webu.coop>\\n\"\n\"Language-Team: \\n\"\n\"Language: de\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Generator: Poedit 1.6.10\\n\"\n\"X-Poedit-SourceCharset: UTF-8\\n\"\n\"X-Poedit-Basepath: ../../..\\n\"\n\n#: admin.py:45 admin.py:84 admin.py:112 admin.py:134\nmsgid \"Additional options\"\nmsgstr \"Zusätzliche Einstellungen\"\n\n#: admin.py:117 models.py:280\nmsgid \"Message\"\nmsgstr \"Nachricht\"\n\n#: admin.py:148\nmsgid \"View post\"\nmsgstr \"Beitrag anzeigen\"\n\n#: admin.py:153\nmsgid \"Edit post\"\nmsgstr \"Beitrag bearbeiten\"\n\n#: apps.py:9\nmsgid \"Pybbm forum solution\"\nmsgstr \"\"\n\n#: feeds.py:27 feeds.py:28 templates/pybb/base.html:10\nmsgid \"Latest posts on forum\"\nmsgstr \"Neueste Antworten in Forum\"\n\n#: feeds.py:41 feeds.py:42 templates/pybb/base.html:11\nmsgid \"Latest topics on forum\"\nmsgstr \"Neueste Beiträge in Forum\"\n\n#: forms.py:30\nmsgid \"Attachment is too big\"\nmsgstr \"Anhang ist zu groß\"\n\n#: forms.py:48\n#, python-format\nmsgid \"You cant add more than %s answers for poll\"\nmsgstr \"Sie können nicht mehr als %s Antworten pro Umfrage hinzufügen\"\n\n#: forms.py:50\nmsgid \"Add two or more answers for this poll\"\nmsgstr \"Fügen Sie eine oder mehrere Antworten zu dieser Umfrage hinzu\"\n\n#: forms.py:58 models.py:183\nmsgid \"Subject\"\nmsgstr \"Betreff\"\n\n#: forms.py:59 models.py:195\nmsgid \"Poll type\"\nmsgstr \"Umfrage Typ\"\n\n#: forms.py:61 models.py:196\nmsgid \"Poll question\"\nmsgstr \"Frage\"\n\n#: forms.py:64\n#, fuzzy\n#| msgid \"Topics\"\nmsgid \"Topic slug\"\nmsgstr \"Themen\"\n\n#: forms.py:123\nmsgid \"Polls question is required when adding a poll\"\nmsgstr \"Zu jeder Umfrage muss eine Frage eingegeben werden\"\n\n#: forms.py:176 models.py:186 models.py:295 models.py:368 models.py:507\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\n#: forms.py:212\n#, python-format\nmsgid \"Avatar is too large, max size: %s bytes\"\nmsgstr \"Avatar ist zu groß (maximal %s Byte)\"\n\n#: forms.py:272\nmsgid \"be unsubscribe from this forum\"\nmsgstr \"sich von diesem Forum abmelden.\"\n\n#: forms.py:277\nmsgid \"You want to\"\nmsgstr \"Sie möchten\"\n\n#: forms.py:281\n#, fuzzy\n#| msgid \"New topic\"\nmsgid \"only new topics\"\nmsgstr \"Neuer Beitrag\"\n\n#: forms.py:282\n#, fuzzy\n#| msgid \"Latest topics on forum\"\nmsgid \"all topics of the forum\"\nmsgstr \"Neueste Beiträge in Forum\"\n\n#: forms.py:285\n#, fuzzy\n#| msgid \"Close topic\"\nmsgid \"Concerned topics\"\nmsgstr \"Thema schließen\"\n\n#: models.py:23 models.py:59\nmsgid \"Name\"\nmsgstr \"Name\"\n\n#: models.py:24 models.py:60\nmsgid \"Position\"\nmsgstr \"Position\"\n\n#: models.py:25 models.py:66 templates/pybb/category.html:4\n#: templates/pybb/forum_list.html:26\nmsgid \"Hidden\"\nmsgstr \"Versteckt\"\n\n#: models.py:26\nmsgid \"If checked, this category will be visible only for staff\"\nmsgstr \"\"\n\"Versteckte Kategorien sind nur für Administratoren und Redakteure sichtbar\"\n\n#: models.py:27 models.py:69 models.py:197\nmsgid \"Slug\"\nmsgstr \"\"\n\n#: models.py:31 models.py:56\nmsgid \"Category\"\nmsgstr \"Kategorie\"\n\n#: models.py:32\nmsgid \"Categories\"\nmsgstr \"Kategorien\"\n\n#: models.py:57\nmsgid \"Parent forum\"\nmsgstr \"\"\n\n#: models.py:61\nmsgid \"Description\"\nmsgstr \"Beschreibung\"\n\n#: models.py:62\nmsgid \"Moderators\"\nmsgstr \"Moderatoren\"\n\n#: models.py:63 models.py:185 models.py:297\nmsgid \"Updated\"\nmsgstr \"Aktualisiert\"\n\n#: models.py:64 models.py:192 profiles.py:41\nmsgid \"Post count\"\nmsgstr \"Anzahl Antworten\"\n\n#: models.py:65\nmsgid \"Topic count\"\nmsgstr \"Anzahl Beiträge\"\n\n#: models.py:68\nmsgid \"Headline\"\nmsgstr \"Titel\"\n\n#: models.py:73 models.py:136 models.py:182 templates/pybb/forum_list.html:8\nmsgid \"Forum\"\nmsgstr \"Forum\"\n\n#: models.py:74\nmsgid \"Forums\"\nmsgstr \"Foren\"\n\n#: models.py:129\nmsgid \"be notified only when a new topic is added\"\nmsgstr \"nur benachrichtigt werden, wenn ein neues Thema hinzugefügt wird\"\n\n#: models.py:130\nmsgid \"be auto-subscribed to topics\"\nmsgstr \"Themen automatisch abonnieren\"\n\n#: models.py:134\n#, fuzzy\n#| msgid \"Subscribers\"\nmsgid \"Subscriber\"\nmsgstr \"Abonnenten\"\n\n#: models.py:138\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription type\"\nmsgstr \"Themen-Abonnements\"\n\n#: models.py:148\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription to forum\"\nmsgstr \"Themen-Abonnements\"\n\n#: models.py:149\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscriptions to forums\"\nmsgstr \"Themen-Abonnements\"\n\n#: models.py:177\nmsgid \"None\"\nmsgstr \"Nichts\"\n\n#: models.py:178\nmsgid \"Single answer\"\nmsgstr \"Eine Antwort\"\n\n#: models.py:179\nmsgid \"Multiple answers\"\nmsgstr \"Mehrere Antworten\"\n\n#: models.py:184 models.py:296\nmsgid \"Created\"\nmsgstr \"Angelegt\"\n\n#: models.py:187\nmsgid \"Views count\"\nmsgstr \"angezeigt\"\n\n#: models.py:188 templates/pybb/topic_list.html:27\nmsgid \"Sticky\"\nmsgstr \"Sticky\"\n\n#: models.py:189 templates/pybb/topic_list.html:28\nmsgid \"Closed\"\nmsgstr \"Geschlossen\"\n\n#: models.py:191 templates/pybb/topic.html:88\nmsgid \"Subscribers\"\nmsgstr \"Abonnenten\"\n\n#: models.py:194 models.py:299\nmsgid \"On moderation\"\nmsgstr \"wird moderiert\"\n\n#: models.py:201 models.py:294 models.py:483 templates/pybb/topic_list.html:7\nmsgid \"Topic\"\nmsgstr \"Thema\"\n\n#: models.py:202 templates/pybb/forum_list.html:11\n#: templates/pybb/user_topics.html:7\nmsgid \"Topics\"\nmsgstr \"Themen\"\n\n#: models.py:281\nmsgid \"HTML version\"\nmsgstr \"HTML Version\"\n\n#: models.py:282\nmsgid \"Text version\"\nmsgstr \"Text Version\"\n\n#: models.py:298\nmsgid \"User IP\"\nmsgstr \"Benutzer IP\"\n\n#: models.py:303 models.py:386\nmsgid \"Post\"\nmsgstr \"Beitrag\"\n\n#: models.py:304 templates/pybb/forum_list.html:14\n#: templates/pybb/topic.html:42 templates/pybb/topic_list.html:10\n#: templates/pybb/user_posts.html:7\nmsgid \"Posts\"\nmsgstr \"Beiträge\"\n\n#: models.py:371\nmsgid \"Profile\"\nmsgstr \"Profil\"\n\n#: models.py:372\nmsgid \"Profiles\"\nmsgstr \"Profile\"\n\n#: models.py:383\nmsgid \"Attachment\"\nmsgstr \"Anhang\"\n\n#: models.py:384\nmsgid \"Attachments\"\nmsgstr \"Anhänge\"\n\n#: models.py:387\nmsgid \"Size\"\nmsgstr \"Größe\"\n\n#: models.py:388\nmsgid \"File\"\nmsgstr \"Datei\"\n\n#: models.py:438\nmsgid \"Topic read tracker\"\nmsgstr \"'Beitrag gelesen' Tracker\"\n\n#: models.py:439\nmsgid \"Topic read trackers\"\nmsgstr \"'Beitrag gelesen' Tracker\"\n\n#: models.py:476\nmsgid \"Forum read tracker\"\nmsgstr \"'Forum gelesen' Tracker\"\n\n#: models.py:477\nmsgid \"Forum read trackers\"\nmsgstr \"'Beitrag gelesen' Tracker\"\n\n#: models.py:484\nmsgid \"Text\"\nmsgstr \"Text\"\n\n#: models.py:487 models.py:506\nmsgid \"Poll answer\"\nmsgstr \"Umfrageantwort\"\n\n#: models.py:488\nmsgid \"Polls answers\"\nmsgstr \"Umfrageantworten\"\n\n#: models.py:511\nmsgid \"Poll answer user\"\nmsgstr \"Umfrageantwort Benutzer\"\n\n#: models.py:512\nmsgid \"Polls answers users\"\nmsgstr \"Umfrageantworten Benutzer\"\n\n#: models.py:535\n#, python-format\nmsgid \"\"\n\"After %(limit)s attemps, there is not any unique slug value for \\\"%(slug)s\\\"\"\nmsgstr \"\"\n\n#: profiles.py:34\nmsgid \"Signature\"\nmsgstr \"Signatur\"\n\n#: profiles.py:35\nmsgid \"Signature HTML Version\"\nmsgstr \"Signatur HTML Version\"\n\n#: profiles.py:37\nmsgid \"Time zone\"\nmsgstr \"Zeitzone\"\n\n#: profiles.py:38\nmsgid \"Language\"\nmsgstr \"Sprache\"\n\n#: profiles.py:40\nmsgid \"Show signatures\"\nmsgstr \"Signatur anzeigen\"\n\n#: profiles.py:42\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\n#: profiles.py:44\nmsgid \"Automatically subscribe\"\nmsgstr \"Automatisch abonnieren\"\n\n#: profiles.py:45\nmsgid \"Automatically subscribe to topics that you answer\"\nmsgstr \"Themen, auf die geantwortet wurde, automatisch abonnieren\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#, fuzzy\n#| msgid \"Description\"\nmsgid \"Manage subscription\"\nmsgstr \"Beschreibung\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#: templates/pybb/topic.html:72\nmsgid \"Subscribe\"\nmsgstr \"Abonnieren\"\n\n#: templates/pybb/_button_new_topic.html:1 templates/pybb/add_post.html:5\n#: templates/pybb/add_post.html.py:32\nmsgid \"New topic\"\nmsgstr \"Neuer Beitrag\"\n\n#: templates/pybb/_button_save.html:1\nmsgid \"Save\"\nmsgstr \"Speichern\"\n\n#: templates/pybb/_button_submit.html:1\n#: templates/pybb/forum_subscription.html:33\nmsgid \"Submit\"\nmsgstr \"Absenden\"\n\n#: templates/pybb/_markitup.html:25\n#: templates/pybb/markup/bbcode_widget.html:16\n#: templates/pybb/markup/markdown_widget.html:24\nmsgid \"Bold\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:26\n#: templates/pybb/markup/bbcode_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:25\nmsgid \"Italic\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:27\n#: templates/pybb/markup/bbcode_widget.html:18\nmsgid \"Underline\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:28\n#: templates/pybb/markup/bbcode_widget.html:19\nmsgid \"Stroke\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:30\n#: templates/pybb/markup/bbcode_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:32\n#, fuzzy\n#| msgid \"Signature\"\nmsgid \"Picture\"\nmsgstr \"Signatur\"\n\n#: templates/pybb/_markitup.html:31\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Link\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:33\n#: templates/pybb/markup/bbcode_widget.html:24\nmsgid \"Bulleted list\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:34\n#: templates/pybb/markup/bbcode_widget.html:25\nmsgid \"Numeric list\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:35\n#: templates/pybb/markup/bbcode_widget.html:26\nmsgid \"List item\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:37\n#: templates/pybb/markup/bbcode_widget.html:28\n#: templates/pybb/markup/markdown_widget.html:35\n#, fuzzy\n#| msgid \"quote\"\nmsgid \"Quotes\"\nmsgstr \"zitieren\"\n\n#: templates/pybb/_markitup.html:38\n#: templates/pybb/markup/bbcode_widget.html:29\nmsgid \"Code\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:40\n#: templates/pybb/markup/bbcode_widget.html:31\nmsgid \"Clean\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:41\n#: templates/pybb/markup/bbcode_widget.html:32\n#: templates/pybb/markup/markdown_widget.html:38\nmsgid \"Preview\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"Register\"\nmsgstr \"Registrieren\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"or\"\nmsgstr \"oder\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"login\"\nmsgstr \"Einloggen\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"to create to post a reply\"\nmsgstr \"Um einen Beitrag oder eine Antwort zu schreiben\"\n\n#: templates/pybb/add_post.html:5 templates/pybb/add_post.html.py:32\nmsgid \"New reply\"\nmsgstr \"Neue Antwort\"\n\n#: templates/pybb/attachments_formset.html:6\nmsgid \"Add attachments\"\nmsgstr \"Anhang hinzufügen\"\n\n#: templates/pybb/attachments_formset.html:14\nmsgid \"\"\n\"If you need to upload larger files, please use an external storage website.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:14\n#, python-format\nmsgid \"(max size: %(max_size)s)\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:17\n#: templates/pybb/edit_profile.html:25\nmsgid \"delete\"\nmsgstr \"löschen\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Reference to your file\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Ref\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#: templates/pybb/topic.html:88 templates/pybb/topic_list.html:32\nmsgid \":\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"link\"\nmsgstr \"Link\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"Insert a link to your file inside your post.\"\nmsgstr \"Fügen Sie einen Link zu Ihrer Datei in Ihrem Beitrag.\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"image\"\nmsgstr \"Image\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"Insert your image inside your post.\"\nmsgstr \"Fügen Sie Ihr Bild in Ihrem Beitrag.\"\n\n#: templates/pybb/breadcrumb.html:4\nmsgid \"Home\"\nmsgstr \"Home\"\n\n#: templates/pybb/delete_post.html:5\nmsgid \"Are you sure you want to delete this message?\"\nmsgstr \"Möchten Sie diese Nachricht wirklich löschen\"\n\n#: templates/pybb/delete_post.html:12\nmsgid \"No, take me back\"\nmsgstr \"Nein, Abbruch\"\n\n#: templates/pybb/delete_post.html:13\nmsgid \"Yes, I am sure\"\nmsgstr \"Ja, ich bin sicher\"\n\n#: templates/pybb/edit_post.html:4 templates/pybb/edit_post.html.py:17\nmsgid \"Editing the post\"\nmsgstr \"Beitrag bearbeiten\"\n\n#: templates/pybb/edit_privileges.html:5 templates/pybb/edit_privileges.html:8\nmsgid \"Grant moderator privileges\"\nmsgstr \"Moderatorrechte gewähren\"\n\n#: templates/pybb/edit_profile.html:5 templates/pybb/edit_profile.html.py:8\n#: templates/pybb/edit_profile.html:13\nmsgid \"Profile editing\"\nmsgstr \"Profil bearbeiten\"\n\n#: templates/pybb/edit_profile.html:18\nmsgid \"Subscriptions on topics\"\nmsgstr \"Themen-Abonnements\"\n\n#: templates/pybb/forum_list.html:17\nmsgid \"Last posts\"\nmsgstr \"Letzte Beiträge\"\n\n#: templates/pybb/forum_list.html:43\nmsgid \"No forums created\"\nmsgstr \"Keine Foren angelegt\"\n\n#: templates/pybb/forum_list.html:44\nmsgid \"Add forum now\"\nmsgstr \"Forum anlegen\"\n\n#: templates/pybb/forum_subscription.html:4\n#, python-format\nmsgctxt \"page title\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Abonnement\"\n\n#: templates/pybb/forum_subscription.html:14\n#, python-format\nmsgctxt \"content heading\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Abonnement\"\n\n#: templates/pybb/forum_subscription.html:32\nmsgid \"Cancel\"\nmsgstr \"Stornieren\"\n\n#: templates/pybb/index.html:17\nmsgid \"Forum categories are not created\"\nmsgstr \"Keine Kategorien angelegt\"\n\n#: templates/pybb/index.html:18\nmsgid \"Add a category now\"\nmsgstr \"Jetzt Kategorie anlegen\"\n\n#: templates/pybb/index.html:22 templates/pybb/latest_topics.html:5\n#: templates/pybb/latest_topics.html:8 templates/pybb/latest_topics.html:15\nmsgid \"Last updates in topics\"\nmsgstr \"Letzte Updates in den Themen\"\n\n#: templates/pybb/index.html:23\nmsgid \"Mark all forums as read\"\nmsgstr \"Alles als gelesen markieren\"\n\n#: templates/pybb/latest_topics.html:31\n#, fuzzy\n#| msgid \"Mark all forums as read\"\nmsgid \"Mark all topics as read\"\nmsgstr \"Alles als gelesen markieren\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:4\n#, python-format\nmsgid \"\"\n\"User %(username)s post a new topic in forum to which you are subscribed \"\n\"(%(forum_name)s).\"\nmsgstr \"\"\n\"Benutzer %(username)s hat in einem Thema geantwortet, das Sie abonniert \"\n\"haben (%(forum_name)s).\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#, fuzzy\n#| msgid \"Link to topic:\"\nmsgid \"Link to topic\"\nmsgstr \"Link zum Thema\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#, fuzzy\n#| msgid \"Link to forum:\"\nmsgid \"Link to forum\"\nmsgstr \"Link zum Forum:\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#, fuzzy\n#| msgid \"\"\n#| \"If you don't want to recive notifications on new messages in this topic \"\n#| \"visit following link:\"\nmsgid \"\"\n\"If you don't want to receive notifications on new topics in this forum visit \"\n\"following link\"\nmsgstr \"\"\n\"Wenn Sie keine E-Mails zu diesem Thema mehr erhalten möchten,klicken Sie den \"\n\"folgenden Link\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_subject.html:2\n#, fuzzy\n#| msgid \"New answer in topic that you subscribed.\"\nmsgid \"New topic in forum that you subscribed.\"\nmsgstr \"Neue Antwort im Forum\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:7\n#: templates/pybb/mail_templates/subscription_email_body.html:3\n#, python-format\nmsgid \"User %(username)s replied in topic to which you are subscribed.\"\nmsgstr \"\"\n\"Benutzer %(username)s hat in einem Thema geantwortet, das Sie abonniert haben\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:10\n#, python-format\nmsgid \"\"\n\"Follow %(link_post_start)sthis link%(link_end)s to see the new post on the \"\n\"topic %(link_topic_start)s%(topic_name)s%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:14\n#, fuzzy, python-format\n#| msgid \"\"\n#| \"If you don't want to recive notifications on new messages in this topic \"\n#| \"visit following link:\"\nmsgid \"\"\n\"If you don't want to receive notifications on new posts in this topic visit \"\n\"%(link_start)sthis link%(link_end)s.\"\nmsgstr \"\"\n\"Wenn Sie keine E-Mails zu diesem Thema mehr erhalten möchten,klicken Sie den \"\n\"folgenden Link\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#, fuzzy\n#| msgid \"Link to post:\"\nmsgid \"Link to post\"\nmsgstr \"Link zum Beitrag\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:8\n#, fuzzy, python-format\n#| msgid \"\"\n#| \"If you don't want to recive notifications on new messages in this topic \"\n#| \"visit following link:\"\nmsgid \"\"\n\"If you don't want to receive notifications on new messages in this topic \"\n\"visit following link: %(delete_url_full)s\"\nmsgstr \"\"\n\"Wenn Sie keine E-Mails zu diesem Thema mehr erhalten möchten,klicken Sie den \"\n\"folgenden Link\"\n\n#: templates/pybb/mail_templates/subscription_email_subject.html:2\nmsgid \"New answer in topic that you subscribed.\"\nmsgstr \"Neue Antwort im Forum\"\n\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Your text to link here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\nmsgid \"First Level Heading\"\nmsgstr \"Titel 1\"\n\n#: templates/pybb/markup/markdown_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:18\n#: templates/pybb/markup/markdown_widget.html:19\n#: templates/pybb/markup/markdown_widget.html:20\n#: templates/pybb/markup/markdown_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Your title here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:18\nmsgid \"Second Level Heading\"\nmsgstr \"Titel 2\"\n\n#: templates/pybb/markup/markdown_widget.html:19\nmsgid \"Heading 3\"\nmsgstr \"Titel 3\"\n\n#: templates/pybb/markup/markdown_widget.html:20\nmsgid \"Heading 4\"\nmsgstr \"Titel 4\"\n\n#: templates/pybb/markup/markdown_widget.html:21\nmsgid \"Heading 5\"\nmsgstr \"Titel 5\"\n\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Heading 6\"\nmsgstr \"Titel 6\"\n\n#: templates/pybb/markup/markdown_widget.html:27\nmsgid \"Bulleted List\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:28\nmsgid \"Numeric List\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:36\nmsgid \"Code Block / Code\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:7\nmsgid \"previous page\"\nmsgstr \"vorherige Seite\"\n\n#: templates/pybb/pagination.html:21\nmsgid \"next page\"\nmsgstr \"nächste Seite\"\n\n#: templates/pybb/poll.html:4\nmsgid \"Poll\"\nmsgstr \"Umfrage\"\n\n#: templates/pybb/poll.html:36\nmsgid \"Cancel my poll vote\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:7\nmsgid \"Poll answers\"\nmsgstr \"Antworten zu Umfrage\"\n\n#: templates/pybb/poll_edit_form.html:20\nmsgid \"remove answer\"\nmsgstr \"Antwort löschen\"\n\n#: templates/pybb/poll_edit_form.html:21\nmsgid \"add answer\"\nmsgstr \"Antwort hinzufügen\"\n\n#: templates/pybb/post_template.html:28\n#, python-format\nmsgid \"Rank: %(rank)s\"\nmsgstr \"Rang: %(rank)s\"\n\n#: templates/pybb/post_template.html:41 templates/pybb/user.html:51\nmsgid \"Edit\"\nmsgstr \"bearbeiten\"\n\n#: templates/pybb/post_template.html:45\nmsgid \"Delete post?\"\nmsgstr \"Beitrag löschen?\"\n\n#: templates/pybb/post_template.html:46\nmsgid \"Delete\"\nmsgstr \"löschen\"\n\n#: templates/pybb/post_template.html:49\nmsgid \"Approve post\"\nmsgstr \"Beitrag genehmigen\"\n\n#: templates/pybb/post_template.html:53 templates/pybb/topic.html:62\nmsgid \"Admin\"\nmsgstr \"Administrator\"\n\n#: templates/pybb/post_template.html:69\nmsgid \"Edited\"\nmsgstr \"Bearbeitet\"\n\n#: templates/pybb/post_template.html:83\nmsgid \"quote\"\nmsgstr \"zitieren\"\n\n#: templates/pybb/post_template.html:84\nmsgid \"quote selected\"\nmsgstr \"\"\n\n#: templates/pybb/topic.html:51\nmsgid \"Unstick topic\"\nmsgstr \"'Sticky' aufheben\"\n\n#: templates/pybb/topic.html:53\nmsgid \"Stick topic\"\nmsgstr \"'Sticky' setzen\"\n\n#: templates/pybb/topic.html:57\nmsgid \"Open topic\"\nmsgstr \"Thema öffnen\"\n\n#: templates/pybb/topic.html:59\nmsgid \"Close topic\"\nmsgstr \"Thema schließen\"\n\n#: templates/pybb/topic.html:70\nmsgid \"Unsubscribe\"\nmsgstr \"Abbestellen\"\n\n#: templates/pybb/topic_list.html:13\nmsgid \"Views\"\nmsgstr \"Ansichten\"\n\n#: templates/pybb/topic_list.html:16\nmsgid \"Last post\"\nmsgstr \"Letzter Beitrag\"\n\n#: templates/pybb/topic_list.html:26\nmsgid \"Go to first unread post\"\nmsgstr \"\"\n\n#: templates/pybb/topic_list.html:32\nmsgid \"pages\"\nmsgstr \"Seiten\"\n\n#: templates/pybb/user.html:16\nmsgid \"Statistics\"\nmsgstr \"Statistik\"\n\n#: templates/pybb/user.html:19\n#, python-format\nmsgid \"Number of topics: %(count)s\"\nmsgstr \"Anzahl Themen: %(count)s\"\n\n#: templates/pybb/user.html:24\n#, python-format\nmsgid \"Number of posts: %(count)s\"\nmsgstr \"Anzahl Beiträge: %(count)s\"\n\n#: templates/pybb/user.html:29\n#, python-format\nmsgid \"Date of registration: %(date_joined)s \"\nmsgstr \"Registrierungsdatum: %(date_joined)s \"\n\n#: templates/pybb/user.html:36\nmsgid \"Moderator\"\nmsgstr \"Moderator\"\n\n#: templates/pybb/user.html:41\nmsgid \"Block\"\nmsgstr \"Block\"\n\n#: templates/pybb/user.html:42\nmsgid \"Block and delete all messages\"\nmsgstr \"\"\n\n#: templates/pybb/user.html:46\n#, fuzzy\n#| msgid \"Block\"\nmsgid \"Unblock\"\nmsgstr \"Block\"\n\n#: templates/pybb/user_posts.html:12 templates/pybb/user_posts.html.py:17\n#, fuzzy\n#| msgid \"All topics created by\"\nmsgid \"All posts created by\"\nmsgstr \"Alle Beiträge von\"\n\n#: templates/pybb/user_topics.html:12 templates/pybb/user_topics.html.py:17\nmsgid \"All topics created by\"\nmsgstr \"Alle Beiträge von\"\n\n#: templates/pybb/users.html:8 templates/pybb/users.html.py:24\nmsgid \"Users\"\nmsgstr \"Benutzer\"\n\n#: templates/pybb/users.html:12\nmsgid \"Search\"\nmsgstr \"Suche\"\n\n#: templatetags/pybb_tags.py:61\n#, fuzzy, python-format\n#| msgid \"seconds ago\"\nmsgid \"%d second ago\"\nmsgid_plural \"%d seconds ago\"\nmsgstr[0] \"vor Sekunden\"\nmsgstr[1] \"vor Sekunden\"\n\n#: templatetags/pybb_tags.py:65\n#, fuzzy, python-format\n#| msgid \"minutes ago\"\nmsgid \"%d minute ago\"\nmsgid_plural \"%d minutes ago\"\nmsgstr[0] \"vor Minuten\"\nmsgstr[1] \"vor Minuten\"\n\n#: templatetags/pybb_tags.py:75\n#, python-format\nmsgid \"today, %s\"\nmsgstr \"Heute, %s\"\n\n#: templatetags/pybb_tags.py:77\n#, python-format\nmsgid \"yesterday, %s\"\nmsgstr \"Gestern, %s\"\n\n#: util.py:140\nmsgid \"Can't get profile for anonymous user\"\nmsgstr \"\"\n\n#: views.py:156\n#, fuzzy\n#| msgid \"Forum categories are not created\"\nmsgid \"Forum does not exist\"\nmsgstr \"Keine Kategorien angelegt\"\n\n#: views.py:388\nmsgid \"This topic does not exists\"\nmsgstr \"\"\n\n#: views.py:826\nmsgid \"\"\n\"Subscription removed. You will not receive emails from this topic unless you \"\n\"subscribe or post again.\"\nmsgstr \"\"\n\n#: views.py:837\nmsgid \"\"\n\"Subscription added. You will receive email notifications for replies to this \"\n\"topic.\"\nmsgstr \"\"\n\n#: views.py:855\nmsgid \"All forums marked as read\"\nmsgstr \"Alle Foren wurden als gelesen markiert\"\n\n#: views.py:888\nmsgid \"User successfuly blocked\"\nmsgstr \"Benutzer wurde erfolgreich gesperrt\"\n\n#: views.py:901\n#, fuzzy\n#| msgid \"User successfuly blocked\"\nmsgid \"User successfuly unblocked\"\nmsgstr \"Benutzer wurde erfolgreich gesperrt\"\n\n#: views.py:939\nmsgid \"Privileges updated\"\nmsgstr \"\"\n\n#~ msgid \"Subscribers:\"\n#~ msgstr \"Abonnenten:\"\n\n#~ msgid \"Change the password\"\n#~ msgstr \"Passwort ändern\"\n\n#~ msgid \"Rank\"\n#~ msgstr \"Rang\"\n\n#~ msgid \"seconds ago,seconds ago,seconds ago\"\n#~ msgstr \"vor Sekunden, vor Sekunden, vor Sekunden\"\n\n#~ msgid \"minutes ago,minutes ago,minutes ago\"\n#~ msgstr \"vor Minuten, vor Minuten, vor Minuten\"\n"
  },
  {
    "path": "pybb/locale/es/LC_MESSAGES/django.po",
    "content": "# Spanish translation for the pybbm form.\n# Copyright (C) 2013 Jose Antonio Martin\n# This file is distributed under the same license as the pybbm package.\n# Jose Antonio Martin <jantonio.martin@gmail.com>, 2013.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pybbm\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-01-11 14:06+0100\\n\"\n\"PO-Revision-Date: 2017-01-11 14:13+0100\\n\"\n\"Last-Translator: DylannCordel <d.cordel@webu.coop>\\n\"\n\"Language-Team: \\n\"\n\"Language: es\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Generator: Poedit 1.6.10\\n\"\n\"X-Poedit-SourceCharset: UTF-8\\n\"\n\"X-Poedit-Basepath: ../../..\\n\"\n\n#: admin.py:45 admin.py:84 admin.py:112 admin.py:134\nmsgid \"Additional options\"\nmsgstr \"Opciones adicionales\"\n\n#: admin.py:117 models.py:280\nmsgid \"Message\"\nmsgstr \"Mensaje\"\n\n#: admin.py:148\nmsgid \"View post\"\nmsgstr \"Ver mensaje\"\n\n#: admin.py:153\nmsgid \"Edit post\"\nmsgstr \"Editar mensaje\"\n\n#: apps.py:9\nmsgid \"Pybbm forum solution\"\nmsgstr \"\"\n\n#: feeds.py:27 feeds.py:28 templates/pybb/base.html:10\nmsgid \"Latest posts on forum\"\nmsgstr \"Últimos mensajes en el foro\"\n\n#: feeds.py:41 feeds.py:42 templates/pybb/base.html:11\nmsgid \"Latest topics on forum\"\nmsgstr \"Últimos temas en el foro\"\n\n#: forms.py:30\nmsgid \"Attachment is too big\"\nmsgstr \"El adjunto es demasiado grande\"\n\n#: forms.py:48\n#, python-format\nmsgid \"You cant add more than %s answers for poll\"\nmsgstr \"No puedes añadir más de %s respuestas por encuesta\"\n\n#: forms.py:50\nmsgid \"Add two or more answers for this poll\"\nmsgstr \"Añade dos o más respuestas a la encuesta\"\n\n#: forms.py:58 models.py:183\nmsgid \"Subject\"\nmsgstr \"Asunto\"\n\n#: forms.py:59 models.py:195\nmsgid \"Poll type\"\nmsgstr \"Tipo de encuesta\"\n\n#: forms.py:61 models.py:196\nmsgid \"Poll question\"\nmsgstr \"Pregunta de la encuesta\"\n\n#: forms.py:64\n#, fuzzy\n#| msgid \"Topics\"\nmsgid \"Topic slug\"\nmsgstr \"Temas\"\n\n#: forms.py:123\nmsgid \"Polls question is required when adding a poll\"\nmsgstr \"Se requiere una pregunta para añadir una encuesta\"\n\n#: forms.py:176 models.py:186 models.py:295 models.py:368 models.py:507\nmsgid \"User\"\nmsgstr \"Usuario\"\n\n#: forms.py:212\n#, python-format\nmsgid \"Avatar is too large, max size: %s bytes\"\nmsgstr \"El avatar es demasiado grande, máximo tamaño: %s bytes\"\n\n#: forms.py:272\nmsgid \"be unsubscribe from this forum\"\nmsgstr \"darse de baja de este foro\"\n\n#: forms.py:277\nmsgid \"You want to\"\nmsgstr \"Desea ser \"\n\n#: forms.py:281\n#, fuzzy\n#| msgid \"New topic\"\nmsgid \"only new topics\"\nmsgstr \"Nuevo tema\"\n\n#: forms.py:282\n#, fuzzy\n#| msgid \"Latest topics on forum\"\nmsgid \"all topics of the forum\"\nmsgstr \"Últimos temas en el foro\"\n\n#: forms.py:285\n#, fuzzy\n#| msgid \"Close topic\"\nmsgid \"Concerned topics\"\nmsgstr \"Cerrar tema\"\n\n#: models.py:23 models.py:59\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\n#: models.py:24 models.py:60\nmsgid \"Position\"\nmsgstr \"Posición\"\n\n#: models.py:25 models.py:66 templates/pybb/category.html:4\n#: templates/pybb/forum_list.html:26\nmsgid \"Hidden\"\nmsgstr \"Oculto\"\n\n#: models.py:26\nmsgid \"If checked, this category will be visible only for staff\"\nmsgstr \"Marcado, esta categoría será visible solo para administradores\"\n\n#: models.py:27 models.py:69 models.py:197\nmsgid \"Slug\"\nmsgstr \"\"\n\n#: models.py:31 models.py:56\nmsgid \"Category\"\nmsgstr \"Categoría\"\n\n#: models.py:32\nmsgid \"Categories\"\nmsgstr \"Categorías\"\n\n#: models.py:57\nmsgid \"Parent forum\"\nmsgstr \"\"\n\n#: models.py:61\nmsgid \"Description\"\nmsgstr \"Descripción\"\n\n#: models.py:62\nmsgid \"Moderators\"\nmsgstr \"Moderadores\"\n\n#: models.py:63 models.py:185 models.py:297\nmsgid \"Updated\"\nmsgstr \"Actualizado\"\n\n#: models.py:64 models.py:192 profiles.py:41\nmsgid \"Post count\"\nmsgstr \"Número de mensajes\"\n\n#: models.py:65\nmsgid \"Topic count\"\nmsgstr \"Número de temas\"\n\n#: models.py:68\nmsgid \"Headline\"\nmsgstr \"Titular\"\n\n#: models.py:73 models.py:136 models.py:182 templates/pybb/forum_list.html:8\nmsgid \"Forum\"\nmsgstr \"Foro\"\n\n#: models.py:74\nmsgid \"Forums\"\nmsgstr \"Foros\"\n\n#: models.py:129\nmsgid \"be notified only when a new topic is added\"\nmsgstr \"notificado solo cuando se agrega un nuevo tema\"\n\n#: models.py:130\nmsgid \"be auto-subscribed to topics\"\nmsgstr \"suscribirse automáticamente a los temas\"\n\n#: models.py:134\n#, fuzzy\n#| msgid \"Subscribers\"\nmsgid \"Subscriber\"\nmsgstr \"Suscriptores\"\n\n#: models.py:138\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription type\"\nmsgstr \"Subscripciones a temas\"\n\n#: models.py:148\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription to forum\"\nmsgstr \"Subscripciones a temas\"\n\n#: models.py:149\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscriptions to forums\"\nmsgstr \"Subscripciones a temas\"\n\n#: models.py:177\nmsgid \"None\"\nmsgstr \"Ninguna\"\n\n#: models.py:178\nmsgid \"Single answer\"\nmsgstr \"Respuesta única\"\n\n#: models.py:179\nmsgid \"Multiple answers\"\nmsgstr \"Respuestas múltiples\"\n\n#: models.py:184 models.py:296\nmsgid \"Created\"\nmsgstr \"Creado\"\n\n#: models.py:187\nmsgid \"Views count\"\nmsgstr \"Lecturas\"\n\n#: models.py:188 templates/pybb/topic_list.html:27\nmsgid \"Sticky\"\nmsgstr \"Pegajoso\"\n\n#: models.py:189 templates/pybb/topic_list.html:28\nmsgid \"Closed\"\nmsgstr \"Cerrado\"\n\n#: models.py:191 templates/pybb/topic.html:88\nmsgid \"Subscribers\"\nmsgstr \"Suscriptores\"\n\n#: models.py:194 models.py:299\nmsgid \"On moderation\"\nmsgstr \"En moderación\"\n\n#: models.py:201 models.py:294 models.py:483 templates/pybb/topic_list.html:7\nmsgid \"Topic\"\nmsgstr \"Tema\"\n\n#: models.py:202 templates/pybb/forum_list.html:11\n#: templates/pybb/user_topics.html:7\nmsgid \"Topics\"\nmsgstr \"Temas\"\n\n#: models.py:281\nmsgid \"HTML version\"\nmsgstr \"Versión HTML\"\n\n#: models.py:282\nmsgid \"Text version\"\nmsgstr \"Versión de texto\"\n\n#: models.py:298\nmsgid \"User IP\"\nmsgstr \"IP de usuario\"\n\n#: models.py:303 models.py:386\nmsgid \"Post\"\nmsgstr \"Mensaje\"\n\n#: models.py:304 templates/pybb/forum_list.html:14\n#: templates/pybb/topic.html:42 templates/pybb/topic_list.html:10\n#: templates/pybb/user_posts.html:7\nmsgid \"Posts\"\nmsgstr \"Mensajes\"\n\n#: models.py:371\nmsgid \"Profile\"\nmsgstr \"Perfil\"\n\n#: models.py:372\nmsgid \"Profiles\"\nmsgstr \"Perfiles\"\n\n#: models.py:383\nmsgid \"Attachment\"\nmsgstr \"Adjunto\"\n\n#: models.py:384\nmsgid \"Attachments\"\nmsgstr \"Adjuntos\"\n\n#: models.py:387\nmsgid \"Size\"\nmsgstr \"Tamaño\"\n\n#: models.py:388\nmsgid \"File\"\nmsgstr \"Archivo\"\n\n#: models.py:438\nmsgid \"Topic read tracker\"\nmsgstr \"Seguidor de temas leídos\"\n\n#: models.py:439\nmsgid \"Topic read trackers\"\nmsgstr \"Seguidores de temas leídos\"\n\n#: models.py:476\nmsgid \"Forum read tracker\"\nmsgstr \"Seguidor de foros leídos\"\n\n#: models.py:477\nmsgid \"Forum read trackers\"\nmsgstr \"Seguidores de foros leídos\"\n\n#: models.py:484\nmsgid \"Text\"\nmsgstr \"Texto\"\n\n#: models.py:487 models.py:506\nmsgid \"Poll answer\"\nmsgstr \"Respuesta de encuesta\"\n\n#: models.py:488\nmsgid \"Polls answers\"\nmsgstr \"Respuestas de encuestas\"\n\n#: models.py:511\nmsgid \"Poll answer user\"\nmsgstr \"Usuario de respuesta de encuesta\"\n\n#: models.py:512\nmsgid \"Polls answers users\"\nmsgstr \"Usuarios de respuestas de encuestas\"\n\n#: models.py:535\n#, python-format\nmsgid \"\"\n\"After %(limit)s attemps, there is not any unique slug value for \\\"%(slug)s\\\"\"\nmsgstr \"\"\n\n#: profiles.py:34\nmsgid \"Signature\"\nmsgstr \"Firma\"\n\n#: profiles.py:35\nmsgid \"Signature HTML Version\"\nmsgstr \"Versión HTML de la firma\"\n\n#: profiles.py:37\nmsgid \"Time zone\"\nmsgstr \"Huso horario\"\n\n#: profiles.py:38\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\n#: profiles.py:40\nmsgid \"Show signatures\"\nmsgstr \"Mostrar firmas\"\n\n#: profiles.py:42\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\n#: profiles.py:44\nmsgid \"Automatically subscribe\"\nmsgstr \"Suscribir automáticamente\"\n\n#: profiles.py:45\nmsgid \"Automatically subscribe to topics that you answer\"\nmsgstr \"Te suscribe automáticamente a los temas a los que respondas\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#, fuzzy\n#| msgid \"Description\"\nmsgid \"Manage subscription\"\nmsgstr \"Descripción\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#: templates/pybb/topic.html:72\nmsgid \"Subscribe\"\nmsgstr \"Subscribir\"\n\n#: templates/pybb/_button_new_topic.html:1 templates/pybb/add_post.html:5\n#: templates/pybb/add_post.html.py:32\nmsgid \"New topic\"\nmsgstr \"Nuevo tema\"\n\n#: templates/pybb/_button_save.html:1\nmsgid \"Save\"\nmsgstr \"Guardar\"\n\n#: templates/pybb/_button_submit.html:1\n#: templates/pybb/forum_subscription.html:33\nmsgid \"Submit\"\nmsgstr \"Enviar\"\n\n#: templates/pybb/_markitup.html:25\n#: templates/pybb/markup/bbcode_widget.html:16\n#: templates/pybb/markup/markdown_widget.html:24\nmsgid \"Bold\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:26\n#: templates/pybb/markup/bbcode_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:25\nmsgid \"Italic\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:27\n#: templates/pybb/markup/bbcode_widget.html:18\nmsgid \"Underline\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:28\n#: templates/pybb/markup/bbcode_widget.html:19\nmsgid \"Stroke\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:30\n#: templates/pybb/markup/bbcode_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:32\n#, fuzzy\n#| msgid \"Signature\"\nmsgid \"Picture\"\nmsgstr \"Firma\"\n\n#: templates/pybb/_markitup.html:31\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Link\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:33\n#: templates/pybb/markup/bbcode_widget.html:24\nmsgid \"Bulleted list\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:34\n#: templates/pybb/markup/bbcode_widget.html:25\nmsgid \"Numeric list\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:35\n#: templates/pybb/markup/bbcode_widget.html:26\nmsgid \"List item\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:37\n#: templates/pybb/markup/bbcode_widget.html:28\n#: templates/pybb/markup/markdown_widget.html:35\n#, fuzzy\n#| msgid \"quote\"\nmsgid \"Quotes\"\nmsgstr \"citar\"\n\n#: templates/pybb/_markitup.html:38\n#: templates/pybb/markup/bbcode_widget.html:29\nmsgid \"Code\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:40\n#: templates/pybb/markup/bbcode_widget.html:31\nmsgid \"Clean\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:41\n#: templates/pybb/markup/bbcode_widget.html:32\n#: templates/pybb/markup/markdown_widget.html:38\nmsgid \"Preview\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"Register\"\nmsgstr \"Registrar\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"or\"\nmsgstr \"o\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"login\"\nmsgstr \"entrar\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"to create to post a reply\"\nmsgstr \"para crear o responder a un tema\"\n\n#: templates/pybb/add_post.html:5 templates/pybb/add_post.html.py:32\nmsgid \"New reply\"\nmsgstr \"Nueva respuesta\"\n\n#: templates/pybb/attachments_formset.html:6\nmsgid \"Add attachments\"\nmsgstr \"Añadir adjuntos\"\n\n#: templates/pybb/attachments_formset.html:14\nmsgid \"\"\n\"If you need to upload larger files, please use an external storage website.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:14\n#, python-format\nmsgid \"(max size: %(max_size)s)\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:17\n#: templates/pybb/edit_profile.html:25\nmsgid \"delete\"\nmsgstr \"borrar\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Reference to your file\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Ref\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#: templates/pybb/topic.html:88 templates/pybb/topic_list.html:32\nmsgid \":\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"link\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"Insert a link to your file inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"image\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"Insert your image inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/breadcrumb.html:4\nmsgid \"Home\"\nmsgstr \"Inicio\"\n\n#: templates/pybb/delete_post.html:5\nmsgid \"Are you sure you want to delete this message?\"\nmsgstr \"¿Estás seguro de que deseas borrar este mensaje?\"\n\n#: templates/pybb/delete_post.html:12\nmsgid \"No, take me back\"\nmsgstr \"No, cancelar\"\n\n#: templates/pybb/delete_post.html:13\nmsgid \"Yes, I am sure\"\nmsgstr \"Sí, estoy seguro\"\n\n#: templates/pybb/edit_post.html:4 templates/pybb/edit_post.html.py:17\nmsgid \"Editing the post\"\nmsgstr \"Editando el mensaje\"\n\n#: templates/pybb/edit_privileges.html:5 templates/pybb/edit_privileges.html:8\nmsgid \"Grant moderator privileges\"\nmsgstr \"\"\n\n#: templates/pybb/edit_profile.html:5 templates/pybb/edit_profile.html.py:8\n#: templates/pybb/edit_profile.html:13\nmsgid \"Profile editing\"\nmsgstr \"Editando perfil\"\n\n#: templates/pybb/edit_profile.html:18\nmsgid \"Subscriptions on topics\"\nmsgstr \"Subscripciones a temas\"\n\n#: templates/pybb/forum_list.html:17\nmsgid \"Last posts\"\nmsgstr \"Últimos mensajes\"\n\n#: templates/pybb/forum_list.html:43\nmsgid \"No forums created\"\nmsgstr \"No hay foros creados\"\n\n#: templates/pybb/forum_list.html:44\nmsgid \"Add forum now\"\nmsgstr \"Añadir foro ahora\"\n\n#: templates/pybb/forum_subscription.html:4\n#, python-format\nmsgctxt \"page title\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Subscripciones\"\n\n#: templates/pybb/forum_subscription.html:14\n#, python-format\nmsgctxt \"content heading\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Subscripciones\"\n\n#: templates/pybb/forum_subscription.html:32\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:17\nmsgid \"Forum categories are not created\"\nmsgstr \"Las categorías del foro no están creadas\"\n\n#: templates/pybb/index.html:18\nmsgid \"Add a category now\"\nmsgstr \"Añadir categoría ahora\"\n\n#: templates/pybb/index.html:22 templates/pybb/latest_topics.html:5\n#: templates/pybb/latest_topics.html:8 templates/pybb/latest_topics.html:15\nmsgid \"Last updates in topics\"\nmsgstr \"Últimas acutalizaciones de temas\"\n\n#: templates/pybb/index.html:23\nmsgid \"Mark all forums as read\"\nmsgstr \"Marcar todos los foros como leídos\"\n\n#: templates/pybb/latest_topics.html:31\nmsgid \"Mark all topics as read\"\nmsgstr \"Marcar todos los temas como leídos\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:4\n#, python-format\nmsgid \"\"\n\"User %(username)s post a new topic in forum to which you are subscribed \"\n\"(%(forum_name)s).\"\nmsgstr \"\"\n\"Usuario %(username)s respondió a un tema al que estás suscrito \"\n\"(%(forum_name)s).\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/subscription_email_body.html:5\nmsgid \"Link to topic\"\nmsgstr \"Enlace al tema\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\nmsgid \"Link to forum\"\nmsgstr \"Enlace al foro\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\nmsgid \"\"\n\"If you don't want to receive notifications on new topics in this forum visit \"\n\"following link\"\nmsgstr \"\"\n\"Si no deseas recibir notificaciones de nuevos mensajes sobre este tema pulsa \"\n\"el siguiente enlace\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_subject.html:2\n#, fuzzy\n#| msgid \"New answer in topic that you subscribed.\"\nmsgid \"New topic in forum that you subscribed.\"\nmsgstr \"Nueva respuesta a un tema de tu interés.\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:7\n#: templates/pybb/mail_templates/subscription_email_body.html:3\n#, python-format\nmsgid \"User %(username)s replied in topic to which you are subscribed.\"\nmsgstr \"Usuario %(username)s respondió a un tema al que estás suscrito.\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:10\n#, python-format\nmsgid \"\"\n\"Follow %(link_post_start)sthis link%(link_end)s to see the new post on the \"\n\"topic %(link_topic_start)s%(topic_name)s%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:14\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new posts in this topic visit \"\n\"%(link_start)sthis link%(link_end)s.\"\nmsgstr \"\"\n\"Si no deseas recibir notificaciones de nuevos mensajes sobre este tema pulsa \"\n\"%(link_start)sel siguiente enlace%(link_end)s.\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:4\nmsgid \"Link to post\"\nmsgstr \"Enlace al mensaje\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:8\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new messages in this topic \"\n\"visit following link: %(delete_url_full)s\"\nmsgstr \"\"\n\"Si no deseas recibir notificaciones de nuevos mensajes sobre este tema pulsa \"\n\"el siguiente enlace: %(delete_url_full)s\"\n\n#: templates/pybb/mail_templates/subscription_email_subject.html:2\nmsgid \"New answer in topic that you subscribed.\"\nmsgstr \"Nueva respuesta a un tema de tu interés.\"\n\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Your text to link here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\nmsgid \"First Level Heading\"\nmsgstr \"Titular 1\"\n\n#: templates/pybb/markup/markdown_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:18\n#: templates/pybb/markup/markdown_widget.html:19\n#: templates/pybb/markup/markdown_widget.html:20\n#: templates/pybb/markup/markdown_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Your title here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:18\nmsgid \"Second Level Heading\"\nmsgstr \"Titular 2\"\n\n#: templates/pybb/markup/markdown_widget.html:19\nmsgid \"Heading 3\"\nmsgstr \"Titular 3\"\n\n#: templates/pybb/markup/markdown_widget.html:20\nmsgid \"Heading 4\"\nmsgstr \"Titular 4\"\n\n#: templates/pybb/markup/markdown_widget.html:21\nmsgid \"Heading 5\"\nmsgstr \"Titular 5\"\n\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Heading 6\"\nmsgstr \"Titular 6\"\n\n#: templates/pybb/markup/markdown_widget.html:27\nmsgid \"Bulleted List\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:28\nmsgid \"Numeric List\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:36\nmsgid \"Code Block / Code\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:7\nmsgid \"previous page\"\nmsgstr \"página anterior\"\n\n#: templates/pybb/pagination.html:21\nmsgid \"next page\"\nmsgstr \"página siguiente\"\n\n#: templates/pybb/poll.html:4\nmsgid \"Poll\"\nmsgstr \"Encuesta\"\n\n#: templates/pybb/poll.html:36\nmsgid \"Cancel my poll vote\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:7\nmsgid \"Poll answers\"\nmsgstr \"Respuestas a encuesta\"\n\n#: templates/pybb/poll_edit_form.html:20\nmsgid \"remove answer\"\nmsgstr \"eliminar respuesta\"\n\n#: templates/pybb/poll_edit_form.html:21\nmsgid \"add answer\"\nmsgstr \"añadir respuesta\"\n\n#: templates/pybb/post_template.html:28\n#, python-format\nmsgid \"Rank: %(rank)s\"\nmsgstr \"Rango: %(rank)s\"\n\n#: templates/pybb/post_template.html:41 templates/pybb/user.html:51\nmsgid \"Edit\"\nmsgstr \"Editar\"\n\n#: templates/pybb/post_template.html:45\nmsgid \"Delete post?\"\nmsgstr \"¿Borrar mensaje?\"\n\n#: templates/pybb/post_template.html:46\nmsgid \"Delete\"\nmsgstr \"Borrar\"\n\n#: templates/pybb/post_template.html:49\nmsgid \"Approve post\"\nmsgstr \"Aprobar mensaje\"\n\n#: templates/pybb/post_template.html:53 templates/pybb/topic.html:62\nmsgid \"Admin\"\nmsgstr \"Admin\"\n\n#: templates/pybb/post_template.html:69\nmsgid \"Edited\"\nmsgstr \"Editado\"\n\n#: templates/pybb/post_template.html:83\nmsgid \"quote\"\nmsgstr \"citar\"\n\n#: templates/pybb/post_template.html:84\nmsgid \"quote selected\"\nmsgstr \"\"\n\n#: templates/pybb/topic.html:51\nmsgid \"Unstick topic\"\nmsgstr \"Desanclar tema\"\n\n#: templates/pybb/topic.html:53\nmsgid \"Stick topic\"\nmsgstr \"Anclar tema\"\n\n#: templates/pybb/topic.html:57\nmsgid \"Open topic\"\nmsgstr \"Abrir tema\"\n\n#: templates/pybb/topic.html:59\nmsgid \"Close topic\"\nmsgstr \"Cerrar tema\"\n\n#: templates/pybb/topic.html:70\nmsgid \"Unsubscribe\"\nmsgstr \"Anular subscripción\"\n\n#: templates/pybb/topic_list.html:13\nmsgid \"Views\"\nmsgstr \"Vistas\"\n\n#: templates/pybb/topic_list.html:16\nmsgid \"Last post\"\nmsgstr \"Último mensaje\"\n\n#: templates/pybb/topic_list.html:26\nmsgid \"Go to first unread post\"\nmsgstr \"Ir al primer mensaje no leído\"\n\n#: templates/pybb/topic_list.html:32\nmsgid \"pages\"\nmsgstr \"páginas\"\n\n#: templates/pybb/user.html:16\nmsgid \"Statistics\"\nmsgstr \"Estadísticas\"\n\n#: templates/pybb/user.html:19\n#, python-format\nmsgid \"Number of topics: %(count)s\"\nmsgstr \"Número de temas: %(count)s\"\n\n#: templates/pybb/user.html:24\n#, python-format\nmsgid \"Number of posts: %(count)s\"\nmsgstr \"Número de mensajes: %(count)s\"\n\n#: templates/pybb/user.html:29\n#, python-format\nmsgid \"Date of registration: %(date_joined)s \"\nmsgstr \"Fecha de registro: %(date_joined)s \"\n\n#: templates/pybb/user.html:36\n#, fuzzy\n#| msgid \"Moderators\"\nmsgid \"Moderator\"\nmsgstr \"Moderadores\"\n\n#: templates/pybb/user.html:41\nmsgid \"Block\"\nmsgstr \"Bloquear\"\n\n#: templates/pybb/user.html:42\nmsgid \"Block and delete all messages\"\nmsgstr \"\"\n\n#: templates/pybb/user.html:46\n#, fuzzy\n#| msgid \"Block\"\nmsgid \"Unblock\"\nmsgstr \"Bloquear\"\n\n#: templates/pybb/user_posts.html:12 templates/pybb/user_posts.html.py:17\nmsgid \"All posts created by\"\nmsgstr \"Todos los mensajes creados por\"\n\n#: templates/pybb/user_topics.html:12 templates/pybb/user_topics.html.py:17\nmsgid \"All topics created by\"\nmsgstr \"Todos los temas creados por\"\n\n#: templates/pybb/users.html:8 templates/pybb/users.html.py:24\nmsgid \"Users\"\nmsgstr \"Usuarios\"\n\n#: templates/pybb/users.html:12\nmsgid \"Search\"\nmsgstr \"Buscar\"\n\n#: templatetags/pybb_tags.py:61\n#, fuzzy, python-format\n#| msgid \"seconds ago\"\nmsgid \"%d second ago\"\nmsgid_plural \"%d seconds ago\"\nmsgstr[0] \"segundos\"\nmsgstr[1] \"segundos\"\n\n#: templatetags/pybb_tags.py:65\n#, fuzzy, python-format\n#| msgid \"minutes ago\"\nmsgid \"%d minute ago\"\nmsgid_plural \"%d minutes ago\"\nmsgstr[0] \"minutos\"\nmsgstr[1] \"minutos\"\n\n#: templatetags/pybb_tags.py:75\n#, python-format\nmsgid \"today, %s\"\nmsgstr \"hoy, %s\"\n\n#: templatetags/pybb_tags.py:77\n#, python-format\nmsgid \"yesterday, %s\"\nmsgstr \"ayer, %s\"\n\n#: util.py:140\nmsgid \"Can't get profile for anonymous user\"\nmsgstr \"No se pude obtener el perfil del usuario anónimo\"\n\n#: views.py:156\n#, fuzzy\n#| msgid \"Forum categories are not created\"\nmsgid \"Forum does not exist\"\nmsgstr \"Las categorías del foro no están creadas\"\n\n#: views.py:388\nmsgid \"This topic does not exists\"\nmsgstr \"\"\n\n#: views.py:826\nmsgid \"\"\n\"Subscription removed. You will not receive emails from this topic unless you \"\n\"subscribe or post again.\"\nmsgstr \"\"\n\n#: views.py:837\nmsgid \"\"\n\"Subscription added. You will receive email notifications for replies to this \"\n\"topic.\"\nmsgstr \"\"\n\n#: views.py:855\nmsgid \"All forums marked as read\"\nmsgstr \"Todos los foros marcados como leídos\"\n\n#: views.py:888\nmsgid \"User successfuly blocked\"\nmsgstr \"Usuario bloqueado con éxito\"\n\n#: views.py:901\n#, fuzzy\n#| msgid \"User successfuly blocked\"\nmsgid \"User successfuly unblocked\"\nmsgstr \"Usuario bloqueado con éxito\"\n\n#: views.py:939\nmsgid \"Privileges updated\"\nmsgstr \"\"\n\n#~ msgid \"Subscribers:\"\n#~ msgstr \"Suscriptores:\"\n\n#~ msgid \"Rank\"\n#~ msgstr \"Rango\"\n"
  },
  {
    "path": "pybb/locale/fr/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE. \n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <frederique.castagnac@makina-corpus.com>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pybbm\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-01-11 14:06+0100\\n\"\n\"PO-Revision-Date: 2017-01-11 14:10+0100\\n\"\n\"Last-Translator: DylannCordel <d.cordel@webu.coop>\\n\"\n\"Language-Team: \\n\"\n\"Language: fr_FR\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n > 1);\\n\"\n\"X-Poedit-SourceCharset: UTF-8\\n\"\n\"X-Poedit-Basepath: ../../..\\n\"\n\"X-Generator: Poedit 1.6.10\\n\"\n\n#: admin.py:45 admin.py:84 admin.py:112 admin.py:134\nmsgid \"Additional options\"\nmsgstr \"Options supplémentaires\"\n\n#: admin.py:117 models.py:280\nmsgid \"Message\"\nmsgstr \"Message\"\n\n#: admin.py:148\nmsgid \"View post\"\nmsgstr \"Voir le message\"\n\n#: admin.py:153\nmsgid \"Edit post\"\nmsgstr \"Modifier le message\"\n\n#: apps.py:9\nmsgid \"Pybbm forum solution\"\nmsgstr \"Solution de forum Pybbm\"\n\n#: feeds.py:27 feeds.py:28 templates/pybb/base.html:10\nmsgid \"Latest posts on forum\"\nmsgstr \"Derniers messages sur le forum\"\n\n#: feeds.py:41 feeds.py:42 templates/pybb/base.html:11\nmsgid \"Latest topics on forum\"\nmsgstr \"Derniers sujets sur le forum\"\n\n#: forms.py:30\nmsgid \"Attachment is too big\"\nmsgstr \"Le fichier joint est trop lourd\"\n\n#: forms.py:48\n#, python-format\nmsgid \"You cant add more than %s answers for poll\"\nmsgstr \"Vous ne pouvez ajouter plus de %s réponses pour un sondage\"\n\n#: forms.py:50\nmsgid \"Add two or more answers for this poll\"\nmsgstr \"Ajouter au moins 2 réponses pour ce sondage\"\n\n#: forms.py:58 models.py:183\nmsgid \"Subject\"\nmsgstr \"Thème\"\n\n#: forms.py:59 models.py:195\nmsgid \"Poll type\"\nmsgstr \"Type de sondage\"\n\n#: forms.py:61 models.py:196\nmsgid \"Poll question\"\nmsgstr \"Question de sondage\"\n\n#: forms.py:64\nmsgid \"Topic slug\"\nmsgstr \"Slug du sujet\"\n\n#: forms.py:123\nmsgid \"Polls question is required when adding a poll\"\nmsgstr \"Vous devez spécifier une question lorsque vous ajoutez un sondage\"\n\n#: forms.py:176 models.py:186 models.py:295 models.py:368 models.py:507\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\n#: forms.py:212\n#, python-format\nmsgid \"Avatar is too large, max size: %s bytes\"\nmsgstr \"Avatar trop grand, taille max : %s octets\"\n\n#: forms.py:272\nmsgid \"be unsubscribe from this forum\"\nmsgstr \"être désinscrit de ce forum\"\n\n#: forms.py:277\nmsgid \"You want to\"\nmsgstr \"Vous souhaitez\"\n\n#: forms.py:281\nmsgid \"only new topics\"\nmsgstr \"seulement les nouveaux sujets\"\n\n#: forms.py:282\nmsgid \"all topics of the forum\"\nmsgstr \"tous les sujets du forum\"\n\n#: forms.py:285\nmsgid \"Concerned topics\"\nmsgstr \"Sujets concernés\"\n\n#: models.py:23 models.py:59\nmsgid \"Name\"\nmsgstr \"Nom\"\n\n#: models.py:24 models.py:60\nmsgid \"Position\"\nmsgstr \"Position\"\n\n#: models.py:25 models.py:66 templates/pybb/category.html:4\n#: templates/pybb/forum_list.html:26\nmsgid \"Hidden\"\nmsgstr \"Caché\"\n\n#: models.py:26\nmsgid \"If checked, this category will be visible only for staff\"\nmsgstr \"Si coché, cette catégorie sera visible par l'équipe uniquement\"\n\n#: models.py:27 models.py:69 models.py:197\nmsgid \"Slug\"\nmsgstr \"Slug\"\n\n#: models.py:31 models.py:56\nmsgid \"Category\"\nmsgstr \"Catégorie\"\n\n#: models.py:32\nmsgid \"Categories\"\nmsgstr \"Catégories\"\n\n#: models.py:57\nmsgid \"Parent forum\"\nmsgstr \"Forum parent\"\n\n#: models.py:61\nmsgid \"Description\"\nmsgstr \"Description\"\n\n#: models.py:62\nmsgid \"Moderators\"\nmsgstr \"Modérateurs\"\n\n#: models.py:63 models.py:185 models.py:297\nmsgid \"Updated\"\nmsgstr \"Mis à jour\"\n\n#: models.py:64 models.py:192 profiles.py:41\nmsgid \"Post count\"\nmsgstr \"Nombre de messages\"\n\n#: models.py:65\nmsgid \"Topic count\"\nmsgstr \"Nombre de sujets\"\n\n#: models.py:68\nmsgid \"Headline\"\nmsgstr \"Titre \"\n\n#: models.py:73 models.py:136 models.py:182 templates/pybb/forum_list.html:8\nmsgid \"Forum\"\nmsgstr \"Forum\"\n\n#: models.py:74\nmsgid \"Forums\"\nmsgstr \"Forums\"\n\n#: models.py:129\nmsgid \"be notified only when a new topic is added\"\nmsgstr \"être notifié seulement lorsqu'un nouveau sujet est ajouté\"\n\n#: models.py:130\nmsgid \"be auto-subscribed to topics\"\nmsgstr \"être automatiquement inscrit aux sujets\"\n\n#: models.py:134\nmsgid \"Subscriber\"\nmsgstr \"Abonné\"\n\n#: models.py:138\nmsgid \"Subscription type\"\nmsgstr \"Type d'abonnement\"\n\n#: models.py:148\nmsgid \"Subscription to forum\"\nmsgstr \"Abonnement au forum\"\n\n#: models.py:149\nmsgid \"Subscriptions to forums\"\nmsgstr \"Abonnements aux forums\"\n\n#: models.py:177\nmsgid \"None\"\nmsgstr \"Aucun(e)\"\n\n#: models.py:178\nmsgid \"Single answer\"\nmsgstr \"Réponse simple\"\n\n#: models.py:179\nmsgid \"Multiple answers\"\nmsgstr \"Réponses multiples\"\n\n#: models.py:184 models.py:296\nmsgid \"Created\"\nmsgstr \"Créé\"\n\n#: models.py:187\nmsgid \"Views count\"\nmsgstr \"Nombre de vues\"\n\n#: models.py:188 templates/pybb/topic_list.html:27\nmsgid \"Sticky\"\nmsgstr \"Épinglé\"\n\n#: models.py:189 templates/pybb/topic_list.html:28\nmsgid \"Closed\"\nmsgstr \"Fermé\"\n\n#: models.py:191 templates/pybb/topic.html:88\nmsgid \"Subscribers\"\nmsgstr \"Abonnés\"\n\n#: models.py:194 models.py:299\nmsgid \"On moderation\"\nmsgstr \"En modération\"\n\n#: models.py:201 models.py:294 models.py:483 templates/pybb/topic_list.html:7\nmsgid \"Topic\"\nmsgstr \"Sujet\"\n\n#: models.py:202 templates/pybb/forum_list.html:11\n#: templates/pybb/user_topics.html:7\nmsgid \"Topics\"\nmsgstr \"Sujets\"\n\n#: models.py:281\nmsgid \"HTML version\"\nmsgstr \"Version HTML\"\n\n#: models.py:282\nmsgid \"Text version\"\nmsgstr \"Version texte\"\n\n#: models.py:298\nmsgid \"User IP\"\nmsgstr \"IP de l'utilisateur\"\n\n#: models.py:303 models.py:386\nmsgid \"Post\"\nmsgstr \"Message\"\n\n#: models.py:304 templates/pybb/forum_list.html:14\n#: templates/pybb/topic.html:42 templates/pybb/topic_list.html:10\n#: templates/pybb/user_posts.html:7\nmsgid \"Posts\"\nmsgstr \"Messages\"\n\n#: models.py:371\nmsgid \"Profile\"\nmsgstr \"Profil\"\n\n#: models.py:372\nmsgid \"Profiles\"\nmsgstr \"Profils\"\n\n#: models.py:383\nmsgid \"Attachment\"\nmsgstr \"Fichier joint\"\n\n#: models.py:384\nmsgid \"Attachments\"\nmsgstr \"Fichiers joints\"\n\n#: models.py:387\nmsgid \"Size\"\nmsgstr \"Taille\"\n\n#: models.py:388\nmsgid \"File\"\nmsgstr \"Fichier\"\n\n#: models.py:438\nmsgid \"Topic read tracker\"\nmsgstr \"Suivi des sujets lus\"\n\n#: models.py:439\nmsgid \"Topic read trackers\"\nmsgstr \"Suivis des sujets lus\"\n\n#: models.py:476\nmsgid \"Forum read tracker\"\nmsgstr \"Suivi des forums lus\"\n\n#: models.py:477\nmsgid \"Forum read trackers\"\nmsgstr \"Suivis des forums lus\"\n\n#: models.py:484\nmsgid \"Text\"\nmsgstr \"Texte\"\n\n#: models.py:487 models.py:506\nmsgid \"Poll answer\"\nmsgstr \"Réponse de sondage\"\n\n#: models.py:488\nmsgid \"Polls answers\"\nmsgstr \"Réponses de sondage\"\n\n#: models.py:511\nmsgid \"Poll answer user\"\nmsgstr \"Réponse au sondage\"\n\n#: models.py:512\nmsgid \"Polls answers users\"\nmsgstr \"Réponses aux sondages\"\n\n#: models.py:535\n#, python-format\nmsgid \"\"\n\"After %(limit)s attemps, there is not any unique slug value for \\\"%(slug)s\\\"\"\nmsgstr \"\"\n\"Après %(limit)s essais, il n'y a aucune valeur de slug unique pour \\\"%(slug)s\"\n\"\\\"\"\n\n#: profiles.py:34\nmsgid \"Signature\"\nmsgstr \"Signature\"\n\n#: profiles.py:35\nmsgid \"Signature HTML Version\"\nmsgstr \"Version HTML de la signature\"\n\n#: profiles.py:37\nmsgid \"Time zone\"\nmsgstr \"Fuseau horaire\"\n\n#: profiles.py:38\nmsgid \"Language\"\nmsgstr \"Langue\"\n\n#: profiles.py:40\nmsgid \"Show signatures\"\nmsgstr \"Afficher les signatures\"\n\n#: profiles.py:42\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\n#: profiles.py:44\nmsgid \"Automatically subscribe\"\nmsgstr \"S'abonner automatiquement\"\n\n#: profiles.py:45\nmsgid \"Automatically subscribe to topics that you answer\"\nmsgstr \"S'abonner automatiquement aux sujets auxquels vous répondez\"\n\n#: templates/pybb/_button_forum_subscription.html:1\nmsgid \"Manage subscription\"\nmsgstr \"Gérer vos abonnements\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#: templates/pybb/topic.html:72\nmsgid \"Subscribe\"\nmsgstr \"S'abonner\"\n\n#: templates/pybb/_button_new_topic.html:1 templates/pybb/add_post.html:5\n#: templates/pybb/add_post.html.py:32\nmsgid \"New topic\"\nmsgstr \"Nouveau sujet\"\n\n#: templates/pybb/_button_save.html:1\nmsgid \"Save\"\nmsgstr \"Enregistrer\"\n\n#: templates/pybb/_button_submit.html:1\n#: templates/pybb/forum_subscription.html:33\nmsgid \"Submit\"\nmsgstr \"Envoyer\"\n\n#: templates/pybb/_markitup.html:25\n#: templates/pybb/markup/bbcode_widget.html:16\n#: templates/pybb/markup/markdown_widget.html:24\nmsgid \"Bold\"\nmsgstr \"Gras\"\n\n#: templates/pybb/_markitup.html:26\n#: templates/pybb/markup/bbcode_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:25\nmsgid \"Italic\"\nmsgstr \"Italique\"\n\n#: templates/pybb/_markitup.html:27\n#: templates/pybb/markup/bbcode_widget.html:18\nmsgid \"Underline\"\nmsgstr \"Souligné\"\n\n#: templates/pybb/_markitup.html:28\n#: templates/pybb/markup/bbcode_widget.html:19\nmsgid \"Stroke\"\nmsgstr \"Barré\"\n\n#: templates/pybb/_markitup.html:30\n#: templates/pybb/markup/bbcode_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:32\nmsgid \"Picture\"\nmsgstr \"Image\"\n\n#: templates/pybb/_markitup.html:31\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Link\"\nmsgstr \"Lien\"\n\n#: templates/pybb/_markitup.html:33\n#: templates/pybb/markup/bbcode_widget.html:24\nmsgid \"Bulleted list\"\nmsgstr \"Liste à puces\"\n\n#: templates/pybb/_markitup.html:34\n#: templates/pybb/markup/bbcode_widget.html:25\nmsgid \"Numeric list\"\nmsgstr \"Liste numérotée\"\n\n#: templates/pybb/_markitup.html:35\n#: templates/pybb/markup/bbcode_widget.html:26\nmsgid \"List item\"\nmsgstr \"Élément de liste\"\n\n#: templates/pybb/_markitup.html:37\n#: templates/pybb/markup/bbcode_widget.html:28\n#: templates/pybb/markup/markdown_widget.html:35\nmsgid \"Quotes\"\nmsgstr \"Citations\"\n\n#: templates/pybb/_markitup.html:38\n#: templates/pybb/markup/bbcode_widget.html:29\nmsgid \"Code\"\nmsgstr \"Code\"\n\n#: templates/pybb/_markitup.html:40\n#: templates/pybb/markup/bbcode_widget.html:31\nmsgid \"Clean\"\nmsgstr \"Nettoyer\"\n\n#: templates/pybb/_markitup.html:41\n#: templates/pybb/markup/bbcode_widget.html:32\n#: templates/pybb/markup/markdown_widget.html:38\nmsgid \"Preview\"\nmsgstr \"Aperçu\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"Register\"\nmsgstr \"S'inscrire\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"or\"\nmsgstr \"ou\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"login\"\nmsgstr \"se connecter\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"to create to post a reply\"\nmsgstr \"pour créer ou poster une réponse\"\n\n#: templates/pybb/add_post.html:5 templates/pybb/add_post.html.py:32\nmsgid \"New reply\"\nmsgstr \"Nouvelle réponse\"\n\n#: templates/pybb/attachments_formset.html:6\nmsgid \"Add attachments\"\nmsgstr \"Ajouter des fichiers joints\"\n\n#: templates/pybb/attachments_formset.html:14\nmsgid \"\"\n\"If you need to upload larger files, please use an external storage website.\"\nmsgstr \"\"\n\"Si vous avez besoin d'envoyer des fichiers plus volumineux, veuillez \"\n\"utiliser un site web de stockage externe.\"\n\n#: templates/pybb/attachments_formset.html:14\n#, python-format\nmsgid \"(max size: %(max_size)s)\"\nmsgstr \"(poids max : %(max_size)s)\"\n\n#: templates/pybb/attachments_formset.html:17\n#: templates/pybb/edit_profile.html:25\nmsgid \"delete\"\nmsgstr \"effacer\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Reference to your file\"\nmsgstr \"Référence à votre fichier\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Ref\"\nmsgstr \"Réf\"\n\n#: templates/pybb/attachments_formset.html:20\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#: templates/pybb/topic.html:88 templates/pybb/topic_list.html:32\nmsgid \":\"\nmsgstr \" :\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"link\"\nmsgstr \"lien\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"Insert a link to your file inside your post.\"\nmsgstr \"Insérez un lien vers votre fichier à l'intérieur de votre message.\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"image\"\nmsgstr \"image\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"Insert your image inside your post.\"\nmsgstr \"Insérez votre image à l'intérieur de votre message.\"\n\n#: templates/pybb/breadcrumb.html:4\nmsgid \"Home\"\nmsgstr \"Accueil\"\n\n#: templates/pybb/delete_post.html:5\nmsgid \"Are you sure you want to delete this message?\"\nmsgstr \"Êtes-vous sûr de vouloir supprimer ce message ?\"\n\n#: templates/pybb/delete_post.html:12\nmsgid \"No, take me back\"\nmsgstr \"Non, revenons en arrière\"\n\n#: templates/pybb/delete_post.html:13\nmsgid \"Yes, I am sure\"\nmsgstr \"Oui, je suis sûr\"\n\n#: templates/pybb/edit_post.html:4 templates/pybb/edit_post.html.py:17\nmsgid \"Editing the post\"\nmsgstr \"Modifier le message\"\n\n#: templates/pybb/edit_privileges.html:5 templates/pybb/edit_privileges.html:8\nmsgid \"Grant moderator privileges\"\nmsgstr \"Accorder les droits modérateur\"\n\n#: templates/pybb/edit_profile.html:5 templates/pybb/edit_profile.html.py:8\n#: templates/pybb/edit_profile.html:13\nmsgid \"Profile editing\"\nmsgstr \"Édition de profil\"\n\n#: templates/pybb/edit_profile.html:18\nmsgid \"Subscriptions on topics\"\nmsgstr \"Abonnement aux sujets\"\n\n#: templates/pybb/forum_list.html:17\nmsgid \"Last posts\"\nmsgstr \"Derniers messages\"\n\n#: templates/pybb/forum_list.html:43\nmsgid \"No forums created\"\nmsgstr \"Aucun forum créé\"\n\n#: templates/pybb/forum_list.html:44\nmsgid \"Add forum now\"\nmsgstr \"Ajouter un forum maintenant\"\n\n#: templates/pybb/forum_subscription.html:4\n#, python-format\nmsgctxt \"page title\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Abonnement\"\n\n#: templates/pybb/forum_subscription.html:14\n#, python-format\nmsgctxt \"content heading\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Abonnement\"\n\n#: templates/pybb/forum_subscription.html:32\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\n#: templates/pybb/index.html:17\nmsgid \"Forum categories are not created\"\nmsgstr \"Les catégories de forum n'ont pas été créées\"\n\n#: templates/pybb/index.html:18\nmsgid \"Add a category now\"\nmsgstr \"Ajouter une catégorie maintenant\"\n\n#: templates/pybb/index.html:22 templates/pybb/latest_topics.html:5\n#: templates/pybb/latest_topics.html:8 templates/pybb/latest_topics.html:15\nmsgid \"Last updates in topics\"\nmsgstr \"Derniers sujets\"\n\n#: templates/pybb/index.html:23\nmsgid \"Mark all forums as read\"\nmsgstr \"Marquer tous les forums comme lus\"\n\n#: templates/pybb/latest_topics.html:31\nmsgid \"Mark all topics as read\"\nmsgstr \"Marquer tous les sujets comme lus\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:4\n#, python-format\nmsgid \"\"\n\"User %(username)s post a new topic in forum to which you are subscribed \"\n\"(%(forum_name)s).\"\nmsgstr \"\"\n\"L'utilisateur %(username)s a posté un nouveau sujet dans un forum auquel \"\n\"vous êtes abonné (%(forum_name)s).\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/subscription_email_body.html:5\nmsgid \"Link to topic\"\nmsgstr \"Lien vers le sujet\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\nmsgid \"Link to forum\"\nmsgstr \"Lien vers le forum\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\nmsgid \"\"\n\"If you don't want to receive notifications on new topics in this forum visit \"\n\"following link\"\nmsgstr \"\"\n\"Si vous ne souhaitez pas recevoir de notifications pour les nouveaux sujets \"\n\"de ce forum, visitez le lien\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_subject.html:2\nmsgid \"New topic in forum that you subscribed.\"\nmsgstr \"Nouveu sujet dans un forum auquel vous êtes abonné.\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:7\n#: templates/pybb/mail_templates/subscription_email_body.html:3\n#, python-format\nmsgid \"User %(username)s replied in topic to which you are subscribed.\"\nmsgstr \"\"\n\"L'utilisateur %(username)s a répondu dans un sujet auquel vous êtes abonné.\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:10\n#, python-format\nmsgid \"\"\n\"Follow %(link_post_start)sthis link%(link_end)s to see the new post on the \"\n\"topic %(link_topic_start)s%(topic_name)s%(link_end)s.\"\nmsgstr \"\"\n\"Suivez %(link_post_start)sce lien%(link_end)s pour voir le nouveau message \"\n\"du sujet %(link_topic_start)s%(topic_name)s%(link_end)s.\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:14\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new posts in this topic visit \"\n\"%(link_start)sthis link%(link_end)s.\"\nmsgstr \"\"\n\"Si vous ne souhaitez pas recevoir de notifications pour les nouveaux \"\n\"messages de ce sujet, visitez %(link_start)sce lien%(link_end)s.\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:4\nmsgid \"Link to post\"\nmsgstr \"Lien vers le message\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:8\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new messages in this topic \"\n\"visit following link: %(delete_url_full)s\"\nmsgstr \"\"\n\"Si vous ne souhaitez pas recevoir de notifications pour les nouveaux \"\n\"messages de ce sujet, visitez ce lien suivant : %(delete_url_full)s\"\n\n#: templates/pybb/mail_templates/subscription_email_subject.html:2\nmsgid \"New answer in topic that you subscribed.\"\nmsgstr \"Nouvelle réponse dans un sujet auquel vous êtes abonné.\"\n\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Your text to link here...\"\nmsgstr \"Votre texte de lien ici...\"\n\n#: templates/pybb/markup/markdown_widget.html:17\nmsgid \"First Level Heading\"\nmsgstr \"Titre de premier niveau\"\n\n#: templates/pybb/markup/markdown_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:18\n#: templates/pybb/markup/markdown_widget.html:19\n#: templates/pybb/markup/markdown_widget.html:20\n#: templates/pybb/markup/markdown_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Your title here...\"\nmsgstr \"Votre titre ici...\"\n\n#: templates/pybb/markup/markdown_widget.html:18\nmsgid \"Second Level Heading\"\nmsgstr \"Titre de second niveau\"\n\n#: templates/pybb/markup/markdown_widget.html:19\nmsgid \"Heading 3\"\nmsgstr \"Titre 3\"\n\n#: templates/pybb/markup/markdown_widget.html:20\nmsgid \"Heading 4\"\nmsgstr \"Titre 4\"\n\n#: templates/pybb/markup/markdown_widget.html:21\nmsgid \"Heading 5\"\nmsgstr \"Titre 5\"\n\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Heading 6\"\nmsgstr \"Titre 6\"\n\n#: templates/pybb/markup/markdown_widget.html:27\nmsgid \"Bulleted List\"\nmsgstr \"Liste à puces\"\n\n#: templates/pybb/markup/markdown_widget.html:28\nmsgid \"Numeric List\"\nmsgstr \"Liste numérotée\"\n\n#: templates/pybb/markup/markdown_widget.html:36\nmsgid \"Code Block / Code\"\nmsgstr \"Bloc de code / Code\"\n\n#: templates/pybb/pagination.html:7\nmsgid \"previous page\"\nmsgstr \"page précédente\"\n\n#: templates/pybb/pagination.html:21\nmsgid \"next page\"\nmsgstr \"page suivante\"\n\n#: templates/pybb/poll.html:4\nmsgid \"Poll\"\nmsgstr \"Sondage\"\n\n#: templates/pybb/poll.html:36\nmsgid \"Cancel my poll vote\"\nmsgstr \"Annuler ma participation au sondage\"\n\n#: templates/pybb/poll_edit_form.html:7\nmsgid \"Poll answers\"\nmsgstr \"Réponses du sondage\"\n\n#: templates/pybb/poll_edit_form.html:20\nmsgid \"remove answer\"\nmsgstr \"supprimer une réponse\"\n\n#: templates/pybb/poll_edit_form.html:21\nmsgid \"add answer\"\nmsgstr \"ajouter une réponse\"\n\n#: templates/pybb/post_template.html:28\n#, python-format\nmsgid \"Rank: %(rank)s\"\nmsgstr \"Classement: %(rank)s\"\n\n#: templates/pybb/post_template.html:41 templates/pybb/user.html:51\nmsgid \"Edit\"\nmsgstr \"Modifier\"\n\n#: templates/pybb/post_template.html:45\nmsgid \"Delete post?\"\nmsgstr \"Supprimer le message ?\"\n\n#: templates/pybb/post_template.html:46\nmsgid \"Delete\"\nmsgstr \"Supprimer\"\n\n#: templates/pybb/post_template.html:49\nmsgid \"Approve post\"\nmsgstr \"Approuver le message\"\n\n#: templates/pybb/post_template.html:53 templates/pybb/topic.html:62\nmsgid \"Admin\"\nmsgstr \"Administration\"\n\n#: templates/pybb/post_template.html:69\nmsgid \"Edited\"\nmsgstr \"Modifié\"\n\n#: templates/pybb/post_template.html:83\nmsgid \"quote\"\nmsgstr \"citer\"\n\n#: templates/pybb/post_template.html:84\nmsgid \"quote selected\"\nmsgstr \"citer la sélection\"\n\n#: templates/pybb/topic.html:51\nmsgid \"Unstick topic\"\nmsgstr \"Désépingler le sujet\"\n\n#: templates/pybb/topic.html:53\nmsgid \"Stick topic\"\nmsgstr \"Épingler le sujet\"\n\n#: templates/pybb/topic.html:57\nmsgid \"Open topic\"\nmsgstr \"Ouvrir le sujet\"\n\n#: templates/pybb/topic.html:59\nmsgid \"Close topic\"\nmsgstr \"Fermer le sujet\"\n\n#: templates/pybb/topic.html:70\nmsgid \"Unsubscribe\"\nmsgstr \"Se désabonner\"\n\n#: templates/pybb/topic_list.html:13\nmsgid \"Views\"\nmsgstr \"Vues\"\n\n#: templates/pybb/topic_list.html:16\nmsgid \"Last post\"\nmsgstr \"Dernier message\"\n\n#: templates/pybb/topic_list.html:26\nmsgid \"Go to first unread post\"\nmsgstr \"Aller au premier message non lu\"\n\n#: templates/pybb/topic_list.html:32\nmsgid \"pages\"\nmsgstr \"pages\"\n\n#: templates/pybb/user.html:16\nmsgid \"Statistics\"\nmsgstr \"Statistiques\"\n\n#: templates/pybb/user.html:19\n#, python-format\nmsgid \"Number of topics: %(count)s\"\nmsgstr \"Nombre de sujets : %(count)s\"\n\n#: templates/pybb/user.html:24\n#, python-format\nmsgid \"Number of posts: %(count)s\"\nmsgstr \"Nombre de messages : %(count)s\"\n\n#: templates/pybb/user.html:29\n#, python-format\nmsgid \"Date of registration: %(date_joined)s \"\nmsgstr \"Date d'enregistrement : %(date_joined)s \"\n\n#: templates/pybb/user.html:36\nmsgid \"Moderator\"\nmsgstr \"Modérateur\"\n\n#: templates/pybb/user.html:41\nmsgid \"Block\"\nmsgstr \"Bloquer\"\n\n#: templates/pybb/user.html:42\nmsgid \"Block and delete all messages\"\nmsgstr \"Bloquer et supprimer tous les messages\"\n\n#: templates/pybb/user.html:46\nmsgid \"Unblock\"\nmsgstr \"Débloquer\"\n\n#: templates/pybb/user_posts.html:12 templates/pybb/user_posts.html.py:17\nmsgid \"All posts created by\"\nmsgstr \"Tous les sujets créés par\"\n\n#: templates/pybb/user_topics.html:12 templates/pybb/user_topics.html.py:17\nmsgid \"All topics created by\"\nmsgstr \"Tous les sujets créés par\"\n\n#: templates/pybb/users.html:8 templates/pybb/users.html.py:24\nmsgid \"Users\"\nmsgstr \"Utilisateurs\"\n\n#: templates/pybb/users.html:12\nmsgid \"Search\"\nmsgstr \"Rechercher\"\n\n#: templatetags/pybb_tags.py:61\n#, python-format\nmsgid \"%d second ago\"\nmsgid_plural \"%d seconds ago\"\nmsgstr[0] \"il y a %d seconde\"\nmsgstr[1] \"il y a %d secondes\"\n\n#: templatetags/pybb_tags.py:65\n#, python-format\nmsgid \"%d minute ago\"\nmsgid_plural \"%d minutes ago\"\nmsgstr[0] \"il y a %d minute\"\nmsgstr[1] \"il y a %d minutes\"\n\n#: templatetags/pybb_tags.py:75\n#, python-format\nmsgid \"today, %s\"\nmsgstr \"aujourd'hui, %s\"\n\n#: templatetags/pybb_tags.py:77\n#, python-format\nmsgid \"yesterday, %s\"\nmsgstr \"hier, %s\"\n\n#: util.py:140\nmsgid \"Can't get profile for anonymous user\"\nmsgstr \"Impossible d'obtenir le profil d'un utilisateur anonyme\"\n\n#: views.py:156\nmsgid \"Forum does not exist\"\nmsgstr \"Le forum n'existe pas\"\n\n#: views.py:388\nmsgid \"This topic does not exists\"\nmsgstr \"Ce sujet n'existe pas\"\n\n#: views.py:826\nmsgid \"\"\n\"Subscription removed. You will not receive emails from this topic unless you \"\n\"subscribe or post again.\"\nmsgstr \"\"\n\"Déscription prise en compte. Vous ne recevrez plus de courriels de ce sujet \"\n\"sauf si vous vous inscrivez à nouveau.\"\n\n#: views.py:837\nmsgid \"\"\n\"Subscription added. You will receive email notifications for replies to this \"\n\"topic.\"\nmsgstr \"\"\n\"Inscription prise en compte. Vous recevrez un courriel for chaque réponse à \"\n\"ce sujet.\"\n\n#: views.py:855\nmsgid \"All forums marked as read\"\nmsgstr \"Marquer tous les forums comme lus\"\n\n#: views.py:888\nmsgid \"User successfuly blocked\"\nmsgstr \"Utilisateur bloqué avec succès\"\n\n#: views.py:901\nmsgid \"User successfuly unblocked\"\nmsgstr \"Utilisateur débloqué avec succès\"\n\n#: views.py:939\nmsgid \"Privileges updated\"\nmsgstr \"Droits mis-à-jour\"\n\n#~ msgid \"Subscribers:\"\n#~ msgstr \"Abonnés :\"\n\n#~ msgid \"Rank\"\n#~ msgstr \"Classement\"\n"
  },
  {
    "path": "pybb/locale/he/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-01-11 14:06+0100\\n\"\n\"PO-Revision-Date: 2009-04-04 18:14+0200\\n\"\n\"Last-Translator: isoTop <isotop@gmail.com>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: admin.py:45 admin.py:84 admin.py:112 admin.py:134\nmsgid \"Additional options\"\nmsgstr \"אפשרויות נוספות\"\n\n#: admin.py:117 models.py:280\nmsgid \"Message\"\nmsgstr \"הודעה\"\n\n#: admin.py:148\n#, fuzzy\n#| msgid \"Views count\"\nmsgid \"View post\"\nmsgstr \"מס' קריאות\"\n\n#: admin.py:153\n#, fuzzy\n#| msgid \"Editing the post\"\nmsgid \"Edit post\"\nmsgstr \"עורך את ההודעה\"\n\n#: apps.py:9\nmsgid \"Pybbm forum solution\"\nmsgstr \"\"\n\n#: feeds.py:27 feeds.py:28 templates/pybb/base.html:10\nmsgid \"Latest posts on forum\"\nmsgstr \"הודעות אחרונות בפורום\"\n\n#: feeds.py:41 feeds.py:42 templates/pybb/base.html:11\nmsgid \"Latest topics on forum\"\nmsgstr \"אשכולות אחרונים בפורום\"\n\n#: forms.py:30\nmsgid \"Attachment is too big\"\nmsgstr \"הקובץ המצורף גדול מידי\"\n\n#: forms.py:48\n#, python-format\nmsgid \"You cant add more than %s answers for poll\"\nmsgstr \"\"\n\n#: forms.py:50\nmsgid \"Add two or more answers for this poll\"\nmsgstr \"\"\n\n#: forms.py:58 models.py:183\nmsgid \"Subject\"\nmsgstr \"נושא\"\n\n#: forms.py:59 models.py:195\nmsgid \"Poll type\"\nmsgstr \"\"\n\n#: forms.py:61 models.py:196\n#, fuzzy\n#| msgid \"Position\"\nmsgid \"Poll question\"\nmsgstr \"מיקום\"\n\n#: forms.py:64\n#, fuzzy\n#| msgid \"Topics\"\nmsgid \"Topic slug\"\nmsgstr \"אשכולות\"\n\n#: forms.py:123\nmsgid \"Polls question is required when adding a poll\"\nmsgstr \"\"\n\n#: forms.py:176 models.py:186 models.py:295 models.py:368 models.py:507\nmsgid \"User\"\nmsgstr \"משתמש\"\n\n#: forms.py:212\n#, python-format\nmsgid \"Avatar is too large, max size: %s bytes\"\nmsgstr \"\"\n\n#: forms.py:272\nmsgid \"be unsubscribe from this forum\"\nmsgstr \"\"\n\n#: forms.py:277\nmsgid \"You want to\"\nmsgstr \"\"\n\n#: forms.py:281\n#, fuzzy\n#| msgid \"New topic\"\nmsgid \"only new topics\"\nmsgstr \"אשכול חדש\"\n\n#: forms.py:282\n#, fuzzy\n#| msgid \"Latest topics on forum\"\nmsgid \"all topics of the forum\"\nmsgstr \"אשכולות אחרונים בפורום\"\n\n#: forms.py:285\n#, fuzzy\nmsgid \"Concerned topics\"\nmsgstr \"אשכול חדש\"\n\n#: models.py:23 models.py:59\nmsgid \"Name\"\nmsgstr \"שם\"\n\n#: models.py:24 models.py:60\nmsgid \"Position\"\nmsgstr \"מיקום\"\n\n#: models.py:25 models.py:66 templates/pybb/category.html:4\n#: templates/pybb/forum_list.html:26\nmsgid \"Hidden\"\nmsgstr \"\"\n\n#: models.py:26\nmsgid \"If checked, this category will be visible only for staff\"\nmsgstr \"\"\n\n#: models.py:27 models.py:69 models.py:197\nmsgid \"Slug\"\nmsgstr \"\"\n\n#: models.py:31 models.py:56\nmsgid \"Category\"\nmsgstr \"קטגוריה\"\n\n#: models.py:32\nmsgid \"Categories\"\nmsgstr \"קטגוריות\"\n\n#: models.py:57\nmsgid \"Parent forum\"\nmsgstr \"\"\n\n#: models.py:61\nmsgid \"Description\"\nmsgstr \"תיאור\"\n\n#: models.py:62\nmsgid \"Moderators\"\nmsgstr \"מנהלים\"\n\n#: models.py:63 models.py:185 models.py:297\nmsgid \"Updated\"\nmsgstr \"מעודכן\"\n\n#: models.py:64 models.py:192 profiles.py:41\nmsgid \"Post count\"\nmsgstr \"מס' הודעות\"\n\n#: models.py:65\n#, fuzzy\n#| msgid \"Post count\"\nmsgid \"Topic count\"\nmsgstr \"מס' הודעות\"\n\n#: models.py:68\nmsgid \"Headline\"\nmsgstr \"\"\n\n#: models.py:73 models.py:136 models.py:182 templates/pybb/forum_list.html:8\nmsgid \"Forum\"\nmsgstr \"פורום\"\n\n#: models.py:74\nmsgid \"Forums\"\nmsgstr \"פורומים\"\n\n#: models.py:129\nmsgid \"be notified only when a new topic is added\"\nmsgstr \"\"\n\n#: models.py:130\nmsgid \"be auto-subscribed to topics\"\nmsgstr \"\"\n\n#: models.py:134\n#, fuzzy\n#| msgid \"Subscribers\"\nmsgid \"Subscriber\"\nmsgstr \"נרשמים\"\n\n#: models.py:138\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription type\"\nmsgstr \"הרשמה לאשכולות\"\n\n#: models.py:148\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription to forum\"\nmsgstr \"הרשמה לאשכולות\"\n\n#: models.py:149\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscriptions to forums\"\nmsgstr \"הרשמה לאשכולות\"\n\n#: models.py:177\nmsgid \"None\"\nmsgstr \"\"\n\n#: models.py:178\nmsgid \"Single answer\"\nmsgstr \"\"\n\n#: models.py:179\nmsgid \"Multiple answers\"\nmsgstr \"\"\n\n#: models.py:184 models.py:296\nmsgid \"Created\"\nmsgstr \"נוצר\"\n\n#: models.py:187\nmsgid \"Views count\"\nmsgstr \"מס' קריאות\"\n\n#: models.py:188 templates/pybb/topic_list.html:27\nmsgid \"Sticky\"\nmsgstr \"דביק\"\n\n#: models.py:189 templates/pybb/topic_list.html:28\nmsgid \"Closed\"\nmsgstr \"סגור\"\n\n#: models.py:191 templates/pybb/topic.html:88\nmsgid \"Subscribers\"\nmsgstr \"נרשמים\"\n\n#: models.py:194 models.py:299\n#, fuzzy\n#| msgid \"Moderators\"\nmsgid \"On moderation\"\nmsgstr \"מנהלים\"\n\n#: models.py:201 models.py:294 models.py:483 templates/pybb/topic_list.html:7\nmsgid \"Topic\"\nmsgstr \"אשכול\"\n\n#: models.py:202 templates/pybb/forum_list.html:11\n#: templates/pybb/user_topics.html:7\nmsgid \"Topics\"\nmsgstr \"אשכולות\"\n\n#: models.py:281\nmsgid \"HTML version\"\nmsgstr \"גרסת HTML\"\n\n#: models.py:282\nmsgid \"Text version\"\nmsgstr \"גרסת טקסט\"\n\n#: models.py:298\nmsgid \"User IP\"\nmsgstr \"IP משתמש\"\n\n#: models.py:303 models.py:386\nmsgid \"Post\"\nmsgstr \"הודעה\"\n\n#: models.py:304 templates/pybb/forum_list.html:14\n#: templates/pybb/topic.html:42 templates/pybb/topic_list.html:10\n#: templates/pybb/user_posts.html:7\nmsgid \"Posts\"\nmsgstr \"הודעות\"\n\n#: models.py:371\nmsgid \"Profile\"\nmsgstr \"פרופיל\"\n\n#: models.py:372\nmsgid \"Profiles\"\nmsgstr \"פרופילים\"\n\n#: models.py:383\nmsgid \"Attachment\"\nmsgstr \"קובץ מצורף\"\n\n#: models.py:384\n#, fuzzy\n#| msgid \"Attachment\"\nmsgid \"Attachments\"\nmsgstr \"קובץ מצורף\"\n\n#: models.py:387\nmsgid \"Size\"\nmsgstr \"גודל\"\n\n#: models.py:388\nmsgid \"File\"\nmsgstr \"\"\n\n#: models.py:438\nmsgid \"Topic read tracker\"\nmsgstr \"\"\n\n#: models.py:439\nmsgid \"Topic read trackers\"\nmsgstr \"\"\n\n#: models.py:476\nmsgid \"Forum read tracker\"\nmsgstr \"\"\n\n#: models.py:477\nmsgid \"Forum read trackers\"\nmsgstr \"\"\n\n#: models.py:484\nmsgid \"Text\"\nmsgstr \"\"\n\n#: models.py:487 models.py:506\nmsgid \"Poll answer\"\nmsgstr \"\"\n\n#: models.py:488\nmsgid \"Polls answers\"\nmsgstr \"\"\n\n#: models.py:511\nmsgid \"Poll answer user\"\nmsgstr \"\"\n\n#: models.py:512\nmsgid \"Polls answers users\"\nmsgstr \"\"\n\n#: models.py:535\n#, python-format\nmsgid \"\"\n\"After %(limit)s attemps, there is not any unique slug value for \\\"%(slug)s\\\"\"\nmsgstr \"\"\n\n#: profiles.py:34\nmsgid \"Signature\"\nmsgstr \"חתימה\"\n\n#: profiles.py:35\n#, fuzzy\nmsgid \"Signature HTML Version\"\nmsgstr \"גרסת HTML\"\n\n#: profiles.py:37\nmsgid \"Time zone\"\nmsgstr \"אזור זמן\"\n\n#: profiles.py:38\nmsgid \"Language\"\nmsgstr \"שפה\"\n\n#: profiles.py:40\nmsgid \"Show signatures\"\nmsgstr \"הראה חתימות\"\n\n#: profiles.py:42\nmsgid \"Avatar\"\nmsgstr \"אוואטר\"\n\n#: profiles.py:44\nmsgid \"Automatically subscribe\"\nmsgstr \"\"\n\n#: profiles.py:45\nmsgid \"Automatically subscribe to topics that you answer\"\nmsgstr \"\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#, fuzzy\n#| msgid \"Description\"\nmsgid \"Manage subscription\"\nmsgstr \"תיאור\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#: templates/pybb/topic.html:72\nmsgid \"Subscribe\"\nmsgstr \"הרשמה\"\n\n#: templates/pybb/_button_new_topic.html:1 templates/pybb/add_post.html:5\n#: templates/pybb/add_post.html.py:32\nmsgid \"New topic\"\nmsgstr \"אשכול חדש\"\n\n#: templates/pybb/_button_save.html:1\nmsgid \"Save\"\nmsgstr \"שמור\"\n\n#: templates/pybb/_button_submit.html:1\n#: templates/pybb/forum_subscription.html:33\nmsgid \"Submit\"\nmsgstr \"שלח\"\n\n#: templates/pybb/_markitup.html:25\n#: templates/pybb/markup/bbcode_widget.html:16\n#: templates/pybb/markup/markdown_widget.html:24\nmsgid \"Bold\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:26\n#: templates/pybb/markup/bbcode_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:25\nmsgid \"Italic\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:27\n#: templates/pybb/markup/bbcode_widget.html:18\nmsgid \"Underline\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:28\n#: templates/pybb/markup/bbcode_widget.html:19\nmsgid \"Stroke\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:30\n#: templates/pybb/markup/bbcode_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:32\n#, fuzzy\n#| msgid \"Signature\"\nmsgid \"Picture\"\nmsgstr \"חתימה\"\n\n#: templates/pybb/_markitup.html:31\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Link\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:33\n#: templates/pybb/markup/bbcode_widget.html:24\nmsgid \"Bulleted list\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:34\n#: templates/pybb/markup/bbcode_widget.html:25\nmsgid \"Numeric list\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:35\n#: templates/pybb/markup/bbcode_widget.html:26\nmsgid \"List item\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:37\n#: templates/pybb/markup/bbcode_widget.html:28\n#: templates/pybb/markup/markdown_widget.html:35\n#, fuzzy\n#| msgid \"quote\"\nmsgid \"Quotes\"\nmsgstr \"צטט\"\n\n#: templates/pybb/_markitup.html:38\n#: templates/pybb/markup/bbcode_widget.html:29\nmsgid \"Code\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:40\n#: templates/pybb/markup/bbcode_widget.html:31\nmsgid \"Clean\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:41\n#: templates/pybb/markup/bbcode_widget.html:32\n#: templates/pybb/markup/markdown_widget.html:38\nmsgid \"Preview\"\nmsgstr \"תצוגה מקדימה\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"Register\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"or\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"login\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"to create to post a reply\"\nmsgstr \"\"\n\n#: templates/pybb/add_post.html:5 templates/pybb/add_post.html.py:32\nmsgid \"New reply\"\nmsgstr \"תגובה חדשה\"\n\n#: templates/pybb/attachments_formset.html:6\n#, fuzzy\n#| msgid \"Attachment\"\nmsgid \"Add attachments\"\nmsgstr \"קובץ מצורף\"\n\n#: templates/pybb/attachments_formset.html:14\nmsgid \"\"\n\"If you need to upload larger files, please use an external storage website.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:14\n#, python-format\nmsgid \"(max size: %(max_size)s)\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:17\n#: templates/pybb/edit_profile.html:25\nmsgid \"delete\"\nmsgstr \"מחק\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Reference to your file\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Ref\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#: templates/pybb/topic.html:88 templates/pybb/topic_list.html:32\nmsgid \":\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"link\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"Insert a link to your file inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"image\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"Insert your image inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/breadcrumb.html:4\nmsgid \"Home\"\nmsgstr \"\"\n\n#: templates/pybb/delete_post.html:5\nmsgid \"Are you sure you want to delete this message?\"\nmsgstr \"האם אתה בטוח שאתה רוצה למחוק את ההודעה?\"\n\n#: templates/pybb/delete_post.html:12\nmsgid \"No, take me back\"\nmsgstr \"\"\n\n#: templates/pybb/delete_post.html:13\n#, fuzzy\n#| msgid \"Yes, I am sure.\"\nmsgid \"Yes, I am sure\"\nmsgstr \"כן, אני בטוח.\"\n\n#: templates/pybb/edit_post.html:4 templates/pybb/edit_post.html.py:17\nmsgid \"Editing the post\"\nmsgstr \"עורך את ההודעה\"\n\n#: templates/pybb/edit_privileges.html:5 templates/pybb/edit_privileges.html:8\nmsgid \"Grant moderator privileges\"\nmsgstr \"\"\n\n#: templates/pybb/edit_profile.html:5 templates/pybb/edit_profile.html.py:8\n#: templates/pybb/edit_profile.html:13\nmsgid \"Profile editing\"\nmsgstr \"עריכת פרופיל\"\n\n#: templates/pybb/edit_profile.html:18\nmsgid \"Subscriptions on topics\"\nmsgstr \"הרשמה לאשכולות\"\n\n#: templates/pybb/forum_list.html:17\nmsgid \"Last posts\"\nmsgstr \"הודעות אחרונות\"\n\n#: templates/pybb/forum_list.html:43\nmsgid \"No forums created\"\nmsgstr \"\"\n\n#: templates/pybb/forum_list.html:44\nmsgid \"Add forum now\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:4\n#, python-format\nmsgctxt \"page title\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:14\n#, python-format\nmsgctxt \"content heading\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:32\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:17\nmsgid \"Forum categories are not created\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:18\nmsgid \"Add a category now\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:22 templates/pybb/latest_topics.html:5\n#: templates/pybb/latest_topics.html:8 templates/pybb/latest_topics.html:15\n#, fuzzy\n#| msgid \"Last topics\"\nmsgid \"Last updates in topics\"\nmsgstr \"אשכולות אחרונות\"\n\n#: templates/pybb/index.html:23\nmsgid \"Mark all forums as read\"\nmsgstr \"\"\n\n#: templates/pybb/latest_topics.html:31\nmsgid \"Mark all topics as read\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:4\n#, python-format\nmsgid \"\"\n\"User %(username)s post a new topic in forum to which you are subscribed \"\n\"(%(forum_name)s).\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#, fuzzy\n#| msgid \"Stick topic\"\nmsgid \"Link to topic\"\nmsgstr \"דביק\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\nmsgid \"Link to forum\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\nmsgid \"\"\n\"If you don't want to receive notifications on new topics in this forum visit \"\n\"following link\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_subject.html:2\nmsgid \"New topic in forum that you subscribed.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:7\n#: templates/pybb/mail_templates/subscription_email_body.html:3\n#, python-format\nmsgid \"User %(username)s replied in topic to which you are subscribed.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:10\n#, python-format\nmsgid \"\"\n\"Follow %(link_post_start)sthis link%(link_end)s to see the new post on the \"\n\"topic %(link_topic_start)s%(topic_name)s%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:14\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new posts in this topic visit \"\n\"%(link_start)sthis link%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#, fuzzy\n#| msgid \"Editing the post\"\nmsgid \"Link to post\"\nmsgstr \"עורך את ההודעה\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:8\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new messages in this topic \"\n\"visit following link: %(delete_url_full)s\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_subject.html:2\nmsgid \"New answer in topic that you subscribed.\"\nmsgstr \"\"\n\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Your text to link here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\nmsgid \"First Level Heading\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:18\n#: templates/pybb/markup/markdown_widget.html:19\n#: templates/pybb/markup/markdown_widget.html:20\n#: templates/pybb/markup/markdown_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Your title here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:18\nmsgid \"Second Level Heading\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:19\nmsgid \"Heading 3\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:20\nmsgid \"Heading 4\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:21\nmsgid \"Heading 5\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Heading 6\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:27\nmsgid \"Bulleted List\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:28\nmsgid \"Numeric List\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:36\nmsgid \"Code Block / Code\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:7\nmsgid \"previous page\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:21\nmsgid \"next page\"\nmsgstr \"\"\n\n#: templates/pybb/poll.html:4\nmsgid \"Poll\"\nmsgstr \"\"\n\n#: templates/pybb/poll.html:36\nmsgid \"Cancel my poll vote\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:7\nmsgid \"Poll answers\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:20\nmsgid \"remove answer\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:21\nmsgid \"add answer\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:28\n#, python-format\nmsgid \"Rank: %(rank)s\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:41 templates/pybb/user.html:51\nmsgid \"Edit\"\nmsgstr \"ערוך\"\n\n#: templates/pybb/post_template.html:45\n#, fuzzy\nmsgid \"Delete post?\"\nmsgstr \"מחק\"\n\n#: templates/pybb/post_template.html:46\nmsgid \"Delete\"\nmsgstr \"מחק\"\n\n#: templates/pybb/post_template.html:49\nmsgid \"Approve post\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:53 templates/pybb/topic.html:62\n#, fuzzy\n#| msgid \"Admincp\"\nmsgid \"Admin\"\nmsgstr \"פאנל ניהול\"\n\n#: templates/pybb/post_template.html:69\nmsgid \"Edited\"\nmsgstr \"נערך\"\n\n#: templates/pybb/post_template.html:83\nmsgid \"quote\"\nmsgstr \"צטט\"\n\n#: templates/pybb/post_template.html:84\nmsgid \"quote selected\"\nmsgstr \"\"\n\n#: templates/pybb/topic.html:51\nmsgid \"Unstick topic\"\nmsgstr \"בטל דביק\"\n\n#: templates/pybb/topic.html:53\nmsgid \"Stick topic\"\nmsgstr \"דביק\"\n\n#: templates/pybb/topic.html:57\nmsgid \"Open topic\"\nmsgstr \"פתח אשכול\"\n\n#: templates/pybb/topic.html:59\nmsgid \"Close topic\"\nmsgstr \"סגור אשכול\"\n\n#: templates/pybb/topic.html:70\nmsgid \"Unsubscribe\"\nmsgstr \"ביטול הרשמה\"\n\n#: templates/pybb/topic_list.html:13\n#, fuzzy\n#| msgid \"Views count\"\nmsgid \"Views\"\nmsgstr \"מס' קריאות\"\n\n#: templates/pybb/topic_list.html:16\n#, fuzzy\n#| msgid \"Last posts\"\nmsgid \"Last post\"\nmsgstr \"הודעות אחרונות\"\n\n#: templates/pybb/topic_list.html:26\nmsgid \"Go to first unread post\"\nmsgstr \"\"\n\n#: templates/pybb/topic_list.html:32\n#, fuzzy\nmsgid \"pages\"\nmsgstr \"הודעה\"\n\n#: templates/pybb/user.html:16\nmsgid \"Statistics\"\nmsgstr \"סטטיסטיקה\"\n\n#: templates/pybb/user.html:19\n#, fuzzy, python-format\n#| msgid \"Number of topics\"\nmsgid \"Number of topics: %(count)s\"\nmsgstr \"מס' אשכולות\"\n\n#: templates/pybb/user.html:24\n#, fuzzy, python-format\n#| msgid \"Number of posts\"\nmsgid \"Number of posts: %(count)s\"\nmsgstr \"מס' הודעות\"\n\n#: templates/pybb/user.html:29\n#, fuzzy, python-format\n#| msgid \"Date of registration\"\nmsgid \"Date of registration: %(date_joined)s \"\nmsgstr \"תאריך הרשמה\"\n\n#: templates/pybb/user.html:36\n#, fuzzy\n#| msgid \"Moderators\"\nmsgid \"Moderator\"\nmsgstr \"מנהלים\"\n\n#: templates/pybb/user.html:41\nmsgid \"Block\"\nmsgstr \"\"\n\n#: templates/pybb/user.html:42\nmsgid \"Block and delete all messages\"\nmsgstr \"\"\n\n#: templates/pybb/user.html:46\nmsgid \"Unblock\"\nmsgstr \"\"\n\n#: templates/pybb/user_posts.html:12 templates/pybb/user_posts.html.py:17\nmsgid \"All posts created by\"\nmsgstr \"\"\n\n#: templates/pybb/user_topics.html:12 templates/pybb/user_topics.html.py:17\nmsgid \"All topics created by\"\nmsgstr \"\"\n\n#: templates/pybb/users.html:8 templates/pybb/users.html.py:24\nmsgid \"Users\"\nmsgstr \"משתמשים\"\n\n#: templates/pybb/users.html:12\nmsgid \"Search\"\nmsgstr \"חיפוש\"\n\n#: templatetags/pybb_tags.py:61\n#, fuzzy, python-format\n#| msgid \"seconds ago\"\nmsgid \"%d second ago\"\nmsgid_plural \"%d seconds ago\"\nmsgstr[0] \"שניות\"\nmsgstr[1] \"שניות\"\n\n#: templatetags/pybb_tags.py:65\n#, fuzzy, python-format\n#| msgid \"minutes ago\"\nmsgid \"%d minute ago\"\nmsgid_plural \"%d minutes ago\"\nmsgstr[0] \"דקות\"\nmsgstr[1] \"דקות\"\n\n#: templatetags/pybb_tags.py:75\n#, python-format\nmsgid \"today, %s\"\nmsgstr \"היום, %s\"\n\n#: templatetags/pybb_tags.py:77\n#, python-format\nmsgid \"yesterday, %s\"\nmsgstr \"אתמול, %s\"\n\n#: util.py:140\nmsgid \"Can't get profile for anonymous user\"\nmsgstr \"\"\n\n#: views.py:156\n#, fuzzy\n#| msgid \"User with login %s does not exist\"\nmsgid \"Forum does not exist\"\nmsgstr \"משתמש עם השם %s לא קיים\"\n\n#: views.py:388\n#, fuzzy\n#| msgid \"User with login %s does not exist\"\nmsgid \"This topic does not exists\"\nmsgstr \"משתמש עם השם %s לא קיים\"\n\n#: views.py:826\nmsgid \"\"\n\"Subscription removed. You will not receive emails from this topic unless you \"\n\"subscribe or post again.\"\nmsgstr \"\"\n\n#: views.py:837\nmsgid \"\"\n\"Subscription added. You will receive email notifications for replies to this \"\n\"topic.\"\nmsgstr \"\"\n\n#: views.py:855\nmsgid \"All forums marked as read\"\nmsgstr \"\"\n\n#: views.py:888\nmsgid \"User successfuly blocked\"\nmsgstr \"\"\n\n#: views.py:901\nmsgid \"User successfuly unblocked\"\nmsgstr \"\"\n\n#: views.py:939\nmsgid \"Privileges updated\"\nmsgstr \"\"\n\n#~ msgid \"IM\"\n#~ msgstr \"IM\"\n\n#, fuzzy\n#~ msgid \"Ban options\"\n#~ msgstr \"אפשרויות נוספות\"\n\n#~ msgid \"Markup\"\n#~ msgstr \"שפת סימון\"\n\n#, fuzzy\n#~ msgid \"Caution\"\n#~ msgstr \"מיקום\"\n\n#~ msgid \"Site\"\n#~ msgstr \"אתר\"\n\n#~ msgid \"Jabber\"\n#~ msgstr \"Jabber\"\n\n#~ msgid \"ICQ\"\n#~ msgstr \"ICQ\"\n\n#~ msgid \"MSN\"\n#~ msgstr \"MSN\"\n\n#~ msgid \"AIM\"\n#~ msgstr \"AIM\"\n\n#~ msgid \"Yahoo\"\n#~ msgstr \"Yahoo\"\n\n#~ msgid \"Location\"\n#~ msgstr \"מיקום\"\n\n#~ msgid \"Default markup\"\n#~ msgstr \"שפת סימון ברירת מחדל\"\n\n#~ msgid \"Time\"\n#~ msgstr \"זמן\"\n\n#~ msgid \"Read\"\n#~ msgstr \"קריאה\"\n\n#~ msgid \"Reads\"\n#~ msgstr \"קריאות\"\n\n#~ msgid \"Content type\"\n#~ msgstr \"סוג התוכן\"\n\n#~ msgid \"Path\"\n#~ msgstr \"כתובת\"\n\n#~ msgid \"Hash\"\n#~ msgstr \"תצריף\"\n\n#~ msgid \"\"\n#~ \"New reply from %(username)s to topic that you have subscribed on.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"See topic: %(post_url)s\\n\"\n#~ \"Unsubscribe %(unsubscribe_url)s\"\n#~ msgstr \"\"\n#~ \"הודעה חדשה מ %(username)s באשכול שנרשמת אליו.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"צפה באשכול: %(post_url)s\\n\"\n#~ \"בטל הרשמה %(unsubscribe_url)s\"\n\n#~ msgid \"Root\"\n#~ msgstr \"בית\"\n\n#~ msgid \"New private message\"\n#~ msgstr \"הודעה פרטית חדשה\"\n\n#~ msgid \"Change the password\"\n#~ msgstr \"שנה את הסיסמה\"\n\n#~ msgid \"PYBB - django forum engine\"\n#~ msgstr \"PYBB - django forum engine\"\n\n#~ msgid \"Important\"\n#~ msgstr \"חשוב\"\n\n#~ msgid \"My profile\"\n#~ msgstr \"הפרופיל שלי\"\n\n#~ msgid \"Log out\"\n#~ msgstr \"התנתק\"\n\n#~ msgid \"Logged in as \"\n#~ msgstr \"מחובר בתור\"\n\n#~ msgid \"Sign up\"\n#~ msgstr \"הרשם\"\n\n#~ msgid \"Log in\"\n#~ msgstr \"התחבר\"\n\n#~ msgid \"Search powered by Google\"\n#~ msgstr \"Search powered by Google\"\n\n#, fuzzy\n#~ msgid \"Merge\"\n#~ msgstr \"הודעה\"\n\n#~ msgid \"of\"\n#~ msgstr \"מתוך\"\n\n#, fuzzy\n#~ msgid \"Find all topics\"\n#~ msgstr \"אשכולות אחרונות\"\n\n#~ msgid \"Contacts\"\n#~ msgstr \"אנשי קשר\"\n\n#~ msgid \"seconds ago,seconds ago,seconds ago\"\n#~ msgstr \"שניות,שניות,שניות\"\n\n#~ msgid \"minutes ago,minutes ago,minutes ago\"\n#~ msgstr \"דקות,דקות,דקות\"\n\n#~ msgid \"Recipient\"\n#~ msgstr \"נמען\"\n\n#~ msgid \"Inbox\"\n#~ msgstr \"דואר נכנס\"\n\n#~ msgid \"Outbox\"\n#~ msgstr \"דואר יוצא\"\n\n#, fuzzy\n#~ msgid \"Trash\"\n#~ msgstr \"תצריף\"\n\n#~ msgid \"Author\"\n#~ msgstr \"מאת\"\n\n#~ msgid \"Private message\"\n#~ msgstr \"הודעה פרטית\"\n\n#~ msgid \"Private messages\"\n#~ msgstr \"הודעות פרטיות\"\n\n#, fuzzy\n#~ msgid \"Messagebox\"\n#~ msgstr \"הודעה\"\n\n#~ msgid \"\"\n#~ \"User %(username)s have sent your the new private message.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"See message online: %(pm_url)s\"\n#~ msgstr \"\"\n#~ \"המשתמש %(username)s שלח לך הודעה פרטית חדשה\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"צפה בהודעה: %(pm_url)s\"\n\n#~ msgid \"New private message for you\"\n#~ msgstr \"הודעה פרטית חדשה לך\"\n\n#~ msgid \"PM\"\n#~ msgstr \"הודעה פרטית\"\n\n#~ msgid \"Send PM\"\n#~ msgstr \"שלח הודעה פרטית\"\n\n#, fuzzy\n#~ msgid \"Select messages:\"\n#~ msgstr \"הודעות פרטיות\"\n\n#, fuzzy\n#~ msgid \"Read messages\"\n#~ msgstr \"הודעות פרטיות\"\n\n#, fuzzy\n#~ msgid \"Unread messages\"\n#~ msgstr \"הודעות פרטיות\"\n\n#~ msgid \"Message from\"\n#~ msgstr \"הודעה מאת\"\n\n#~ msgid \"Message for\"\n#~ msgstr \"הודעה עבור\"\n\n#~ msgid \"Reply\"\n#~ msgstr \"תגובה\"\n\n#~ msgid \"to\"\n#~ msgstr \"אל\"\n\n#, fuzzy\n#~ msgid \"Are you sure you want to delete these messages?\"\n#~ msgstr \"האם אתה בטוח שאתה רוצה למחוק את ההודעה?\"\n\n#, fuzzy\n#~ msgid \"From\"\n#~ msgstr \"מאת\"\n\n#, fuzzy\n#~ msgid \"Sent messages\"\n#~ msgstr \"הודעות פרטיות\"\n\n#~ msgid \"outbox\"\n#~ msgstr \"דואר יוצא\"\n\n#, fuzzy\n#~ msgid \"inbox\"\n#~ msgstr \"דואר נכנס\"\n\n#, fuzzy\n#~ msgid \"Are you sure you want to delete this post?\"\n#~ msgstr \"האם אתה בטוח שאתה רוצה למחוק את ההודעה?\"\n\n#~ msgid \"Back\"\n#~ msgstr \"אחורה\"\n\n#~ msgid \"Forward\"\n#~ msgstr \"העבר\"\n\n#~ msgid \"Are you sure you want to subscribe to this topic?\"\n#~ msgstr \"האם אתה בטוח שאתה רוצה להרשם לאשכול זה?\"\n\n#~ msgid \"Are you sure you want to close this topic?\"\n#~ msgstr \"האם אתה בטוח שאתה רוצה לסגור את האשכול?\"\n\n#~ msgid \"Are you sure you want to unsubscribe to this topic?\"\n#~ msgstr \"האם אתה בטוח שאתה רוצה לבטל את ההרשמה לאשכול זה?\"\n\n#~ msgid \"Are you sure you want to open this topic?\"\n#~ msgstr \"האם אתה בטוח שאתה רוצה לפתוח את האשכול?\"\n\n#~ msgid \"Are you sure you want to stick this topic?\"\n#~ msgstr \"האם אתה בטוח שאתה רוצה להפוך את האשכול לדביק?\"\n\n#~ msgid \"Are you sure you want to unstick this topic?\"\n#~ msgstr \"האם אתה בטוח שאתה רוצה לבטל את הדביק לאשכול זה?\"\n"
  },
  {
    "path": "pybb/locale/it/LC_MESSAGES/django.po",
    "content": "# Italian translation for the pybbm form.\n# Copyright (C) 2014 Andrea Magatti\n# This file is distributed under the same license as the pybbm package.\n# Andrea Magatti <andrea.magatti@gmail.com>, 2014.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pybbm\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-01-11 14:06+0100\\n\"\n\"PO-Revision-Date: 2017-01-11 14:15+0100\\n\"\n\"Last-Translator: DylannCordel <d.cordel@webu.coop>\\n\"\n\"Language-Team: Italina <LL@li.org>\\n\"\n\"Language: it\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Generator: Poedit 1.6.10\\n\"\n\n#: admin.py:45 admin.py:84 admin.py:112 admin.py:134\nmsgid \"Additional options\"\nmsgstr \"Azioni aggiuntive\"\n\n#: admin.py:117 models.py:280\nmsgid \"Message\"\nmsgstr \"Post\"\n\n#: admin.py:148\nmsgid \"View post\"\nmsgstr \"Visualizza post\"\n\n#: admin.py:153\nmsgid \"Edit post\"\nmsgstr \"Modifica il post\"\n\n#: apps.py:9\nmsgid \"Pybbm forum solution\"\nmsgstr \"\"\n\n#: feeds.py:27 feeds.py:28 templates/pybb/base.html:10\nmsgid \"Latest posts on forum\"\nmsgstr \"Ultimi post sul forum\"\n\n#: feeds.py:41 feeds.py:42 templates/pybb/base.html:11\nmsgid \"Latest topics on forum\"\nmsgstr \"Ultimi Topic sul forum\"\n\n#: forms.py:30\nmsgid \"Attachment is too big\"\nmsgstr \"Allegato troppo pesante\"\n\n#: forms.py:48\n#, python-format\nmsgid \"You cant add more than %s answers for poll\"\nmsgstr \"Non è possibile aggiungere più di %s risposte al sondaggio\"\n\n#: forms.py:50\nmsgid \"Add two or more answers for this poll\"\nmsgstr \"Aggiungi due o più risposte a questo sondaggio\"\n\n#: forms.py:58 models.py:183\nmsgid \"Subject\"\nmsgstr \"Soggetto\"\n\n#: forms.py:59 models.py:195\nmsgid \"Poll type\"\nmsgstr \"Tipo di sondaggio\"\n\n#: forms.py:61 models.py:196\nmsgid \"Poll question\"\nmsgstr \"Domanda del sondaggio\"\n\n#: forms.py:64\n#, fuzzy\n#| msgid \"Topics\"\nmsgid \"Topic slug\"\nmsgstr \"Topic\"\n\n#: forms.py:123\nmsgid \"Polls question is required when adding a poll\"\nmsgstr \"E' richiesta almeno una domanda per un sondaggio\"\n\n#: forms.py:176 models.py:186 models.py:295 models.py:368 models.py:507\nmsgid \"User\"\nmsgstr \"Utente\"\n\n#: forms.py:212\n#, python-format\nmsgid \"Avatar is too large, max size: %s bytes\"\nmsgstr \"Avatar toppo grande, dimensione massima %s bytes\"\n\n#: forms.py:272\nmsgid \"be unsubscribe from this forum\"\nmsgstr \"\"\n\n#: forms.py:277\nmsgid \"You want to\"\nmsgstr \"\"\n\n#: forms.py:281\n#, fuzzy\n#| msgid \"New topic\"\nmsgid \"only new topics\"\nmsgstr \"Nuovo topic\"\n\n#: forms.py:282\n#, fuzzy\n#| msgid \"Latest topics on forum\"\nmsgid \"all topics of the forum\"\nmsgstr \"Ultimi Topic sul forum\"\n\n#: forms.py:285\n#, fuzzy\n#| msgid \"Close topic\"\nmsgid \"Concerned topics\"\nmsgstr \"Chiudi un topic\"\n\n#: models.py:23 models.py:59\nmsgid \"Name\"\nmsgstr \"Nome\"\n\n#: models.py:24 models.py:60\nmsgid \"Position\"\nmsgstr \"Posizione\"\n\n#: models.py:25 models.py:66 templates/pybb/category.html:4\n#: templates/pybb/forum_list.html:26\nmsgid \"Hidden\"\nmsgstr \"Nascosto\"\n\n#: models.py:26\nmsgid \"If checked, this category will be visible only for staff\"\nmsgstr \"Se selezionato questa categoria darà visibile solo allo Staff\"\n\n#: models.py:27 models.py:69 models.py:197\nmsgid \"Slug\"\nmsgstr \"\"\n\n#: models.py:31 models.py:56\nmsgid \"Category\"\nmsgstr \"Categoria\"\n\n#: models.py:32\nmsgid \"Categories\"\nmsgstr \"Categoria\"\n\n#: models.py:57\nmsgid \"Parent forum\"\nmsgstr \"Forum padre\"\n\n#: models.py:61\nmsgid \"Description\"\nmsgstr \"Descrizione\"\n\n#: models.py:62\nmsgid \"Moderators\"\nmsgstr \"Moderatori\"\n\n#: models.py:63 models.py:185 models.py:297\nmsgid \"Updated\"\nmsgstr \"Aggiornato\"\n\n#: models.py:64 models.py:192 profiles.py:41\nmsgid \"Post count\"\nmsgstr \"Numero dei post\"\n\n#: models.py:65\nmsgid \"Topic count\"\nmsgstr \"Numero dei topic\"\n\n#: models.py:68\nmsgid \"Headline\"\nmsgstr \"Titolo\"\n\n#: models.py:73 models.py:136 models.py:182 templates/pybb/forum_list.html:8\nmsgid \"Forum\"\nmsgstr \"Forum\"\n\n#: models.py:74\nmsgid \"Forums\"\nmsgstr \"Forum\"\n\n#: models.py:129\nmsgid \"be notified only when a new topic is added\"\nmsgstr \"\"\n\n#: models.py:130\nmsgid \"be auto-subscribed to topics\"\nmsgstr \"\"\n\n#: models.py:134\n#, fuzzy\n#| msgid \"Subscribers\"\nmsgid \"Subscriber\"\nmsgstr \"Sottoscrittori\"\n\n#: models.py:138\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription type\"\nmsgstr \"Sottoscrizioni ai post\"\n\n#: models.py:148\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription to forum\"\nmsgstr \"Sottoscrizioni ai post\"\n\n#: models.py:149\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscriptions to forums\"\nmsgstr \"Sottoscrizioni ai post\"\n\n#: models.py:177\nmsgid \"None\"\nmsgstr \"Nessuno\"\n\n#: models.py:178\nmsgid \"Single answer\"\nmsgstr \"Risposta singola\"\n\n#: models.py:179\nmsgid \"Multiple answers\"\nmsgstr \"Risposte multiple\"\n\n#: models.py:184 models.py:296\nmsgid \"Created\"\nmsgstr \"Creato\"\n\n#: models.py:187\nmsgid \"Views count\"\nmsgstr \"Conteggio visualizzazioni\"\n\n#: models.py:188 templates/pybb/topic_list.html:27\nmsgid \"Sticky\"\nmsgstr \"In evidenza\"\n\n#: models.py:189 templates/pybb/topic_list.html:28\nmsgid \"Closed\"\nmsgstr \"Chiuso\"\n\n#: models.py:191 templates/pybb/topic.html:88\nmsgid \"Subscribers\"\nmsgstr \"Sottoscrittori\"\n\n#: models.py:194 models.py:299\nmsgid \"On moderation\"\nmsgstr \"Moderato\"\n\n#: models.py:201 models.py:294 models.py:483 templates/pybb/topic_list.html:7\nmsgid \"Topic\"\nmsgstr \"Topic\"\n\n#: models.py:202 templates/pybb/forum_list.html:11\n#: templates/pybb/user_topics.html:7\nmsgid \"Topics\"\nmsgstr \"Topic\"\n\n#: models.py:281\nmsgid \"HTML version\"\nmsgstr \"Versione HTML\"\n\n#: models.py:282\nmsgid \"Text version\"\nmsgstr \"Versione Testuale\"\n\n#: models.py:298\nmsgid \"User IP\"\nmsgstr \"IO utente\"\n\n#: models.py:303 models.py:386\nmsgid \"Post\"\nmsgstr \"Post\"\n\n#: models.py:304 templates/pybb/forum_list.html:14\n#: templates/pybb/topic.html:42 templates/pybb/topic_list.html:10\n#: templates/pybb/user_posts.html:7\nmsgid \"Posts\"\nmsgstr \"Post\"\n\n#: models.py:371\nmsgid \"Profile\"\nmsgstr \"Profilo\"\n\n#: models.py:372\nmsgid \"Profiles\"\nmsgstr \"Profili\"\n\n#: models.py:383\nmsgid \"Attachment\"\nmsgstr \"Allegato\"\n\n#: models.py:384\nmsgid \"Attachments\"\nmsgstr \"Allegati\"\n\n#: models.py:387\nmsgid \"Size\"\nmsgstr \"Dimensione\"\n\n#: models.py:388\nmsgid \"File\"\nmsgstr \"File\"\n\n#: models.py:438\nmsgid \"Topic read tracker\"\nmsgstr \"Contatore dei topic letti\"\n\n#: models.py:439\nmsgid \"Topic read trackers\"\nmsgstr \"Contatori dei topic letti\"\n\n#: models.py:476\nmsgid \"Forum read tracker\"\nmsgstr \"Contatore dei forum letti\"\n\n#: models.py:477\nmsgid \"Forum read trackers\"\nmsgstr \"Contatore dei forum letti\"\n\n#: models.py:484\nmsgid \"Text\"\nmsgstr \"Testo\"\n\n#: models.py:487 models.py:506\nmsgid \"Poll answer\"\nmsgstr \"Risposta al sondaggio\"\n\n#: models.py:488\nmsgid \"Polls answers\"\nmsgstr \"Risposte al sondaggio\"\n\n#: models.py:511\nmsgid \"Poll answer user\"\nmsgstr \"Utente della risposta al sondaggio\"\n\n#: models.py:512\nmsgid \"Polls answers users\"\nmsgstr \"Utente delle risposte al sondaggio\"\n\n#: models.py:535\n#, python-format\nmsgid \"\"\n\"After %(limit)s attemps, there is not any unique slug value for \\\"%(slug)s\\\"\"\nmsgstr \"\"\n\n#: profiles.py:34\nmsgid \"Signature\"\nmsgstr \"Firma\"\n\n#: profiles.py:35\nmsgid \"Signature HTML Version\"\nmsgstr \"Versione HTML della firma\"\n\n#: profiles.py:37\nmsgid \"Time zone\"\nmsgstr \"Fuso Orario\"\n\n#: profiles.py:38\nmsgid \"Language\"\nmsgstr \"Lingua\"\n\n#: profiles.py:40\nmsgid \"Show signatures\"\nmsgstr \"Mostra le firme\"\n\n#: profiles.py:42\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\n#: profiles.py:44\nmsgid \"Automatically subscribe\"\nmsgstr \"Segui automaticamente\"\n\n#: profiles.py:45\nmsgid \"Automatically subscribe to topics that you answer\"\nmsgstr \"Segui automaticamente I topic a cui rispondi\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#, fuzzy\n#| msgid \"Description\"\nmsgid \"Manage subscription\"\nmsgstr \"Descrizione\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#: templates/pybb/topic.html:72\nmsgid \"Subscribe\"\nmsgstr \"Seguire\"\n\n#: templates/pybb/_button_new_topic.html:1 templates/pybb/add_post.html:5\n#: templates/pybb/add_post.html.py:32\nmsgid \"New topic\"\nmsgstr \"Nuovo topic\"\n\n#: templates/pybb/_button_save.html:1\nmsgid \"Save\"\nmsgstr \"Salva\"\n\n#: templates/pybb/_button_submit.html:1\n#: templates/pybb/forum_subscription.html:33\nmsgid \"Submit\"\nmsgstr \"Invia\"\n\n#: templates/pybb/_markitup.html:25\n#: templates/pybb/markup/bbcode_widget.html:16\n#: templates/pybb/markup/markdown_widget.html:24\nmsgid \"Bold\"\nmsgstr \"Grassetto\"\n\n#: templates/pybb/_markitup.html:26\n#: templates/pybb/markup/bbcode_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:25\nmsgid \"Italic\"\nmsgstr \"Italico\"\n\n#: templates/pybb/_markitup.html:27\n#: templates/pybb/markup/bbcode_widget.html:18\nmsgid \"Underline\"\nmsgstr \"Sottolineato\"\n\n#: templates/pybb/_markitup.html:28\n#: templates/pybb/markup/bbcode_widget.html:19\nmsgid \"Stroke\"\nmsgstr \"Segnato\"\n\n#: templates/pybb/_markitup.html:30\n#: templates/pybb/markup/bbcode_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:32\nmsgid \"Picture\"\nmsgstr \"Immagine\"\n\n#: templates/pybb/_markitup.html:31\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Link\"\nmsgstr \"Collegamento\"\n\n#: templates/pybb/_markitup.html:33\n#: templates/pybb/markup/bbcode_widget.html:24\nmsgid \"Bulleted list\"\nmsgstr \"Lista puntata\"\n\n#: templates/pybb/_markitup.html:34\n#: templates/pybb/markup/bbcode_widget.html:25\nmsgid \"Numeric list\"\nmsgstr \"Lista numerata\"\n\n#: templates/pybb/_markitup.html:35\n#: templates/pybb/markup/bbcode_widget.html:26\nmsgid \"List item\"\nmsgstr \"Item della lista\"\n\n#: templates/pybb/_markitup.html:37\n#: templates/pybb/markup/bbcode_widget.html:28\n#: templates/pybb/markup/markdown_widget.html:35\nmsgid \"Quotes\"\nmsgstr \"Citazioni\"\n\n#: templates/pybb/_markitup.html:38\n#: templates/pybb/markup/bbcode_widget.html:29\nmsgid \"Code\"\nmsgstr \"Codice\"\n\n#: templates/pybb/_markitup.html:40\n#: templates/pybb/markup/bbcode_widget.html:31\nmsgid \"Clean\"\nmsgstr \"Cancella\"\n\n#: templates/pybb/_markitup.html:41\n#: templates/pybb/markup/bbcode_widget.html:32\n#: templates/pybb/markup/markdown_widget.html:38\nmsgid \"Preview\"\nmsgstr \"Antprima\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"Register\"\nmsgstr \"Registrazione\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"or\"\nmsgstr \"o\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"login\"\nmsgstr \"login\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"to create to post a reply\"\nmsgstr \"per creare o lasciare una risposta\"\n\n#: templates/pybb/add_post.html:5 templates/pybb/add_post.html.py:32\nmsgid \"New reply\"\nmsgstr \"Nuova risposta\"\n\n#: templates/pybb/attachments_formset.html:6\nmsgid \"Add attachments\"\nmsgstr \"Aggiungi allegati\"\n\n#: templates/pybb/attachments_formset.html:14\nmsgid \"\"\n\"If you need to upload larger files, please use an external storage website.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:14\n#, python-format\nmsgid \"(max size: %(max_size)s)\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:17\n#: templates/pybb/edit_profile.html:25\nmsgid \"delete\"\nmsgstr \"eliminare\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Reference to your file\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Ref\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#: templates/pybb/topic.html:88 templates/pybb/topic_list.html:32\nmsgid \":\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"link\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"Insert a link to your file inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"image\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"Insert your image inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/breadcrumb.html:4\nmsgid \"Home\"\nmsgstr \"Home\"\n\n#: templates/pybb/delete_post.html:5\nmsgid \"Are you sure you want to delete this message?\"\nmsgstr \"Vuoi davvero cancellare questo messaggio?\"\n\n#: templates/pybb/delete_post.html:12\nmsgid \"No, take me back\"\nmsgstr \"No, torna indietro\"\n\n#: templates/pybb/delete_post.html:13\nmsgid \"Yes, I am sure\"\nmsgstr \"SI, sono sicuro\"\n\n#: templates/pybb/edit_post.html:4 templates/pybb/edit_post.html.py:17\nmsgid \"Editing the post\"\nmsgstr \"Modificare il post\"\n\n#: templates/pybb/edit_privileges.html:5 templates/pybb/edit_privileges.html:8\nmsgid \"Grant moderator privileges\"\nmsgstr \"\"\n\n#: templates/pybb/edit_profile.html:5 templates/pybb/edit_profile.html.py:8\n#: templates/pybb/edit_profile.html:13\nmsgid \"Profile editing\"\nmsgstr \"Modificare il profilo\"\n\n#: templates/pybb/edit_profile.html:18\nmsgid \"Subscriptions on topics\"\nmsgstr \"Sottoscrizioni ai post\"\n\n#: templates/pybb/forum_list.html:17\nmsgid \"Last posts\"\nmsgstr \"Ultimi post\"\n\n#: templates/pybb/forum_list.html:43\nmsgid \"No forums created\"\nmsgstr \"Nessun forum creato\"\n\n#: templates/pybb/forum_list.html:44\nmsgid \"Add forum now\"\nmsgstr \"Aggiungi subito un forum\"\n\n#: templates/pybb/forum_subscription.html:4\n#, python-format\nmsgctxt \"page title\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Sottoscrizioni\"\n\n#: templates/pybb/forum_subscription.html:14\n#, python-format\nmsgctxt \"content heading\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Sottoscrizioni\"\n\n#: templates/pybb/forum_subscription.html:32\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:17\nmsgid \"Forum categories are not created\"\nmsgstr \"Le categorie dei forum non sono state create\"\n\n#: templates/pybb/index.html:18\nmsgid \"Add a category now\"\nmsgstr \"Aggiungi una categoria, adesso\"\n\n#: templates/pybb/index.html:22 templates/pybb/latest_topics.html:5\n#: templates/pybb/latest_topics.html:8 templates/pybb/latest_topics.html:15\nmsgid \"Last updates in topics\"\nmsgstr \"Ultimi aggiornamenti ai topic\"\n\n#: templates/pybb/index.html:23\nmsgid \"Mark all forums as read\"\nmsgstr \"Segna tutti i forum come letti\"\n\n#: templates/pybb/latest_topics.html:31\nmsgid \"Mark all topics as read\"\nmsgstr \"Segna tutti i post come letti\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:4\n#, python-format\nmsgid \"\"\n\"User %(username)s post a new topic in forum to which you are subscribed \"\n\"(%(forum_name)s).\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#, fuzzy\n#| msgid \"Link to topic:\"\nmsgid \"Link to topic\"\nmsgstr \"Collegamento al topic\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#, fuzzy\n#| msgid \"Link to post:\"\nmsgid \"Link to forum\"\nmsgstr \"Collegamento al post:\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#, fuzzy\n#| msgid \"\"\n#| \"If you don't want to recive notifications on new messages in this topic \"\n#| \"visit following link:\"\nmsgid \"\"\n\"If you don't want to receive notifications on new topics in this forum visit \"\n\"following link\"\nmsgstr \"\"\n\"Se non vuoi ricevere notifiche per i nuovi messaggi di questo topi segui \"\n\"questo link:\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_subject.html:2\n#, fuzzy\n#| msgid \"New answer in topic that you subscribed.\"\nmsgid \"New topic in forum that you subscribed.\"\nmsgstr \"Nuova risposta ad un topic che segui\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:7\n#: templates/pybb/mail_templates/subscription_email_body.html:3\n#, python-format\nmsgid \"User %(username)s replied in topic to which you are subscribed.\"\nmsgstr \"Utente %(username)s risposto a topic che segui\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:10\n#, python-format\nmsgid \"\"\n\"Follow %(link_post_start)sthis link%(link_end)s to see the new post on the \"\n\"topic %(link_topic_start)s%(topic_name)s%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:14\n#, fuzzy, python-format\n#| msgid \"\"\n#| \"If you don't want to recive notifications on new messages in this topic \"\n#| \"visit following link:\"\nmsgid \"\"\n\"If you don't want to receive notifications on new posts in this topic visit \"\n\"%(link_start)sthis link%(link_end)s.\"\nmsgstr \"\"\n\"Se non vuoi ricevere notifiche per i nuovi messaggi di questo topi segui \"\n\"questo link:\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:4\nmsgid \"Link to post\"\nmsgstr \"Collegamento al post\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:8\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new messages in this topic \"\n\"visit following link: %(delete_url_full)s\"\nmsgstr \"\"\n\"Se non vuoi ricevere notifiche per i nuovi messaggi di questo topi segui \"\n\"questo link: %(delete_url_full)s\"\n\n#: templates/pybb/mail_templates/subscription_email_subject.html:2\nmsgid \"New answer in topic that you subscribed.\"\nmsgstr \"Nuova risposta ad un topic che segui\"\n\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Your text to link here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\nmsgid \"First Level Heading\"\nmsgstr \"Titolo 1\"\n\n#: templates/pybb/markup/markdown_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:18\n#: templates/pybb/markup/markdown_widget.html:19\n#: templates/pybb/markup/markdown_widget.html:20\n#: templates/pybb/markup/markdown_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Your title here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:18\nmsgid \"Second Level Heading\"\nmsgstr \"Titolo 2\"\n\n#: templates/pybb/markup/markdown_widget.html:19\nmsgid \"Heading 3\"\nmsgstr \"Titolo 3\"\n\n#: templates/pybb/markup/markdown_widget.html:20\nmsgid \"Heading 4\"\nmsgstr \"Titolo 4\"\n\n#: templates/pybb/markup/markdown_widget.html:21\nmsgid \"Heading 5\"\nmsgstr \"Titolo 5\"\n\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Heading 6\"\nmsgstr \"Titolo 6\"\n\n#: templates/pybb/markup/markdown_widget.html:27\nmsgid \"Bulleted List\"\nmsgstr \"Lista puntata\"\n\n#: templates/pybb/markup/markdown_widget.html:28\nmsgid \"Numeric List\"\nmsgstr \"Lista numerata\"\n\n#: templates/pybb/markup/markdown_widget.html:36\nmsgid \"Code Block / Code\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:7\nmsgid \"previous page\"\nmsgstr \"pagina precedente\"\n\n#: templates/pybb/pagination.html:21\nmsgid \"next page\"\nmsgstr \"pagina succcessiva\"\n\n#: templates/pybb/poll.html:4\nmsgid \"Poll\"\nmsgstr \"Sondaggio\"\n\n#: templates/pybb/poll.html:36\nmsgid \"Cancel my poll vote\"\nmsgstr \"Elimina il mio voto al sondaggio\"\n\n#: templates/pybb/poll_edit_form.html:7\nmsgid \"Poll answers\"\nmsgstr \"Risposta al sondaggio\"\n\n#: templates/pybb/poll_edit_form.html:20\nmsgid \"remove answer\"\nmsgstr \"Cancella la risposta\"\n\n#: templates/pybb/poll_edit_form.html:21\nmsgid \"add answer\"\nmsgstr \"Aggiungi risposta\"\n\n#: templates/pybb/post_template.html:28\n#, python-format\nmsgid \"Rank: %(rank)s\"\nmsgstr \"Rango: %(rank)s\"\n\n#: templates/pybb/post_template.html:41 templates/pybb/user.html:51\nmsgid \"Edit\"\nmsgstr \"Modificare\"\n\n#: templates/pybb/post_template.html:45\nmsgid \"Delete post?\"\nmsgstr \"Eliminare il post?\"\n\n#: templates/pybb/post_template.html:46\nmsgid \"Delete\"\nmsgstr \"Eliminare\"\n\n#: templates/pybb/post_template.html:49\nmsgid \"Approve post\"\nmsgstr \"Appprovare il post\"\n\n#: templates/pybb/post_template.html:53 templates/pybb/topic.html:62\nmsgid \"Admin\"\nmsgstr \"Admin\"\n\n#: templates/pybb/post_template.html:69\nmsgid \"Edited\"\nmsgstr \"Modificato\"\n\n#: templates/pybb/post_template.html:83\nmsgid \"quote\"\nmsgstr \"citare\"\n\n#: templates/pybb/post_template.html:84\nmsgid \"quote selected\"\nmsgstr \"cita la selezione\"\n\n#: templates/pybb/topic.html:51\nmsgid \"Unstick topic\"\nmsgstr \"togli il topic da \\\"in evidenza\\\"\"\n\n#: templates/pybb/topic.html:53\nmsgid \"Stick topic\"\nmsgstr \"Metti in evidenza il topic\"\n\n#: templates/pybb/topic.html:57\nmsgid \"Open topic\"\nmsgstr \"Apri un topic\"\n\n#: templates/pybb/topic.html:59\nmsgid \"Close topic\"\nmsgstr \"Chiudi un topic\"\n\n#: templates/pybb/topic.html:70\nmsgid \"Unsubscribe\"\nmsgstr \"Smetti di seguire\"\n\n#: templates/pybb/topic_list.html:13\nmsgid \"Views\"\nmsgstr \"Visualizzazioni\"\n\n#: templates/pybb/topic_list.html:16\nmsgid \"Last post\"\nmsgstr \"Ultimo post\"\n\n#: templates/pybb/topic_list.html:26\nmsgid \"Go to first unread post\"\nmsgstr \"Vai al primo post non letto\"\n\n#: templates/pybb/topic_list.html:32\nmsgid \"pages\"\nmsgstr \"pagine\"\n\n#: templates/pybb/user.html:16\nmsgid \"Statistics\"\nmsgstr \"Statistiche\"\n\n#: templates/pybb/user.html:19\n#, python-format\nmsgid \"Number of topics: %(count)s\"\nmsgstr \"Numero di topic: %(count)s\"\n\n#: templates/pybb/user.html:24\n#, python-format\nmsgid \"Number of posts: %(count)s\"\nmsgstr \"Numero dei post: %(count)s\"\n\n#: templates/pybb/user.html:29\n#, python-format\nmsgid \"Date of registration: %(date_joined)s \"\nmsgstr \"Data di iscrizione: %(date_joined)s \"\n\n#: templates/pybb/user.html:36\nmsgid \"Moderator\"\nmsgstr \"Moderator\"\n\n#: templates/pybb/user.html:41\nmsgid \"Block\"\nmsgstr \"Bloccare\"\n\n#: templates/pybb/user.html:42\nmsgid \"Block and delete all messages\"\nmsgstr \"Blocca ed elimina tutti i messaggi\"\n\n#: templates/pybb/user.html:46\nmsgid \"Unblock\"\nmsgstr \"Sbloccare\"\n\n#: templates/pybb/user_posts.html:12 templates/pybb/user_posts.html.py:17\nmsgid \"All posts created by\"\nmsgstr \"Tutti i post create da\"\n\n#: templates/pybb/user_topics.html:12 templates/pybb/user_topics.html.py:17\nmsgid \"All topics created by\"\nmsgstr \"Tutti i topic create da\"\n\n#: templates/pybb/users.html:8 templates/pybb/users.html.py:24\nmsgid \"Users\"\nmsgstr \"Utenti\"\n\n#: templates/pybb/users.html:12\nmsgid \"Search\"\nmsgstr \"Ricerca\"\n\n#: templatetags/pybb_tags.py:61\n#, fuzzy, python-format\n#| msgid \"seconds ago\"\nmsgid \"%d second ago\"\nmsgid_plural \"%d seconds ago\"\nmsgstr[0] \"secondi fà\"\nmsgstr[1] \"secondi fà\"\n\n#: templatetags/pybb_tags.py:65\n#, fuzzy, python-format\n#| msgid \"minutes ago\"\nmsgid \"%d minute ago\"\nmsgid_plural \"%d minutes ago\"\nmsgstr[0] \"minuti fà\"\nmsgstr[1] \"minuti fà\"\n\n#: templatetags/pybb_tags.py:75\n#, python-format\nmsgid \"today, %s\"\nmsgstr \"oggi, %s\"\n\n#: templatetags/pybb_tags.py:77\n#, python-format\nmsgid \"yesterday, %s\"\nmsgstr \"ieri, %s\"\n\n#: util.py:140\nmsgid \"Can't get profile for anonymous user\"\nmsgstr \"Non posso determinare il profile di un utente anonimo\"\n\n#: views.py:156\n#, fuzzy\n#| msgid \"Forum categories are not created\"\nmsgid \"Forum does not exist\"\nmsgstr \"Le categorie dei forum non sono state create\"\n\n#: views.py:388\nmsgid \"This topic does not exists\"\nmsgstr \"\"\n\n#: views.py:826\nmsgid \"\"\n\"Subscription removed. You will not receive emails from this topic unless you \"\n\"subscribe or post again.\"\nmsgstr \"\"\n\n#: views.py:837\nmsgid \"\"\n\"Subscription added. You will receive email notifications for replies to this \"\n\"topic.\"\nmsgstr \"\"\n\n#: views.py:855\nmsgid \"All forums marked as read\"\nmsgstr \"Tutti I forum sono segnati come letti\"\n\n#: views.py:888\nmsgid \"User successfuly blocked\"\nmsgstr \"Utente bloccato con successo\"\n\n#: views.py:901\nmsgid \"User successfuly unblocked\"\nmsgstr \"Utente sbloccato con successo\"\n\n#: views.py:939\nmsgid \"Privileges updated\"\nmsgstr \"\"\n\n#~ msgid \"Subscribers:\"\n#~ msgstr \"Sottoscrittori:\"\n\n#~ msgid \"Rank\"\n#~ msgstr \"Classifica\"\n\n#~ msgid \"seconds ago,seconds ago,seconds ago\"\n#~ msgstr \"secondi fà\"\n\n#~ msgid \"minutes ago,minutes ago,minutes ago\"\n#~ msgstr \"minuti fà\"\n"
  },
  {
    "path": "pybb/locale/ja/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-01-11 14:06+0100\\n\"\n\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\n#: admin.py:45 admin.py:84 admin.py:112 admin.py:134\nmsgid \"Additional options\"\nmsgstr \"追加オプション\"\n\n#: admin.py:117 models.py:280\nmsgid \"Message\"\nmsgstr \"メッセージ\"\n\n#: admin.py:148\nmsgid \"View post\"\nmsgstr \"投稿を閲覧\"\n\n#: admin.py:153\nmsgid \"Edit post\"\nmsgstr \"投稿を編集\"\n\n#: apps.py:9\nmsgid \"Pybbm forum solution\"\nmsgstr \"\"\n\n#: feeds.py:27 feeds.py:28 templates/pybb/base.html:10\nmsgid \"Latest posts on forum\"\nmsgstr \"フォーラムの最新投稿\"\n\n#: feeds.py:41 feeds.py:42 templates/pybb/base.html:11\nmsgid \"Latest topics on forum\"\nmsgstr \"フォーラムの最新トピック\"\n\n#: forms.py:30\nmsgid \"Attachment is too big\"\nmsgstr \"添付ファイルが大きすぎます\"\n\n#: forms.py:48\n#, python-format\nmsgid \"You cant add more than %s answers for poll\"\nmsgstr \"投票に対して%s以上の回答を追加することはできません\"\n\n#: forms.py:50\nmsgid \"Add two or more answers for this poll\"\nmsgstr \"この投票に2つ以上の回答を追加する\"\n\n#: forms.py:58 models.py:183\nmsgid \"Subject\"\nmsgstr \"件名\"\n\n#: forms.py:59 models.py:195\nmsgid \"Poll type\"\nmsgstr \"投票タイプ\"\n\n#: forms.py:61 models.py:196\nmsgid \"Poll question\"\nmsgstr \"質問\"\n\n#: forms.py:64\n#, fuzzy\n#| msgid \"Topics\"\nmsgid \"Topic slug\"\nmsgstr \"トピック\"\n\n#: forms.py:123\nmsgid \"Polls question is required when adding a poll\"\nmsgstr \"質問内容は投票に必須の項目です\"\n\n#: forms.py:176 models.py:186 models.py:295 models.py:368 models.py:507\nmsgid \"User\"\nmsgstr \"ユーザ\"\n\n#: forms.py:212\n#, python-format\nmsgid \"Avatar is too large, max size: %s bytes\"\nmsgstr \"アバターが大きすぎます。最大サイズ:%sバイト\"\n\n#: forms.py:272\nmsgid \"be unsubscribe from this forum\"\nmsgstr \"\"\n\n#: forms.py:277\nmsgid \"You want to\"\nmsgstr \"\"\n\n#: forms.py:281\n#, fuzzy\n#| msgid \"New topic\"\nmsgid \"only new topics\"\nmsgstr \"新規トピック\"\n\n#: forms.py:282\n#, fuzzy\n#| msgid \"Latest topics on forum\"\nmsgid \"all topics of the forum\"\nmsgstr \"フォーラムの最新トピック\"\n\n#: forms.py:285\n#, fuzzy\n#| msgid \"Close topic\"\nmsgid \"Concerned topics\"\nmsgstr \"トピックを閉じる\"\n\n#: models.py:23 models.py:59\nmsgid \"Name\"\nmsgstr \"名前\"\n\n#: models.py:24 models.py:60\nmsgid \"Position\"\nmsgstr \"位置\"\n\n#: models.py:25 models.py:66 templates/pybb/category.html:4\n#: templates/pybb/forum_list.html:26\nmsgid \"Hidden\"\nmsgstr \"非表示\"\n\n#: models.py:26\nmsgid \"If checked, this category will be visible only for staff\"\nmsgstr \"このカテゴリをスタッフのみに公開する\"\n\n#: models.py:27 models.py:69 models.py:197\nmsgid \"Slug\"\nmsgstr \"\"\n\n#: models.py:31 models.py:56\nmsgid \"Category\"\nmsgstr \"カテゴリ\"\n\n#: models.py:32\nmsgid \"Categories\"\nmsgstr \"カテゴリ\"\n\n#: models.py:57\nmsgid \"Parent forum\"\nmsgstr \"親のフォーラム\"\n\n#: models.py:61\nmsgid \"Description\"\nmsgstr \"説明\"\n\n#: models.py:62\nmsgid \"Moderators\"\nmsgstr \"モデレータ\"\n\n#: models.py:63 models.py:185 models.py:297\nmsgid \"Updated\"\nmsgstr \"更新日時\"\n\n#: models.py:64 models.py:192 profiles.py:41\nmsgid \"Post count\"\nmsgstr \"投稿数\"\n\n#: models.py:65\nmsgid \"Topic count\"\nmsgstr \"トピック数\"\n\n#: models.py:68\nmsgid \"Headline\"\nmsgstr \"ヘッドライン\"\n\n#: models.py:73 models.py:136 models.py:182 templates/pybb/forum_list.html:8\nmsgid \"Forum\"\nmsgstr \"フォーラム\"\n\n#: models.py:74\nmsgid \"Forums\"\nmsgstr \"フォーラム\"\n\n#: models.py:129\nmsgid \"be notified only when a new topic is added\"\nmsgstr \"\"\n\n#: models.py:130\nmsgid \"be auto-subscribed to topics\"\nmsgstr \"\"\n\n#: models.py:134\n#, fuzzy\n#| msgid \"Subscribers\"\nmsgid \"Subscriber\"\nmsgstr \"購読者\"\n\n#: models.py:138\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription type\"\nmsgstr \"トピックの購読\"\n\n#: models.py:148\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription to forum\"\nmsgstr \"トピックの購読\"\n\n#: models.py:149\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscriptions to forums\"\nmsgstr \"トピックの購読\"\n\n#: models.py:177\nmsgid \"None\"\nmsgstr \"なし\"\n\n#: models.py:178\nmsgid \"Single answer\"\nmsgstr \"単一回答\"\n\n#: models.py:179\nmsgid \"Multiple answers\"\nmsgstr \"複数回答\"\n\n#: models.py:184 models.py:296\nmsgid \"Created\"\nmsgstr \"作成日時\"\n\n#: models.py:187\nmsgid \"Views count\"\nmsgstr \"閲覧数\"\n\n#: models.py:188 templates/pybb/topic_list.html:27\nmsgid \"Sticky\"\nmsgstr \"最上位表示\"\n\n#: models.py:189 templates/pybb/topic_list.html:28\nmsgid \"Closed\"\nmsgstr \"クローズ済み\"\n\n#: models.py:191 templates/pybb/topic.html:88\nmsgid \"Subscribers\"\nmsgstr \"購読者\"\n\n#: models.py:194 models.py:299\nmsgid \"On moderation\"\nmsgstr \"モデレーション中\"\n\n#: models.py:201 models.py:294 models.py:483 templates/pybb/topic_list.html:7\nmsgid \"Topic\"\nmsgstr \"トピック\"\n\n#: models.py:202 templates/pybb/forum_list.html:11\n#: templates/pybb/user_topics.html:7\nmsgid \"Topics\"\nmsgstr \"トピック\"\n\n#: models.py:281\nmsgid \"HTML version\"\nmsgstr \"HTML版\"\n\n#: models.py:282\nmsgid \"Text version\"\nmsgstr \"テキスト版\"\n\n#: models.py:298\nmsgid \"User IP\"\nmsgstr \"ユーザIP\"\n\n#: models.py:303 models.py:386\nmsgid \"Post\"\nmsgstr \"投稿\"\n\n#: models.py:304 templates/pybb/forum_list.html:14\n#: templates/pybb/topic.html:42 templates/pybb/topic_list.html:10\n#: templates/pybb/user_posts.html:7\nmsgid \"Posts\"\nmsgstr \"投稿\"\n\n#: models.py:371\nmsgid \"Profile\"\nmsgstr \"プロファイル\"\n\n#: models.py:372\nmsgid \"Profiles\"\nmsgstr \"プロファイル\"\n\n#: models.py:383\nmsgid \"Attachment\"\nmsgstr \"添付ファイル\"\n\n#: models.py:384\nmsgid \"Attachments\"\nmsgstr \"添付ファイル\"\n\n#: models.py:387\nmsgid \"Size\"\nmsgstr \"サイズ\"\n\n#: models.py:388\nmsgid \"File\"\nmsgstr \"ファイル\"\n\n#: models.py:438\nmsgid \"Topic read tracker\"\nmsgstr \"トピックのリード・トラッカー\"\n\n#: models.py:439\nmsgid \"Topic read trackers\"\nmsgstr \"トピックのリード・トラッカー\"\n\n#: models.py:476\nmsgid \"Forum read tracker\"\nmsgstr \"フォーラムのリード・トラッカー\"\n\n#: models.py:477\nmsgid \"Forum read trackers\"\nmsgstr \"フォーラムのリード・トラッカー\"\n\n#: models.py:484\nmsgid \"Text\"\nmsgstr \"テキスト\"\n\n#: models.py:487 models.py:506\nmsgid \"Poll answer\"\nmsgstr \"投票の選択肢\"\n\n#: models.py:488\nmsgid \"Polls answers\"\nmsgstr \"投票の選択肢\"\n\n#: models.py:511\nmsgid \"Poll answer user\"\nmsgstr \"回答ユーザ\"\n\n#: models.py:512\nmsgid \"Polls answers users\"\nmsgstr \"回答ユーザ\"\n\n#: models.py:535\n#, python-format\nmsgid \"\"\n\"After %(limit)s attemps, there is not any unique slug value for \\\"%(slug)s\\\"\"\nmsgstr \"\"\n\n#: profiles.py:34\nmsgid \"Signature\"\nmsgstr \"署名\"\n\n#: profiles.py:35\nmsgid \"Signature HTML Version\"\nmsgstr \"署名(HTML版)\"\n\n#: profiles.py:37\nmsgid \"Time zone\"\nmsgstr \"タイムゾーン\"\n\n#: profiles.py:38\nmsgid \"Language\"\nmsgstr \"言語\"\n\n#: profiles.py:40\nmsgid \"Show signatures\"\nmsgstr \"\"\n\n#: profiles.py:42\nmsgid \"Avatar\"\nmsgstr \"アバター\"\n\n#: profiles.py:44\nmsgid \"Automatically subscribe\"\nmsgstr \"自動購読\"\n\n#: profiles.py:45\nmsgid \"Automatically subscribe to topics that you answer\"\nmsgstr \"回答したトピックを自動購読\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#, fuzzy\n#| msgid \"Description\"\nmsgid \"Manage subscription\"\nmsgstr \"説明\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#: templates/pybb/topic.html:72\nmsgid \"Subscribe\"\nmsgstr \"購読する\"\n\n#: templates/pybb/_button_new_topic.html:1 templates/pybb/add_post.html:5\n#: templates/pybb/add_post.html.py:32\nmsgid \"New topic\"\nmsgstr \"新規トピック\"\n\n#: templates/pybb/_button_save.html:1\nmsgid \"Save\"\nmsgstr \"保存\"\n\n#: templates/pybb/_button_submit.html:1\n#: templates/pybb/forum_subscription.html:33\nmsgid \"Submit\"\nmsgstr \"送信\"\n\n#: templates/pybb/_markitup.html:25\n#: templates/pybb/markup/bbcode_widget.html:16\n#: templates/pybb/markup/markdown_widget.html:24\nmsgid \"Bold\"\nmsgstr \"ボールド\"\n\n#: templates/pybb/_markitup.html:26\n#: templates/pybb/markup/bbcode_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:25\nmsgid \"Italic\"\nmsgstr \"イタリック\"\n\n#: templates/pybb/_markitup.html:27\n#: templates/pybb/markup/bbcode_widget.html:18\nmsgid \"Underline\"\nmsgstr \"アンダーライン\"\n\n#: templates/pybb/_markitup.html:28\n#: templates/pybb/markup/bbcode_widget.html:19\nmsgid \"Stroke\"\nmsgstr \"ストローク\"\n\n#: templates/pybb/_markitup.html:30\n#: templates/pybb/markup/bbcode_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:32\nmsgid \"Picture\"\nmsgstr \"ピクチャ\"\n\n#: templates/pybb/_markitup.html:31\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Link\"\nmsgstr \"リンク\"\n\n#: templates/pybb/_markitup.html:33\n#: templates/pybb/markup/bbcode_widget.html:24\nmsgid \"Bulleted list\"\nmsgstr \"箇条書きリスト\"\n\n#: templates/pybb/_markitup.html:34\n#: templates/pybb/markup/bbcode_widget.html:25\nmsgid \"Numeric list\"\nmsgstr \"数字付きリスト\"\n\n#: templates/pybb/_markitup.html:35\n#: templates/pybb/markup/bbcode_widget.html:26\nmsgid \"List item\"\nmsgstr \"リスト項目\"\n\n#: templates/pybb/_markitup.html:37\n#: templates/pybb/markup/bbcode_widget.html:28\n#: templates/pybb/markup/markdown_widget.html:35\nmsgid \"Quotes\"\nmsgstr \"引用\"\n\n#: templates/pybb/_markitup.html:38\n#: templates/pybb/markup/bbcode_widget.html:29\nmsgid \"Code\"\nmsgstr \"コード\"\n\n#: templates/pybb/_markitup.html:40\n#: templates/pybb/markup/bbcode_widget.html:31\nmsgid \"Clean\"\nmsgstr \"消去\"\n\n#: templates/pybb/_markitup.html:41\n#: templates/pybb/markup/bbcode_widget.html:32\n#: templates/pybb/markup/markdown_widget.html:38\nmsgid \"Preview\"\nmsgstr \"プレビュー\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"Register\"\nmsgstr \"登録\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"or\"\nmsgstr \"もしくは\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"login\"\nmsgstr \"ログイン\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"to create to post a reply\"\nmsgstr \"返信を投稿するには\"\n\n#: templates/pybb/add_post.html:5 templates/pybb/add_post.html.py:32\nmsgid \"New reply\"\nmsgstr \"新規リプライ\"\n\n#: templates/pybb/attachments_formset.html:6\nmsgid \"Add attachments\"\nmsgstr \"添付ファイルを追加\"\n\n#: templates/pybb/attachments_formset.html:14\nmsgid \"\"\n\"If you need to upload larger files, please use an external storage website.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:14\n#, python-format\nmsgid \"(max size: %(max_size)s)\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:17\n#: templates/pybb/edit_profile.html:25\nmsgid \"delete\"\nmsgstr \"削除\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Reference to your file\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Ref\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#: templates/pybb/topic.html:88 templates/pybb/topic_list.html:32\nmsgid \":\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"link\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"Insert a link to your file inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"image\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"Insert your image inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/breadcrumb.html:4\nmsgid \"Home\"\nmsgstr \"ホーム\"\n\n#: templates/pybb/delete_post.html:5\nmsgid \"Are you sure you want to delete this message?\"\nmsgstr \"このメッセージを削除しますか？\"\n\n#: templates/pybb/delete_post.html:12\nmsgid \"No, take me back\"\nmsgstr \"いいえ\"\n\n#: templates/pybb/delete_post.html:13\nmsgid \"Yes, I am sure\"\nmsgstr \"はい\"\n\n#: templates/pybb/edit_post.html:4 templates/pybb/edit_post.html.py:17\nmsgid \"Editing the post\"\nmsgstr \"投稿を編集する\"\n\n#: templates/pybb/edit_privileges.html:5 templates/pybb/edit_privileges.html:8\nmsgid \"Grant moderator privileges\"\nmsgstr \"\"\n\n#: templates/pybb/edit_profile.html:5 templates/pybb/edit_profile.html.py:8\n#: templates/pybb/edit_profile.html:13\nmsgid \"Profile editing\"\nmsgstr \"プロファイル編集\"\n\n#: templates/pybb/edit_profile.html:18\nmsgid \"Subscriptions on topics\"\nmsgstr \"トピックの購読\"\n\n#: templates/pybb/forum_list.html:17\nmsgid \"Last posts\"\nmsgstr \"最新の投稿\"\n\n#: templates/pybb/forum_list.html:43\nmsgid \"No forums created\"\nmsgstr \"フォーラムは作成されていません\"\n\n#: templates/pybb/forum_list.html:44\nmsgid \"Add forum now\"\nmsgstr \"フォーラムを追加する\"\n\n#: templates/pybb/forum_subscription.html:4\n#, python-format\nmsgctxt \"page title\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:14\n#, python-format\nmsgctxt \"content heading\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:32\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:17\nmsgid \"Forum categories are not created\"\nmsgstr \"フォーラム カテゴリは作成されていません\"\n\n#: templates/pybb/index.html:18\nmsgid \"Add a category now\"\nmsgstr \"カテゴリを追加する\"\n\n#: templates/pybb/index.html:22 templates/pybb/latest_topics.html:5\n#: templates/pybb/latest_topics.html:8 templates/pybb/latest_topics.html:15\nmsgid \"Last updates in topics\"\nmsgstr \"トピック毎の最終更新\"\n\n#: templates/pybb/index.html:23\nmsgid \"Mark all forums as read\"\nmsgstr \"全てのフォーラムを既読にする\"\n\n#: templates/pybb/latest_topics.html:31\nmsgid \"Mark all topics as read\"\nmsgstr \"全てのトピックを既読にする\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:4\n#, python-format\nmsgid \"\"\n\"User %(username)s post a new topic in forum to which you are subscribed \"\n\"(%(forum_name)s).\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#, fuzzy\n#| msgid \"Link to topic:\"\nmsgid \"Link to topic\"\nmsgstr \"トピックへ:\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#, fuzzy\n#| msgid \"Link to post:\"\nmsgid \"Link to forum\"\nmsgstr \"投稿へ:\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#, fuzzy\n#| msgid \"\"\n#| \"If you don't want to recive notifications on new messages in this topic \"\n#| \"visit following link:\"\nmsgid \"\"\n\"If you don't want to receive notifications on new topics in this forum visit \"\n\"following link\"\nmsgstr \"\"\n\"このトピックの新しいメッセージへの通知を受けとりたくない場合は、以下のリンク\"\n\"をクリック:\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_subject.html:2\n#, fuzzy\n#| msgid \"New answer in topic that you subscribed.\"\nmsgid \"New topic in forum that you subscribed.\"\nmsgstr \"購読中のトピックの新しい回答\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:7\n#: templates/pybb/mail_templates/subscription_email_body.html:3\n#, fuzzy, python-format\n#| msgid \"replied in topic to which you are subscribed.\"\nmsgid \"User %(username)s replied in topic to which you are subscribed.\"\nmsgstr \"購読中のトピックへの返信\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:10\n#, python-format\nmsgid \"\"\n\"Follow %(link_post_start)sthis link%(link_end)s to see the new post on the \"\n\"topic %(link_topic_start)s%(topic_name)s%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:14\n#, fuzzy, python-format\n#| msgid \"\"\n#| \"If you don't want to recive notifications on new messages in this topic \"\n#| \"visit following link:\"\nmsgid \"\"\n\"If you don't want to receive notifications on new posts in this topic visit \"\n\"%(link_start)sthis link%(link_end)s.\"\nmsgstr \"\"\n\"このトピックの新しいメッセージへの通知を受けとりたくない場合は、以下のリンク\"\n\"をクリック:\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#, fuzzy\n#| msgid \"Link to post:\"\nmsgid \"Link to post\"\nmsgstr \"投稿へ:\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:8\n#, fuzzy, python-format\n#| msgid \"\"\n#| \"If you don't want to recive notifications on new messages in this topic \"\n#| \"visit following link:\"\nmsgid \"\"\n\"If you don't want to receive notifications on new messages in this topic \"\n\"visit following link: %(delete_url_full)s\"\nmsgstr \"\"\n\"このトピックの新しいメッセージへの通知を受けとりたくない場合は、以下のリンク\"\n\"をクリック:\"\n\n#: templates/pybb/mail_templates/subscription_email_subject.html:2\nmsgid \"New answer in topic that you subscribed.\"\nmsgstr \"購読中のトピックの新しい回答\"\n\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Your text to link here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\nmsgid \"First Level Heading\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:18\n#: templates/pybb/markup/markdown_widget.html:19\n#: templates/pybb/markup/markdown_widget.html:20\n#: templates/pybb/markup/markdown_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Your title here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:18\nmsgid \"Second Level Heading\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:19\n#, fuzzy\n#| msgid \"Headline\"\nmsgid \"Heading 3\"\nmsgstr \"ヘッドライン\"\n\n#: templates/pybb/markup/markdown_widget.html:20\n#, fuzzy\n#| msgid \"Headline\"\nmsgid \"Heading 4\"\nmsgstr \"ヘッドライン\"\n\n#: templates/pybb/markup/markdown_widget.html:21\n#, fuzzy\n#| msgid \"Headline\"\nmsgid \"Heading 5\"\nmsgstr \"ヘッドライン\"\n\n#: templates/pybb/markup/markdown_widget.html:22\n#, fuzzy\n#| msgid \"Headline\"\nmsgid \"Heading 6\"\nmsgstr \"ヘッドライン\"\n\n#: templates/pybb/markup/markdown_widget.html:27\n#, fuzzy\n#| msgid \"Bulleted list\"\nmsgid \"Bulleted List\"\nmsgstr \"箇条書きリスト\"\n\n#: templates/pybb/markup/markdown_widget.html:28\n#, fuzzy\n#| msgid \"Numeric list\"\nmsgid \"Numeric List\"\nmsgstr \"数字付きリスト\"\n\n#: templates/pybb/markup/markdown_widget.html:36\nmsgid \"Code Block / Code\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:7\nmsgid \"previous page\"\nmsgstr \"前ページ\"\n\n#: templates/pybb/pagination.html:21\nmsgid \"next page\"\nmsgstr \"次ページ\"\n\n#: templates/pybb/poll.html:4\nmsgid \"Poll\"\nmsgstr \"投票\"\n\n#: templates/pybb/poll.html:36\nmsgid \"Cancel my poll vote\"\nmsgstr \"投票を取り消す\"\n\n#: templates/pybb/poll_edit_form.html:7\nmsgid \"Poll answers\"\nmsgstr \"投票の選択肢\"\n\n#: templates/pybb/poll_edit_form.html:20\nmsgid \"remove answer\"\nmsgstr \"回答を削除する\"\n\n#: templates/pybb/poll_edit_form.html:21\nmsgid \"add answer\"\nmsgstr \"回答を追加する\"\n\n#: templates/pybb/post_template.html:28\n#, python-format\nmsgid \"Rank: %(rank)s\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:41 templates/pybb/user.html:51\nmsgid \"Edit\"\nmsgstr \"編集\"\n\n#: templates/pybb/post_template.html:45\nmsgid \"Delete post?\"\nmsgstr \"投稿を削除しますか？\"\n\n#: templates/pybb/post_template.html:46\nmsgid \"Delete\"\nmsgstr \"削除\"\n\n#: templates/pybb/post_template.html:49\nmsgid \"Approve post\"\nmsgstr \"投稿を承認する\"\n\n#: templates/pybb/post_template.html:53 templates/pybb/topic.html:62\nmsgid \"Admin\"\nmsgstr \"管理画面\"\n\n#: templates/pybb/post_template.html:69\nmsgid \"Edited\"\nmsgstr \"編集済み\"\n\n#: templates/pybb/post_template.html:83\nmsgid \"quote\"\nmsgstr \"引用\"\n\n#: templates/pybb/post_template.html:84\nmsgid \"quote selected\"\nmsgstr \"選択して引用\"\n\n#: templates/pybb/topic.html:51\nmsgid \"Unstick topic\"\nmsgstr \"トピックを最上位表示しない\"\n\n#: templates/pybb/topic.html:53\nmsgid \"Stick topic\"\nmsgstr \"トピックを最上位表示する\"\n\n#: templates/pybb/topic.html:57\nmsgid \"Open topic\"\nmsgstr \"トピックを開く\"\n\n#: templates/pybb/topic.html:59\nmsgid \"Close topic\"\nmsgstr \"トピックを閉じる\"\n\n#: templates/pybb/topic.html:70\nmsgid \"Unsubscribe\"\nmsgstr \"購読をやめる\"\n\n#: templates/pybb/topic_list.html:13\nmsgid \"Views\"\nmsgstr \"閲覧数\"\n\n#: templates/pybb/topic_list.html:16\nmsgid \"Last post\"\nmsgstr \"最新の投稿\"\n\n#: templates/pybb/topic_list.html:26\nmsgid \"Go to first unread post\"\nmsgstr \"最初の未読投稿へ\"\n\n#: templates/pybb/topic_list.html:32\nmsgid \"pages\"\nmsgstr \"ページ\"\n\n#: templates/pybb/user.html:16\nmsgid \"Statistics\"\nmsgstr \"統計\"\n\n#: templates/pybb/user.html:19\n#, fuzzy, python-format\n#| msgid \"Number of topics\"\nmsgid \"Number of topics: %(count)s\"\nmsgstr \"トピック数\"\n\n#: templates/pybb/user.html:24\n#, fuzzy, python-format\n#| msgid \"Number of posts\"\nmsgid \"Number of posts: %(count)s\"\nmsgstr \"投稿数\"\n\n#: templates/pybb/user.html:29\n#, fuzzy, python-format\n#| msgid \"Date of registration\"\nmsgid \"Date of registration: %(date_joined)s \"\nmsgstr \"登録日\"\n\n#: templates/pybb/user.html:36\n#, fuzzy\n#| msgid \"Moderators\"\nmsgid \"Moderator\"\nmsgstr \"モデレータ\"\n\n#: templates/pybb/user.html:41\nmsgid \"Block\"\nmsgstr \"ブロック\"\n\n#: templates/pybb/user.html:42\nmsgid \"Block and delete all messages\"\nmsgstr \"全てのメッセージをブロック＆削除\"\n\n#: templates/pybb/user.html:46\nmsgid \"Unblock\"\nmsgstr \"ブロック解除\"\n\n#: templates/pybb/user_posts.html:12 templates/pybb/user_posts.html.py:17\nmsgid \"All posts created by\"\nmsgstr \"の全ての投稿\"\n\n#: templates/pybb/user_topics.html:12 templates/pybb/user_topics.html.py:17\nmsgid \"All topics created by\"\nmsgstr \"の全てのトピック\"\n\n#: templates/pybb/users.html:8 templates/pybb/users.html.py:24\nmsgid \"Users\"\nmsgstr \"ユーザ\"\n\n#: templates/pybb/users.html:12\nmsgid \"Search\"\nmsgstr \"検索\"\n\n#: templatetags/pybb_tags.py:61\n#, fuzzy, python-format\n#| msgid \"seconds ago\"\nmsgid \"%d second ago\"\nmsgid_plural \"%d seconds ago\"\nmsgstr[0] \"秒前\"\n\n#: templatetags/pybb_tags.py:65\n#, fuzzy, python-format\n#| msgid \"minutes ago\"\nmsgid \"%d minute ago\"\nmsgid_plural \"%d minutes ago\"\nmsgstr[0] \"分前\"\n\n#: templatetags/pybb_tags.py:75\n#, python-format\nmsgid \"today, %s\"\nmsgstr \"今日, %s\"\n\n#: templatetags/pybb_tags.py:77\n#, python-format\nmsgid \"yesterday, %s\"\nmsgstr \"昨日, %s\"\n\n#: util.py:140\nmsgid \"Can't get profile for anonymous user\"\nmsgstr \"匿名ユーザのプロファイルは取得できません\"\n\n#: views.py:156\n#, fuzzy\n#| msgid \"Forum categories are not created\"\nmsgid \"Forum does not exist\"\nmsgstr \"フォーラム カテゴリは作成されていません\"\n\n#: views.py:388\nmsgid \"This topic does not exists\"\nmsgstr \"\"\n\n#: views.py:826\nmsgid \"\"\n\"Subscription removed. You will not receive emails from this topic unless you \"\n\"subscribe or post again.\"\nmsgstr \"\"\n\n#: views.py:837\nmsgid \"\"\n\"Subscription added. You will receive email notifications for replies to this \"\n\"topic.\"\nmsgstr \"\"\n\n#: views.py:855\nmsgid \"All forums marked as read\"\nmsgstr \"全てのフォーラムを既読にする\"\n\n#: views.py:888\nmsgid \"User successfuly blocked\"\nmsgstr \"ユーザをブロックしました\"\n\n#: views.py:901\nmsgid \"User successfuly unblocked\"\nmsgstr \"ユーザのブロックを解除しました\"\n\n#: views.py:939\nmsgid \"Privileges updated\"\nmsgstr \"\"\n\n#~ msgid \"Rank\"\n#~ msgstr \"ランク\"\n\n#~ msgid \"seconds ago,seconds ago,seconds ago\"\n#~ msgstr \"秒前,秒前,秒前\"\n\n#~ msgid \"minutes ago,minutes ago,minutes ago\"\n#~ msgstr \"分前,分前,分前\"\n"
  },
  {
    "path": "pybb/locale/pl/LC_MESSAGES/django.po",
    "content": "# Russian translation for pybbm forum\n# Copyright (C) 2012 Adrian Gruntkowski\n# This file is distributed under the same license as the pybb package.\n# Adrian Gruntkowski <adrian.gruntkowski@gmail.com>, 2012.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pybbm\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-01-11 14:06+0100\\n\"\n\"PO-Revision-Date: 2017-01-03 11:52+0100\\n\"\n\"Last-Translator: DylannCordel <d.cordel@webu.coop>\\n\"\n\"Language-Team: \\n\"\n\"Language: pl\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 \"\n\"|| n%100>=20) ? 1 : 2);\\n\"\n\"X-Generator: Poedit 1.6.10\\n\"\n\"X-Poedit-SourceCharset: UTF-8\\n\"\n\"X-Poedit-Basepath: ../../..\\n\"\n\n#: admin.py:45 admin.py:84 admin.py:112 admin.py:134\nmsgid \"Additional options\"\nmsgstr \"Opcje dodatkowe\"\n\n#: admin.py:117 models.py:280\nmsgid \"Message\"\nmsgstr \"Wiadomość\"\n\n#: admin.py:148\nmsgid \"View post\"\nmsgstr \"Podgląd posta\"\n\n#: admin.py:153\nmsgid \"Edit post\"\nmsgstr \"Edycja posta\"\n\n#: apps.py:9\nmsgid \"Pybbm forum solution\"\nmsgstr \"\"\n\n#: feeds.py:27 feeds.py:28 templates/pybb/base.html:10\nmsgid \"Latest posts on forum\"\nmsgstr \"Ostatnie posty na forum\"\n\n#: feeds.py:41 feeds.py:42 templates/pybb/base.html:11\nmsgid \"Latest topics on forum\"\nmsgstr \"Ostatnie tematy na forum\"\n\n#: forms.py:30\nmsgid \"Attachment is too big\"\nmsgstr \"Załącznik jest za duży\"\n\n#: forms.py:48\n#, python-format\nmsgid \"You cant add more than %s answers for poll\"\nmsgstr \"Nie możesz dodać więcej niż %s odpowiedzi do sondy\"\n\n#: forms.py:50\nmsgid \"Add two or more answers for this poll\"\nmsgstr \"Dodaj dwie lub więcej odpowiedzi do tej sondy\"\n\n#: forms.py:58 models.py:183\nmsgid \"Subject\"\nmsgstr \"Temat\"\n\n#: forms.py:59 models.py:195\nmsgid \"Poll type\"\nmsgstr \"Rodzaj sondy\"\n\n#: forms.py:61 models.py:196\nmsgid \"Poll question\"\nmsgstr \"Pytanie do sondy\"\n\n#: forms.py:64\n#, fuzzy\n#| msgid \"Topics\"\nmsgid \"Topic slug\"\nmsgstr \"Tematy\"\n\n#: forms.py:123\nmsgid \"Polls question is required when adding a poll\"\nmsgstr \"Pytanie jest wymagane przy dodawaniu sondy\"\n\n#: forms.py:176 models.py:186 models.py:295 models.py:368 models.py:507\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\n#: forms.py:212\n#, python-format\nmsgid \"Avatar is too large, max size: %s bytes\"\nmsgstr \"Avatar jest zbyt duży. Maksymalny rozmiar to %s bajtów\"\n\n#: forms.py:272\nmsgid \"be unsubscribe from this forum\"\nmsgstr \"\"\n\n#: forms.py:277\nmsgid \"You want to\"\nmsgstr \"\"\n\n#: forms.py:281\n#, fuzzy\n#| msgid \"New topic\"\nmsgid \"only new topics\"\nmsgstr \"Nowy temat\"\n\n#: forms.py:282\n#, fuzzy\n#| msgid \"Latest topics on forum\"\nmsgid \"all topics of the forum\"\nmsgstr \"Ostatnie tematy na forum\"\n\n#: forms.py:285\n#, fuzzy\n#| msgid \"Close topic\"\nmsgid \"Concerned topics\"\nmsgstr \"Zamknij temat\"\n\n#: models.py:23 models.py:59\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\n#: models.py:24 models.py:60\nmsgid \"Position\"\nmsgstr \"Pozycja\"\n\n#: models.py:25 models.py:66 templates/pybb/category.html:4\n#: templates/pybb/forum_list.html:26\nmsgid \"Hidden\"\nmsgstr \"Ukryty\"\n\n#: models.py:26\nmsgid \"If checked, this category will be visible only for staff\"\nmsgstr \"Przy zaznaczeniu, ta kategoria będzie widoczna tylko dla personelu\"\n\n#: models.py:27 models.py:69 models.py:197\nmsgid \"Slug\"\nmsgstr \"\"\n\n#: models.py:31 models.py:56\nmsgid \"Category\"\nmsgstr \"Kategoria\"\n\n#: models.py:32\nmsgid \"Categories\"\nmsgstr \"Kategorie\"\n\n#: models.py:57\nmsgid \"Parent forum\"\nmsgstr \"Forum nadrzędne\"\n\n#: models.py:61\nmsgid \"Description\"\nmsgstr \"Opis\"\n\n#: models.py:62\nmsgid \"Moderators\"\nmsgstr \"Moderatorzy\"\n\n#: models.py:63 models.py:185 models.py:297\nmsgid \"Updated\"\nmsgstr \"Zaktualizowano\"\n\n#: models.py:64 models.py:192 profiles.py:41\nmsgid \"Post count\"\nmsgstr \"Liczba postów\"\n\n#: models.py:65\nmsgid \"Topic count\"\nmsgstr \"Liczba tematów\"\n\n#: models.py:68\nmsgid \"Headline\"\nmsgstr \"Nagłówek\"\n\n#: models.py:73 models.py:136 models.py:182 templates/pybb/forum_list.html:8\nmsgid \"Forum\"\nmsgstr \"Forum\"\n\n#: models.py:74\nmsgid \"Forums\"\nmsgstr \"Fora\"\n\n#: models.py:129\nmsgid \"be notified only when a new topic is added\"\nmsgstr \"\"\n\n#: models.py:130\nmsgid \"be auto-subscribed to topics\"\nmsgstr \"\"\n\n#: models.py:134\n#, fuzzy\n#| msgid \"Subscribers\"\nmsgid \"Subscriber\"\nmsgstr \"Subskrybenci\"\n\n#: models.py:138\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription type\"\nmsgstr \"Subskrypcje tematów\"\n\n#: models.py:148\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription to forum\"\nmsgstr \"Subskrypcje tematów\"\n\n#: models.py:149\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscriptions to forums\"\nmsgstr \"Subskrypcje tematów\"\n\n#: models.py:177\nmsgid \"None\"\nmsgstr \"Brak\"\n\n#: models.py:178\nmsgid \"Single answer\"\nmsgstr \"Jednokrotna odpowiedź\"\n\n#: models.py:179\nmsgid \"Multiple answers\"\nmsgstr \"Wielokrotna odpowiedź\"\n\n#: models.py:184 models.py:296\nmsgid \"Created\"\nmsgstr \"Utworzono\"\n\n#: models.py:187\nmsgid \"Views count\"\nmsgstr \"Licza wejść\"\n\n#: models.py:188 templates/pybb/topic_list.html:27\nmsgid \"Sticky\"\nmsgstr \"Przyklejony\"\n\n#: models.py:189 templates/pybb/topic_list.html:28\nmsgid \"Closed\"\nmsgstr \"Zamknięty\"\n\n#: models.py:191 templates/pybb/topic.html:88\nmsgid \"Subscribers\"\nmsgstr \"Subskrybenci\"\n\n#: models.py:194 models.py:299\nmsgid \"On moderation\"\nmsgstr \"W moderacji\"\n\n#: models.py:201 models.py:294 models.py:483 templates/pybb/topic_list.html:7\nmsgid \"Topic\"\nmsgstr \"Temat\"\n\n#: models.py:202 templates/pybb/forum_list.html:11\n#: templates/pybb/user_topics.html:7\nmsgid \"Topics\"\nmsgstr \"Tematy\"\n\n#: models.py:281\nmsgid \"HTML version\"\nmsgstr \"Wersja HTML\"\n\n#: models.py:282\nmsgid \"Text version\"\nmsgstr \"Wersja tekstowa\"\n\n#: models.py:298\nmsgid \"User IP\"\nmsgstr \"IP użytkownika\"\n\n#: models.py:303 models.py:386\nmsgid \"Post\"\nmsgstr \"Post\"\n\n#: models.py:304 templates/pybb/forum_list.html:14\n#: templates/pybb/topic.html:42 templates/pybb/topic_list.html:10\n#: templates/pybb/user_posts.html:7\nmsgid \"Posts\"\nmsgstr \"Posty\"\n\n#: models.py:371\nmsgid \"Profile\"\nmsgstr \"Profil\"\n\n#: models.py:372\nmsgid \"Profiles\"\nmsgstr \"Profile\"\n\n#: models.py:383\nmsgid \"Attachment\"\nmsgstr \"Załącznik\"\n\n#: models.py:384\nmsgid \"Attachments\"\nmsgstr \"Załączniki\"\n\n#: models.py:387\nmsgid \"Size\"\nmsgstr \"Rozmiar\"\n\n#: models.py:388\nmsgid \"File\"\nmsgstr \"Plik\"\n\n#: models.py:438\nmsgid \"Topic read tracker\"\nmsgstr \"Rejestr przeczytanych dla tematu\"\n\n#: models.py:439\nmsgid \"Topic read trackers\"\nmsgstr \"Rejestry przeczytanych dla tematu\"\n\n#: models.py:476\nmsgid \"Forum read tracker\"\nmsgstr \"Rejestr przeczytanych dla forum\"\n\n#: models.py:477\nmsgid \"Forum read trackers\"\nmsgstr \"Rejestry przeczytanych dla forum\"\n\n#: models.py:484\nmsgid \"Text\"\nmsgstr \"Tekst\"\n\n#: models.py:487 models.py:506\nmsgid \"Poll answer\"\nmsgstr \"Odpowiedź do sondy\"\n\n#: models.py:488\nmsgid \"Polls answers\"\nmsgstr \"Odpowiedzi do sond\"\n\n#: models.py:511\nmsgid \"Poll answer user\"\nmsgstr \"Odpowiedź do sondy - użytkownik\"\n\n#: models.py:512\nmsgid \"Polls answers users\"\nmsgstr \"Odpowiedzi do sond - użytkownicy\"\n\n#: models.py:535\n#, python-format\nmsgid \"\"\n\"After %(limit)s attemps, there is not any unique slug value for \\\"%(slug)s\\\"\"\nmsgstr \"\"\n\n#: profiles.py:34\nmsgid \"Signature\"\nmsgstr \"Podpis\"\n\n#: profiles.py:35\nmsgid \"Signature HTML Version\"\nmsgstr \"Podpis w wersji HTML\"\n\n#: profiles.py:37\nmsgid \"Time zone\"\nmsgstr \"Strefa czasowa\"\n\n#: profiles.py:38\nmsgid \"Language\"\nmsgstr \"Język\"\n\n#: profiles.py:40\nmsgid \"Show signatures\"\nmsgstr \"Pokaż podpis\"\n\n#: profiles.py:42\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\n#: profiles.py:44\nmsgid \"Automatically subscribe\"\nmsgstr \"Automatyczna subskrypcja\"\n\n#: profiles.py:45\nmsgid \"Automatically subscribe to topics that you answer\"\nmsgstr \"Automatyczna subskrypcja wątków, w których się odpowiada\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#, fuzzy\n#| msgid \"Description\"\nmsgid \"Manage subscription\"\nmsgstr \"Opis\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#: templates/pybb/topic.html:72\nmsgid \"Subscribe\"\nmsgstr \"Subskrybuj\"\n\n#: templates/pybb/_button_new_topic.html:1 templates/pybb/add_post.html:5\n#: templates/pybb/add_post.html.py:32\nmsgid \"New topic\"\nmsgstr \"Nowy temat\"\n\n#: templates/pybb/_button_save.html:1\nmsgid \"Save\"\nmsgstr \"Zapisz\"\n\n#: templates/pybb/_button_submit.html:1\n#: templates/pybb/forum_subscription.html:33\nmsgid \"Submit\"\nmsgstr \"Wyślij\"\n\n#: templates/pybb/_markitup.html:25\n#: templates/pybb/markup/bbcode_widget.html:16\n#: templates/pybb/markup/markdown_widget.html:24\nmsgid \"Bold\"\nmsgstr \"Pogrubienie\"\n\n#: templates/pybb/_markitup.html:26\n#: templates/pybb/markup/bbcode_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:25\nmsgid \"Italic\"\nmsgstr \"Kursywa\"\n\n#: templates/pybb/_markitup.html:27\n#: templates/pybb/markup/bbcode_widget.html:18\nmsgid \"Underline\"\nmsgstr \"Podkreślenie\"\n\n#: templates/pybb/_markitup.html:28\n#: templates/pybb/markup/bbcode_widget.html:19\nmsgid \"Stroke\"\nmsgstr \"Przekreślenie\"\n\n#: templates/pybb/_markitup.html:30\n#: templates/pybb/markup/bbcode_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:32\n#, fuzzy\nmsgid \"Picture\"\nmsgstr \"Podpis\"\n\n#: templates/pybb/_markitup.html:31\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Link\"\nmsgstr \"Link\"\n\n#: templates/pybb/_markitup.html:33\n#: templates/pybb/markup/bbcode_widget.html:24\nmsgid \"Bulleted list\"\nmsgstr \"Lista punktowana\"\n\n#: templates/pybb/_markitup.html:34\n#: templates/pybb/markup/bbcode_widget.html:25\nmsgid \"Numeric list\"\nmsgstr \"Lista numerowana\"\n\n#: templates/pybb/_markitup.html:35\n#: templates/pybb/markup/bbcode_widget.html:26\nmsgid \"List item\"\nmsgstr \"Element listy\"\n\n#: templates/pybb/_markitup.html:37\n#: templates/pybb/markup/bbcode_widget.html:28\n#: templates/pybb/markup/markdown_widget.html:35\n#, fuzzy\nmsgid \"Quotes\"\nmsgstr \"cytuj\"\n\n#: templates/pybb/_markitup.html:38\n#: templates/pybb/markup/bbcode_widget.html:29\nmsgid \"Code\"\nmsgstr \"Kod\"\n\n#: templates/pybb/_markitup.html:40\n#: templates/pybb/markup/bbcode_widget.html:31\nmsgid \"Clean\"\nmsgstr \"Wyczyść\"\n\n#: templates/pybb/_markitup.html:41\n#: templates/pybb/markup/bbcode_widget.html:32\n#: templates/pybb/markup/markdown_widget.html:38\nmsgid \"Preview\"\nmsgstr \"Podgląd\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"Register\"\nmsgstr \"Rejestruj\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"or\"\nmsgstr \"lub\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"login\"\nmsgstr \"zaloguj\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"to create to post a reply\"\nmsgstr \"aby utworzyć temat lub odpowiedzieć w istniejącym\"\n\n#: templates/pybb/add_post.html:5 templates/pybb/add_post.html.py:32\nmsgid \"New reply\"\nmsgstr \"Nowa odpowiedź\"\n\n#: templates/pybb/attachments_formset.html:6\nmsgid \"Add attachments\"\nmsgstr \"Dodaj załączniki\"\n\n#: templates/pybb/attachments_formset.html:14\nmsgid \"\"\n\"If you need to upload larger files, please use an external storage website.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:14\n#, python-format\nmsgid \"(max size: %(max_size)s)\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:17\n#: templates/pybb/edit_profile.html:25\nmsgid \"delete\"\nmsgstr \"usuń\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Reference to your file\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Ref\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#: templates/pybb/topic.html:88 templates/pybb/topic_list.html:32\nmsgid \":\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"link\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"Insert a link to your file inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"image\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"Insert your image inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/breadcrumb.html:4\nmsgid \"Home\"\nmsgstr \"Start\"\n\n#: templates/pybb/delete_post.html:5\nmsgid \"Are you sure you want to delete this message?\"\nmsgstr \"Czy jesteś pewien, że chcesz usunąć tą wiadomość?\"\n\n#: templates/pybb/delete_post.html:12\nmsgid \"No, take me back\"\nmsgstr \"Nie, rezygnuję\"\n\n#: templates/pybb/delete_post.html:13\nmsgid \"Yes, I am sure\"\nmsgstr \"Tak, jestem pewien\"\n\n#: templates/pybb/edit_post.html:4 templates/pybb/edit_post.html.py:17\nmsgid \"Editing the post\"\nmsgstr \"Edycja postu\"\n\n#: templates/pybb/edit_privileges.html:5 templates/pybb/edit_privileges.html:8\nmsgid \"Grant moderator privileges\"\nmsgstr \"\"\n\n#: templates/pybb/edit_profile.html:5 templates/pybb/edit_profile.html.py:8\n#: templates/pybb/edit_profile.html:13\nmsgid \"Profile editing\"\nmsgstr \"Edycja profilu\"\n\n#: templates/pybb/edit_profile.html:18\nmsgid \"Subscriptions on topics\"\nmsgstr \"Subskrypcje tematów\"\n\n#: templates/pybb/forum_list.html:17\nmsgid \"Last posts\"\nmsgstr \"Ostatnie posty\"\n\n#: templates/pybb/forum_list.html:43\nmsgid \"No forums created\"\nmsgstr \"Nie utworzono żadnego forum\"\n\n#: templates/pybb/forum_list.html:44\nmsgid \"Add forum now\"\nmsgstr \"Dodaj forum\"\n\n#: templates/pybb/forum_subscription.html:4\n#, python-format\nmsgctxt \"page title\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Subskrypcje\"\n\n#: templates/pybb/forum_subscription.html:14\n#, python-format\nmsgctxt \"content heading\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Subskrypcje\"\n\n#: templates/pybb/forum_subscription.html:32\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:17\nmsgid \"Forum categories are not created\"\nmsgstr \"Nie utworzono żadnych kategorii\"\n\n#: templates/pybb/index.html:18\nmsgid \"Add a category now\"\nmsgstr \"Dodaj kategorię\"\n\n#: templates/pybb/index.html:22 templates/pybb/latest_topics.html:5\n#: templates/pybb/latest_topics.html:8 templates/pybb/latest_topics.html:15\nmsgid \"Last updates in topics\"\nmsgstr \"Nowe posty w tematach\"\n\n#: templates/pybb/index.html:23\nmsgid \"Mark all forums as read\"\nmsgstr \"Oznacz wszystkie fora jako przeczytane\"\n\n#: templates/pybb/latest_topics.html:31\n#, fuzzy\nmsgid \"Mark all topics as read\"\nmsgstr \"Oznacz wszystkie tematy jako przeczytane\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:4\n#, fuzzy, python-format\n#| msgid \"replied in topic to which you are subscribed.\"\nmsgid \"\"\n\"User %(username)s post a new topic in forum to which you are subscribed \"\n\"(%(forum_name)s).\"\nmsgstr \"odpowiedział(a) w temacie, do którego jesteś subskrybowany.\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#, fuzzy\n#| msgid \"Link to topic:\"\nmsgid \"Link to topic\"\nmsgstr \"Odnośnik to tematu:\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#, fuzzy\n#| msgid \"Link to post:\"\nmsgid \"Link to forum\"\nmsgstr \"Odnośnik do posta:\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#, fuzzy\n#| msgid \"\"\n#| \"If you don't want to recive notifications on new messages in this topic \"\n#| \"visit following link:\"\nmsgid \"\"\n\"If you don't want to receive notifications on new topics in this forum visit \"\n\"following link\"\nmsgstr \"\"\n\"Jeśli nie chcesz otrzymywać powiadomień o nowych wiadomościach w tym \"\n\"temacie, otwórz następujący odnośnik w przeglądarce:\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_subject.html:2\n#, fuzzy\n#| msgid \"New answer in topic that you subscribed.\"\nmsgid \"New topic in forum that you subscribed.\"\nmsgstr \"Nowa odpowiedź w temacie, do którego jesteś subskrybowany.\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:7\n#: templates/pybb/mail_templates/subscription_email_body.html:3\n#, python-format\nmsgid \"User %(username)s replied in topic to which you are subscribed.\"\nmsgstr \"\"\n\"Użytkownik %(username)s odpowiedział(a) w temacie, do którego jesteś \"\n\"subskrybowany.\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:10\n#, python-format\nmsgid \"\"\n\"Follow %(link_post_start)sthis link%(link_end)s to see the new post on the \"\n\"topic %(link_topic_start)s%(topic_name)s%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:14\n#, fuzzy, python-format\n#| msgid \"\"\n#| \"If you don't want to recive notifications on new messages in this topic \"\n#| \"visit following link:\"\nmsgid \"\"\n\"If you don't want to receive notifications on new posts in this topic visit \"\n\"%(link_start)sthis link%(link_end)s.\"\nmsgstr \"\"\n\"Jeśli nie chcesz otrzymywać powiadomień o nowych wiadomościach w tym \"\n\"temacie, otwórz następujący odnośnik w przeglądarce:\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#, fuzzy\n#| msgid \"Link to post:\"\nmsgid \"Link to post\"\nmsgstr \"Odnośnik do posta:\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:8\n#, fuzzy, python-format\n#| msgid \"\"\n#| \"If you don't want to recive notifications on new messages in this topic \"\n#| \"visit following link:\"\nmsgid \"\"\n\"If you don't want to receive notifications on new messages in this topic \"\n\"visit following link: %(delete_url_full)s\"\nmsgstr \"\"\n\"Jeśli nie chcesz otrzymywać powiadomień o nowych wiadomościach w tym \"\n\"temacie, otwórz następujący odnośnik w przeglądarce:\"\n\n#: templates/pybb/mail_templates/subscription_email_subject.html:2\nmsgid \"New answer in topic that you subscribed.\"\nmsgstr \"Nowa odpowiedź w temacie, do którego jesteś subskrybowany.\"\n\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Your text to link here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\nmsgid \"First Level Heading\"\nmsgstr \"Nagłówek 1\"\n\n#: templates/pybb/markup/markdown_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:18\n#: templates/pybb/markup/markdown_widget.html:19\n#: templates/pybb/markup/markdown_widget.html:20\n#: templates/pybb/markup/markdown_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Your title here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:18\nmsgid \"Second Level Heading\"\nmsgstr \"Nagłówek 2\"\n\n#: templates/pybb/markup/markdown_widget.html:19\nmsgid \"Heading 3\"\nmsgstr \"Nagłówek 3\"\n\n#: templates/pybb/markup/markdown_widget.html:20\nmsgid \"Heading 4\"\nmsgstr \"Nagłówek 4\"\n\n#: templates/pybb/markup/markdown_widget.html:21\nmsgid \"Heading 5\"\nmsgstr \"Nagłówek 5\"\n\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Heading 6\"\nmsgstr \"Nagłówek 6\"\n\n#: templates/pybb/markup/markdown_widget.html:27\nmsgid \"Bulleted List\"\nmsgstr \"Lista punktowana\"\n\n#: templates/pybb/markup/markdown_widget.html:28\nmsgid \"Numeric List\"\nmsgstr \"Lista numerowana\"\n\n#: templates/pybb/markup/markdown_widget.html:36\nmsgid \"Code Block / Code\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:7\nmsgid \"previous page\"\nmsgstr \"poprzednia strona\"\n\n#: templates/pybb/pagination.html:21\nmsgid \"next page\"\nmsgstr \"następna strona\"\n\n#: templates/pybb/poll.html:4\nmsgid \"Poll\"\nmsgstr \"Sonda\"\n\n#: templates/pybb/poll.html:36\nmsgid \"Cancel my poll vote\"\nmsgstr \"Anuluj mój głos w sondzie\"\n\n#: templates/pybb/poll_edit_form.html:7\nmsgid \"Poll answers\"\nmsgstr \"Odpowiedzi\"\n\n#: templates/pybb/poll_edit_form.html:20\nmsgid \"remove answer\"\nmsgstr \"usuń odpowiedź\"\n\n#: templates/pybb/poll_edit_form.html:21\nmsgid \"add answer\"\nmsgstr \"dodaj odpowiedź\"\n\n#: templates/pybb/post_template.html:28\n#, python-format\nmsgid \"Rank: %(rank)s\"\nmsgstr \"Ranga: %(rank)s\"\n\n#: templates/pybb/post_template.html:41 templates/pybb/user.html:51\nmsgid \"Edit\"\nmsgstr \"Edycja\"\n\n#: templates/pybb/post_template.html:45\nmsgid \"Delete post?\"\nmsgstr \"Usunąć post?\"\n\n#: templates/pybb/post_template.html:46\nmsgid \"Delete\"\nmsgstr \"Usuń\"\n\n#: templates/pybb/post_template.html:49\nmsgid \"Approve post\"\nmsgstr \"Zaakceptuj post\"\n\n#: templates/pybb/post_template.html:53 templates/pybb/topic.html:62\nmsgid \"Admin\"\nmsgstr \"Admin\"\n\n#: templates/pybb/post_template.html:69\nmsgid \"Edited\"\nmsgstr \"Edytowano\"\n\n#: templates/pybb/post_template.html:83\nmsgid \"quote\"\nmsgstr \"cytuj\"\n\n#: templates/pybb/post_template.html:84\nmsgid \"quote selected\"\nmsgstr \"cytuj zaznaczone\"\n\n#: templates/pybb/topic.html:51\nmsgid \"Unstick topic\"\nmsgstr \"Odklej temat\"\n\n#: templates/pybb/topic.html:53\nmsgid \"Stick topic\"\nmsgstr \"Przyklej temat\"\n\n#: templates/pybb/topic.html:57\nmsgid \"Open topic\"\nmsgstr \"Otwórz temat\"\n\n#: templates/pybb/topic.html:59\nmsgid \"Close topic\"\nmsgstr \"Zamknij temat\"\n\n#: templates/pybb/topic.html:70\nmsgid \"Unsubscribe\"\nmsgstr \"Odsubskrybuj\"\n\n#: templates/pybb/topic_list.html:13\nmsgid \"Views\"\nmsgstr \"Wejścia\"\n\n#: templates/pybb/topic_list.html:16\nmsgid \"Last post\"\nmsgstr \"Ostatni post\"\n\n#: templates/pybb/topic_list.html:26\nmsgid \"Go to first unread post\"\nmsgstr \"Idź do pierwszego nieprzeczytanego posta\"\n\n#: templates/pybb/topic_list.html:32\n#, fuzzy\n#| msgid \"pages:\"\nmsgid \"pages\"\nmsgstr \"strony:\"\n\n#: templates/pybb/user.html:16\nmsgid \"Statistics\"\nmsgstr \"Statystyki\"\n\n#: templates/pybb/user.html:19\n#, python-format\nmsgid \"Number of topics: %(count)s\"\nmsgstr \"Liczba tematów: %(count)s\"\n\n#: templates/pybb/user.html:24\n#, python-format\nmsgid \"Number of posts: %(count)s\"\nmsgstr \"Liczba postów: %(count)s\"\n\n#: templates/pybb/user.html:29\n#, python-format\nmsgid \"Date of registration: %(date_joined)s \"\nmsgstr \"Data rejestracji: %(date_joined)s \"\n\n#: templates/pybb/user.html:36\n#, fuzzy\n#| msgid \"Moderators\"\nmsgid \"Moderator\"\nmsgstr \"Moderatorzy\"\n\n#: templates/pybb/user.html:41\nmsgid \"Block\"\nmsgstr \"Blokuj\"\n\n#: templates/pybb/user.html:42\nmsgid \"Block and delete all messages\"\nmsgstr \"Zablokuj i skasuj wszystkie posty\"\n\n#: templates/pybb/user.html:46\n#, fuzzy\nmsgid \"Unblock\"\nmsgstr \"Odblokuj\"\n\n#: templates/pybb/user_posts.html:12 templates/pybb/user_posts.html.py:17\n#, fuzzy\nmsgid \"All posts created by\"\nmsgstr \"Wszystkie tematy utworzone przez\"\n\n#: templates/pybb/user_topics.html:12 templates/pybb/user_topics.html.py:17\nmsgid \"All topics created by\"\nmsgstr \"Wszystkie tematy utworzone przez\"\n\n#: templates/pybb/users.html:8 templates/pybb/users.html.py:24\nmsgid \"Users\"\nmsgstr \"Użytkownicy\"\n\n#: templates/pybb/users.html:12\nmsgid \"Search\"\nmsgstr \"Szukaj\"\n\n#: templatetags/pybb_tags.py:61\n#, fuzzy, python-format\n#| msgid \"seconds ago\"\nmsgid \"%d second ago\"\nmsgid_plural \"%d seconds ago\"\nmsgstr[0] \"sekund temu\"\nmsgstr[1] \"sekund temu\"\n\n#: templatetags/pybb_tags.py:65\n#, fuzzy, python-format\n#| msgid \"minutes ago\"\nmsgid \"%d minute ago\"\nmsgid_plural \"%d minutes ago\"\nmsgstr[0] \"minut temu\"\nmsgstr[1] \"minut temu\"\n\n#: templatetags/pybb_tags.py:75\n#, python-format\nmsgid \"today, %s\"\nmsgstr \"dzisiaj, %s\"\n\n#: templatetags/pybb_tags.py:77\n#, python-format\nmsgid \"yesterday, %s\"\nmsgstr \"wczoraj, %s\"\n\n#: util.py:140\nmsgid \"Can't get profile for anonymous user\"\nmsgstr \"Nie można pokazać profilu anonimowego użytkownika\"\n\n#: views.py:156\n#, fuzzy\n#| msgid \"Forum categories are not created\"\nmsgid \"Forum does not exist\"\nmsgstr \"Nie utworzono żadnych kategorii\"\n\n#: views.py:388\nmsgid \"This topic does not exists\"\nmsgstr \"\"\n\n#: views.py:826\nmsgid \"\"\n\"Subscription removed. You will not receive emails from this topic unless you \"\n\"subscribe or post again.\"\nmsgstr \"\"\n\n#: views.py:837\nmsgid \"\"\n\"Subscription added. You will receive email notifications for replies to this \"\n\"topic.\"\nmsgstr \"\"\n\n#: views.py:855\nmsgid \"All forums marked as read\"\nmsgstr \"Wszystkie fora oznaczono jako przeczytane\"\n\n#: views.py:888\nmsgid \"User successfuly blocked\"\nmsgstr \"Użytkownik został zablokowany\"\n\n#: views.py:901\n#, fuzzy\nmsgid \"User successfuly unblocked\"\nmsgstr \"Użytkownik został odblokowany\"\n\n#: views.py:939\nmsgid \"Privileges updated\"\nmsgstr \"\"\n\n#~ msgid \"Subscribers:\"\n#~ msgstr \"Subskrybenci:\"\n\n#~ msgid \"Rank\"\n#~ msgstr \"Ranga\"\n\n#~ msgid \"seconds ago,seconds ago,seconds ago\"\n#~ msgstr \"sekund temu,sekund temu,sekund temu\"\n\n#~ msgid \"minutes ago,minutes ago,minutes ago\"\n#~ msgstr \"minut temu,minut temu,minut temu\"\n\n#~ msgid \"Change the password\"\n#~ msgstr \"Zmień hasło\"\n"
  },
  {
    "path": "pybb/locale/pt_BR/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-01-11 14:06+0100\\n\"\n\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: admin.py:45 admin.py:84 admin.py:112 admin.py:134\nmsgid \"Additional options\"\nmsgstr \"Opçoes adicionais\"\n\n#: admin.py:117 models.py:280\nmsgid \"Message\"\nmsgstr \"Mensagem\"\n\n#: admin.py:148\n#, fuzzy\n#| msgid \"Views count\"\nmsgid \"View post\"\nmsgstr \"Contagem de visualizações\"\n\n#: admin.py:153\n#, fuzzy\n#| msgid \"Editing the post\"\nmsgid \"Edit post\"\nmsgstr \"Editando o post\"\n\n#: apps.py:9\nmsgid \"Pybbm forum solution\"\nmsgstr \"\"\n\n#: feeds.py:27 feeds.py:28 templates/pybb/base.html:10\nmsgid \"Latest posts on forum\"\nmsgstr \"Últimos posts no fórum\"\n\n#: feeds.py:41 feeds.py:42 templates/pybb/base.html:11\nmsgid \"Latest topics on forum\"\nmsgstr \"Últimos tópicos no fórum\"\n\n#: forms.py:30\nmsgid \"Attachment is too big\"\nmsgstr \"O anexo é muito grande\"\n\n#: forms.py:48\n#, python-format\nmsgid \"You cant add more than %s answers for poll\"\nmsgstr \"\"\n\n#: forms.py:50\nmsgid \"Add two or more answers for this poll\"\nmsgstr \"\"\n\n#: forms.py:58 models.py:183\nmsgid \"Subject\"\nmsgstr \"Assunto\"\n\n#: forms.py:59 models.py:195\nmsgid \"Poll type\"\nmsgstr \"\"\n\n#: forms.py:61 models.py:196\n#, fuzzy\n#| msgid \"Position\"\nmsgid \"Poll question\"\nmsgstr \"Posição\"\n\n#: forms.py:64\n#, fuzzy\n#| msgid \"Topics\"\nmsgid \"Topic slug\"\nmsgstr \"Tópicos\"\n\n#: forms.py:123\nmsgid \"Polls question is required when adding a poll\"\nmsgstr \"\"\n\n#: forms.py:176 models.py:186 models.py:295 models.py:368 models.py:507\nmsgid \"User\"\nmsgstr \"Usuário\"\n\n#: forms.py:212\n#, python-format\nmsgid \"Avatar is too large, max size: %s bytes\"\nmsgstr \"\"\n\n#: forms.py:272\nmsgid \"be unsubscribe from this forum\"\nmsgstr \"\"\n\n#: forms.py:277\nmsgid \"You want to\"\nmsgstr \"\"\n\n#: forms.py:281\n#, fuzzy\n#| msgid \"New topic\"\nmsgid \"only new topics\"\nmsgstr \"Novo tópico\"\n\n#: forms.py:282\n#, fuzzy\n#| msgid \"Latest topics on forum\"\nmsgid \"all topics of the forum\"\nmsgstr \"Últimos tópicos no fórum\"\n\n#: forms.py:285\n#, fuzzy\nmsgid \"Concerned topics\"\nmsgstr \"Novo tópico\"\n\n#: models.py:23 models.py:59\nmsgid \"Name\"\nmsgstr \"Nome\"\n\n#: models.py:24 models.py:60\nmsgid \"Position\"\nmsgstr \"Posição\"\n\n#: models.py:25 models.py:66 templates/pybb/category.html:4\n#: templates/pybb/forum_list.html:26\nmsgid \"Hidden\"\nmsgstr \"\"\n\n#: models.py:26\nmsgid \"If checked, this category will be visible only for staff\"\nmsgstr \"\"\n\n#: models.py:27 models.py:69 models.py:197\nmsgid \"Slug\"\nmsgstr \"\"\n\n#: models.py:31 models.py:56\nmsgid \"Category\"\nmsgstr \"Categoria\"\n\n#: models.py:32\nmsgid \"Categories\"\nmsgstr \"Categorias\"\n\n#: models.py:57\nmsgid \"Parent forum\"\nmsgstr \"\"\n\n#: models.py:61\nmsgid \"Description\"\nmsgstr \"Descrição\"\n\n#: models.py:62\nmsgid \"Moderators\"\nmsgstr \"Moderadores\"\n\n#: models.py:63 models.py:185 models.py:297\nmsgid \"Updated\"\nmsgstr \"Atualizado\"\n\n#: models.py:64 models.py:192 profiles.py:41\nmsgid \"Post count\"\nmsgstr \"Número de post\"\n\n#: models.py:65\n#, fuzzy\n#| msgid \"Post count\"\nmsgid \"Topic count\"\nmsgstr \"Número de post\"\n\n#: models.py:68\nmsgid \"Headline\"\nmsgstr \"\"\n\n#: models.py:73 models.py:136 models.py:182 templates/pybb/forum_list.html:8\nmsgid \"Forum\"\nmsgstr \"Fórum\"\n\n#: models.py:74\nmsgid \"Forums\"\nmsgstr \"Fóruns\"\n\n#: models.py:129\nmsgid \"be notified only when a new topic is added\"\nmsgstr \"\"\n\n#: models.py:130\nmsgid \"be auto-subscribed to topics\"\nmsgstr \"\"\n\n#: models.py:134\n#, fuzzy\n#| msgid \"Subscribers\"\nmsgid \"Subscriber\"\nmsgstr \"Assinantes\"\n\n#: models.py:138\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription type\"\nmsgstr \"Assinaturas nos tópicos\"\n\n#: models.py:148\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription to forum\"\nmsgstr \"Assinaturas nos tópicos\"\n\n#: models.py:149\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscriptions to forums\"\nmsgstr \"Assinaturas nos tópicos\"\n\n#: models.py:177\nmsgid \"None\"\nmsgstr \"\"\n\n#: models.py:178\nmsgid \"Single answer\"\nmsgstr \"\"\n\n#: models.py:179\nmsgid \"Multiple answers\"\nmsgstr \"\"\n\n#: models.py:184 models.py:296\nmsgid \"Created\"\nmsgstr \"Criado\"\n\n#: models.py:187\nmsgid \"Views count\"\nmsgstr \"Contagem de visualizações\"\n\n#: models.py:188 templates/pybb/topic_list.html:27\nmsgid \"Sticky\"\nmsgstr \"Pendurado\"\n\n#: models.py:189 templates/pybb/topic_list.html:28\nmsgid \"Closed\"\nmsgstr \"Fechado\"\n\n#: models.py:191 templates/pybb/topic.html:88\nmsgid \"Subscribers\"\nmsgstr \"Assinantes\"\n\n#: models.py:194 models.py:299\n#, fuzzy\n#| msgid \"Moderators\"\nmsgid \"On moderation\"\nmsgstr \"Moderadores\"\n\n#: models.py:201 models.py:294 models.py:483 templates/pybb/topic_list.html:7\nmsgid \"Topic\"\nmsgstr \"Tópico\"\n\n#: models.py:202 templates/pybb/forum_list.html:11\n#: templates/pybb/user_topics.html:7\nmsgid \"Topics\"\nmsgstr \"Tópicos\"\n\n#: models.py:281\nmsgid \"HTML version\"\nmsgstr \"Versão HTML\"\n\n#: models.py:282\nmsgid \"Text version\"\nmsgstr \"Versão Texto\"\n\n#: models.py:298\nmsgid \"User IP\"\nmsgstr \"IP do usuário\"\n\n#: models.py:303 models.py:386\nmsgid \"Post\"\nmsgstr \"Post\"\n\n#: models.py:304 templates/pybb/forum_list.html:14\n#: templates/pybb/topic.html:42 templates/pybb/topic_list.html:10\n#: templates/pybb/user_posts.html:7\nmsgid \"Posts\"\nmsgstr \"Posts\"\n\n#: models.py:371\nmsgid \"Profile\"\nmsgstr \"Perfil\"\n\n#: models.py:372\nmsgid \"Profiles\"\nmsgstr \"Perfis\"\n\n#: models.py:383\nmsgid \"Attachment\"\nmsgstr \"Anexo\"\n\n#: models.py:384\n#, fuzzy\n#| msgid \"Attachment\"\nmsgid \"Attachments\"\nmsgstr \"Anexo\"\n\n#: models.py:387\nmsgid \"Size\"\nmsgstr \"Tamanho\"\n\n#: models.py:388\nmsgid \"File\"\nmsgstr \"\"\n\n#: models.py:438\nmsgid \"Topic read tracker\"\nmsgstr \"\"\n\n#: models.py:439\nmsgid \"Topic read trackers\"\nmsgstr \"\"\n\n#: models.py:476\nmsgid \"Forum read tracker\"\nmsgstr \"\"\n\n#: models.py:477\nmsgid \"Forum read trackers\"\nmsgstr \"\"\n\n#: models.py:484\nmsgid \"Text\"\nmsgstr \"\"\n\n#: models.py:487 models.py:506\nmsgid \"Poll answer\"\nmsgstr \"\"\n\n#: models.py:488\nmsgid \"Polls answers\"\nmsgstr \"\"\n\n#: models.py:511\nmsgid \"Poll answer user\"\nmsgstr \"\"\n\n#: models.py:512\nmsgid \"Polls answers users\"\nmsgstr \"\"\n\n#: models.py:535\n#, python-format\nmsgid \"\"\n\"After %(limit)s attemps, there is not any unique slug value for \\\"%(slug)s\\\"\"\nmsgstr \"\"\n\n#: profiles.py:34\nmsgid \"Signature\"\nmsgstr \"Assinatura\"\n\n#: profiles.py:35\n#, fuzzy\nmsgid \"Signature HTML Version\"\nmsgstr \"Versão HTML\"\n\n#: profiles.py:37\nmsgid \"Time zone\"\nmsgstr \"Fuso horário\"\n\n#: profiles.py:38\nmsgid \"Language\"\nmsgstr \"Língua\"\n\n#: profiles.py:40\nmsgid \"Show signatures\"\nmsgstr \"Mostrar assinaturas\"\n\n#: profiles.py:42\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\n#: profiles.py:44\nmsgid \"Automatically subscribe\"\nmsgstr \"\"\n\n#: profiles.py:45\nmsgid \"Automatically subscribe to topics that you answer\"\nmsgstr \"\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#, fuzzy\n#| msgid \"Description\"\nmsgid \"Manage subscription\"\nmsgstr \"Descrição\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#: templates/pybb/topic.html:72\nmsgid \"Subscribe\"\nmsgstr \"Inscrever\"\n\n#: templates/pybb/_button_new_topic.html:1 templates/pybb/add_post.html:5\n#: templates/pybb/add_post.html.py:32\nmsgid \"New topic\"\nmsgstr \"Novo tópico\"\n\n#: templates/pybb/_button_save.html:1\nmsgid \"Save\"\nmsgstr \"Salvar\"\n\n#: templates/pybb/_button_submit.html:1\n#: templates/pybb/forum_subscription.html:33\nmsgid \"Submit\"\nmsgstr \"Enviar\"\n\n#: templates/pybb/_markitup.html:25\n#: templates/pybb/markup/bbcode_widget.html:16\n#: templates/pybb/markup/markdown_widget.html:24\nmsgid \"Bold\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:26\n#: templates/pybb/markup/bbcode_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:25\nmsgid \"Italic\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:27\n#: templates/pybb/markup/bbcode_widget.html:18\nmsgid \"Underline\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:28\n#: templates/pybb/markup/bbcode_widget.html:19\nmsgid \"Stroke\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:30\n#: templates/pybb/markup/bbcode_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:32\n#, fuzzy\n#| msgid \"Signature\"\nmsgid \"Picture\"\nmsgstr \"Assinatura\"\n\n#: templates/pybb/_markitup.html:31\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Link\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:33\n#: templates/pybb/markup/bbcode_widget.html:24\nmsgid \"Bulleted list\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:34\n#: templates/pybb/markup/bbcode_widget.html:25\nmsgid \"Numeric list\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:35\n#: templates/pybb/markup/bbcode_widget.html:26\nmsgid \"List item\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:37\n#: templates/pybb/markup/bbcode_widget.html:28\n#: templates/pybb/markup/markdown_widget.html:35\n#, fuzzy\n#| msgid \"quote\"\nmsgid \"Quotes\"\nmsgstr \"citar\"\n\n#: templates/pybb/_markitup.html:38\n#: templates/pybb/markup/bbcode_widget.html:29\nmsgid \"Code\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:40\n#: templates/pybb/markup/bbcode_widget.html:31\nmsgid \"Clean\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:41\n#: templates/pybb/markup/bbcode_widget.html:32\n#: templates/pybb/markup/markdown_widget.html:38\nmsgid \"Preview\"\nmsgstr \"Prever\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"Register\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"or\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"login\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"to create to post a reply\"\nmsgstr \"\"\n\n#: templates/pybb/add_post.html:5 templates/pybb/add_post.html.py:32\nmsgid \"New reply\"\nmsgstr \"Nova resposta\"\n\n#: templates/pybb/attachments_formset.html:6\n#, fuzzy\n#| msgid \"Attachment\"\nmsgid \"Add attachments\"\nmsgstr \"Anexo\"\n\n#: templates/pybb/attachments_formset.html:14\nmsgid \"\"\n\"If you need to upload larger files, please use an external storage website.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:14\n#, python-format\nmsgid \"(max size: %(max_size)s)\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:17\n#: templates/pybb/edit_profile.html:25\nmsgid \"delete\"\nmsgstr \"deletar\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Reference to your file\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Ref\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#: templates/pybb/topic.html:88 templates/pybb/topic_list.html:32\nmsgid \":\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"link\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"Insert a link to your file inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"image\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"Insert your image inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/breadcrumb.html:4\nmsgid \"Home\"\nmsgstr \"\"\n\n#: templates/pybb/delete_post.html:5\nmsgid \"Are you sure you want to delete this message?\"\nmsgstr \"Você tem certeza que deseja remover esta mensagem?\"\n\n#: templates/pybb/delete_post.html:12\nmsgid \"No, take me back\"\nmsgstr \"\"\n\n#: templates/pybb/delete_post.html:13\n#, fuzzy\n#| msgid \"Yes, I am sure.\"\nmsgid \"Yes, I am sure\"\nmsgstr \"Sim, eu tenho.\"\n\n#: templates/pybb/edit_post.html:4 templates/pybb/edit_post.html.py:17\nmsgid \"Editing the post\"\nmsgstr \"Editando o post\"\n\n#: templates/pybb/edit_privileges.html:5 templates/pybb/edit_privileges.html:8\nmsgid \"Grant moderator privileges\"\nmsgstr \"\"\n\n#: templates/pybb/edit_profile.html:5 templates/pybb/edit_profile.html.py:8\n#: templates/pybb/edit_profile.html:13\nmsgid \"Profile editing\"\nmsgstr \"Editando perfil\"\n\n#: templates/pybb/edit_profile.html:18\nmsgid \"Subscriptions on topics\"\nmsgstr \"Assinaturas nos tópicos\"\n\n#: templates/pybb/forum_list.html:17\nmsgid \"Last posts\"\nmsgstr \"Últimos posts\"\n\n#: templates/pybb/forum_list.html:43\nmsgid \"No forums created\"\nmsgstr \"\"\n\n#: templates/pybb/forum_list.html:44\nmsgid \"Add forum now\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:4\n#, python-format\nmsgctxt \"page title\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:14\n#, python-format\nmsgctxt \"content heading\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:32\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:17\nmsgid \"Forum categories are not created\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:18\nmsgid \"Add a category now\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:22 templates/pybb/latest_topics.html:5\n#: templates/pybb/latest_topics.html:8 templates/pybb/latest_topics.html:15\n#, fuzzy\n#| msgid \"Last topics\"\nmsgid \"Last updates in topics\"\nmsgstr \"Últimos tópicos\"\n\n#: templates/pybb/index.html:23\nmsgid \"Mark all forums as read\"\nmsgstr \"\"\n\n#: templates/pybb/latest_topics.html:31\nmsgid \"Mark all topics as read\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:4\n#, python-format\nmsgid \"\"\n\"User %(username)s post a new topic in forum to which you are subscribed \"\n\"(%(forum_name)s).\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#, fuzzy\n#| msgid \"Stick topic\"\nmsgid \"Link to topic\"\nmsgstr \"Pendurar tópico\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\nmsgid \"Link to forum\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\nmsgid \"\"\n\"If you don't want to receive notifications on new topics in this forum visit \"\n\"following link\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_subject.html:2\nmsgid \"New topic in forum that you subscribed.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:7\n#: templates/pybb/mail_templates/subscription_email_body.html:3\n#, python-format\nmsgid \"User %(username)s replied in topic to which you are subscribed.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:10\n#, python-format\nmsgid \"\"\n\"Follow %(link_post_start)sthis link%(link_end)s to see the new post on the \"\n\"topic %(link_topic_start)s%(topic_name)s%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:14\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new posts in this topic visit \"\n\"%(link_start)sthis link%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#, fuzzy\n#| msgid \"Editing the post\"\nmsgid \"Link to post\"\nmsgstr \"Editando o post\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:8\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new messages in this topic \"\n\"visit following link: %(delete_url_full)s\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_subject.html:2\nmsgid \"New answer in topic that you subscribed.\"\nmsgstr \"\"\n\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Your text to link here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\nmsgid \"First Level Heading\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:18\n#: templates/pybb/markup/markdown_widget.html:19\n#: templates/pybb/markup/markdown_widget.html:20\n#: templates/pybb/markup/markdown_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Your title here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:18\nmsgid \"Second Level Heading\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:19\nmsgid \"Heading 3\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:20\nmsgid \"Heading 4\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:21\nmsgid \"Heading 5\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Heading 6\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:27\nmsgid \"Bulleted List\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:28\nmsgid \"Numeric List\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:36\nmsgid \"Code Block / Code\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:7\nmsgid \"previous page\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:21\nmsgid \"next page\"\nmsgstr \"\"\n\n#: templates/pybb/poll.html:4\nmsgid \"Poll\"\nmsgstr \"\"\n\n#: templates/pybb/poll.html:36\nmsgid \"Cancel my poll vote\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:7\nmsgid \"Poll answers\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:20\nmsgid \"remove answer\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:21\nmsgid \"add answer\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:28\n#, python-format\nmsgid \"Rank: %(rank)s\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:41 templates/pybb/user.html:51\nmsgid \"Edit\"\nmsgstr \"Editar\"\n\n#: templates/pybb/post_template.html:45\n#, fuzzy\nmsgid \"Delete post?\"\nmsgstr \"Deletar\"\n\n#: templates/pybb/post_template.html:46\nmsgid \"Delete\"\nmsgstr \"Deletar\"\n\n#: templates/pybb/post_template.html:49\nmsgid \"Approve post\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:53 templates/pybb/topic.html:62\n#, fuzzy\n#| msgid \"Admincp\"\nmsgid \"Admin\"\nmsgstr \"AdminPC\"\n\n#: templates/pybb/post_template.html:69\nmsgid \"Edited\"\nmsgstr \"Editado\"\n\n#: templates/pybb/post_template.html:83\nmsgid \"quote\"\nmsgstr \"citar\"\n\n#: templates/pybb/post_template.html:84\nmsgid \"quote selected\"\nmsgstr \"\"\n\n#: templates/pybb/topic.html:51\nmsgid \"Unstick topic\"\nmsgstr \"Despendurar tópico\"\n\n#: templates/pybb/topic.html:53\nmsgid \"Stick topic\"\nmsgstr \"Pendurar tópico\"\n\n#: templates/pybb/topic.html:57\nmsgid \"Open topic\"\nmsgstr \"Abrir tópico\"\n\n#: templates/pybb/topic.html:59\nmsgid \"Close topic\"\nmsgstr \"Fechar tópico\"\n\n#: templates/pybb/topic.html:70\nmsgid \"Unsubscribe\"\nmsgstr \"Desinscrever\"\n\n#: templates/pybb/topic_list.html:13\n#, fuzzy\n#| msgid \"Views count\"\nmsgid \"Views\"\nmsgstr \"Contagem de visualizações\"\n\n#: templates/pybb/topic_list.html:16\n#, fuzzy\n#| msgid \"Last posts\"\nmsgid \"Last post\"\nmsgstr \"Últimos posts\"\n\n#: templates/pybb/topic_list.html:26\nmsgid \"Go to first unread post\"\nmsgstr \"\"\n\n#: templates/pybb/topic_list.html:32\n#, fuzzy\nmsgid \"pages\"\nmsgstr \"Mensagem\"\n\n#: templates/pybb/user.html:16\nmsgid \"Statistics\"\nmsgstr \"Estatísticas\"\n\n#: templates/pybb/user.html:19\n#, fuzzy, python-format\n#| msgid \"Number of topics\"\nmsgid \"Number of topics: %(count)s\"\nmsgstr \"Número de tópicos\"\n\n#: templates/pybb/user.html:24\n#, fuzzy, python-format\n#| msgid \"Number of posts\"\nmsgid \"Number of posts: %(count)s\"\nmsgstr \"Número de posts\"\n\n#: templates/pybb/user.html:29\n#, fuzzy, python-format\n#| msgid \"Date of registration\"\nmsgid \"Date of registration: %(date_joined)s \"\nmsgstr \"Data de registro\"\n\n#: templates/pybb/user.html:36\n#, fuzzy\n#| msgid \"Moderators\"\nmsgid \"Moderator\"\nmsgstr \"Moderadores\"\n\n#: templates/pybb/user.html:41\nmsgid \"Block\"\nmsgstr \"\"\n\n#: templates/pybb/user.html:42\nmsgid \"Block and delete all messages\"\nmsgstr \"\"\n\n#: templates/pybb/user.html:46\nmsgid \"Unblock\"\nmsgstr \"\"\n\n#: templates/pybb/user_posts.html:12 templates/pybb/user_posts.html.py:17\nmsgid \"All posts created by\"\nmsgstr \"\"\n\n#: templates/pybb/user_topics.html:12 templates/pybb/user_topics.html.py:17\nmsgid \"All topics created by\"\nmsgstr \"\"\n\n#: templates/pybb/users.html:8 templates/pybb/users.html.py:24\nmsgid \"Users\"\nmsgstr \"Usuários\"\n\n#: templates/pybb/users.html:12\nmsgid \"Search\"\nmsgstr \"Procurar\"\n\n#: templatetags/pybb_tags.py:61\n#, fuzzy, python-format\n#| msgid \"seconds ago\"\nmsgid \"%d second ago\"\nmsgid_plural \"%d seconds ago\"\nmsgstr[0] \"segundos atrás\"\nmsgstr[1] \"segundos atrás\"\n\n#: templatetags/pybb_tags.py:65\n#, fuzzy, python-format\n#| msgid \"minutes ago\"\nmsgid \"%d minute ago\"\nmsgid_plural \"%d minutes ago\"\nmsgstr[0] \"minutos atrás\"\nmsgstr[1] \"minutos atrás\"\n\n#: templatetags/pybb_tags.py:75\n#, python-format\nmsgid \"today, %s\"\nmsgstr \"hoje, %s\"\n\n#: templatetags/pybb_tags.py:77\n#, python-format\nmsgid \"yesterday, %s\"\nmsgstr \"ontem, %s\"\n\n#: util.py:140\nmsgid \"Can't get profile for anonymous user\"\nmsgstr \"\"\n\n#: views.py:156\n#, fuzzy\n#| msgid \"User with login %s does not exist\"\nmsgid \"Forum does not exist\"\nmsgstr \"Usuário com o login %s não existe\"\n\n#: views.py:388\n#, fuzzy\n#| msgid \"User with login %s does not exist\"\nmsgid \"This topic does not exists\"\nmsgstr \"Usuário com o login %s não existe\"\n\n#: views.py:826\nmsgid \"\"\n\"Subscription removed. You will not receive emails from this topic unless you \"\n\"subscribe or post again.\"\nmsgstr \"\"\n\n#: views.py:837\nmsgid \"\"\n\"Subscription added. You will receive email notifications for replies to this \"\n\"topic.\"\nmsgstr \"\"\n\n#: views.py:855\nmsgid \"All forums marked as read\"\nmsgstr \"\"\n\n#: views.py:888\nmsgid \"User successfuly blocked\"\nmsgstr \"\"\n\n#: views.py:901\nmsgid \"User successfuly unblocked\"\nmsgstr \"\"\n\n#: views.py:939\nmsgid \"Privileges updated\"\nmsgstr \"\"\n\n#~ msgid \"IM\"\n#~ msgstr \"MP\"\n\n#, fuzzy\n#~ msgid \"Ban options\"\n#~ msgstr \"Opçoes adicionais\"\n\n#~ msgid \"Markup\"\n#~ msgstr \"Marcação\"\n\n#, fuzzy\n#~ msgid \"Caution\"\n#~ msgstr \"Localização\"\n\n#~ msgid \"Site\"\n#~ msgstr \"Site\"\n\n#~ msgid \"Jabber\"\n#~ msgstr \"Jabber\"\n\n#~ msgid \"ICQ\"\n#~ msgstr \"ICQ\"\n\n#~ msgid \"MSN\"\n#~ msgstr \"MSN\"\n\n#~ msgid \"AIM\"\n#~ msgstr \"AIM\"\n\n#~ msgid \"Yahoo\"\n#~ msgstr \"Yahoo\"\n\n#~ msgid \"Location\"\n#~ msgstr \"Localização\"\n\n#~ msgid \"Default markup\"\n#~ msgstr \"Marcação padrão\"\n\n#~ msgid \"Time\"\n#~ msgstr \"Tempo\"\n\n#~ msgid \"Read\"\n#~ msgstr \"Ler\"\n\n#~ msgid \"Reads\"\n#~ msgstr \"Leituras\"\n\n#~ msgid \"Content type\"\n#~ msgstr \"Tipo de conteúdo\"\n\n#~ msgid \"Path\"\n#~ msgstr \"Caminho\"\n\n#~ msgid \"Hash\"\n#~ msgstr \"Hash\"\n\n#~ msgid \"\"\n#~ \"New reply from %(username)s to topic that you have subscribed on.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"See topic: %(post_url)s\\n\"\n#~ \"Unsubscribe %(unsubscribe_url)s\"\n#~ msgstr \"\"\n#~ \"Nova resposta de %(username)s para o tópico em que vc se inscreveu.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"Veja o tópico: %(post_url)s\\n\"\n#~ \"Deinscrever %(unsubscribe_url)s\"\n\n#~ msgid \"Root\"\n#~ msgstr \"Raiz\"\n\n#~ msgid \"New private message\"\n#~ msgstr \"Nova mensagem privada\"\n\n#~ msgid \"Change the password\"\n#~ msgstr \"Mudar a senha\"\n\n#~ msgid \"PYBB - django forum engine\"\n#~ msgstr \"PYBB - django forum\"\n\n#~ msgid \"Important\"\n#~ msgstr \"Importante\"\n\n#~ msgid \"My profile\"\n#~ msgstr \"Meu perfil\"\n\n#~ msgid \"Log out\"\n#~ msgstr \"Sair\"\n\n#~ msgid \"Logged in as \"\n#~ msgstr \"Logado como \"\n\n#~ msgid \"Sign up\"\n#~ msgstr \"Registrar\"\n\n#~ msgid \"Log in\"\n#~ msgstr \"Autenticar\"\n\n#~ msgid \"Search powered by Google\"\n#~ msgstr \"Procura by Google\"\n\n#, fuzzy\n#~ msgid \"Merge\"\n#~ msgstr \"Mensagem\"\n\n#~ msgid \"of\"\n#~ msgstr \"de\"\n\n#, fuzzy\n#~ msgid \"Find all topics\"\n#~ msgstr \"Últimos tópicos\"\n\n#~ msgid \"Contacts\"\n#~ msgstr \"Contatos\"\n\n#~ msgid \"seconds ago,seconds ago,seconds ago\"\n#~ msgstr \"segundos atrás,segundos atrás,segundos atrás\"\n\n#~ msgid \"minutes ago,minutes ago,minutes ago\"\n#~ msgstr \"minutos atrás,minutos atrás,minutos atrás\"\n\n#~ msgid \"Recipient\"\n#~ msgstr \"Destinatário\"\n\n#~ msgid \"Inbox\"\n#~ msgstr \"Caixa de entrada\"\n\n#~ msgid \"Outbox\"\n#~ msgstr \"Caixa de saída\"\n\n#, fuzzy\n#~ msgid \"Trash\"\n#~ msgstr \"Hash\"\n\n#~ msgid \"Author\"\n#~ msgstr \"Autor\"\n\n#~ msgid \"Private message\"\n#~ msgstr \"Mensagem privada\"\n\n#~ msgid \"Private messages\"\n#~ msgstr \"Mensagens privadas\"\n\n#, fuzzy\n#~ msgid \"Messagebox\"\n#~ msgstr \"Mensagem\"\n\n#~ msgid \"\"\n#~ \"User %(username)s have sent your the new private message.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"See message online: %(pm_url)s\"\n#~ msgstr \"\"\n#~ \"O usuário %(username)s lhe enviou uma nova mensagem privada.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"Veja a mensgaem: %(pm_url)s\"\n\n#~ msgid \"New private message for you\"\n#~ msgstr \"Nova mensagem privada para você\"\n\n#~ msgid \"PM\"\n#~ msgstr \"MP\"\n\n#~ msgid \"Send PM\"\n#~ msgstr \"Enviar MP\"\n\n#, fuzzy\n#~ msgid \"Select messages:\"\n#~ msgstr \"Mensagens privadas\"\n\n#, fuzzy\n#~ msgid \"Read messages\"\n#~ msgstr \"Mensagens privadas\"\n\n#, fuzzy\n#~ msgid \"Unread messages\"\n#~ msgstr \"Mensagens privadas\"\n\n#~ msgid \"Message from\"\n#~ msgstr \"Mensagem de\"\n\n#~ msgid \"Message for\"\n#~ msgstr \"Mensagem para\"\n\n#~ msgid \"Reply\"\n#~ msgstr \"Responser\"\n\n#~ msgid \"to\"\n#~ msgstr \"para\"\n\n#, fuzzy\n#~ msgid \"Are you sure you want to delete these messages?\"\n#~ msgstr \"Você tem certeza que deseja remover esta mensagem?\"\n\n#, fuzzy\n#~ msgid \"From\"\n#~ msgstr \"de\"\n\n#, fuzzy\n#~ msgid \"Sent messages\"\n#~ msgstr \"Mensagens privadas\"\n\n#~ msgid \"outbox\"\n#~ msgstr \"Caixa de saída\"\n\n#, fuzzy\n#~ msgid \"inbox\"\n#~ msgstr \"Caixa de entrada\"\n\n#, fuzzy\n#~ msgid \"Are you sure you want to delete this post?\"\n#~ msgstr \"Você tem certeza que deseja remover esta mensagem?\"\n\n#~ msgid \"Back\"\n#~ msgstr \"Voltar\"\n\n#~ msgid \"Forward\"\n#~ msgstr \"Avançar\"\n"
  },
  {
    "path": "pybb/locale/ru/LC_MESSAGES/django.po",
    "content": "# Russian translation for pybbm forum\n# Copyright (C) 2011 Zhukov Pavel\n# This file is distributed under the same license as the pybb package.\n# Pavel Zhukov <gelios@gmail.com> 2011\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pybbm\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-02-13 11:30+0300\\n\"\n\"PO-Revision-Date: 2017-01-11 14:16+0100\\n\"\n\"Last-Translator: DylannCordel <d.cordel@webu.coop>\\n\"\n\"Language-Team: \\n\"\n\"Language: ru\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n\"\n\"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\\n\"\n\"X-Generator: Poedit 1.6.10\\n\"\n\"X-Poedit-SourceCharset: UTF-8\\n\"\n\"X-Poedit-Basepath: ../../..\\n\"\n\n#: admin.py:45 admin.py:84 admin.py:112 admin.py:134\nmsgid \"Additional options\"\nmsgstr \"Дополнительные свойства\"\n\n#: admin.py:117 models.py:280\nmsgid \"Message\"\nmsgstr \"Сообщение\"\n\n#: admin.py:148\nmsgid \"View post\"\nmsgstr \"Просмотр сообщения\"\n\n#: admin.py:153\nmsgid \"Edit post\"\nmsgstr \"Редактирование сообщения\"\n\n#: apps.py:9\nmsgid \"Pybbm forum solution\"\nmsgstr \"Форум Pybbm\"\n\n#: feeds.py:27 feeds.py:28 templates/pybb/base.html:10\nmsgid \"Latest posts on forum\"\nmsgstr \"Последние сообщения на форуме\"\n\n#: feeds.py:41 feeds.py:42 templates/pybb/base.html:11\nmsgid \"Latest topics on forum\"\nmsgstr \"Последние темы на форуме\"\n\n#: forms.py:32\nmsgid \"Attachment is too big\"\nmsgstr \"Вложение слишком большое\"\n\n#: forms.py:50\n#, python-format\nmsgid \"You cant add more than %s answers for poll\"\nmsgstr \"Вы не можете добавить более чем %s ответов на опрос\"\n\n#: forms.py:52\nmsgid \"Add two or more answers for this poll\"\nmsgstr \"Добавьте по крайней мере 2 варианта ответа на опрос\"\n\n#: forms.py:60 models.py:183\nmsgid \"Subject\"\nmsgstr \"Заголовок\"\n\n#: forms.py:61 models.py:195\nmsgid \"Poll type\"\nmsgstr \"Тип опроса\"\n\n#: forms.py:63 models.py:196\nmsgid \"Poll question\"\nmsgstr \"Тема опроса\"\n\n#: forms.py:66\nmsgid \"Topic slug\"\nmsgstr \"Метка темы\"\n\n#: forms.py:125\nmsgid \"Polls question is required when adding a poll\"\nmsgstr \"Необходимо указать вопрос при добавлении опроса\"\n\n#: forms.py:204\n#, python-format\nmsgid \"%(i)d (%(author)s: \\\"%(abstract)s\\\")\"\nmsgstr \"%(i)d (%(author)s: \\\"%(abstract)s\\\")\"\n\n#: forms.py:206 models.py:177\nmsgid \"None\"\nmsgstr \"Никакие\"\n\n#: forms.py:207\nmsgid \"All\"\nmsgstr \"Все\"\n\n#: forms.py:209\nmsgid \"Number of following posts to move with\"\nmsgstr \"Количество сообщений для перемещения\"\n\n#: forms.py:235\nmsgid \"Move to forum\"\nmsgstr \"Перенести на форум\"\n\n#: forms.py:238\nmsgid \"New subject\"\nmsgstr \"Новый заголовок\"\n\n#: forms.py:242\nmsgid \"New topic slug\"\nmsgstr \"Новый ЧПУ темы\"\n\n#: forms.py:300 models.py:186 models.py:295 models.py:372 models.py:511\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\n#: forms.py:336\n#, python-format\nmsgid \"Avatar is too large, max size: %s bytes\"\nmsgstr \"Аватар слишком большой, максимальный размер: %s байт\"\n\n#: forms.py:396\nmsgid \"be unsubscribe from this forum\"\nmsgstr \"отписаться от этого форума\"\n\n#: forms.py:401\nmsgid \"You want to\"\nmsgstr \"Вы хотите\"\n\n#: forms.py:405\nmsgid \"only new topics\"\nmsgstr \"только новые темы\"\n\n#: forms.py:406\nmsgid \"all topics of the forum\"\nmsgstr \"все темы форума\"\n\n#: forms.py:409\nmsgid \"Concerned topics\"\nmsgstr \"выбранные темы\"\n\n#: models.py:23 models.py:59\nmsgid \"Name\"\nmsgstr \"Имя\"\n\n#: models.py:24 models.py:60\nmsgid \"Position\"\nmsgstr \"Позиция\"\n\n#: models.py:25 models.py:66 templates/pybb/category.html:4\n#: templates/pybb/forum_list.html:26\nmsgid \"Hidden\"\nmsgstr \"Скрыто\"\n\n#: models.py:26\nmsgid \"If checked, this category will be visible only for staff\"\nmsgstr \"\"\n\"Если отмечено, данная категория будет отображаться только для персонала\"\n\n#: models.py:27 models.py:69 models.py:197\nmsgid \"Slug\"\nmsgstr \"Метка\"\n\n#: models.py:31 models.py:56\nmsgid \"Category\"\nmsgstr \"Категория\"\n\n#: models.py:32\nmsgid \"Categories\"\nmsgstr \"Категории\"\n\n#: models.py:57\nmsgid \"Parent forum\"\nmsgstr \"Родительский форум\"\n\n#: models.py:61\nmsgid \"Description\"\nmsgstr \"Описание\"\n\n#: models.py:62\nmsgid \"Moderators\"\nmsgstr \"Модераторы\"\n\n#: models.py:63 models.py:185 models.py:297\nmsgid \"Updated\"\nmsgstr \"Дата обновления\"\n\n#: models.py:64 models.py:192 profiles.py:41\nmsgid \"Post count\"\nmsgstr \"Количество сообщений\"\n\n#: models.py:65\nmsgid \"Topic count\"\nmsgstr \"Количество тем\"\n\n#: models.py:68\nmsgid \"Headline\"\nmsgstr \"Шапка\"\n\n#: models.py:73 models.py:136 models.py:182 templates/pybb/forum_list.html:8\nmsgid \"Forum\"\nmsgstr \"Форум\"\n\n#: models.py:74\nmsgid \"Forums\"\nmsgstr \"Форумы\"\n\n#: models.py:129\nmsgid \"be notified only when a new topic is added\"\nmsgstr \"получать уведомления только о новых темах\"\n\n#: models.py:130\nmsgid \"be auto-subscribed to topics\"\nmsgstr \"автоматически подписываться на темы\"\n\n#: models.py:134\nmsgid \"Subscriber\"\nmsgstr \"Подписчик\"\n\n#: models.py:138\nmsgid \"Subscription type\"\nmsgstr \"Тип подписки\"\n\n#: models.py:148\nmsgid \"Subscription to forum\"\nmsgstr \"Подписка на форум\"\n\n#: models.py:149\nmsgid \"Subscriptions to forums\"\nmsgstr \"Подписка на форумы\"\n\n#: models.py:178\nmsgid \"Single answer\"\nmsgstr \"Выбор одного варианта\"\n\n#: models.py:179\nmsgid \"Multiple answers\"\nmsgstr \"Выбор нескольких вариантов\"\n\n#: models.py:184 models.py:296\nmsgid \"Created\"\nmsgstr \"Дата создания\"\n\n#: models.py:187\nmsgid \"Views count\"\nmsgstr \"Количество просмотров\"\n\n#: models.py:188 templates/pybb/topic_list.html:27\nmsgid \"Sticky\"\nmsgstr \"Закреплено\"\n\n#: models.py:189 templates/pybb/topic_list.html:28\nmsgid \"Closed\"\nmsgstr \"Закрыто\"\n\n#: models.py:191 templates/pybb/topic.html:88\nmsgid \"Subscribers\"\nmsgstr \"Подписчики\"\n\n#: models.py:194 models.py:299\nmsgid \"On moderation\"\nmsgstr \"На модерации\"\n\n#: models.py:201 models.py:294 models.py:487 templates/pybb/topic_list.html:7\nmsgid \"Topic\"\nmsgstr \"Тема\"\n\n#: models.py:202 templates/pybb/forum_list.html:11\n#: templates/pybb/user_topics.html:7\nmsgid \"Topics\"\nmsgstr \"Темы\"\n\n#: models.py:281\nmsgid \"HTML version\"\nmsgstr \"HTML версия\"\n\n#: models.py:282\nmsgid \"Text version\"\nmsgstr \"Текстовая версия\"\n\n#: models.py:298\nmsgid \"User IP\"\nmsgstr \"IP автора\"\n\n#: models.py:303 models.py:390\nmsgid \"Post\"\nmsgstr \"Сообщение\"\n\n#: models.py:304 templates/pybb/forum_list.html:14 templates/pybb/topic.html:42\n#: templates/pybb/topic_list.html:10 templates/pybb/user_posts.html:7\nmsgid \"Posts\"\nmsgstr \"Сообщения\"\n\n#: models.py:375\nmsgid \"Profile\"\nmsgstr \"Профиль\"\n\n#: models.py:376\nmsgid \"Profiles\"\nmsgstr \"Профили\"\n\n#: models.py:387\nmsgid \"Attachment\"\nmsgstr \"Вложение\"\n\n#: models.py:388\nmsgid \"Attachments\"\nmsgstr \"Вложения\"\n\n#: models.py:391\nmsgid \"Size\"\nmsgstr \"Размер\"\n\n#: models.py:392\nmsgid \"File\"\nmsgstr \"Файл\"\n\n#: models.py:442\nmsgid \"Topic read tracker\"\nmsgstr \"Трекер прочитанных сообщений\"\n\n#: models.py:443\nmsgid \"Topic read trackers\"\nmsgstr \"Трекеры прочитанных сообщений\"\n\n#: models.py:480\nmsgid \"Forum read tracker\"\nmsgstr \"Отметка прочитанного форума\"\n\n#: models.py:481\nmsgid \"Forum read trackers\"\nmsgstr \"Отметки прочитанных форумов\"\n\n#: models.py:488\nmsgid \"Text\"\nmsgstr \"Текст\"\n\n#: models.py:491 models.py:510\nmsgid \"Poll answer\"\nmsgstr \"Ответ на опрос\"\n\n#: models.py:492\nmsgid \"Polls answers\"\nmsgstr \"Ответы на опросы\"\n\n#: models.py:515\nmsgid \"Poll answer user\"\nmsgstr \"Ответ пользователя на опрос\"\n\n#: models.py:516\nmsgid \"Polls answers users\"\nmsgstr \"Ответы пользователей на опросы\"\n\n#: models.py:539\n#, python-format\nmsgid \"\"\n\"After %(limit)s attemps, there is not any unique slug value for \\\"%(slug)s\\\"\"\nmsgstr \"\"\n\"После %(limit)s попыток не удалось найти уникальную метку для \\\"%(slug)s\\\"\"\n\n#: profiles.py:34\nmsgid \"Signature\"\nmsgstr \"Подпись\"\n\n#: profiles.py:35\nmsgid \"Signature HTML Version\"\nmsgstr \"HTML версия подписи\"\n\n#: profiles.py:37\nmsgid \"Time zone\"\nmsgstr \"Временная зона\"\n\n#: profiles.py:38\nmsgid \"Language\"\nmsgstr \"Язык\"\n\n#: profiles.py:40\nmsgid \"Show signatures\"\nmsgstr \"Показывать подписи\"\n\n#: profiles.py:42\nmsgid \"Avatar\"\nmsgstr \"Аватар\"\n\n#: profiles.py:44\nmsgid \"Automatically subscribe\"\nmsgstr \"Автоматически подписывать\"\n\n#: profiles.py:45\nmsgid \"Automatically subscribe to topics that you answer\"\nmsgstr \"Автоматически подписывать на темы, на которые вы ответили\"\n\n#: templates/pybb/_button_forum_subscription.html:1\nmsgid \"Manage subscription\"\nmsgstr \"Управление подпиской\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#: templates/pybb/topic.html:72\nmsgid \"Subscribe\"\nmsgstr \"Получать уведомления\"\n\n#: templates/pybb/_button_new_topic.html:1 templates/pybb/add_post.html:5\n#: templates/pybb/add_post.html:32\nmsgid \"New topic\"\nmsgstr \"Новая тема\"\n\n#: templates/pybb/_button_save.html:1\nmsgid \"Save\"\nmsgstr \"Сохранить\"\n\n#: templates/pybb/_button_submit.html:1\n#: templates/pybb/forum_subscription.html:33\nmsgid \"Submit\"\nmsgstr \"Отправить\"\n\n#: templates/pybb/_markitup.html:25 templates/pybb/markup/bbcode_widget.html:16\n#: templates/pybb/markup/markdown_widget.html:24\nmsgid \"Bold\"\nmsgstr \"Жирный\"\n\n#: templates/pybb/_markitup.html:26 templates/pybb/markup/bbcode_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:25\nmsgid \"Italic\"\nmsgstr \"Курсив\"\n\n#: templates/pybb/_markitup.html:27 templates/pybb/markup/bbcode_widget.html:18\nmsgid \"Underline\"\nmsgstr \"Подчёркнутый\"\n\n#: templates/pybb/_markitup.html:28 templates/pybb/markup/bbcode_widget.html:19\nmsgid \"Stroke\"\nmsgstr \"Зачёркнутый\"\n\n#: templates/pybb/_markitup.html:30 templates/pybb/markup/bbcode_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:32\nmsgid \"Picture\"\nmsgstr \"Изображение\"\n\n#: templates/pybb/_markitup.html:31 templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Link\"\nmsgstr \"Ссылка\"\n\n#: templates/pybb/_markitup.html:33 templates/pybb/markup/bbcode_widget.html:24\nmsgid \"Bulleted list\"\nmsgstr \"Ненумерованный список\"\n\n#: templates/pybb/_markitup.html:34 templates/pybb/markup/bbcode_widget.html:25\nmsgid \"Numeric list\"\nmsgstr \"Нумерованный список\"\n\n#: templates/pybb/_markitup.html:35 templates/pybb/markup/bbcode_widget.html:26\nmsgid \"List item\"\nmsgstr \"Элемент списка\"\n\n#: templates/pybb/_markitup.html:37 templates/pybb/markup/bbcode_widget.html:28\n#: templates/pybb/markup/markdown_widget.html:35\nmsgid \"Quotes\"\nmsgstr \"Цитировать\"\n\n#: templates/pybb/_markitup.html:38 templates/pybb/markup/bbcode_widget.html:29\nmsgid \"Code\"\nmsgstr \"Код\"\n\n#: templates/pybb/_markitup.html:40 templates/pybb/markup/bbcode_widget.html:31\nmsgid \"Clean\"\nmsgstr \"Очистить\"\n\n#: templates/pybb/_markitup.html:41 templates/pybb/markup/bbcode_widget.html:32\n#: templates/pybb/markup/markdown_widget.html:38\nmsgid \"Preview\"\nmsgstr \"Предпросмотр\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"Register\"\nmsgstr \"Зарегистрируйтесь\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"or\"\nmsgstr \"или\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"login\"\nmsgstr \"войдите\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"to create to post a reply\"\nmsgstr \"чтобы оставить сообщение\"\n\n#: templates/pybb/add_post.html:5 templates/pybb/add_post.html:32\nmsgid \"New reply\"\nmsgstr \"Новый ответ\"\n\n#: templates/pybb/attachments_formset.html:6\nmsgid \"Add attachments\"\nmsgstr \"Добавить вложение\"\n\n#: templates/pybb/attachments_formset.html:14\nmsgid \"\"\n\"If you need to upload larger files, please use an external storage website.\"\nmsgstr \"Используйте стороннее хранилище для загрузки файлов большего размера.\"\n\n#: templates/pybb/attachments_formset.html:14\n#, python-format\nmsgid \"(max size: %(max_size)s)\"\nmsgstr \"(максимальный размер: %(max_size)s)\"\n\n#: templates/pybb/attachments_formset.html:17\n#: templates/pybb/edit_profile.html:25\nmsgid \"delete\"\nmsgstr \"удалить\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Reference to your file\"\nmsgstr \"Ссылка на файл\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Ref\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#: templates/pybb/topic.html:88 templates/pybb/topic_list.html:32\nmsgid \":\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"link\"\nmsgstr \"ссылка\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"Insert a link to your file inside your post.\"\nmsgstr \"Вставить ссылку на файл в сообщение\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"image\"\nmsgstr \"изображение\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"Insert your image inside your post.\"\nmsgstr \"Вставить изображение в сообщение\"\n\n#: templates/pybb/breadcrumb.html:4\nmsgid \"Home\"\nmsgstr \"Главная\"\n\n#: templates/pybb/delete_post.html:5\nmsgid \"Are you sure you want to delete this message?\"\nmsgstr \"Вы уверены, что хотите удалить это сообщение?\"\n\n#: templates/pybb/delete_post.html:12\nmsgid \"No, take me back\"\nmsgstr \"Нет, верните меня назад\"\n\n#: templates/pybb/delete_post.html:13\nmsgid \"Yes, I am sure\"\nmsgstr \"Да, я уверен\"\n\n#: templates/pybb/edit_post.html:4 templates/pybb/edit_post.html:17\nmsgid \"Editing the post\"\nmsgstr \"Редактирование сообщения\"\n\n#: templates/pybb/edit_privileges.html:5 templates/pybb/edit_privileges.html:8\nmsgid \"Grant moderator privileges\"\nmsgstr \"Выдать права модератора\"\n\n#: templates/pybb/edit_profile.html:5 templates/pybb/edit_profile.html:8\n#: templates/pybb/edit_profile.html:13\nmsgid \"Profile editing\"\nmsgstr \"Изменение профиля\"\n\n#: templates/pybb/edit_profile.html:18\nmsgid \"Subscriptions on topics\"\nmsgstr \"Уведомления\"\n\n#: templates/pybb/forum_list.html:17\nmsgid \"Last posts\"\nmsgstr \"Последние сообщения\"\n\n#: templates/pybb/forum_list.html:43\nmsgid \"No forums created\"\nmsgstr \"Форумы не созданы\"\n\n#: templates/pybb/forum_list.html:44\nmsgid \"Add forum now\"\nmsgstr \"Добавить форум сейчас\"\n\n#: templates/pybb/forum_subscription.html:4\n#, python-format\nmsgctxt \"page title\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Подписка\"\n\n#: templates/pybb/forum_subscription.html:14\n#, python-format\nmsgctxt \"content heading\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Подписка\"\n\n#: templates/pybb/forum_subscription.html:32 templates/pybb/move_post.html:31\nmsgid \"Cancel\"\nmsgstr \"Отмена\"\n\n#: templates/pybb/index.html:17\nmsgid \"Forum categories are not created\"\nmsgstr \"Категории форума не созданы\"\n\n#: templates/pybb/index.html:18\nmsgid \"Add a category now\"\nmsgstr \"Добавить категорию сейчас\"\n\n#: templates/pybb/index.html:22 templates/pybb/latest_topics.html:5\n#: templates/pybb/latest_topics.html:8 templates/pybb/latest_topics.html:15\nmsgid \"Last updates in topics\"\nmsgstr \"Последние обновления в темах\"\n\n#: templates/pybb/index.html:23\nmsgid \"Mark all forums as read\"\nmsgstr \"Отметить все форумы как прочтенные\"\n\n#: templates/pybb/latest_topics.html:31\nmsgid \"Mark all topics as read\"\nmsgstr \"Отметить все темы как прочтенные\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:4\n#, python-format\nmsgid \"\"\n\"User %(username)s post a new topic in forum to which you are subscribed \"\n\"(%(forum_name)s).\"\nmsgstr \"\"\n\"Пользователь %(username)s создал новую тему в форуме, на который вы \"\n\"подписаны (%(forum_name)s).\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/subscription_email_body.html:5\nmsgid \"Link to topic\"\nmsgstr \"Ссылка на тему\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\nmsgid \"Link to forum\"\nmsgstr \"Ссылка на форум\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\nmsgid \"\"\n\"If you don't want to receive notifications on new topics in this forum visit \"\n\"following link\"\nmsgstr \"\"\n\"Если вы не хотите получать уведомления о новых темах на этом форуме - \"\n\"перейдите по следующей ссылке\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_subject.html:2\nmsgid \"New topic in forum that you subscribed.\"\nmsgstr \"Новая тема в форуме, на который вы подписаны\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:7\n#: templates/pybb/mail_templates/subscription_email_body.html:3\n#, python-format\nmsgid \"User %(username)s replied in topic to which you are subscribed.\"\nmsgstr \"Пользователь %(username)s ответил в теме, на которую вы подписаны\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:10\n#, python-format\nmsgid \"\"\n\"Follow %(link_post_start)sthis link%(link_end)s to see the new post on the \"\n\"topic %(link_topic_start)s%(topic_name)s%(link_end)s.\"\nmsgstr \"\"\n\"Перейдите по %(link_post_start)sссылке%(link_end)s, чтобы увидеть новое \"\n\"сообщение в теме %(link_topic_start)s%(topic_name)s%(link_end)s.\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:14\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new posts in this topic visit \"\n\"%(link_start)sthis link%(link_end)s.\"\nmsgstr \"\"\n\"Если вы не хотите получать уведомления о новых сообщениях в этой теме - \"\n\"перейдите по следующей %(link_start)sссылке%(link_end)s.\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:4\nmsgid \"Link to post\"\nmsgstr \"Ссылка на сообщение\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:8\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new messages in this topic \"\n\"visit following link: %(delete_url_full)s\"\nmsgstr \"\"\n\"Если вы не хотите получать уведомления о новых сообщениях в этой теме - \"\n\"перейдите по следующей ссылке: %(delete_url_full)s\"\n\n#: templates/pybb/mail_templates/subscription_email_subject.html:2\nmsgid \"New answer in topic that you subscribed.\"\nmsgstr \"Новый ответ в теме, на которую вы подписаны\"\n\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Your text to link here...\"\nmsgstr \"Текст ссылки...\"\n\n#: templates/pybb/markup/markdown_widget.html:17\nmsgid \"First Level Heading\"\nmsgstr \"Первый уровень заголовка\"\n\n#: templates/pybb/markup/markdown_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:18\n#: templates/pybb/markup/markdown_widget.html:19\n#: templates/pybb/markup/markdown_widget.html:20\n#: templates/pybb/markup/markdown_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Your title here...\"\nmsgstr \"Заголовок...\"\n\n#: templates/pybb/markup/markdown_widget.html:18\nmsgid \"Second Level Heading\"\nmsgstr \"Второй уровень заголовка\"\n\n#: templates/pybb/markup/markdown_widget.html:19\nmsgid \"Heading 3\"\nmsgstr \"Заголовок 3\"\n\n#: templates/pybb/markup/markdown_widget.html:20\nmsgid \"Heading 4\"\nmsgstr \"Заголовок 4\"\n\n#: templates/pybb/markup/markdown_widget.html:21\nmsgid \"Heading 5\"\nmsgstr \"Заголовок 5\"\n\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Heading 6\"\nmsgstr \"Заголовок 6\"\n\n#: templates/pybb/markup/markdown_widget.html:27\nmsgid \"Bulleted List\"\nmsgstr \"Ненумерованный список\"\n\n#: templates/pybb/markup/markdown_widget.html:28\nmsgid \"Numeric List\"\nmsgstr \"Нумерованный список\"\n\n#: templates/pybb/markup/markdown_widget.html:36\nmsgid \"Code Block / Code\"\nmsgstr \"Программный код\"\n\n#: templates/pybb/move_post.html:7\n#, python-format\nmsgid \"Move topic \\\"%(topic)s\\\"\"\nmsgstr \"Перенести тему \\\"%(topic)s\\\"\"\n\n#: templates/pybb/move_post.html:9\n#, python-format\nmsgid \"Split posts from topic \\\"%(topic)s\\\"\"\nmsgstr \"Разделить сообщения из темы \\\"%(topic)s\\\"\"\n\n#: templates/pybb/move_post.html:17\n#, python-format\nmsgid \"Starting post by %(author_name)s\"\nmsgstr \"Начать пост от %(author_name)s\"\n\n#: templates/pybb/move_post.html:32\nmsgid \"Move this topic\"\nmsgstr \"Перенести эту тему\"\n\n#: templates/pybb/move_post.html:32\nmsgid \"Split posts\"\nmsgstr \"Разделить сообщения\"\n\n#: templates/pybb/pagination.html:7\nmsgid \"previous page\"\nmsgstr \"предыдущая страница\"\n\n#: templates/pybb/pagination.html:21\nmsgid \"next page\"\nmsgstr \"следующая страница\"\n\n#: templates/pybb/poll.html:4\nmsgid \"Poll\"\nmsgstr \"Опрос\"\n\n#: templates/pybb/poll.html:36\nmsgid \"Cancel my poll vote\"\nmsgstr \"Отменить мой выбор\"\n\n#: templates/pybb/poll_edit_form.html:7\nmsgid \"Poll answers\"\nmsgstr \"Ответы на опрос\"\n\n#: templates/pybb/poll_edit_form.html:20\nmsgid \"remove answer\"\nmsgstr \"удалить ответ\"\n\n#: templates/pybb/poll_edit_form.html:21\nmsgid \"add answer\"\nmsgstr \"добавить ответ\"\n\n#: templates/pybb/post_template.html:28\n#, python-format\nmsgid \"Rank: %(rank)s\"\nmsgstr \"Ранг: %(rank)s\"\n\n#: templates/pybb/post_template.html:41 templates/pybb/user.html:51\nmsgid \"Edit\"\nmsgstr \"Редактировать\"\n\n#: templates/pybb/post_template.html:45\nmsgid \"Delete post?\"\nmsgstr \"Удалить сообщение?\"\n\n#: templates/pybb/post_template.html:46\nmsgid \"Delete\"\nmsgstr \"Удалить\"\n\n#: templates/pybb/post_template.html:49\nmsgid \"Approve post\"\nmsgstr \"Принять пост\"\n\n#: templates/pybb/post_template.html:52\nmsgid \"Move\"\nmsgstr \"Перенести\"\n\n#: templates/pybb/post_template.html:52\nmsgid \"Split\"\nmsgstr \"Разделить\"\n\n#: templates/pybb/post_template.html:55 templates/pybb/topic.html:62\nmsgid \"Admin\"\nmsgstr \"Админка\"\n\n#: templates/pybb/post_template.html:71\nmsgid \"Edited\"\nmsgstr \"Отредактировано\"\n\n#: templates/pybb/post_template.html:85\nmsgid \"quote\"\nmsgstr \"цитировать\"\n\n#: templates/pybb/post_template.html:86\nmsgid \"quote selected\"\nmsgstr \"цитировать выделенное\"\n\n#: templates/pybb/topic.html:51\nmsgid \"Unstick topic\"\nmsgstr \"Снять закрепление\"\n\n#: templates/pybb/topic.html:53\nmsgid \"Stick topic\"\nmsgstr \"Закрепить тему\"\n\n#: templates/pybb/topic.html:57\nmsgid \"Open topic\"\nmsgstr \"Открыть тему\"\n\n#: templates/pybb/topic.html:59\nmsgid \"Close topic\"\nmsgstr \"Закрыть тему\"\n\n#: templates/pybb/topic.html:70\nmsgid \"Unsubscribe\"\nmsgstr \"Запретить уведомления\"\n\n#: templates/pybb/topic_list.html:13\nmsgid \"Views\"\nmsgstr \"Просмотров\"\n\n#: templates/pybb/topic_list.html:16\nmsgid \"Last post\"\nmsgstr \"Последнее сообщение\"\n\n#: templates/pybb/topic_list.html:26\nmsgid \"Go to first unread post\"\nmsgstr \"Перейти к первому непрочитанному сообщению\"\n\n#: templates/pybb/topic_list.html:32\nmsgid \"pages\"\nmsgstr \"страницы\"\n\n#: templates/pybb/user.html:16\nmsgid \"Statistics\"\nmsgstr \"Статистика\"\n\n#: templates/pybb/user.html:19\n#, python-format\nmsgid \"Number of topics: %(count)s\"\nmsgstr \"Количество тем: %(count)s\"\n\n#: templates/pybb/user.html:24\n#, python-format\nmsgid \"Number of posts: %(count)s\"\nmsgstr \"Количество сообщений: %(count)s\"\n\n#: templates/pybb/user.html:29\n#, python-format\nmsgid \"Date of registration: %(date_joined)s \"\nmsgstr \"Дата регистрации: %(date_joined)s \"\n\n#: templates/pybb/user.html:36\nmsgid \"Moderator\"\nmsgstr \"Модератор\"\n\n#: templates/pybb/user.html:41\nmsgid \"Block\"\nmsgstr \"Заблокировать\"\n\n#: templates/pybb/user.html:42\nmsgid \"Block and delete all messages\"\nmsgstr \"Заблокировать и удалить сообщения\"\n\n#: templates/pybb/user.html:46\nmsgid \"Unblock\"\nmsgstr \"Разблокировать\"\n\n#: templates/pybb/user_posts.html:12 templates/pybb/user_posts.html:17\nmsgid \"All posts created by\"\nmsgstr \"Сообщения, оставленные пользователем\"\n\n#: templates/pybb/user_topics.html:12 templates/pybb/user_topics.html:17\nmsgid \"All topics created by\"\nmsgstr \"Темы, созданные пользователем\"\n\n#: templates/pybb/users.html:8 templates/pybb/users.html:24\nmsgid \"Users\"\nmsgstr \"Пользователи\"\n\n#: templates/pybb/users.html:12\nmsgid \"Search\"\nmsgstr \"Поиск\"\n\n#: templatetags/pybb_tags.py:61\n#, python-format\nmsgid \"%d second ago\"\nmsgid_plural \"%d seconds ago\"\nmsgstr[0] \"%d секунду назад\"\nmsgstr[1] \"%d секунды назад\"\nmsgstr[2] \"%d секунд назад\"\n\n#: templatetags/pybb_tags.py:65\n#, python-format\nmsgid \"%d minute ago\"\nmsgid_plural \"%d minutes ago\"\nmsgstr[0] \"%d минуту назад\"\nmsgstr[1] \"%d минуты назад\"\nmsgstr[2] \"%d минут назад\"\n\n#: templatetags/pybb_tags.py:75\n#, python-format\nmsgid \"today, %s\"\nmsgstr \"сегодня, %s\"\n\n#: templatetags/pybb_tags.py:77\n#, python-format\nmsgid \"yesterday, %s\"\nmsgstr \"вчера, %s\"\n\n#: util.py:140\nmsgid \"Can't get profile for anonymous user\"\nmsgstr \"Невозможно получить профиль для анонимного пользователя\"\n\n#: views.py:156\nmsgid \"Forum does not exist\"\nmsgstr \"Форум не найден\"\n\n#: views.py:397\nmsgid \"This topic does not exists\"\nmsgstr \"Тема не найдена\"\n\n#: views.py:867\nmsgid \"\"\n\"Subscription removed. You will not receive emails from this topic unless you \"\n\"subscribe or post again.\"\nmsgstr \"\"\n\"Подписка удалена. Вы не будете получать уведомления по этой теме, пока не \"\n\"подпишетесь снова.\"\n\n#: views.py:878\nmsgid \"\"\n\"Subscription added. You will receive email notifications for replies to this \"\n\"topic.\"\nmsgstr \"\"\n\"Подписка добавлена. Вы будете получать уведомления о новых ответах в этой \"\n\"теме.\"\n\n#: views.py:896\nmsgid \"All forums marked as read\"\nmsgstr \"Все форумы отмечены как прочтенные\"\n\n#: views.py:929\nmsgid \"User successfuly blocked\"\nmsgstr \"Пользователь успешно заблокирован\"\n\n#: views.py:942\nmsgid \"User successfuly unblocked\"\nmsgstr \"Пользователь успешно разблокирован\"\n\n#: views.py:980\nmsgid \"Privileges updated\"\nmsgstr \"Привилегии обновлены\"\n\n#~ msgid \"Subscribers:\"\n#~ msgstr \"Подписчики:\"\n\n#~ msgid \"Rank\"\n#~ msgstr \"Ранг\"\n"
  },
  {
    "path": "pybb/locale/sk/LC_MESSAGES/django.po",
    "content": "# Russian translation for pybb forum\n# Copyright (C) 2008 Grigoriy Petukhov\n# This file is distributed under the same license as the pybb package.\n# Grigoriy Petukhov <lizendir@gmail.com>, 2008\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pybb\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-01-11 14:06+0100\\n\"\n\"PO-Revision-Date: 2009-10-26 14:09+0100\\n\"\n\"Last-Translator: Tomas Drencak <tomas@drencak.com>\\n\"\n\"Language-Team: tomas <tomas@drencak.com>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Poedit-Basepath: ../../../\\n\"\n\"X-Poedit-Language: Slovak\\n\"\n\"X-Poedit-Country: SLOVAKIA\\n\"\n\n#: admin.py:45 admin.py:84 admin.py:112 admin.py:134\nmsgid \"Additional options\"\nmsgstr \"Ďalšie možnosti\"\n\n#: admin.py:117 models.py:280\nmsgid \"Message\"\nmsgstr \"Správa\"\n\n#: admin.py:148\n#, fuzzy\n#| msgid \"Views count\"\nmsgid \"View post\"\nmsgstr \"Videné\"\n\n#: admin.py:153\n#, fuzzy\n#| msgid \"Editing the post\"\nmsgid \"Edit post\"\nmsgstr \"Editácia príspevku\"\n\n#: apps.py:9\nmsgid \"Pybbm forum solution\"\nmsgstr \"\"\n\n#: feeds.py:27 feeds.py:28 templates/pybb/base.html:10\nmsgid \"Latest posts on forum\"\nmsgstr \"Najnovšie príspevky na fóre\"\n\n#: feeds.py:41 feeds.py:42 templates/pybb/base.html:11\nmsgid \"Latest topics on forum\"\nmsgstr \"Najnovšie témy na fóre\"\n\n#: forms.py:30\nmsgid \"Attachment is too big\"\nmsgstr \"Príloha je príliš veľká\"\n\n#: forms.py:48\n#, python-format\nmsgid \"You cant add more than %s answers for poll\"\nmsgstr \"\"\n\n#: forms.py:50\nmsgid \"Add two or more answers for this poll\"\nmsgstr \"\"\n\n#: forms.py:58 models.py:183\nmsgid \"Subject\"\nmsgstr \"Predmet\"\n\n#: forms.py:59 models.py:195\nmsgid \"Poll type\"\nmsgstr \"\"\n\n#: forms.py:61 models.py:196\n#, fuzzy\n#| msgid \"Position\"\nmsgid \"Poll question\"\nmsgstr \"Pozícia\"\n\n#: forms.py:64\n#, fuzzy\n#| msgid \"Topics\"\nmsgid \"Topic slug\"\nmsgstr \"Témy\"\n\n#: forms.py:123\nmsgid \"Polls question is required when adding a poll\"\nmsgstr \"\"\n\n#: forms.py:176 models.py:186 models.py:295 models.py:368 models.py:507\nmsgid \"User\"\nmsgstr \"Používateľ\"\n\n#: forms.py:212\n#, python-format\nmsgid \"Avatar is too large, max size: %s bytes\"\nmsgstr \"\"\n\n#: forms.py:272\nmsgid \"be unsubscribe from this forum\"\nmsgstr \"\"\n\n#: forms.py:277\nmsgid \"You want to\"\nmsgstr \"\"\n\n#: forms.py:281\n#, fuzzy\n#| msgid \"New topic\"\nmsgid \"only new topics\"\nmsgstr \"Nová téma\"\n\n#: forms.py:282\n#, fuzzy\n#| msgid \"Latest topics on forum\"\nmsgid \"all topics of the forum\"\nmsgstr \"Najnovšie témy na fóre\"\n\n#: forms.py:285\n#, fuzzy\n#| msgid \"Merge topics\"\nmsgid \"Concerned topics\"\nmsgstr \"Zlúčiť témy\"\n\n#: models.py:23 models.py:59\nmsgid \"Name\"\nmsgstr \"Názov\"\n\n#: models.py:24 models.py:60\nmsgid \"Position\"\nmsgstr \"Pozícia\"\n\n#: models.py:25 models.py:66 templates/pybb/category.html:4\n#: templates/pybb/forum_list.html:26\nmsgid \"Hidden\"\nmsgstr \"\"\n\n#: models.py:26\nmsgid \"If checked, this category will be visible only for staff\"\nmsgstr \"\"\n\n#: models.py:27 models.py:69 models.py:197\nmsgid \"Slug\"\nmsgstr \"\"\n\n#: models.py:31 models.py:56\nmsgid \"Category\"\nmsgstr \"Kategória\"\n\n#: models.py:32\nmsgid \"Categories\"\nmsgstr \"Kategórie\"\n\n#: models.py:57\nmsgid \"Parent forum\"\nmsgstr \"\"\n\n#: models.py:61\nmsgid \"Description\"\nmsgstr \"Popis\"\n\n#: models.py:62\nmsgid \"Moderators\"\nmsgstr \"Moderátori\"\n\n#: models.py:63 models.py:185 models.py:297\nmsgid \"Updated\"\nmsgstr \"Aktualizované\"\n\n#: models.py:64 models.py:192 profiles.py:41\nmsgid \"Post count\"\nmsgstr \"Počet príspevkov\"\n\n#: models.py:65\n#, fuzzy\n#| msgid \"Post count\"\nmsgid \"Topic count\"\nmsgstr \"Počet príspevkov\"\n\n#: models.py:68\nmsgid \"Headline\"\nmsgstr \"\"\n\n#: models.py:73 models.py:136 models.py:182 templates/pybb/forum_list.html:8\nmsgid \"Forum\"\nmsgstr \"Fórum\"\n\n#: models.py:74\nmsgid \"Forums\"\nmsgstr \"Fóra\"\n\n#: models.py:129\nmsgid \"be notified only when a new topic is added\"\nmsgstr \"\"\n\n#: models.py:130\nmsgid \"be auto-subscribed to topics\"\nmsgstr \"\"\n\n#: models.py:134\n#, fuzzy\n#| msgid \"Subscribers\"\nmsgid \"Subscriber\"\nmsgstr \"Odoberatelia\"\n\n#: models.py:138\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription type\"\nmsgstr \"Odoberatelia na témy\"\n\n#: models.py:148\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription to forum\"\nmsgstr \"Odoberatelia na témy\"\n\n#: models.py:149\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscriptions to forums\"\nmsgstr \"Odoberatelia na témy\"\n\n#: models.py:177\nmsgid \"None\"\nmsgstr \"Žiadne\"\n\n#: models.py:178\nmsgid \"Single answer\"\nmsgstr \"\"\n\n#: models.py:179\nmsgid \"Multiple answers\"\nmsgstr \"\"\n\n#: models.py:184 models.py:296\nmsgid \"Created\"\nmsgstr \"Vytvorené\"\n\n#: models.py:187\nmsgid \"Views count\"\nmsgstr \"Videné\"\n\n#: models.py:188 templates/pybb/topic_list.html:27\nmsgid \"Sticky\"\nmsgstr \"Sledovaná\"\n\n#: models.py:189 templates/pybb/topic_list.html:28\nmsgid \"Closed\"\nmsgstr \"Zatvorené\"\n\n#: models.py:191 templates/pybb/topic.html:88\nmsgid \"Subscribers\"\nmsgstr \"Odoberatelia\"\n\n#: models.py:194 models.py:299\n#, fuzzy\n#| msgid \"Moderators\"\nmsgid \"On moderation\"\nmsgstr \"Moderátori\"\n\n#: models.py:201 models.py:294 models.py:483 templates/pybb/topic_list.html:7\nmsgid \"Topic\"\nmsgstr \"Téma\"\n\n#: models.py:202 templates/pybb/forum_list.html:11\n#: templates/pybb/user_topics.html:7\nmsgid \"Topics\"\nmsgstr \"Témy\"\n\n#: models.py:281\nmsgid \"HTML version\"\nmsgstr \"HTML verzia\"\n\n#: models.py:282\nmsgid \"Text version\"\nmsgstr \"Textová verzia\"\n\n#: models.py:298\nmsgid \"User IP\"\nmsgstr \"IP používateľa\"\n\n#: models.py:303 models.py:386\nmsgid \"Post\"\nmsgstr \"Príspevok\"\n\n#: models.py:304 templates/pybb/forum_list.html:14\n#: templates/pybb/topic.html:42 templates/pybb/topic_list.html:10\n#: templates/pybb/user_posts.html:7\nmsgid \"Posts\"\nmsgstr \"Príspevky\"\n\n#: models.py:371\nmsgid \"Profile\"\nmsgstr \"Profil\"\n\n#: models.py:372\nmsgid \"Profiles\"\nmsgstr \"Profily\"\n\n#: models.py:383\nmsgid \"Attachment\"\nmsgstr \"Príloha\"\n\n#: models.py:384\n#, fuzzy\n#| msgid \"Attachment\"\nmsgid \"Attachments\"\nmsgstr \"Príloha\"\n\n#: models.py:387\nmsgid \"Size\"\nmsgstr \"Veľkosť\"\n\n#: models.py:388\nmsgid \"File\"\nmsgstr \"\"\n\n#: models.py:438\nmsgid \"Topic read tracker\"\nmsgstr \"\"\n\n#: models.py:439\nmsgid \"Topic read trackers\"\nmsgstr \"\"\n\n#: models.py:476\nmsgid \"Forum read tracker\"\nmsgstr \"\"\n\n#: models.py:477\nmsgid \"Forum read trackers\"\nmsgstr \"\"\n\n#: models.py:484\nmsgid \"Text\"\nmsgstr \"\"\n\n#: models.py:487 models.py:506\nmsgid \"Poll answer\"\nmsgstr \"\"\n\n#: models.py:488\nmsgid \"Polls answers\"\nmsgstr \"\"\n\n#: models.py:511\nmsgid \"Poll answer user\"\nmsgstr \"\"\n\n#: models.py:512\nmsgid \"Polls answers users\"\nmsgstr \"\"\n\n#: models.py:535\n#, python-format\nmsgid \"\"\n\"After %(limit)s attemps, there is not any unique slug value for \\\"%(slug)s\\\"\"\nmsgstr \"\"\n\n#: profiles.py:34\nmsgid \"Signature\"\nmsgstr \"Podpis\"\n\n#: profiles.py:35\n#, fuzzy\nmsgid \"Signature HTML Version\"\nmsgstr \"HTML версия\"\n\n#: profiles.py:37\nmsgid \"Time zone\"\nmsgstr \"Časová zóna\"\n\n#: profiles.py:38\nmsgid \"Language\"\nmsgstr \"Jazyk\"\n\n#: profiles.py:40\nmsgid \"Show signatures\"\nmsgstr \"Zobraziť podpisy\"\n\n#: profiles.py:42\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\n#: profiles.py:44\nmsgid \"Automatically subscribe\"\nmsgstr \"\"\n\n#: profiles.py:45\nmsgid \"Automatically subscribe to topics that you answer\"\nmsgstr \"\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#, fuzzy\n#| msgid \"Description\"\nmsgid \"Manage subscription\"\nmsgstr \"Popis\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#: templates/pybb/topic.html:72\nmsgid \"Subscribe\"\nmsgstr \"Odoberať\"\n\n#: templates/pybb/_button_new_topic.html:1 templates/pybb/add_post.html:5\n#: templates/pybb/add_post.html.py:32\nmsgid \"New topic\"\nmsgstr \"Nová téma\"\n\n#: templates/pybb/_button_save.html:1\nmsgid \"Save\"\nmsgstr \"Uložiť\"\n\n#: templates/pybb/_button_submit.html:1\n#: templates/pybb/forum_subscription.html:33\nmsgid \"Submit\"\nmsgstr \"Odoslať\"\n\n#: templates/pybb/_markitup.html:25\n#: templates/pybb/markup/bbcode_widget.html:16\n#: templates/pybb/markup/markdown_widget.html:24\nmsgid \"Bold\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:26\n#: templates/pybb/markup/bbcode_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:25\nmsgid \"Italic\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:27\n#: templates/pybb/markup/bbcode_widget.html:18\nmsgid \"Underline\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:28\n#: templates/pybb/markup/bbcode_widget.html:19\nmsgid \"Stroke\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:30\n#: templates/pybb/markup/bbcode_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:32\n#, fuzzy\n#| msgid \"Signature\"\nmsgid \"Picture\"\nmsgstr \"Podpis\"\n\n#: templates/pybb/_markitup.html:31\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Link\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:33\n#: templates/pybb/markup/bbcode_widget.html:24\nmsgid \"Bulleted list\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:34\n#: templates/pybb/markup/bbcode_widget.html:25\nmsgid \"Numeric list\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:35\n#: templates/pybb/markup/bbcode_widget.html:26\nmsgid \"List item\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:37\n#: templates/pybb/markup/bbcode_widget.html:28\n#: templates/pybb/markup/markdown_widget.html:35\n#, fuzzy\n#| msgid \"quote\"\nmsgid \"Quotes\"\nmsgstr \"citovať\"\n\n#: templates/pybb/_markitup.html:38\n#: templates/pybb/markup/bbcode_widget.html:29\nmsgid \"Code\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:40\n#: templates/pybb/markup/bbcode_widget.html:31\nmsgid \"Clean\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:41\n#: templates/pybb/markup/bbcode_widget.html:32\n#: templates/pybb/markup/markdown_widget.html:38\nmsgid \"Preview\"\nmsgstr \"Náhľad\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"Register\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"or\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"login\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"to create to post a reply\"\nmsgstr \"\"\n\n#: templates/pybb/add_post.html:5 templates/pybb/add_post.html.py:32\nmsgid \"New reply\"\nmsgstr \"Nová odpoveď\"\n\n#: templates/pybb/attachments_formset.html:6\n#, fuzzy\n#| msgid \"Attachment\"\nmsgid \"Add attachments\"\nmsgstr \"Príloha\"\n\n#: templates/pybb/attachments_formset.html:14\nmsgid \"\"\n\"If you need to upload larger files, please use an external storage website.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:14\n#, python-format\nmsgid \"(max size: %(max_size)s)\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:17\n#: templates/pybb/edit_profile.html:25\nmsgid \"delete\"\nmsgstr \"odstrániť\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Reference to your file\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Ref\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#: templates/pybb/topic.html:88 templates/pybb/topic_list.html:32\nmsgid \":\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"link\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"Insert a link to your file inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"image\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"Insert your image inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/breadcrumb.html:4\nmsgid \"Home\"\nmsgstr \"\"\n\n#: templates/pybb/delete_post.html:5\nmsgid \"Are you sure you want to delete this message?\"\nmsgstr \"Ste si istý že chcete vymazať túto správu?\"\n\n#: templates/pybb/delete_post.html:12\nmsgid \"No, take me back\"\nmsgstr \"\"\n\n#: templates/pybb/delete_post.html:13\n#, fuzzy\n#| msgid \"Yes, I am sure.\"\nmsgid \"Yes, I am sure\"\nmsgstr \"Áno, som si istý.\"\n\n#: templates/pybb/edit_post.html:4 templates/pybb/edit_post.html.py:17\nmsgid \"Editing the post\"\nmsgstr \"Editácia príspevku\"\n\n#: templates/pybb/edit_privileges.html:5 templates/pybb/edit_privileges.html:8\nmsgid \"Grant moderator privileges\"\nmsgstr \"\"\n\n#: templates/pybb/edit_profile.html:5 templates/pybb/edit_profile.html.py:8\n#: templates/pybb/edit_profile.html:13\nmsgid \"Profile editing\"\nmsgstr \"Úprava profilu\"\n\n#: templates/pybb/edit_profile.html:18\nmsgid \"Subscriptions on topics\"\nmsgstr \"Odoberatelia na témy\"\n\n#: templates/pybb/forum_list.html:17\nmsgid \"Last posts\"\nmsgstr \"Najnovšie príspevky\"\n\n#: templates/pybb/forum_list.html:43\nmsgid \"No forums created\"\nmsgstr \"\"\n\n#: templates/pybb/forum_list.html:44\nmsgid \"Add forum now\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:4\n#, python-format\nmsgctxt \"page title\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:14\n#, python-format\nmsgctxt \"content heading\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:32\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:17\nmsgid \"Forum categories are not created\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:18\nmsgid \"Add a category now\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:22 templates/pybb/latest_topics.html:5\n#: templates/pybb/latest_topics.html:8 templates/pybb/latest_topics.html:15\n#, fuzzy\n#| msgid \"Last topics\"\nmsgid \"Last updates in topics\"\nmsgstr \"Najnovšie témy\"\n\n#: templates/pybb/index.html:23\n#, fuzzy\n#| msgid \"Mark as read\"\nmsgid \"Mark all forums as read\"\nmsgstr \"Označiť ako prečítané\"\n\n#: templates/pybb/latest_topics.html:31\n#, fuzzy\n#| msgid \"Mark as read\"\nmsgid \"Mark all topics as read\"\nmsgstr \"Označiť ako prečítané\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:4\n#, python-format\nmsgid \"\"\n\"User %(username)s post a new topic in forum to which you are subscribed \"\n\"(%(forum_name)s).\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#, fuzzy\n#| msgid \"Stick topic\"\nmsgid \"Link to topic\"\nmsgstr \"Sledovať tému\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\nmsgid \"Link to forum\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\nmsgid \"\"\n\"If you don't want to receive notifications on new topics in this forum visit \"\n\"following link\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_subject.html:2\nmsgid \"New topic in forum that you subscribed.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:7\n#: templates/pybb/mail_templates/subscription_email_body.html:3\n#, python-format\nmsgid \"User %(username)s replied in topic to which you are subscribed.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:10\n#, python-format\nmsgid \"\"\n\"Follow %(link_post_start)sthis link%(link_end)s to see the new post on the \"\n\"topic %(link_topic_start)s%(topic_name)s%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:14\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new posts in this topic visit \"\n\"%(link_start)sthis link%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#, fuzzy\n#| msgid \"Editing the post\"\nmsgid \"Link to post\"\nmsgstr \"Editácia príspevku\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:8\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new messages in this topic \"\n\"visit following link: %(delete_url_full)s\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_subject.html:2\nmsgid \"New answer in topic that you subscribed.\"\nmsgstr \"\"\n\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Your text to link here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\nmsgid \"First Level Heading\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:18\n#: templates/pybb/markup/markdown_widget.html:19\n#: templates/pybb/markup/markdown_widget.html:20\n#: templates/pybb/markup/markdown_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Your title here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:18\nmsgid \"Second Level Heading\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:19\nmsgid \"Heading 3\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:20\nmsgid \"Heading 4\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:21\nmsgid \"Heading 5\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Heading 6\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:27\nmsgid \"Bulleted List\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:28\nmsgid \"Numeric List\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:36\nmsgid \"Code Block / Code\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:7\nmsgid \"previous page\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:21\nmsgid \"next page\"\nmsgstr \"\"\n\n#: templates/pybb/poll.html:4\nmsgid \"Poll\"\nmsgstr \"\"\n\n#: templates/pybb/poll.html:36\nmsgid \"Cancel my poll vote\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:7\nmsgid \"Poll answers\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:20\nmsgid \"remove answer\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:21\nmsgid \"add answer\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:28\n#, python-format\nmsgid \"Rank: %(rank)s\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:41 templates/pybb/user.html:51\nmsgid \"Edit\"\nmsgstr \"Upraviť\"\n\n#: templates/pybb/post_template.html:45\nmsgid \"Delete post?\"\nmsgstr \"Vymazať príspevok?\"\n\n#: templates/pybb/post_template.html:46\nmsgid \"Delete\"\nmsgstr \"Vymazať\"\n\n#: templates/pybb/post_template.html:49\nmsgid \"Approve post\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:53 templates/pybb/topic.html:62\n#, fuzzy\n#| msgid \"Admincp\"\nmsgid \"Admin\"\nmsgstr \"Admin\"\n\n#: templates/pybb/post_template.html:69\nmsgid \"Edited\"\nmsgstr \"Upravené\"\n\n#: templates/pybb/post_template.html:83\nmsgid \"quote\"\nmsgstr \"citovať\"\n\n#: templates/pybb/post_template.html:84\n#, fuzzy\n#| msgid \"With selected:\"\nmsgid \"quote selected\"\nmsgstr \"Vybrané ako:\"\n\n#: templates/pybb/topic.html:51\nmsgid \"Unstick topic\"\nmsgstr \"Zrušiť sledovanie témy\"\n\n#: templates/pybb/topic.html:53\nmsgid \"Stick topic\"\nmsgstr \"Sledovať tému\"\n\n#: templates/pybb/topic.html:57\nmsgid \"Open topic\"\nmsgstr \"Otvoriť tému\"\n\n#: templates/pybb/topic.html:59\nmsgid \"Close topic\"\nmsgstr \"Zatvoriť tému\"\n\n#: templates/pybb/topic.html:70\nmsgid \"Unsubscribe\"\nmsgstr \"Neodoberať\"\n\n#: templates/pybb/topic_list.html:13\n#, fuzzy\n#| msgid \"Views count\"\nmsgid \"Views\"\nmsgstr \"Videné\"\n\n#: templates/pybb/topic_list.html:16\n#, fuzzy\n#| msgid \"Last posts\"\nmsgid \"Last post\"\nmsgstr \"Najnovšie príspevky\"\n\n#: templates/pybb/topic_list.html:26\nmsgid \"Go to first unread post\"\nmsgstr \"\"\n\n#: templates/pybb/topic_list.html:32\n#, fuzzy\n#| msgid \"Messages\"\nmsgid \"pages\"\nmsgstr \"Správy\"\n\n#: templates/pybb/user.html:16\nmsgid \"Statistics\"\nmsgstr \"Štatistiky\"\n\n#: templates/pybb/user.html:19\n#, fuzzy, python-format\n#| msgid \"Number of topics\"\nmsgid \"Number of topics: %(count)s\"\nmsgstr \"Počet tém\"\n\n#: templates/pybb/user.html:24\n#, fuzzy, python-format\n#| msgid \"Number of posts\"\nmsgid \"Number of posts: %(count)s\"\nmsgstr \"Počet príspevkov\"\n\n#: templates/pybb/user.html:29\n#, fuzzy, python-format\n#| msgid \"Date of registration\"\nmsgid \"Date of registration: %(date_joined)s \"\nmsgstr \"Dátum registrácie\"\n\n#: templates/pybb/user.html:36\n#, fuzzy\n#| msgid \"Moderators\"\nmsgid \"Moderator\"\nmsgstr \"Moderátori\"\n\n#: templates/pybb/user.html:41\nmsgid \"Block\"\nmsgstr \"\"\n\n#: templates/pybb/user.html:42\nmsgid \"Block and delete all messages\"\nmsgstr \"\"\n\n#: templates/pybb/user.html:46\nmsgid \"Unblock\"\nmsgstr \"\"\n\n#: templates/pybb/user_posts.html:12 templates/pybb/user_posts.html.py:17\n#, fuzzy\n#| msgid \"All topics created by\"\nmsgid \"All posts created by\"\nmsgstr \"Všetky témy vytvorené\"\n\n#: templates/pybb/user_topics.html:12 templates/pybb/user_topics.html.py:17\nmsgid \"All topics created by\"\nmsgstr \"Všetky témy vytvorené\"\n\n#: templates/pybb/users.html:8 templates/pybb/users.html.py:24\nmsgid \"Users\"\nmsgstr \"Používatelia\"\n\n#: templates/pybb/users.html:12\nmsgid \"Search\"\nmsgstr \"Hľadať\"\n\n#: templatetags/pybb_tags.py:61\n#, fuzzy, python-format\n#| msgid \"seconds ago\"\nmsgid \"%d second ago\"\nmsgid_plural \"%d seconds ago\"\nmsgstr[0] \"sekúnd pred\"\nmsgstr[1] \"sekúnd pred\"\n\n#: templatetags/pybb_tags.py:65\n#, fuzzy, python-format\n#| msgid \"minutes ago\"\nmsgid \"%d minute ago\"\nmsgid_plural \"%d minutes ago\"\nmsgstr[0] \"minút pred\"\nmsgstr[1] \"minút pred\"\n\n#: templatetags/pybb_tags.py:75\n#, python-format\nmsgid \"today, %s\"\nmsgstr \"dnes, %s\"\n\n#: templatetags/pybb_tags.py:77\n#, python-format\nmsgid \"yesterday, %s\"\nmsgstr \"včera, %s\"\n\n#: util.py:140\nmsgid \"Can't get profile for anonymous user\"\nmsgstr \"\"\n\n#: views.py:156\n#, fuzzy\n#| msgid \"User with login %s does not exist\"\nmsgid \"Forum does not exist\"\nmsgstr \"Používateľ s loginom %s neexistuje\"\n\n#: views.py:388\n#, fuzzy\n#| msgid \"User with login %s does not exist\"\nmsgid \"This topic does not exists\"\nmsgstr \"Používateľ s loginom %s neexistuje\"\n\n#: views.py:826\nmsgid \"\"\n\"Subscription removed. You will not receive emails from this topic unless you \"\n\"subscribe or post again.\"\nmsgstr \"\"\n\n#: views.py:837\nmsgid \"\"\n\"Subscription added. You will receive email notifications for replies to this \"\n\"topic.\"\nmsgstr \"\"\n\n#: views.py:855\nmsgid \"All forums marked as read\"\nmsgstr \"\"\n\n#: views.py:888\nmsgid \"User successfuly blocked\"\nmsgstr \"\"\n\n#: views.py:901\nmsgid \"User successfuly unblocked\"\nmsgstr \"\"\n\n#: views.py:939\nmsgid \"Privileges updated\"\nmsgstr \"\"\n\n#~ msgid \"IM\"\n#~ msgstr \"IM\"\n\n#~ msgid \"Ban options\"\n#~ msgstr \"Nastevanie blokovania\"\n\n#~ msgid \"Markup\"\n#~ msgstr \"Formátovaný text\"\n\n#~ msgid \"No\"\n#~ msgstr \"Nie\"\n\n#~ msgid \"Caution\"\n#~ msgstr \"Upozornenie\"\n\n#~ msgid \"Ban\"\n#~ msgstr \"Blokovanie\"\n\n#~ msgid \"Site\"\n#~ msgstr \"Stránka\"\n\n#~ msgid \"Jabber\"\n#~ msgstr \"Jabber\"\n\n#~ msgid \"ICQ\"\n#~ msgstr \"ICQ\"\n\n#~ msgid \"MSN\"\n#~ msgstr \"MSN\"\n\n#~ msgid \"AIM\"\n#~ msgstr \"AIM\"\n\n#~ msgid \"Yahoo\"\n#~ msgstr \"Yahoo\"\n\n#~ msgid \"Location\"\n#~ msgstr \"Umiestnenie\"\n\n#~ msgid \"Default markup\"\n#~ msgstr \"Východzí markup jazyk\"\n\n#~ msgid \"Ban status\"\n#~ msgstr \"Status blokovania\"\n\n#~ msgid \"Ban till\"\n#~ msgstr \"Blokovaný do\"\n\n#~ msgid \"Time\"\n#~ msgstr \"Čas\"\n\n#~ msgid \"Read\"\n#~ msgstr \"Prečítané\"\n\n#~ msgid \"Reads\"\n#~ msgstr \"Prečítania\"\n\n#~ msgid \"Path\"\n#~ msgstr \"Cesta\"\n\n#~ msgid \"Hash\"\n#~ msgstr \"Hash\"\n\n#~ msgid \"\"\n#~ \"New reply from %(username)s to topic that you have subscribed on.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"See topic: %(post_url)s\\n\"\n#~ \"Unsubscribe %(unsubscribe_url)s\"\n#~ msgstr \"\"\n#~ \"Nová odpoveď od %(username)s k téme, ktorú odoberáte.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"Pozri tému: %(post_url)s\\n\"\n#~ \"Neodoberať %(unsubscribe_url)s\"\n\n#~ msgid \"You banned\"\n#~ msgstr \"Ste zablokovaný\"\n\n#~ msgid \"Root\"\n#~ msgstr \"Domov\"\n\n#~ msgid \"New private message\"\n#~ msgstr \"Nová súkromná správa\"\n\n#~ msgid \"Change the password\"\n#~ msgstr \"Zmeniť heslo\"\n\n#~ msgid \"PYBB - django forum engine\"\n#~ msgstr \"PYBB - django fórum\"\n\n#~ msgid \"Important\"\n#~ msgstr \"Dôležité\"\n\n#~ msgid \"My profile\"\n#~ msgstr \"Môj profil\"\n\n#~ msgid \"Log out\"\n#~ msgstr \"Odhlásiť\"\n\n#~ msgid \"Logged in as \"\n#~ msgstr \"Prihlásený ako\"\n\n#~ msgid \"Sign up\"\n#~ msgstr \"Registrovať\"\n\n#~ msgid \"Log in\"\n#~ msgstr \"Prihlásiť\"\n\n#~ msgid \"Search powered by Google\"\n#~ msgstr \"Vyhľadávanie používa Google\"\n\n#~ msgid \"Enter topic id for add to merged topics\"\n#~ msgstr \"Vložte ID témy pre pridanie do zlúčených tém\"\n\n#~ msgid \"Add\"\n#~ msgstr \"Pridať\"\n\n#~ msgid \"Choose main topic to merge\"\n#~ msgstr \"Zvoľte hlavnú tému pre zlúčenie\"\n\n#~ msgid \"Merge\"\n#~ msgstr \"Zlúčiť\"\n\n#~ msgid \"Posts from changed topics\"\n#~ msgstr \"Príspevky zo zmenených tém\"\n\n#~ msgid \"Enter page number\"\n#~ msgstr \"Vložte číslo strany\"\n\n#~ msgid \"of\"\n#~ msgstr \"z\"\n\n#~ msgid \"Go to page...\"\n#~ msgstr \"Ísť na stranu...\"\n\n#~ msgid \"Page\"\n#~ msgstr \"Strana\"\n\n#~ msgid \"Expire\"\n#~ msgstr \"Vyprší\"\n\n#~ msgid \"Find all posts\"\n#~ msgstr \"Nájsť všetky príspevky\"\n\n#~ msgid \"Find all topics\"\n#~ msgstr \"Nájsť všetky témy\"\n\n#~ msgid \"Contacts\"\n#~ msgstr \"Kontakty\"\n\n#~ msgid \"seconds ago,seconds ago,seconds ago\"\n#~ msgstr \"sekúndu pred,sekundy pred,sekúnd pred\"\n\n#~ msgid \"minutes ago,minutes ago,minutes ago\"\n#~ msgstr \"minútu pred,minúty pred,minút pred\"\n\n#~ msgid \"Recipient\"\n#~ msgstr \"Príjemca\"\n\n#~ msgid \"You can't send PM to yourself\"\n#~ msgstr \"Nemôžete posielať PM sám sebe\"\n\n#~ msgid \"Invalid thread ID\"\n#~ msgstr \"Neplatné ID vlákna\"\n\n#~ msgid \"Inbox\"\n#~ msgstr \"Prichádzajúce správy\"\n\n#~ msgid \"Outbox\"\n#~ msgstr \"Odchádzajúce správy\"\n\n#~ msgid \"Trash\"\n#~ msgstr \"Kôš\"\n\n#~ msgid \"Author\"\n#~ msgstr \"Autor\"\n\n#~ msgid \"Private message\"\n#~ msgstr \"Súkromná správa\"\n\n#~ msgid \"Private messages\"\n#~ msgstr \"Súkromné správy\"\n\n#~ msgid \"Messagebox\"\n#~ msgstr \"Odkazová schránka\"\n\n#~ msgid \"\"\n#~ \"User %(username)s have sent your the new private message.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"See message online: %(pm_url)s\"\n#~ msgstr \"\"\n#~ \"Používateľ %(username)s Vám poslal súkromnú správu.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"Pozrieť správu online: %(pm_url)s\"\n\n#~ msgid \"New private message for you\"\n#~ msgstr \"Nová súkromná správa pre Vás\"\n\n#~ msgid \"PM\"\n#~ msgstr \"PM\"\n\n#~ msgid \"Send PM\"\n#~ msgstr \"Poslať PM\"\n\n#~ msgid \"Select messages:\"\n#~ msgstr \"Vyberte správy: \"\n\n#~ msgid \"All\"\n#~ msgstr \"Všetky\"\n\n#~ msgid \"Read messages\"\n#~ msgstr \"Prečítané správy\"\n\n#~ msgid \"Unread messages\"\n#~ msgstr \"Neprečítané správy\"\n\n#~ msgid \"Mark as unread\"\n#~ msgstr \"Označiť ako neprečítané\"\n\n#~ msgid \"Inbox is empty\"\n#~ msgstr \"Žiadne nové správy\"\n\n#~ msgid \"Message from\"\n#~ msgstr \"Správa od\"\n\n#~ msgid \"Message for\"\n#~ msgstr \"Správa pre\"\n\n#~ msgid \"Reply\"\n#~ msgstr \"Odpovedať\"\n\n#~ msgid \"to\"\n#~ msgstr \"pre\"\n\n#~ msgid \"Are you sure you want to delete these messages?\"\n#~ msgstr \"Ste si istý, že chcete vymazať tieto správy?\"\n\n#~ msgid \"From\"\n#~ msgstr \"Od\"\n\n#~ msgid \"This messagebox is empty\"\n#~ msgstr \"Táto schránka je prázdna\"\n\n#~ msgid \"Sent messages\"\n#~ msgstr \"Odoslané správy\"\n\n#~ msgid \"outbox\"\n#~ msgstr \"исходящие сообщения\"\n"
  },
  {
    "path": "pybb/locale/sv/LC_MESSAGES/django.po",
    "content": "# Swedish messages for Django pybbm app.\n# Copyright © 2016, 2017 Göran Uddeborg\n# This file is distributed under the same license as the pybbm package.\n# Göran Uddeborg <goeran@uddeborg.se>, 2016, 2017.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pybbm\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-01-11 14:06+0100\\n\"\n\"PO-Revision-Date: 2017-06-12 21:41+0200\\n\"\n\"Last-Translator: DylannCordel <d.cordel@webu.coop>\\n\"\n\"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\\n\"\n\"Language: sv\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Generator: Poedit 1.6.10\\n\"\n\"X-Poedit-SourceCharset: UTF-8\\n\"\n\n#: admin.py:45 admin.py:84 admin.py:112 admin.py:134\nmsgid \"Additional options\"\nmsgstr \"Ytterligare alternativ\"\n\n#: admin.py:117 models.py:280\nmsgid \"Message\"\nmsgstr \"Meddelande\"\n\n#: admin.py:148\nmsgid \"View post\"\nmsgstr \"Visa inlägg\"\n\n#: admin.py:153\nmsgid \"Edit post\"\nmsgstr \"Redigera inlägg\"\n\n#: apps.py:9\nmsgid \"Pybbm forum solution\"\nmsgstr \"Pybbm forum-program\"\n\n#: feeds.py:27 feeds.py:28 templates/pybb/base.html:10\nmsgid \"Latest posts on forum\"\nmsgstr \"Senaste inläggen i forumet\"\n\n#: feeds.py:41 feeds.py:42 templates/pybb/base.html:11\nmsgid \"Latest topics on forum\"\nmsgstr \"Senaste ämnen i forumet\"\n\n#: forms.py:30\nmsgid \"Attachment is too big\"\nmsgstr \"Bilagan är för stor\"\n\n#: forms.py:48\n#, python-format\nmsgid \"You cant add more than %s answers for poll\"\nmsgstr \"Du kan inte lägga till mer än %s svar till en omröstning\"\n\n#: forms.py:50\nmsgid \"Add two or more answers for this poll\"\nmsgstr \"Lägg till två eller fler svar till denna omröstning\"\n\n#: forms.py:58 models.py:183\nmsgid \"Subject\"\nmsgstr \"Ämne\"\n\n#: forms.py:59 models.py:195\nmsgid \"Poll type\"\nmsgstr \"Typ av omröstning\"\n\n#: forms.py:61 models.py:196\nmsgid \"Poll question\"\nmsgstr \"Fråga för omröstningen\"\n\n#: forms.py:64\nmsgid \"Topic slug\"\nmsgstr \"Typrad för ämnet\"\n\n#: forms.py:123\nmsgid \"Polls question is required when adding a poll\"\nmsgstr \"En fråga krävs när en omröstning läggs till\"\n\n#: forms.py:176 models.py:186 models.py:295 models.py:368 models.py:507\nmsgid \"User\"\nmsgstr \"Användare\"\n\n#: forms.py:212\n#, python-format\nmsgid \"Avatar is too large, max size: %s bytes\"\nmsgstr \"Avataren är för stor, maxstorlek: %s byte\"\n\n#: forms.py:272\nmsgid \"be unsubscribe from this forum\"\nmsgstr \"sluta prenumerera på detta forum\"\n\n#: forms.py:277\nmsgid \"You want to\"\nmsgstr \"Du vill\"\n\n#: forms.py:281\nmsgid \"only new topics\"\nmsgstr \"endast nya ämnen\"\n\n#: forms.py:282\nmsgid \"all topics of the forum\"\nmsgstr \"alla ämnen i forumet\"\n\n#: forms.py:285\nmsgid \"Concerned topics\"\nmsgstr \"Avseende ämnen\"\n\n#: models.py:23 models.py:59\nmsgid \"Name\"\nmsgstr \"Namn\"\n\n#: models.py:24 models.py:60\nmsgid \"Position\"\nmsgstr \"Plats\"\n\n#: models.py:25 models.py:66 templates/pybb/category.html:4\n#: templates/pybb/forum_list.html:26\nmsgid \"Hidden\"\nmsgstr \"Dold\"\n\n#: models.py:26\nmsgid \"If checked, this category will be visible only for staff\"\nmsgstr \"Om markerat blir denna kategori endast synlig för personal\"\n\n#: models.py:27 models.py:69 models.py:197\nmsgid \"Slug\"\nmsgstr \"Typrad\"\n\n#: models.py:31 models.py:56\nmsgid \"Category\"\nmsgstr \"Kategori\"\n\n#: models.py:32\nmsgid \"Categories\"\nmsgstr \"Kategorier\"\n\n#: models.py:57\nmsgid \"Parent forum\"\nmsgstr \"Föräldraforum\"\n\n#: models.py:61\nmsgid \"Description\"\nmsgstr \"Beskrivning\"\n\n#: models.py:62\nmsgid \"Moderators\"\nmsgstr \"Moderatorer\"\n\n#: models.py:63 models.py:185 models.py:297\nmsgid \"Updated\"\nmsgstr \"Uppdaterad\"\n\n#: models.py:64 models.py:192 profiles.py:41\nmsgid \"Post count\"\nmsgstr \"Antal inlägg\"\n\n#: models.py:65\nmsgid \"Topic count\"\nmsgstr \"Antal ämnen\"\n\n#: models.py:68\nmsgid \"Headline\"\nmsgstr \"Rubrik\"\n\n#: models.py:73 models.py:136 models.py:182 templates/pybb/forum_list.html:8\nmsgid \"Forum\"\nmsgstr \"Forum\"\n\n#: models.py:74\nmsgid \"Forums\"\nmsgstr \"Forum\"\n\n#: models.py:129\nmsgid \"be notified only when a new topic is added\"\nmsgstr \"endast bli underrättad när ett nytt ämne läggs till\"\n\n#: models.py:130\nmsgid \"be auto-subscribed to topics\"\nmsgstr \"automatiskt prenumerera på ämnen\"\n\n#: models.py:134\nmsgid \"Subscriber\"\nmsgstr \"Prenumerant\"\n\n#: models.py:138\nmsgid \"Subscription type\"\nmsgstr \"Prenumerationstyp\"\n\n#: models.py:148\nmsgid \"Subscription to forum\"\nmsgstr \"Prenumeration på forum\"\n\n#: models.py:149\nmsgid \"Subscriptions to forums\"\nmsgstr \"Prenumerationer på forum\"\n\n#: models.py:177\nmsgid \"None\"\nmsgstr \"Ingen\"\n\n#: models.py:178\nmsgid \"Single answer\"\nmsgstr \"Ett svar\"\n\n#: models.py:179\nmsgid \"Multiple answers\"\nmsgstr \"Flera svar\"\n\n#: models.py:184 models.py:296\nmsgid \"Created\"\nmsgstr \"Skapad\"\n\n#: models.py:187\nmsgid \"Views count\"\nmsgstr \"Antal visningar\"\n\n#: models.py:188 templates/pybb/topic_list.html:27\nmsgid \"Sticky\"\nmsgstr \"Fäst\"\n\n#: models.py:189 templates/pybb/topic_list.html:28\nmsgid \"Closed\"\nmsgstr \"Stängd\"\n\n#: models.py:191 templates/pybb/topic.html:88\nmsgid \"Subscribers\"\nmsgstr \"Prenumeranter\"\n\n#: models.py:194 models.py:299\nmsgid \"On moderation\"\nmsgstr \"Under moderering\"\n\n#: models.py:201 models.py:294 models.py:483 templates/pybb/topic_list.html:7\nmsgid \"Topic\"\nmsgstr \"Ämne\"\n\n#: models.py:202 templates/pybb/forum_list.html:11\n#: templates/pybb/user_topics.html:7\nmsgid \"Topics\"\nmsgstr \"Ämnen\"\n\n#: models.py:281\nmsgid \"HTML version\"\nmsgstr \"HTML-version\"\n\n#: models.py:282\nmsgid \"Text version\"\nmsgstr \"Textversion\"\n\n#: models.py:298\nmsgid \"User IP\"\nmsgstr \"Användar-IP\"\n\n#: models.py:303 models.py:386\nmsgid \"Post\"\nmsgstr \"Inlägg\"\n\n#: models.py:304 templates/pybb/forum_list.html:14\n#: templates/pybb/topic.html:42 templates/pybb/topic_list.html:10\n#: templates/pybb/user_posts.html:7\nmsgid \"Posts\"\nmsgstr \"Inlägg\"\n\n#: models.py:371\nmsgid \"Profile\"\nmsgstr \"Profil\"\n\n#: models.py:372\nmsgid \"Profiles\"\nmsgstr \"Profiler\"\n\n#: models.py:383\nmsgid \"Attachment\"\nmsgstr \"Bilaga\"\n\n#: models.py:384\nmsgid \"Attachments\"\nmsgstr \"Bilagor\"\n\n#: models.py:387\nmsgid \"Size\"\nmsgstr \"Storlek\"\n\n#: models.py:388\nmsgid \"File\"\nmsgstr \"Fil\"\n\n#: models.py:438\nmsgid \"Topic read tracker\"\nmsgstr \"Spårare av läst ämne\"\n\n#: models.py:439\nmsgid \"Topic read trackers\"\nmsgstr \"Spårare av läst ämne\"\n\n#: models.py:476\nmsgid \"Forum read tracker\"\nmsgstr \"Spårare av läst forum\"\n\n#: models.py:477\nmsgid \"Forum read trackers\"\nmsgstr \"Spårare av läst forum\"\n\n#: models.py:484\nmsgid \"Text\"\nmsgstr \"Text\"\n\n#: models.py:487 models.py:506\nmsgid \"Poll answer\"\nmsgstr \"Omröstningssvar\"\n\n#: models.py:488\nmsgid \"Polls answers\"\nmsgstr \"Omröstningssvar\"\n\n#: models.py:511\nmsgid \"Poll answer user\"\nmsgstr \"Användares omröstningssvar\"\n\n#: models.py:512\nmsgid \"Polls answers users\"\nmsgstr \"Användares omröstningssvar\"\n\n#: models.py:535\n#, python-format\nmsgid \"\"\n\"After %(limit)s attemps, there is not any unique slug value for \\\"%(slug)s\\\"\"\nmsgstr \"\"\n\"Efter %(limit)s försök finns det inget unikt typradsvärde för ”%(slug)s”\"\n\n#: profiles.py:34\nmsgid \"Signature\"\nmsgstr \"Signatur\"\n\n#: profiles.py:35\nmsgid \"Signature HTML Version\"\nmsgstr \"Signatur HTML-version\"\n\n#: profiles.py:37\nmsgid \"Time zone\"\nmsgstr \"Tidszon\"\n\n#: profiles.py:38\nmsgid \"Language\"\nmsgstr \"Språk\"\n\n#: profiles.py:40\nmsgid \"Show signatures\"\nmsgstr \"Visa signaturer\"\n\n#: profiles.py:42\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\n#: profiles.py:44\nmsgid \"Automatically subscribe\"\nmsgstr \"Prenumerera automatiskt\"\n\n#: profiles.py:45\nmsgid \"Automatically subscribe to topics that you answer\"\nmsgstr \"Prenumerera automatiskt på ämnen du besvarar\"\n\n#: templates/pybb/_button_forum_subscription.html:1\nmsgid \"Manage subscription\"\nmsgstr \"Hantera prenumerationen\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#: templates/pybb/topic.html:72\nmsgid \"Subscribe\"\nmsgstr \"Prenumerera\"\n\n#: templates/pybb/_button_new_topic.html:1 templates/pybb/add_post.html:5\n#: templates/pybb/add_post.html.py:32\nmsgid \"New topic\"\nmsgstr \"Nytt ämne\"\n\n#: templates/pybb/_button_save.html:1\nmsgid \"Save\"\nmsgstr \"Spara\"\n\n#: templates/pybb/_button_submit.html:1\n#: templates/pybb/forum_subscription.html:33\nmsgid \"Submit\"\nmsgstr \"Skicka\"\n\n#: templates/pybb/_markitup.html:25\n#: templates/pybb/markup/bbcode_widget.html:16\n#: templates/pybb/markup/markdown_widget.html:24\nmsgid \"Bold\"\nmsgstr \"Fetstil\"\n\n#: templates/pybb/_markitup.html:26\n#: templates/pybb/markup/bbcode_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:25\nmsgid \"Italic\"\nmsgstr \"Kursiv\"\n\n#: templates/pybb/_markitup.html:27\n#: templates/pybb/markup/bbcode_widget.html:18\nmsgid \"Underline\"\nmsgstr \"Understrykning\"\n\n#: templates/pybb/_markitup.html:28\n#: templates/pybb/markup/bbcode_widget.html:19\nmsgid \"Stroke\"\nmsgstr \"Överstrykning\"\n\n#: templates/pybb/_markitup.html:30\n#: templates/pybb/markup/bbcode_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:32\nmsgid \"Picture\"\nmsgstr \"Bild\"\n\n#: templates/pybb/_markitup.html:31\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Link\"\nmsgstr \"Länk\"\n\n#: templates/pybb/_markitup.html:33\n#: templates/pybb/markup/bbcode_widget.html:24\nmsgid \"Bulleted list\"\nmsgstr \"Punktlista\"\n\n#: templates/pybb/_markitup.html:34\n#: templates/pybb/markup/bbcode_widget.html:25\nmsgid \"Numeric list\"\nmsgstr \"Numrerad lista\"\n\n#: templates/pybb/_markitup.html:35\n#: templates/pybb/markup/bbcode_widget.html:26\nmsgid \"List item\"\nmsgstr \"Listpost\"\n\n#: templates/pybb/_markitup.html:37\n#: templates/pybb/markup/bbcode_widget.html:28\n#: templates/pybb/markup/markdown_widget.html:35\nmsgid \"Quotes\"\nmsgstr \"Citat\"\n\n#: templates/pybb/_markitup.html:38\n#: templates/pybb/markup/bbcode_widget.html:29\nmsgid \"Code\"\nmsgstr \"Kod\"\n\n#: templates/pybb/_markitup.html:40\n#: templates/pybb/markup/bbcode_widget.html:31\nmsgid \"Clean\"\nmsgstr \"Rensa\"\n\n#: templates/pybb/_markitup.html:41\n#: templates/pybb/markup/bbcode_widget.html:32\n#: templates/pybb/markup/markdown_widget.html:38\nmsgid \"Preview\"\nmsgstr \"Förhandsvisning\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"Register\"\nmsgstr \"Registrera dig\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"or\"\nmsgstr \"eller\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"login\"\nmsgstr \"logga in\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"to create to post a reply\"\nmsgstr \"för att skapa ett inlägg eller svara\"\n\n#: templates/pybb/add_post.html:5 templates/pybb/add_post.html.py:32\nmsgid \"New reply\"\nmsgstr \"Nytt svar\"\n\n#: templates/pybb/attachments_formset.html:6\nmsgid \"Add attachments\"\nmsgstr \"Lägg till bilagor\"\n\n#: templates/pybb/attachments_formset.html:14\nmsgid \"\"\n\"If you need to upload larger files, please use an external storage website.\"\nmsgstr \"Om du behöver skicka upp större filer, var god och använd en extern webbplats för lagring.\"\n\n#: templates/pybb/attachments_formset.html:14\n#, python-format\nmsgid \"(max size: %(max_size)s)\"\nmsgstr \"(max storlek: %(max_size)s)\"\n\n#: templates/pybb/attachments_formset.html:17\n#: templates/pybb/edit_profile.html:25\nmsgid \"delete\"\nmsgstr \"radera\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Reference to your file\"\nmsgstr \"Referens till din fil\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Ref\"\nmsgstr \"Ref\"\n\n#: templates/pybb/attachments_formset.html:20\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#: templates/pybb/topic.html:88 templates/pybb/topic_list.html:32\nmsgid \":\"\nmsgstr \":\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"link\"\nmsgstr \"länk\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"Insert a link to your file inside your post.\"\nmsgstr \"Infoga en länk till din fil i ditt inlägg.\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"image\"\nmsgstr \"bild\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"Insert your image inside your post.\"\nmsgstr \"Infoga din bild i ditt inlägg.\"\n\n#: templates/pybb/breadcrumb.html:4\nmsgid \"Home\"\nmsgstr \"Hem\"\n\n#: templates/pybb/delete_post.html:5\nmsgid \"Are you sure you want to delete this message?\"\nmsgstr \"Är du säker på att du vill radera detta meddelande?\"\n\n#: templates/pybb/delete_post.html:12\nmsgid \"No, take me back\"\nmsgstr \"Nej, ta mig tillbaka\"\n\n#: templates/pybb/delete_post.html:13\nmsgid \"Yes, I am sure\"\nmsgstr \"Ja, jag är säker\"\n\n#: templates/pybb/edit_post.html:4 templates/pybb/edit_post.html.py:17\nmsgid \"Editing the post\"\nmsgstr \"Redigera inlägget\"\n\n#: templates/pybb/edit_privileges.html:5 templates/pybb/edit_privileges.html:8\nmsgid \"Grant moderator privileges\"\nmsgstr \"Bevilja moderatorrättigheter\"\n\n#: templates/pybb/edit_profile.html:5 templates/pybb/edit_profile.html.py:8\n#: templates/pybb/edit_profile.html:13\nmsgid \"Profile editing\"\nmsgstr \"Profilredigering\"\n\n#: templates/pybb/edit_profile.html:18\nmsgid \"Subscriptions on topics\"\nmsgstr \"Prenumerationer på ämnen\"\n\n#: templates/pybb/forum_list.html:17\nmsgid \"Last posts\"\nmsgstr \"Senaste inlägg\"\n\n#: templates/pybb/forum_list.html:43\nmsgid \"No forums created\"\nmsgstr \"Inga forum skapade\"\n\n#: templates/pybb/forum_list.html:44\nmsgid \"Add forum now\"\nmsgstr \"Lägg till forum nu\"\n\n#: templates/pybb/forum_subscription.html:4\n#, python-format\nmsgctxt \"page title\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Prenumerationer\"\n\n#: templates/pybb/forum_subscription.html:14\n#, python-format\nmsgctxt \"content heading\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"%(forum)s - Prenumerationer\"\n\n#: templates/pybb/forum_subscription.html:32\nmsgid \"Cancel\"\nmsgstr \"Avbryt\"\n\n#: templates/pybb/index.html:17\nmsgid \"Forum categories are not created\"\nmsgstr \"Forumskategorier är inte skapade\"\n\n#: templates/pybb/index.html:18\nmsgid \"Add a category now\"\nmsgstr \"Lägg till en kategori nu\"\n\n#: templates/pybb/index.html:22 templates/pybb/latest_topics.html:5\n#: templates/pybb/latest_topics.html:8 templates/pybb/latest_topics.html:15\nmsgid \"Last updates in topics\"\nmsgstr \"Senaste uppdateringar i ämnen\"\n\n#: templates/pybb/index.html:23\nmsgid \"Mark all forums as read\"\nmsgstr \"Markera alla forum som lästa\"\n\n#: templates/pybb/latest_topics.html:31\nmsgid \"Mark all topics as read\"\nmsgstr \"Markera alla ämnen som lästa\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:4\n#, python-format\nmsgid \"\"\n\"User %(username)s post a new topic in forum to which you are subscribed \"\n\"(%(forum_name)s).\"\nmsgstr \"Användaren %(username)s skapade ett nytt ämne i ett forum du prenumererar på (%(forum_name)s).\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/subscription_email_body.html:5\nmsgid \"Link to topic\"\nmsgstr \"Länk till ämne\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\nmsgid \"Link to forum\"\nmsgstr \"Länk till inlägg\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\nmsgid \"\"\n\"If you don't want to receive notifications on new topics in this forum visit \"\n\"following link\"\nmsgstr \"Om du inte vill få aviseringar vid nya meddelanden i detta ämne, besök då följande länk\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_subject.html:2\nmsgid \"New topic in forum that you subscribed.\"\nmsgstr \"Nytt ämne i ett forum som du prenumererar på.\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:7\n#: templates/pybb/mail_templates/subscription_email_body.html:3\n#, python-format\nmsgid \"User %(username)s replied in topic to which you are subscribed.\"\nmsgstr \"Användare %(username)s svarade i ett ämne som du prenumererar på.\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:10\n#, python-format\nmsgid \"\"\n\"Follow %(link_post_start)sthis link%(link_end)s to see the new post on the \"\n\"topic %(link_topic_start)s%(topic_name)s%(link_end)s.\"\nmsgstr \"Följ %(link_post_start)sdenna länk%(link_end)s för att se det nya inlägget i ämnet %(link_topic_start)s%(topic_name)s%(link_end)s.\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:14\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new posts in this topic visit \"\n\"%(link_start)sthis link%(link_end)s.\"\nmsgstr \"Om du inte vill få aviseringar vid nya inlägg i detta ämne, besök då %(link_start)sdenna länk%(link_end)s.\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:4\nmsgid \"Link to post\"\nmsgstr \"Länk till inlägg\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:8\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new messages in this topic \"\n\"visit following link: %(delete_url_full)s\"\nmsgstr \"Om du inte vill få aviseringar vid nya meddelanden i detta ämne, besök då följande länk: %(delete_url_full)s\"\n\n#: templates/pybb/mail_templates/subscription_email_subject.html:2\nmsgid \"New answer in topic that you subscribed.\"\nmsgstr \"Nytt svar i ämne som du prenumererar på.\"\n\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Your text to link here...\"\nmsgstr \"Din text till länken här …\"\n\n#: templates/pybb/markup/markdown_widget.html:17\nmsgid \"First Level Heading\"\nmsgstr \"Första nivås rubrik\"\n\n#: templates/pybb/markup/markdown_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:18\n#: templates/pybb/markup/markdown_widget.html:19\n#: templates/pybb/markup/markdown_widget.html:20\n#: templates/pybb/markup/markdown_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Your title here...\"\nmsgstr \"Din titel här …\"\n\n#: templates/pybb/markup/markdown_widget.html:18\nmsgid \"Second Level Heading\"\nmsgstr \"Andra nivås rubrik\"\n\n#: templates/pybb/markup/markdown_widget.html:19\nmsgid \"Heading 3\"\nmsgstr \"Rubrik 3\"\n\n#: templates/pybb/markup/markdown_widget.html:20\nmsgid \"Heading 4\"\nmsgstr \"Rubrik 4\"\n\n#: templates/pybb/markup/markdown_widget.html:21\nmsgid \"Heading 5\"\nmsgstr \"Rubrik 5\"\n\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Heading 6\"\nmsgstr \"Rubrik 6\"\n\n#: templates/pybb/markup/markdown_widget.html:27\nmsgid \"Bulleted List\"\nmsgstr \"Punktlista\"\n\n#: templates/pybb/markup/markdown_widget.html:28\nmsgid \"Numeric List\"\nmsgstr \"Numrerad lista\"\n\n#: templates/pybb/markup/markdown_widget.html:36\nmsgid \"Code Block / Code\"\nmsgstr \"Kodblock / kod\"\n\n#: templates/pybb/pagination.html:7\nmsgid \"previous page\"\nmsgstr \"föregående sida\"\n\n#: templates/pybb/pagination.html:21\nmsgid \"next page\"\nmsgstr \"nästa sida\"\n\n#: templates/pybb/poll.html:4\nmsgid \"Poll\"\nmsgstr \"Omröstning\"\n\n#: templates/pybb/poll.html:36\nmsgid \"Cancel my poll vote\"\nmsgstr \"Annullera mitt omröstningsval\"\n\n#: templates/pybb/poll_edit_form.html:7\nmsgid \"Poll answers\"\nmsgstr \"Omröstningssvar\"\n\n#: templates/pybb/poll_edit_form.html:20\nmsgid \"remove answer\"\nmsgstr \"ta bort svar\"\n\n#: templates/pybb/poll_edit_form.html:21\nmsgid \"add answer\"\nmsgstr \"lägg till svar\"\n\n#: templates/pybb/post_template.html:28\n#, python-format\nmsgid \"Rank: %(rank)s\"\nmsgstr \"Rang: %(rank)s\"\n\n#: templates/pybb/post_template.html:41 templates/pybb/user.html:51\nmsgid \"Edit\"\nmsgstr \"Redigera\"\n\n#: templates/pybb/post_template.html:45\nmsgid \"Delete post?\"\nmsgstr \"Radera inlägg?\"\n\n#: templates/pybb/post_template.html:46\nmsgid \"Delete\"\nmsgstr \"Radera\"\n\n#: templates/pybb/post_template.html:49\nmsgid \"Approve post\"\nmsgstr \"Godkänn inlägg\"\n\n#: templates/pybb/post_template.html:53 templates/pybb/topic.html:62\nmsgid \"Admin\"\nmsgstr \"Admin\"\n\n#: templates/pybb/post_template.html:69\nmsgid \"Edited\"\nmsgstr \"Redigerat\"\n\n#: templates/pybb/post_template.html:83\nmsgid \"quote\"\nmsgstr \"citera\"\n\n#: templates/pybb/post_template.html:84\nmsgid \"quote selected\"\nmsgstr \"citera markering\"\n\n#: templates/pybb/topic.html:51\nmsgid \"Unstick topic\"\nmsgstr \"Avfäst ämne\"\n\n#: templates/pybb/topic.html:53\nmsgid \"Stick topic\"\nmsgstr \"Fäst ämne\"\n\n#: templates/pybb/topic.html:57\nmsgid \"Open topic\"\nmsgstr \"Öppna ämne\"\n\n#: templates/pybb/topic.html:59\nmsgid \"Close topic\"\nmsgstr \"Stäng ämne\"\n\n#: templates/pybb/topic.html:70\nmsgid \"Unsubscribe\"\nmsgstr \"Avprenumerera\"\n\n#: templates/pybb/topic_list.html:13\nmsgid \"Views\"\nmsgstr \"Visningar\"\n\n#: templates/pybb/topic_list.html:16\nmsgid \"Last post\"\nmsgstr \"Senaste inlägg\"\n\n#: templates/pybb/topic_list.html:26\nmsgid \"Go to first unread post\"\nmsgstr \"Gå till första olästa inlägg\"\n\n#: templates/pybb/topic_list.html:32\nmsgid \"pages\"\nmsgstr \"sidor\"\n\n#: templates/pybb/user.html:16\nmsgid \"Statistics\"\nmsgstr \"Statistik\"\n\n#: templates/pybb/user.html:19\n#, python-format\nmsgid \"Number of topics: %(count)s\"\nmsgstr \"Antal ämnen: %(count)s\"\n\n#: templates/pybb/user.html:24\n#, python-format\nmsgid \"Number of posts: %(count)s\"\nmsgstr \"Antal inlägg: %(count)s\"\n\n#: templates/pybb/user.html:29\n#, python-format\nmsgid \"Date of registration: %(date_joined)s \"\nmsgstr \"Registreringsdatum: %(date_joined)s \"\n\n#: templates/pybb/user.html:36\nmsgid \"Moderator\"\nmsgstr \"Moderator\"\n\n#: templates/pybb/user.html:41\nmsgid \"Block\"\nmsgstr \"Blockera\"\n\n#: templates/pybb/user.html:42\nmsgid \"Block and delete all messages\"\nmsgstr \"Blockera och radera alla meddelanden\"\n\n#: templates/pybb/user.html:46\nmsgid \"Unblock\"\nmsgstr \"Avblockera\"\n\n#: templates/pybb/user_posts.html:12 templates/pybb/user_posts.html.py:17\nmsgid \"All posts created by\"\nmsgstr \"Alla inlägg skapade av\"\n\n#: templates/pybb/user_topics.html:12 templates/pybb/user_topics.html.py:17\nmsgid \"All topics created by\"\nmsgstr \"Alla ämnen skapade av\"\n\n#: templates/pybb/users.html:8 templates/pybb/users.html.py:24\nmsgid \"Users\"\nmsgstr \"Användare\"\n\n#: templates/pybb/users.html:12\nmsgid \"Search\"\nmsgstr \"Sök\"\n\n#: templatetags/pybb_tags.py:61\n#, python-format\nmsgid \"%d second ago\"\nmsgid_plural \"%d seconds ago\"\nmsgstr[0] \"för %d sekund sedan\"\nmsgstr[1] \"för %d sekunder sedan\"\n\n#: templatetags/pybb_tags.py:65\n#, python-format\nmsgid \"%d minute ago\"\nmsgid_plural \"%d minutes ago\"\nmsgstr[0] \"för %d minut sedan\"\nmsgstr[1] \"för %d minuter sedan\"\n\n#: templatetags/pybb_tags.py:75\n#, python-format\nmsgid \"today, %s\"\nmsgstr \"idag, %s\"\n\n#: templatetags/pybb_tags.py:77\n#, python-format\nmsgid \"yesterday, %s\"\nmsgstr \"igår, %s\"\n\n#: util.py:140\nmsgid \"Can't get profile for anonymous user\"\nmsgstr \"Kan inte hämta profilen för en anonym användare\"\n\n#: views.py:156\nmsgid \"Forum does not exist\"\nmsgstr \"Forumet finns inte\"\n\n#: views.py:388\nmsgid \"This topic does not exists\"\nmsgstr \"Detta ämne finns inte\"\n\n#: views.py:826\nmsgid \"\"\n\"Subscription removed. You will not receive emails from this topic unless you \"\n\"subscribe or post again.\"\nmsgstr \"Prenumerationen borttagen.  Du kommer inte få e-post från detta ämne om du inte prenumererar eller gör inlägg igen.\"\n\n#: views.py:837\nmsgid \"\"\n\"Subscription added. You will receive email notifications for replies to this \"\n\"topic.\"\nmsgstr \"Prenumerationen tillagd.  Du kommer få e-postaviseringar om svar i detta ämne.\"\n\n#: views.py:855\nmsgid \"All forums marked as read\"\nmsgstr \"Alla forum är markerade som lästa\"\n\n#: views.py:888\nmsgid \"User successfuly blocked\"\nmsgstr \"Användaren blockerad\"\n\n#: views.py:901\nmsgid \"User successfuly unblocked\"\nmsgstr \"Användaren avblockerad\"\n\n#: views.py:939\nmsgid \"Privileges updated\"\nmsgstr \"Rättigheter uppdaterade\"\n"
  },
  {
    "path": "pybb/locale/uk/LC_MESSAGES/django.po",
    "content": "# Ukrainian translation for pybb forum\n# Copyright (C) 2009 Mykola Zamkovoi\n# This file is distributed under the same license as the pybb package.\n# Grigoriy Petukhov <lizendir@gmail.com>, 2008\n# Mykola Zamkovoi <nickzam@gmail.com>, 2009\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pybb\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-01-11 14:06+0100\\n\"\n\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: admin.py:45 admin.py:84 admin.py:112 admin.py:134\nmsgid \"Additional options\"\nmsgstr \"Додатково\"\n\n#: admin.py:117 models.py:280\nmsgid \"Message\"\nmsgstr \"Повідомлення\"\n\n#: admin.py:148\nmsgid \"View post\"\nmsgstr \"Кількість переглядів\"\n\n#: admin.py:153\nmsgid \"Edit post\"\nmsgstr \"Редагування повідомлення\"\n\n#: apps.py:9\nmsgid \"Pybbm forum solution\"\nmsgstr \"\"\n\n#: feeds.py:27 feeds.py:28 templates/pybb/base.html:10\nmsgid \"Latest posts on forum\"\nmsgstr \"Останні повідомлення на форумі\"\n\n#: feeds.py:41 feeds.py:42 templates/pybb/base.html:11\nmsgid \"Latest topics on forum\"\nmsgstr \"Останні теми на форумі\"\n\n#: forms.py:30\nmsgid \"Attachment is too big\"\nmsgstr \"Файл занадто великий\"\n\n#: forms.py:48\n#, python-format\nmsgid \"You cant add more than %s answers for poll\"\nmsgstr \"\"\n\n#: forms.py:50\nmsgid \"Add two or more answers for this poll\"\nmsgstr \"\"\n\n#: forms.py:58 models.py:183\nmsgid \"Subject\"\nmsgstr \"Заголовок\"\n\n#: forms.py:59 models.py:195\nmsgid \"Poll type\"\nmsgstr \"\"\n\n#: forms.py:61 models.py:196\n#, fuzzy\n#| msgid \"Position\"\nmsgid \"Poll question\"\nmsgstr \"Позиція\"\n\n#: forms.py:64\n#, fuzzy\n#| msgid \"Topics\"\nmsgid \"Topic slug\"\nmsgstr \"Теми\"\n\n#: forms.py:123\nmsgid \"Polls question is required when adding a poll\"\nmsgstr \"\"\n\n#: forms.py:176 models.py:186 models.py:295 models.py:368 models.py:507\nmsgid \"User\"\nmsgstr \"Користувач\"\n\n#: forms.py:212\n#, python-format\nmsgid \"Avatar is too large, max size: %s bytes\"\nmsgstr \"\"\n\n#: forms.py:272\nmsgid \"be unsubscribe from this forum\"\nmsgstr \"\"\n\n#: forms.py:277\nmsgid \"You want to\"\nmsgstr \"\"\n\n#: forms.py:281\n#, fuzzy\n#| msgid \"New topic\"\nmsgid \"only new topics\"\nmsgstr \"Нова тема\"\n\n#: forms.py:282\n#, fuzzy\n#| msgid \"Latest topics on forum\"\nmsgid \"all topics of the forum\"\nmsgstr \"Останні теми на форумі\"\n\n#: forms.py:285\n#, fuzzy\n#| msgid \"Merge topics\"\nmsgid \"Concerned topics\"\nmsgstr \"Об'єднати теми\"\n\n#: models.py:23 models.py:59\nmsgid \"Name\"\nmsgstr \"Ім'я\"\n\n#: models.py:24 models.py:60\nmsgid \"Position\"\nmsgstr \"Позиція\"\n\n#: models.py:25 models.py:66 templates/pybb/category.html:4\n#: templates/pybb/forum_list.html:26\nmsgid \"Hidden\"\nmsgstr \"\"\n\n#: models.py:26\nmsgid \"If checked, this category will be visible only for staff\"\nmsgstr \"\"\n\n#: models.py:27 models.py:69 models.py:197\nmsgid \"Slug\"\nmsgstr \"\"\n\n#: models.py:31 models.py:56\nmsgid \"Category\"\nmsgstr \"Категорія\"\n\n#: models.py:32\nmsgid \"Categories\"\nmsgstr \"Категорії\"\n\n#: models.py:57\nmsgid \"Parent forum\"\nmsgstr \"\"\n\n#: models.py:61\nmsgid \"Description\"\nmsgstr \"Опис\"\n\n#: models.py:62\nmsgid \"Moderators\"\nmsgstr \"Модератори\"\n\n#: models.py:63 models.py:185 models.py:297\nmsgid \"Updated\"\nmsgstr \"Дата оновлення\"\n\n#: models.py:64 models.py:192 profiles.py:41\nmsgid \"Post count\"\nmsgstr \"Кількість повідомлень\"\n\n#: models.py:65\nmsgid \"Topic count\"\nmsgstr \"Кількість повідомлень\"\n\n#: models.py:68\nmsgid \"Headline\"\nmsgstr \"\"\n\n#: models.py:73 models.py:136 models.py:182 templates/pybb/forum_list.html:8\nmsgid \"Forum\"\nmsgstr \"Форум\"\n\n#: models.py:74\nmsgid \"Forums\"\nmsgstr \"Форуми\"\n\n#: models.py:129\nmsgid \"be notified only when a new topic is added\"\nmsgstr \"\"\n\n#: models.py:130\nmsgid \"be auto-subscribed to topics\"\nmsgstr \"\"\n\n#: models.py:134\n#, fuzzy\n#| msgid \"Subscribers\"\nmsgid \"Subscriber\"\nmsgstr \"Підписалися на отримання повідомлень\"\n\n#: models.py:138\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription type\"\nmsgstr \"Повідомлення\"\n\n#: models.py:148\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription to forum\"\nmsgstr \"Повідомлення\"\n\n#: models.py:149\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscriptions to forums\"\nmsgstr \"Повідомлення\"\n\n#: models.py:177\nmsgid \"None\"\nmsgstr \"Ніякі\"\n\n#: models.py:178\nmsgid \"Single answer\"\nmsgstr \"\"\n\n#: models.py:179\nmsgid \"Multiple answers\"\nmsgstr \"\"\n\n#: models.py:184 models.py:296\nmsgid \"Created\"\nmsgstr \"Дата створення\"\n\n#: models.py:187\nmsgid \"Views count\"\nmsgstr \"Кількість переглядів\"\n\n#: models.py:188 templates/pybb/topic_list.html:27\nmsgid \"Sticky\"\nmsgstr \"Закріплено\"\n\n#: models.py:189 templates/pybb/topic_list.html:28\nmsgid \"Closed\"\nmsgstr \"Закрито\"\n\n#: models.py:191 templates/pybb/topic.html:88\nmsgid \"Subscribers\"\nmsgstr \"Підписалися на отримання повідомлень\"\n\n#: models.py:194 models.py:299\n#, fuzzy\n#| msgid \"Moderators\"\nmsgid \"On moderation\"\nmsgstr \"Модератори\"\n\n#: models.py:201 models.py:294 models.py:483 templates/pybb/topic_list.html:7\nmsgid \"Topic\"\nmsgstr \"Тема\"\n\n#: models.py:202 templates/pybb/forum_list.html:11\n#: templates/pybb/user_topics.html:7\nmsgid \"Topics\"\nmsgstr \"Теми\"\n\n#: models.py:281\nmsgid \"HTML version\"\nmsgstr \"HTML версія\"\n\n#: models.py:282\nmsgid \"Text version\"\nmsgstr \"Текстова версія\"\n\n#: models.py:298\nmsgid \"User IP\"\nmsgstr \"IP автора\"\n\n#: models.py:303 models.py:386\nmsgid \"Post\"\nmsgstr \"Повідомлення\"\n\n#: models.py:304 templates/pybb/forum_list.html:14\n#: templates/pybb/topic.html:42 templates/pybb/topic_list.html:10\n#: templates/pybb/user_posts.html:7\nmsgid \"Posts\"\nmsgstr \"Повідомлення\"\n\n#: models.py:371\nmsgid \"Profile\"\nmsgstr \"Профіль\"\n\n#: models.py:372\nmsgid \"Profiles\"\nmsgstr \"Профілі\"\n\n#: models.py:383\nmsgid \"Attachment\"\nmsgstr \"Доданий файл\"\n\n#: models.py:384\nmsgid \"Attachments\"\nmsgstr \"Додані файли\"\n\n#: models.py:387\nmsgid \"Size\"\nmsgstr \"Розмір\"\n\n#: models.py:388\nmsgid \"File\"\nmsgstr \"\"\n\n#: models.py:438\nmsgid \"Topic read tracker\"\nmsgstr \"\"\n\n#: models.py:439\nmsgid \"Topic read trackers\"\nmsgstr \"\"\n\n#: models.py:476\nmsgid \"Forum read tracker\"\nmsgstr \"\"\n\n#: models.py:477\nmsgid \"Forum read trackers\"\nmsgstr \"\"\n\n#: models.py:484\nmsgid \"Text\"\nmsgstr \"\"\n\n#: models.py:487 models.py:506\nmsgid \"Poll answer\"\nmsgstr \"\"\n\n#: models.py:488\nmsgid \"Polls answers\"\nmsgstr \"\"\n\n#: models.py:511\nmsgid \"Poll answer user\"\nmsgstr \"\"\n\n#: models.py:512\nmsgid \"Polls answers users\"\nmsgstr \"\"\n\n#: models.py:535\n#, python-format\nmsgid \"\"\n\"After %(limit)s attemps, there is not any unique slug value for \\\"%(slug)s\\\"\"\nmsgstr \"\"\n\n#: profiles.py:34\nmsgid \"Signature\"\nmsgstr \"Підпис\"\n\n#: profiles.py:35\nmsgid \"Signature HTML Version\"\nmsgstr \"HTML версія\"\n\n#: profiles.py:37\nmsgid \"Time zone\"\nmsgstr \"Часова зона\"\n\n#: profiles.py:38\nmsgid \"Language\"\nmsgstr \"Мова\"\n\n#: profiles.py:40\nmsgid \"Show signatures\"\nmsgstr \"Показувати підписи\"\n\n#: profiles.py:42\nmsgid \"Avatar\"\nmsgstr \"Аватар\"\n\n#: profiles.py:44\nmsgid \"Automatically subscribe\"\nmsgstr \"\"\n\n#: profiles.py:45\nmsgid \"Automatically subscribe to topics that you answer\"\nmsgstr \"\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#, fuzzy\n#| msgid \"Description\"\nmsgid \"Manage subscription\"\nmsgstr \"Опис\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#: templates/pybb/topic.html:72\nmsgid \"Subscribe\"\nmsgstr \"Отримувати повідомлення\"\n\n#: templates/pybb/_button_new_topic.html:1 templates/pybb/add_post.html:5\n#: templates/pybb/add_post.html.py:32\nmsgid \"New topic\"\nmsgstr \"Нова тема\"\n\n#: templates/pybb/_button_save.html:1\nmsgid \"Save\"\nmsgstr \"Зберегти\"\n\n#: templates/pybb/_button_submit.html:1\n#: templates/pybb/forum_subscription.html:33\nmsgid \"Submit\"\nmsgstr \"Відправити\"\n\n#: templates/pybb/_markitup.html:25\n#: templates/pybb/markup/bbcode_widget.html:16\n#: templates/pybb/markup/markdown_widget.html:24\nmsgid \"Bold\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:26\n#: templates/pybb/markup/bbcode_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:25\nmsgid \"Italic\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:27\n#: templates/pybb/markup/bbcode_widget.html:18\nmsgid \"Underline\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:28\n#: templates/pybb/markup/bbcode_widget.html:19\nmsgid \"Stroke\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:30\n#: templates/pybb/markup/bbcode_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:32\n#, fuzzy\n#| msgid \"Signature\"\nmsgid \"Picture\"\nmsgstr \"Підпис\"\n\n#: templates/pybb/_markitup.html:31\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Link\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:33\n#: templates/pybb/markup/bbcode_widget.html:24\nmsgid \"Bulleted list\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:34\n#: templates/pybb/markup/bbcode_widget.html:25\nmsgid \"Numeric list\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:35\n#: templates/pybb/markup/bbcode_widget.html:26\nmsgid \"List item\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:37\n#: templates/pybb/markup/bbcode_widget.html:28\n#: templates/pybb/markup/markdown_widget.html:35\n#, fuzzy\n#| msgid \"quote\"\nmsgid \"Quotes\"\nmsgstr \"цитувати\"\n\n#: templates/pybb/_markitup.html:38\n#: templates/pybb/markup/bbcode_widget.html:29\nmsgid \"Code\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:40\n#: templates/pybb/markup/bbcode_widget.html:31\nmsgid \"Clean\"\nmsgstr \"\"\n\n#: templates/pybb/_markitup.html:41\n#: templates/pybb/markup/bbcode_widget.html:32\n#: templates/pybb/markup/markdown_widget.html:38\nmsgid \"Preview\"\nmsgstr \"Попередній перегляд\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"Register\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"or\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"login\"\nmsgstr \"\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"to create to post a reply\"\nmsgstr \"\"\n\n#: templates/pybb/add_post.html:5 templates/pybb/add_post.html.py:32\nmsgid \"New reply\"\nmsgstr \"Нова відповідь\"\n\n#: templates/pybb/attachments_formset.html:6\n#, fuzzy\n#| msgid \"Attachments\"\nmsgid \"Add attachments\"\nmsgstr \"Додані файли\"\n\n#: templates/pybb/attachments_formset.html:14\nmsgid \"\"\n\"If you need to upload larger files, please use an external storage website.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:14\n#, python-format\nmsgid \"(max size: %(max_size)s)\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:17\n#: templates/pybb/edit_profile.html:25\nmsgid \"delete\"\nmsgstr \"видалити\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Reference to your file\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Ref\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#: templates/pybb/topic.html:88 templates/pybb/topic_list.html:32\nmsgid \":\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"link\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"Insert a link to your file inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"image\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"Insert your image inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/breadcrumb.html:4\nmsgid \"Home\"\nmsgstr \"\"\n\n#: templates/pybb/delete_post.html:5\nmsgid \"Are you sure you want to delete this message?\"\nmsgstr \"Вы впевнені, що хочете видалити це повідомлення?\"\n\n#: templates/pybb/delete_post.html:12\nmsgid \"No, take me back\"\nmsgstr \"\"\n\n#: templates/pybb/delete_post.html:13\n#, fuzzy\n#| msgid \"Yes, I am sure.\"\nmsgid \"Yes, I am sure\"\nmsgstr \"Так, хочу видалити.\"\n\n#: templates/pybb/edit_post.html:4 templates/pybb/edit_post.html.py:17\nmsgid \"Editing the post\"\nmsgstr \"Редагування повідомлення\"\n\n#: templates/pybb/edit_privileges.html:5 templates/pybb/edit_privileges.html:8\nmsgid \"Grant moderator privileges\"\nmsgstr \"\"\n\n#: templates/pybb/edit_profile.html:5 templates/pybb/edit_profile.html.py:8\n#: templates/pybb/edit_profile.html:13\nmsgid \"Profile editing\"\nmsgstr \"Редагувати профіль\"\n\n#: templates/pybb/edit_profile.html:18\nmsgid \"Subscriptions on topics\"\nmsgstr \"Повідомлення\"\n\n#: templates/pybb/forum_list.html:17\nmsgid \"Last posts\"\nmsgstr \"Останні повідомлення\"\n\n#: templates/pybb/forum_list.html:43\nmsgid \"No forums created\"\nmsgstr \"\"\n\n#: templates/pybb/forum_list.html:44\nmsgid \"Add forum now\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:4\n#, python-format\nmsgctxt \"page title\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:14\n#, python-format\nmsgctxt \"content heading\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:32\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:17\nmsgid \"Forum categories are not created\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:18\nmsgid \"Add a category now\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:22 templates/pybb/latest_topics.html:5\n#: templates/pybb/latest_topics.html:8 templates/pybb/latest_topics.html:15\n#, fuzzy\n#| msgid \"Last updated topics\"\nmsgid \"Last updates in topics\"\nmsgstr \"Останні оновлені теми\"\n\n#: templates/pybb/index.html:23\n#, fuzzy\n#| msgid \"Mark as read\"\nmsgid \"Mark all forums as read\"\nmsgstr \"Відмітити як прочитані\"\n\n#: templates/pybb/latest_topics.html:31\n#, fuzzy\n#| msgid \"Mark as read\"\nmsgid \"Mark all topics as read\"\nmsgstr \"Відмітити як прочитані\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:4\n#, python-format\nmsgid \"\"\n\"User %(username)s post a new topic in forum to which you are subscribed \"\n\"(%(forum_name)s).\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#, fuzzy\n#| msgid \"Stick topic\"\nmsgid \"Link to topic\"\nmsgstr \"Закріпити тему\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\nmsgid \"Link to forum\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\nmsgid \"\"\n\"If you don't want to receive notifications on new topics in this forum visit \"\n\"following link\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_subject.html:2\nmsgid \"New topic in forum that you subscribed.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:7\n#: templates/pybb/mail_templates/subscription_email_body.html:3\n#, python-format\nmsgid \"User %(username)s replied in topic to which you are subscribed.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:10\n#, python-format\nmsgid \"\"\n\"Follow %(link_post_start)sthis link%(link_end)s to see the new post on the \"\n\"topic %(link_topic_start)s%(topic_name)s%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:14\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new posts in this topic visit \"\n\"%(link_start)sthis link%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#, fuzzy\n#| msgid \"Edit post\"\nmsgid \"Link to post\"\nmsgstr \"Редагування повідомлення\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:8\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new messages in this topic \"\n\"visit following link: %(delete_url_full)s\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_subject.html:2\nmsgid \"New answer in topic that you subscribed.\"\nmsgstr \"\"\n\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Your text to link here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\nmsgid \"First Level Heading\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:18\n#: templates/pybb/markup/markdown_widget.html:19\n#: templates/pybb/markup/markdown_widget.html:20\n#: templates/pybb/markup/markdown_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Your title here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:18\nmsgid \"Second Level Heading\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:19\nmsgid \"Heading 3\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:20\nmsgid \"Heading 4\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:21\nmsgid \"Heading 5\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Heading 6\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:27\nmsgid \"Bulleted List\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:28\nmsgid \"Numeric List\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:36\nmsgid \"Code Block / Code\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:7\nmsgid \"previous page\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:21\nmsgid \"next page\"\nmsgstr \"\"\n\n#: templates/pybb/poll.html:4\nmsgid \"Poll\"\nmsgstr \"\"\n\n#: templates/pybb/poll.html:36\nmsgid \"Cancel my poll vote\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:7\nmsgid \"Poll answers\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:20\nmsgid \"remove answer\"\nmsgstr \"\"\n\n#: templates/pybb/poll_edit_form.html:21\nmsgid \"add answer\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:28\n#, python-format\nmsgid \"Rank: %(rank)s\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:41 templates/pybb/user.html:51\nmsgid \"Edit\"\nmsgstr \"Редагувати\"\n\n#: templates/pybb/post_template.html:45\nmsgid \"Delete post?\"\nmsgstr \"Видалити повідомлення?\"\n\n#: templates/pybb/post_template.html:46\nmsgid \"Delete\"\nmsgstr \"Видалити\"\n\n#: templates/pybb/post_template.html:49\nmsgid \"Approve post\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:53 templates/pybb/topic.html:62\n#, fuzzy\n#| msgid \"Admin CP\"\nmsgid \"Admin\"\nmsgstr \"Адміністрування\"\n\n#: templates/pybb/post_template.html:69\nmsgid \"Edited\"\nmsgstr \"Відредаговано\"\n\n#: templates/pybb/post_template.html:83\nmsgid \"quote\"\nmsgstr \"цитувати\"\n\n#: templates/pybb/post_template.html:84\n#, fuzzy\n#| msgid \"With selected:\"\nmsgid \"quote selected\"\nmsgstr \"З обраними:\"\n\n#: templates/pybb/topic.html:51\nmsgid \"Unstick topic\"\nmsgstr \"Зняти закріплення з теми?\"\n\n#: templates/pybb/topic.html:53\nmsgid \"Stick topic\"\nmsgstr \"Закріпити тему\"\n\n#: templates/pybb/topic.html:57\nmsgid \"Open topic\"\nmsgstr \"Відкрити тему\"\n\n#: templates/pybb/topic.html:59\nmsgid \"Close topic\"\nmsgstr \"Закрити тему\"\n\n#: templates/pybb/topic.html:70\nmsgid \"Unsubscribe\"\nmsgstr \"Заборонити повідомлення\"\n\n#: templates/pybb/topic_list.html:13\n#, fuzzy\n#| msgid \"View post\"\nmsgid \"Views\"\nmsgstr \"Кількість переглядів\"\n\n#: templates/pybb/topic_list.html:16\n#, fuzzy\n#| msgid \"Last posts\"\nmsgid \"Last post\"\nmsgstr \"Останні повідомлення\"\n\n#: templates/pybb/topic_list.html:26\nmsgid \"Go to first unread post\"\nmsgstr \"\"\n\n#: templates/pybb/topic_list.html:32\n#, fuzzy\n#| msgid \"Messages\"\nmsgid \"pages\"\nmsgstr \"Повідомлення\"\n\n#: templates/pybb/user.html:16\nmsgid \"Statistics\"\nmsgstr \"Статистика\"\n\n#: templates/pybb/user.html:19\n#, fuzzy, python-format\n#| msgid \"Number of topics\"\nmsgid \"Number of topics: %(count)s\"\nmsgstr \"Кількість тем\"\n\n#: templates/pybb/user.html:24\n#, fuzzy, python-format\n#| msgid \"Number of posts\"\nmsgid \"Number of posts: %(count)s\"\nmsgstr \"Кількість повідомлень\"\n\n#: templates/pybb/user.html:29\n#, fuzzy, python-format\n#| msgid \"Date of registration\"\nmsgid \"Date of registration: %(date_joined)s \"\nmsgstr \"Дата реєстрації\"\n\n#: templates/pybb/user.html:36\n#, fuzzy\n#| msgid \"Moderators\"\nmsgid \"Moderator\"\nmsgstr \"Модератори\"\n\n#: templates/pybb/user.html:41\nmsgid \"Block\"\nmsgstr \"\"\n\n#: templates/pybb/user.html:42\nmsgid \"Block and delete all messages\"\nmsgstr \"\"\n\n#: templates/pybb/user.html:46\nmsgid \"Unblock\"\nmsgstr \"\"\n\n#: templates/pybb/user_posts.html:12 templates/pybb/user_posts.html.py:17\n#, fuzzy\n#| msgid \"All topics created by\"\nmsgid \"All posts created by\"\nmsgstr \"Теми, що створені користувачем\"\n\n#: templates/pybb/user_topics.html:12 templates/pybb/user_topics.html.py:17\nmsgid \"All topics created by\"\nmsgstr \"Теми, що створені користувачем\"\n\n#: templates/pybb/users.html:8 templates/pybb/users.html.py:24\nmsgid \"Users\"\nmsgstr \"Користувачі\"\n\n#: templates/pybb/users.html:12\nmsgid \"Search\"\nmsgstr \"Пошук\"\n\n#: templatetags/pybb_tags.py:61\n#, fuzzy, python-format\n#| msgid \"seconds ago\"\nmsgid \"%d second ago\"\nmsgid_plural \"%d seconds ago\"\nmsgstr[0] \"секунди тому\"\nmsgstr[1] \"секунди тому\"\n\n#: templatetags/pybb_tags.py:65\n#, fuzzy, python-format\n#| msgid \"minutes ago\"\nmsgid \"%d minute ago\"\nmsgid_plural \"%d minutes ago\"\nmsgstr[0] \"хвилини тому\"\nmsgstr[1] \"хвилини тому\"\n\n#: templatetags/pybb_tags.py:75\n#, python-format\nmsgid \"today, %s\"\nmsgstr \"сьогодні, %s\"\n\n#: templatetags/pybb_tags.py:77\n#, python-format\nmsgid \"yesterday, %s\"\nmsgstr \"вчора, %s\"\n\n#: util.py:140\nmsgid \"Can't get profile for anonymous user\"\nmsgstr \"\"\n\n#: views.py:156\n#, fuzzy\n#| msgid \"User with login %s does not exist\"\nmsgid \"Forum does not exist\"\nmsgstr \"Користувач на ім'я %s не існує\"\n\n#: views.py:388\n#, fuzzy\n#| msgid \"User with login %s does not exist\"\nmsgid \"This topic does not exists\"\nmsgstr \"Користувач на ім'я %s не існує\"\n\n#: views.py:826\nmsgid \"\"\n\"Subscription removed. You will not receive emails from this topic unless you \"\n\"subscribe or post again.\"\nmsgstr \"\"\n\n#: views.py:837\nmsgid \"\"\n\"Subscription added. You will receive email notifications for replies to this \"\n\"topic.\"\nmsgstr \"\"\n\n#: views.py:855\nmsgid \"All forums marked as read\"\nmsgstr \"\"\n\n#: views.py:888\nmsgid \"User successfuly blocked\"\nmsgstr \"\"\n\n#: views.py:901\nmsgid \"User successfuly unblocked\"\nmsgstr \"\"\n\n#: views.py:939\nmsgid \"Privileges updated\"\nmsgstr \"\"\n\n#~ msgid \"Ban options\"\n#~ msgstr \"Опції блокування (бана)\"\n\n#~ msgid \"Path\"\n#~ msgstr \"Шлях\"\n\n#~ msgid \"Markup\"\n#~ msgstr \"Розмітка\"\n\n#~ msgid \"No\"\n#~ msgstr \"Ні\"\n\n#~ msgid \"Caution\"\n#~ msgstr \"Попередження\"\n\n#~ msgid \"Ban\"\n#~ msgstr \"Бан\"\n\n#~ msgid \"Default markup\"\n#~ msgstr \"Розмітка за замовчуванням\"\n\n#~ msgid \"Ban status\"\n#~ msgstr \"Статус блокування\"\n\n#~ msgid \"Ban till\"\n#~ msgstr \"Забанений до\"\n\n#~ msgid \"Hash\"\n#~ msgstr \"Хеш\"\n\n#~ msgid \"Read tracking\"\n#~ msgstr \"Відстеження прочитаних тем\"\n\n#~ msgid \"\"\n#~ \"New reply from %(username)s to topic that you have subscribed on.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"See topic: %(post_url)s\\n\"\n#~ \"Unsubscribe %(unsubscribe_url)s\"\n#~ msgstr \"\"\n#~ \"Нова відповідь від %(username)s в тему, на яку ви підписані.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"Переглянути тему: %(post_url)s\\n\"\n#~ \"Відписатися %(unsubscribe_url)s\"\n\n#~ msgid \"Added after %s minute\"\n#~ msgid_plural \"Added after %s minutes\"\n#~ msgstr[0] \"Додано %s хвилина тому\"\n#~ msgstr[1] \"Додано %s хвилин тому\"\n\n#~ msgid \"You banned\"\n#~ msgstr \"Ви заблоковані\"\n\n#~ msgid \"Root\"\n#~ msgstr \"Початок\"\n\n#~ msgid \"Remove\"\n#~ msgstr \"Видалити\"\n\n#~ msgid \"New private message\"\n#~ msgstr \"Створення повідомлення\"\n\n#~ msgid \"Change the password\"\n#~ msgstr \"Змініти пароль\"\n\n#~ msgid \"Important\"\n#~ msgstr \"Важливо\"\n\n#~ msgid \"My profile\"\n#~ msgstr \"Мій профіль\"\n\n#~ msgid \"Log out\"\n#~ msgstr \"Вийти\"\n\n#~ msgid \"Logged in as \"\n#~ msgstr \"Ваш логін\"\n\n#~ msgid \"Sign up\"\n#~ msgstr \"Рееєстрація\"\n\n#~ msgid \"Log in\"\n#~ msgstr \"Увійти\"\n\n#~ msgid \"Search powered by Google\"\n#~ msgstr \"Пошук з використанням Google\"\n\n#~ msgid \"Last topics in category %(category)s\"\n#~ msgstr \"Останні теми в категорії %(category)s\"\n\n#~ msgid \"Last topics\"\n#~ msgstr \"Останні теми\"\n\n#~ msgid \"Enter topic id for add to merged topics\"\n#~ msgstr \"Введіть id теми для додавання до списку тем, що об'єднуються\"\n\n#~ msgid \"Add\"\n#~ msgstr \"Додати\"\n\n#~ msgid \"Choose main topic to merge\"\n#~ msgstr \"Оберіть головну тему, в якій опиняться всі теми\"\n\n#~ msgid \"Merge\"\n#~ msgstr \"Об'єднання\"\n\n#~ msgid \"Posts from changed topics\"\n#~ msgstr \"Повідомлення зі з'єднаних тем\"\n\n#~ msgid \"Enter page number\"\n#~ msgstr \"Введіть номер сторінки\"\n\n#~ msgid \"of\"\n#~ msgstr \"з\"\n\n#~ msgid \"Go to page...\"\n#~ msgstr \"Перейти на сторінку...\"\n\n#~ msgid \"Page\"\n#~ msgstr \"Сторінка\"\n\n#~ msgid \"Expire\"\n#~ msgstr \"Закінчується\"\n\n#~ msgid \"Find all topics\"\n#~ msgstr \"Знайти всі теми\"\n\n#~ msgid \"seconds ago,seconds ago,seconds ago\"\n#~ msgstr \"секунду тому,секунди тому,секунд тому\"\n\n#~ msgid \"minutes ago,minutes ago,minutes ago\"\n#~ msgstr \"хвилину тому,хвилини тому,хвилин тому\"\n\n#~ msgid \"IM\"\n#~ msgstr \"IM\"\n\n#~ msgid \"Site\"\n#~ msgstr \"Сайт\"\n\n#~ msgid \"Jabber\"\n#~ msgstr \"Jabber\"\n\n#~ msgid \"ICQ\"\n#~ msgstr \"ICQ\"\n\n#~ msgid \"MSN\"\n#~ msgstr \"MSN\"\n\n#~ msgid \"AIM\"\n#~ msgstr \"AIM\"\n\n#~ msgid \"Yahoo\"\n#~ msgstr \"Yahoo\"\n\n#~ msgid \"Location\"\n#~ msgstr \"Звідки\"\n\n#~ msgid \"Time\"\n#~ msgstr \"Час\"\n\n#~ msgid \"Read\"\n#~ msgstr \"Перегляд\"\n\n#~ msgid \"Reads\"\n#~ msgstr \"Перегляди\"\n\n#~ msgid \"PYBB - django forum engine\"\n#~ msgstr \"PYBB - форум на django\"\n\n#~ msgid \"Find all posts\"\n#~ msgstr \"Знайти всі повідомлення\"\n\n#~ msgid \"Contacts\"\n#~ msgstr \"Контакти\"\n\n#~ msgid \"Recipient\"\n#~ msgstr \"Отримувач\"\n\n#~ msgid \"You can't send PM to yourself\"\n#~ msgstr \"Ви не можете відіслати повідомлення самому собі\"\n\n#~ msgid \"Invalid thread ID\"\n#~ msgstr \"Невірний ID ланцюга\"\n\n#~ msgid \"Inbox\"\n#~ msgstr \"Вхідні повідомлення\"\n\n#~ msgid \"Outbox\"\n#~ msgstr \"Вихідні повідомлення\"\n\n#~ msgid \"Trash\"\n#~ msgstr \"Видалені\"\n\n#~ msgid \"Author\"\n#~ msgstr \"Автор\"\n\n#~ msgid \"Private message\"\n#~ msgstr \"Приватне повідомлення\"\n\n#~ msgid \"Private messages\"\n#~ msgstr \"Приватні повідомлення\"\n\n#~ msgid \"Messagebox\"\n#~ msgstr \"Поштова скринька\"\n\n#~ msgid \"\"\n#~ \"User %(username)s have sent your the new private message.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"See message online: %(pm_url)s\"\n#~ msgstr \"\"\n#~ \"Користувач %(username)s надіслав вам нове приватне повідомлення.\\n\"\n#~ \"---\\n\"\n#~ \"%(message)s\\n\"\n#~ \"---\\n\"\n#~ \"Переглянути повідомлення online: %(pm_url)s\"\n\n#~ msgid \"New private message for you\"\n#~ msgstr \"Нове приватне повідомлення для вас\"\n\n#~ msgid \"PM\"\n#~ msgstr \"ПП\"\n\n#~ msgid \"Send PM\"\n#~ msgstr \"Відправити ПП\"\n\n#~ msgid \"Select messages:\"\n#~ msgstr \"Обрати повідомлення: \"\n\n#~ msgid \"All\"\n#~ msgstr \"Всі\"\n\n#~ msgid \"Read messages\"\n#~ msgstr \"Прочитані\"\n\n#~ msgid \"Unread messages\"\n#~ msgstr \"Непрочитані\"\n\n#~ msgid \"Mark as unread\"\n#~ msgstr \"Відмітити як непрочитані\"\n\n#~ msgid \"Inbox is empty\"\n#~ msgstr \"Нема повідомлень у Вхідних\"\n\n#~ msgid \"Message from\"\n#~ msgstr \"Повідомлення від\"\n\n#~ msgid \"Message for\"\n#~ msgstr \"Повідомлення для\"\n\n#~ msgid \"Reply\"\n#~ msgstr \"Відповідь\"\n\n#~ msgid \"to\"\n#~ msgstr \"для\"\n\n#~ msgid \"Are you sure you want to delete these messages?\"\n#~ msgstr \"Вы впевнені, що хочете видалити ці повідомлення?\"\n\n#~ msgid \"From\"\n#~ msgstr \"Від\"\n\n#~ msgid \"This messagebox is empty\"\n#~ msgstr \"Ця скринька пуста\"\n\n#~ msgid \"Sent messages\"\n#~ msgstr \"Надіслані повідомлення\"\n\n#~ msgid \"outbox\"\n#~ msgstr \"вихідні повідомлення\"\n"
  },
  {
    "path": "pybb/locale/zh/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pybbm\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-01-11 14:06+0100\\n\"\n\"PO-Revision-Date: 2017-01-11 14:18+0100\\n\"\n\"Last-Translator: DylannCordel <d.cordel@webu.coop>\\n\"\n\"Language-Team: \\n\"\n\"Language: zh\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Poedit 1.6.10\\n\"\n\"X-Poedit-SourceCharset: UTF-8\\n\"\n\"X-Poedit-Basepath: ../../..\\n\"\n\n#: admin.py:45 admin.py:84 admin.py:112 admin.py:134\nmsgid \"Additional options\"\nmsgstr \"额外选项\"\n\n#: admin.py:117 models.py:280\nmsgid \"Message\"\nmsgstr \"消息\"\n\n#: admin.py:148\nmsgid \"View post\"\nmsgstr \"查看帖子\"\n\n#: admin.py:153\nmsgid \"Edit post\"\nmsgstr \"编辑帖子\"\n\n#: apps.py:9\nmsgid \"Pybbm forum solution\"\nmsgstr \"\"\n\n#: feeds.py:27 feeds.py:28 templates/pybb/base.html:10\nmsgid \"Latest posts on forum\"\nmsgstr \"最新的帖子\"\n\n#: feeds.py:41 feeds.py:42 templates/pybb/base.html:11\nmsgid \"Latest topics on forum\"\nmsgstr \"最新的主题\"\n\n#: forms.py:30\nmsgid \"Attachment is too big\"\nmsgstr \"附件太大\"\n\n#: forms.py:48\n#, python-format\nmsgid \"You cant add more than %s answers for poll\"\nmsgstr \"选项个数不能多于%s个\"\n\n#: forms.py:50\nmsgid \"Add two or more answers for this poll\"\nmsgstr \"必须添加两个或以上的选项\"\n\n#: forms.py:58 models.py:183\nmsgid \"Subject\"\nmsgstr \"主题\"\n\n#: forms.py:59 models.py:195\nmsgid \"Poll type\"\nmsgstr \"投票类型\"\n\n#: forms.py:61 models.py:196\nmsgid \"Poll question\"\nmsgstr \"投票问题\"\n\n#: forms.py:64\n#, fuzzy\n#| msgid \"Topics\"\nmsgid \"Topic slug\"\nmsgstr \"主题\"\n\n#: forms.py:123\nmsgid \"Polls question is required when adding a poll\"\nmsgstr \"发起投票时必须设置问题\"\n\n#: forms.py:176 models.py:186 models.py:295 models.py:368 models.py:507\nmsgid \"User\"\nmsgstr \"用户\"\n\n#: forms.py:212\n#, python-format\nmsgid \"Avatar is too large, max size: %s bytes\"\nmsgstr \"头像过大，最大尺寸：%s字节\"\n\n#: forms.py:272\nmsgid \"be unsubscribe from this forum\"\nmsgstr \"\"\n\n#: forms.py:277\nmsgid \"You want to\"\nmsgstr \"\"\n\n#: forms.py:281\n#, fuzzy\n#| msgid \"New topic\"\nmsgid \"only new topics\"\nmsgstr \"新主题\"\n\n#: forms.py:282\n#, fuzzy\n#| msgid \"Latest topics on forum\"\nmsgid \"all topics of the forum\"\nmsgstr \"最新的主题\"\n\n#: forms.py:285\n#, fuzzy\n#| msgid \"Close topic\"\nmsgid \"Concerned topics\"\nmsgstr \"关闭主题\"\n\n#: models.py:23 models.py:59\nmsgid \"Name\"\nmsgstr \"名字\"\n\n#: models.py:24 models.py:60\nmsgid \"Position\"\nmsgstr \"位置\"\n\n#: models.py:25 models.py:66 templates/pybb/category.html:4\n#: templates/pybb/forum_list.html:26\nmsgid \"Hidden\"\nmsgstr \"隐藏\"\n\n#: models.py:26\nmsgid \"If checked, this category will be visible only for staff\"\nmsgstr \"如果选中此选项，此目录仅被员工可见\"\n\n#: models.py:27 models.py:69 models.py:197\nmsgid \"Slug\"\nmsgstr \"\"\n\n#: models.py:31 models.py:56\nmsgid \"Category\"\nmsgstr \"目录\"\n\n#: models.py:32\nmsgid \"Categories\"\nmsgstr \"目录\"\n\n#: models.py:57\nmsgid \"Parent forum\"\nmsgstr \"父讨论区\"\n\n#: models.py:61\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#: models.py:62\nmsgid \"Moderators\"\nmsgstr \"板主\"\n\n#: models.py:63 models.py:185 models.py:297\nmsgid \"Updated\"\nmsgstr \"最后更新\"\n\n#: models.py:64 models.py:192 profiles.py:41\nmsgid \"Post count\"\nmsgstr \"贴子数\"\n\n#: models.py:65\nmsgid \"Topic count\"\nmsgstr \"主题数\"\n\n#: models.py:68\nmsgid \"Headline\"\nmsgstr \"标题\"\n\n#: models.py:73 models.py:136 models.py:182 templates/pybb/forum_list.html:8\nmsgid \"Forum\"\nmsgstr \"论坛\"\n\n#: models.py:74\nmsgid \"Forums\"\nmsgstr \"论坛\"\n\n#: models.py:129\nmsgid \"be notified only when a new topic is added\"\nmsgstr \"\"\n\n#: models.py:130\nmsgid \"be auto-subscribed to topics\"\nmsgstr \"\"\n\n#: models.py:134\n#, fuzzy\n#| msgid \"Subscribers\"\nmsgid \"Subscriber\"\nmsgstr \"订阅者\"\n\n#: models.py:138\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription type\"\nmsgstr \"订阅的主题\"\n\n#: models.py:148\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscription to forum\"\nmsgstr \"订阅的主题\"\n\n#: models.py:149\n#, fuzzy\n#| msgid \"Subscriptions on topics\"\nmsgid \"Subscriptions to forums\"\nmsgstr \"订阅的主题\"\n\n#: models.py:177\nmsgid \"None\"\nmsgstr \"无\"\n\n#: models.py:178\nmsgid \"Single answer\"\nmsgstr \"单选\"\n\n#: models.py:179\nmsgid \"Multiple answers\"\nmsgstr \"多选\"\n\n#: models.py:184 models.py:296\nmsgid \"Created\"\nmsgstr \"创建时间\"\n\n#: models.py:187\nmsgid \"Views count\"\nmsgstr \"浏览次数\"\n\n#: models.py:188 templates/pybb/topic_list.html:27\nmsgid \"Sticky\"\nmsgstr \"置顶\"\n\n#: models.py:189 templates/pybb/topic_list.html:28\nmsgid \"Closed\"\nmsgstr \"已关闭\"\n\n#: models.py:191 templates/pybb/topic.html:88\nmsgid \"Subscribers\"\nmsgstr \"订阅者\"\n\n#: models.py:194 models.py:299\nmsgid \"On moderation\"\nmsgstr \"审核中\"\n\n#: models.py:201 models.py:294 models.py:483 templates/pybb/topic_list.html:7\nmsgid \"Topic\"\nmsgstr \"主题\"\n\n#: models.py:202 templates/pybb/forum_list.html:11\n#: templates/pybb/user_topics.html:7\nmsgid \"Topics\"\nmsgstr \"主题\"\n\n#: models.py:281\nmsgid \"HTML version\"\nmsgstr \"HTML版本\"\n\n#: models.py:282\nmsgid \"Text version\"\nmsgstr \"文本版本\"\n\n#: models.py:298\nmsgid \"User IP\"\nmsgstr \"用户IP\"\n\n#: models.py:303 models.py:386\nmsgid \"Post\"\nmsgstr \"帖子\"\n\n#: models.py:304 templates/pybb/forum_list.html:14\n#: templates/pybb/topic.html:42 templates/pybb/topic_list.html:10\n#: templates/pybb/user_posts.html:7\nmsgid \"Posts\"\nmsgstr \"帖子\"\n\n#: models.py:371\nmsgid \"Profile\"\nmsgstr \"个人资料\"\n\n#: models.py:372\nmsgid \"Profiles\"\nmsgstr \"个人资料\"\n\n#: models.py:383\nmsgid \"Attachment\"\nmsgstr \"附件\"\n\n#: models.py:384\nmsgid \"Attachments\"\nmsgstr \"附件\"\n\n#: models.py:387\nmsgid \"Size\"\nmsgstr \"大小\"\n\n#: models.py:388\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: models.py:438\nmsgid \"Topic read tracker\"\nmsgstr \"主题阅读跟踪\"\n\n#: models.py:439\nmsgid \"Topic read trackers\"\nmsgstr \"主题阅读跟踪\"\n\n#: models.py:476\nmsgid \"Forum read tracker\"\nmsgstr \"讨论区阅读跟踪\"\n\n#: models.py:477\nmsgid \"Forum read trackers\"\nmsgstr \"讨论区阅读跟踪\"\n\n#: models.py:484\nmsgid \"Text\"\nmsgstr \"文本\"\n\n#: models.py:487 models.py:506\nmsgid \"Poll answer\"\nmsgstr \"投票回答\"\n\n#: models.py:488\nmsgid \"Polls answers\"\nmsgstr \"投票回答\"\n\n#: models.py:511\nmsgid \"Poll answer user\"\nmsgstr \"投票回答用户\"\n\n#: models.py:512\nmsgid \"Polls answers users\"\nmsgstr \"投票回答用户\"\n\n#: models.py:535\n#, python-format\nmsgid \"\"\n\"After %(limit)s attemps, there is not any unique slug value for \\\"%(slug)s\\\"\"\nmsgstr \"\"\n\n#: profiles.py:34\nmsgid \"Signature\"\nmsgstr \"签名\"\n\n#: profiles.py:35\nmsgid \"Signature HTML Version\"\nmsgstr \"HTML版签名\"\n\n#: profiles.py:37\nmsgid \"Time zone\"\nmsgstr \"时区\"\n\n#: profiles.py:38\nmsgid \"Language\"\nmsgstr \"语言\"\n\n#: profiles.py:40\nmsgid \"Show signatures\"\nmsgstr \"显示签名\"\n\n#: profiles.py:42\nmsgid \"Avatar\"\nmsgstr \"个人头像\"\n\n#: profiles.py:44\nmsgid \"Automatically subscribe\"\nmsgstr \"自动订阅\"\n\n#: profiles.py:45\nmsgid \"Automatically subscribe to topics that you answer\"\nmsgstr \"自动订阅您回复的主题\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#, fuzzy\n#| msgid \"Description\"\nmsgid \"Manage subscription\"\nmsgstr \"描述\"\n\n#: templates/pybb/_button_forum_subscription.html:1\n#: templates/pybb/topic.html:72\nmsgid \"Subscribe\"\nmsgstr \"订阅\"\n\n#: templates/pybb/_button_new_topic.html:1 templates/pybb/add_post.html:5\n#: templates/pybb/add_post.html.py:32\nmsgid \"New topic\"\nmsgstr \"新主题\"\n\n#: templates/pybb/_button_save.html:1\nmsgid \"Save\"\nmsgstr \"保存\"\n\n#: templates/pybb/_button_submit.html:1\n#: templates/pybb/forum_subscription.html:33\nmsgid \"Submit\"\nmsgstr \"提交\"\n\n#: templates/pybb/_markitup.html:25\n#: templates/pybb/markup/bbcode_widget.html:16\n#: templates/pybb/markup/markdown_widget.html:24\nmsgid \"Bold\"\nmsgstr \"粗体\"\n\n#: templates/pybb/_markitup.html:26\n#: templates/pybb/markup/bbcode_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:25\nmsgid \"Italic\"\nmsgstr \"斜体\"\n\n#: templates/pybb/_markitup.html:27\n#: templates/pybb/markup/bbcode_widget.html:18\nmsgid \"Underline\"\nmsgstr \"下划线\"\n\n#: templates/pybb/_markitup.html:28\n#: templates/pybb/markup/bbcode_widget.html:19\nmsgid \"Stroke\"\nmsgstr \"描边\"\n\n#: templates/pybb/_markitup.html:30\n#: templates/pybb/markup/bbcode_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:32\nmsgid \"Picture\"\nmsgstr \"图片\"\n\n#: templates/pybb/_markitup.html:31\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Link\"\nmsgstr \"链接\"\n\n#: templates/pybb/_markitup.html:33\n#: templates/pybb/markup/bbcode_widget.html:24\nmsgid \"Bulleted list\"\nmsgstr \"符号列表\"\n\n#: templates/pybb/_markitup.html:34\n#: templates/pybb/markup/bbcode_widget.html:25\nmsgid \"Numeric list\"\nmsgstr \"数字列表\"\n\n#: templates/pybb/_markitup.html:35\n#: templates/pybb/markup/bbcode_widget.html:26\nmsgid \"List item\"\nmsgstr \"列表项\"\n\n#: templates/pybb/_markitup.html:37\n#: templates/pybb/markup/bbcode_widget.html:28\n#: templates/pybb/markup/markdown_widget.html:35\nmsgid \"Quotes\"\nmsgstr \"引用\"\n\n#: templates/pybb/_markitup.html:38\n#: templates/pybb/markup/bbcode_widget.html:29\nmsgid \"Code\"\nmsgstr \"代码\"\n\n#: templates/pybb/_markitup.html:40\n#: templates/pybb/markup/bbcode_widget.html:31\nmsgid \"Clean\"\nmsgstr \"清除\"\n\n#: templates/pybb/_markitup.html:41\n#: templates/pybb/markup/bbcode_widget.html:32\n#: templates/pybb/markup/markdown_widget.html:38\nmsgid \"Preview\"\nmsgstr \"预览\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"Register\"\nmsgstr \"注册\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"or\"\nmsgstr \"或\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"login\"\nmsgstr \"登录\"\n\n#: templates/pybb/_need_to_login_message.html:2\nmsgid \"to create to post a reply\"\nmsgstr \"来创建回复\"\n\n#: templates/pybb/add_post.html:5 templates/pybb/add_post.html.py:32\nmsgid \"New reply\"\nmsgstr \"回复主题\"\n\n#: templates/pybb/attachments_formset.html:6\nmsgid \"Add attachments\"\nmsgstr \"添加附件\"\n\n#: templates/pybb/attachments_formset.html:14\nmsgid \"\"\n\"If you need to upload larger files, please use an external storage website.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:14\n#, python-format\nmsgid \"(max size: %(max_size)s)\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:17\n#: templates/pybb/edit_profile.html:25\nmsgid \"delete\"\nmsgstr \"删除\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Reference to your file\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\nmsgid \"Ref\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:20\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#: templates/pybb/topic.html:88 templates/pybb/topic_list.html:32\nmsgid \":\"\nmsgstr \"：\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"link\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:22\nmsgid \"Insert a link to your file inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"image\"\nmsgstr \"\"\n\n#: templates/pybb/attachments_formset.html:23\nmsgid \"Insert your image inside your post.\"\nmsgstr \"\"\n\n#: templates/pybb/breadcrumb.html:4\nmsgid \"Home\"\nmsgstr \"主页\"\n\n#: templates/pybb/delete_post.html:5\nmsgid \"Are you sure you want to delete this message?\"\nmsgstr \"确认药删除这条消息？\"\n\n#: templates/pybb/delete_post.html:12\nmsgid \"No, take me back\"\nmsgstr \"不，返回\"\n\n#: templates/pybb/delete_post.html:13\nmsgid \"Yes, I am sure\"\nmsgstr \"是，我确定\"\n\n#: templates/pybb/edit_post.html:4 templates/pybb/edit_post.html.py:17\nmsgid \"Editing the post\"\nmsgstr \"编辑帖子\"\n\n#: templates/pybb/edit_privileges.html:5 templates/pybb/edit_privileges.html:8\nmsgid \"Grant moderator privileges\"\nmsgstr \"\"\n\n#: templates/pybb/edit_profile.html:5 templates/pybb/edit_profile.html.py:8\n#: templates/pybb/edit_profile.html:13\nmsgid \"Profile editing\"\nmsgstr \"个人资料编辑中\"\n\n#: templates/pybb/edit_profile.html:18\nmsgid \"Subscriptions on topics\"\nmsgstr \"订阅的主题\"\n\n#: templates/pybb/forum_list.html:17\nmsgid \"Last posts\"\nmsgstr \"最近更新\"\n\n#: templates/pybb/forum_list.html:43\nmsgid \"No forums created\"\nmsgstr \"没有讨论区\"\n\n#: templates/pybb/forum_list.html:44\nmsgid \"Add forum now\"\nmsgstr \"创建讨论区\"\n\n#: templates/pybb/forum_subscription.html:4\n#, python-format\nmsgctxt \"page title\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:14\n#, python-format\nmsgctxt \"content heading\"\nmsgid \"%(forum)s - Subscription\"\nmsgstr \"\"\n\n#: templates/pybb/forum_subscription.html:32\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#: templates/pybb/index.html:17\nmsgid \"Forum categories are not created\"\nmsgstr \"没有创建讨论区目录\"\n\n#: templates/pybb/index.html:18\nmsgid \"Add a category now\"\nmsgstr \"增加新目录\"\n\n#: templates/pybb/index.html:22 templates/pybb/latest_topics.html:5\n#: templates/pybb/latest_topics.html:8 templates/pybb/latest_topics.html:15\nmsgid \"Last updates in topics\"\nmsgstr \"最近更新的主题\"\n\n#: templates/pybb/index.html:23\nmsgid \"Mark all forums as read\"\nmsgstr \"标记所有讨论区已读\"\n\n#: templates/pybb/latest_topics.html:31\nmsgid \"Mark all topics as read\"\nmsgstr \"标记所有主题为已读\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:4\n#, fuzzy, python-format\n#| msgid \"replied in topic to which you are subscribed.\"\nmsgid \"\"\n\"User %(username)s post a new topic in forum to which you are subscribed \"\n\"(%(forum_name)s).\"\nmsgstr \"你订阅的主题的回复\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:5\n#: templates/pybb/mail_templates/subscription_email_body.html:5\n#, fuzzy\n#| msgid \"Link to topic:\"\nmsgid \"Link to topic\"\nmsgstr \"主题链接\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:6\n#, fuzzy\n#| msgid \"Link to post:\"\nmsgid \"Link to forum\"\nmsgstr \"帖子链接\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_body.html:9\nmsgid \"\"\n\"If you don't want to receive notifications on new topics in this forum visit \"\n\"following link\"\nmsgstr \"如果您不想再次收到此主题的通知，请点击如下链接\"\n\n#: templates/pybb/mail_templates/forum_subscription_email_subject.html:2\n#, fuzzy\n#| msgid \"New answer in topic that you subscribed.\"\nmsgid \"New topic in forum that you subscribed.\"\nmsgstr \"您订阅的主题有新的内容\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:7\n#: templates/pybb/mail_templates/subscription_email_body.html:3\n#, fuzzy, python-format\n#| msgid \"replied in topic to which you are subscribed.\"\nmsgid \"User %(username)s replied in topic to which you are subscribed.\"\nmsgstr \"你订阅的主题的回复\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:10\n#, python-format\nmsgid \"\"\n\"Follow %(link_post_start)sthis link%(link_end)s to see the new post on the \"\n\"topic %(link_topic_start)s%(topic_name)s%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body-html.html:14\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new posts in this topic visit \"\n\"%(link_start)sthis link%(link_end)s.\"\nmsgstr \"\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:4\n#, fuzzy\n#| msgid \"Link to post:\"\nmsgid \"Link to post\"\nmsgstr \"帖子链接\"\n\n#: templates/pybb/mail_templates/subscription_email_body.html:8\n#, python-format\nmsgid \"\"\n\"If you don't want to receive notifications on new messages in this topic \"\n\"visit following link: %(delete_url_full)s\"\nmsgstr \"如果您不想再次收到此主题的通知，请点击如下链接：%(delete_url_full)s\"\n\n#: templates/pybb/mail_templates/subscription_email_subject.html:2\nmsgid \"New answer in topic that you subscribed.\"\nmsgstr \"您订阅的主题有新的内容\"\n\n#: templates/pybb/markup/bbcode_widget.html:22\n#: templates/pybb/markup/markdown_widget.html:33\nmsgid \"Your text to link here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\nmsgid \"First Level Heading\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:17\n#: templates/pybb/markup/markdown_widget.html:18\n#: templates/pybb/markup/markdown_widget.html:19\n#: templates/pybb/markup/markdown_widget.html:20\n#: templates/pybb/markup/markdown_widget.html:21\n#: templates/pybb/markup/markdown_widget.html:22\nmsgid \"Your title here...\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:18\nmsgid \"Second Level Heading\"\nmsgstr \"\"\n\n#: templates/pybb/markup/markdown_widget.html:19\n#, fuzzy\n#| msgid \"Headline\"\nmsgid \"Heading 3\"\nmsgstr \"标题\"\n\n#: templates/pybb/markup/markdown_widget.html:20\n#, fuzzy\n#| msgid \"Headline\"\nmsgid \"Heading 4\"\nmsgstr \"标题\"\n\n#: templates/pybb/markup/markdown_widget.html:21\n#, fuzzy\n#| msgid \"Headline\"\nmsgid \"Heading 5\"\nmsgstr \"标题\"\n\n#: templates/pybb/markup/markdown_widget.html:22\n#, fuzzy\n#| msgid \"Headline\"\nmsgid \"Heading 6\"\nmsgstr \"标题\"\n\n#: templates/pybb/markup/markdown_widget.html:27\n#, fuzzy\n#| msgid \"Bulleted list\"\nmsgid \"Bulleted List\"\nmsgstr \"符号列表\"\n\n#: templates/pybb/markup/markdown_widget.html:28\n#, fuzzy\n#| msgid \"Numeric list\"\nmsgid \"Numeric List\"\nmsgstr \"数字列表\"\n\n#: templates/pybb/markup/markdown_widget.html:36\nmsgid \"Code Block / Code\"\nmsgstr \"\"\n\n#: templates/pybb/pagination.html:7\nmsgid \"previous page\"\nmsgstr \"上一页\"\n\n#: templates/pybb/pagination.html:21\nmsgid \"next page\"\nmsgstr \"下一页\"\n\n#: templates/pybb/poll.html:4\nmsgid \"Poll\"\nmsgstr \"投票\"\n\n#: templates/pybb/poll.html:36\nmsgid \"Cancel my poll vote\"\nmsgstr \"取消我的投票\"\n\n#: templates/pybb/poll_edit_form.html:7\nmsgid \"Poll answers\"\nmsgstr \"投票选项\"\n\n#: templates/pybb/poll_edit_form.html:20\nmsgid \"remove answer\"\nmsgstr \"删除选项\"\n\n#: templates/pybb/poll_edit_form.html:21\nmsgid \"add answer\"\nmsgstr \"增加选项\"\n\n#: templates/pybb/post_template.html:28\n#, python-format\nmsgid \"Rank: %(rank)s\"\nmsgstr \"\"\n\n#: templates/pybb/post_template.html:41 templates/pybb/user.html:51\nmsgid \"Edit\"\nmsgstr \"编辑\"\n\n#: templates/pybb/post_template.html:45\nmsgid \"Delete post?\"\nmsgstr \"删除帖子？\"\n\n#: templates/pybb/post_template.html:46\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: templates/pybb/post_template.html:49\nmsgid \"Approve post\"\nmsgstr \"通过帖子\"\n\n#: templates/pybb/post_template.html:53 templates/pybb/topic.html:62\nmsgid \"Admin\"\nmsgstr \"管理\"\n\n#: templates/pybb/post_template.html:69\nmsgid \"Edited\"\nmsgstr \"已编辑\"\n\n#: templates/pybb/post_template.html:83\nmsgid \"quote\"\nmsgstr \"引用\"\n\n#: templates/pybb/post_template.html:84\nmsgid \"quote selected\"\nmsgstr \"选中的引用\"\n\n#: templates/pybb/topic.html:51\nmsgid \"Unstick topic\"\nmsgstr \"取消置顶\"\n\n#: templates/pybb/topic.html:53\nmsgid \"Stick topic\"\nmsgstr \"置顶\"\n\n#: templates/pybb/topic.html:57\nmsgid \"Open topic\"\nmsgstr \"打开主题\"\n\n#: templates/pybb/topic.html:59\nmsgid \"Close topic\"\nmsgstr \"关闭主题\"\n\n#: templates/pybb/topic.html:70\nmsgid \"Unsubscribe\"\nmsgstr \"取消订阅\"\n\n#: templates/pybb/topic_list.html:13\nmsgid \"Views\"\nmsgstr \"浏览数\"\n\n#: templates/pybb/topic_list.html:16\nmsgid \"Last post\"\nmsgstr \"最近更新\"\n\n#: templates/pybb/topic_list.html:26\nmsgid \"Go to first unread post\"\nmsgstr \"跳转到第一个未读帖子\"\n\n#: templates/pybb/topic_list.html:32\nmsgid \"pages\"\nmsgstr \"页\"\n\n#: templates/pybb/user.html:16\nmsgid \"Statistics\"\nmsgstr \"统计\"\n\n#: templates/pybb/user.html:19\n#, python-format\nmsgid \"Number of topics: %(count)s\"\nmsgstr \"主题数：%(count)s\"\n\n#: templates/pybb/user.html:24\n#, python-format\nmsgid \"Number of posts: %(count)s\"\nmsgstr \"帖子数量：%(count)s\"\n\n#: templates/pybb/user.html:29\n#, python-format\nmsgid \"Date of registration: %(date_joined)s \"\nmsgstr \"注册日期：%(date_joined)s \"\n\n#: templates/pybb/user.html:36\n#, fuzzy\n#| msgid \"Moderators\"\nmsgid \"Moderator\"\nmsgstr \"板主\"\n\n#: templates/pybb/user.html:41\nmsgid \"Block\"\nmsgstr \"屏蔽\"\n\n#: templates/pybb/user.html:42\nmsgid \"Block and delete all messages\"\nmsgstr \"屏蔽并删除所有消息\"\n\n#: templates/pybb/user.html:46\nmsgid \"Unblock\"\nmsgstr \"取消屏蔽\"\n\n#: templates/pybb/user_posts.html:12 templates/pybb/user_posts.html.py:17\nmsgid \"All posts created by\"\nmsgstr \"创建的帖子\"\n\n#: templates/pybb/user_topics.html:12 templates/pybb/user_topics.html.py:17\nmsgid \"All topics created by\"\nmsgstr \"创建的主题\"\n\n#: templates/pybb/users.html:8 templates/pybb/users.html.py:24\nmsgid \"Users\"\nmsgstr \"用户\"\n\n#: templates/pybb/users.html:12\nmsgid \"Search\"\nmsgstr \"搜索\"\n\n#: templatetags/pybb_tags.py:61\n#, fuzzy, python-format\n#| msgid \"seconds ago\"\nmsgid \"%d second ago\"\nmsgid_plural \"%d seconds ago\"\nmsgstr[0] \"秒前\"\nmsgstr[1] \"秒前\"\n\n#: templatetags/pybb_tags.py:65\n#, fuzzy, python-format\n#| msgid \"minutes ago\"\nmsgid \"%d minute ago\"\nmsgid_plural \"%d minutes ago\"\nmsgstr[0] \"分钟前\"\nmsgstr[1] \"分钟前\"\n\n#: templatetags/pybb_tags.py:75\n#, python-format\nmsgid \"today, %s\"\nmsgstr \"今天，%s\"\n\n#: templatetags/pybb_tags.py:77\n#, python-format\nmsgid \"yesterday, %s\"\nmsgstr \"昨天，%s\"\n\n#: util.py:140\nmsgid \"Can't get profile for anonymous user\"\nmsgstr \"匿名用户没有个人资料\"\n\n#: views.py:156\n#, fuzzy\n#| msgid \"Forum categories are not created\"\nmsgid \"Forum does not exist\"\nmsgstr \"没有创建讨论区目录\"\n\n#: views.py:388\nmsgid \"This topic does not exists\"\nmsgstr \"\"\n\n#: views.py:826\nmsgid \"\"\n\"Subscription removed. You will not receive emails from this topic unless you \"\n\"subscribe or post again.\"\nmsgstr \"\"\n\n#: views.py:837\nmsgid \"\"\n\"Subscription added. You will receive email notifications for replies to this \"\n\"topic.\"\nmsgstr \"\"\n\n#: views.py:855\nmsgid \"All forums marked as read\"\nmsgstr \"所有讨论区都已标记为已读\"\n\n#: views.py:888\nmsgid \"User successfuly blocked\"\nmsgstr \"成功屏蔽了用户\"\n\n#: views.py:901\nmsgid \"User successfuly unblocked\"\nmsgstr \"成功对用户取消屏蔽\"\n\n#: views.py:939\nmsgid \"Privileges updated\"\nmsgstr \"\"\n\n#~ msgid \"Subscribers:\"\n#~ msgstr \"订阅者：\"\n\n#~ msgid \"Rank\"\n#~ msgstr \"等级\"\n"
  },
  {
    "path": "pybb/management/__init__.py",
    "content": ""
  },
  {
    "path": "pybb/management/commands/__init__.py",
    "content": ""
  },
  {
    "path": "pybb/management/commands/dump_topics.py",
    "content": "#!/usr/bin/env python\n# vim:fileencoding=utf-8\n__author__ = 'zeus'\n\nfrom django.core.management.base import BaseCommand\nfrom pybb.models import Topic, Post\nfrom django.core import serializers\n\n\nclass Command(BaseCommand):\n    args = '<topic_id topic_id>'\n    help = 'Dump target topics to json'\n\n    def handle(self, *args, **options):\n        ids = [int(topic_id) for topic_id in args]\n        objects = list(Topic.objects.filter(id__in=ids)) + list(Post.objects.filter(topic_id__in=ids))\n        dump = serializers.serialize('json', objects)\n        self.stdout.write(dump)\n"
  },
  {
    "path": "pybb/management/commands/migrate_profile.py",
    "content": "#!/usr/bin/env python\n# vim:fileencoding=utf-8\n\n__author__ = 'zeus'\n\nfrom django.core.management.base import BaseCommand\nfrom django.contrib.auth.models import User\n\nfrom django.contrib.contenttypes.models import ContentType\nfrom django.conf import settings\n\nclass Command(BaseCommand):\n    args = ''\n    help = 'Migrate pybb profiles to local site profile'\n\n    def handle(self, *args, **options):\n        profile_app, profile_model = settings.AUTH_PROFILE_MODULE.split('.')\n        profile_model = ContentType.objects.get(app_label=profile_app, model=profile_model).model_class()\n        for user in User.objects.all():\n            #print(u'migrating profile for %s\\n' % user.username)\n            pybb_profile = user.pybb_profile\n            try:\n                profile = user.get_profile()\n            except profile_model.DoesNotExist:\n                profile = profile_model(user=user)\n            profile.avatar = pybb_profile.avatar\n            profile.signature = pybb_profile.signature\n            profile.signature_html = pybb_profile.signature_html\n            profile.time_zone = pybb_profile.time_zone\n            profile.language = pybb_profile.language\n            profile.show_signatures = pybb_profile.show_signatures\n            profile.markup = pybb_profile.markup\n            profile.post_count = pybb_profile.post_count\n            profile.avatar = pybb_profile.avatar\n            profile.save()\n        self.stdout.write('All profiles successfuly migrated')\n"
  },
  {
    "path": "pybb/management/commands/pybb_delete_invalid_topics.py",
    "content": "from django.utils.timezone import now, timedelta\nfrom django.core.management.base import BaseCommand, CommandError\nfrom django.db.models import Count\n\nfrom pybb.models import Topic\n\nclass Command(BaseCommand):\n    help = 'Resave all posts.'\n\n    def handle(self, *args, **kwargs):\n        check_time = now() - timedelta(seconds=10)\n        topics = Topic.objects.filter(created__lt=check_time)\\\n                      .annotate(counter=Count('posts'))\\\n                      .filter(counter=0)\n\n        count = topics.count()\n        print('Found %d invalid topics' % count)\n        if count:\n            answer = input('Are you sure you want delete them? [y/n]:')\n            if answer.lower() == 'y':\n                print('Deleting topics')\n                topics.delete()\n                print('Deletion completed')\n            else:\n                print('Aborting')\n"
  },
  {
    "path": "pybb/management/commands/pybb_update_counters.py",
    "content": "#!/usr/bin/env python\n# vim:fileencoding=utf-8\n\n__author__ = 'zeus'\n\nfrom django.core.management.base import BaseCommand, CommandError\nfrom pybb.models import Topic, Forum\n\nclass Command(BaseCommand):\n    help = 'Recalc post counters for forums and topics'\n\n    def handle(self, *args, **options):\n\n        for topic in Topic.objects.all():\n            topic.update_counters()\n            self.stdout.write('Successfully updated topic \"%s\"\\n' % topic)\n\n        for forum in Forum.objects.all():\n            forum.update_counters()\n            self.stdout.write('Successfully updated forum \"%s\"\\n' % forum)\n"
  },
  {
    "path": "pybb/management/commands/supermoderator.py",
    "content": "\nfrom django.core.management.base import BaseCommand, CommandError\nfrom pybb import compat\n\nfrom pybb.models import Forum\n\n\nclass Command(BaseCommand):\n    help = 'Set and remove moderator to all forums'\n    args = '{add|del} username'\n\n    def handle(self, *args, **kwargs):\n        if len(args) != 2:\n            raise CommandError(\"Enter action {add|del} and username\")\n        action, username = args\n        assert action in ('add', 'del')\n        user = compat.get_user_model().objects.get(**{compat.get_username_field(): username})\n        forums = Forum.objects.all()\n        for forum in forums:\n            forum.moderators.remove(user)\n            if action == 'add':\n                forum.moderators.add(user)\n"
  },
  {
    "path": "pybb/markup/__init__.py",
    "content": ""
  },
  {
    "path": "pybb/markup/base.py",
    "content": "\nimport re\nfrom django.conf import settings\nfrom django.utils.html import escape\nfrom pybb.defaults import PYBB_SMILES, PYBB_SMILES_PREFIX\nfrom django.forms import Textarea\n\n\ndef smile_it(s):\n    for smile, url in PYBB_SMILES.items():\n        s = s.replace(smile, '<img src=\"%s%s%s\" alt=\"smile\" />' % (settings.STATIC_URL, PYBB_SMILES_PREFIX, url))\n    return s\n\n\ndef filter_blanks(user, str):\n    \"\"\"\n    Replace more than 3 blank lines with only 1 blank line\n    \"\"\"\n    return re.sub(r'\\n{2}\\n+', '\\n', str)\n\n\ndef rstrip_str(user, str):\n    \"\"\"\n    Replace strings with spaces (tabs, etc..) only with newlines\n    Remove blank line at the end\n    \"\"\"\n    return '\\n'.join([s.rstrip() for s in str.splitlines()])\n\n\nclass BaseParser(object):\n    widget_class = Textarea\n\n    def format_attachments(self, text, attachments):\n        \"\"\"\n        Replaces attachment's references ([file-\\d+]) inside a text with their related (web) URL\n\n        :param text: text which contains attachment's references\n        :type text: str or unicode\n        :param attachments: related attached files\n        :type attachments: Quersyset from a model with a \"file\" attribute.\n        :returns: str or unicode with [file-\\d+] replaced by related file's (web) URL\n        \"\"\"\n\n        refs = re.findall( '\\[file-([1-9][0-9]*)\\]', text)\n        if not refs:\n            return text\n        refs = sorted(set(refs))\n\n        max_ref = attachments.count()\n        if not max_ref:\n            return text\n        refs = [int(ref) for ref in refs if int(ref) <= max_ref]\n        attachments = [a for a  in attachments.order_by('pk')[0:max(refs)]]\n        for ref in refs:\n            text = text.replace('[file-%d]' % ref, attachments[ref-1].file.url)\n\n        return text\n\n    def format(self, text, instance=None):\n        if instance and instance.pk:\n            text = self.format_attachments(text, attachments=instance.attachments.all())\n        return escape(text)\n\n    def quote(self, text, username=''):\n        return text\n\n    @classmethod\n    def get_widget_cls(cls, **kwargs):\n        \"\"\"\n        Returns the form widget class to use with this parser\n        It allows you to define your own widget with custom class Media to add your\n        javascript and CSS and/or define your custom \"render\" function\n        which will allow you to add specific markup or javascript.\n        \"\"\"\n        return cls.widget_class\n"
  },
  {
    "path": "pybb/markup/bbcode.py",
    "content": "from __future__ import unicode_literals, absolute_import\n\nfrom bbcode import Parser\nfrom django.forms import Textarea\nfrom django.template import Context\nfrom django.template.loader import get_template\nfrom pybb.markup.base import smile_it, BaseParser\n\n\nclass BBCodeWidget(Textarea):\n    class Media:\n        css = {\n            'all': (\n                'markitup/skins/simple/style.css',\n                'markitup/sets/bbcode/style.css',\n            ),\n        }\n        js = (\n            'markitup/ajax_csrf.js',\n            'markitup/jquery.markitup.js',\n            'markitup/sets/bbcode/set.js',\n            'pybb/js/markitup.js',\n        )\n\n    def render(self, *args, **kwargs):\n        tpl = get_template('pybb/markup/bbcode_widget.html')\n        ctx = {'widget_output': super(BBCodeWidget, self).render(*args, **kwargs)}\n        return tpl.render(ctx)\n\n\nclass BBCodeParser(BaseParser):\n    widget_class = BBCodeWidget\n\n    def __init__(self):\n        self._parser = Parser()\n        self._parser.add_simple_formatter('img', '<img src=\"%(value)s\">', replace_links=False)\n        self._parser.add_simple_formatter('code', '<pre><code>%(value)s</code></pre>',\n                                          render_embedded=False, transform_newlines=False,\n                                          swallow_trailing_newline=True, replace_cosmetic=False)\n        self._parser.add_formatter('quote', self._render_quote, strip=True, swallow_trailing_newline=True)\n\n    def _render_quote(self, name, value, options, parent, context):\n        if options and 'quote' in options:\n            origin_author_html = '<em>%s</em><br>' % options['quote']\n        else:\n            origin_author_html = ''\n        return '<blockquote>%s%s</blockquote>' % (origin_author_html, value)\n\n    def format(self, text, instance=None):\n        if instance and instance.pk:\n            text = self.format_attachments(text, attachments=instance.attachments.all())\n        return smile_it(self._parser.format(text))\n\n    def quote(self, text, username=''):\n        return '[quote=\"%s\"]%s[/quote]\\n' % (username, text)\n"
  },
  {
    "path": "pybb/markup/markdown.py",
    "content": "from __future__ import unicode_literals, absolute_import\n\nfrom markdown import Markdown\nfrom django.forms import Textarea\nfrom django.template import Context\nfrom django.template.loader import get_template\nfrom pybb.markup.base import smile_it, BaseParser\n\n\nclass MarkdownWidget(Textarea):\n    class Media:\n        css = {\n            'all': (\n                'markitup/skins/simple/style.css',\n                'markitup/sets/markdown/style.css',\n            ),\n        }\n        js = (\n            'markitup/ajax_csrf.js',\n            'markitup/jquery.markitup.js',\n            'markitup/sets/markdown/set.js',\n            'pybb/js/markitup.js',\n        )\n\n    def render(self, *args, **kwargs):\n        tpl = get_template('pybb/markup/markdown_widget.html')\n        ctx = {'widget_output': super(MarkdownWidget, self).render(*args, **kwargs)}\n        return tpl.render(ctx)\n\n\nclass MarkdownParser(BaseParser):\n    widget_class = MarkdownWidget\n\n    def __init__(self):\n        self._parser = Markdown(safe_mode='escape')\n\n    def format(self, text, instance=None):\n        if instance and instance.pk:\n            text = self.format_attachments(text, attachments=instance.attachments.all())\n        return smile_it(self._parser.convert(text))\n\n    def quote(self, text, username=''):\n        return '>' + text.replace('\\n', '\\n>').replace('\\r', '\\n>') + '\\n'\n"
  },
  {
    "path": "pybb/middleware.py",
    "content": "\n\nimport django\nfrom django.utils import translation\nfrom django.db.models import ObjectDoesNotExist\nfrom pybb import util\n\nif django.VERSION < (1, 10):  # pragma: no cover\n    MiddlewareParentClass = object\nelse:  # pragma: no cover\n    from django.utils.deprecation import MiddlewareMixin\n    MiddlewareParentClass = MiddlewareMixin\n\n\nclass PybbMiddleware(MiddlewareParentClass):\n    def process_request(self, request):\n        if request.user.is_authenticated:\n            try:\n                # Here we try to load profile, but can get error\n                # if user created during syncdb but profile model\n                # under south control. (Like pybb.Profile).\n                profile = util.get_pybb_profile(request.user)\n            except ObjectDoesNotExist:\n                # Ok, we should create new profile for this user\n                # and grant permissions for add posts\n                # It should be caused rarely, so we move import signal here\n                # to prevent circular import\n                from pybb.signals import user_saved\n                user_saved(request.user, created=True)\n                profile = util.get_pybb_profile(request.user)\n\n            if not profile.language:\n                profile.language = translation.get_language_from_request(request)\n                profile.save()\n\n            request.session['django_language'] = profile.language\n            translation.activate(profile.language)\n            request.LANGUAGE_CODE = translation.get_language()\n"
  },
  {
    "path": "pybb/migrations/0001_initial.py",
    "content": "\nfrom django.db import models, migrations\nfrom django.conf import settings\nfrom pybb.compat import get_image_field_class\nimport pybb.util\nimport annoying.fields\n\n\nclass Migration(migrations.Migration):\n\n    dependencies = [\n        migrations.swappable_dependency(settings.AUTH_USER_MODEL),\n    ]\n\n    operations = [\n        migrations.CreateModel(\n            name='Attachment',\n            fields=[\n                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),\n                ('size', models.IntegerField(verbose_name='Size')),\n                ('file', models.FileField(upload_to=pybb.util.FilePathGenerator(to='pybb_upload/attachments'), verbose_name='File')),\n            ],\n            options={\n                'verbose_name': 'Attachment',\n                'verbose_name_plural': 'Attachments',\n            },\n            bases=(models.Model,),\n        ),\n        migrations.CreateModel(\n            name='Category',\n            fields=[\n                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),\n                ('name', models.CharField(max_length=80, verbose_name='Name')),\n                ('position', models.IntegerField(default=0, verbose_name='Position', blank=True)),\n                ('hidden', models.BooleanField(default=False, help_text='If checked, this category will be visible only for staff', verbose_name='Hidden')),\n            ],\n            options={\n                'ordering': ['position'],\n                'verbose_name': 'Category',\n                'verbose_name_plural': 'Categories',\n            },\n            bases=(models.Model,),\n        ),\n        migrations.CreateModel(\n            name='Forum',\n            fields=[\n                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),\n                ('name', models.CharField(max_length=80, verbose_name='Name')),\n                ('position', models.IntegerField(default=0, verbose_name='Position', blank=True)),\n                ('description', models.TextField(verbose_name='Description', blank=True)),\n                ('updated', models.DateTimeField(null=True, verbose_name='Updated', blank=True)),\n                ('post_count', models.IntegerField(default=0, verbose_name='Post count', blank=True)),\n                ('topic_count', models.IntegerField(default=0, verbose_name='Topic count', blank=True)),\n                ('hidden', models.BooleanField(default=False, verbose_name='Hidden')),\n                ('headline', models.TextField(null=True, verbose_name='Headline', blank=True)),\n                ('category', models.ForeignKey(related_name='forums', on_delete=models.CASCADE, verbose_name='Category', to='pybb.Category')),\n                ('moderators', models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='Moderators', blank=True)),\n                ('parent', models.ForeignKey(related_name='child_forums', on_delete=models.CASCADE, verbose_name='Parent forum', blank=True, to='pybb.Forum', null=True)),\n            ],\n            options={\n                'ordering': ['position'],\n                'verbose_name': 'Forum',\n                'verbose_name_plural': 'Forums',\n            },\n            bases=(models.Model,),\n        ),\n        migrations.CreateModel(\n            name='ForumReadTracker',\n            fields=[\n                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),\n                ('time_stamp', models.DateTimeField(auto_now=True)),\n                ('forum', models.ForeignKey(blank=True, on_delete=models.CASCADE, to='pybb.Forum', null=True)),\n                ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),\n            ],\n            options={\n                'verbose_name': 'Forum read tracker',\n                'verbose_name_plural': 'Forum read trackers',\n            },\n            bases=(models.Model,),\n        ),\n        migrations.CreateModel(\n            name='PollAnswer',\n            fields=[\n                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),\n                ('text', models.CharField(max_length=255, verbose_name='Text')),\n            ],\n            options={\n                'verbose_name': 'Poll answer',\n                'verbose_name_plural': 'Polls answers',\n            },\n            bases=(models.Model,),\n        ),\n        migrations.CreateModel(\n            name='PollAnswerUser',\n            fields=[\n                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),\n                ('timestamp', models.DateTimeField(auto_now_add=True)),\n                ('poll_answer', models.ForeignKey(related_name='users', on_delete=models.CASCADE, verbose_name='Poll answer', to='pybb.PollAnswer')),\n                ('user', models.ForeignKey(related_name='poll_answers', on_delete=models.CASCADE, verbose_name='User', to=settings.AUTH_USER_MODEL)),\n            ],\n            options={\n                'verbose_name': 'Poll answer user',\n                'verbose_name_plural': 'Polls answers users',\n            },\n            bases=(models.Model,),\n        ),\n        migrations.CreateModel(\n            name='Post',\n            fields=[\n                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),\n                ('body', models.TextField(verbose_name='Message')),\n                ('body_html', models.TextField(verbose_name='HTML version')),\n                ('body_text', models.TextField(verbose_name='Text version')),\n                ('created', models.DateTimeField(db_index=True, verbose_name='Created', blank=True)),\n                ('updated', models.DateTimeField(null=True, verbose_name='Updated', blank=True)),\n                ('user_ip', models.IPAddressField(default='0.0.0.0', verbose_name='User IP', blank=True)),\n                ('on_moderation', models.BooleanField(default=False, verbose_name='On moderation')),\n            ],\n            options={\n                'ordering': ['created'],\n                'verbose_name': 'Post',\n                'verbose_name_plural': 'Posts',\n            },\n            bases=(models.Model,),\n        ),\n        migrations.CreateModel(\n            name='Profile',\n            fields=[\n                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),\n                ('signature', models.TextField(max_length=1024, verbose_name='Signature', blank=True)),\n                ('signature_html', models.TextField(max_length=1054, verbose_name='Signature HTML Version', blank=True)),\n                ('time_zone', models.FloatField(default=3.0, verbose_name='Time zone', choices=[(-12.0, b'-12'), (-11.0, b'-11'), (-10.0, b'-10'), (-9.5, b'-09.5'), (-9.0, b'-09'), (-8.5, b'-08.5'), (-8.0, b'-08 PST'), (-7.0, b'-07 MST'), (-6.0, b'-06 CST'), (-5.0, b'-05 EST'), (-4.0, b'-04 AST'), (-3.5, b'-03.5'), (-3.0, b'-03 ADT'), (-2.0, b'-02'), (-1.0, b'-01'), (0.0, b'00 GMT'), (1.0, b'+01 CET'), (2.0, b'+02'), (3.0, b'+03'), (3.5, b'+03.5'), (4.0, b'+04'), (4.5, b'+04.5'), (5.0, b'+05'), (5.5, b'+05.5'), (6.0, b'+06'), (6.5, b'+06.5'), (7.0, b'+07'), (8.0, b'+08'), (9.0, b'+09'), (9.5, b'+09.5'), (10.0, b'+10'), (10.5, b'+10.5'), (11.0, b'+11'), (11.5, b'+11.5'), (12.0, b'+12'), (13.0, b'+13'), (14.0, b'+14')])),\n                ('language', models.CharField(default='en', max_length=10, verbose_name='Language', blank=True, choices=[(b'af', b'Afrikaans'), (b'ar', b'Arabic'), (b'ast', b'Asturian'), (b'az', b'Azerbaijani'), (b'bg', b'Bulgarian'), (b'be', b'Belarusian'), (b'bn', b'Bengali'), (b'br', b'Breton'), (b'bs', b'Bosnian'), (b'ca', b'Catalan'), (b'cs', b'Czech'), (b'cy', b'Welsh'), (b'da', b'Danish'), (b'de', b'German'), (b'el', b'Greek'), (b'en', b'English'), (b'en-au', b'Australian English'), (b'en-gb', b'British English'), (b'eo', b'Esperanto'), (b'es', b'Spanish'), (b'es-ar', b'Argentinian Spanish'), (b'es-mx', b'Mexican Spanish'), (b'es-ni', b'Nicaraguan Spanish'), (b'es-ve', b'Venezuelan Spanish'), (b'et', b'Estonian'), (b'eu', b'Basque'), (b'fa', b'Persian'), (b'fi', b'Finnish'), (b'fr', b'French'), (b'fy', b'Frisian'), (b'ga', b'Irish'), (b'gl', b'Galician'), (b'he', b'Hebrew'), (b'hi', b'Hindi'), (b'hr', b'Croatian'), (b'hu', b'Hungarian'), (b'ia', b'Interlingua'), (b'id', b'Indonesian'), (b'io', b'Ido'), (b'is', b'Icelandic'), (b'it', b'Italian'), (b'ja', b'Japanese'), (b'ka', b'Georgian'), (b'kk', b'Kazakh'), (b'km', b'Khmer'), (b'kn', b'Kannada'), (b'ko', b'Korean'), (b'lb', b'Luxembourgish'), (b'lt', b'Lithuanian'), (b'lv', b'Latvian'), (b'mk', b'Macedonian'), (b'ml', b'Malayalam'), (b'mn', b'Mongolian'), (b'mr', b'Marathi'), (b'my', b'Burmese'), (b'nb', b'Norwegian Bokmal'), (b'ne', b'Nepali'), (b'nl', b'Dutch'), (b'nn', b'Norwegian Nynorsk'), (b'os', b'Ossetic'), (b'pa', b'Punjabi'), (b'pl', b'Polish'), (b'pt', b'Portuguese'), (b'pt-br', b'Brazilian Portuguese'), (b'ro', b'Romanian'), (b'ru', b'Russian'), (b'sk', b'Slovak'), (b'sl', b'Slovenian'), (b'sq', b'Albanian'), (b'sr', b'Serbian'), (b'sr-latn', b'Serbian Latin'), (b'sv', b'Swedish'), (b'sw', b'Swahili'), (b'ta', b'Tamil'), (b'te', b'Telugu'), (b'th', b'Thai'), (b'tr', b'Turkish'), (b'tt', b'Tatar'), (b'udm', b'Udmurt'), (b'uk', b'Ukrainian'), (b'ur', b'Urdu'), (b'vi', b'Vietnamese'), (b'zh-cn', b'Simplified Chinese'), (b'zh-hans', b'Simplified Chinese'), (b'zh-hant', b'Traditional Chinese'), (b'zh-tw', b'Traditional Chinese')])),\n                ('show_signatures', models.BooleanField(default=True, verbose_name='Show signatures')),\n                ('post_count', models.IntegerField(default=0, verbose_name='Post count', blank=True)),\n                ('avatar', get_image_field_class()(upload_to=pybb.util.FilePathGenerator(to=b'pybb/avatar'), null=True, verbose_name='Avatar', blank=True)),\n                ('autosubscribe', models.BooleanField(default=True, help_text='Automatically subscribe to topics that you answer', verbose_name='Automatically subscribe')),\n                ('user', annoying.fields.AutoOneToOneField(related_name='pybb_profile', on_delete=models.CASCADE, verbose_name='User', to=settings.AUTH_USER_MODEL)),\n            ],\n            options={\n                'verbose_name': 'Profile',\n                'verbose_name_plural': 'Profiles',\n            },\n            bases=(models.Model,),\n        ),\n        migrations.CreateModel(\n            name='Topic',\n            fields=[\n                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),\n                ('name', models.CharField(max_length=255, verbose_name='Subject')),\n                ('created', models.DateTimeField(null=True, verbose_name='Created')),\n                ('updated', models.DateTimeField(null=True, verbose_name='Updated')),\n                ('views', models.IntegerField(default=0, verbose_name='Views count', blank=True)),\n                ('sticky', models.BooleanField(default=False, verbose_name='Sticky')),\n                ('closed', models.BooleanField(default=False, verbose_name='Closed')),\n                ('post_count', models.IntegerField(default=0, verbose_name='Post count', blank=True)),\n                ('on_moderation', models.BooleanField(default=False, verbose_name='On moderation')),\n                ('poll_type', models.IntegerField(default=0, verbose_name='Poll type', choices=[(0, 'None'), (1, 'Single answer'), (2, 'Multiple answers')])),\n                ('poll_question', models.TextField(null=True, verbose_name='Poll question', blank=True)),\n                ('forum', models.ForeignKey(related_name='topics', on_delete=models.CASCADE, verbose_name='Forum', to='pybb.Forum')),\n            ],\n            options={\n                'ordering': ['-created'],\n                'verbose_name': 'Topic',\n                'verbose_name_plural': 'Topics',\n            },\n            bases=(models.Model,),\n        ),\n        migrations.CreateModel(\n            name='TopicReadTracker',\n            fields=[\n                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),\n                ('time_stamp', models.DateTimeField(auto_now=True)),\n                ('topic', models.ForeignKey(blank=True, on_delete=models.CASCADE, to='pybb.Topic', null=True)),\n                ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),\n            ],\n            options={\n                'verbose_name': 'Topic read tracker',\n                'verbose_name_plural': 'Topic read trackers',\n            },\n            bases=(models.Model,),\n        ),\n        migrations.AlterUniqueTogether(\n            name='topicreadtracker',\n            unique_together=set([('user', 'topic')]),\n        ),\n        migrations.AddField(\n            model_name='topic',\n            name='readed_by',\n            field=models.ManyToManyField(related_name='readed_topics', through='pybb.TopicReadTracker', to=settings.AUTH_USER_MODEL),\n            preserve_default=True,\n        ),\n        migrations.AddField(\n            model_name='topic',\n            name='subscribers',\n            field=models.ManyToManyField(related_name='subscriptions', verbose_name='Subscribers', to=settings.AUTH_USER_MODEL, blank=True),\n            preserve_default=True,\n        ),\n        migrations.AddField(\n            model_name='topic',\n            name='user',\n            field=models.ForeignKey(verbose_name='User', on_delete=models.CASCADE, to=settings.AUTH_USER_MODEL),\n            preserve_default=True,\n        ),\n        migrations.AddField(\n            model_name='post',\n            name='topic',\n            field=models.ForeignKey(related_name='posts', on_delete=models.CASCADE, verbose_name='Topic', to='pybb.Topic'),\n            preserve_default=True,\n        ),\n        migrations.AddField(\n            model_name='post',\n            name='user',\n            field=models.ForeignKey(related_name='posts', on_delete=models.CASCADE, verbose_name='User', to=settings.AUTH_USER_MODEL),\n            preserve_default=True,\n        ),\n        migrations.AlterUniqueTogether(\n            name='pollansweruser',\n            unique_together=set([('poll_answer', 'user')]),\n        ),\n        migrations.AddField(\n            model_name='pollanswer',\n            name='topic',\n            field=models.ForeignKey(related_name='poll_answers', on_delete=models.CASCADE, verbose_name='Topic', to='pybb.Topic'),\n            preserve_default=True,\n        ),\n        migrations.AlterUniqueTogether(\n            name='forumreadtracker',\n            unique_together=set([('user', 'forum')]),\n        ),\n        migrations.AddField(\n            model_name='forum',\n            name='readed_by',\n            field=models.ManyToManyField(related_name='readed_forums', through='pybb.ForumReadTracker', to=settings.AUTH_USER_MODEL),\n            preserve_default=True,\n        ),\n        migrations.AddField(\n            model_name='attachment',\n            name='post',\n            field=models.ForeignKey(related_name='attachments', on_delete=models.CASCADE, verbose_name='Post', to='pybb.Post'),\n            preserve_default=True,\n        ),\n    ]\n"
  },
  {
    "path": "pybb/migrations/0002_slugs_optional.py",
    "content": "\nfrom django.db import models, migrations\n\n\nclass Migration(migrations.Migration):\n\n    dependencies = [\n        ('pybb', '0001_initial'),\n    ]\n\n    operations = [\n        migrations.AddField(\n            model_name='category',\n            name='slug',\n            field=models.SlugField(max_length=255, verbose_name='Slug', blank=True),\n        ),\n        migrations.AddField(\n            model_name='forum',\n            name='slug',\n            field=models.SlugField(max_length=255, verbose_name='Slug', blank=True),\n        ),\n        migrations.AddField(\n            model_name='topic',\n            name='slug',\n            field=models.SlugField(max_length=255, verbose_name='Slug', blank=True),\n        ),\n    ]\n"
  },
  {
    "path": "pybb/migrations/0003_slugs_fill.py",
    "content": "\nfrom django.db import models, migrations\nfrom pybb.models import create_or_check_slug\n\n\ndef fill_slugs(apps, schema_editor):\n    Category = apps.get_model(\"pybb\", \"Category\")\n    Forum = apps.get_model(\"pybb\", \"Forum\")\n    Topic = apps.get_model(\"pybb\", \"Topic\")\n    for category in Category.objects.all():\n        category.slug = create_or_check_slug(instance=category, model=Category)\n        category.save()\n\n    for forum in Forum.objects.all():\n        extra_filters = {'category': forum.category}\n        forum.slug = create_or_check_slug(instance=forum, model=Forum, **extra_filters)\n        forum.save()\n\n    for topic in Topic.objects.all():\n        extra_filters = {'forum': topic.forum}\n        topic.slug = create_or_check_slug(instance=topic, model=Topic, **extra_filters)\n        topic.save()\n\n\ndef clear_slugs(apps, schema_editor):\n    Category = apps.get_model(\"pybb\", \"Category\")\n    Forum = apps.get_model(\"pybb\", \"Forum\")\n    Topic = apps.get_model(\"pybb\", \"Topic\")\n\n    Category.objects.all().update(slug='')\n    Forum.objects.all().update(slug='')\n    Topic.objects.all().update(slug='')\n\n\nclass Migration(migrations.Migration):\n\n    dependencies = [\n        ('pybb', '0002_slugs_optional'),\n    ]\n\n    operations = [\n        migrations.RunPython(fill_slugs, clear_slugs),\n    ]\n"
  },
  {
    "path": "pybb/migrations/0004_slugs_required.py",
    "content": "\nfrom django.db import models, migrations\n\n\nclass Migration(migrations.Migration):\n\n    dependencies = [\n        ('pybb', '0003_slugs_fill'),\n    ]\n\n    operations = [\n        migrations.AlterField(\n            model_name='category',\n            name='slug',\n            field=models.SlugField(unique=True, max_length=255, verbose_name='Slug'),\n        ),\n        migrations.AlterField(\n            model_name='forum',\n            name='slug',\n            field=models.SlugField(max_length=255, verbose_name='Slug'),\n        ),\n        migrations.AlterField(\n            model_name='topic',\n            name='slug',\n            field=models.SlugField(max_length=255, verbose_name='Slug'),\n        ),\n        migrations.AlterUniqueTogether(\n            name='forum',\n            unique_together=set([('category', 'slug')]),\n        ),\n        migrations.AlterUniqueTogether(\n            name='topic',\n            unique_together=set([('forum', 'slug')]),\n        ),\n    ]\n"
  },
  {
    "path": "pybb/migrations/0005_auto_20151108_1528.py",
    "content": "# Generated by Django 1.9b1 on 2015-11-08 23:28\n\nfrom django.conf import settings\nfrom django.db import migrations, models\nfrom django.utils.translation.trans_real import get_supported_language_variant\n\nimport pybb.util\nfrom pybb.compat import get_image_field_class\n\n\nclass Migration(migrations.Migration):\n\n    dependencies = [\n        ('pybb', '0004_slugs_required'),\n    ]\n\n    operations = [\n        migrations.AlterField(\n            model_name='post',\n            name='user_ip',\n            field=models.GenericIPAddressField(blank=True, default='0.0.0.0', null=True, verbose_name='User IP'),\n        ),\n        migrations.AlterField(\n            model_name='profile',\n            name='avatar',\n            field=get_image_field_class()(blank=True, null=True, upload_to=pybb.util.FilePathGenerator(to='pybb/avatar'), verbose_name='Avatar'),\n        ),\n        migrations.AlterField(\n            model_name='profile',\n            name='language',\n            field=models.CharField(blank=True, choices=settings.LANGUAGES, default=get_supported_language_variant(settings.LANGUAGE_CODE, strict=True), max_length=10, verbose_name='Language'),\n        ),\n        migrations.AlterField(\n            model_name='profile',\n            name='time_zone',\n            field=models.FloatField(choices=[(-12.0, '-12'), (-11.0, '-11'), (-10.0, '-10'), (-9.5, '-09.5'), (-9.0, '-09'), (-8.5, '-08.5'), (-8.0, '-08 PST'), (-7.0, '-07 MST'), (-6.0, '-06 CST'), (-5.0, '-05 EST'), (-4.0, '-04 AST'), (-3.5, '-03.5'), (-3.0, '-03 ADT'), (-2.0, '-02'), (-1.0, '-01'), (0.0, '00 GMT'), (1.0, '+01 CET'), (2.0, '+02'), (3.0, '+03'), (3.5, '+03.5'), (4.0, '+04'), (4.5, '+04.5'), (5.0, '+05'), (5.5, '+05.5'), (6.0, '+06'), (6.5, '+06.5'), (7.0, '+07'), (8.0, '+08'), (9.0, '+09'), (9.5, '+09.5'), (10.0, '+10'), (10.5, '+10.5'), (11.0, '+11'), (11.5, '+11.5'), (12.0, '+12'), (13.0, '+13'), (14.0, '+14')], default=3.0, verbose_name='Time zone'),\n        ),\n    ]\n"
  },
  {
    "path": "pybb/migrations/0006_forum_subscriptions.py",
    "content": "\nimport django\nfrom django.db import models, migrations\nfrom django.conf import settings\n\n\nclass Migration(migrations.Migration):\n\n    dependencies = [\n        ('pybb', '0005_auto_20151108_1528'),\n    ]\n\n    operations = [\n        migrations.CreateModel(\n            name='ForumSubscription',\n            fields=[\n                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),\n                ('type', models.PositiveSmallIntegerField(\n                    help_text='The auto-subscription works like you manually subscribed to watch each topic :\\n'\n                              'you will be notified when a topic will receive an answer. \\n'\n                              'If you choose to be notified only when a new topic is added. It means'\n                              'you will be notified only once when the topic is created : '\n                              'you won\\'t be notified for the answers.',\n                    verbose_name='Subscription type', choices=[(1, 'be notified only when a new topic is added'), (2, 'be auto-subscribed to topics')])),\n                ('forum', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subscriptions+', verbose_name='Forum', to='pybb.Forum')),\n                ('user', models.ForeignKey(related_name='forum_subscriptions+', on_delete=models.CASCADE, verbose_name='Subscriber', to=settings.AUTH_USER_MODEL)),\n            ],\n            options={\n                'verbose_name': 'Subscription to forum',\n                'verbose_name_plural': 'Subscriptions to forums',\n            },\n            bases=(models.Model,),\n        ),\n        migrations.AlterUniqueTogether(\n            name='forumsubscription',\n            unique_together=set([('user', 'forum')]),\n        ),\n    ]\n"
  },
  {
    "path": "pybb/migrations/0007_auto_20170111_1504.py",
    "content": "\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n\n    dependencies = [\n        ('pybb', '0006_forum_subscriptions'),\n    ]\n\n    operations = [\n        migrations.AlterField(\n            model_name='post',\n            name='updated',\n            field=models.DateTimeField(db_index=True, null=True, verbose_name='Updated', blank=True),\n        ),\n        migrations.AlterField(\n            model_name='topic',\n            name='created',\n            field=models.DateTimeField(null=True, verbose_name='Created', db_index=True),\n        ),\n        migrations.AlterField(\n            model_name='topic',\n            name='updated',\n            field=models.DateTimeField(null=True, verbose_name='Updated', db_index=True),\n        ),\n    ]\n"
  },
  {
    "path": "pybb/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "pybb/models.py",
    "content": "\nfrom django.core.exceptions import ValidationError\nfrom django.urls import reverse\nfrom django.db import models, transaction, DatabaseError\nfrom django.utils.functional import cached_property\nfrom django.utils.html import strip_tags\nfrom django.utils.translation import gettext_lazy as _\nfrom django.utils.timezone import now as tznow\n\nfrom pybb.compat import get_user_model_path, get_username_field, get_atomic_func, slugify\nfrom pybb import defaults\nfrom pybb.profiles import PybbProfile\nfrom pybb.util import unescape, FilePathGenerator, _get_markup_formatter\n\nfrom annoying.fields import AutoOneToOneField\n\n\nclass Category(models.Model):\n    name = models.CharField(_('Name'), max_length=80)\n    position = models.IntegerField(_('Position'), blank=True, default=0)\n    hidden = models.BooleanField(_('Hidden'), default=False,\n                                 help_text=_('If checked, this category will be visible only for staff'))\n    slug = models.SlugField(_(\"Slug\"), max_length=255, unique=True)\n\n    class Meta(object):\n        ordering = ['position']\n        verbose_name = _('Category')\n        verbose_name_plural = _('Categories')\n\n    def __str__(self):\n        return self.name\n\n    def forum_count(self):\n        return self.forums.all().count()\n\n    def get_absolute_url(self):\n        if defaults.PYBB_NICE_URL:\n            return reverse('pybb:category', kwargs={'slug': self.slug, })\n        return reverse('pybb:category', kwargs={'pk': self.id})\n\n    @property\n    def topics(self):\n        return Topic.objects.filter(forum__category=self).select_related()\n\n    @property\n    def posts(self):\n        return Post.objects.filter(topic__forum__category=self).select_related()\n\n\nclass Forum(models.Model):\n    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='forums', verbose_name=_('Category'))\n    parent = models.ForeignKey('self', on_delete=models.CASCADE, related_name='child_forums', verbose_name=_('Parent forum'),\n                               blank=True, null=True)\n    name = models.CharField(_('Name'), max_length=80)\n    position = models.IntegerField(_('Position'), blank=True, default=0)\n    description = models.TextField(_('Description'), blank=True)\n    moderators = models.ManyToManyField(get_user_model_path(), blank=True, verbose_name=_('Moderators'))\n    updated = models.DateTimeField(_('Updated'), blank=True, null=True)\n    post_count = models.IntegerField(_('Post count'), blank=True, default=0)\n    topic_count = models.IntegerField(_('Topic count'), blank=True, default=0)\n    hidden = models.BooleanField(_('Hidden'), default=False)\n    readed_by = models.ManyToManyField(get_user_model_path(), through='ForumReadTracker', related_name='readed_forums')\n    headline = models.TextField(_('Headline'), blank=True, null=True)\n    slug = models.SlugField(verbose_name=_(\"Slug\"), max_length=255)\n\n    class Meta(object):\n        ordering = ['position']\n        verbose_name = _('Forum')\n        verbose_name_plural = _('Forums')\n        unique_together = ('category', 'slug')\n\n    def __str__(self):\n        return self.name\n\n    def update_counters(self):\n        self.topic_count = Topic.objects.filter(forum=self).count()\n        if self.topic_count:\n            posts = Post.objects.filter(topic__forum_id=self.id)\n            self.post_count = posts.count()\n            if self.post_count:\n                try:\n                    last_post = posts.order_by('-created', '-id')[0]\n                    self.updated = last_post.updated or last_post.created\n                except IndexError:\n                    pass\n        else:\n            self.post_count = 0\n        self.save()\n\n    def get_absolute_url(self):\n        if defaults.PYBB_NICE_URL:\n            return reverse('pybb:forum', kwargs={'slug': self.slug, 'category_slug': self.category.slug})\n        return reverse('pybb:forum', kwargs={'pk': self.id})\n\n    @property\n    def posts(self):\n        return Post.objects.filter(topic__forum=self).select_related()\n\n    @cached_property\n    def last_post(self):\n        try:\n            return self.posts.order_by('-created', '-id')[0]\n        except IndexError:\n            return None\n\n    def get_parents(self):\n        \"\"\"\n        Used in templates for breadcrumb building\n        \"\"\"\n        parents = [self.category]\n        parent = self.parent\n        while parent is not None:\n            parents.insert(1, parent)\n            parent = parent.parent\n        return parents\n\n\nclass ForumSubscription(models.Model):\n\n    TYPE_NOTIFY = 1\n    TYPE_SUBSCRIBE = 2\n    TYPE_CHOICES = (\n        (TYPE_NOTIFY, _('be notified only when a new topic is added')),\n        (TYPE_SUBSCRIBE, _('be auto-subscribed to topics')),\n    )\n\n    user = models.ForeignKey(get_user_model_path(), on_delete=models.CASCADE,\n        related_name='forum_subscriptions+', verbose_name=_('Subscriber'))\n    forum = models.ForeignKey(Forum, on_delete=models.CASCADE,\n        related_name='subscriptions+', verbose_name=_('Forum'))\n    type = models.PositiveSmallIntegerField(\n        _('Subscription type'), choices=TYPE_CHOICES,\n        help_text=_((\n            'The auto-subscription works like you manually subscribed to watch each topic :\\n'\n            'you will be notified when a topic will receive an answer. \\n'\n            'If you choose to be notified only when a new topic is added. It means'\n            'you will be notified only once when the topic is created : '\n            'you won\\'t be notified for the answers.'\n        )), )\n\n    class Meta(object):\n        verbose_name = _('Subscription to forum')\n        verbose_name_plural = _('Subscriptions to forums')\n        unique_together = ('user', 'forum',)\n\n    def __str__(self):\n        return '%(user)s\\'s subscription to \"%(forum)s\"' % {'user': self.user,\n                                                            'forum': self.forum}\n\n    def save(self, all_topics=False, **kwargs):\n        if all_topics and self.type == self.TYPE_SUBSCRIBE:\n            old = None if not self.pk else ForumSubscription.objects.get(pk=self.pk)\n            if not old or old.type != self.type :\n                topics = Topic.objects.filter(forum=self.forum).exclude(subscribers=self.user)\n                self.user.subscriptions.add(*topics)\n        super(ForumSubscription, self).save(**kwargs)\n\n    def delete(self, all_topics=False, **kwargs):\n        if all_topics:\n            topics = Topic.objects.filter(forum=self.forum, subscribers=self.user)\n            self.user.subscriptions.remove(*topics)\n        super(ForumSubscription, self).delete(**kwargs)\n\nclass Topic(models.Model):\n    POLL_TYPE_NONE = 0\n    POLL_TYPE_SINGLE = 1\n    POLL_TYPE_MULTIPLE = 2\n\n    POLL_TYPE_CHOICES = (\n        (POLL_TYPE_NONE, _('None')),\n        (POLL_TYPE_SINGLE, _('Single answer')),\n        (POLL_TYPE_MULTIPLE, _('Multiple answers')),\n    )\n\n    forum = models.ForeignKey(Forum, on_delete=models.CASCADE, related_name='topics', verbose_name=_('Forum'))\n    name = models.CharField(_('Subject'), max_length=255)\n    created = models.DateTimeField(_('Created'), null=True, db_index=True)\n    updated = models.DateTimeField(_('Updated'), null=True, db_index=True)\n    user = models.ForeignKey(get_user_model_path(), on_delete=models.CASCADE, verbose_name=_('User'))\n    views = models.IntegerField(_('Views count'), blank=True, default=0)\n    sticky = models.BooleanField(_('Sticky'), default=False)\n    closed = models.BooleanField(_('Closed'), default=False)\n    subscribers = models.ManyToManyField(get_user_model_path(), related_name='subscriptions',\n                                         verbose_name=_('Subscribers'), blank=True)\n    post_count = models.IntegerField(_('Post count'), blank=True, default=0)\n    readed_by = models.ManyToManyField(get_user_model_path(), through='TopicReadTracker', related_name='readed_topics')\n    on_moderation = models.BooleanField(_('On moderation'), default=False)\n    poll_type = models.IntegerField(_('Poll type'), choices=POLL_TYPE_CHOICES, default=POLL_TYPE_NONE)\n    poll_question = models.TextField(_('Poll question'), blank=True, null=True)\n    slug = models.SlugField(verbose_name=_(\"Slug\"), max_length=255)\n\n    class Meta(object):\n        ordering = ['-created']\n        verbose_name = _('Topic')\n        verbose_name_plural = _('Topics')\n        unique_together = ('forum', 'slug')\n\n    def __str__(self):\n        return self.name\n\n    @cached_property\n    def head(self):\n        try:\n            return self.posts.all().order_by('created', 'id')[0]\n        except IndexError:\n            return None\n\n    @cached_property\n    def last_post(self):\n        try:\n            return self.posts.order_by('-created', '-id').select_related('user')[0]\n        except IndexError:\n            return None\n\n    def get_absolute_url(self):\n        if defaults.PYBB_NICE_URL:\n            return reverse('pybb:topic', kwargs={'slug': self.slug, 'forum_slug': self.forum.slug, 'category_slug': self.forum.category.slug})\n        return reverse('pybb:topic', kwargs={'pk': self.id})\n\n    def save(self, *args, **kwargs):\n        if self.id is None:\n            self.created = self.updated = tznow()\n\n        forum_changed = False\n        old_topic = None\n        if self.id is not None:\n            old_topic = Topic.objects.get(id=self.id)\n            if self.forum != old_topic.forum:\n                forum_changed = True\n\n        super(Topic, self).save(*args, **kwargs)\n\n        if forum_changed:\n            old_topic.forum.update_counters()\n            self.forum.update_counters()\n\n    def delete(self, using=None):\n        super(Topic, self).delete(using)\n        self.forum.update_counters()\n\n    def update_counters(self):\n        self.post_count = self.posts.count()\n        # force cache overwrite to get the real latest updated post\n        if hasattr(self, 'last_post'):\n            del self.last_post\n        if self.last_post:\n            self.updated = self.last_post.updated or self.last_post.created\n        self.save()\n\n    def get_parents(self):\n        \"\"\"\n        Used in templates for breadcrumb building\n        \"\"\"\n        parents = self.forum.get_parents()\n        parents.append(self.forum)\n        return parents\n\n    def poll_votes(self):\n        if self.poll_type != self.POLL_TYPE_NONE:\n            return PollAnswerUser.objects.filter(poll_answer__topic=self).count()\n        else:\n            return None\n\n\nclass RenderableItem(models.Model):\n    \"\"\"\n    Base class for models that has markup, body, body_text and body_html fields.\n    \"\"\"\n\n    class Meta(object):\n        abstract = True\n\n    body = models.TextField(_('Message'))\n    body_html = models.TextField(_('HTML version'))\n    body_text = models.TextField(_('Text version'))\n\n    def render(self):\n        self.body_html = _get_markup_formatter()(self.body, instance=self)\n        # Remove tags which was generated with the markup processor\n        text = strip_tags(self.body_html)\n        # Unescape entities which was generated with the markup processor\n        self.body_text = unescape(text)\n\n\nclass Post(RenderableItem):\n    topic = models.ForeignKey(Topic, on_delete=models.CASCADE, related_name='posts', verbose_name=_('Topic'))\n    user = models.ForeignKey(get_user_model_path(), on_delete=models.CASCADE, related_name='posts', verbose_name=_('User'))\n    created = models.DateTimeField(_('Created'), blank=True, db_index=True)\n    updated = models.DateTimeField(_('Updated'), blank=True, null=True, db_index=True)\n    user_ip = models.GenericIPAddressField(_('User IP'), blank=True, null=True, default='0.0.0.0')\n    on_moderation = models.BooleanField(_('On moderation'), default=False)\n\n    class Meta(object):\n        ordering = ['created']\n        verbose_name = _('Post')\n        verbose_name_plural = _('Posts')\n\n    def summary(self):\n        limit = 50\n        tail = len(self.body) > limit and '...' or ''\n        return self.body[:limit] + tail\n\n    def __str__(self):\n        return self.summary()\n\n    @cached_property\n    def is_topic_head(self):\n        return self.pk and self.topic.head.pk == self.pk\n\n    def save(self, *args, **kwargs):\n        created_at = tznow()\n        if self.created is None:\n            self.created = created_at\n        self.render()\n\n        new = self.pk is None\n\n        topic_changed = False\n        old_post = None\n        if not new:\n            old_post = Post.objects.get(pk=self.pk)\n            if old_post.topic != self.topic:\n                topic_changed = True\n\n        super(Post, self).save(*args, **kwargs)\n\n        # If post is topic head and moderated, moderate topic too\n        if self.topic.head == self and not self.on_moderation and self.topic.on_moderation:\n            self.topic.on_moderation = False\n\n        self.topic.update_counters()\n        self.topic.forum.update_counters()\n\n        if topic_changed:\n            old_post.topic.update_counters()\n            old_post.topic.forum.update_counters()\n\n    def get_absolute_url(self):\n        return reverse('pybb:post', kwargs={'pk': self.id})\n\n    def delete(self, *args, **kwargs):\n        self_id = self.id\n        head_post_id = self.topic.posts.order_by('created', 'id')[0].id\n\n        if self_id == head_post_id:\n            self.topic.delete()\n        else:\n            super(Post, self).delete(*args, **kwargs)\n            self.topic.update_counters()\n            self.topic.forum.update_counters()\n\n    def get_parents(self):\n        \"\"\"\n        Used in templates for breadcrumb building\n        \"\"\"\n        return self.topic.forum.category, self.topic.forum, self.topic,\n\n\nclass Profile(PybbProfile):\n    \"\"\"\n    Profile class that can be used if you doesn't have\n    your site profile.\n    \"\"\"\n    user = AutoOneToOneField(\n        get_user_model_path(), on_delete=models.CASCADE,\n        related_name='pybb_profile', verbose_name=_('User'))\n\n    class Meta(object):\n        verbose_name = _('Profile')\n        verbose_name_plural = _('Profiles')\n\n    def get_absolute_url(self):\n        return reverse('pybb:user', kwargs={'username': getattr(self.user, get_username_field())})\n\n    def get_display_name(self):\n        return self.user.get_username()\n\n\nclass Attachment(models.Model):\n    class Meta(object):\n        verbose_name = _('Attachment')\n        verbose_name_plural = _('Attachments')\n\n    post = models.ForeignKey(Post, on_delete=models.CASCADE, verbose_name=_('Post'), related_name='attachments')\n    size = models.IntegerField(_('Size'))\n    file = models.FileField(_('File'),\n                            upload_to=FilePathGenerator(to=defaults.PYBB_ATTACHMENT_UPLOAD_TO))\n\n    def save(self, *args, **kwargs):\n        self.size = self.file.size\n        super(Attachment, self).save(*args, **kwargs)\n\n    def size_display(self):\n        size = self.size\n        if size < 1024:\n            return '%db' % size\n        elif size < 1024 * 1024:\n            return '%dKb' % int(size / 1024)\n        else:\n            return '%.2fMb' % (size / float(1024 * 1024))\n\n\nclass TopicReadTrackerManager(models.Manager):\n    def get_or_create_tracker(self, user, topic):\n        \"\"\"\n        Correctly create tracker in mysql db on default REPEATABLE READ transaction mode\n\n        It's known problem when standard get_or_create method return can raise exception\n        with correct data in mysql database.\n        See http://stackoverflow.com/questions/2235318/how-do-i-deal-with-this-race-condition-in-django/2235624\n        \"\"\"\n        is_new = True\n        sid = transaction.savepoint(using=self.db)\n        try:\n            with get_atomic_func()():\n                obj = TopicReadTracker.objects.create(user=user, topic=topic)\n            transaction.savepoint_commit(sid)\n        except DatabaseError:\n            transaction.savepoint_rollback(sid)\n            obj = TopicReadTracker.objects.get(user=user, topic=topic)\n            is_new = False\n        return obj, is_new\n\n\nclass TopicReadTracker(models.Model):\n    \"\"\"\n    Save per user topic read tracking\n    \"\"\"\n    user = models.ForeignKey(get_user_model_path(), on_delete=models.CASCADE, blank=False, null=False)\n    topic = models.ForeignKey(Topic, on_delete=models.CASCADE, blank=True, null=True)\n    time_stamp = models.DateTimeField(auto_now=True)\n\n    objects = TopicReadTrackerManager()\n\n    class Meta(object):\n        verbose_name = _('Topic read tracker')\n        verbose_name_plural = _('Topic read trackers')\n        unique_together = ('user', 'topic')\n\n\nclass ForumReadTrackerManager(models.Manager):\n    def get_or_create_tracker(self, user, forum):\n        \"\"\"\n        Correctly create tracker in mysql db on default REPEATABLE READ transaction mode\n\n        It's known problem when standard get_or_create method return can raise exception\n        with correct data in mysql database.\n        See http://stackoverflow.com/questions/2235318/how-do-i-deal-with-this-race-condition-in-django/2235624\n        \"\"\"\n        is_new = True\n        sid = transaction.savepoint(using=self.db)\n        try:\n            with get_atomic_func()():\n                obj = ForumReadTracker.objects.create(user=user, forum=forum)\n            transaction.savepoint_commit(sid)\n        except DatabaseError:\n            transaction.savepoint_rollback(sid)\n            is_new = False\n            obj = ForumReadTracker.objects.get(user=user, forum=forum)\n        return obj, is_new\n\n\nclass ForumReadTracker(models.Model):\n    \"\"\"\n    Save per user forum read tracking\n    \"\"\"\n    user = models.ForeignKey(get_user_model_path(), on_delete=models.CASCADE, blank=False, null=False)\n    forum = models.ForeignKey(Forum, on_delete=models.CASCADE, blank=True, null=True)\n    time_stamp = models.DateTimeField(auto_now=True)\n\n    objects = ForumReadTrackerManager()\n\n    class Meta(object):\n        verbose_name = _('Forum read tracker')\n        verbose_name_plural = _('Forum read trackers')\n        unique_together = ('user', 'forum')\n\n\nclass PollAnswer(models.Model):\n    topic = models.ForeignKey(Topic, on_delete=models.CASCADE, related_name='poll_answers', verbose_name=_('Topic'))\n    text = models.CharField(max_length=255, verbose_name=_('Text'))\n\n    class Meta:\n        verbose_name = _('Poll answer')\n        verbose_name_plural = _('Polls answers')\n\n    def __str__(self):\n        return self.text\n\n    def votes(self):\n        return self.users.count()\n\n    def votes_percent(self):\n        topic_votes = self.topic.poll_votes()\n        if topic_votes > 0:\n            return 1.0 * self.votes() / topic_votes * 100\n        else:\n            return 0\n\n\nclass PollAnswerUser(models.Model):\n    poll_answer = models.ForeignKey(PollAnswer, on_delete=models.CASCADE, related_name='users', verbose_name=_('Poll answer'))\n    user = models.ForeignKey(get_user_model_path(), on_delete=models.CASCADE, related_name='poll_answers', verbose_name=_('User'))\n    timestamp = models.DateTimeField(auto_now_add=True)\n\n    class Meta:\n        verbose_name = _('Poll answer user')\n        verbose_name_plural = _('Polls answers users')\n        unique_together = (('poll_answer', 'user', ), )\n\n    def __str__(self):\n        return '%s - %s' % (self.poll_answer.topic, self.user)\n\n\ndef create_or_check_slug(instance, model, **extra_filters):\n    \"\"\"\n    returns a unique slug\n\n    :param instance : target instance\n    :param model: needed as instance._meta.model is available since django 1.6\n    :param extra_filters: filters needed for Forum and Topic for their unique_together field\n    \"\"\"\n    initial_slug = instance.slug or slugify(instance.name)\n    count = -1\n    last_count_len = 0\n    slug_is_not_unique = True\n    while slug_is_not_unique:\n        count += 1\n\n        if count >= defaults.PYBB_NICE_URL_SLUG_DUPLICATE_LIMIT:\n            msg = _('After %(limit)s attemps, there is not any unique slug value for \"%(slug)s\"')\n            raise ValidationError(msg % {'limit': defaults.PYBB_NICE_URL_SLUG_DUPLICATE_LIMIT,\n                                         'slug': initial_slug})\n\n        count_len = len(str(count))\n\n        if last_count_len != count_len:\n            last_count_len = count_len\n            filters = {'slug__startswith': initial_slug[:(254-count_len)], }\n            if extra_filters:\n                filters.update(extra_filters)\n            objs = model.objects.filter(**filters).exclude(pk=instance.pk)\n            slug_list = [obj.slug for obj in objs]\n\n        if count == 0:\n            slug = initial_slug\n        else:\n            slug = '%s-%d' % (initial_slug[:(254-count_len)], count)\n        slug_is_not_unique = slug in slug_list\n\n    return slug\n"
  },
  {
    "path": "pybb/permissions.py",
    "content": "\"\"\"\nExtensible permission system for pybbm\n\"\"\"\n\nfrom django.db.models import Q\n\nfrom pybb import defaults, util\n\n\nclass DefaultPermissionHandler(object):\n    \"\"\"\n    Default Permission handler. If you want to implement custom permissions (for example,\n    private forums based on some application-specific settings), you can inherit from this\n    class and override any of the `filter_*` and `may_*` methods. Methods starting with\n    `may` are expected to return `True` or `False`, whereas methods starting with `filter_*`\n    should filter the queryset they receive, and return a new queryset containing only the\n    objects the user is allowed to see.\n\n    To activate your custom permission handler, set `settings.PYBB_PERMISSION_HANDLER` to\n    the full qualified name of your class, e.g. \"`myapp.pybb_adapter.MyPermissionHandler`\".\n    \"\"\"\n    #\n    # permission checks on categories\n    #\n    def filter_categories(self, user, qs):\n        \"\"\" return a queryset with categories `user` is allowed to see \"\"\"\n        if user.is_superuser or user.is_staff:\n            # FIXME: is_staff only allow user to access /admin but does not mean user has extra\n            # permissions on pybb models. We should add pybb perm test\n            return qs\n        return qs.filter(hidden=False)\n\n    def may_view_category(self, user, category):\n        \"\"\" return True if `user` may view this category, False if not \"\"\"\n        if user.is_superuser or user.is_staff:\n            # FIXME: is_staff only allow user to access /admin but does not mean user has extra\n            # permissions on pybb models. We should add pybb perm test\n            return True\n        return not category.hidden\n\n    #\n    # permission checks on forums\n    #\n    def filter_forums(self, user, qs):\n        \"\"\" return a queryset with forums `user` is allowed to see \"\"\"\n        if user.is_superuser or user.is_staff:\n            # FIXME: is_staff only allow user to access /admin but does not mean user has extra\n            # permissions on pybb models. We should add pybb perm test\n            return qs\n        return qs.filter(Q(hidden=False) & Q(category__hidden=False))\n\n    def may_view_forum(self, user, forum):\n        \"\"\" return True if user may view this forum, False if not \"\"\"\n        if user.is_superuser or user.is_staff:\n            # FIXME: is_staff only allow user to access /admin but does not mean user has extra\n            # permissions on pybb models. We should add pybb perm test\n            return True\n        return forum.hidden == False and forum.category.hidden == False\n\n    def may_create_topic(self, user, forum):\n        \"\"\" return True if `user` is allowed to create a new topic in `forum` \"\"\"\n        if user.is_superuser:\n            return True\n        return user.has_perm('pybb.add_post')\n\n    #\n    # permission checks on topics\n    #\n    def filter_topics(self, user, qs):\n        \"\"\" return a queryset with topics `user` is allowed to see \"\"\"\n        if user.is_superuser:\n            return qs\n        if user.has_perm('pybb.change_topic'):\n            # if I can edit, I can view\n            return qs\n        if not user.is_staff:\n            # FIXME: is_staff only allow user to access /admin but does not mean user has extra\n            # permissions on pybb models. We should add pybb perm test\n            qs = qs.filter(Q(forum__hidden=False) & Q(forum__category__hidden=False))\n        if user.is_authenticated:\n            qs = qs.filter(\n                # moderator can view on_moderation\n                Q(forum__moderators=user) |\n                # author can view on_moderation only if there is one post in the topic\n                # (mean that post is owned by author)\n                Q(user=user, post_count=1) |\n                # posts not on_moderation are accessible\n                Q(on_moderation=False)\n            )\n        else:\n            qs = qs.filter(on_moderation=False)\n        return qs.distinct()\n\n    def may_view_topic(self, user, topic):\n        \"\"\" return True if user may view this topic, False otherwise \"\"\"\n        if self.may_moderate_topic(user, topic):\n            # If i can moderate, it means I can view.\n            return True\n        if topic.on_moderation:\n            if not topic.head.on_moderation:\n                # topic is in general moderation waiting (it has been marked as on_moderation\n                # but my post is not on_moderation. So it's a manual action we MUST respect)\n                return False\n            if topic.head.on_moderation and topic.head.user != user:\n                # topic is on moderation because of the first post but this is not my post\n                # User must not access to it, only it's author can do in moderation mode\n                return False\n        # FIXME: is_staff only allow user to access /admin but does not mean user has extra\n        # permissions on pybb models. We should add pybb perm test\n        return user.is_staff or (not topic.forum.hidden and not topic.forum.category.hidden)\n\n    def may_moderate_topic(self, user, topic):\n        if user.is_superuser:\n            return True\n        if not user.is_authenticated:\n            return False\n        return user.has_perm('pybb.change_topic') or user in topic.forum.moderators.all()\n\n    def may_close_topic(self, user, topic):\n        \"\"\" return True if `user` may close `topic` \"\"\"\n        return self.may_moderate_topic(user, topic)\n\n    def may_open_topic(self, user, topic):\n        \"\"\" return True if `user` may open `topic` \"\"\"\n        return self.may_moderate_topic(user, topic)\n\n    def may_stick_topic(self, user, topic):\n        \"\"\" return True if `user` may stick `topic` \"\"\"\n        return self.may_moderate_topic(user, topic)\n\n    def may_unstick_topic(self, user, topic):\n        \"\"\" return True if `user` may unstick `topic` \"\"\"\n        return self.may_moderate_topic(user, topic)\n\n    def may_vote_in_topic(self, user, topic):\n        \"\"\" return True if `user` may unstick `topic` \"\"\"\n        if topic.poll_type == topic.POLL_TYPE_NONE or not user.is_authenticated:\n            return False\n        elif user.is_superuser:\n            return True\n        elif not topic.closed and not user.poll_answers.filter(poll_answer__topic=topic).exists():\n            return True\n        return False\n\n    def may_create_post(self, user, topic):\n        \"\"\" return True if `user` is allowed to create a new post in `topic` \"\"\"\n\n        if user.is_superuser:\n            return True\n        if not defaults.PYBB_ENABLE_ANONYMOUS_POST and not user.is_authenticated:\n            return False\n        if not self.may_view_topic(user, topic):\n            return False\n        if not user.has_perm('pybb.add_post'):\n            return False\n        if topic.closed or topic.on_moderation:\n            return self.may_moderate_topic(user, topic)\n        return True\n\n\n    def may_post_as_admin(self, user):\n        \"\"\" return True if `user` may post as admin \"\"\"\n        if user.is_superuser:\n            return True\n        # FIXME: is_staff only allow user to access /admin but does not mean user has extra\n        # permissions on pybb models. We should add pybb perm test\n        return user.is_staff\n\n    def may_subscribe_topic(self, user, topic):\n        \"\"\" return True if `user` is allowed to subscribe to a `topic` \"\"\"\n        return not defaults.PYBB_DISABLE_SUBSCRIPTIONS and user.is_authenticated\n\n    #\n    # permission checks on posts\n    #\n    def filter_posts(self, user, qs):\n        \"\"\" return a queryset with posts `user` is allowed to see \"\"\"\n\n        # first filter by topic availability\n        if user.is_superuser:\n            return qs\n        if user.has_perm('pybb.change_post'):\n            # If I can edit all posts, I can view all posts\n            return qs\n        if not user.is_staff:\n            # remove hidden forum/cats posts\n            query = Q(topic__forum__hidden=False, topic__forum__category__hidden=False)\n        else:\n            query = Q(pk__isnull=False)\n        if defaults.PYBB_PREMODERATION:\n            # remove moderated posts\n            query = query & Q(on_moderation=False, topic__on_moderation=False)\n        if user.is_authenticated:\n            # cancel previous remove if it's my post, or if I'm moderator of the forum\n            query = query | Q(user=user) | Q(topic__forum__moderators=user)\n        return qs.filter(query).distinct()\n\n    def may_view_post(self, user, post):\n        \"\"\" return True if `user` may view `post`, False otherwise \"\"\"\n        if user.is_superuser:\n            return True\n        if self.may_edit_post(user, post):\n            # if I can edit, I can view\n            return True\n        if defaults.PYBB_PREMODERATION and (post.on_moderation or post.topic.on_moderation):\n            return False\n        # FIXME: is_staff only allow user to access /admin but does not mean user has extra\n        # permissions on pybb models. We should add pybb perm test\n        return user.is_staff or (not post.topic.forum.hidden and\n                                 not post.topic.forum.category.hidden)\n\n    def may_moderate_post(self, user, post):\n        if user.is_superuser:\n            return True\n        return user.has_perm('pybb.change_post') or self.may_moderate_topic(user, post.topic)\n\n    def may_edit_post(self, user, post):\n        \"\"\" return True if `user` may edit `post` \"\"\"\n        if user.is_superuser:\n            return True\n        return post.user == user or self.may_moderate_post(user, post)\n\n    def may_delete_post(self, user, post):\n        \"\"\" return True if `user` may delete `post` \"\"\"\n        if user.is_superuser:\n            return True\n        if not user.is_authenticated:\n            return False\n        return (defaults.PYBB_ALLOW_DELETE_OWN_POST and post.user == user) or \\\n               user.has_perm('pybb.delete_post') or \\\n               user in post.topic.forum.moderators.all()\n        # may_moderate_post does not mean that user is a moderator: a user who is not a moderator\n        # may_moderate_post if he has change_post perms. For this reason, we need to check\n        # if user is really a post's topic moderator.\n\n\n    def may_admin_post(self, user, post):\n        \"\"\" return True if `user` may use the admin interface to administrate the `post` \"\"\"\n        if user.is_superuser:\n            return True\n        return user.is_staff and user.has_perm('pybb.change_post')\n\n    #\n    # permission checks on users\n    #\n    def may_block_user(self, user, user_to_block):\n        \"\"\" return True if `user` may block `user_to_block` \"\"\"\n        if user.is_superuser:\n            return True\n        return user.has_perm('pybb.block_users')\n\n    def may_attach_files(self, user):\n        \"\"\"\n        return True if `user` may attach files to posts, False otherwise.\n        By default controlled by PYBB_ATTACHMENT_ENABLE setting\n        \"\"\"\n        return defaults.PYBB_ATTACHMENT_ENABLE\n\n    def may_create_poll(self, user):\n        \"\"\"\n        return True if `user` may add poll to posts, False otherwise.\n        By default always True\n        \"\"\"\n        return True\n\n    def may_edit_topic_slug(self, user):\n        \"\"\"\n        returns True if `user` may choose topic's slug, False otherwise.\n        When True adds field slug in the Topic form.\n        By default always False\n        \"\"\"\n        return False\n\n    def may_change_forum(self, user, forum):\n        \"\"\"\n        Returns True if the user has the permissions to add modertors to a forum\n        By default True if user can change forum\n        \"\"\"\n        if user.is_superuser:\n            return True\n        return user.has_perm('pybb.change_forum')\n\n    def may_manage_moderators(self, user):\n        \"\"\" return True if `user` may manage moderators\"\"\"\n        if user.is_superuser:\n            return True\n        # FIXME: is_staff only allow user to access /admin but does not mean user has extra\n        # permissions on pybb models. We should add pybb perm test\n        return user.is_staff\n\nperms = util.resolve_class(defaults.PYBB_PERMISSION_HANDLER)\n"
  },
  {
    "path": "pybb/profiles.py",
    "content": "from django.conf import settings\nfrom django.db import models\nfrom django.utils.encoding import force_str\nfrom django.utils.translation import gettext_lazy as _\nfrom django.utils.translation.trans_real import get_supported_language_variant\n\nfrom pybb import defaults, util\nfrom pybb.compat import get_image_field_class\n\nTZ_CHOICES = [(float(x[0]), x[1]) for x in (\n    (-12, '-12'), (-11, '-11'), (-10, '-10'), (-9.5, '-09.5'), (-9, '-09'),\n    (-8.5, '-08.5'), (-8, '-08 PST'), (-7, '-07 MST'), (-6, '-06 CST'),\n    (-5, '-05 EST'), (-4, '-04 AST'), (-3.5, '-03.5'), (-3, '-03 ADT'),\n    (-2, '-02'), (-1, '-01'), (0, '00 GMT'), (1, '+01 CET'), (2, '+02'),\n    (3, '+03'), (3.5, '+03.5'), (4, '+04'), (4.5, '+04.5'), (5, '+05'),\n    (5.5, '+05.5'), (6, '+06'), (6.5, '+06.5'), (7, '+07'), (8, '+08'),\n    (9, '+09'), (9.5, '+09.5'), (10, '+10'), (10.5, '+10.5'), (11, '+11'),\n    (11.5, '+11.5'), (12, '+12'), (13, '+13'), (14, '+14'),\n)]\n\n\nclass PybbProfile(models.Model):\n    \"\"\"\n    Abstract class for user profile, site profile should be inherted from this class\n    \"\"\"\n\n    class Meta(object):\n        abstract = True\n        permissions = (\n            (\"block_users\", \"Can block any user\"),\n        )\n\n    signature = models.TextField(_('Signature'), blank=True, max_length=defaults.PYBB_SIGNATURE_MAX_LENGTH)\n    signature_html = models.TextField(_('Signature HTML Version'), blank=True,\n                                      max_length=defaults.PYBB_SIGNATURE_MAX_LENGTH + 30)\n    time_zone = models.FloatField(_('Time zone'), choices=TZ_CHOICES, default=float(defaults.PYBB_DEFAULT_TIME_ZONE))\n    language = models.CharField(_('Language'), max_length=10, blank=True, choices=settings.LANGUAGES,\n                                default=get_supported_language_variant(settings.LANGUAGE_CODE, strict=True))\n    show_signatures = models.BooleanField(_('Show signatures'), default=True)\n    post_count = models.IntegerField(_('Post count'), blank=True, default=0)\n    avatar = get_image_field_class()(_('Avatar'), blank=True, null=True,\n                                     upload_to=util.FilePathGenerator(to='pybb/avatar'))\n    autosubscribe = models.BooleanField(_('Automatically subscribe'),\n                                        help_text=_('Automatically subscribe to topics that you answer'),\n                                        default=defaults.PYBB_DEFAULT_AUTOSUBSCRIBE)\n\n    def save(self, *args, **kwargs):\n        self.signature_html = util._get_markup_formatter()(self.signature)\n        super(PybbProfile, self).save(*args, **kwargs)\n\n    @property\n    def avatar_url(self):\n        try:\n            return self.avatar.url\n        except:\n            return defaults.PYBB_DEFAULT_AVATAR_URL\n\n    def get_display_name(self):\n        try:\n            if hasattr(self, 'user'):  # we have OneToOne foreign key to user model\n                return self.user.get_username()\n            if not defaults.PYBB_PROFILE_RELATED_NAME:  # we now in user custom model itself\n                return self.get_username()\n        except Exception:\n            return force_str(self)\n"
  },
  {
    "path": "pybb/signals.py",
    "content": "from django.contrib.auth.models import Permission\nfrom django.contrib.contenttypes.models import ContentType\nfrom django.db.models.signals import post_save, post_delete, pre_save\nfrom pybb.models import Post, Category, Topic, Forum, create_or_check_slug\nfrom pybb.subscription import notify_topic_subscribers, notify_forum_subscribers\nfrom pybb import util, defaults, compat\nfrom pybb.permissions import perms\n\n\ndef topic_saved(instance, **kwargs):\n    if kwargs['created']:\n        notify_forum_subscribers(instance)\n\ndef post_saved(instance, **kwargs):\n    # signal triggered by loaddata command, ignore\n    if kwargs.get('raw', False):\n        return\n\n    if getattr(instance, '_post_saved_done', False):\n        #Do not spam users when post is saved more than once in a same request.\n        #For eg, when we parse attachments.\n        return\n\n    instance._post_saved_done = True\n    if not defaults.PYBB_DISABLE_NOTIFICATIONS:\n        notify_topic_subscribers(instance)\n\n        if util.get_pybb_profile(instance.user).autosubscribe and \\\n            perms.may_subscribe_topic(instance.user, instance.topic):\n            instance.topic.subscribers.add(instance.user)\n\n    if kwargs['created']:\n        profile = util.get_pybb_profile(instance.user)\n        profile.post_count = instance.user.posts.count()\n        profile.save()\n\n\ndef post_deleted(instance, **kwargs):\n    Profile = util.get_pybb_profile_model()\n    User = compat.get_user_model()\n    try:\n        profile = util.get_pybb_profile(instance.user)\n    except (Profile.DoesNotExist, User.DoesNotExist) as e:\n        #When we cascade delete an user, profile and posts are also deleted\n        pass\n    else:\n        profile.post_count = instance.user.posts.count()\n        profile.save()\n\n\ndef user_saved(instance, created, **kwargs):\n    # signal triggered by loaddata command, ignore\n    if kwargs.get('raw', False):\n        return\n\n    if not created:\n        return\n\n    try:\n        add_post_permission = Permission.objects.get_by_natural_key('add_post', 'pybb', 'post')\n        add_topic_permission = Permission.objects.get_by_natural_key('add_topic', 'pybb', 'topic')\n    except (Permission.DoesNotExist, ContentType.DoesNotExist):\n        return\n    instance.user_permissions.add(add_post_permission, add_topic_permission)\n    instance.save()\n\n    if defaults.PYBB_PROFILE_RELATED_NAME:\n        ModelProfile = util.get_pybb_profile_model()\n        profile = ModelProfile()\n        setattr(instance, defaults.PYBB_PROFILE_RELATED_NAME, profile)\n        profile.save()\n\n\ndef get_save_slug(extra_field=None):\n    '''\n    Returns a function to add or make an instance's slug unique\n\n    :param extra_field: field needed in case of a unique_together.\n    '''\n    if extra_field:\n        def save_slug(**kwargs):\n            extra_filters = {}\n            extra_filters[extra_field] = getattr(kwargs.get('instance'), extra_field)\n            kwargs['instance'].slug = create_or_check_slug(kwargs['instance'], kwargs['sender'], **extra_filters)\n    else:\n        def save_slug(**kwargs):\n            kwargs['instance'].slug = create_or_check_slug(kwargs['instance'], kwargs['sender'])\n    return save_slug\n\npre_save_category_slug = get_save_slug()\npre_save_forum_slug = get_save_slug('category')\npre_save_topic_slug = get_save_slug('forum')\n\n\ndef setup():\n    pre_save.connect(pre_save_category_slug, sender=Category)\n    pre_save.connect(pre_save_forum_slug, sender=Forum)\n    pre_save.connect(pre_save_topic_slug, sender=Topic)\n    post_save.connect(topic_saved, sender=Topic)\n    post_save.connect(post_saved, sender=Post)\n    post_delete.connect(post_deleted, sender=Post)\n    if defaults.PYBB_AUTO_USER_PERMISSIONS:\n        post_save.connect(user_saved, sender=compat.get_user_model())\n"
  },
  {
    "path": "pybb/static/markitup/ajax_csrf.js",
    "content": "// https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/#ajax\nfunction getCookie(name) {\n    var cookieValue = null;\n    if (document.cookie && document.cookie != '') {\n        var cookies = document.cookie.split(';');\n        for (var i = 0; i < cookies.length; i++) {\n            var cookie = jQuery.trim(cookies[i]);\n            // Does this cookie string begin with the name we want?\n            if (cookie.substring(0, name.length + 1) == (name + '=')) {\n                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));\n                break;\n            }\n        }\n    }\n    return cookieValue;\n}\nvar csrftoken = getCookie('csrftoken');\n\nfunction csrfSafeMethod(method) {\n    // these HTTP methods do not require CSRF protection\n    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));\n}\n$.ajaxSetup({\n    beforeSend: function(xhr, settings) {\n        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {\n            xhr.setRequestHeader(\"X-CSRFToken\", csrftoken);\n        }\n    }\n});"
  },
  {
    "path": "pybb/static/markitup/jquery.markitup.js",
    "content": "// ----------------------------------------------------------------------------\n// markItUp! Universal MarkUp Engine, JQuery plugin\n// v 1.1.x\n// Dual licensed under the MIT and GPL licenses.\n// ----------------------------------------------------------------------------\n// Copyright (C) 2007-2012 Jay Salvat\n// http://markitup.jaysalvat.com/\n// ----------------------------------------------------------------------------\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n// \n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// ----------------------------------------------------------------------------\n(function($) {\n\t$.fn.markItUp = function(settings, extraSettings) {\n\t\tvar method, params, options, ctrlKey, shiftKey, altKey; ctrlKey = shiftKey = altKey = false;\n\n\t\tif (typeof settings == 'string') {\n\t\t\tmethod = settings;\n\t\t\tparams = extraSettings;\n\t\t} \n\n\t\toptions = {\tid:\t\t\t\t\t\t'',\n\t\t\t\t\tnameSpace:\t\t\t\t'',\n\t\t\t\t\troot:\t\t\t\t\t'',\n\t\t\t\t\tpreviewHandler:\t\t\tfalse,\n\t\t\t\t\tpreviewInWindow:\t\t'', // 'width=800, height=600, resizable=yes, scrollbars=yes'\n\t\t\t\t\tpreviewInElement:\t\t'',\n\t\t\t\t\tpreviewAutoRefresh:\t\ttrue,\n\t\t\t\t\tpreviewPosition:\t\t'after',\n\t\t\t\t\tpreviewTemplatePath:\t'~/templates/preview.html',\n\t\t\t\t\tpreviewParser:\t\t\tfalse,\n\t\t\t\t\tpreviewParserPath:\t\t'',\n\t\t\t\t\tpreviewParserVar:\t\t'data',\n\t\t\t\t\tresizeHandle:\t\t\ttrue,\n\t\t\t\t\tbeforeInsert:\t\t\t'',\n\t\t\t\t\tafterInsert:\t\t\t'',\n\t\t\t\t\tonEnter:\t\t\t\t{},\n\t\t\t\t\tonShiftEnter:\t\t\t{},\n\t\t\t\t\tonCtrlEnter:\t\t\t{},\n\t\t\t\t\tonTab:\t\t\t\t\t{},\n\t\t\t\t\tmarkupSet:\t\t\t[\t{ /* set */ } ]\n\t\t\t\t};\n\t\t$.extend(options, settings, extraSettings);\n\n\t\t// compute markItUp! path\n\t\tif (!options.root) {\n\t\t\t$('script').each(function(a, tag) {\n\t\t\t\tmiuScript = $(tag).get(0).src.match(/(.*)jquery\\.markitup(\\.pack)?\\.js$/);\n\t\t\t\tif (miuScript !== null) {\n\t\t\t\t\toptions.root = miuScript[1];\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Quick patch to keep compatibility with jQuery 1.9\n\t\tvar uaMatch = function(ua) {\n\t\t\tua = ua.toLowerCase();\n\n\t\t\tvar match = /(chrome)[ \\/]([\\w.]+)/.exec(ua) ||\n\t\t\t\t/(webkit)[ \\/]([\\w.]+)/.exec(ua) ||\n\t\t\t\t/(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) ||\n\t\t\t\t/(msie) ([\\w.]+)/.exec(ua) ||\n\t\t\t\tua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec(ua) ||\n\t\t\t\t[];\n\n\t\t\treturn {\n\t\t\t\tbrowser: match[ 1 ] || \"\",\n\t\t\t\tversion: match[ 2 ] || \"0\"\n\t\t\t};\n\t\t};\n\t\tvar matched = uaMatch( navigator.userAgent );\n\t\tvar browser = {};\n\n\t\tif (matched.browser) {\n\t\t\tbrowser[matched.browser] = true;\n\t\t\tbrowser.version = matched.version;\n\t\t}\n\t\tif (browser.chrome) {\n\t\t\tbrowser.webkit = true;\n\t\t} else if (browser.webkit) {\n\t\t\tbrowser.safari = true;\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar $$, textarea, levels, scrollPosition, caretPosition, caretOffset,\n\t\t\t\tclicked, hash, header, footer, previewWindow, template, iFrame, abort;\n\t\t\t$$ = $(this);\n\t\t\ttextarea = this;\n\t\t\tlevels = [];\n\t\t\tabort = false;\n\t\t\tscrollPosition = caretPosition = 0;\n\t\t\tcaretOffset = -1;\n\n\t\t\toptions.previewParserPath = localize(options.previewParserPath);\n\t\t\toptions.previewTemplatePath = localize(options.previewTemplatePath);\n\n\t\t\tif (method) {\n\t\t\t\tswitch(method) {\n\t\t\t\t\tcase 'remove':\n\t\t\t\t\t\tremove();\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\tmarkup(params);\n\t\t\t\t\tbreak;\n\t\t\t\t\tdefault: \n\t\t\t\t\t\t$.error('Method ' +  method + ' does not exist on jQuery.markItUp');\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// apply the computed path to ~/\n\t\t\tfunction localize(data, inText) {\n\t\t\t\tif (inText) {\n\t\t\t\t\treturn \tdata.replace(/(\"|')~\\//g, \"$1\"+options.root);\n\t\t\t\t}\n\t\t\t\treturn \tdata.replace(/^~\\//, options.root);\n\t\t\t}\n\n\t\t\t// init and build editor\n\t\t\tfunction init() {\n\t\t\t\tid = ''; nameSpace = '';\n\t\t\t\tif (options.id) {\n\t\t\t\t\tid = 'id=\"'+options.id+'\"';\n\t\t\t\t} else if ($$.attr(\"id\")) {\n\t\t\t\t\tid = 'id=\"markItUp'+($$.attr(\"id\").substr(0, 1).toUpperCase())+($$.attr(\"id\").substr(1))+'\"';\n\n\t\t\t\t}\n\t\t\t\tif (options.nameSpace) {\n\t\t\t\t\tnameSpace = 'class=\"'+options.nameSpace+'\"';\n\t\t\t\t}\n\t\t\t\t$$.wrap('<div '+nameSpace+'></div>');\n\t\t\t\t$$.wrap('<div '+id+' class=\"markItUp\"></div>');\n\t\t\t\t$$.wrap('<div class=\"markItUpContainer\"></div>');\n\t\t\t\t$$.addClass(\"markItUpEditor\");\n\n\t\t\t\t// add the header before the textarea\n\t\t\t\theader = $('<div class=\"markItUpHeader\"></div>').insertBefore($$);\n\t\t\t\t$(dropMenus(options.markupSet)).appendTo(header);\n\n\t\t\t\t// add the footer after the textarea\n\t\t\t\tfooter = $('<div class=\"markItUpFooter\"></div>').insertAfter($$);\n\n\t\t\t\t// add the resize handle after textarea\n\t\t\t\tif (options.resizeHandle === true && browser.safari !== true) {\n\t\t\t\t\tresizeHandle = $('<div class=\"markItUpResizeHandle\"></div>')\n\t\t\t\t\t\t.insertAfter($$)\n\t\t\t\t\t\t.bind(\"mousedown.markItUp\", function(e) {\n\t\t\t\t\t\t\tvar h = $$.height(), y = e.clientY, mouseMove, mouseUp;\n\t\t\t\t\t\t\tmouseMove = function(e) {\n\t\t\t\t\t\t\t\t$$.css(\"height\", Math.max(20, e.clientY+h-y)+\"px\");\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tmouseUp = function(e) {\n\t\t\t\t\t\t\t\t$(\"html\").unbind(\"mousemove.markItUp\", mouseMove).unbind(\"mouseup.markItUp\", mouseUp);\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t$(\"html\").bind(\"mousemove.markItUp\", mouseMove).bind(\"mouseup.markItUp\", mouseUp);\n\t\t\t\t\t});\n\t\t\t\t\tfooter.append(resizeHandle);\n\t\t\t\t}\n\n\t\t\t\t// listen key events\n\t\t\t\t$$.bind('keydown.markItUp', keyPressed).bind('keyup', keyPressed);\n\t\t\t\t\n\t\t\t\t// bind an event to catch external calls\n\t\t\t\t$$.bind(\"insertion.markItUp\", function(e, settings) {\n\t\t\t\t\tif (settings.target !== false) {\n\t\t\t\t\t\tget();\n\t\t\t\t\t}\n\t\t\t\t\tif (textarea === $.markItUp.focused) {\n\t\t\t\t\t\tmarkup(settings);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// remember the last focus\n\t\t\t\t$$.bind('focus.markItUp', function() {\n\t\t\t\t\t$.markItUp.focused = this;\n\t\t\t\t});\n\n\t\t\t\tif (options.previewInElement) {\n\t\t\t\t\trefreshPreview();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// recursively build header with dropMenus from markupset\n\t\t\tfunction dropMenus(markupSet) {\n\t\t\t\tvar ul = $('<ul></ul>'), i = 0;\n\t\t\t\t$('li:hover > ul', ul).css('display', 'block');\n\t\t\t\t$.each(markupSet, function() {\n\t\t\t\t\tvar button = this, t = '', title, li, j;\n\t\t\t\t\ttitle = (button.key) ? (button.name||'')+' [Ctrl+'+button.key+']' : (button.name||'');\n\t\t\t\t\tkey   = (button.key) ? 'accesskey=\"'+button.key+'\"' : '';\n\t\t\t\t\tif (button.separator) {\n\t\t\t\t\t\tli = $('<li class=\"markItUpSeparator\">'+(button.separator||'')+'</li>').appendTo(ul);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tfor (j = levels.length -1; j >= 0; j--) {\n\t\t\t\t\t\t\tt += levels[j]+\"-\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tli = $('<li class=\"markItUpButton markItUpButton'+t+(i)+' '+(button.className||'')+'\"><a href=\"\" '+key+' title=\"'+title+'\">'+(button.name||'')+'</a></li>')\n\t\t\t\t\t\t.bind(\"contextmenu.markItUp\", function() { // prevent contextmenu on mac and allow ctrl+click\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}).bind('click.markItUp', function(e) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}).bind(\"focusin.markItUp\", function(){\n                            $$.focus();\n\t\t\t\t\t\t}).bind('mouseup', function() {\n\t\t\t\t\t\t\tif (button.call) {\n\t\t\t\t\t\t\t\teval(button.call)();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetTimeout(function() { markup(button) },1);\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}).bind('mouseenter.markItUp', function() {\n\t\t\t\t\t\t\t\t$('> ul', this).show();\n\t\t\t\t\t\t\t\t$(document).one('click', function() { // close dropmenu if click outside\n\t\t\t\t\t\t\t\t\t\t$('ul ul', header).hide();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}).bind('mouseleave.markItUp', function() {\n\t\t\t\t\t\t\t\t$('> ul', this).hide();\n\t\t\t\t\t\t}).appendTo(ul);\n\t\t\t\t\t\tif (button.dropMenu) {\n\t\t\t\t\t\t\tlevels.push(i);\n\t\t\t\t\t\t\t$(li).addClass('markItUpDropMenu').append(dropMenus(button.dropMenu));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}); \n\t\t\t\tlevels.pop();\n\t\t\t\treturn ul;\n\t\t\t}\n\n\t\t\t// markItUp! markups\n\t\t\tfunction magicMarkups(string) {\n\t\t\t\tif (string) {\n\t\t\t\t\tstring = string.toString();\n\t\t\t\t\tstring = string.replace(/\\(\\!\\(([\\s\\S]*?)\\)\\!\\)/g,\n\t\t\t\t\t\tfunction(x, a) {\n\t\t\t\t\t\t\tvar b = a.split('|!|');\n\t\t\t\t\t\t\tif (altKey === true) {\n\t\t\t\t\t\t\t\treturn (b[1] !== undefined) ? b[1] : b[0];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn (b[1] === undefined) ? \"\" : b[0];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t\t// [![prompt]!], [![prompt:!:value]!]\n\t\t\t\t\tstring = string.replace(/\\[\\!\\[([\\s\\S]*?)\\]\\!\\]/g,\n\t\t\t\t\t\tfunction(x, a) {\n\t\t\t\t\t\t\tvar b = a.split(':!:');\n\t\t\t\t\t\t\tif (abort === true) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvalue = prompt(b[0], (b[1]) ? b[1] : '');\n\t\t\t\t\t\t\tif (value === null) {\n\t\t\t\t\t\t\t\tabort = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t\treturn string;\n\t\t\t\t}\n\t\t\t\treturn \"\";\n\t\t\t}\n\n\t\t\t// prepare action\n\t\t\tfunction prepare(action) {\n\t\t\t\tif ($.isFunction(action)) {\n\t\t\t\t\taction = action(hash);\n\t\t\t\t}\n\t\t\t\treturn magicMarkups(action);\n\t\t\t}\n\n\t\t\t// build block to insert\n\t\t\tfunction build(string) {\n\t\t\t\tvar openWith \t\t\t= prepare(clicked.openWith);\n\t\t\t\tvar placeHolder \t\t= prepare(clicked.placeHolder);\n\t\t\t\tvar replaceWith \t\t= prepare(clicked.replaceWith);\n\t\t\t\tvar closeWith \t\t\t= prepare(clicked.closeWith);\n\t\t\t\tvar openBlockWith \t\t= prepare(clicked.openBlockWith);\n\t\t\t\tvar closeBlockWith \t\t= prepare(clicked.closeBlockWith);\n\t\t\t\tvar multiline \t\t\t= clicked.multiline;\n\t\t\t\t\n\t\t\t\tif (replaceWith !== \"\") {\n\t\t\t\t\tblock = openWith + replaceWith + closeWith;\n\t\t\t\t} else if (selection === '' && placeHolder !== '') {\n\t\t\t\t\tblock = openWith + placeHolder + closeWith;\n\t\t\t\t} else {\n\t\t\t\t\tstring = string || selection;\n\n\t\t\t\t\tvar lines = [string], blocks = [];\n\t\t\t\t\t\n\t\t\t\t\tif (multiline === true) {\n\t\t\t\t\t\tlines = string.split(/\\r?\\n/);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tfor (var l = 0; l < lines.length; l++) {\n\t\t\t\t\t\tline = lines[l];\n\t\t\t\t\t\tvar trailingSpaces;\n\t\t\t\t\t\tif (trailingSpaces = line.match(/ *$/)) {\n\t\t\t\t\t\t\tblocks.push(openWith + line.replace(/ *$/g, '') + closeWith + trailingSpaces);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tblocks.push(openWith + line + closeWith);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tblock = blocks.join(\"\\n\");\n\t\t\t\t}\n\n\t\t\t\tblock = openBlockWith + block + closeBlockWith;\n\n\t\t\t\treturn {\tblock:block, \n\t\t\t\t\t\t\topenBlockWith:openBlockWith,\n\t\t\t\t\t\t\topenWith:openWith, \n\t\t\t\t\t\t\treplaceWith:replaceWith, \n\t\t\t\t\t\t\tplaceHolder:placeHolder,\n\t\t\t\t\t\t\tcloseWith:closeWith,\n\t\t\t\t\t\t\tcloseBlockWith:closeBlockWith\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\t// define markup to insert\n\t\t\tfunction markup(button) {\n\t\t\t\tvar len, j, n, i;\n\t\t\t\thash = clicked = button;\n\t\t\t\tget();\n\t\t\t\t$.extend(hash, {\tline:\"\", \n\t\t\t\t\t\t \t\t\troot:options.root,\n\t\t\t\t\t\t\t\t\ttextarea:textarea, \n\t\t\t\t\t\t\t\t\tselection:(selection||''), \n\t\t\t\t\t\t\t\t\tcaretPosition:caretPosition,\n\t\t\t\t\t\t\t\t\tctrlKey:ctrlKey, \n\t\t\t\t\t\t\t\t\tshiftKey:shiftKey, \n\t\t\t\t\t\t\t\t\taltKey:altKey\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t// callbacks before insertion\n\t\t\t\tprepare(options.beforeInsert);\n\t\t\t\tprepare(clicked.beforeInsert);\n\t\t\t\tif ((ctrlKey === true && shiftKey === true) || button.multiline === true) {\n\t\t\t\t\tprepare(clicked.beforeMultiInsert);\n\t\t\t\t}\t\t\t\n\t\t\t\t$.extend(hash, { line:1 });\n\n\t\t\t\tif ((ctrlKey === true && shiftKey === true)) {\n\t\t\t\t\tlines = selection.split(/\\r?\\n/);\n\t\t\t\t\tfor (j = 0, n = lines.length, i = 0; i < n; i++) {\n\t\t\t\t\t\tif ($.trim(lines[i]) !== '') {\n\t\t\t\t\t\t\t$.extend(hash, { line:++j, selection:lines[i] } );\n\t\t\t\t\t\t\tlines[i] = build(lines[i]).block;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlines[i] = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tstring = { block:lines.join('\\n')};\n\t\t\t\t\tstart = caretPosition;\n\t\t\t\t\tlen = string.block.length + ((browser.opera) ? n-1 : 0);\n\t\t\t\t} else if (ctrlKey === true) {\n\t\t\t\t\tstring = build(selection);\n\t\t\t\t\tstart = caretPosition + string.openWith.length;\n\t\t\t\t\tlen = string.block.length - string.openWith.length - string.closeWith.length;\n\t\t\t\t\tlen = len - (string.block.match(/ $/) ? 1 : 0);\n\t\t\t\t\tlen -= fixIeBug(string.block);\n\t\t\t\t} else if (shiftKey === true) {\n\t\t\t\t\tstring = build(selection);\n\t\t\t\t\tstart = caretPosition;\n\t\t\t\t\tlen = string.block.length;\n\t\t\t\t\tlen -= fixIeBug(string.block);\n\t\t\t\t} else {\n\t\t\t\t\tstring = build(selection);\n\t\t\t\t\tstart = caretPosition + string.block.length ;\n\t\t\t\t\tlen = 0;\n\t\t\t\t\tstart -= fixIeBug(string.block);\n\t\t\t\t}\n\t\t\t\tif ((selection === '' && string.replaceWith === '')) {\n\t\t\t\t\tcaretOffset += fixOperaBug(string.block);\n\t\t\t\t\t\n\t\t\t\t\tstart = caretPosition + string.openBlockWith.length + string.openWith.length;\n\t\t\t\t\tlen = string.block.length - string.openBlockWith.length - string.openWith.length - string.closeWith.length - string.closeBlockWith.length;\n\n\t\t\t\t\tcaretOffset = $$.val().substring(caretPosition,  $$.val().length).length;\n\t\t\t\t\tcaretOffset -= fixOperaBug($$.val().substring(0, caretPosition));\n\t\t\t\t}\n\t\t\t\t$.extend(hash, { caretPosition:caretPosition, scrollPosition:scrollPosition } );\n\n\t\t\t\tif (string.block !== selection && abort === false) {\n\t\t\t\t\tinsert(string.block);\n\t\t\t\t\tset(start, len);\n\t\t\t\t} else {\n\t\t\t\t\tcaretOffset = -1;\n\t\t\t\t}\n\t\t\t\tget();\n\n\t\t\t\t$.extend(hash, { line:'', selection:selection });\n\n\t\t\t\t// callbacks after insertion\n\t\t\t\tif ((ctrlKey === true && shiftKey === true) || button.multiline === true) {\n\t\t\t\t\tprepare(clicked.afterMultiInsert);\n\t\t\t\t}\n\t\t\t\tprepare(clicked.afterInsert);\n\t\t\t\tprepare(options.afterInsert);\n\n\t\t\t\t// refresh preview if opened\n\t\t\t\tif (previewWindow && options.previewAutoRefresh) {\n\t\t\t\t\trefreshPreview(); \n\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t// reinit keyevent\n\t\t\t\tshiftKey = altKey = ctrlKey = abort = false;\n\t\t\t}\n\n\t\t\t// Substract linefeed in Opera\n\t\t\tfunction fixOperaBug(string) {\n\t\t\t\tif (browser.opera) {\n\t\t\t\t\treturn string.length - string.replace(/\\n*/g, '').length;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\t// Substract linefeed in IE\n\t\t\tfunction fixIeBug(string) {\n\t\t\t\tif (browser.msie) {\n\t\t\t\t\treturn string.length - string.replace(/\\r*/g, '').length;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\t\t\n\t\t\t// add markup\n\t\t\tfunction insert(block) {\t\n\t\t\t\tif (document.selection) {\n\t\t\t\t\tvar newSelection = document.selection.createRange();\n\t\t\t\t\tnewSelection.text = block;\n\t\t\t\t} else {\n\t\t\t\t\ttextarea.value =  textarea.value.substring(0, caretPosition)  + block + textarea.value.substring(caretPosition + selection.length, textarea.value.length);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// set a selection\n\t\t\tfunction set(start, len) {\n\t\t\t\tif (textarea.createTextRange){\n\t\t\t\t\t// quick fix to make it work on Opera 9.5\n\t\t\t\t\tif (browser.opera && browser.version >= 9.5 && len == 0) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\trange = textarea.createTextRange();\n\t\t\t\t\trange.collapse(true);\n\t\t\t\t\trange.moveStart('character', start); \n\t\t\t\t\trange.moveEnd('character', len); \n\t\t\t\t\trange.select();\n\t\t\t\t} else if (textarea.setSelectionRange ){\n\t\t\t\t\ttextarea.setSelectionRange(start, start + len);\n\t\t\t\t}\n\t\t\t\ttextarea.scrollTop = scrollPosition;\n\t\t\t\ttextarea.focus();\n\t\t\t}\n\n\t\t\t// get the selection\n\t\t\tfunction get() {\n\t\t\t\ttextarea.focus();\n\n\t\t\t\tscrollPosition = textarea.scrollTop;\n\t\t\t\tif (document.selection) {\n\t\t\t\t\tselection = document.selection.createRange().text;\n\t\t\t\t\tif (browser.msie) { // ie\n\t\t\t\t\t\tvar range = document.selection.createRange(), rangeCopy = range.duplicate();\n\t\t\t\t\t\trangeCopy.moveToElementText(textarea);\n\t\t\t\t\t\tcaretPosition = -1;\n\t\t\t\t\t\twhile(rangeCopy.inRange(range)) {\n\t\t\t\t\t\t\trangeCopy.moveStart('character');\n\t\t\t\t\t\t\tcaretPosition ++;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else { // opera\n\t\t\t\t\t\tcaretPosition = textarea.selectionStart;\n\t\t\t\t\t}\n\t\t\t\t} else { // gecko & webkit\n\t\t\t\t\tcaretPosition = textarea.selectionStart;\n\n\t\t\t\t\tselection = textarea.value.substring(caretPosition, textarea.selectionEnd);\n\t\t\t\t} \n\t\t\t\treturn selection;\n\t\t\t}\n\n\t\t\t// open preview window\n\t\t\tfunction preview() {\n\t\t\t\tif (typeof options.previewHandler === 'function') {\n\t\t\t\t\tpreviewWindow = true;\n\t\t\t\t} else if (options.previewInElement) {\n\t\t\t\t\tpreviewWindow = $(options.previewInElement);\n\t\t\t\t} else if (!previewWindow || previewWindow.closed) {\n\t\t\t\t\tif (options.previewInWindow) {\n\t\t\t\t\t\tpreviewWindow = window.open('', 'preview', options.previewInWindow);\n\t\t\t\t\t\t$(window).unload(function() {\n\t\t\t\t\t\t\tpreviewWindow.close();\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tiFrame = $('<iframe class=\"markItUpPreviewFrame\"></iframe>');\n\t\t\t\t\t\tif (options.previewPosition == 'after') {\n\t\t\t\t\t\t\tiFrame.insertAfter(footer);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tiFrame.insertBefore(header);\n\t\t\t\t\t\t}\t\n\t\t\t\t\t\tpreviewWindow = iFrame[iFrame.length - 1].contentWindow || frame[iFrame.length - 1];\n\t\t\t\t\t}\n\t\t\t\t} else if (altKey === true) {\n\t\t\t\t\tif (iFrame) {\n\t\t\t\t\t\tiFrame.remove();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpreviewWindow.close();\n\t\t\t\t\t}\n\t\t\t\t\tpreviewWindow = iFrame = false;\n\t\t\t\t}\n\t\t\t\tif (!options.previewAutoRefresh) {\n\t\t\t\t\trefreshPreview(); \n\t\t\t\t}\n\t\t\t\tif (options.previewInWindow) {\n\t\t\t\t\tpreviewWindow.focus();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// refresh Preview window\n\t\t\tfunction refreshPreview() {\n \t\t\t\trenderPreview();\n\t\t\t}\n\n\t\t\tfunction renderPreview() {\n\t\t\t\tvar phtml;\n\t\t\t\tif (options.previewHandler && typeof options.previewHandler === 'function') {\n\t\t\t\t\toptions.previewHandler( $$.val() );\n\t\t\t\t} else if (options.previewParser && typeof options.previewParser === 'function') {\n\t\t\t\t\tvar data = options.previewParser( $$.val() );\n\t\t\t\t\twriteInPreview(localize(data, 1) ); \n\t\t\t\t} else if (options.previewParserPath !== '') {\n\t\t\t\t\t$.ajax({\n\t\t\t\t\t\ttype: 'POST',\n\t\t\t\t\t\tdataType: 'text',\n\t\t\t\t\t\tglobal: false,\n\t\t\t\t\t\turl: options.previewParserPath,\n\t\t\t\t\t\tdata: options.previewParserVar+'='+encodeURIComponent($$.val()),\n\t\t\t\t\t\tsuccess: function(data) {\n\t\t\t\t\t\t\twriteInPreview( localize(data, 1) ); \n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tif (!template) {\n\t\t\t\t\t\t$.ajax({\n\t\t\t\t\t\t\turl: options.previewTemplatePath,\n\t\t\t\t\t\t\tdataType: 'text',\n\t\t\t\t\t\t\tglobal: false,\n\t\t\t\t\t\t\tsuccess: function(data) {\n\t\t\t\t\t\t\t\twriteInPreview( localize(data, 1).replace(/<!-- content -->/g, $$.val()) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tfunction writeInPreview(data) {\n\t\t\t\tif (options.previewInElement) {\n\t\t\t\t\t$(options.previewInElement).html(data);\n\t\t\t\t} else if (previewWindow && previewWindow.document) {\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsp = previewWindow.document.documentElement.scrollTop\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\tsp = 0;\n\t\t\t\t\t}\t\n\t\t\t\t\tpreviewWindow.document.open();\n\t\t\t\t\tpreviewWindow.document.write(data);\n\t\t\t\t\tpreviewWindow.document.close();\n\t\t\t\t\tpreviewWindow.document.documentElement.scrollTop = sp;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// set keys pressed\n\t\t\tfunction keyPressed(e) { \n\t\t\t\tshiftKey = e.shiftKey;\n\t\t\t\taltKey = e.altKey;\n\t\t\t\tctrlKey = (!(e.altKey && e.ctrlKey)) ? (e.ctrlKey || e.metaKey) : false;\n\n\t\t\t\tif (e.type === 'keydown') {\n\t\t\t\t\tif (ctrlKey === true) {\n\t\t\t\t\t\tli = $('a[accesskey=\"'+((e.keyCode == 13) ? '\\\\n' : String.fromCharCode(e.keyCode))+'\"]', header).parent('li');\n\t\t\t\t\t\tif (li.length !== 0) {\n\t\t\t\t\t\t\tctrlKey = false;\n\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\tli.triggerHandler('mouseup');\n\t\t\t\t\t\t\t},1);\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (e.keyCode === 13 || e.keyCode === 10) { // Enter key\n\t\t\t\t\t\tif (ctrlKey === true) {  // Enter + Ctrl\n\t\t\t\t\t\t\tctrlKey = false;\n\t\t\t\t\t\t\tmarkup(options.onCtrlEnter);\n\t\t\t\t\t\t\treturn options.onCtrlEnter.keepDefault;\n\t\t\t\t\t\t} else if (shiftKey === true) { // Enter + Shift\n\t\t\t\t\t\t\tshiftKey = false;\n\t\t\t\t\t\t\tmarkup(options.onShiftEnter);\n\t\t\t\t\t\t\treturn options.onShiftEnter.keepDefault;\n\t\t\t\t\t\t} else { // only Enter\n\t\t\t\t\t\t\tmarkup(options.onEnter);\n\t\t\t\t\t\t\treturn options.onEnter.keepDefault;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (e.keyCode === 9) { // Tab key\n\t\t\t\t\t\tif (shiftKey == true || ctrlKey == true || altKey == true) {\n\t\t\t\t\t\t\treturn false; \n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (caretOffset !== -1) {\n\t\t\t\t\t\t\tget();\n\t\t\t\t\t\t\tcaretOffset = $$.val().length - caretOffset;\n\t\t\t\t\t\t\tset(caretOffset, 0);\n\t\t\t\t\t\t\tcaretOffset = -1;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmarkup(options.onTab);\n\t\t\t\t\t\t\treturn options.onTab.keepDefault;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction remove() {\n\t\t\t\t$$.unbind(\".markItUp\").removeClass('markItUpEditor');\n\t\t\t\t$$.parent('div').parent('div.markItUp').parent('div').replaceWith($$);\n\t\t\t\t$$.data('markItUp', null);\n\t\t\t}\n\n\t\t\tinit();\n\t\t});\n\t};\n\n\t$.fn.markItUpRemove = function() {\n\t\treturn this.each(function() {\n\t\t\t\t$(this).markItUp('remove');\n\t\t\t}\n\t\t);\n\t};\n\n\t$.markItUp = function(settings) {\n\t\tvar options = { target:false };\n\t\t$.extend(options, settings);\n\t\tif (options.target) {\n\t\t\treturn $(options.target).each(function() {\n\t\t\t\t$(this).focus();\n\t\t\t\t$(this).trigger('insertion', [options]);\n\t\t\t});\n\t\t} else {\n\t\t\t$('textarea').trigger('insertion', [options]);\n\t\t}\n\t};\n})(jQuery);\n"
  },
  {
    "path": "pybb/static/markitup/preview.css",
    "content": "/* preview style examples */\nbody {\n\tbackground-color:#EFEFEF;\n\tfont:70% Verdana, Arial, Helvetica, sans-serif;\n}"
  },
  {
    "path": "pybb/static/markitup/sets/bbcode/readme.txt",
    "content": "Markup language: \nBBCode\n\nDescription:\nA basic BBCode markup set with Bold, Italic, Underline, Picture, Link, Size, List, Quotes, Code, Clean button, Preview button.\n\nInstall:\n- Download the zip file\n- Unzip it in your markItUp! sets folder\n- Modify your JS link to point at this set.js\n- Modify your CSS link to point at this style.css"
  },
  {
    "path": "pybb/static/markitup/sets/bbcode/set.js",
    "content": "// ----------------------------------------------------------------------------\n// markItUp!\n// ----------------------------------------------------------------------------\n// Copyright (C) 2008 Jay Salvat\n// http://markitup.jaysalvat.com/\n// ----------------------------------------------------------------------------\n// BBCode tags example\n// http://en.wikipedia.org/wiki/Bbcode\n// ----------------------------------------------------------------------------\n// Feel free to add more tags\n// ----------------------------------------------------------------------------\nmySettings = {\n\tpreviewParserPath:\t'', // path to your BBCode parser\n\tmarkupSet: [\n\t\t{name:'Bold', key:'B', openWith:'[b]', closeWith:'[/b]'},\n\t\t{name:'Italic', key:'I', openWith:'[i]', closeWith:'[/i]'},\n\t\t{name:'Underline', key:'U', openWith:'[u]', closeWith:'[/u]'},\n\t\t{separator:'---------------' },\n\t\t{name:'Picture', key:'P', replaceWith:'[img][![Url]!][/img]'},\n\t\t{name:'Link', key:'L', openWith:'[url=[![Url]!]]', closeWith:'[/url]', placeHolder:'Your text to link here...'},\n\t\t{separator:'---------------' },\n\t\t{name:'Size', key:'S', openWith:'[size=[![Text size]!]]', closeWith:'[/size]',\n\t\tdropMenu :[\n\t\t\t{name:'Big', openWith:'[size=200]', closeWith:'[/size]' },\n\t\t\t{name:'Normal', openWith:'[size=100]', closeWith:'[/size]' },\n\t\t\t{name:'Small', openWith:'[size=50]', closeWith:'[/size]' }\n\t\t]},\n\t\t{separator:'---------------' },\n\t\t{name:'Bulleted list', openWith:'[list]\\n', closeWith:'\\n[/list]'},\n\t\t{name:'Numeric list', openWith:'[list=[![Starting number]!]]\\n', closeWith:'\\n[/list]'}, \n\t\t{name:'List item', openWith:'[*] '},\n\t\t{separator:'---------------' },\n\t\t{name:'Quotes', openWith:'[quote]', closeWith:'[/quote]'},\n\t\t{name:'Code', openWith:'[code]', closeWith:'[/code]'}, \n\t\t{separator:'---------------' },\n\t\t{name:'Clean', className:\"clean\", replaceWith:function(markitup) { return markitup.selection.replace(/\\[(.*?)\\]/g, \"\") } },\n\t\t{name:'Preview', className:\"preview\", call:'preview' }\n\t]\n}"
  },
  {
    "path": "pybb/static/markitup/sets/bbcode/style.css",
    "content": "/* -------------------------------------------------------------------\n// markItUp!\n// By Jay Salvat - http://markitup.jaysalvat.com/\n// ------------------------------------------------------------------*/\n.markItUp .markItUpButton1 a\t{\n\tbackground-image:url(images/bold.png);\n}\n.markItUp .markItUpButton2 a\t{\n\tbackground-image:url(images/italic.png);\n}\n.markItUp .markItUpButton3 a\t{\n\tbackground-image:url(images/underline.png);\n}\n.markItUp .markItUpButton4 a\t{\n\tbackground-image:url(images/stroke.png);\n}\n\n\n.markItUp .markItUpButton5 a\t{\n\tbackground-image:url(images/picture.png);\n}\n.markItUp .markItUpButton6 a\t{\n\tbackground-image:url(images/link.png);\n}\n\n/*.markItUp .markItUpButton6 a\t{*/\n\t/*background-image:url(images/fonts.png);*/\n/*}*/\n.markItUp .markItUpButton7 a\t{\n\tbackground-image:url(images/list-bullet.png);\n}\n.markItUp .markItUpButton8 a\t{\n\tbackground-image:url(images/list-numeric.png);\n}\n.markItUp .markItUpButton9 a\t{\n\tbackground-image:url(images/list-item.png);\n}\n\n.markItUp .markItUpButton10 a\t{\n\tbackground-image:url(images/quotes.png);\n}\n.markItUp .markItUpButton11 a\t{\n\tbackground-image:url(images/code.png);\n}\n\t\n.markItUp .clean a {\n\tbackground-image:url(images/clean.png);\n}\n.markItUp .preview a {\n\tbackground-image:url(images/preview.png);\n}"
  },
  {
    "path": "pybb/static/markitup/sets/default/set.js",
    "content": "// ----------------------------------------------------------------------------\n// markItUp!\n// ----------------------------------------------------------------------------\n// Copyright (C) 2008 Jay Salvat\n// http://markitup.jaysalvat.com/\n// ----------------------------------------------------------------------------\n// Html tags\n// http://en.wikipedia.org/wiki/html\n// ----------------------------------------------------------------------------\n// Basic set. Feel free to add more tags\n// ----------------------------------------------------------------------------\nmySettings = {\t\n\tonShiftEnter:  \t{keepDefault:false, replaceWith:'<br />\\n'},\n\tonCtrlEnter:  \t{keepDefault:false, openWith:'\\n<p>', closeWith:'</p>'},\n\tonTab:    \t\t{keepDefault:false, replaceWith:'    '},\n\tmarkupSet:  [ \t\n\t\t{name:'Bold', key:'B', openWith:'(!(<strong>|!|<b>)!)', closeWith:'(!(</strong>|!|</b>)!)' },\n\t\t{name:'Italic', key:'I', openWith:'(!(<em>|!|<i>)!)', closeWith:'(!(</em>|!|</i>)!)'  },\n\t\t{name:'Stroke through', key:'S', openWith:'<del>', closeWith:'</del>' },\n\t\t{separator:'---------------' },\n\t\t{name:'Picture', key:'P', replaceWith:'<img src=\"[![Source:!:http://]!]\" alt=\"[![Alternative text]!]\" />' },\n\t\t{name:'Link', key:'L', openWith:'<a href=\"[![Link:!:http://]!]\"(!( title=\"[![Title]!]\")!)>', closeWith:'</a>', placeHolder:'Your text to link...' },\n\t\t{separator:'---------------' },\n\t\t{name:'Clean', className:'clean', replaceWith:function(markitup) { return markitup.selection.replace(/<(.*?)>/g, \"\") } },\t\t\n\t\t{name:'Preview', className:'preview',  call:'preview'}\n\t]\n}"
  },
  {
    "path": "pybb/static/markitup/sets/default/style.css",
    "content": "/* -------------------------------------------------------------------\n// markItUp!\n// By Jay Salvat - http://markitup.jaysalvat.com/\n// ------------------------------------------------------------------*/\n.markItUp .markItUpButton1 a {\n\tbackground-image:url(images/bold.png);\n}\n.markItUp .markItUpButton2 a {\n\tbackground-image:url(images/italic.png);\n}\n.markItUp .markItUpButton3 a {\n\tbackground-image:url(images/stroke.png);\n}\n\n.markItUp .markItUpButton4 a {\n\tbackground-image:url(images/picture.png); \n}\n.markItUp .markItUpButton5 a {\n\tbackground-image:url(images/link.png);\n}\n\n.markItUp .markItUpButton6 a {\n\tbackground-image:url(images/clean.png);\n}\n.markItUp .preview a {\n\tbackground-image:url(images/preview.png);\n}"
  },
  {
    "path": "pybb/static/markitup/sets/markdown/readme.txt",
    "content": "Markup language: \nMarkdown\n\nDescription:\nA basic Markdown markup set with Headings, Bold, Italic, Picture, Link, List, Quotes, Code, Preview button.\n\nInstall:\n- Download the zip file\n- Unzip it in your markItUp! sets folder\n- Modify your JS link to point at this set.js\n- Modify your CSS link to point at this style.css"
  },
  {
    "path": "pybb/static/markitup/sets/markdown/set.js",
    "content": "// -------------------------------------------------------------------\n// markItUp!\n// -------------------------------------------------------------------\n// Copyright (C) 2008 Jay Salvat\n// http://markitup.jaysalvat.com/\n// -------------------------------------------------------------------\n// MarkDown tags example\n// http://en.wikipedia.org/wiki/Markdown\n// http://daringfireball.net/projects/markdown/\n// -------------------------------------------------------------------\n// Feel free to add more tags\n// -------------------------------------------------------------------\nmySettings = {\n\tpreviewParserPath:\t'/markitup/preview/',\n\tonShiftEnter:\t\t{keepDefault:false, openWith:'\\n\\n'},\n\tmarkupSet: [\n\t\t{name:'First Level Heading', key:'1', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '=') } },\n\t\t{name:'Second Level Heading', key:'2', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '-') } },\n\t\t{name:'Heading 3', key:'3', openWith:'### ', placeHolder:'Your title here...' },\n\t\t{name:'Heading 4', key:'4', openWith:'#### ', placeHolder:'Your title here...' },\n\t\t{name:'Heading 5', key:'5', openWith:'##### ', placeHolder:'Your title here...' },\n\t\t{name:'Heading 6', key:'6', openWith:'###### ', placeHolder:'Your title here...' },\n\t\t{separator:'---------------' },\t\t\n\t\t{name:'Bold', key:'B', openWith:'**', closeWith:'**'},\n\t\t{name:'Italic', key:'I', openWith:'_', closeWith:'_'},\n\t\t{separator:'---------------' },\n\t\t{name:'Bulleted List', openWith:'- ' },\n\t\t{name:'Numeric List', openWith:function(markItUp) {\n\t\t\treturn markItUp.line+'. ';\n\t\t}},\n\t\t{separator:'---------------' },\n\t\t{name:'Picture', key:'P', replaceWith:'![[![Alternative text]!]]([![Url:!:http://]!] \"[![Title]!]\")'},\n\t\t{name:'Link', key:'L', openWith:'[', closeWith:']([![Url:!:http://]!] \"[![Title]!]\")', placeHolder:'Your text to link here...' },\n\t\t{separator:'---------------'},\t\n\t\t{name:'Quotes', openWith:'> '},\n\t\t{name:'Code Block / Code', openWith:'(!(\\t|!|`)!)', closeWith:'(!(`)!)'},\n\t\t{separator:'---------------'},\n\t\t{name:'Preview', call:'preview', className:\"preview\"}\n\t]\n}\n\n// mIu nameSpace to avoid conflict.\nmiu = {\n\tmarkdownTitle: function(markItUp, char) {\n\t\theading = '';\n\t\tn = $.trim(markItUp.selection||markItUp.placeHolder).length;\n\t\t// work around bug in python-markdown where header underlines must be at least 3 chars\n\t\tif (n < 3) { n = 3; }\n\t\tfor(i = 0; i < n; i++) {\n\t\t\theading += char;\n\t\t}\n\t\treturn '\\n'+heading;\n\t}\n}\n"
  },
  {
    "path": "pybb/static/markitup/sets/markdown/style.css",
    "content": "/* -------------------------------------------------------------------\n// markItUp!\n// By Jay Salvat - http://markitup.jaysalvat.com/\n// ------------------------------------------------------------------*/\n.markItUp .markItUpButton1 a {\n\tbackground-image:url(images/h1.png); \n}\n.markItUp .markItUpButton2 a {\n\tbackground-image:url(images/h2.png); \n}\n.markItUp .markItUpButton3 a {\n\tbackground-image:url(images/h3.png); \n}\n.markItUp .markItUpButton4 a {\n\tbackground-image:url(images/h4.png); \n}\n.markItUp .markItUpButton5 a {\n\tbackground-image:url(images/h5.png); \n}\n.markItUp .markItUpButton6 a {\n\tbackground-image:url(images/h6.png); \n}\n\n.markItUp .markItUpButton7 a {\n\tbackground-image:url(images/bold.png);\n}\n.markItUp .markItUpButton8 a {\n\tbackground-image:url(images/italic.png);\n}\n\n.markItUp .markItUpButton9 a {\n\tbackground-image:url(images/list-bullet.png);\n}\n.markItUp .markItUpButton10 a {\n\tbackground-image:url(images/list-numeric.png);\n}\n\n.markItUp .markItUpButton11 a {\n\tbackground-image:url(images/picture.png); \n}\n.markItUp .markItUpButton12 a {\n\tbackground-image:url(images/link.png);\n}\n\n.markItUp .markItUpButton13 a\t{\n\tbackground-image:url(images/quotes.png);\n}\n.markItUp .markItUpButton14 a\t{\n\tbackground-image:url(images/code.png);\n}\n\n.markItUp .preview a {\n\tbackground-image:url(images/preview.png);\n}"
  },
  {
    "path": "pybb/static/markitup/skins/markitup/style.css",
    "content": "/* -------------------------------------------------------------------\n// markItUp! Universal MarkUp Engine, JQuery plugin\n// By Jay Salvat - http://markitup.jaysalvat.com/\n// ------------------------------------------------------------------*/\n.markItUp * {\n\tmargin:0px; padding:0px;\n\toutline:none;\n}\n.markItUp a:link,\n.markItUp a:visited {\n\tcolor:#000;\n\ttext-decoration:none;\n}\n.markItUp  {\n\twidth:700px;\n\tmargin:5px 0 5px 0;\n\tborder:5px solid #F5F5F5;\t\n}\n.markItUpContainer  {\n\tborder:1px solid #3C769D;\t\n\tbackground:#FFF url(images/bg-container.png) repeat-x top left;\n\tpadding:5px 5px 2px 5px;\n\tfont:11px Verdana, Arial, Helvetica, sans-serif;\n}\n.markItUpEditor {\n\tfont:12px 'Courier New', Courier, monospace;\n\tpadding:5px 5px 5px 35px;\n\tborder:3px solid #3C769D;\n\twidth:643px;\n\theight:320px;\n\tbackground:#FFF url(images/bg-editor.png) no-repeat;\n\tclear:both;\n\tline-height:18px;\n\toverflow:auto;\n}\n.markItUpPreviewFrame\t{\n\toverflow:auto;\n\tbackground-color:#FFFFFF;\n\tborder:1px solid #3C769D;\n\twidth:99.9%;\n\theight:300px;\n\tmargin:5px 0;\n}\n.markItUpFooter {\n\twidth:100%;\n\tcursor:n-resize;\n}\n.markItUpResizeHandle {\n\toverflow:hidden;\n\twidth:22px; height:5px;\n\tmargin-left:auto;\n\tmargin-right:auto;\n\tbackground-image:url(images/handle.png);\n\tcursor:n-resize;\n}\n/***************************************************************************************/\n/* first row of buttons */\n.markItUpHeader ul li\t{\n\tlist-style:none;\n\tfloat:left;\n\tposition:relative;\n}\n.markItUpHeader ul li ul{\n\tdisplay:none;\n}\n.markItUpHeader ul li:hover > ul{\n\tdisplay:block;\n}\n.markItUpHeader ul .markItUpDropMenu {\n\tbackground:transparent url(images/menu.png) no-repeat 115% 50%;\n\tmargin-right:5px;\n}\n.markItUpHeader ul .markItUpDropMenu li {\n\tmargin-right:0px;\n}\n.markItUpHeader ul .markItUpSeparator {\n\tmargin:0 10px;\n\twidth:1px;\n\theight:16px;\n\toverflow:hidden;\n\tbackground-color:#CCC;\n}\n.markItUpHeader ul ul .markItUpSeparator {\n\twidth:auto; height:1px;\n\tmargin:0px;\n}\n/* next rows of buttons */\n.markItUpHeader ul ul {\n\tdisplay:none;\n\tposition:absolute;\n\ttop:18px; left:0px;\t\n\tbackground:#F5F5F5;\n\tborder:1px solid #3C769D;\n\theight:inherit;\n}\n.markItUpHeader ul ul li {\n\tfloat:none;\n\tborder-bottom:1px solid #3C769D;\n}\n.markItUpHeader ul ul .markItUpDropMenu {\n\tbackground:#F5F5F5 url(images/submenu.png) no-repeat 100% 50%;\n}\n/* next rows of buttons */\n.markItUpHeader ul ul ul {\n\tposition:absolute;\n\ttop:-1px; left:150px;\n}\n.markItUpHeader ul ul ul li {\n\tfloat:none;\n}\n.markItUpHeader ul a {\n\tdisplay:block;\n\twidth:16px; height:16px;\n\ttext-indent:-10000px;\n\tbackground-repeat:no-repeat;\n\tpadding:3px;\n\tmargin:0px;\n}\n.markItUpHeader ul ul a {\n\tdisplay:block;\n\tpadding-left:0px;\n\ttext-indent:0;\n\twidth:120px; \n\tpadding:5px 5px 5px 25px;\n\tbackground-position:2px 50%;\n}\n.markItUpHeader ul ul a:hover  {\n\tcolor:#FFF;\n\tbackground-color:#3C769D;\n}\n/***************************************************************************************/\n.html .markItUpEditor {\n\tbackground-image:url(images/bg-editor-html.png);\n}\n.markdown .markItUpEditor {\n\tbackground-image:url(images/bg-editor-markdown.png);\n}\n.textile .markItUpEditor {\n\tbackground-image:url(images/bg-editor-textile.png);\n}\n.bbcode .markItUpEditor {\n\tbackground-image:url(images/bg-editor-bbcode.png);\n}\n.wiki .markItUpEditor,\n.dotclear .markItUpEditor {\n\tbackground-image:url(images/bg-editor-wiki.png);\n}"
  },
  {
    "path": "pybb/static/markitup/skins/simple/style.css",
    "content": "/* -------------------------------------------------------------------\n// markItUp! Universal MarkUp Engine, JQuery plugin\n// By Jay Salvat - http://markitup.jaysalvat.com/\n// ------------------------------------------------------------------*/\n.markItUp * {\n\tmargin:0px; padding:0px;\n\toutline:none;\n}\n.markItUp a:link,\n.markItUp a:visited {\n\tcolor:#000;\n\ttext-decoration:none;\n}\n.markItUp  {\n\twidth:700px;\n\tmargin:5px 0 5px 0;\n}\n.markItUpContainer  {\n\tfont:11px Verdana, Arial, Helvetica, sans-serif;\n}\n.markItUpEditor {\n\tfont:12px 'Courier New', Courier, monospace;\n\tpadding:5px;\n\twidth:690px;\n\theight:320px;\n\tclear:both; display:block;\n\tline-height:18px;\n\toverflow:auto;\n}\n.markItUpPreviewFrame\t{\n\toverflow:auto;\n\tbackground-color:#FFF;\n\twidth:99.9%;\n\theight:300px;\n\tmargin:5px 0;\n}\n.markItUpFooter {\n\twidth:100%;\n}\n.markItUpResizeHandle {\n\toverflow:hidden;\n\twidth:22px; height:5px;\n\tmargin-left:auto;\n\tmargin-right:auto;\n\tbackground-image:url(images/handle.png);\n\tcursor:n-resize;\n}\n/***************************************************************************************/\n/* first row of buttons */\n.markItUpHeader ul li\t{\n\tlist-style:none;\n\tfloat:left;\n\tposition:relative;\n}\n.markItUpHeader ul li:hover > ul{\n\tdisplay:block;\n}\n.markItUpHeader ul .markItUpDropMenu {\n\tbackground:transparent url(images/menu.png) no-repeat 115% 50%;\n\tmargin-right:5px;\n}\n.markItUpHeader ul .markItUpDropMenu li {\n\tmargin-right:0px;\n}\n/* next rows of buttons */\n.markItUpHeader ul ul {\n\tdisplay:none;\n\tposition:absolute;\n\ttop:18px; left:0px;\t\n\tbackground:#FFF;\n\tborder:1px solid #000;\n}\n.markItUpHeader ul ul li {\n\tfloat:none;\n\tborder-bottom:1px solid #000;\n}\n.markItUpHeader ul ul .markItUpDropMenu {\n\tbackground:#FFF url(images/submenu.png) no-repeat 100% 50%;\n}\n.markItUpHeader ul .markItUpSeparator {\n\tmargin:0 10px;\n\twidth:1px;\n\theight:16px;\n\toverflow:hidden;\n\tbackground-color:#CCC;\n}\n.markItUpHeader ul ul .markItUpSeparator {\n\twidth:auto; height:1px;\n\tmargin:0px;\n}\n/* next rows of buttons */\n.markItUpHeader ul ul ul {\n\tposition:absolute;\n\ttop:-1px; left:150px; \n}\n.markItUpHeader ul ul ul li {\n\tfloat:none;\n}\n.markItUpHeader ul a {\n\tdisplay:block;\n\twidth:16px; height:16px;\n\ttext-indent:-10000px;\n\tbackground-repeat:no-repeat;\n\tpadding:3px;\n\tmargin:0px;\n}\n.markItUpHeader ul ul a {\n\tdisplay:block;\n\tpadding-left:0px;\n\ttext-indent:0;\n\twidth:120px; \n\tpadding:5px 5px 5px 25px;\n\tbackground-position:2px 50%;\n}\n.markItUpHeader ul ul a:hover  {\n\tcolor:#FFF;\n\tbackground-color:#000;\n}\n"
  },
  {
    "path": "pybb/static/markitup/templates/preview.css",
    "content": "/* preview style examples */\nbody {\n\tbackground-color:#EFEFEF;\n\tfont:70% Verdana, Arial, Helvetica, sans-serif;\n}"
  },
  {
    "path": "pybb/static/markitup/templates/preview.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>markItUp! preview template</title>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"~/templates/preview.css\" />\n</head>\n<body>\n<!-- content -->\n</body>\n</html>\n"
  },
  {
    "path": "pybb/static/pybb/forum.less",
    "content": "/* --- Topic/Forum table --- */\n.forum-description {\n    margin: 5px;\n    font-size: @baseFontSize - 2;\n}\n\n.forum-row, .topic-row {\n    width: 100%;\n}\n\n.forum-name, .topic-name {\n    width: 40%;\n}\n\n.forum-topic-count, .forum-post-count, .topic-post-count, .topic-view-count {\n    width: 16%;\n    text-align: center;\n}\n\n.forum-last-post, .topic-last-post {\n    width: 20%;\n}\n\n.first-unread-post-link, .first-unread-post-link:hover {\n    color: @textColor;\n    text-decoration: none;\n}"
  },
  {
    "path": "pybb/static/pybb/forum3.less",
    "content": "/* --- Topic/Forum table --- */\n.forum-description {\n    margin: 5px;\n    font-size: @font-size-base - 2;\n}\n\n.forum-row, .topic-row {\n    width: 100%;\n}\n\n.forum-name, .topic-name {\n    width: 40%;\n}\n\n.forum-topic-count, .forum-post-count, .topic-post-count, .topic-view-count {\n    width: 16%;\n    text-align: center;\n}\n\n.forum-last-post, .topic-last-post {\n    width: 20%;\n}\n\n.first-unread-post-link, .first-unread-post-link:hover {\n    color: @text-color;\n    text-decoration: none;\n}"
  },
  {
    "path": "pybb/static/pybb/js/markitup.js",
    "content": "$(function() {\n    if(window.pybb && window.pybb.get_markitup_settings){\n        var mySettings = window.pybb.get_markitup_settings();\n        $('textarea:not([class=\"no-markitup\"])').markItUp(mySettings);\n        $('#emoticons a').click(function() {\n            var emoticon = $(this).attr(\"title\");\n            $.markItUp({replaceWith: emoticon});\n            return false;\n        });\n    }\n});\n"
  },
  {
    "path": "pybb/static/pybb/js/pybbjs.js",
    "content": "function pybb_delete_post(url, post_id, confirm_text) {\n    if (!confirm(confirm_text))\n        return false;\n    $.ajax({\n        url: url,\n        type: 'POST',\n        dataType: 'text',\n        success: function (data, textStatus) {\n            if (data.length > 0) {\n                window.location = data;\n            } else {\n                $(\"#\" + post_id).slideUp();\n            }\n        }\n    });\n}\n\njQuery(function ($) {\n    function getSelectedText() {\n        if (document.selection) {\n            return document.selection.createRange().text;\n        } else {\n            return window.getSelection().toString();\n        }\n    }\n\n    var textarea = $('#id_body');\n\n    if (textarea.length > 0) {\n        $('.quote-link').on('click', function (e) {\n            e.preventDefault();\n            var url = $(this).attr('href');\n            $.get(\n                url,\n                function (data) {\n                    if (textarea.val())\n                        textarea.val(textarea.val() + '\\n');\n                    textarea.val(textarea.val() + data);\n                    window.location.hash = '#id_body';\n                }\n            );\n        });\n\n        $('.quote-selected-link').on('click', function (e) {\n            if (!window.pybb.markup) {\n                return true;\n            }\n            e.preventDefault();\n            var selectedText = getSelectedText();\n            if (selectedText != '') {\n                if (textarea.val())\n                    textarea.val(textarea.val() + '\\n');\n                var username = '';\n                if ($(this).closest('.post-row').length == 1 &&\n                    $(this).closest('.post-row').find('.post-username').length == 1) {\n                    username = $.trim($(this).closest('.post').find('.post-username').text());\n                }\n                textarea.val(textarea.val() + window.pybb.markup.quote(selectedText, username));\n                window.location.hash = '#id_body';\n            }\n        });\n\n        $('.post-row .post-username').on('click', function (e) {\n            if (window.pybb.markup && e.shiftKey) {\n                e.preventDefault();\n                var username = $.trim($(this).text());\n                if (textarea.val())\n                    textarea.val(textarea.val() + '\\n');\n                textarea.val(textarea.val() + window.pybb.markup.username(username));\n                window.location.hash = '#id_body';\n            }\n        });\n        \n        var attachments_form = $('#id_body').closest('FORM').find('.attachments-form') ;\n        \n        if(attachments_form.length > 0){\n\n            var first_file_id = attachments_form.find('.attachment-list .attachment-item INPUT[type=hidden]').attr('value');\n            if(first_file_id){\n                //if we are editing a post with an already attached files, attachment list must be displayed\n                attachments_form.find('.attachment-list').show();\n                attachments_form.find('.attachment-link').hide();\n            }else{\n                attachments_form.find('.attachment-list').hide();\n                attachments_form.find('.attachment-link').show();\n            }\n            \n            //Display \"insert actions\" only if we have a file for this attachment item.\n            attachments_form.find('.attachment-ref').each(function(i){\n                var file_id = $(this).closest('.attachment-item').find('INPUT[type=hidden]').attr('value');\n                if(file_id){\n                    $(this).show();\n                }else{\n                    $(this).hide();\n                }\n            });\n\n            //some content is only usefull if JS works. By default these contents are not displayed.\n            attachments_form.find('.attachment-ref-insert-link, .attachment-ref-insert-image').show().css('cursor', 'pointer');\n\n            attachments_form.find('.attachment-link').on('click', function(e){\n                /*Toggle attachment list and link to display it*/\n                e.preventDefault();\n                attachments_form.find('.attachment-link').toggle()\n                $(this).closest('.attachments-form').find('.attachment-list').toggle();\n            });\n\n            attachments_form.find('.attachment-ref-insert-link').on('click', function(e){\n                /*\n                Insert link code with the file reference.\n                Use window.pybb.insert_link to insert code, whatever markup language is used\n                */\n                e.preventDefault();\n                var attachment_item = $(this).closest('.attachment-item'),\n                    ref = attachment_item.find('.attachment-ref-value').text(),\n                    file = attachment_item.find('INPUT[type=file]').get(0),\n                    name = '';\n                if(file && file.files && file.files[0]){\n                    name = file.files[0].name ;\n                }else if(file && file.value){\n                    name = file.value.split('\\\\');\n                    name = name[name.length - 1].split('/');\n                    name = name[name.length - 1];\n                }\n                window.pybb.insert_link(ref, name);\n            });\n\n            attachments_form.find('.attachment-ref-insert-image').on('click', function(e){\n                /*\n                Insert image code with the file reference.\n                Use window.pybb.insert_image to insert code, whatever markup language is used\n                */\n                e.preventDefault();\n                var ref = $(this.parentNode).find('.attachment-ref-value').text();\n                window.pybb.insert_image(ref);\n            });\n\n            function add_pybb_attachment_item() {\n                /*\n                Add another attachment formset when we just add a new file.\n                */\n                if(this.value){\n                    $(this).unbind('change', add_pybb_attachment_item);\n                    $(this).closest('.attachment-item').find('.attachment-ref').toggle();\n                    var offset = parseInt($('#id_attachments-TOTAL_FORMS').attr('value')),\n                        input_list, new_item;\n                    if (offset < parseInt($('#id_attachments-MAX_NUM_FORMS').attr('value'))) {\n                        input_list = attachments_form.find('.attachment-list');\n                        new_item = input_list.find('.attachment-item').last().clone(true);\n                        new_item.find('#id_attachments-'+ (offset-1) +'-id').attr('id', 'id_attachments-' + offset + '-id' ).attr('name','id_attachments-' + offset + '-id' );\n                        new_item.find('#id_attachments-' + (offset-1) + '-file').replaceWith('<input id=\"id_attachments-' + offset + '-file\" type=\"file\" name=\"attachments-' + offset + '-file\" />');\n                        new_item.find('.attachment-ref-value').html('[file-' + (offset + 1) + ']');\n                        input_list.append(new_item);\n                        new_item.find('.attachment-ref').toggle();\n                        $('#id_attachments-TOTAL_FORMS').attr('value', offset + 1);\n                        current_input_file = $('#id_attachments-' + offset + '-file');\n                        current_input_file.on('change', add_pybb_attachment_item);\n                    };\n                }\n            }\n            attachments_form.find('INPUT[type=file]').last().on('change', add_pybb_attachment_item);\n        }\n    }\n\n    var $pybbConcernedTopics = $('#pybb_concerned_topics');\n    if ($pybbConcernedTopics.length) {\n        $('#pybb_subscription_type input[type=\"radio\"]').change(function (e) {\n            if (this.checked && (this.value == \"2\" || this.value == \"unsubscribe\")) {\n                $pybbConcernedTopics.show();\n            } else {\n                $pybbConcernedTopics.hide();\n            }\n        });\n        $pybbConcernedTopics.hide();\n        $('input[name=\"type\"][value=\"2\"], input[name=\"type\"][value=\"unsubscribe\"]').each(function (i) {\n            if (this.checked) {\n                $pybbConcernedTopics.show();\n            }\n        });\n    }\n});\n"
  },
  {
    "path": "pybb/static/pybb/posts.less",
    "content": ".posts {\n}\n\n.post {\n    margin: 3px 0 5px 0;\n}\n\n.post-header {\n   padding: 3px 0 3px 20px;\n   font-size: @baseFontSize - 2;\n   background-color: @tableBackgroundHover;\n}\n\n.post tbody tr:hover td {\n    background-color: inherit; // Cancel bootstrap's on-hover highlight\n}\n\n.post-info {\n    width: 200px;\n    padding: 10px;\n\n    .avatar {\n\n    }\n\n    .post-author {\n        font-size: @baseFontSize + 1;\n        padding: 5px 0;\n    }\n\n    .post-extra-info {\n        font-size: @baseFontSize - 2;\n        color: @grayLight;\n    }\n\n    .post-controls {\n        font-size: @baseFontSize - 2;\n    }\n}\n\n.post-content {\n    vertical-align: top;\n    padding: 10px;\n}\n\n.post-signature {\n    color: #CCC;\n    margin-top: 15px;\n    border-top: 1px dotted #CCC;\n    display: block;\n}\n\n.post-related {\n    margin-top: 20px;\n}\n"
  },
  {
    "path": "pybb/static/pybb/posts3.less",
    "content": ".posts {\n}\n\n.post {\n    margin: 3px 0 5px 0;\n}\n\n.post-header {\n   padding: 3px 0 3px 20px;\n   font-size: @font-size-base - 2;\n   background-color: @table-bg-hover;\n}\n\n.post tbody tr:hover td {\n    background-color: inherit; // Cancel bootstrap's on-hover highlight\n}\n\n.post-info {\n    width: 200px;\n    padding: 10px;\n\n    .avatar {\n\n    }\n\n    .post-author {\n        font-size: @font-size-base + 1;\n        padding: 5px 0;\n    }\n\n    .post-extra-info {\n        font-size: @font-size-base - 2;\n        color: @gray-light;\n    }\n\n    .post-controls {\n        font-size: @font-size-base - 2;\n    }\n}\n\n.post-content {\n    vertical-align: top;\n    padding: 10px;\n}\n\n.post-signature {\n    color: #CCC;\n    margin-top: 15px;\n    border-top: 1px dotted #CCC;\n    display: block;\n}\n\n.post-related {\n    margin-top: 20px;\n}\n"
  },
  {
    "path": "pybb/static/pybb/visual.less",
    "content": ".forum-headline {\n    margin-top: 10px;\n}\n\n.attachments-form {\n    padding-bottom: 15px;\n}\n\n.attachment-link {\n    border-bottom: 1px dotted;\n}\n\n/* --- Unread --- */\n\n.state-indicator {\n    display: block;\n    float: left;\n    background-color: @grayLighter;\n    height: 10px;\n    width: 10px;\n    .border-radius(5px);\n    margin: 3px 5px;\n}\n\n.topic-unread, .forum-unread {\n    a {\n        font-weight: bold;\n    }\n    .state-indicator {\n        background-color: @blueDark;\n    }\n}\n\n/* --- Moderation --- */\n.on-moderation {\n    background: #ffcccc;\n}\n\n/* --- Mini pagination --- */\n.mini-pagination {\n    padding: 3px 0 3px 10px;\n    font-size: @baseFontSize - 2;\n}\n"
  },
  {
    "path": "pybb/static/pybb/visual3.less",
    "content": ".forum-headline {\n    margin-top: 10px;\n}\n\n.attachments-form {\n    padding-bottom: 15px;\n}\n\n.attachment-link {\n    border-bottom: 1px dotted;\n}\n\n/* --- Unread --- */\n\n.state-indicator {\n    display: block;\n    float: left;\n    background-color: @gray-lighter;\n    height: 10px;\n    width: 10px;\n    border-radius: @border-radius-base;\n    margin: 3px 5px;\n}\n\n.topic-unread, .forum-unread {\n    a {\n        font-weight: bold;\n    }\n    .state-indicator {\n        background-color: @brand-info;\n    }\n}\n\n/* --- Moderation --- */\n.on-moderation {\n    background: #ffcccc;\n}\n\n/* --- Mini pagination --- */\n.mini-pagination {\n    padding: 3px 0 3px 10px;\n    font-size: @font-size-base - 2;\n}\n"
  },
  {
    "path": "pybb/subscription.py",
    "content": "\nfrom django.conf import settings\nfrom django.urls import reverse\nfrom django.core.validators import validate_email\nfrom django.template import TemplateDoesNotExist\nfrom django.template.loader import render_to_string\nfrom django.utils import translation\nfrom django.contrib.sites.models import Site\n\nfrom pybb import defaults, util, compat\nfrom pybb.models import ForumSubscription\n\nfrom pybb.compat import send_mass_html_mail\n\n\ndef notify_forum_subscribers(topic):\n    forum = topic.forum\n    qs = ForumSubscription.objects.exclude(user=topic.user).filter(forum=topic.forum)\n    notifications = qs.filter(type=ForumSubscription.TYPE_NOTIFY)\n    if notifications.count():\n        users = [n.user for n in notifications.select_related('user')]\n        context = {\n            'manage_url': reverse('pybb:forum_subscription', kwargs={'pk': forum.id}),\n            'topic': topic,\n        }\n        send_notification(users, 'forum_subscription_email', context)\n    subscriptions = qs.filter(type=ForumSubscription.TYPE_SUBSCRIBE)\n    if subscriptions.count():\n        users = (s.user for s in subscriptions.select_related('user'))\n        topic.subscribers.add(*users)\n\n\ndef notify_topic_subscribers(post):\n    topic = post.topic\n    users = topic.subscribers.exclude(pk=post.user.pk)\n    if users.count():\n        # Define constants for templates rendering\n        delete_url = reverse('pybb:delete_subscription', args=[post.topic.id])\n        current_site = Site.objects.get_current()\n        context = {\n            'post': post,\n            'post_url': 'http://%s%s' % (current_site, post.get_absolute_url()),\n            'topic_url': 'http://%s%s' % (current_site, post.topic.get_absolute_url()),\n            'delete_url_full': 'http://%s%s' % (current_site, delete_url),\n\n            # backward compat only. TODO Delete those vars in next major release\n            # and rename delete_url_full with delete_url for consistency\n            'site': current_site,\n            'delete_url': delete_url,\n        }\n        send_notification(users, 'subscription_email', context)\n\n\ndef send_notification(users, template, context=None):\n    context = context or {}\n    if not 'site' in context:\n        context['site'] = Site.objects.get_current()\n    old_lang = translation.get_language()\n    from_email = settings.DEFAULT_FROM_EMAIL\n\n    mails = []\n    for user in users:\n        if not getattr(util.get_pybb_profile(user), 'receive_emails', True):\n            continue\n\n        try:\n            validate_email(user.email)\n        except:\n            # Invalid email\n            continue\n\n        if user.email == '%s@example.com' % getattr(user, compat.get_username_field()):\n            continue\n\n        context['user'] = user\n\n        lang = util.get_pybb_profile(user).language or settings.LANGUAGE_CODE\n        translation.activate(lang)\n\n        subject = render_to_string('pybb/mail_templates/%s_subject.html' % template, context)\n        # Email subject *must not* contain newlines\n        subject = ''.join(subject.splitlines())\n        context['subject'] = subject\n\n        txt_message = render_to_string('pybb/mail_templates/%s_body.html' % template, context)\n        try:\n            html_message = render_to_string('pybb/mail_templates/%s_body-html.html' % template, context)\n        except TemplateDoesNotExist as e:\n            mails.append((subject, txt_message, from_email, [user.email]))\n        else:\n            mails.append((subject, txt_message, from_email, [user.email], html_message))\n\n    # Send mails\n    send_mass_html_mail(mails, fail_silently=True)\n\n    # Reactivate previous language\n    translation.activate(old_lang)\n"
  },
  {
    "path": "pybb/templates/pybb/_button_forum_subscription.html",
    "content": "{% load i18n %}<a href=\"{% url 'pybb:forum_subscription' pk=forum.id %}\" class=\"forum-subscription btn btn-primary\">{% if subscription %}{% trans 'Manage subscription' %}{% else %}{% trans 'Subscribe' %}{% endif %}</a>\n"
  },
  {
    "path": "pybb/templates/pybb/_button_new_topic.html",
    "content": "{% load i18n %}<a href=\"{% url 'pybb:add_topic' forum.id %}\" class=\"new-topic btn btn-primary\">{% trans 'New topic' %}</a>\n"
  },
  {
    "path": "pybb/templates/pybb/_button_save.html",
    "content": "{% load i18n %}<input type=\"submit\" class=\"btn btn-primary\" value=\"{% trans 'Save' %}\" />"
  },
  {
    "path": "pybb/templates/pybb/_button_submit.html",
    "content": "{% load i18n %}<input type=\"submit\" class=\"btn btn-primary\" value=\"{% if submit_text %}{{ submit_text }}{% else %}{% trans 'Submit' %}{% endif %}\" />"
  },
  {
    "path": "pybb/templates/pybb/_easy_thumbnail_avatar.html",
    "content": "{% load thumbnail %}\n{% thumbnail user_profile.avatar|default:PYBB_DEFAULT_AVATAR_URL PYBB_AVATAR_DIMENSIONS as avatar %}\n<img src=\"{{ avatar.url }}\" alt=\"{{ user_profile.get_display_name }} avatar\"/>\n"
  },
  {
    "path": "pybb/templates/pybb/_markitup.html",
    "content": "{% load i18n %}\n\n{% comment %}\nTODO : delete this template in the next major release\nThis template will not exist anymore in the next release. Please do not use it.\nSee docs about PYBB_MARKUP_ENGINES_PATHS setting and pybb.markup.bbcode.py\n{% endcomment %}\n\n<script type=\"text/javascript\" src=\"{% static 'markitup/ajax_csrf.js' %}\"></script>\n<script type=\"text/javascript\" src=\"{% static 'markitup/jquery.markitup.js' %}\"></script>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"{% static 'markitup/skins/simple/style.css' %}\">\n{% with 'markitup/sets/'|add:PYBB_MARKUP|add:'/style.css' as style_static %}\n<link rel=\"stylesheet\" type=\"text/css\" href=\"{% static style_static %}\">\n{% endwith %}\n{% with 'markitup/sets/'|add:PYBB_MARKUP|add:'/set.js' as static_setjs %}\n<script type=\"text/javascript\" src=\"{% static static_setjs %}\"></script>\n{% endwith %}\n\n<script type=\"text/javascript\">\n$(function() {\n    mySettings['previewParserPath'] = '{% url 'pybb:post_ajax_preview' %}';\n    mySettings['previewPosition'] = 'before';\n    mySettings['resizeHandle'] = true;\n    mySettings['markupSet'] = [\n        {name:'{% trans \"Bold\" as txt %}{{ txt|escapejs }}', key:'B', openWith:'[b]', closeWith:'[/b]'},\n        {name:'{% trans \"Italic\" as txt %}{{ txt|escapejs }}', key:'I', openWith:'[i]', closeWith:'[/i]'},\n        {name:'{% trans \"Underline\" as txt %}{{ txt|escapejs }}', key:'U', openWith:'[u]', closeWith:'[/u]'},\n        {name:'{% trans \"Stroke\" as txt %}{{ txt|escapejs }}', key:'S', openWith:'[s]', closeWith:'[/s]'},\n        {separator:'---------------' },\n        {name:'{% trans \"Picture\" as txt %}{{ txt|escapejs }}', key:'P', replaceWith:'[img][![Url]!][/img]'},\n        {name:'{% trans \"Link\" as txt %}{{ txt|escapejs }}', key:'L', openWith:'[url=[![Url]!]]', closeWith:'[/url]', placeHolder:'Your text to link here...'},\n        {separator:'---------------' },\n        {name:'{% trans \"Bulleted list\" as txt %}{{ txt|escapejs }}', openWith:'[list]\\n', closeWith:'\\n[/list]'},\n        {name:'{% trans \"Numeric list\" as txt %}{{ txt|escapejs }}', openWith:'[list=[![Starting number]!]]\\n', closeWith:'\\n[/list]'},\n        {name:'{% trans \"List item\" as txt %}{{ txt|escapejs }}', openWith:'[*] '},\n        {separator:'---------------' },\n        {name:'{% trans \"Quotes\" as txt %}{{ txt|escapejs }}', openWith:'[quote]', closeWith:'[/quote]'},\n        {name:'{% trans \"Code\" as txt %}{{ txt|escapejs }}', openWith:'[code]', closeWith:'[/code]'},\n        {separator:'---------------' },\n        {name:'{% trans \"Clean\" as txt %}{{ txt|escapejs }}', className:\"clean\", replaceWith:function(markitup) { return markitup.selection.replace(/\\[(.*?)\\]/g, \"\") } },\n        {name:'{% trans \"Preview\" as txt %}{{ txt|escapejs }}', className:\"preview\", call:'preview' }\n    ];\n    $('textarea:not([class=\"no-markitup\"])').markItUp(mySettings);\n\n    $('#emoticons a').click(function() {\n        var emoticon = $(this).attr(\"title\");\n        $.markItUp({replaceWith: emoticon});\n        return false;\n    });\n});\n</script>\n"
  },
  {
    "path": "pybb/templates/pybb/_markitup_preview.html",
    "content": "<html>\n<head>\n    <style type=\"text/css\">\n        blockquote {\n          padding: 0 0 0 15px;\n          margin: 0 0 20px;\n          border-left: 5px solid #eeeeee;\n        }\n        pre {\n            display: block;\n            padding: 9.5px;\n            margin: 0 0 10px;\n            font-size: 13px;\n            line-height: 20px;\n            word-break: break-all;\n            word-wrap: break-word;\n            white-space: pre;\n            white-space: pre-wrap;\n            background-color: whiteSmoke;\n            border: 1px solid #CCC;\n            border: 1px solid rgba(0, 0, 0, 0.15);\n            -webkit-border-radius: 4px;\n            -moz-border-radius: 4px;\n            border-radius: 4px;\n        }\n    </style>\n</head>\n<body>\n{{ html|safe }}\n</body>\n</html>"
  },
  {
    "path": "pybb/templates/pybb/_need_to_login_message.html",
    "content": "{% load i18n %}\n<a href=\"{% url 'registration_register' %}\">{% trans 'Register' %}</a> {% trans 'or' %} <a href=\"{% url 'auth_login' %}?next={{ next }}\">{% trans 'login' %}</a> {% trans 'to create to post a reply' %}.\n"
  },
  {
    "path": "pybb/templates/pybb/_select_radio.html",
    "content": "<div class=\"form-group\">\n    {% if field.auto_id %}\n        <label class=\"control-label {% if field.field.required %}{{ form.required_css_class }}{% endif %}\">{{ field.label }}</label>\n    {% endif %}\n    <div class=\"\">\n        {% for choice in field %}\n            <div class=\"radio\">\n                <label>\n                    {{ choice.tag }}\n                    {{ choice.choice_label }}\n                </label>\n            </div>\n        {% endfor %}\n\n        {% for error in field.errors %}\n            <span class=\"help-block {{ form.error_css_class }}\">{{ error }}</span>\n        {% endfor %}\n\n        {% if field.help_text %}\n            <p class=\"help-block\">\n                {{ field.help_text|safe }}\n            </p>\n        {% endif %}\n    </div>\n</div>\n"
  },
  {
    "path": "pybb/templates/pybb/_sorl_thumbnail_avatar.html",
    "content": "{% load thumbnail %}\n{% thumbnail user_profile.avatar PYBB_AVATAR_DIMENSIONS as avatar %}\n    <img src=\"{{ avatar.url }}\" alt=\"{{ user_profile.get_display_name }} avatar\"/>\n{% endthumbnail %}\n"
  },
  {
    "path": "pybb/templates/pybb/add_post.html",
    "content": "{% extends 'pybb/base.html' %}\n{% load i18n pybb_tags static %}\n\n{% block title %}\n{% if forum %}{% trans 'New topic' %}{% else %}{% trans 'New reply' %}{% endif %}\n{% endblock %}\n\n{% block extra_head %}\n    {{ block.super }}\n    {{ form.media.css }}\n{% endblock %}\n{% block extra_script %}\n    {{ block.super }}\n    {{ form.media.js }}\n    <script type=\"text/javascript\" src=\"{% static 'pybb/js/jquery.formset.min.js' %}\"></script>\n{% endblock %}\n\n{% block breadcrumb %}\n    {% if forum %}\n        {% with object=forum extra_crumb=\"New topic\" %}\n            {% include 'pybb/breadcrumb.html' %}\n        {% endwith %}\n    {% else %}\n        {% with object=topic extra_crumb=\"New reply\" %}\n            {% include 'pybb/breadcrumb.html' %}\n        {% endwith %}\n    {% endif %}\n{% endblock %}\n\n{% block content %}\n\n<h1>{% if forum %}{% trans 'New topic' %}{% else %}{% trans 'New reply' %}{% endif %}</h1>\n\n{% include \"pybb/post_form.html\" %}\n{% endblock content %}\n"
  },
  {
    "path": "pybb/templates/pybb/attachments_formset.html",
    "content": "{% load pybb_tags static %}\n\n{% if request.user|pybb_may_attach_files %}\n    {% load i18n %}\n    <div class=\"attachments-form\">\n        <a class=\"attachment-link\" style=\"display:none;\" href=\"#\">{% trans 'Add attachments' %}</a>\n        {{ aformset.management_form }}\n            <table class=\"attachment-list\">\n                {% for form in aformset %}\n                    <tr class=\"attachment-item\">\n                        <td>\n                            {{ form.id }}{{ form.file }}\n                            {% if attachment_max_size %}\n                                <span title=\"{% trans 'If you need to upload larger files, please use an external storage website.' %}\" class=\"help\">{% blocktrans with max_size=attachment_max_size|filesizeformat%}(max size: {{ max_size }}){% endblocktrans %}</span>\n                            {% endif %}\n                        </td>\n                        <td>{% if form.instance.pk %}{{ form.DELETE }} {% trans 'delete' %}{% endif %}</td>\n                        <td>\n                            <span class=\"attachment-ref\">\n                                <abbr title=\"{% trans 'Reference to your file' %}\">{% trans 'Ref' %}</abbr>{% trans ':' %} \n                                <span class=\"attachment-ref-value\">[file-{{ forloop.counter }}]</span>\n                                <img style=\"display:none;\" class=\"attachment-ref-insert-link\" src=\"{% static 'pybb/img/attachment.png' %}\" alt=\"{% trans 'link' %}\" title=\"{% trans 'Insert a link to your file inside your post.' %}\" />\n                                <img style=\"display:none;\" class=\"attachment-ref-insert-image\" src=\"{% static 'pybb/img/image.png' %}\" alt=\"{% trans 'image' %}\" title=\"{% trans 'Insert your image inside your post.' %}\" />\n                            </span>\n                        </td>\n                    </tr>\n                {% endfor %}\n            </table>\n    </div>\n{% endif %}\n"
  },
  {
    "path": "pybb/templates/pybb/avatar.html",
    "content": "{% load pybb_tags %}\n<div class=\"avatar\">\n    {% pybb_get_profile user=user as user_profile %}\n    <a href=\"{{ user_profile.get_absolute_url }}\">\n        {% if user_profile.avatar %}\n            {% if 'sorl.thumbnail'|check_app_installed %}\n                {% include 'pybb/_sorl_thumbnail_avatar.html' %}\n            {% elif 'easy_thumbnails'|check_app_installed %}\n                {% include 'pybb/_easy_thumbnail_avatar.html' %}\n            {% else %}\n                <img src=\"{{ user_profile.avatar.url }}\" alt=\"{{ user_profile.get_display_name }} avatar\" width=\"{{ PYBB_AVATAR_WIDTH }}\" height=\"{{ PYBB_AVATAR_HEIGHT }}\"/>\n            {% endif %}\n        {% else %}\n            <img src=\"{{ PYBB_DEFAULT_AVATAR_URL }}\" alt=\"default avatar\" width=\"{{ PYBB_AVATAR_WIDTH }}\" height=\"{{ PYBB_AVATAR_HEIGHT }}\"/>\n        {% endif %}\n    </a>\n</div>\n"
  },
  {
    "path": "pybb/templates/pybb/base.html",
    "content": "{% extends PYBB_TEMPLATE|default:\"base.html\" %}\n\n{% load i18n pybb_tags %}\n\n{% block title %}{{ PYBB_DEFAULT_TITLE }}{% endblock title %}\n\n{% block extra_head %}\n    {{ block.super }}\n    <!-- Feeds -->\n    <link rel=\"alternate\" type=\"application/atom+xml\" href=\"{% url 'pybb:feed_posts' %}\" title=\"{% trans 'Latest posts on forum' %}\" >\n    <link rel=\"alternate\" type=\"application/atom+xml\" href=\"{% url 'pybb:feed_topics' %}\" title=\"{% trans 'Latest topics on forum' %}\" >\n{% endblock %}\n\n{% block breadcrumb %}\n    {% include \"pybb/breadcrumb.html\" %}\n{% endblock %}\n\n{% block content %}{% endblock content %}\n\n"
  },
  {
    "path": "pybb/templates/pybb/breadcrumb.html",
    "content": "{% load i18n pybb_tags %}\n<ul class=\"breadcrumb\">\n    {% include \"pybb/breadcrumb_top_extra_crumb.html\" %}\n    <li><a href=\"{% url 'pybb:index' %}\">{% trans 'Home' %}</a> <span class=\"divider\">/</span></li>\n    {% if object %}\n        {% if object.get_parents %}\n            {% for obj in object.get_parents %}\n                <li>{% pybb_link obj %} <span class=\"divider\">/</span></li>\n            {% endfor %}\n        {% endif %}\n        {% if extra_crumb %}\n            <li>{% pybb_link object %} <span class=\"divider\">/</span></li>\n        {% else %}\n            <li>{{ object }}</li>\n        {% endif %}\n    {% endif %}\n    {% if extra_crumb %}\n        <li>{% trans extra_crumb %}</li>\n    {% endif %}\n</ul>\n"
  },
  {
    "path": "pybb/templates/pybb/breadcrumb_top_extra_crumb.html",
    "content": ""
  },
  {
    "path": "pybb/templates/pybb/category.html",
    "content": "{% load i18n pybb_tags %}\n\n<div class=\"category\">\n    <h1>{{ category.name }} {% if category.hidden %}[{% trans 'Hidden' %}]{% endif %}</h1>\n    {% include 'pybb/forum_list.html' with forum_list=category.forums_accessed category=category parent_forum='' %}\n</div>\n"
  },
  {
    "path": "pybb/templates/pybb/delete_post.html",
    "content": "{% extends 'pybb/base.html' %}\n{% load i18n pybb_tags %}\n\n{% block content %}\n    <h1>{% trans 'Are you sure you want to delete this message?' %}</h1>\n    <div class=\"post-preview well\">\n        {{ post.body_html|safe }}\n    </div>\n    <form method=\"post\" action=\".\">\n        {% csrf_token %}\n        <p>\n            <a class=\"btn\" href=\"{{ post.get_absolute_url }}\">← {% trans 'No, take me back' %}</a>\n            <input type=\"submit\" class=\"btn btn-danger\" value=\"{% trans 'Yes, I am sure' %}\" />\n        </p>\n    </form>\n{% endblock content %}\n"
  },
  {
    "path": "pybb/templates/pybb/edit_post.html",
    "content": "{% extends 'pybb/base.html' %}\n{% load pybb_tags i18n static %}\n\n{% block title %}{% trans 'Editing the post' %}{% endblock title %}\n\n{% block extra_head %}\n    {{ block.super }}\n    {{ form.media.css }}\n{% endblock %}\n{% block extra_script %}\n    {{ block.super }}\n    {{ form.media.js }}\n    <script type=\"text/javascript\" src=\"{% static 'pybb/js/jquery.formset.min.js' %}\"></script>\n{% endblock %}\n\n{% block content %}\n    <h1>{% trans 'Editing the post' %}</h1>\n    {% include \"pybb/post_form.html\" %}\n{% endblock content %}\n\n{% block breadcrumb %}\n    {% with extra_crumb=\"Edit post\" %}\n        {% include \"pybb/breadcrumb.html\" %}\n    {% endwith %}\n\n{% endblock %}\n"
  },
  {
    "path": "pybb/templates/pybb/edit_privileges.html",
    "content": "{% extends 'pybb/base.html' %}\n\n{% load i18n pybb_tags %}\n\n{% block title %}{% trans 'Grant moderator privileges' %}{% endblock title %}\n\n{% block content %}\n    <h1>{% trans 'Grant moderator privileges' %}</h1>\n        <form method=\"post\" action=\"\" class=\"privileges-edit\">\n            {% csrf_token %}\n            <fieldset>\n                <div class=\"form-group{% if field.errors %} has-error{% endif %}\">\n                    {% for field in form %}\n                        {% if field.auto_id %}\n                            <label class=\"control-label {% if field.field.required %}{{ form.required_css_class }}{% endif %}\" for=\"{{ field.auto_id }}\">{{ field.label }}</label>\n                        {% endif %}\n\n                        <div class=\"multiple-checkbox\">\n                            {{ field }}\n\n                            {% for error in field.errors %}\n                                <span class=\"help-block {{ form.error_css_class }}\">{{ error }}</span>\n                            {% endfor %}\n\n                            {% if field.help_text %}\n                                <p class=\"help-block\">\n                                    {{ field.help_text|safe }}\n                                </p>\n                            {% endif %}\n                        </div>\n                    {% endfor %}\n                </div>\n            </fieldset>\n            <p>{% include \"pybb/_button_save.html\" %}</p>\n        </form>\n{% endblock content %}\n"
  },
  {
    "path": "pybb/templates/pybb/edit_profile.html",
    "content": "{% extends 'pybb/base.html' %}\n\n{% load i18n pybb_tags %}\n\n{% block title %}{% trans 'Profile editing' %}{% endblock title %}\n\n{% block content %}\n    <h1>{% trans 'Profile editing' %}</h1>\n    {% include 'pybb/avatar.html' with user=user %}\n    <form method=\"post\" enctype=\"multipart/form-data\" class=\"profile-edit\">\n        {% csrf_token %}\n        <fieldset>\n            <legend>{% trans 'Profile editing' %}</legend>\n            {% include \"pybb/form.html\" %}\n            <p>{% include \"pybb/_button_save.html\" %}</p>\n        </fieldset>\n    </form>\n    <h1>{% trans 'Subscriptions on topics' %}</h1>\n    <ul>\n        {% for sub in user.subscriptions.all %}\n            <li>\n                {% pybb_link sub %}\n                &mdash;\n                <strong>\n                    <a href=\"{% url 'pybb:delete_subscription' sub.id %}\">{% trans 'delete' %}</a>\n                </strong>\n            </li>\n        {% endfor %}\n    </ul>\n{% endblock content %}\n"
  },
  {
    "path": "pybb/templates/pybb/feeds/posts_description.html",
    "content": "{{ obj.body_html|safe }}\n"
  },
  {
    "path": "pybb/templates/pybb/feeds/posts_title.html",
    "content": "{% load pybb_tags %}\n{% pybb_get_profile user=obj.user as profile %}\n{{ profile.get_display_name }}: {{ obj.topic.name }} @ {{ obj.topic.forum.name }}\n"
  },
  {
    "path": "pybb/templates/pybb/feeds/topics_description.html",
    "content": "{{ obj.head.body_html|safe }}\n"
  },
  {
    "path": "pybb/templates/pybb/feeds/topics_title.html",
    "content": "{% load pybb_tags %}\n{% pybb_get_profile user=obj.head.user as profile %}\n{{ profile.user }}: {{ obj.name }} @ {{ obj.forum.name }}\n"
  },
  {
    "path": "pybb/templates/pybb/form.html",
    "content": "{% load pybb_tags %}\n{% csrf_token %}\n\n{% include \"pybb/form_errors.html\" %}\n\n{% for field in form.visible_fields %}\n    {% if field.auto_id|endswith:'DELETE' %}\n        {{ field }}\n    {% else %}\n        {% include \"pybb/form_field.html\" %}\n    {% endif %}\n{% endfor %}\n\n{% for field in form.hidden_fields %}\n    {{ field }}\n{% endfor %}\n\n<input type=\"hidden\" name=\"next\" value=\"{{ next }}\" />\n"
  },
  {
    "path": "pybb/templates/pybb/form_errors.html",
    "content": "{% if form.non_field_errors %}\n    {{ form.non_field_errors }}\n{% endif %}\n{% if form.non_form_errors %}\n    {{ form.non_form_errors }}\n{% endif %}"
  },
  {
    "path": "pybb/templates/pybb/form_field.html",
    "content": "{% load pybb_tags %}\n\n<div class=\"{% if field.is_required %}required{% endif %} {% if field.errors %}error{% endif %}\">\n    {% if not hide_labels or hide_labels == 0 %}\n        <label for=\"{{ field.auto_id }}\">\n            {{ field.field.label }}\n        </label>\n    {% endif %}\n    <div class=\"form-control\">\n        {{ field }}\n        {% for error in field.errors %}\n            <span class=\"field-errors\">{{ field.errors }}</span>\n        {% endfor %}\n    </div>\n</div>"
  },
  {
    "path": "pybb/templates/pybb/forum.html",
    "content": "{% extends 'pybb/base.html' %}\n{% load pybb_tags i18n %}\n\n{% block title %}{{ forum.name }}{% endblock title %}\n\n{% block breadcrumb %}\n    {% with forum as object %}\n        {% include \"pybb/breadcrumb.html\" %}\n    {% endwith %}\n{% endblock %}\n\n{% block content %}\n    <div class=\"forum\">\n        <h1>{{ forum.name }}</h1>\n        {% if forum.headline %}\n            <div class=\"forum-headline alert alert-block\">\n                {{ forum.headline|safe }}\n            </div>\n        {% endif %}\n\n        {% include \"pybb/pagination.html\" %}\n\n        {% include 'pybb/forum_list.html' with forum_list=forum.forums_accessed category='' parent_forum=forum %}\n\n        {% include \"pybb/topic_list.html\" %}\n\n        {% include \"pybb/pagination.html\" %}\n\n        <div class=\"controls\">\n            {% if user|pybb_may_create_topic:forum %}\n                {% include \"pybb/_button_new_topic.html\" %}\n            {% endif %}\n            {% include \"pybb/_button_forum_subscription.html\" %}\n        </div>\n    </div>\n{% endblock content %}\n"
  },
  {
    "path": "pybb/templates/pybb/forum_last_update_info.html",
    "content": "{% load pybb_tags %}\n\n{% if forum.updated %}\n    {% pybb_time forum.updated %}\n{% endif %}\n"
  },
  {
    "path": "pybb/templates/pybb/forum_list.html",
    "content": "{% load pybb_tags i18n %}\n\n{% if forum_list %}\n    <table class=\"table {% if category %}category-table{% elif parent_forum %}child-forums-table{% endif %}\">\n        <thead>\n            <tr class=\"forum-row head-row\">\n                <th class=\"forum-name\">\n                    {% trans 'Forum' %}\n                </th>\n                <th class=\"forum-topic-count\">\n                    {% trans 'Topics' %}\n                </th>\n                <th class=\"forum-post-count\">\n                    {% trans 'Posts' %}\n                </th>\n                <th class=\"forum-last-post\">\n                    {% trans 'Last posts' %}\n                </th>\n            </tr>\n        </thead>\n        <tbody>\n        {% for forum in forum_list|pybb_forum_unread:user %}\n            <tr class=\"forum-row\">\n                <td class=\"forum-name {% if forum.unread %} forum-unread{% endif %}\">\n                    <div class=\"state-indicator\"></div>\n                    <a href=\"{{ forum.get_absolute_url }}\">{{ forum.name }}</a> {% if forum.hidden %}[{% trans 'Hidden' %}]{% endif %}\n                    <div class=\"forum-description\">\n                        {{ forum.description|safe }}\n                    </div>\n                </td>\n                <td class=\"forum-topic-count\">\n                    {{ forum.topic_count }}\n                </td>\n                <td class=\"forum-post-count\">\n                    {{ forum.post_count }}\n                </td>\n                <td class=\"forum-last-post\">\n                    {% include \"pybb/forum_last_update_info.html\" %}\n                </td>\n            </tr>\n        {% empty %}\n            {% if category %}\n                <h3>{% trans 'No forums created' %}</h3>\n                <a href=\"{% url 'admin:pybb_forum_add' %}\">{% trans 'Add forum now' %}</a>\n            {%  endif %}\n        {% endfor %}\n        </tbody>\n    </table>\n{% endif %}"
  },
  {
    "path": "pybb/templates/pybb/forum_subscription.html",
    "content": "{% extends 'pybb/base.html' %}\n{% load pybb_tags i18n %}\n\n{% block title %}{% blocktrans with forum=forum.name context 'page title' %}{{ forum }} - Subscription{% endblocktrans %}{% endblock title %}\n\n{% block breadcrumb %}\n    {% with forum as object %}\n        {% include \"pybb/breadcrumb.html\" %}\n    {% endwith %}\n{% endblock %}\n\n{% block content %}\n    <div class=\"forum_subscription\">\n        <h1>{% blocktrans with forum=forum.name context 'content heading' %}{{ forum }} - Subscription{% endblocktrans %}</h1>\n        <form class=\"forum_subscription\" action=\"\" method=\"POST\">\n            {% csrf_token %}\n            {% include \"pybb/form_errors.html\" %}\n            {% with form.type as field %}\n                <div id=\"pybb_subscription_type\">\n                    {% include 'pybb/_select_radio.html' with field=field %}\n                </div>\n            {% endwith %}\n\n            {% with form.topics as field %}\n                <div id=\"pybb_concerned_topics\">\n                    {% include 'pybb/_select_radio.html' with field=field %}\n                </div>\n            {% endwith %}\n            {% for hidden_field in form.hidden_fields %}\n                {{ hidden_field }}\n            {% endfor %}\n            <a class=\"btn btn-link\" href=\"{{ forum.get_absolute_url }}\">{% trans 'Cancel' %}</a>\n            <input type=\"submit\" class=\"btn btn-primary\" value=\"{% trans 'Submit' %}\" />\n        </form>\n    </div>\n{% endblock content %}\n"
  },
  {
    "path": "pybb/templates/pybb/index.html",
    "content": "{% extends 'pybb/base.html' %}\n\n{% load i18n %}\n\n{% block title %}{{ PYBB_DEFAULT_TITLE }}{% endblock title %}\n\n{% block breadcrumb %}\n    {% with extra_crumb=\"Forum\" %}{% include \"pybb/breadcrumb.html\" %}{% endwith %}\n{% endblock %}\n\n{% block content %}\n    {% if categories %}\n        {% for category in categories %}\n            {% include 'pybb/category.html' %}\n        {% endfor %}\n    {% else %}\n        <h2>{% trans 'Forum categories are not created' %}</h2>\n        <a href=\"{% url 'admin:pybb_category_add' %}\">{% trans 'Add a category now' %}</a>\n    {% endif %}\n    {% if  user.is_authenticated %}\n        <div id=\"mark-all-as-read\">\n            <a href=\"{% url 'pybb:topic_latest' %}\">{% trans 'Last updates in topics' %}</a> /\n            <a href=\"{% url 'pybb:mark_all_as_read' %}\">{% trans 'Mark all forums as read' %}</a>\n        </div>\n    {% endif %}\n{% endblock content %}\n"
  },
  {
    "path": "pybb/templates/pybb/latest_topics.html",
    "content": "{% extends 'pybb/base.html' %}\n\n{% load pybb_tags i18n %}\n\n{% block title %}{% trans 'Last updates in topics' %}{% endblock title %}\n\n{% block breadcrumb %}\n    {% with extra_crumb=_(\"Last updates in topics\") %}\n        {% include \"pybb/breadcrumb.html\" %}\n    {% endwith %}\n{% endblock %}\n\n{% block content %}\n    <div class=\"forum\">\n        <h1>{% trans 'Last updates in topics' %}</h1>\n        {% if forum.headline %}\n            <div class=\"forum-headline alert alert-block\">\n                {{ forum.headline|safe }}\n            </div>\n        {% endif %}\n\n        {% include \"pybb/pagination.html\" %}\n\n        {% include \"pybb/topic_list.html\" %}\n\n        {% include \"pybb/pagination.html\" %}\n\n        {% if  user.is_authenticated %}\n            <div id=\"mark-all-as-read\">\n                <a href=\"{% url 'pybb:mark_all_as_read' %}\">\n                    {% trans 'Mark all topics as read' %}\n                </a>\n            </div>\n        {% endif %}\n    </div>\n{% endblock content %}\n"
  },
  {
    "path": "pybb/templates/pybb/mail_templates/base-html.html",
    "content": "{% load i18n pybb_tags %}\n{% pybb_get_profile user=post.user as profile %}\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional //EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>{{ subject|default:'Email' }}</title>\n</head>\n<body style=\"margin:0px; padding:0px;\">{% block content %}{% endblock %}</body>\n</html>\n"
  },
  {
    "path": "pybb/templates/pybb/mail_templates/base.html",
    "content": "{% block content %}{% endblock %}\n"
  },
  {
    "path": "pybb/templates/pybb/mail_templates/forum_subscription_email_body.html",
    "content": "{% load i18n pybb_tags %}\n{% pybb_get_profile user=topic.user as profile %}\n\n{% blocktrans with username=profile.get_display_name forum_name=topic.forum.name %}User {{ username }} post a new topic in forum to which you are subscribed ({{ forum_name }}).{% endblocktrans %}\n{% trans 'Link to topic' %}{% trans ':' %} http://{{site}}{{ topic.get_absolute_url }}\n{% trans 'Link to forum' %}{% trans ':' %} http://{{site}}{{ topic.forum.get_absolute_url }}\n\n-----\n{% blocktrans %}If you don't want to receive notifications on new topics in this forum visit following link{% endblocktrans %}{% trans ':' %} http://{{site}}{{ manage_url }}\n"
  },
  {
    "path": "pybb/templates/pybb/mail_templates/forum_subscription_email_subject.html",
    "content": "{% load i18n %}\n{% trans 'New topic in forum that you subscribed.' %}\n"
  },
  {
    "path": "pybb/templates/pybb/mail_templates/subscription_email_body-html.html",
    "content": "{% extends PYBB_TEMPLATE_MAIL_HTML|default:\"pybb/mail_templates/base-html.html\" %}\n{% load i18n pybb_tags %}\n{% block content %}\n    {% pybb_get_profile user=post.user as profile %}\n    {% with link_end='</a>'|safe %}\n        <p>\n            {% blocktrans with username=profile.get_display_name %}User {{ username }} replied in topic to which you are subscribed.{% endblocktrans%}\n        </p>\n        <p>\n             {% blocktrans with topic_name=post.topic.name link_post_start='<a href=\"'|add:post_url|add:'\">'|safe link_topic_start='<a href=\"'|add:topic_url|add:'\">'|safe %}Follow {{ link_post_start }}this link{{ link_end }} to see the new post on the topic {{ link_topic_start }}{{ topic_name }}{{ link_end }}.{% endblocktrans%}\n        </p>\n\n        <hr />\n        {% blocktrans with link_start='<a href=\"'|add:delete_url_full|add:'\">'|safe %}If you don't want to receive notifications on new posts in this topic visit {{ link_start}}this link{{ link_end }}.{% endblocktrans%}\n    {% endwith %}\n{% endblock %}\n"
  },
  {
    "path": "pybb/templates/pybb/mail_templates/subscription_email_body.html",
    "content": "{% extends PYBB_TEMPLATE_MAIL_TXT|default:\"pybb/mail_templates/base.html\" %}\n{% load i18n pybb_tags %}\n{% block content %}{% pybb_get_profile user=post.user as profile %}{% autoescape off %}{% blocktrans with username=profile.get_display_name %}User {{ username }} replied in topic to which you are subscribed.{% endblocktrans%}\n{% trans 'Link to post' %}{% trans ':' %} {{ post_url }}\n{% trans 'Link to topic' %}{% trans ':' %} {{ topic_url }}\n\n-----\n{% blocktrans %}If you don't want to receive notifications on new messages in this topic visit following link: {{ delete_url_full }}{% endblocktrans %} \n{% endautoescape %}\n{% endblock %}\n"
  },
  {
    "path": "pybb/templates/pybb/mail_templates/subscription_email_subject.html",
    "content": "{% load i18n %}\n{% trans 'New answer in topic that you subscribed.' %}\n"
  },
  {
    "path": "pybb/templates/pybb/markup/bbcode_widget.html",
    "content": "{% load i18n %}\n\n{{ widget_output }}\n\n<script type=\"text/javascript\">\nif(!window.pybb){\n    window.pybb = {};\n}\nif(!window.pybb.get_markitup_settings){\n    window.pybb.get_markitup_settings = function() {\n        var mySettings = new Array();\n        mySettings['previewParserPath'] = '{% url 'pybb:post_ajax_preview' %}';\n        mySettings['previewPosition'] = 'before';\n        mySettings['resizeHandle'] = true;\n        mySettings['markupSet'] = [\n            {name:'{% trans \"Bold\" as txt %}{{ txt|escapejs }}', key:'B', openWith:'[b]', closeWith:'[/b]'},\n            {name:'{% trans \"Italic\" as txt %}{{ txt|escapejs }}', key:'I', openWith:'[i]', closeWith:'[/i]'},\n            {name:'{% trans \"Underline\" as txt %}{{ txt|escapejs }}', key:'U', openWith:'[u]', closeWith:'[/u]'},\n            {name:'{% trans \"Stroke\" as txt %}{{ txt|escapejs }}', key:'S', openWith:'[s]', closeWith:'[/s]'},\n            {separator:'---------------' },\n            {name:'{% trans \"Picture\" as txt %}{{ txt|escapejs }}', key:'P', replaceWith:'[img][![Url]!][/img]'},\n            {name:'{% trans \"Link\" as txt %}{{ txt|escapejs }}', key:'L', openWith:'[url=[![Url]!]]', closeWith:'[/url]', placeHolder:'{% trans 'Your text to link here...' %}'},\n            {separator:'---------------' },\n            {name:'{% trans \"Bulleted list\" as txt %}{{ txt|escapejs }}', openWith:'[list]\\n', closeWith:'\\n[/list]'},\n            {name:'{% trans \"Numeric list\" as txt %}{{ txt|escapejs }}', openWith:'[list=[![Starting number]!]]\\n', closeWith:'\\n[/list]'},\n            {name:'{% trans \"List item\" as txt %}{{ txt|escapejs }}', openWith:'[*] '},\n            {separator:'---------------' },\n            {name:'{% trans \"Quotes\" as txt %}{{ txt|escapejs }}', openWith:'[quote]', closeWith:'[/quote]'},\n            {name:'{% trans \"Code\" as txt %}{{ txt|escapejs }}', openWith:'[code]', closeWith:'[/code]'},\n            {separator:'---------------' },\n            {name:'{% trans \"Clean\" as txt %}{{ txt|escapejs }}', className:\"clean\", replaceWith:function(markitup) { return markitup.selection.replace(/\\[(.*?)\\]/g, \"\") } },\n            {name:'{% trans \"Preview\" as txt %}{{ txt|escapejs }}', className:\"preview\", call:'preview' }\n        ];\n        return mySettings ;\n    };\n    window.pybb.insert_image = function(url){\n        $.markItUp({replaceWith: '[img]'+url+'[/img]'});\n    }\n    window.pybb.insert_link = function(url, name){\n        $.markItUp({replaceWith: '[url='+url+']'+name+'[/url]'});\n    }\n}\n\nif (!window.pybb.markup) {\n    /*\n     This object will be used to perform some action specific to the current Markup engine.\n     eg : quote button, SHIT + click on an username, etc.\n     */\n    window.pybb.markup = {\n        quote: function (text, username) {\n            return '[quote' + (username ? ('=\"' + username + '\"') : '') + ']' + text + '[/quote]\\n';\n        },\n        username: function (username) {\n            return '[b]' + username + '[/b], ';\n        }\n    }\n}\n</script>\n"
  },
  {
    "path": "pybb/templates/pybb/markup/markdown_widget.html",
    "content": "{% load i18n %}\n\n{{ widget_output }}\n\n\n<script type=\"text/javascript\">\nif(!window.pybb){\n    window.pybb = {};\n}\nif(!window.pybb.get_markitup_settings){\n    window.pybb.get_markitup_settings = function() {\n        var mySettings = new Array();\n        mySettings['previewParserPath'] = '{% url 'pybb:post_ajax_preview' %}';\n        mySettings['previewPosition'] = 'before';\n        mySettings['resizeHandle'] = true;\n        mySettings['markupSet'] = [\n            {name:'{% trans \"First Level Heading\" as txt %}{{ txt|escapejs }}', key:'1', placeHolder:'{% trans \"Your title here...\" as txt %}{{ txt|escapejs }}', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '=') } },\n            {name:'{% trans \"Second Level Heading\" as txt %}{{ txt|escapejs }}', key:'2', placeHolder:'{% trans \"Your title here...\" as txt %}{{ txt|escapejs }}', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '-') } },\n            {name:'{% trans \"Heading 3\" as txt %}{{ txt|escapejs }}', key:'3', openWith:'### ', placeHolder:'{% trans 'Your title here...' %}' },\n            {name:'{% trans \"Heading 4\" as txt %}{{ txt|escapejs }}', key:'4', openWith:'#### ', placeHolder:'{% trans 'Your title here...' %}' },\n            {name:'{% trans \"Heading 5\" as txt %}{{ txt|escapejs }}', key:'5', openWith:'##### ', placeHolder:'{% trans 'Your title here...' %}' },\n            {name:'{% trans \"Heading 6\" as txt %}{{ txt|escapejs }}', key:'6', openWith:'###### ', placeHolder:'{% trans 'Your title here...' %}' },\n            {separator:'---------------' },\n            {name:'{% trans \"Bold\" as txt %}{{ txt|escapejs }}', key:'B', openWith:'**', closeWith:'**'},\n            {name:'{% trans \"Italic\" as txt %}{{ txt|escapejs }}', key:'I', openWith:'_', closeWith:'_'},\n            {separator:'---------------' },\n            {name:'{% trans \"Bulleted List\" as txt %}{{ txt|escapejs }}', openWith:'- ' },\n            {name:'{% trans \"Numeric List\" as txt %}{{ txt|escapejs }}', openWith:function(markItUp) {\n                return markItUp.line+'. ';\n            }},\n            {separator:'---------------' },\n            {name:'{% trans \"Picture\" as txt %}{{ txt|escapejs }}', key:'P', replaceWith:'![[![Alternative text]!]]([![Url:!:http://]!] \"[![Title]!]\")'},\n            {name:'{% trans \"Link\" as txt %}{{ txt|escapejs }}', key:'L', openWith:'[', closeWith:']([![Url:!:http://]!] \"[![Title]!]\")', placeHolder:'{% trans 'Your text to link here...' %}' },\n            {separator:'---------------'},\n            {name:'{% trans \"Quotes\" as txt %}{{ txt|escapejs }}', openWith:'> '},\n            {name:'{% trans \"Code Block / Code\" as txt %}{{ txt|escapejs }}', openWith:'(!(\\t|!|`)!)', closeWith:'(!(`)!)'},\n            {separator:'---------------'},\n            {name:'{% trans \"Preview\" as txt %}{{ txt|escapejs }}', call:'preview', className:\"preview\"}\n        ];\n        return mySettings ;\n    };\n    window.pybb.insert_image = function(url){\n        $.markItUp({replaceWith: '![]('+url+')'});\n    }\n    window.pybb.insert_link = function(url, name){\n        $.markItUp({replaceWith: '['+name+']('+url+')'});\n    }\n}\n\nif (!window.pybb.markup) {\n    /*\n     This object will be used to perform some action specific to the current Markup engine.\n     eg : quote button, SHIT + click on an username, etc.\n     */\n    window.pybb.markup = {\n        quote: function (text, username) {\n            var output = '';\n            if (username) {\n                output += '> **' + username + '**: ';\n            } else {\n                output += '> ';\n            }\n            output += text.replace(/\\n/g, '  \\n> ');\n            return output;\n        },\n        username: function (username) {\n            return '**' + username + '**, ';\n        }\n    }\n}\n</script>\n"
  },
  {
    "path": "pybb/templates/pybb/move_post.html",
    "content": "{% extends 'pybb/base.html' %}\n{% load i18n pybb_tags %}\n\n{% block content %}\n\n    {% if post.is_topic_head %}\n        <h1>{% blocktrans with topic=post.topic %}Move topic \"{{ topic }}\"{% endblocktrans %}</h1>\n    {% else %}\n        <h1>{% blocktrans with topic=post.topic %}Split posts from topic \"{{ topic }}\"{% endblocktrans %}</h1>\n    {% endif %}\n    <form method=\"post\" action=\".\" class=\"move-post-form\">\n        {% csrf_token %}\n        <fieldset>\n            {% if not post.is_topic_head %}\n            {% pybb_get_profile post.user as author %}\n            <div>\n                <label>{% blocktrans with author.get_display_name as author_name %}Starting post by {{ author_name }}{% endblocktrans %}</label>\n                <div class=\"post-preview well\">\n                    {{ post.body_html|safe|truncatewords_html:20 }}\n                </div>\n            </div>\n            {% endif %}\n            {% include \"pybb/form_errors.html\" %}\n            {% if form.move_to %} {% include \"pybb/form_field.html\" with field=form.move_to %} {% endif %}\n            {% if form.number %} {% include \"pybb/form_field.html\" with field=form.number %} {% endif %}\n            {% if form.name %} {% include \"pybb/form_field.html\" with field=form.name %} {% endif %}\n            {% if form.slug %} {% include \"pybb/form_field.html\" with field=form.slug %} {% endif %}\n        </fieldset>\n\n        <p class=\"submit\">\n            <a class=\"btn\" href=\"{{ post.get_absolute_url }}\">{% trans 'Cancel' %}</a>\n            <input type=\"submit\" class=\"btn btn-danger\" value=\"{% if post.is_topic_head %}{% trans 'Move this topic' %}{% else %}{% trans \"Split posts\" %}{% endif %}\" />\n        </p>\n    </form>\n{% endblock content %}\n"
  },
  {
    "path": "pybb/templates/pybb/pagination.html",
    "content": "{% load i18n %}\n\n{% if is_paginated %}\n    <div class=\"pagination\">\n        <ul>\n            <li class=\"prev {% if not page_obj.has_previous %}disabled{% endif %}\">\n                <a href=\"{% if page_obj.has_previous %}?page={{ page_obj.previous_page_number }}{% endif %}\">← {% trans 'previous page' %}</a>\n            </li>\n            {% for page in page_obj.pages %}\n                {% if page %}\n                    <li {% if page == page_obj.number %}class=\"disabled\"{% endif %}>\n                       <a href=\"?{{ page.querystring }}\" class=\"page\">{{ page }}</a>\n                    </li>\n                {% else %}\n                    <li class=\"disabled\">\n                       <a href=\"#\">...</a>\n                    </li>\n                {% endif %}\n            {% endfor %}\n            <li class=\"next {% if not page_obj.has_next %}disabled{% endif %}\">\n                <a href=\"{% if page_obj.has_next %}?page={{ page_obj.next_page_number }}{% endif %}\" >{% trans 'next page' %} →</a>\n            </li>\n        </ul>\n    </div>\n{% endif %}\n"
  },
  {
    "path": "pybb/templates/pybb/poll.html",
    "content": "{% load i18n pybb_tags %}\n\n<div class=\"poll\">\n  <h2>{% trans 'Poll' %}</h2>\n  <table class=\"table table-bordered poll\">\n    <thead>\n    <tr class=\"poll-question\">\n      <th colspan=\"2\">\n        {{ topic.poll_question }}\n      </th>\n    </tr>\n    </thead>\n\n    <tbody class=\"poll-answers\">\n    {% if request.user.is_authenticated %}\n      {% if user|pybb_may_vote_in_topic:topic and topic|pybb_topic_poll_not_voted:request.user %}\n        <tr class=\"poll-answer-choice\">\n          <td>\n            <form class=\"poll-form\" action=\"{% url 'pybb:topic_poll_vote' topic.pk %}\" method=\"post\">\n              {% include \"pybb/form.html\" with form=poll_form %}\n              <p class=\"submit\">{% include \"pybb/_button_submit.html\" %}</p>\n            </form>\n          </td>\n        </tr>\n      {% else %}\n        {% for answer in topic.poll_answers.all %}\n          <tr class=\"poll-answer\">\n            <td>{{ answer }}</td>\n            <td>{{ answer.votes }} ({{ answer.votes_percent|floatformat:2 }} %)</td>\n          </tr>\n        {% endfor %}\n        {% if user|pybb_may_vote_in_topic:topic %}\n        <tr>\n          <td colspan=\"2\">\n            <form action=\"{% url 'pybb:topic_cancel_poll_vote' pk=topic.pk %}\" method=\"post\">{% csrf_token %}\n              {% with submit_text=_('Cancel my poll vote') %}\n                {% include \"pybb/_button_submit.html\" %}\n              {% endwith %}\n            </form>\n          </td>\n        </tr>\n        {% endif %}\n      {% endif %}\n    {% else %}\n      {% for answer in topic.poll_answers.all %}\n        <tr class=\"poll-answer\">\n          <td colspan=\"2\">{{ answer }}</td>\n        </tr>\n      {% endfor %}\n    {% endif %}\n    </tbody>\n  </table>\n</div>\n"
  },
  {
    "path": "pybb/templates/pybb/poll_edit_form.html",
    "content": "{% load i18n %}\n{% include \"pybb/form_field.html\" with field=form.poll_type %}\n<div id=\"poll-question\">\n  {% include \"pybb/form_field.html\" with field=form.poll_question %}\n</div>\n<div id=\"poll-answers-formset\" style=\"display: none;\">\n  <br>{% trans 'Poll answers' %}\n    {% include \"pybb/form_errors.html\" with form=pollformset %}\n    {% for form_answer in pollformset %}\n        <div class=\"poll-answer-form\">\n            {% include \"pybb/form.html\" with form=form_answer hide_labels=1 %}\n        </div>\n    {% endfor %}\n  {{ pollformset.management_form }}\n</div>\n\n<script type=\"text/javascript\">\n  window.onload = function () {\n    $('div#poll-answers-formset div.poll-answer-form').formset({\n      deleteText:'{% trans \"remove answer\" as txt %}{{ txt|escapejs }}',\n      addText:'{% trans \"add answer\" as txt %}{{ txt|escapejs }}',\n      prefix: 'poll_answers'\n    });\n\n    var toggle_poll_answers_formset = function (poll_type) {\n      if (poll_type === \"0\") {\n        $('div#poll-answers-formset').hide();\n        $('div#poll-question').hide();\n      } else {\n        $('div#poll-answers-formset').show();\n        $('div#poll-question').show();\n      }\n    };\n\n    $('#id_poll_type').each(function () {\n      toggle_poll_answers_formset($(this).val());\n    }).change(function () {\n      toggle_poll_answers_formset($(this).val());\n    });\n  };\n</script>"
  },
  {
    "path": "pybb/templates/pybb/post_form.html",
    "content": "{% load i18n pybb_tags static %}\n<form class=\"post-form\" action=\"\n    {% if forum %}\n        {% url 'pybb:add_topic' forum.pk %}\n    {% else %}\n        {% if topic %}\n            {% url 'pybb:add_post' topic.pk %}\n        {% else %}\n            {% url 'pybb:edit_post' pk=object.pk %}\n        {% endif %}\n    {% endif %}\" method=\"post\" enctype=\"multipart/form-data\">\n  {% csrf_token %}\n  <fieldset>\n    {% include \"pybb/form_errors.html\" %}\n    {% if form.name %} {% include \"pybb/form_field.html\" with field=form.name %} {% endif %}\n    {% if form.slug %} {% include \"pybb/form_field.html\" with field=form.slug %} {% endif %}\n    {% if form.login %} {% include \"pybb/form_field.html\" with field=form.login %}  {% endif %}\n    {% if form.body %} {% include \"pybb/form_field.html\" with field=form.body %}  {% endif %}\n    <div id=\"emoticons\">\n    {% for smile, url in form.available_smiles.items %}\n        {% with form.smiles_prefix|add:url as static_smiley %}\n            <a href=\"#\" title=\"{{ smile|safe }}\"><img src=\"{% static static_smiley %}\"></a>\n        {% endwith %}\n    {% endfor %}\n    </div>\n\n    {% if request.user|pybb_may_create_poll and form.poll_type %}\n      {% include \"pybb/poll_edit_form.html\" %}\n    {% endif %}\n    {% include \"pybb/attachments_formset.html\" %}\n    <p class=\"submit\">{% include \"pybb/_button_submit.html\" %}</p>\n  </fieldset>\n</form>\n"
  },
  {
    "path": "pybb/templates/pybb/post_template.html",
    "content": "{% load i18n pybb_tags static %}\n\n{% pybb_get_profile user=post.user as post_user_profile %}\n{% pybb_get_profile user=user as user_profile %}\n\n<a name=\"post-{{ post.id }}\"></a> {# may be remove this string? #}\n<table class=\"table table-bordered post {% if post.on_moderation %}on-moderation{% endif %}\" id=\"post-{{ post.id }}\">\n    <thead class=\"post-header\">\n    <tr>\n    <th colspan=\"2\">\n        <a class=\"permalink\" href=\"{{ post.get_absolute_url }}\">#</a>\n        <span class=\"updated\">{% pybb_time post.created %}</span>\n    </th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr class=\"post-row\">\n        <td class=\"post-info\">\n            {% include \"pybb/avatar.html\" with user=post.user %}\n\n            <div class=\"post-author\">\n                <a href=\"{{ post_user_profile.get_absolute_url }}\">\n                    <span class=\"post-username\">{{ post_user_profile.get_display_name }}</span>\n                </a>\n            </div>\n            {% if post_user_profile.rank %}\n                <div class=\"rank\">\n                    {% blocktrans with rank=post_user_profile.rank %}Rank: {{ rank }}{% endblocktrans %}\n                    {% if  user.is_authenticated and user != post.user %}\n                        <a href=\"#\" class=\"vote\" rel=\"{{ post_user_profile.get_vote_up_url }}\">+</a>\n                        <a href=\"#\" class=\"vote\" rel=\"{{ post_user_profile.get_vote_down_url }}\">-</a>\n                    {% endif %}\n                </div>\n            {% endif %}\n            {% if user.is_superuser %}\n                <div class=\"post-extra-info\">{{ post.user_ip }}</div>\n            {% endif %}\n\n            <div class=\"post-controls\">\n                {% if user|pybb_may_edit_post:post %}\n                    <a href=\"{% url 'pybb:edit_post' pk=post.id %}\">{% trans 'Edit' %}</a>\n                {% endif %}\n                {% if user|pybb_may_delete_post:post %}\n                    <a onclick=\"pybb_delete_post('{% url 'pybb:delete_post' post.id %}',\n                            'post-{{ post.id }}', '{% trans 'Delete post?' as txt %}{{ txt|escapejs }}'); return false;\"\n                       href=\"{% url 'pybb:delete_post' post.id %}\">{% trans 'Delete' %}</a>\n                {% endif %}\n                {% if post.on_moderation and user.is_moderator %}\n                    <a href=\"{% url 'pybb:moderate_post' pk=post.id %}\">{% trans 'Approve post' %}</a>\n                {% endif %}\n                {% if user.is_moderator %}\n                    <a href=\"{% url 'pybb:move_post' pk=post.id %}\">{% if post.is_topic_head %}{% trans 'Move' %}{% else %}{% trans \"Split\" %}{% endif %}</a>\n                {% endif %}\n\n                {% if user|pybb_may_admin_post:post %}\n                    <a href=\"{% url 'admin:pybb_post_change' post.id %}\">{% trans 'Admin' %}</a>\n                {% endif %}\n\n            </div>\n        </td>\n        <td class=\"post-content\">\n            {{ post.body_html|safe }}\n\n            {% if not  user.is_authenticated or user_profile.show_signatures %}\n                {% if post_user_profile.signature %}\n                    <div class=\"post-signature\">\n                        {{ post_user_profile.signature_html|safe }}\n                    </div>\n                {% endif %}\n            {% endif %}\n            {% if post.updated %}\n                <div class=\"updated-message\">{% trans 'Edited' %} {% pybb_time post.updated %}</div>\n            {% endif %}\n\n            {% comment %}\n                    {% if post.attachment_cache %}\n                    {% for attach in post.attachment_cache %}\n                    <br/>\n                    {% trans 'Attachment' %}{% trans ':' %} <a href=\"{{ attach.get_absolute_url }}\">{{ attach.name }}</a> ({{ attach.size_display }})\n                    {% endfor %}\n                    {% endif %}\n            {% endcomment %}\n            <div class=\"post-related\">\n                {% if user|pybb_may_create_post:post.topic %}\n                    <a href=\"{% url 'pybb:add_post' topic.id %}?quote_id={{ post.id }}\" class=\"quote-link\">{% trans 'quote' %}</a>\n                    <a href=\"#\" class=\"quote-selected-link\">{% trans 'quote selected' %}</a>\n                {% endif %}\n                <div class=\"attachments\">\n                    {% for attachment in post.attachments.all %}\n                        <a href=\"{{ attachment.file.url }}\"><img src=\"{% static 'pybb/img/attachment.png' %}\"> {{ attachment.size_display }}</a>\n                    {% endfor %}\n                </div>\n            </div>\n        </td>\n    </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "pybb/templates/pybb/topic.html",
    "content": "{% extends 'pybb/base.html' %}\n\n{% load pybb_tags i18n static %}\n\n{% block title %}{{ topic }}{% endblock %}\n\n{% block extra_head %}\n    {{ block.super }}\n    {{ form.media.css }}\n{% endblock %}\n{% block extra_script %}\n    {{ block.super }}\n    {{ form.media.js }}\n    <script type=\"text/javascript\" src=\"{% static 'pybb/js/jquery.formset.min.js' %}\"></script>\n{% endblock %}\n\n{% block breadcrumb %}\n    {% with object=topic %}\n        {% include \"pybb/breadcrumb.html\" %}\n    {% endwith %}\n{% endblock %}\n\n{% block content %}\n    <div class=\"topic\">\n        <h1>{{ topic.name }}</h1>\n        {% include \"pybb/pagination.html\" %}\n\n        {% if topic.poll_type %}\n            {% include 'pybb/poll.html' %}\n        {% endif %}\n\n        <div class=\"posts\">\n            {% if first_post and first_post != post_list.0 %}\n                <div class=\"first_post\">{% include \"pybb/post_template.html\" with first_post=post %}</div>\n            {% endif %}\n            {% for post in post_list %}\n                {% cycle 'odd' 'even' as rowcolors silent %}\n                {% include \"pybb/post_template.html\" %}\n            {% endfor %}\n        </div>\n        <div>&nbsp;</div>\n        {% with _('Posts') as label %}\n            {% include \"pybb/pagination.html\" %}\n        {% endwith %}\n\n        {% if  user.is_authenticated %}\n            {% if user.is_moderator or user.is_subscribed or user|pybb_may_subscribe_topic:topic %}\n                <div class=\"controls\">\n                    {% if user.is_moderator %}\n                        {% if topic.sticky %}\n                            <a href=\"{% url 'pybb:unstick_topic' topic.id %}\">{% trans 'Unstick topic' %}</a> /\n                        {% else %}\n                            <a href=\"{% url 'pybb:stick_topic' topic.id %}\">{% trans 'Stick topic' %}</a> /\n                        {% endif %}\n\n                        {% if topic.closed %}\n                            <a href=\"{% url 'pybb:open_topic' topic.id %}\">{% trans 'Open topic' %}</a> /\n                        {% else %}\n                            <a href=\"{% url 'pybb:close_topic' topic.id %}\">{% trans 'Close topic' %}</a> /\n                        {% endif %}\n                        {% if perms.pybb.change_topic and user.is_staff %}\n                            <a href=\"{% url 'admin:pybb_topic_change' topic.id %}\">{% trans 'Admin' %}</a> /\n                        {% endif %}\n                        {% comment %}\n                            <a href=\"{% url 'pybb:merge_topics' %}?topic={{ topic.id }}\">{% trans 'Merge topics' %}</a> /\n                        {% endcomment %}\n                    {% endif %}\n                    {% if user.is_subscribed %}\n                        <a href=\"{% url 'pybb:delete_subscription' topic.id %}?from_topic\">{% trans 'Unsubscribe' %}</a>\n                    {% elif user|pybb_may_subscribe_topic:topic %}\n                        <a href=\"{% url 'pybb:add_subscription' topic.id %}\">{% trans 'Subscribe' %}</a>\n                    {% endif %}\n                </div>\n            {% endif %}\n        {% endif %}\n\n        {% if user|pybb_may_create_post:topic %}\n            {% include \"pybb/post_form.html\" %}\n        {% else %}\n            {% if not  user.is_authenticated %}\n                {% include 'pybb/_need_to_login_message.html' %}\n            {% endif %}\n        {% endif %}\n\n        {% if user.is_staff %}\n            <div class=\"subscriber-list\">\n                {% trans 'Subscribers' %}{% trans ':' %}\n                {% for subscriber in topic.subscribers.all %}\n                    {% pybb_get_profile user=subscriber as subscriber_profile %}\n                    <a href=\"{% url 'pybb:user' subscriber.get_username %}\">\n                        {{ subscriber_profile.get_display_name }}\n                    </a>\n                    {% if not forloop.last %},{% endif %}\n                {% endfor %}\n            </div>\n        {% endif %}\n    </div>\n{% endblock %}\n"
  },
  {
    "path": "pybb/templates/pybb/topic_last_message_info.html",
    "content": "{% load pybb_tags %}\n\n{% if topic.updated %}\n    {% pybb_time topic.updated %}\n{% endif %}\n"
  },
  {
    "path": "pybb/templates/pybb/topic_list.html",
    "content": "{% load i18n pybb_tags %}\n\n<table class=\"table topic-list\">\n    <thead>\n        <tr class=\"topic-row head-row\">\n            <th class=\"topic-name\">\n                {% trans 'Topic' %}\n            </th>\n            <th class=\"topic-post-count\">\n                {% trans 'Posts' %}\n            </th>\n            <th class=\"topic-view-count\">\n                {% trans 'Views' %}\n            </th>\n            <th class=\"topic-last-post\">\n                {% trans 'Last post' %}\n            </th>\n        </tr>\n    </thead>\n    <tbody>\n    {% for topic in topic_list|pybb_topic_unread:user %}\n        <tr class=\"topic-row {% if topic.sticky %} sticky {% endif %} {% cycle \"odd\" \"even\" %} {% if topic.on_moderation %} on-moderation {% endif %}\">\n            <td class=\"topic-name{% if topic.unread %} topic-unread{% endif %}\">\n                <div class=\"state-indicator\"></div>\n                <a href=\"{{ topic.get_absolute_url }}\">{{ topic.name|truncatewords:10 }}</a>\n                <a href=\"{{ topic.get_absolute_url }}?first-unread=1\" class=\"first-unread-post-link\" title=\"{% trans 'Go to first unread post' %}\">⇨</a>\n                {% if topic.sticky %} &nbsp;[{% trans 'Sticky' %}] {% endif %}\n                {% if topic.closed %} &nbsp;[{% trans 'Closed' %}] {% endif %}\n                {% with topic|pybb_topic_inline_pagination as pages %}\n                    {% if pages|length > 1 %}\n                        <span class=\"mini-pagination\">\n                            {% trans 'pages' %}{% trans ':' %}\n                            {% for page in pages %}\n                                <span class=\"page\">\n                                {% if page == '...' %}\n                                    ...\n                                {% else %}\n                                    <a href=\"{{ topic.get_absolute_url }}?page={{ page }}\">{{ page }}</a>\n                                {% endif %}\n                                </span>\n                            {% endfor %}\n                        </span>\n                    {% endif %}\n                {% endwith %}\n            </td>\n            <td class=\"topic-post-count\">\n                {{ topic.post_count }}\n            </td>\n            <td class=\"topic-view-count\">\n                {{ topic|pybbm_calc_topic_views }}\n            </td>\n            <td class=\"topic-last-post\">\n                {% include \"pybb/topic_last_message_info.html\" %}\n            </td>\n        </tr>\n    {% endfor %}\n    </tbody>\n</table>"
  },
  {
    "path": "pybb/templates/pybb/user.html",
    "content": "{% extends 'pybb/base.html' %}\n\n{% load pybb_tags i18n %}\n\n{% block title %}\n    {% pybb_get_profile target_user as target_profile %}\n    {{ target_profile.get_display_name }}\n{% endblock %}\n\n{% block content %}\n    {% pybb_get_profile target_user as target_profile %}\n    <h1>{{ target_profile.get_display_name }}</h1>\n    <div class=\"userinfo\">\n        {% include 'pybb/avatar.html' with user=target_user %}\n        <div class=\"info\">\n            <div class=\"label\">{% trans 'Statistics' %}</div>\n            <div>\n                <a href=\"{% url 'pybb:user_topics' target_user.get_username %}\">\n                    {% blocktrans with count=topic_count %}Number of topics: {{ count }}{% endblocktrans %}\n                </a>\n            </div>\n            <div>\n                <a href=\"{% url 'pybb:user_posts' target_user.get_username %}\">\n                    {% blocktrans with count=target_profile.post_count %}Number of posts: {{ count }}{% endblocktrans %}\n                </a>\n            </div>\n            <div>\n                {% pybb_get_time target_user.date_joined as date_joined %}\n                {% blocktrans %}Date of registration: {{ date_joined }} {% endblocktrans %}\n            </div>\n        </div>\n        <div class=\"clear\"></div>\n    </div>\n    <div class=\"controls\">\n        {% if request.user|pybb_may_manage_moderators %}\n            <a href=\"{% url 'pybb:edit_privileges' target_user.get_username %}\" class=\"btn\">{% trans 'Moderator' %}</a>\n        {% endif %}\n        {% if perms.pybb.block_users %}\n            {% if target_user.is_active %}\n                <form action=\"{% url 'pybb:block_user' target_user.get_username %}\" method=\"post\">{% csrf_token %}\n                    <button type=\"submit\">{% trans 'Block' %}</button>\n                    <button type=\"submit\" name=\"block_and_delete_messages\">{% trans 'Block and delete all messages' %}</button>\n                </form>\n            {% else %}\n                <form action=\"{% url 'pybb:unblock_user' target_user.get_username %}\" method=\"post\">{% csrf_token %}\n                    <button type=\"submit\">{% trans 'Unblock' %}</button>\n                </form>\n            {% endif %}\n        {% endif %}\n        {% if target_user.id == user.id %}\n            <a href=\"{% url 'pybb:edit_profile' %}\">{% trans 'Edit' %}</a>\n        {% endif %}\n    </div>\n\n{% endblock %}\n"
  },
  {
    "path": "pybb/templates/pybb/user_posts.html",
    "content": "{% extends 'pybb/base.html' %}\n\n{% load pybb_tags i18n %}\n\n{% block breadcrumb %}\n    {% pybb_get_profile target_user as target_profile %}\n    {% include \"pybb/breadcrumb.html\" with object=target_profile extra_crumb=_('Posts') %}\n{% endblock %}\n\n{% block title %}\n    {% pybb_get_profile target_user as target_profile %}\n    {% trans 'All posts created by' %} {{ target_profile.get_display_name }}\n{% endblock %}\n\n{% block content %}\n    {% pybb_get_profile target_user as target_profile %}\n    <h1>{% trans 'All posts created by' %} <a href=\"{{ target_profile.get_absolute_url }}\">{{ target_profile.get_display_name }}</a></h1>\n    <div class=\"userinfo\">\n        {% include \"pybb/pagination.html\" %}\n\n        {% for post in object_list %}\n            {% cycle 'odd' 'even' as rowcolors silent %}\n            {% include \"pybb/post_template.html\" with topic=post.topic %}\n        {% endfor %}\n\n        {% include \"pybb/pagination.html\" %}\n\n    </div>\n{% endblock %}\n"
  },
  {
    "path": "pybb/templates/pybb/user_topics.html",
    "content": "{% extends 'pybb/base.html' %}\n\n{% load pybb_tags i18n %}\n\n{% block breadcrumb %}\n    {% pybb_get_profile target_user as target_profile %}\n    {% include \"pybb/breadcrumb.html\" with object=target_profile extra_crumb=_('Topics') %}\n{% endblock %}\n\n{% block title %}\n    {% pybb_get_profile target_user as target_profile %}\n    {% trans 'All topics created by' %} {{ target_profile.get_display_name }}\n{% endblock %}\n\n{% block content %}\n    {% pybb_get_profile target_user as target_profile %}\n    <h1>{% trans 'All topics created by' %} <a href=\"{{ target_profile.get_absolute_url }}\">{{ target_profile.get_display_name }}</a></h1>\n\n    {% include \"pybb/pagination.html\" %}\n\n    {% include 'pybb/topic_list.html' with topic_list=object_list %}\n\n    {% include \"pybb/pagination.html\" %}\n\n{% endblock %}\n"
  },
  {
    "path": "pybb/templates/pybb/users.html",
    "content": "{% extends 'pybb/base.html' %}\n\n{# DEPRECATED AND WILL BE REMOVED IN NEXT VERSION #}\n\n{% load pybb_tags i18n %}\n\n{% block content %}\n    <h1>{% trans 'Users' %}</h1>\n    <form method=\"get\" class=\"filter_form\">\n        {% csrf_token %}\n        {{ form.query }}\n        <input type=\"submit\" class=\"btn btn-primary\" value=\"{% trans 'Search' %}\"/>\n    </form>\n    <ul class=\"users\">\n        {% for profile in page.object_list %}\n            <li class=\"user\">\n                <span class=\"author\">{{ profile.get_display_name }}</span>\n                <span class=\"post_count\">{{ profile.post_count }}</span>\n                <span class=\"updated\">{{ profile.date_joined|date:\"d M Y\" }}</span>\n            </li>\n        {% endfor %}\n    </ul>\n\n    {% with _('Users') as label %}\n        {% include \"pybb/pagination.html\" %}\n    {% endwith %}\n\n{% endblock %}\n"
  },
  {
    "path": "pybb/templatetags/__init__.py",
    "content": ""
  },
  {
    "path": "pybb/templatetags/pybb_tags.py",
    "content": "import inspect\n\nimport math\nimport time\nimport warnings\n\nimport django\nfrom django import template\nfrom django.core.cache import cache\nfrom django.utils.safestring import mark_safe\nfrom django.utils.encoding import smart_str\nfrom django.utils.html import escape\nfrom django.utils.translation import gettext as _, ngettext\nfrom django.utils import dateformat\nfrom django.utils.timezone import timedelta\nfrom django.utils.timezone import now as tznow\n\nfrom pybb.models import TopicReadTracker, ForumReadTracker, PollAnswerUser, Topic, Post\nfrom pybb.permissions import perms\nfrom pybb import defaults, util, compat\n\n\nregister = template.Library()\nif django.VERSION >= (1, 9):\n    register.assignment_tag = register.simple_tag\n\n\n#noinspection PyUnusedLocal\n@register.tag\ndef pybb_time(parser, token):\n    try:\n        tag, context_time = token.split_contents()\n    except ValueError: # pragma: no cover\n        raise template.TemplateSyntaxError('pybb_time requires single argument')\n    else:\n        return PybbTimeNode(context_time)\n\n\n@register.assignment_tag(takes_context=True)\ndef pybb_get_time(context, context_time):\n    return pybb_user_time(context_time, context['user'])\n\n\nclass PybbTimeNode(template.Node):\n    def __init__(self, time):\n    #noinspection PyRedeclaration\n        self.time = template.Variable(time)\n\n    def render(self, context):\n        context_time = self.time.resolve(context)\n        return pybb_user_time(context_time, context['user'])\n\n\ndef pybb_user_time(context_time, user):\n    delta = tznow() - context_time\n    today = tznow().replace(hour=0, minute=0, second=0)\n    yesterday = today - timedelta(days=1)\n    tomorrow = today + timedelta(days=1)\n\n    if delta.days == 0:\n        if delta.seconds < 60:\n            msg = ngettext('%d second ago', '%d seconds ago', delta.seconds)\n            return msg % delta.seconds\n        elif delta.seconds < 3600:\n            minutes = int(delta.seconds / 60)\n            msg = ngettext('%d minute ago', '%d minutes ago', minutes)\n            return msg % minutes\n    if user.is_authenticated:\n        if time.daylight: # pragma: no cover\n            tz1 = time.altzone\n        else: # pragma: no cover\n            tz1 = time.timezone\n        tz = tz1 + util.get_pybb_profile(user).time_zone * 60 * 60\n        context_time = context_time + timedelta(seconds=tz)\n    if today < context_time < tomorrow:\n        return _('today, %s') % context_time.strftime('%H:%M')\n    elif yesterday < context_time < today:\n        return _('yesterday, %s') % context_time.strftime('%H:%M')\n    else:\n        return dateformat.format(context_time, 'd M, Y H:i')\n\n\n@register.simple_tag\ndef pybb_link(object, anchor=''):\n    \"\"\"\n    Return A tag with link to object.\n    \"\"\"\n\n    url = hasattr(object, 'get_absolute_url') and object.get_absolute_url() or None\n    #noinspection PyRedeclaration\n    anchor = anchor or smart_str(object)\n    return mark_safe('<a href=\"%s\">%s</a>' % (url, escape(anchor)))\n\n\n@register.filter\ndef pybb_topic_moderated_by(topic, user):  # pragma: no cover\n    \"\"\"\n    Check if user is moderator of topic's forum.\n    \"\"\"\n    warnings.warn(\"pybb_topic_moderated_by filter is deprecated and will be removed in later releases. \"\n                  \"Use pybb_may_moderate_topic(user, topic) filter instead\",\n                  DeprecationWarning)\n    return perms.may_moderate_topic(user, topic)\n\n@register.filter\ndef pybb_editable_by(post, user):  # pragma: no cover\n    \"\"\"\n    Check if the post could be edited by the user.\n    \"\"\"\n    warnings.warn(\"pybb_editable_by filter is deprecated and will be removed in later releases. \"\n                  \"Use pybb_may_edit_post(user, post) filter instead\",\n                  DeprecationWarning)\n    return perms.may_edit_post(user, post)\n\n\n@register.filter\ndef pybb_posted_by(post, user):\n    \"\"\"\n    Check if the post is writed by the user.\n    \"\"\"\n    return post.user == user\n\n\n@register.filter\ndef pybb_is_topic_unread(topic, user):\n    if not user.is_authenticated:\n        return False\n\n    last_topic_update = topic.updated or topic.created\n\n    unread = not ForumReadTracker.objects.filter(\n        forum=topic.forum,\n        user=user.id,\n        time_stamp__gte=last_topic_update).exists()\n    unread &= not TopicReadTracker.objects.filter(\n        topic=topic,\n        user=user.id,\n        time_stamp__gte=last_topic_update).exists()\n    return unread\n\n\n@register.filter\ndef pybb_topic_unread(topics, user):\n    \"\"\"\n    Mark all topics in queryset/list with .unread for target user\n    \"\"\"\n    topic_list = list(topics)\n\n    if user.is_authenticated:\n        for topic in topic_list:\n            topic.unread = True\n\n        forums_ids = [f.forum_id for f in topic_list]\n        forum_marks = dict([(m.forum_id, m.time_stamp)\n                            for m\n                            in ForumReadTracker.objects.filter(user=user, forum__in=forums_ids)])\n        if len(forum_marks):\n            for topic in topic_list:\n                topic_updated = topic.updated or topic.created\n                if topic.forum.id in forum_marks and topic_updated <= forum_marks[topic.forum.id]:\n                    topic.unread = False\n\n        qs = TopicReadTracker.objects.filter(user=user, topic__in=topic_list).select_related('topic')\n        topic_marks = list(qs)\n        topic_dict = dict(((topic.id, topic) for topic in topic_list))\n        for mark in topic_marks:\n            if topic_dict[mark.topic.id].updated <= mark.time_stamp:\n                topic_dict[mark.topic.id].unread = False\n    return topic_list\n\n\n@register.filter\ndef pybb_forum_unread(forums, user):\n    \"\"\"\n    Check if forum has unread messages.\n    \"\"\"\n    forum_list = list(forums)\n    if user.is_authenticated:\n        for forum in forum_list:\n            forum.unread = forum.topic_count > 0\n        forum_marks = ForumReadTracker.objects.filter(\n            user=user,\n            forum__in=forum_list\n        ).select_related('forum')\n        forum_dict = dict(((forum.id, forum) for forum in forum_list))\n        for mark in forum_marks:\n            curr_forum = forum_dict[mark.forum.id]\n            if (curr_forum.updated is None) or (curr_forum.updated <= mark.time_stamp):\n                if not any((f.unread for f in pybb_forum_unread(curr_forum.child_forums.all(), user))):\n                    forum_dict[mark.forum.id].unread = False\n    return forum_list\n\n\n@register.filter\ndef pybb_topic_inline_pagination(topic):\n    page_count = int(math.ceil(topic.post_count / float(defaults.PYBB_TOPIC_PAGE_SIZE)))\n    if page_count <= 5:\n        return range(1, page_count+1)\n    return list(range(1, 5)) + ['...', page_count]\n\n\n@register.filter\ndef pybb_topic_poll_not_voted(topic, user):\n    if user.is_anonymous:\n        return True\n    return not PollAnswerUser.objects.filter(poll_answer__topic=topic, user=user).exists()\n\n\n@register.filter\ndef endswith(str, substr):\n    return str.endswith(substr)\n\n\n@register.assignment_tag\ndef pybb_get_profile(*args, **kwargs):\n    try:\n        return util.get_pybb_profile(kwargs.get('user') or args[0])\n    except:\n        return None\n\n\n@register.assignment_tag(takes_context=True)\ndef pybb_get_latest_topics(context, cnt=5, user=None):\n    qs = Topic.objects.all().order_by('-updated', '-created', '-id')\n    if not user:\n        user = context['user']\n    qs = perms.filter_topics(user, qs)\n    return qs[:cnt]\n\n\n@register.assignment_tag(takes_context=True)\ndef pybb_get_latest_posts(context, cnt=5, user=None):\n    qs = Post.objects.all().order_by('-created', '-id')\n    if not user:\n        user = context['user']\n    qs = perms.filter_posts(user, qs)\n    return qs[:cnt]\n\n\ndef load_perms_filters():\n    def partial(func_name, perms_obj):\n        def newfunc(user, obj_or_qs):\n            return getattr(perms_obj, func_name)(user, obj_or_qs)\n        return newfunc\n\n    def partial_no_param(func_name, perms_obj):\n        def newfunc(user):\n            return getattr(perms_obj, func_name)(user)\n        return newfunc\n\n    for method_name, method in inspect.getmembers(perms):\n        if not inspect.ismethod(method):\n            continue  # pragma: no cover - only methods are used to dynamically build templatetags\n        if not method_name.startswith('may') and not method_name.startswith('filter'):\n            continue  # pragma: no cover - only (may|filter)* methods are used to dynamically build templatetags\n        method_args = inspect.getargspec(method).args\n        args_count = len(method_args)\n        if args_count not in (2, 3):\n            continue  # pragma: no cover - only methods with 2 or 3 params\n        if method_args[0] != 'self' or method_args[1] != 'user':\n            continue  # pragma: no cover - only methods with self and user as first args\n        if len(inspect.getargspec(method).args) == 3:\n            register.filter('%s%s' % ('pybb_', method_name), partial(method_name, perms))\n        elif len(inspect.getargspec(method).args) == 2:\n            register.filter('%s%s' % ('pybb_', method_name), partial_no_param(method_name, perms))\nload_perms_filters()\n\n\n@register.filter\ndef check_app_installed(app_name):\n    return compat.is_installed(app_name)\n\n\n@register.filter\ndef pybbm_calc_topic_views(topic):\n    cache_key = util.build_cache_key('anonymous_topic_views', topic_id=topic.id)\n    return topic.views + cache.get(cache_key, 0)\n"
  },
  {
    "path": "pybb/tests.py",
    "content": "\nimport datetime, time\nimport logging\nimport inspect\nimport math\nimport os\nfrom unittest import skip\nfrom django.contrib.auth.models import AnonymousUser, Permission\nfrom django.conf import settings\nfrom django.core import mail\nfrom django.core.cache import cache\n\nfrom django.urls import reverse\nfrom django.core.exceptions import ValidationError\nfrom django.core.files.uploadedfile import SimpleUploadedFile\nfrom django.db import connection\nfrom django.db.models import Q\nfrom django.template import Context, Template\nfrom django.test import TestCase\nfrom django.test.client import Client\nfrom django.test.utils import override_settings\nfrom django.utils import dateformat, timezone\nfrom django.utils.translation.trans_real import get_supported_language_variant\n\n\nfrom pybb import permissions, views as pybb_views\nfrom pybb.templatetags.pybb_tags import pybb_is_topic_unread, pybb_topic_unread, pybb_forum_unread, \\\n    pybb_get_latest_topics, pybb_get_latest_posts\n\nfrom pybb import compat, util\nfrom pybb.compat import slugify\n\nUser = compat.get_user_model()\nusername_field = compat.get_username_field()\n\ntry:\n    from lxml import html\nexcept ImportError:  # pragma: no cover\n    raise Exception('PyBB requires lxml for self testing')\n\nfrom pybb import defaults\nfrom pybb.models import Category, Forum, Topic, Post, PollAnswer, PollAnswerUser, \\\n    TopicReadTracker, ForumReadTracker, ForumSubscription\n\nif getattr(connection.features, 'supports_microsecond_precision', False):\n    def sleep_only_if_required(s):\n        pass\nelse:\n    from time import sleep as sleep_only_if_required\n\nProfile = util.get_pybb_profile_model()\n\n__author__ = 'zeus'\n\n\nclass SharedTestModule(object):\n\n    def create_user(self):\n        self.user = User.objects.create_user('zeus', 'zeus@localhost', 'zeus')\n\n    def login_client(self, username='zeus', password='zeus'):\n        self.client.login(username=username, password=password)\n\n    def create_post(self, _sleep=False, **kwargs):\n        \"\"\"\n        Creates a post and return it.\n        Sleep for 1 second if using a DB which does not support microsecond precision (MySQL).\n        If your test does not care about time precision (because your test don't check post order\n        or read tracking), you can disable the sleep, even for MySQL, with `_sleep=False`\n        \"\"\"\n        post = Post(**kwargs)\n        post.save()\n        if _sleep:\n            sleep_only_if_required(1)\n        return post\n\n    def create_post_via_http(self, client, forum_id=None, topic_id=None, _sleep=False, **post_kwargs):\n        \"\"\"\n        Creates a post via http and return the response.\n        Sleep for 1 second if using a DB which does not support microsecond precision (MySQL).\n        See doc about `create_post` method for more information about sleeping.\n        \"\"\"\n        if topic_id:\n            url = reverse('pybb:add_post', kwargs={'topic_id': topic_id})\n        elif forum_id:\n            url = reverse('pybb:add_topic', kwargs={'forum_id': forum_id})\n        else:\n            raise Exception('`topic_id` or `forum_id` is required')\n        response = client.get(url, follow=True)\n        if response.status_code < 400:\n            values = self.get_form_values(response)\n            for k, v in post_kwargs.items():\n                if v is None:\n                    values.pop(k, None)\n                else:\n                    values[k] = v\n            response = client.post(url, data=values, follow=True)\n            if response.status_code < 400 and _sleep:\n                sleep_only_if_required(1)\n        return response\n\n    def create_initial(self, post=True):\n        self.category = Category.objects.create(name='foo')\n        self.forum = Forum.objects.create(name='xfoo', description='bar', category=self.category)\n        self.topic = Topic.objects.create(name='etopic', forum=self.forum, user=self.user)\n        if post:\n            self.post = self.create_post(topic=self.topic, user=self.user, body='bbcode [b]test[/b]')\n\n    def get_form_values(self, response, form=\"post-form\"):\n        return dict(html.fromstring(response.content).xpath('//form[@class=\"%s\"]' % form)[0].form_values())\n\n    def get_with_user(self, url, username=None, password=None):\n        if username:\n            self.client.login(username=username, password=password)\n        r = self.client.get(url)\n        self.client.logout()\n        return r\n\n\nclass FeaturesTest(TestCase, SharedTestModule):\n    def setUp(self):\n        self.ORIG_PYBB_ENABLE_ANONYMOUS_POST = defaults.PYBB_ENABLE_ANONYMOUS_POST\n        self.ORIG_PYBB_PREMODERATION = defaults.PYBB_PREMODERATION\n        defaults.PYBB_PREMODERATION = False\n        defaults.PYBB_ENABLE_ANONYMOUS_POST = False\n        self.create_user()\n        self.create_initial()\n        mail.outbox = []\n\n    def test_base(self):\n        # Check index page\n        Forum.objects.create(name='xfoo1', description='bar1', category=self.category, parent=self.forum)\n        url = reverse('pybb:index')\n        response = self.client.get(url)\n        parser = html.HTMLParser(encoding='utf8')\n        tree = html.fromstring(response.content, parser=parser)\n        self.assertContains(response, 'foo')\n        self.assertContains(response, self.forum.get_absolute_url())\n        self.assertTrue(defaults.PYBB_DEFAULT_TITLE in tree.xpath('//title')[0].text_content())\n        self.assertEqual(len(response.context['categories']), 1)\n        self.assertEqual(len(response.context['categories'][0].forums_accessed), 1)\n\n    def test_forum_page(self):\n        # Check forum page\n        response = self.client.get(self.forum.get_absolute_url())\n        self.assertEqual(response.context['forum'], self.forum)\n        tree = html.fromstring(response.content)\n        self.assertTrue(tree.xpath('//a[@href=\"%s\"]' % self.topic.get_absolute_url()))\n        self.assertTrue(tree.xpath('//title[contains(text(),\"%s\")]' % self.forum.name))\n        self.assertFalse(tree.xpath('//a[contains(@href,\"?page=\")]'))\n        self.assertFalse(response.context['is_paginated'])\n\n    def test_category_page(self):\n        Forum.objects.create(name='xfoo1', description='bar1', category=self.category, parent=self.forum)\n        response = self.client.get(self.category.get_absolute_url())\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(response, self.forum.get_absolute_url())\n        self.assertEqual(len(response.context['object'].forums_accessed), 1)\n\n    def test_profile_language_default(self):\n        user = User.objects.create_user(username='user2', password='user2',\n                                        email='user2@example.com')\n        self.assertEqual(util.get_pybb_profile(user).language,\n                         get_supported_language_variant(settings.LANGUAGE_CODE))\n\n    def test_profile_edit(self):\n        # Self profile edit\n        self.login_client()\n        response = self.client.get(reverse('pybb:edit_profile'))\n        self.assertEqual(response.status_code, 200)\n        values = self.get_form_values(response, 'profile-edit')\n        values['signature'] = 'test signature'\n        response = self.client.post(reverse('pybb:edit_profile'), data=values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.client.get(self.post.get_absolute_url(), follow=True)\n        self.assertContains(response, 'test signature')\n        # Test empty signature\n        values['signature'] = ''\n        response = self.client.post(reverse('pybb:edit_profile'), data=values, follow=True)\n        self.assertEqual(len(response.context['form'].errors), 0)\n\n    def test_pagination_and_topic_addition(self):\n        for i in range(0, defaults.PYBB_FORUM_PAGE_SIZE + 3):\n            topic = Topic(name='topic_%s_' % i, forum=self.forum, user=self.user)\n            topic.save()\n        url = self.forum.get_absolute_url()\n        response = self.client.get(url)\n        self.assertEqual(len(response.context['topic_list']), defaults.PYBB_FORUM_PAGE_SIZE)\n        self.assertTrue(response.context['is_paginated'])\n        self.assertEqual(response.context['paginator'].num_pages,\n                         int((defaults.PYBB_FORUM_PAGE_SIZE + 3) / defaults.PYBB_FORUM_PAGE_SIZE) + 1)\n\n    def test_bbcode_and_topic_title(self):\n        response = self.client.get(self.topic.get_absolute_url())\n        tree = html.fromstring(response.content)\n        self.assertTrue(self.topic.name in tree.xpath('//title')[0].text_content())\n        self.assertContains(response, self.post.body_html)\n        self.assertContains(response, 'bbcode <strong>test</strong>')\n\n    def test_topic_addition(self):\n        self.login_client()\n        add_topic_url = reverse('pybb:add_topic', kwargs={'forum_id': self.forum.id})\n        response = self.client.get(add_topic_url)\n        values = self.get_form_values(response)\n        values['body'] = 'new topic test'\n        values['name'] = 'new topic name'\n        values['poll_type'] = 0\n        response = self.client.post(add_topic_url, data=values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertTrue(Topic.objects.filter(name='new topic name').exists())\n\n    def test_topic_read_before_post_addition(self):\n        \"\"\"\n        Test if everything is okay when :\n            - user A create the topic\n            - but before associated post is created, user B display the forum\n        \"\"\"\n        topic = Topic(name='xtopic', forum=self.forum, user=self.user)\n        topic.save()\n        #topic is saved, but post is not yet created at this time\n\n        #an other user is displaing the forum before the post creation\n        user_ann = User.objects.create_user('ann', 'ann@localhost', 'ann')\n        client = Client()\n        client.login(username='ann', password='ann')\n\n        self.assertEqual(client.get(topic.get_absolute_url()).status_code, 404)\n        self.assertEqual(topic.forum.post_count, 1)\n        self.assertEqual(topic.forum.topic_count, 1)\n        #do we need to correct this ?\n        #self.assertEqual(topic.forum.topics.count(), 1)\n        self.assertEqual(topic.post_count, 0)\n\n        #Now, TopicReadTracker is not created because the topic detail view raise a 404\n        #If its creation is not finished. So we create it manually to add a test, just in case\n        #we have an other way where TopicReadTracker could be set for a not complete topic.\n        TopicReadTracker.objects.create(user=user_ann, topic=topic, time_stamp=topic.created)\n\n        #before correction, raised TypeError: can't compare datetime.datetime to NoneType\n        pybb_topic_unread([topic,], user_ann)\n\n        #before correction, raised IndexError: list index out of range\n        last_post = topic.last_post\n\n        #post creation now.\n        self.create_post(topic=topic, user=self.user, body='one')\n\n        self.assertEqual(client.get(topic.get_absolute_url()).status_code, 200)\n        self.assertEqual(topic.forum.post_count, 2)\n        self.assertEqual(topic.forum.topic_count, 2)\n        self.assertEqual(topic.forum.topics.count(), 2)\n        self.assertEqual(topic.post_count, 1)\n\n    def test_post_deletion(self):\n        self.create_post(topic=self.topic, user=self.user, body='bbcode [b]test[/b]')\n        Topic.objects.get(id=self.topic.id)\n        Forum.objects.get(id=self.forum.id)\n\n    def test_topic_deletion(self):\n        topic = Topic(name='xtopic', forum=self.forum, user=self.user)\n        topic.save()\n        post = self.create_post(topic=topic, user=self.user, body='one')\n        post = self.create_post(topic=topic, user=self.user, body='two')\n        post.delete()\n        Topic.objects.get(id=topic.id)\n        Forum.objects.get(id=self.forum.id)\n        topic.delete()\n        Forum.objects.get(id=self.forum.id)\n\n    def test_forum_updated(self):\n        topic = Topic(name='xtopic', forum=self.forum, user=self.user)\n        topic.save()\n        post = self.create_post(topic=topic, user=self.user, body='one')\n        post = Post.objects.get(id=post.id)\n        self.assertTrue(self.forum.updated == post.created)\n\n    def test_read_tracking(self):\n        topic = Topic(name='xtopic', forum=self.forum, user=self.user)\n        topic.save()\n        post = self.create_post(topic=topic, user=self.user, body='one', _sleep=True)\n        client = Client()\n        client.login(username='zeus', password='zeus')\n        # Topic status\n        tree = html.fromstring(client.get(topic.forum.get_absolute_url()).content)\n        self.assertTrue(tree.xpath('//a[@href=\"%s\"]/parent::td[contains(@class,\"unread\")]' % topic.get_absolute_url()))\n        # Forum status\n        tree = html.fromstring(client.get(reverse('pybb:index')).content)\n        self.assertTrue(\n            tree.xpath('//a[@href=\"%s\"]/parent::td[contains(@class,\"unread\")]' % topic.forum.get_absolute_url()))\n        # Visit it\n        client.get(topic.get_absolute_url())\n        # Topic status - readed\n        tree = html.fromstring(client.get(topic.forum.get_absolute_url()).content)\n        # Visit others\n        for t in topic.forum.topics.all():\n            client.get(t.get_absolute_url())\n        self.assertFalse(tree.xpath('//a[@href=\"%s\"]/parent::td[contains(@class,\"unread\")]' % topic.get_absolute_url()))\n        # Forum status - readed\n        tree = html.fromstring(client.get(reverse('pybb:index')).content)\n        self.assertFalse(\n            tree.xpath('//a[@href=\"%s\"]/parent::td[contains(@class,\"unread\")]' % topic.forum.get_absolute_url()))\n        # Post message\n        response = self.create_post_via_http(client, topic_id=topic.id, body='test tracking', _sleep=True)\n        self.assertContains(response, 'test tracking')\n        # Topic status - readed\n        tree = html.fromstring(client.get(topic.forum.get_absolute_url()).content)\n        self.assertFalse(tree.xpath('//a[@href=\"%s\"]/parent::td[contains(@class,\"unread\")]' % topic.get_absolute_url()))\n        # Forum status - readed\n        tree = html.fromstring(client.get(reverse('pybb:index')).content)\n        self.assertFalse(\n            tree.xpath('//a[@href=\"%s\"]/parent::td[contains(@class,\"unread\")]' % topic.forum.get_absolute_url()))\n        post = self.create_post(topic=topic, user=self.user, body='one')\n        client.get(reverse('pybb:mark_all_as_read'))\n        tree = html.fromstring(client.get(reverse('pybb:index')).content)\n        self.assertFalse(\n            tree.xpath('//a[@href=\"%s\"]/parent::td[contains(@class,\"unread\")]' % topic.forum.get_absolute_url()))\n        # Empty forum - readed\n        f = Forum(name='empty', category=self.category)\n        f.save()\n        tree = html.fromstring(client.get(reverse('pybb:index')).content)\n        self.assertFalse(tree.xpath('//a[@href=\"%s\"]/parent::td[contains(@class,\"unread\")]' % f.get_absolute_url()))\n\n    def test_read_tracking_multi_user(self):\n        topic_1 = self.topic\n        topic_2 = Topic(name='topic_2', forum=self.forum, user=self.user)\n        topic_2.save()\n        self.create_post(topic=topic_2, user=self.user, body='one')\n\n        user_ann = User.objects.create_user('ann', 'ann@localhost', 'ann')\n        client_ann = Client()\n        client_ann.login(username='ann', password='ann')\n\n        user_bob = User.objects.create_user('bob', 'bob@localhost', 'bob')\n        client_bob = Client()\n        client_bob.login(username='bob', password='bob')\n\n        # Two topics, each with one post. everything is unread, so the db should reflect that:\n        self.assertEqual(TopicReadTracker.objects.all().count(), 0)\n        self.assertEqual(ForumReadTracker.objects.all().count(), 0)\n\n        # user_ann reads topic_1, she should get one topic read tracker, there should be no forum read trackers\n        client_ann.get(topic_1.get_absolute_url())\n        self.assertEqual(TopicReadTracker.objects.all().count(), 1)\n        self.assertEqual(TopicReadTracker.objects.filter(user=user_ann).count(), 1)\n        self.assertEqual(TopicReadTracker.objects.filter(user=user_ann, topic=topic_1).count(), 1)\n        self.assertEqual(ForumReadTracker.objects.all().count(), 0)\n\n        # user_bob reads topic_1, he should get one topic read tracker, there should be no forum read trackers\n        client_bob.get(topic_1.get_absolute_url())\n        sleep_only_if_required(1)\n        self.assertEqual(TopicReadTracker.objects.all().count(), 2)\n        self.assertEqual(TopicReadTracker.objects.filter(user=user_bob).count(), 1)\n        self.assertEqual(TopicReadTracker.objects.filter(user=user_bob, topic=topic_1).count(), 1)\n\n        # user_bob reads topic_2, he should get a forum read tracker,\n        #  there should be no topic read trackers for user_bob\n        client_bob.get(topic_2.get_absolute_url())\n        sleep_only_if_required(1)\n        self.assertEqual(TopicReadTracker.objects.all().count(), 1)\n        self.assertEqual(ForumReadTracker.objects.all().count(), 1)\n        self.assertEqual(ForumReadTracker.objects.filter(user=user_bob).count(), 1)\n        self.assertEqual(ForumReadTracker.objects.filter(user=user_bob, forum=self.forum).count(), 1)\n        self.assertEqual(TopicReadTracker.objects.filter(user=user_bob).count(), 0)\n        self.assertListEqual([t.unread for t in pybb_topic_unread([topic_1, topic_2], user_bob)], [False, False])\n\n        # user_ann creates topic_3, they should get a new topic read tracker in the db\n        self.create_post_via_http(client_ann, forum_id=self.forum.id,\n                                  body='topic_3', name='topic_3', poll_type=0)\n        self.assertEqual(TopicReadTracker.objects.all().count(), 2)\n        self.assertEqual(TopicReadTracker.objects.filter(user=user_ann).count(), 2)\n        self.assertEqual(ForumReadTracker.objects.all().count(), 1)\n        topic_3 = Topic.objects.order_by('-updated', '-id')[0]\n        self.assertEqual(topic_3.name, 'topic_3')\n\n        # user_ann posts to topic_1, a topic they've already read, no new trackers should be created\n        self.create_post_via_http(client_ann, topic_id=topic_1.id, body='test tracking')\n        self.assertEqual(TopicReadTracker.objects.all().count(), 2)\n        self.assertEqual(TopicReadTracker.objects.filter(user=user_ann).count(), 2)\n        self.assertEqual(ForumReadTracker.objects.all().count(), 1)\n\n        # user_bob has two unread topics, 'topic_1' and 'topic_3'.\n        #   This is because user_ann created a new topic and posted to an existing topic,\n        #   after user_bob got his forum read tracker.\n\n        # user_bob reads 'topic_1'\n        #   user_bob gets a new topic read tracker, and the existing forum read tracker stays the same.\n        #   'topic_3' appears unread for user_bob\n        #\n        previous_time = ForumReadTracker.objects.all()[0].time_stamp\n        client_bob.get(topic_1.get_absolute_url())\n        sleep_only_if_required(1)\n        self.assertEqual(ForumReadTracker.objects.all().count(), 1)\n        self.assertEqual(ForumReadTracker.objects.all()[0].time_stamp, previous_time)\n        self.assertEqual(TopicReadTracker.objects.filter(user=user_bob).count(), 1)\n        self.assertEqual(TopicReadTracker.objects.filter(user=user_ann).count(), 2)\n        self.assertEqual(TopicReadTracker.objects.all().count(), 3)\n\n        # user_bob reads the last unread topic, 'topic_3'.\n        # user_bob's existing forum read tracker updates and his topic read tracker disappears\n        #\n        previous_time = ForumReadTracker.objects.all()[0].time_stamp\n        client_bob.get(topic_3.get_absolute_url())\n        sleep_only_if_required(1)\n        self.assertEqual(ForumReadTracker.objects.all().count(), 1)\n        self.assertGreater(ForumReadTracker.objects.all()[0].time_stamp, previous_time)\n        self.assertEqual(TopicReadTracker.objects.all().count(), 2)\n        self.assertEqual(TopicReadTracker.objects.filter(user=user_bob).count(), 0)\n\n    def test_read_tracking_multi_forum(self):\n        topic_1 = self.topic\n        topic_2 = Topic(name='topic_2', forum=self.forum, user=self.user)\n        topic_2.save()\n        self.create_post(topic=topic_2, user=self.user, body='one').save()\n\n        forum_1 = self.forum\n        forum_2 = Forum(name='forum_2', description='bar', category=self.category)\n        forum_2.save()\n        Topic(name='garbage', forum=forum_2, user=self.user).save()\n\n        client = Client()\n        client.login(username='zeus', password='zeus')\n\n        # everything starts unread\n        self.assertEqual(ForumReadTracker.objects.all().count(), 0)\n        self.assertEqual(TopicReadTracker.objects.all().count(), 0)\n\n        # user reads topic_1, they should get one topic read tracker, there should be no forum read trackers\n        client.get(topic_1.get_absolute_url())\n        self.assertEqual(TopicReadTracker.objects.all().count(), 1)\n        self.assertEqual(TopicReadTracker.objects.filter(user=self.user).count(), 1)\n        self.assertEqual(TopicReadTracker.objects.filter(user=self.user, topic=topic_1).count(), 1)\n\n        # user reads topic_2, they should get a forum read tracker,\n        #  there should be no topic read trackers for the user\n        client.get(topic_2.get_absolute_url())\n        self.assertEqual(TopicReadTracker.objects.all().count(), 0)\n        self.assertEqual(ForumReadTracker.objects.all().count(), 1)\n        self.assertEqual(ForumReadTracker.objects.filter(user=self.user).count(), 1)\n        self.assertEqual(ForumReadTracker.objects.filter(user=self.user, forum=self.forum).count(), 1)\n\n    def test_read_tracker_after_posting(self):\n        client = Client()\n        client.login(username='zeus', password='zeus')\n        self.create_post_via_http(client, topic_id=self.topic.id, body='test tracking')\n        # after posting in topic it should be readed\n        # because there is only one topic, so whole forum should be marked as readed\n        self.assertEqual(TopicReadTracker.objects.filter(user=self.user, topic=self.topic).count(), 0)\n        self.assertEqual(ForumReadTracker.objects.filter(user=self.user, forum=self.forum).count(), 1)\n\n    def test_pybb_is_topic_unread_filter(self):\n        forum_1 = self.forum\n        topic_1 = self.topic\n        topic_2 = Topic.objects.create(name='topic_2', forum=forum_1, user=self.user)\n\n        forum_2 = Forum.objects.create(name='forum_2', description='forum2', category=self.category)\n        topic_3 = Topic.objects.create(name='topic_2', forum=forum_2, user=self.user)\n\n        self.create_post(topic=topic_1, user=self.user, body='one')\n        self.create_post(topic=topic_2, user=self.user, body='two')\n        self.create_post(topic=topic_3, user=self.user, body='three')\n\n        user_ann = User.objects.create_user('ann', 'ann@localhost', 'ann')\n        client_ann = Client()\n        client_ann.login(username='ann', password='ann')\n\n        # Two topics, each with one post. everything is unread, so the db should reflect that:\n        self.assertTrue(pybb_is_topic_unread(topic_1, user_ann))\n        self.assertTrue(pybb_is_topic_unread(topic_2, user_ann))\n        self.assertTrue(pybb_is_topic_unread(topic_3, user_ann))\n        self.assertListEqual(\n            [t.unread for t in pybb_topic_unread([topic_1, topic_2, topic_3], user_ann)],\n            [True, True, True])\n\n        client_ann.get(topic_1.get_absolute_url())\n        topic_1 = Topic.objects.get(id=topic_1.id)\n        topic_2 = Topic.objects.get(id=topic_2.id)\n        topic_3 = Topic.objects.get(id=topic_3.id)\n        self.assertFalse(pybb_is_topic_unread(topic_1, user_ann))\n        self.assertTrue(pybb_is_topic_unread(topic_2, user_ann))\n        self.assertTrue(pybb_is_topic_unread(topic_3, user_ann))\n        self.assertListEqual(\n            [t.unread for t in pybb_topic_unread([topic_1, topic_2, topic_3], user_ann)],\n            [False, True, True])\n\n        client_ann.get(topic_2.get_absolute_url())\n        topic_1 = Topic.objects.get(id=topic_1.id)\n        topic_2 = Topic.objects.get(id=topic_2.id)\n        topic_3 = Topic.objects.get(id=topic_3.id)\n        self.assertFalse(pybb_is_topic_unread(topic_1, user_ann))\n        self.assertFalse(pybb_is_topic_unread(topic_2, user_ann))\n        self.assertTrue(pybb_is_topic_unread(topic_3, user_ann))\n        self.assertListEqual(\n            [t.unread for t in pybb_topic_unread([topic_1, topic_2, topic_3], user_ann)],\n            [False, False, True])\n\n        client_ann.get(topic_3.get_absolute_url())\n        topic_1 = Topic.objects.get(id=topic_1.id)\n        topic_2 = Topic.objects.get(id=topic_2.id)\n        topic_3 = Topic.objects.get(id=topic_3.id)\n        self.assertFalse(pybb_is_topic_unread(topic_1, user_ann))\n        self.assertFalse(pybb_is_topic_unread(topic_2, user_ann))\n        self.assertFalse(pybb_is_topic_unread(topic_3, user_ann))\n        self.assertListEqual(\n            [t.unread for t in pybb_topic_unread([topic_1, topic_2, topic_3], user_ann)],\n            [False, False, False])\n\n    def test_is_forum_unread_filter(self):\n        Forum.objects.all().delete()\n\n        forum_parent = Forum.objects.create(name='f1', category=self.category)\n        forum_child1 = Forum.objects.create(name='f2', category=self.category, parent=forum_parent)\n        forum_child2 = Forum.objects.create(name='f3', category=self.category, parent=forum_parent)\n        topic_1 = Topic.objects.create(name='topic_1', forum=forum_parent, user=self.user)\n        topic_2 = Topic.objects.create(name='topic_2', forum=forum_child1, user=self.user)\n        topic_3 = Topic.objects.create(name='topic_3', forum=forum_child2, user=self.user)\n\n        self.create_post(topic=topic_1, user=self.user, body='one')\n        self.create_post(topic=topic_2, user=self.user, body='two')\n        self.create_post(topic=topic_3, user=self.user, body='three')\n\n        user_ann = User.objects.create_user('ann', 'ann@localhost', 'ann')\n        client_ann = Client()\n        client_ann.login(username='ann', password='ann')\n\n        forum_parent = Forum.objects.get(id=forum_parent.id)\n        forum_child1 = Forum.objects.get(id=forum_child1.id)\n        forum_child2 = Forum.objects.get(id=forum_child2.id)\n        self.assertListEqual([f.unread for f in pybb_forum_unread([forum_parent, forum_child1, forum_child2], user_ann)],\n                             [True, True, True])\n\n        # unless we read parent topic, there is unreaded topics in child forums\n        client_ann.get(topic_1.get_absolute_url())\n        forum_parent = Forum.objects.get(id=forum_parent.id)\n        forum_child1 = Forum.objects.get(id=forum_child1.id)\n        forum_child2 = Forum.objects.get(id=forum_child2.id)\n        self.assertListEqual([f.unread for f in pybb_forum_unread([forum_parent, forum_child1, forum_child2], user_ann)],\n                             [True, True, True])\n\n        # still unreaded topic in one of the child forums\n        client_ann.get(topic_2.get_absolute_url())\n        forum_parent = Forum.objects.get(id=forum_parent.id)\n        forum_child1 = Forum.objects.get(id=forum_child1.id)\n        forum_child2 = Forum.objects.get(id=forum_child2.id)\n        self.assertListEqual([f.unread for f in pybb_forum_unread([forum_parent, forum_child1, forum_child2], user_ann)],\n                             [True, False, True])\n\n        # all topics readed\n        client_ann.get(topic_3.get_absolute_url())\n        forum_parent = Forum.objects.get(id=forum_parent.id)\n        forum_child1 = Forum.objects.get(id=forum_child1.id)\n        forum_child2 = Forum.objects.get(id=forum_child2.id)\n        self.assertListEqual([f.unread for f in pybb_forum_unread([forum_parent, forum_child1, forum_child2], user_ann)],\n                             [False, False, False])\n\n    def test_read_tracker_when_topics_forum_changed(self):\n        forum_1 = Forum.objects.create(name='f1', description='bar', category=self.category)\n        forum_2 = Forum.objects.create(name='f2', description='bar', category=self.category)\n        topic_1 = Topic.objects.create(name='t1', forum=forum_1, user=self.user)\n        topic_2 = Topic.objects.create(name='t2', forum=forum_2, user=self.user)\n\n        self.create_post(topic=topic_1, user=self.user, body='one')\n        self.create_post(topic=topic_2, user=self.user, body='two')\n\n        user_ann = User.objects.create_user('ann', 'ann@localhost', 'ann')\n        client_ann = Client()\n        client_ann.login(username='ann', password='ann')\n\n        # Everything is unread\n        self.assertListEqual([t.unread for t in pybb_topic_unread([topic_1, topic_2], user_ann)], [True, True])\n        self.assertListEqual([t.unread for t in pybb_forum_unread([forum_1, forum_2], user_ann)], [True, True])\n\n        # read all\n        client_ann.get(reverse('pybb:mark_all_as_read'))\n        sleep_only_if_required(1)\n        self.assertListEqual([t.unread for t in pybb_topic_unread([topic_1, topic_2], user_ann)], [False, False])\n        self.assertListEqual([t.unread for t in pybb_forum_unread([forum_1, forum_2], user_ann)], [False, False])\n\n        post = self.create_post(topic=topic_1, user=self.user, body='three')\n        post = Post.objects.get(id=post.id)  # get post with timestamp from DB\n\n        topic_1 = Topic.objects.get(id=topic_1.id)\n        topic_2 = Topic.objects.get(id=topic_2.id)\n        self.assertEqual(topic_1.updated, post.updated or post.created)\n        self.assertEqual(forum_1.updated, post.updated or post.created)\n        self.assertListEqual([t.unread for t in pybb_topic_unread([topic_1, topic_2], user_ann)], [True, False])\n        self.assertListEqual([t.unread for t in pybb_forum_unread([forum_1, forum_2], user_ann)], [True, False])\n\n        post.topic = topic_2\n        post.save()\n        topic_1 = Topic.objects.get(id=topic_1.id)\n        topic_2 = Topic.objects.get(id=topic_2.id)\n        forum_1 = Forum.objects.get(id=forum_1.id)\n        forum_2 = Forum.objects.get(id=forum_2.id)\n        self.assertEqual(topic_2.updated, post.updated or post.created)\n        self.assertEqual(forum_2.updated, post.updated or post.created)\n        self.assertListEqual([t.unread for t in pybb_topic_unread([topic_1, topic_2], user_ann)], [False, True])\n        self.assertListEqual([t.unread for t in pybb_forum_unread([forum_1, forum_2], user_ann)], [False, True])\n\n        topic_2.forum = forum_1\n        topic_2.save()\n        topic_1 = Topic.objects.get(id=topic_1.id)\n        topic_2 = Topic.objects.get(id=topic_2.id)\n        forum_1 = Forum.objects.get(id=forum_1.id)\n        forum_2 = Forum.objects.get(id=forum_2.id)\n        self.assertEqual(forum_1.updated, post.updated or post.created)\n        self.assertListEqual([t.unread for t in pybb_topic_unread([topic_1, topic_2], user_ann)], [False, True])\n        self.assertListEqual([t.unread for t in pybb_forum_unread([forum_1, forum_2], user_ann)], [True, False])\n\n    def test_open_first_unread_post(self):\n        forum_1 = self.forum\n        topic_1 = Topic.objects.create(name='topic_1', forum=forum_1, user=self.user)\n        topic_2 = Topic.objects.create(name='topic_2', forum=forum_1, user=self.user)\n\n        post_1_1 = self.create_post(topic=topic_1, user=self.user, body='1_1')\n        post_1_2 = self.create_post(topic=topic_1, user=self.user, body='1_2')\n        post_2_1 = self.create_post(topic=topic_2, user=self.user, body='2_1')\n\n        user_ann = User.objects.create_user('ann', 'ann@localhost', 'ann')\n        client_ann = Client()\n        client_ann.login(username='ann', password='ann')\n\n        response = client_ann.get(topic_1.get_absolute_url(), data={'first-unread': 1}, follow=True)\n        self.assertRedirects(response, '%s?page=%d#post-%d' % (topic_1.get_absolute_url(), 1, post_1_1.id))\n        sleep_only_if_required(1)\n\n        response = client_ann.get(topic_1.get_absolute_url(), data={'first-unread': 1}, follow=True)\n        self.assertRedirects(response, '%s?page=%d#post-%d' % (topic_1.get_absolute_url(), 1, post_1_2.id))\n        sleep_only_if_required(1)\n\n        response = client_ann.get(topic_2.get_absolute_url(), data={'first-unread': 1}, follow=True)\n        self.assertRedirects(response, '%s?page=%d#post-%d' % (topic_2.get_absolute_url(), 1, post_2_1.id))\n        sleep_only_if_required(1)\n\n        post_1_3 = self.create_post(topic=topic_1, user=self.user, body='1_3')\n        post_1_4 = self.create_post(topic=topic_1, user=self.user, body='1_4')\n\n        response = client_ann.get(topic_1.get_absolute_url(), data={'first-unread': 1}, follow=True)\n        self.assertRedirects(response, '%s?page=%d#post-%d' % (topic_1.get_absolute_url(), 1, post_1_3.id))\n\n    def test_latest_topics(self):\n        topic_1 = self.topic\n        topic_1.updated = timezone.now()\n        topic_1.save()\n        topic_2 = Topic.objects.create(name='topic_2', forum=self.forum, user=self.user)\n        topic_2.updated = timezone.now() + datetime.timedelta(days=-1)\n        topic_2.save()\n\n        category_2 = Category.objects.create(name='cat2')\n        forum_2 = Forum.objects.create(name='forum_2', category=category_2)\n        topic_3 = Topic.objects.create(name='topic_3', forum=forum_2, user=self.user)\n        topic_3.updated = timezone.now() + datetime.timedelta(days=-2)\n        topic_3.save()\n\n        self.login_client()\n        response = self.client.get(reverse('pybb:topic_latest'))\n        self.assertEqual(response.status_code, 200)\n        self.assertListEqual(list(response.context['topic_list']), [topic_1, topic_2, topic_3])\n\n        topic_2.forum.hidden = True\n        topic_2.forum.save()\n        response = self.client.get(reverse('pybb:topic_latest'))\n        self.assertListEqual(list(response.context['topic_list']), [topic_3])\n\n        topic_2.forum.hidden = False\n        topic_2.forum.save()\n        category_2.hidden = True\n        category_2.save()\n        response = self.client.get(reverse('pybb:topic_latest'))\n        self.assertListEqual(list(response.context['topic_list']), [topic_1, topic_2])\n\n        topic_2.forum.hidden = False\n        topic_2.forum.save()\n        category_2.hidden = False\n        category_2.save()\n        topic_1.on_moderation = True\n        topic_1.save()\n        response = self.client.get(reverse('pybb:topic_latest'))\n        self.assertListEqual(list(response.context['topic_list']), [topic_1, topic_2, topic_3])\n\n        topic_1.user = User.objects.create_user('another', 'another@localhost', 'another')\n        topic_1.save()\n        response = self.client.get(reverse('pybb:topic_latest'))\n        self.assertListEqual(list(response.context['topic_list']), [topic_2, topic_3])\n\n        topic_1.forum.moderators.add(self.user)\n        response = self.client.get(reverse('pybb:topic_latest'))\n        self.assertListEqual(list(response.context['topic_list']), [topic_1, topic_2, topic_3])\n\n        topic_1.forum.moderators.remove(self.user)\n        self.user.is_superuser = True\n        self.user.save()\n        response = self.client.get(reverse('pybb:topic_latest'))\n        self.assertListEqual(list(response.context['topic_list']), [topic_1, topic_2, topic_3])\n\n        self.client.logout()\n        response = self.client.get(reverse('pybb:topic_latest'))\n        self.assertListEqual(list(response.context['topic_list']), [topic_2, topic_3])\n\n    def test_hidden(self):\n        client = Client()\n        category = Category(name='hcat', hidden=True)\n        category.save()\n        forum_in_hidden = Forum(name='in_hidden', category=category)\n        forum_in_hidden.save()\n        topic_in_hidden = Topic(forum=forum_in_hidden, name='in_hidden', user=self.user)\n        topic_in_hidden.save()\n\n        forum_hidden = Forum(name='hidden', category=self.category, hidden=True)\n        forum_hidden.save()\n        topic_hidden = Topic(forum=forum_hidden, name='hidden', user=self.user)\n        topic_hidden.save()\n\n        post_hidden = self.create_post(topic=topic_hidden, user=self.user, body='hidden')\n\n        post_in_hidden = self.create_post(topic=topic_in_hidden, user=self.user, body='hidden')\n\n        self.assertFalse(category.id in [c.id for c in client.get(reverse('pybb:index')).context['categories']])\n        self.assertEqual(client.get(category.get_absolute_url()).status_code, 302)\n        self.assertEqual(client.get(forum_in_hidden.get_absolute_url()).status_code, 302)\n        self.assertEqual(client.get(topic_in_hidden.get_absolute_url()).status_code, 302)\n\n        self.assertNotContains(client.get(reverse('pybb:index')), forum_hidden.get_absolute_url())\n        self.assertNotContains(client.get(reverse('pybb:feed_topics')), topic_hidden.get_absolute_url())\n        self.assertNotContains(client.get(reverse('pybb:feed_topics')), topic_in_hidden.get_absolute_url())\n\n        self.assertNotContains(client.get(reverse('pybb:feed_posts')), post_hidden.get_absolute_url())\n        self.assertNotContains(client.get(reverse('pybb:feed_posts')), post_in_hidden.get_absolute_url())\n        self.assertEqual(client.get(forum_hidden.get_absolute_url()).status_code, 302)\n        self.assertEqual(client.get(topic_hidden.get_absolute_url()).status_code, 302)\n\n        user = User.objects.create_user('someguy', 'email@abc.xyz', 'password')\n        client.login(username='someguy', password='password')\n\n        response = client.get(reverse('pybb:add_post', kwargs={'topic_id': self.topic.id}))\n        self.assertEqual(response.status_code, 200, response)\n\n        response = client.get(reverse('pybb:add_post', kwargs={'topic_id': self.topic.id}), data={'quote_id': post_hidden.id})\n        self.assertEqual(response.status_code, 403, response)\n\n        client.login(username='zeus', password='zeus')\n        self.assertFalse(category.id in [c.id for c in client.get(reverse('pybb:index')).context['categories']])\n        self.assertNotContains(client.get(reverse('pybb:index')), forum_hidden.get_absolute_url())\n        self.assertEqual(client.get(category.get_absolute_url()).status_code, 403)\n        self.assertEqual(client.get(forum_in_hidden.get_absolute_url()).status_code, 403)\n        self.assertEqual(client.get(topic_in_hidden.get_absolute_url()).status_code, 403)\n        self.assertEqual(client.get(forum_hidden.get_absolute_url()).status_code, 403)\n        self.assertEqual(client.get(topic_hidden.get_absolute_url()).status_code, 403)\n\n        self.user.is_staff = True\n        self.user.save()\n        self.assertTrue(category.id in [c.id for c in client.get(reverse('pybb:index')).context['categories']])\n        self.assertContains(client.get(reverse('pybb:index')), forum_hidden.get_absolute_url())\n        self.assertEqual(client.get(category.get_absolute_url()).status_code, 200)\n        self.assertEqual(client.get(forum_in_hidden.get_absolute_url()).status_code, 200)\n        self.assertEqual(client.get(topic_in_hidden.get_absolute_url()).status_code, 200)\n        self.assertEqual(client.get(forum_hidden.get_absolute_url()).status_code, 200)\n        self.assertEqual(client.get(topic_hidden.get_absolute_url()).status_code, 200)\n\n\n    def test_inactive(self):\n        self.login_client()\n        url = reverse('pybb:add_post', kwargs={'topic_id': self.topic.id})\n        response = self.client.get(url)\n        values = self.get_form_values(response)\n        values['body'] = 'test ban'\n        response = self.client.post(url, values, follow=True)\n        self.assertEqual(len(Post.objects.filter(body='test ban')), 1)\n        self.user.is_active = False\n        self.user.save()\n        values['body'] = 'test ban 2'\n        self.client.post(url, values, follow=True)\n        self.assertEqual(len(Post.objects.filter(body='test ban 2')), 0)\n\n    def get_csrf(self, form):\n        return form.xpath('//input[@name=\"csrfmiddlewaretoken\"]/@value')[0]\n\n    def test_csrf(self):\n        client = Client(enforce_csrf_checks=True)\n        client.login(username='zeus', password='zeus')\n        response = self.create_post_via_http(client, topic_id=self.topic.id, csrfmiddlewaretoken=None)\n        self.assertNotEqual(response.status_code, 200)\n        response = self.create_post_via_http(client, topic_id=self.topic.id)\n        self.assertEqual(response.status_code, 200)\n\n    def test_user_blocking(self):\n        user = User.objects.create_user('test', 'test@localhost', 'test')\n        topic = Topic.objects.create(name='topic', forum=self.forum, user=user)\n        p1 = self.create_post(topic=topic, user=user, body='bbcode [b]test[/b]')\n        p2 = self.create_post(topic=topic, user=user, body='bbcode [b]test[/b]')\n        self.user.is_superuser = True\n        self.user.save()\n        self.login_client()\n        response = self.client.get(reverse('pybb:block_user', args=[user.username]), follow=True)\n        self.assertEqual(response.status_code, 405)\n        response = self.client.post(reverse('pybb:block_user', args=[user.username]), follow=True)\n        self.assertEqual(response.status_code, 200)\n        user = User.objects.get(username=user.username)\n        self.assertFalse(user.is_active)\n        self.assertEqual(Topic.objects.filter().count(), 2)\n        self.assertEqual(Post.objects.filter(user=user).count(), 2)\n\n        user.is_active = True\n        user.save()\n        self.assertEqual(Topic.objects.count(), 2)\n        response = self.client.post(reverse('pybb:block_user', args=[user.username]),\n                                    data={'block_and_delete_messages': 'block_and_delete_messages'}, follow=True)\n        self.assertEqual(response.status_code, 200)\n        user = User.objects.get(username=user.username)\n        self.assertFalse(user.is_active)\n        self.assertEqual(Topic.objects.count(), 1)\n        self.assertEqual(Post.objects.filter(user=user).count(), 0)\n\n    def test_user_unblocking(self):\n        user = User.objects.create_user('test', 'test@localhost', 'test')\n        user.is_active=False\n        user.save()\n        self.user.is_superuser = True\n        self.user.save()\n        self.login_client()\n        response = self.client.get(reverse('pybb:unblock_user', args=[user.username]), follow=True)\n        self.assertEqual(response.status_code, 405)\n        response = self.client.post(reverse('pybb:unblock_user', args=[user.username]), follow=True)\n        self.assertEqual(response.status_code, 200)\n        user = User.objects.get(username=user.username)\n        self.assertTrue(user.is_active)\n\n    def test_ajax_preview(self):\n        self.login_client()\n        response = self.client.post(reverse('pybb:post_ajax_preview'), data={'data': '[b]test bbcode ajax preview[/b]'})\n        self.assertContains(response, '<strong>test bbcode ajax preview</strong>')\n\n    def test_headline(self):\n        self.forum.headline = 'test <b>headline</b>'\n        self.forum.save()\n        client = Client()\n        self.assertContains(client.get(self.forum.get_absolute_url()), 'test <b>headline</b>')\n\n    def test_quote(self):\n        self.login_client()\n        response = self.client.get(reverse('pybb:add_post', kwargs={'topic_id': self.topic.id}),\n                                   data={'quote_id': self.post.id, 'body': 'test tracking'}, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(response, self.post.body)\n\n    def test_edit_post(self):\n        self.login_client()\n        edit_post_url = reverse('pybb:edit_post', kwargs={'pk': self.post.id})\n        response = self.client.get(edit_post_url)\n        self.assertEqual(response.status_code, 200)\n        self.assertIsNone(Post.objects.get(id=self.post.id).updated)\n        tree = html.fromstring(response.content)\n        values = dict(tree.xpath('//form[@method=\"post\"]')[0].form_values())\n        values['body'] = 'test edit'\n        response = self.client.post(edit_post_url, data=values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(Post.objects.get(pk=self.post.id).body, 'test edit')\n        response = self.client.get(self.post.get_absolute_url(), follow=True)\n        self.assertContains(response, 'test edit')\n        self.assertIsNotNone(Post.objects.get(id=self.post.id).updated)\n\n        # Check admin form\n        orig_conf = defaults.PYBB_ENABLE_ADMIN_POST_FORM\n\n        self.user.is_staff = True\n        self.user.save()\n\n        defaults.PYBB_ENABLE_ADMIN_POST_FORM = False\n        response = self.client.get(edit_post_url)\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content)\n        values = dict(tree.xpath('//form[@method=\"post\"]')[0].form_values())\n        self.assertNotIn('login', values)\n        values['body'] = 'test edit'\n        values['login'] = 'new_login'\n        response = self.client.post(edit_post_url, data=values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(response, 'test edit')\n        self.assertNotContains(response, 'new_login')\n\n        defaults.PYBB_ENABLE_ADMIN_POST_FORM = True\n        response = self.client.get(edit_post_url)\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content)\n        values = dict(tree.xpath('//form[@method=\"post\"]')[0].form_values())\n        self.assertIn('login', values)\n        values['body'] = 'test edit 2'\n        values['login'] = 'new_login 2'\n        response = self.client.post(edit_post_url, data=values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(response, 'test edit 2')\n        self.assertContains(response, 'new_login 2')\n\n        defaults.PYBB_ENABLE_ADMIN_POST_FORM = orig_conf\n\n    def test_admin_post_add(self):\n        self.user.is_staff = True\n        self.user.save()\n        self.login_client()\n        response = self.create_post_via_http(self.client, topic_id=self.topic.id,\n                                             quote_id=self.post.id, body='test admin post', user='zeus')\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(response, 'test admin post')\n\n    def test_stick(self):\n        self.user.is_superuser = True\n        self.user.save()\n        self.login_client()\n        self.assertEqual(\n            self.client.get(reverse('pybb:stick_topic', kwargs={'pk': self.topic.id}), follow=True).status_code, 200)\n        self.assertEqual(\n            self.client.get(reverse('pybb:unstick_topic', kwargs={'pk': self.topic.id}), follow=True).status_code, 200)\n\n    def test_delete_view(self):\n        self.user.is_superuser = True\n        self.user.save()\n        self.login_client()\n\n        post = self.create_post(topic=self.topic, user=self.user, body='test to delete')\n\n        self.assertEqual(Post.objects.filter(id=post.id).count(), 1)\n        self.assertEqual(Post.objects.filter(id=self.post.id).count(), 1)\n        self.assertEqual(Post.objects.filter(topic=self.topic.id).count(), 2)\n\n        response = self.client.post(reverse('pybb:delete_post', args=[post.id]), follow=True)\n        self.assertEqual(response.status_code, 200)\n        # Check that topic and forum exists ;)\n        self.assertEqual(Post.objects.filter(id=post.id).count(), 0)\n        self.assertEqual(Post.objects.filter(topic=self.topic.id).count(), 1)\n        self.assertEqual(Topic.objects.filter(id=self.topic.id).count(), 1)\n        self.assertEqual(Forum.objects.filter(id=self.forum.id).count(), 1)\n\n        # Delete topic\n        response = self.client.post(reverse('pybb:delete_post', args=[self.post.id]), follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(Post.objects.filter(id=self.post.id).count(), 0)\n        self.assertEqual(Post.objects.filter(topic=self.topic.id).count(), 0)\n        self.assertEqual(Topic.objects.filter(id=self.topic.id).count(), 0)\n        self.assertEqual(Forum.objects.filter(id=self.forum.id).count(), 1)\n\n    def test_open_close(self):\n        self.user.is_superuser = True\n        self.user.save()\n        self.login_client()\n        user2 = User.objects.create_user('user2', 'user2@someserver.com', 'user2')\n        client = Client()\n        client.login(username='user2', password='user2')\n\n        response = self.client.get(reverse('pybb:close_topic', args=[self.topic.id]), follow=True)\n        self.assertEqual(response.status_code, 200)\n        response = self.create_post_via_http(client, topic_id=self.topic.id, body='test closed')\n        self.assertEqual(response.status_code, 403)\n        response = self.client.get(reverse('pybb:open_topic', args=[self.topic.id]), follow=True)\n        self.assertEqual(response.status_code, 200)\n        response = self.create_post_via_http(client, topic_id=self.topic.id, body='test closed')\n        self.assertEqual(response.status_code, 200)\n\n    def test_subscription(self):\n        user2 = User.objects.create_user(username='user2', password='user2', email='user2@someserver.com')\n        user3 = User.objects.create_user(username='user3', password='user3', email='user3@example.com')\n        client = Client()\n\n        client.login(username='user2', password='user2')\n        subscribe_url = reverse('pybb:add_subscription', args=[self.topic.id])\n        response = client.get(self.topic.get_absolute_url())\n        subscribe_links = html.fromstring(response.content).xpath('//a[@href=\"%s\"]' % subscribe_url)\n        self.assertEqual(len(subscribe_links), 1)\n\n        response = client.get(subscribe_url, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertIn(user2, self.topic.subscribers.all())\n\n        self.topic.subscribers.add(user3)\n\n        # create a new reply (with another user)\n        self.client.login(username='zeus', password='zeus')\n\n        response = self.create_post_via_http(self.client, topic_id=self.topic.id,\n                                             body='test subscribtion юникод')\n        self.assertEqual(response.status_code, 200)\n        new_post = Post.objects.order_by('-id')[0]\n\n        # there should only be one email in the outbox (to user2) because @example.com are ignored\n        self.assertEqual(len(mail.outbox), 1)\n        self.assertEqual(mail.outbox[0].to[0], user2.email)\n        self.assertTrue([msg for msg in mail.outbox if new_post.get_absolute_url() in msg.body])\n\n        # unsubscribe\n        client.login(username='user2', password='user2')\n        self.assertTrue([msg for msg in mail.outbox if new_post.get_absolute_url() in msg.body])\n        response = client.get(reverse('pybb:delete_subscription', args=[self.topic.id]), follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertNotIn(user2, self.topic.subscribers.all())\n\n    def test_subscription_disabled(self):\n        orig_conf = defaults.PYBB_DISABLE_SUBSCRIPTIONS\n        defaults.PYBB_DISABLE_SUBSCRIPTIONS = True\n\n        user2 = User.objects.create_user(username='user2', password='user2', email='user2@someserver.com')\n        user3 = User.objects.create_user(username='user3', password='user3', email='user3@someserver.com')\n        client = Client()\n\n        client.login(username='user2', password='user2')\n        subscribe_url = reverse('pybb:add_subscription', args=[self.topic.id])\n        response = client.get(self.topic.get_absolute_url())\n        subscribe_links = html.fromstring(response.content).xpath('//a[@href=\"%s\"]' % subscribe_url)\n        self.assertEqual(len(subscribe_links), 0)\n\n        response = client.get(subscribe_url, follow=True)\n        self.assertEqual(response.status_code, 403)\n\n        self.topic.subscribers.add(user3)\n\n        # create a new reply (with another user)\n        self.client.login(username='zeus', password='zeus')\n        response = self.create_post_via_http(self.client, topic_id=self.topic.id,\n                                             body='test subscribtion юникод')\n        self.assertEqual(response.status_code, 200)\n        new_post = Post.objects.order_by('-id')[0]\n\n        # there should be one email in the outbox (user3)\n        #because already subscribed users will still receive notifications.\n        self.assertEqual(len(mail.outbox), 1)\n        self.assertEqual(mail.outbox[0].to[0], user3.email)\n\n        defaults.PYBB_DISABLE_SUBSCRIPTIONS = orig_conf\n\n    def _test_notification_emails_init(self):\n        user2 = User.objects.create_user(username='user2', password='user2', email='user2@someserver.com')\n        profile2 = util.get_pybb_profile(user2)\n        profile2.language = 'en'\n        profile2.save()\n        user3 = User.objects.create_user(username='user3', password='user3', email='user3@someserver.com')\n        profile3 = util.get_pybb_profile(user3)\n        profile3.language = 'fr'\n        profile3.save()\n        self.topic.subscribers.add(user2)\n        self.topic.subscribers.add(user3)\n\n        # create a new reply (with another user)\n        self.client.login(username='zeus', password='zeus')\n        add_post_url = reverse('pybb:add_post', args=[self.topic.id])\n        response = self.client.get(add_post_url)\n        values = self.get_form_values(response)\n        values['body'] = 'test notification HTML'\n        response = self.client.post(add_post_url, values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        new_post = Post.objects.order_by('-id')[0]\n\n        return user2, user3, new_post\n\n    def test_notification_emails_alternative(self):\n        user2, user3, new_post = self._test_notification_emails_init()\n        # there should be two emails in the outbox (user2 and user3)\n        self.assertEqual(len(mail.outbox), 2)\n        email = mail.outbox[0]\n        self.assertEqual(email.to[0], user2.email)\n\n        # HTML alternative must be available\n        self.assertEqual(len(email.alternatives), 1)\n        self.assertEqual(email.alternatives[0][1], 'text/html')\n\n    def test_notification_emails_content(self):\n        user2, user3, new_post = self._test_notification_emails_init()\n        # there should be two emails in the outbox (user2 and user3)\n        self.assertEqual(len(mail.outbox), 2)\n        email = mail.outbox[0]\n        html_body = email.alternatives[0][0]\n        text_body = email.body\n\n        # emails (txt and HTML) must contains links to post AND to topic AND to unsubscribe.\n        delete_url = reverse('pybb:delete_subscription', args=[self.topic.id])\n        post_url = new_post.get_absolute_url()\n        topic_url = new_post.topic.get_absolute_url()\n        links = html.fromstring(html_body).xpath('//a')\n        found = {'post_url': False, 'topic_url': False, 'delete_url': False,}\n        for link in links:\n            if delete_url in link.attrib['href']:\n                found['delete_url'] = True\n            elif post_url in link.attrib['href']:\n                found['post_url'] = True\n            elif topic_url in link.attrib['href']:\n                found['topic_url'] = True\n        self.assertTrue(found['delete_url'])\n        self.assertTrue(found['post_url'])\n        self.assertTrue(found['topic_url'])\n        self.assertIn(post_url, text_body)\n        self.assertIn(topic_url, text_body)\n        self.assertIn(delete_url, text_body)\n\n\n    def test_notification_emails_translation(self):\n        user2, user3, new_post = self._test_notification_emails_init()\n        # there should be two emails in the outbox (user2 and user3)\n        self.assertEqual(len(mail.outbox), 2)\n        if mail.outbox[0].to[0] == user2.email:\n            email_en, email_fr = mail.outbox[0], mail.outbox[1]\n        else:  # pragma: no cover\n            email_fr, email_en = mail.outbox[0], mail.outbox[1]\n\n        subject_en = \"New answer in topic that you subscribed.\"\n        self.assertEqual(email_en.subject, subject_en)\n        self.assertNotEqual(email_fr.subject, subject_en)\n\n    def test_notifications_disabled(self):\n        orig_conf = defaults.PYBB_DISABLE_NOTIFICATIONS\n        defaults.PYBB_DISABLE_NOTIFICATIONS = True\n\n        user2 = User.objects.create_user(username='user2', password='user2', email='user2@someserver.com')\n        user3 = User.objects.create_user(username='user3', password='user3', email='user3@someserver.com')\n        client = Client()\n\n        client.login(username='user2', password='user2')\n        subscribe_url = reverse('pybb:add_subscription', args=[self.topic.id])\n        response = client.get(self.topic.get_absolute_url())\n        subscribe_links = html.fromstring(response.content).xpath('//a[@href=\"%s\"]' % subscribe_url)\n        self.assertEqual(len(subscribe_links), 1)\n        response = client.get(subscribe_url, follow=True)\n        self.assertEqual(response.status_code, 200)\n\n        self.topic.subscribers.add(user3)\n\n        # create a new reply (with another user)\n        self.client.login(username='zeus', password='zeus')\n        response = self.create_post_via_http(client, topic_id=self.topic.id,\n                                             body='test subscribtion юникод')\n        self.assertEqual(response.status_code, 200)\n        new_post = Post.objects.order_by('-id')[0]\n\n        # there should be no email in the outbox\n        self.assertEqual(len(mail.outbox), 0)\n\n        defaults.PYBB_DISABLE_NOTIFICATIONS = orig_conf\n\n    def test_forum_subscription(self):\n        url = reverse('pybb:forum_subscription', kwargs={'pk': self.forum.id})\n        user2 = User.objects.create_user(username='user2', password='user2', email='user2@dns.com')\n        user3 = User.objects.create_user(username='user3', password='user3', email='user3@dns.com')\n        client = Client()\n        client.login(username='user2', password='user2')\n        parser = html.HTMLParser(encoding='utf8')\n\n        # Check we have the \"Subscribe\" link\n        response = client.get(self.forum.get_absolute_url())\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content, parser=parser)\n        self.assertTrue(['Subscribe'], tree.xpath('//a[@href=\"%s\"]/text()' % url))\n\n        # check anonymous can't subscribe :\n        anonymous_client = Client()\n        response = anonymous_client.get(url)\n        self.assertEqual(response.status_code, 302)\n\n        # click on this link with a logged account\n        response = client.get(url)\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content, parser=parser)\n\n        # Check we have 4 radio inputs\n        radio_ids = tree.xpath('//input[@type=\"radio\"]/@id')\n        self.assertEqual(['id_type_0', 'id_type_1', 'id_topics_0', 'id_topics_1'], radio_ids)\n\n        # submit the form to be notified for new topics\n        values = self.get_form_values(response, form='forum_subscription')\n        values.update({'type': ForumSubscription.TYPE_NOTIFY, 'topics': 'new', })\n        response = client.post(url, values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertTrue('subscription' in response.context_data)\n        self.assertEqual(response.context_data['subscription'].forum, self.forum)\n        tree = html.fromstring(response.content, parser=parser)\n        self.assertTrue(['Manage subscription'], tree.xpath('//a[@href=\"%s\"]/text()' % url))\n\n        client = Client()\n        client.login(username='user3', password='user3')\n        response = client.get(url)\n        values = self.get_form_values(response, form='forum_subscription')\n        values.update({'type': ForumSubscription.TYPE_SUBSCRIBE, 'topics': 'new', })\n        response = client.post(url, values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertTrue('subscription' in response.context_data)\n        self.assertTrue(response.context_data['subscription'].forum, self.forum)\n        # Check there is still only zeus who subscribe to topic\n        usernames = list(self.topic.subscribers.all().values_list('username', flat=True))\n        self.assertEqual(usernames, [self.user.username, ])\n\n        topic = Topic(name='newtopic', forum=self.forum, user=self.user)\n        topic.save()\n        # user2 should have a mail\n        self.assertEqual(1, len(mail.outbox))\n        self.assertEqual([user2.email, ], mail.outbox[0].to)\n        self.assertEqual('New topic in forum that you subscribed.', mail.outbox[0].subject)\n        self.assertTrue('User zeus post a new topic' in mail.outbox[0].body)\n        self.assertTrue(topic.get_absolute_url() in mail.outbox[0].body)\n        self.assertTrue(url in mail.outbox[0].body)\n        post = self.create_post(topic=topic, user=self.user, body='body')\n\n        # Now, user3 should be subscribed to this new topic\n        usernames = topic.subscribers.all().order_by('username')\n        usernames = list(usernames.values_list('username', flat=True))\n        self.assertEqual(usernames, ['user3', self.user.username])\n        self.assertEqual(2, len(mail.outbox))\n        self.assertEqual([user3.email, ], mail.outbox[1].to)\n        self.assertEqual('New answer in topic that you subscribed.', mail.outbox[1].subject)\n\n        # Now, we unsubscribe user3 to be auto subscribed\n        response = client.get(url)\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content, parser=parser)\n\n        # Check we have 5 radio inputs\n        radio_ids = tree.xpath('//input[@type=\"radio\"]/@id')\n        expected_inputs = [\n            'id_type_0', 'id_type_1', 'id_type_2',\n            'id_topics_0', 'id_topics_1'\n        ]\n        self.assertEqual(expected_inputs, radio_ids)\n        self.assertEqual(tree.xpath('//input[@id=\"id_type_2\"]/@value'), ['unsubscribe', ])\n        self.assertEqual(tree.xpath('//input[@id=\"id_type_1\"]/@checked'), ['checked', ])\n        values = self.get_form_values(response, form='forum_subscription')\n        values['type'] = 'unsubscribe'\n        response = client.post(url, values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertTrue('subscription' in response.context_data)\n        self.assertIsNone(response.context_data['subscription'])\n        # user3 should not be subscribed anymore to any forum\n        with self.assertRaises(ForumSubscription.DoesNotExist):\n            ForumSubscription.objects.get(user=user3)\n        # but should still be still subscribed to the topic\n        usernames = list(topic.subscribers.all().order_by('id').values_list('username', flat=True))\n        self.assertEqual(usernames, [self.user.username, 'user3', ])\n\n        # Update user2's subscription to be autosubscribed to all posts\n        client = Client()\n        client.login(username='user2', password='user2')\n        response = client.get(url)\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content, parser=parser)\n        self.assertEqual(tree.xpath('//input[@id=\"id_type_0\"]/@checked'), ['checked', ])\n        values = self.get_form_values(response, form='forum_subscription')\n        values['type'] = ForumSubscription.TYPE_SUBSCRIBE\n        values['topics'] = 'all'\n        response = client.post(url, values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        # user2 should now be subscribed to all self.forum's topics\n        subscribed_topics = list(user2.subscriptions.all().order_by('name').values_list('name', flat=True))\n        expected_topics = list(self.forum.topics.all().order_by('name').values_list('name', flat=True))\n        self.assertEqual(subscribed_topics, expected_topics)\n\n        # unsubscribe user2 to all topics\n        response = client.get(url)\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content, parser=parser)\n        self.assertEqual(tree.xpath('//input[@id=\"id_type_2\"]/@value'), ['unsubscribe', ])\n        values = self.get_form_values(response, form='forum_subscription')\n        values['type'] = 'unsubscribe'\n        values['topics'] = 'all'\n        response = client.post(url, values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        # user2 should now be subscribed to zero topic\n        topics = list(user2.subscriptions.all().values_list('name', flat=True))\n        self.assertEqual(topics, [])\n\n    def test_topic_updated(self):\n        topic = Topic(name='new topic', forum=self.forum, user=self.user)\n        topic.save()\n        post = self.create_post(_sleep=True, topic=topic, user=self.user, body='bbcode [b]test[/b]')\n        client = Client()\n        response = client.get(self.forum.get_absolute_url())\n        self.assertEqual(response.context['topic_list'][0], topic)\n        post = self.create_post(topic=self.topic, user=self.user, body='bbcode [b]test[/b]')\n        client = Client()\n        response = client.get(self.forum.get_absolute_url())\n        self.assertEqual(response.context['topic_list'][0], self.topic)\n\n    def test_topic_deleted(self):\n        forum_1 = Forum.objects.create(name='new forum', category=self.category)\n        topic_1 = Topic.objects.create(name='new topic', forum=forum_1, user=self.user)\n        post_1 = self.create_post(topic=topic_1, user=self.user, body='test')\n        post_1 = Post.objects.get(id=post_1.id)\n\n        self.assertEqual(topic_1.updated, post_1.created)\n        self.assertEqual(forum_1.updated, post_1.created)\n\n        sleep_only_if_required(1)\n        topic_2 = Topic.objects.create(name='another topic', forum=forum_1, user=self.user)\n        post_2 = self.create_post(topic=topic_2, user=self.user, body='another test')\n        post_2 = Post.objects.get(id=post_2.id)\n\n        self.assertEqual(topic_2.updated, post_2.created)\n        self.assertEqual(forum_1.updated, post_2.created)\n\n        topic_2.delete()\n        forum_1 = Forum.objects.get(id=forum_1.id)\n        self.assertEqual(forum_1.updated, post_1.created)\n        self.assertEqual(forum_1.topic_count, 1)\n        self.assertEqual(forum_1.post_count, 1)\n\n        post_1.delete()\n        forum_1 = Forum.objects.get(id=forum_1.id)\n        self.assertEqual(forum_1.topic_count, 0)\n        self.assertEqual(forum_1.post_count, 0)\n\n    def test_user_views(self):\n        response = self.client.get(reverse('pybb:user', kwargs={'username': self.user.username}))\n        self.assertEqual(response.status_code, 200)\n\n        response = self.client.get(reverse('pybb:user_posts', kwargs={'username': self.user.username}))\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.context['object_list'].count(), 1)\n\n        response = self.client.get(reverse('pybb:user_topics', kwargs={'username': self.user.username}))\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.context['object_list'].count(), 1)\n\n        self.topic.forum.hidden = True\n        self.topic.forum.save()\n\n        self.client.logout()\n\n        response = self.client.get(reverse('pybb:user_posts', kwargs={'username': self.user.username}))\n        self.assertEqual(response.context['object_list'].count(), 0)\n\n        response = self.client.get(reverse('pybb:user_topics', kwargs={'username': self.user.username}))\n        self.assertEqual(response.context['object_list'].count(), 0)\n\n    def test_post_count(self):\n        topic = Topic(name='etopic', forum=self.forum, user=self.user)\n        topic.save()\n        post = self.create_post(topic=topic, user=self.user, body='test')\n        self.assertEqual(util.get_pybb_profile(self.user).post_count, 2)\n        post.body = 'test2'\n        post.save()\n        self.assertEqual(Profile.objects.get(pk=util.get_pybb_profile(self.user).pk).post_count, 2)\n        post.delete()\n        self.assertEqual(Profile.objects.get(pk=util.get_pybb_profile(self.user).pk).post_count, 1)\n\n    def test_latest_topics_tag(self):\n        Topic.objects.all().delete()\n        for i in range(10):\n            Topic.objects.create(name='topic%s' % i, user=self.user, forum=self.forum)\n        latest_topics = pybb_get_latest_topics(context=None, user=self.user)\n        self.assertEqual(len(latest_topics), 5)\n        self.assertEqual(latest_topics[0].name, 'topic9')\n        self.assertEqual(latest_topics[4].name, 'topic5')\n\n    def test_latest_posts_tag(self):\n        Post.objects.all().delete()\n        for i in range(10):\n            self.create_post(body='post%s' % i, user=self.user, topic=self.topic)\n        latest_topics = pybb_get_latest_posts(context=None, user=self.user)\n        self.assertEqual(len(latest_topics), 5)\n        self.assertEqual(latest_topics[0].body, 'post9')\n        self.assertEqual(latest_topics[4].body, 'post5')\n\n    def test_multiple_objects_returned(self):\n        \"\"\"\n        see issue #87: https://github.com/hovel/pybbm/issues/87\n        \"\"\"\n        self.assertFalse(self.user.is_superuser)\n        self.assertFalse(self.user.is_staff)\n        self.assertFalse(self.topic.on_moderation)\n        self.assertEqual(self.topic.user, self.user)\n        user1 = User.objects.create_user('geyser', 'geyser@localhost', 'geyser')\n        self.topic.forum.moderators.add(self.user)\n        self.topic.forum.moderators.add(user1)\n\n        self.login_client()\n        response = self.client.get(reverse('pybb:add_post', kwargs={'topic_id': self.topic.id}))\n        self.assertEqual(response.status_code, 200)\n\n    def tearDown(self):\n        defaults.PYBB_ENABLE_ANONYMOUS_POST = self.ORIG_PYBB_ENABLE_ANONYMOUS_POST\n        defaults.PYBB_PREMODERATION = self.ORIG_PYBB_PREMODERATION\n\n    def test_managing_forums(self):\n        _attach_perms_class('pybb.tests.CustomPermissionHandler')\n        forum2 = Forum.objects.create(name='foo2', description='bar2', category=self.category)\n        Forum.objects.create(name='foo3', description='bar3', category=self.category)\n        moderator = User.objects.create_user('moderator', 'moderator@localhost', 'moderator')\n        self.login_client()\n\n        #test the visibility of the button and the access to the page\n        response = self.client.get(reverse('pybb:user', kwargs={'username': moderator.username}))\n        self.assertNotContains(\n            response, '<a href=\"%s\"' % reverse(\n                    'pybb:edit_privileges', kwargs={'username': moderator.username}\n                )\n            )\n        response = self.client.get(reverse('pybb:edit_privileges', kwargs={'username': moderator.username}))\n        self.assertEqual(response.status_code, 403)\n        add_change_forum_permission = Permission.objects.get_by_natural_key('change_forum','pybb','forum')\n        self.user.user_permissions.add(add_change_forum_permission)\n        self.user.is_staff = True\n        self.user.save()\n        response = self.client.get(reverse('pybb:user', kwargs={'username': moderator.username}))\n        self.assertContains(\n            response, '<a href=\"%s\"' % reverse(\n                    'pybb:edit_privileges', kwargs={'username': moderator.username}\n                )\n            )\n        response = self.client.get(reverse('pybb:edit_privileges', kwargs={'username': moderator.username}))\n        self.assertEqual(response.status_code, 200)\n\n        # test if there are as many chechkboxs as forums in the category\n        inputs = dict(html.fromstring(response.content).xpath('//form[@class=\"%s\"]' % \"privileges-edit\")[0].inputs)\n        self.assertEqual(\n            len(response.context['form'].authorized_forums),\n            len(inputs['cat_%d' % self.category.pk])\n            )\n\n        # test to add user as moderator\n        # get csrf token\n        values = self.get_form_values(response, \"privileges-edit\")\n        # dynamic contruction of the list corresponding to custom may_change_forum\n        available_forums = [forum for forum in self.category.forums.all() if not forum.pk % 3 == 0]\n        values['cat_%d' % self.category.pk] = [forum.pk for forum in available_forums]\n        response = self.client.post(\n            reverse('pybb:edit_privileges', kwargs={'username': moderator.username}), data=values, follow=True\n            )\n        self.assertEqual(response.status_code, 200)\n\n        correct_list = sorted(available_forums, key=lambda forum: forum.pk)\n        moderator_list = sorted([forum for forum in moderator.forum_set.all()], key=lambda forum: forum.pk)\n        self.assertEqual(correct_list, moderator_list)\n\n        # test to remove user as moderator\n        values['cat_%d' % self.category.pk] = [available_forums[0].pk, ]\n        response = self.client.post(\n                reverse('pybb:edit_privileges', kwargs={'username': moderator.username}), data=values, follow=True\n            )\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual([available_forums[0], ], [forum for forum in moderator.forum_set.all()])\n        values['cat_%d' % self.category.pk] = []\n        response = self.client.post(\n                reverse('pybb:edit_privileges', kwargs={'username': moderator.username}), data=values, follow=True\n            )\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(0, moderator.forum_set.count())\n        self.user.user_permissions.remove(add_change_forum_permission)\n        _detach_perms_class()\n\nclass MoveAndSplitPostTest(TestCase, SharedTestModule):\n\n    def create_initial(self):\n        if not getattr(self, 'user', None):\n            self.create_user()\n        self.category = Category.objects.create(name='foo', position=1)\n        self.forum_1 = Forum.objects.create(name='forum_1', category=self.category, position=1)\n        self.topic = Topic.objects.create(name='abc', forum=self.forum_1, user=self.user, views=7)\n        self.posts = []\n        self.posts.append(self.create_post(topic=self.topic, user=self.user, body='zero'))\n        self.posts.append(self.create_post(topic=self.topic, user=self.user, body='one'))\n        self.posts.append(self.create_post(topic=self.topic, user=self.user, body='two'))\n        self.posts.append(self.create_post(topic=self.topic, user=self.user, body='three'))\n        self.posts.append(self.create_post(topic=self.topic, user=self.user, body='four'))\n        self.posts.append(self.create_post(topic=self.topic, user=self.user, body='five'))\n\n        self.forum_2 = Forum.objects.create(name='forum_2', category=self.category, position=2)\n        self.forum_3 = Forum.objects.create(name='forum_3', category=self.category, hidden=True)\n\n        self.moderator = User.objects.create_user('moderator', 'moderator@localhost', 'moderator')\n        self.forum_1.moderators.add(self.moderator)\n        self.forum_2.moderators.add(self.moderator)\n\n    def test_move_topic(self):\n        self.create_initial()\n        move_topic_url = reverse('pybb:move_post', kwargs={'pk': self.topic.head.pk})\n\n        # user can not move posts, even if he is the author\n        response = self.get_with_user(move_topic_url, 'zeus', 'zeus')\n        self.assertEqual(response.status_code, 403)\n\n        # moderator can\n        self.login_client('moderator', 'moderator')\n        response = self.client.get(move_topic_url)\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(self.forum_1.topic_count, 1)\n        self.assertEqual(self.forum_1.post_count, 6)\n\n        # check form values\n        form_values = self.get_form_values(response, 'move-post-form')\n        move_to_choices = response.context['form'].fields['move_to'].choices\n        self.assertTrue('name' in response.context['form'].fields)\n        self.assertTrue('number' not in response.context['form'].fields)\n        self.assertEqual(len(move_to_choices), 1)\n        self.assertEqual(move_to_choices[0][0], '%s' % self.category)\n        self.assertEqual(len(move_to_choices[0][1]), 1)\n        # moderator has no access to forum 3 (hidden), so he can't move the topic in this forum\n        self.assertEqual(move_to_choices[0][1][0][0], self.forum_2.pk)\n\n        # move in forum_2\n        form_values['move_to'] = self.forum_2.pk\n        response = self.client.post(move_topic_url, form_values, follow=True)\n        forum_1 = Forum.objects.get(pk=self.forum_1.pk)\n        forum_2 = Forum.objects.get(pk=self.forum_2.pk)\n        topic = Topic.objects.get(pk=self.topic.pk)\n        self.assertEqual(topic.forum.pk, forum_2.pk)\n        self.assertEqual(forum_1.topic_count, 0)\n        self.assertEqual(forum_1.post_count, 0)\n        self.assertEqual(forum_2.topic_count, 1)\n        self.assertEqual(forum_2.post_count, 6)\n        self.assertEqual(topic.views, 8)  # +1 because topic is currently viewed by moderator\n\n    def test_split_posts_all(self):\n        self.create_initial()\n        split_posts_url = reverse('pybb:move_post', kwargs={'pk': self.posts[2].pk})\n\n        self.login_client('moderator', 'moderator')\n        response = self.client.get(split_posts_url)\n        self.assertEqual(response.status_code, 200)\n\n        # check form values\n        form_values = self.get_form_values(response, 'move-post-form')\n        move_to_choices = response.context['form'].fields['move_to'].choices\n        self.assertTrue('name' in response.context['form'].fields)\n        self.assertTrue('number' in response.context['form'].fields)\n        self.assertEqual(len(move_to_choices), 1)\n        self.assertEqual(move_to_choices[0][0], '%s' % self.category)\n        self.assertEqual(len(move_to_choices[0][1]), 2)\n        # moderator has no access to forum 3 (hidden), so he can't move the topic in this forum\n        # but forum_1 is in choices because we can split in the same forum\n        self.assertEqual(move_to_choices[0][1][0][0], self.forum_1.pk)\n        self.assertEqual(move_to_choices[0][1][1][0], self.forum_2.pk)\n\n        # move 4 last posts in forum_2\n        form_values['move_to'] = self.forum_2.pk\n        form_values['number'] = -1\n        form_values['name'] = 'new topic'\n        response = self.client.post(split_posts_url, form_values, follow=True)\n        forum_1 = Forum.objects.get(pk=self.forum_1.pk)\n        forum_2 = Forum.objects.get(pk=self.forum_2.pk)\n        topic_1 = Topic.objects.get(pk=self.topic.pk)\n        # initial topic is still in the forum 1\n        self.assertEqual(topic_1.forum.pk, forum_1.pk)\n        # it has now only 2 posts\n        self.assertEqual(topic_1.posts.count(), 2)\n        # head post of the topic is post \"zero\"\n        self.assertEqual(topic_1.head.pk, self.posts[0].pk)\n        # last post of the topic is post \"one\"\n        self.assertEqual(topic_1.last_post.pk, self.posts[1].pk)\n\n        try:\n            # new topic exists\n            topic_2 = Topic.objects.get(forum=forum_2)\n        except:\n            self.fail('A new topic in forum 2 should have been created by spliting posts')\n\n        # it has new name\n        self.assertEqual(topic_2.name, 'new topic')\n        # it has 4 posts\n        self.assertEqual(topic_2.posts.count(), 4)\n        # head post of the topic is post \"two\"\n        self.assertEqual(topic_2.head.pk, self.posts[2].pk)\n        # last post of the topic is post \"five\"\n        self.assertEqual(topic_2.last_post.pk, self.posts[5].pk)\n\n        # check topic and forum counters\n        self.assertEqual(topic_1.post_count, 2)\n        self.assertEqual(topic_1.views, 7)\n        self.assertEqual(forum_1.topic_count, 1)\n        self.assertEqual(forum_1.post_count, 2)\n        self.assertEqual(topic_2.post_count, 4)\n        self.assertEqual(forum_2.topic_count, 1)\n        self.assertEqual(forum_2.post_count, 4)\n        self.assertEqual(topic_2.views, 1)  # +1 because topic is currently viewed by moderator\n\n    def test_split_posts_last(self):\n        self.create_initial()\n        split_posts_url = reverse('pybb:move_post', kwargs={'pk': self.posts[5].pk})\n\n        self.login_client('moderator', 'moderator')\n        response = self.client.get(split_posts_url)\n        self.assertEqual(response.status_code, 200)\n\n        form_values = self.get_form_values(response, 'move-post-form')\n\n        # move last post in forum_2\n        form_values['move_to'] = self.forum_2.pk\n        form_values['number'] = -1\n        response = self.client.post(split_posts_url, form_values, follow=True)\n        forum_1 = Forum.objects.get(pk=self.forum_1.pk)\n        forum_2 = Forum.objects.get(pk=self.forum_2.pk)\n        self.assertEqual(forum_1.topic_count, 1)\n        self.assertEqual(forum_1.post_count, 5)\n        self.assertEqual(forum_2.topic_count, 1)\n        self.assertEqual(forum_2.post_count, 1)\n        topic_2 = Post.objects.get(pk=self.posts[5].pk).topic\n        self.assertNotEqual(self.topic.pk, topic_2.pk)\n        self.assertEqual(self.topic.name, topic_2.name)\n        self.assertEqual(self.topic.slug, topic_2.slug)  # same slug because not in same forum\n\n    def test_split_posts_some_same_forum(self):\n        self.create_initial()\n        split_posts_url = reverse('pybb:move_post', kwargs={'pk': self.posts[1].pk})\n\n        self.login_client('moderator', 'moderator')\n        response = self.client.get(split_posts_url)\n        self.assertEqual(response.status_code, 200)\n\n        form_values = self.get_form_values(response, 'move-post-form')\n\n        # post stay in same forum but are splitted in a new topic\n        form_values['move_to'] = self.forum_1.pk\n        form_values['number'] = 2\n        response = self.client.post(split_posts_url, form_values, follow=True)\n        forum_1 = Forum.objects.get(pk=self.forum_1.pk)\n        forum_2 = Forum.objects.get(pk=self.forum_2.pk)\n        topic_1 = Topic.objects.get(pk=self.topic.pk)\n        topic_2 = Post.objects.get(pk=self.posts[1].pk).topic\n        # splitted in 2 topics\n        self.assertNotEqual(topic_1.pk, topic_2.pk)\n        self.assertEqual(topic_1.name, topic_2.name)\n        self.assertNotEqual(topic_1.slug, topic_2.slug)  # can't keep same slug in same forum\n        self.assertEqual(topic_1.posts.count(), 3)\n        self.assertEqual(topic_2.posts.count(), 3)\n        # stay in same forum\n        self.assertEqual(topic_1.forum.pk, topic_2.forum.pk)\n        # posts 0 4 5 are still in topic 1\n        self.assertEqual(topic_1.head.pk, self.posts[0].pk)\n        self.assertEqual(topic_1.last_post.pk, self.posts[5].pk)\n        # posts 1 2 3 are now in topic 2\n        self.assertEqual(topic_2.head.pk, self.posts[1].pk)\n        self.assertEqual(topic_2.last_post.pk, self.posts[3].pk)\n\n    def test_split_posts_some_other_forum(self):\n        self.create_initial()\n        split_posts_url = reverse('pybb:move_post', kwargs={'pk': self.posts[1].pk})\n\n        self.login_client('moderator', 'moderator')\n        response = self.client.get(split_posts_url)\n        self.assertEqual(response.status_code, 200)\n\n        form_values = self.get_form_values(response, 'move-post-form')\n\n        # posts splitted in forum 2\n        form_values['move_to'] = self.forum_2.pk\n        form_values['number'] = 2\n        response = self.client.post(split_posts_url, form_values, follow=True)\n        forum_1 = Forum.objects.get(pk=self.forum_1.pk)\n        forum_2 = Forum.objects.get(pk=self.forum_2.pk)\n        topic_1 = Topic.objects.get(pk=self.topic.pk)\n        topic_2 = Post.objects.get(pk=self.posts[1].pk).topic\n        # splitted in 2 topics\n        self.assertNotEqual(topic_1.pk, topic_2.pk)\n        self.assertEqual(topic_1.posts.count(), 3)\n        self.assertEqual(topic_2.posts.count(), 3)\n        # not anymore in same forum\n        self.assertNotEqual(topic_1.forum.pk, topic_2.forum.pk)\n        # posts 0 4 5 are still in topic 1\n        self.assertEqual(topic_1.head.pk, self.posts[0].pk)\n        self.assertEqual(topic_1.last_post.pk, self.posts[5].pk)\n        # posts 1 2 3 are now in topic 2\n        self.assertEqual(topic_2.head.pk, self.posts[1].pk)\n        self.assertEqual(topic_2.last_post.pk, self.posts[3].pk)\n\n\nclass AnonymousTest(TestCase, SharedTestModule):\n    def setUp(self):\n        self.ORIG_PYBB_ENABLE_ANONYMOUS_POST = defaults.PYBB_ENABLE_ANONYMOUS_POST\n        self.ORIG_PYBB_ANONYMOUS_USERNAME = defaults.PYBB_ANONYMOUS_USERNAME\n        self.PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER = defaults.PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER\n\n        defaults.PYBB_ENABLE_ANONYMOUS_POST = True\n        defaults.PYBB_ANONYMOUS_USERNAME = 'Anonymous'\n        self.user = User.objects.create_user('Anonymous', 'Anonymous@localhost', 'Anonymous')\n        self.category = Category.objects.create(name='foo')\n        self.forum = Forum.objects.create(name='xfoo', description='bar', category=self.category)\n        self.topic = Topic.objects.create(name='etopic', forum=self.forum, user=self.user)\n        self.post = self.create_post(body='body post', topic=self.topic, user=self.user)\n        add_post_permission = Permission.objects.get_by_natural_key('add_post', 'pybb', 'post')\n        self.user.user_permissions.add(add_post_permission)\n\n    def tearDown(self):\n        defaults.PYBB_ENABLE_ANONYMOUS_POST = self.ORIG_PYBB_ENABLE_ANONYMOUS_POST\n        defaults.PYBB_ANONYMOUS_USERNAME = self.ORIG_PYBB_ANONYMOUS_USERNAME\n        defaults.PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER = self.PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER\n\n    def test_anonymous_posting(self):\n        response = self.create_post_via_http(self.client, topic_id=self.topic.id,\n                                             body='test anonymous')\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(len(Post.objects.filter(body='test anonymous')), 1)\n        self.assertEqual(Post.objects.get(body='test anonymous').user, self.user)\n\n    def test_anonymous_cache_topic_views(self):\n        self.assertNotIn(util.build_cache_key('anonymous_topic_views', topic_id=self.topic.id), cache)\n        url = self.topic.get_absolute_url()\n        self.client.get(url)\n        self.assertEqual(cache.get(util.build_cache_key('anonymous_topic_views', topic_id=self.topic.id)), 1)\n        for _ in range(defaults.PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER - 2):\n            self.client.get(url)\n        self.assertEqual(Topic.objects.get(id=self.topic.id).views, 0)\n        self.assertEqual(cache.get(util.build_cache_key('anonymous_topic_views', topic_id=self.topic.id)),\n                         defaults.PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER - 1)\n        self.client.get(url)\n        self.assertEqual(Topic.objects.get(id=self.topic.id).views, defaults.PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER)\n        self.assertEqual(cache.get(util.build_cache_key('anonymous_topic_views', topic_id=self.topic.id)), 0)\n\n        views = Topic.objects.get(id=self.topic.id).views\n\n        defaults.PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER = None\n        self.client.get(url)\n        self.assertEqual(Topic.objects.get(id=self.topic.id).views, views + 1)\n        self.assertEqual(cache.get(util.build_cache_key('anonymous_topic_views', topic_id=self.topic.id)), 0)\n\ndef premoderate_test(user, post):\n    \"\"\"\n    Test premoderate function\n    Allow post without moderation for staff users only\n    \"\"\"\n    if user.username.startswith('allowed'):\n        return True\n    return False\n\n\nclass PreModerationTest(TestCase, SharedTestModule):\n    def setUp(self):\n        self.ORIG_PYBB_PREMODERATION = defaults.PYBB_PREMODERATION\n        defaults.PYBB_PREMODERATION = premoderate_test\n        self.create_user()\n        self.create_initial()\n        mail.outbox = []\n\n    def test_premoderation(self):\n        self.client.login(username='zeus', password='zeus')\n\n        response = self.create_post_via_http(self.client, topic_id=self.topic.id,\n                                             body='test premoderation')\n        self.assertEqual(response.status_code, 200)\n        post = Post.objects.get(body='test premoderation')\n        self.assertEqual(post.on_moderation, True)\n\n        # Post is visible by author\n        response = self.client.get(post.get_absolute_url(), follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(response, 'test premoderation')\n\n        # Post is not visible by anonymous user\n        client = Client()\n        response = client.get(post.get_absolute_url(), follow=True)\n        self.assertRedirects(response, settings.LOGIN_URL + '?next=%s' % post.get_absolute_url())\n        response = client.get(self.topic.get_absolute_url(), follow=True)\n        self.assertNotContains(response, 'test premoderation')\n\n        # But visible by superuser (with permissions)\n        user = User.objects.create_user('admin', 'admin@localhost', 'admin')\n        user.is_superuser = True\n        user.save()\n        client.login(username='admin', password='admin')\n        response = client.get(post.get_absolute_url(), follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(response, 'test premoderation')\n\n        # user with names stats with allowed can post without premoderation\n        user = User.objects.create_user('allowed_zeus', 'allowed_zeus@localhost', 'allowed_zeus')\n        client.login(username='allowed_zeus', password='allowed_zeus')\n        response = self.create_post_via_http(client, topic_id=self.topic.id,\n                                             body='test premoderation staff')\n        self.assertEqual(response.status_code, 200)\n        post = Post.objects.get(body='test premoderation staff')\n        client = Client()\n        response = client.get(post.get_absolute_url(), follow=True)\n        self.assertContains(response, 'test premoderation staff')\n\n        # Superuser can moderate\n        user.is_superuser = True\n        user.save()\n        admin_client = Client()\n        admin_client.login(username='admin', password='admin')\n        post = Post.objects.get(body='test premoderation')\n        response = admin_client.get(reverse('pybb:moderate_post', kwargs={'pk': post.id}), follow=True)\n        self.assertEqual(response.status_code, 200)\n\n        # Now all can see this post:\n        client = Client()\n        response = client.get(post.get_absolute_url(), follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(response, 'test premoderation')\n\n        # Other users can't moderate\n        post.on_moderation = True\n        post.save()\n        client.login(username='zeus', password='zeus')\n        response = client.get(reverse('pybb:moderate_post', kwargs={'pk': post.id}), follow=True)\n        self.assertEqual(response.status_code, 403)\n\n        # If user create new topic it goes to moderation if MODERATION_ENABLE\n        # When first post is moderated, topic becomes moderated too\n        self.client.login(username='zeus', password='zeus')\n        response = self.create_post_via_http(self.client, forum_id=self.forum.id,\n                                             body='new topic test', name='new topic name', poll_type=0)\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(response, 'new topic test')\n\n        client = Client()\n        response = client.get(self.forum.get_absolute_url())\n        self.assertEqual(response.status_code, 200)\n        self.assertNotContains(response, 'new topic name')\n        response = client.get(Topic.objects.get(name='new topic name').get_absolute_url())\n        self.assertEqual(response.status_code, 302)\n        response = admin_client.get(reverse('pybb:moderate_post',\n                                            kwargs={'pk': Post.objects.get(body='new topic test').id}),\n                                    follow=True)\n        self.assertEqual(response.status_code, 200)\n\n        response = client.get(self.forum.get_absolute_url())\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(response, 'new topic name')\n        response = client.get(Topic.objects.get(name='new topic name').get_absolute_url())\n        self.assertEqual(response.status_code, 200)\n\n    def tearDown(self):\n        defaults.PYBB_PREMODERATION = self.ORIG_PYBB_PREMODERATION\n\n\nclass AttachmentTest(TestCase, SharedTestModule):\n    def setUp(self):\n        self.PYBB_ATTACHMENT_ENABLE = defaults.PYBB_ATTACHMENT_ENABLE\n        defaults.PYBB_ATTACHMENT_ENABLE = True\n        self.ORIG_PYBB_PREMODERATION = defaults.PYBB_PREMODERATION\n        defaults.PYBB_PREMODERATION = False\n        self.file_name = os.path.join(os.path.dirname(__file__), 'static', 'pybb', 'img', 'attachment.png')\n        self.create_user()\n        self.create_initial()\n\n    def test_attachment(self):\n        self.login_client()\n        with open(self.file_name, 'rb') as fp:\n            response = self.create_post_via_http(self.client, topic_id=self.topic.id,\n                                                 **{'body': 'test attachment',\n                                                    'attachments-0-file': fp})\n        self.assertEqual(response.status_code, 200)\n        self.assertTrue(Post.objects.filter(body='test attachment').exists())\n        post = Post.objects.filter(body='test attachment')[0]\n        self.assertEqual(post.attachments.count(), 1)\n\n    def test_attachment_usage(self):\n        self.login_client()\n        body = (\n            'test attachment: '\n            '[img][file-1][/img]'\n            '[img][file-2][/img]'\n            '[img][file-1][/img]'\n            '[file-3]'\n            '[file-a]'\n        )\n        with open(self.file_name, 'rb') as fp, open(self.file_name, 'rb') as fp2:\n            response = self.create_post_via_http(self.client, topic_id=self.topic.id,\n                                                 **{'body': body,\n                                                    'attachments-0-file': fp,\n                                                    'attachments-1-file': fp2,\n                                                    'attachments-TOTAL_FORMS': 2,})\n        self.assertEqual(response.status_code, 200)\n        post = response.context['post']\n        imgs = html.fromstring(post.body_html).xpath('//img')\n        self.assertEqual(len(imgs), 3)\n        self.assertTrue('[file-3]' in post.body_html)\n        self.assertTrue('[file-a]' in post.body_html)\n\n        src1 = imgs[0].attrib.get('src')\n        src2 = imgs[1].attrib.get('src')\n        src3 = imgs[2].attrib.get('src')\n        attachments = [a for a in post.attachments.order_by('pk')]\n        self.assertEqual(src1, attachments[0].file.url)\n        self.assertEqual(src2, attachments[1].file.url)\n        self.assertEqual(src1, src3)\n\n    def tearDown(self):\n        defaults.PYBB_ATTACHMENT_ENABLE = self.PYBB_ATTACHMENT_ENABLE\n        defaults.PYBB_PREMODERATION = self.ORIG_PYBB_PREMODERATION\n\n\nclass PollTest(TestCase, SharedTestModule):\n    def setUp(self):\n        self.create_user()\n        self.create_initial()\n        self.PYBB_POLL_MAX_ANSWERS = defaults.PYBB_POLL_MAX_ANSWERS\n        defaults.PYBB_POLL_MAX_ANSWERS = 2\n\n    def test_poll_add(self):\n        self.login_client()\n        values = {}\n        values['body'] = 'test poll body'\n        values['name'] = 'test poll name'\n        values['poll_type'] = 0 # poll_type = None, create topic without poll answers\n        values['poll_question'] = 'q1'\n        values['poll_answers-0-text'] = 'answer1'\n        values['poll_answers-1-text'] = 'answer2'\n        values['poll_answers-TOTAL_FORMS'] = 2\n        response = self.create_post_via_http(self.client, forum_id=self.forum.id, **values)\n        self.assertEqual(response.status_code, 200)\n        new_topic = Topic.objects.get(name='test poll name')\n        self.assertIsNone(new_topic.poll_question)\n        self.assertFalse(PollAnswer.objects.filter(topic=new_topic).exists()) # no answers here\n\n        values['name'] = 'test poll name 1'\n        values['poll_type'] = 1\n        values['poll_answers-0-text'] = 'answer1' # not enough answers\n        values['poll_answers-TOTAL_FORMS'] = 1\n        response = self.create_post_via_http(self.client, forum_id=self.forum.id, **values)\n        self.assertFalse(Topic.objects.filter(name='test poll name 1').exists())\n\n        values['name'] = 'test poll name 1'\n        values['poll_type'] = 1\n        values['poll_answers-0-text'] = 'answer1' # too many answers\n        values['poll_answers-1-text'] = 'answer2'\n        values['poll_answers-2-text'] = 'answer3'\n        values['poll_answers-TOTAL_FORMS'] = 3\n        response = self.create_post_via_http(self.client, forum_id=self.forum.id, **values)\n        self.assertFalse(Topic.objects.filter(name='test poll name 1').exists())\n\n        values['name'] = 'test poll name 1'\n        values['poll_type'] = 1 # poll type = single choice, create answers\n        values['poll_question'] = 'q1'\n        values['poll_answers-0-text'] = 'answer1' # two answers - what do we need to create poll\n        values['poll_answers-1-text'] = 'answer2'\n        values['poll_answers-TOTAL_FORMS'] = 2\n        response = self.create_post_via_http(self.client, forum_id=self.forum.id, **values)\n        self.assertEqual(response.status_code, 200)\n        new_topic = Topic.objects.get(name='test poll name 1')\n        self.assertEqual(new_topic.poll_question, 'q1')\n        self.assertEqual(PollAnswer.objects.filter(topic=new_topic).count(), 2)\n\n    def test_regression_adding_poll_with_removed_answers(self):\n        self.login_client()\n        values = {}\n        values['body'] = 'test poll body'\n        values['name'] = 'test poll name'\n        values['poll_type'] = 1\n        values['poll_question'] = 'q1'\n        values['poll_answers-0-text'] = ''\n        values['poll_answers-0-DELETE'] = 'on'\n        values['poll_answers-1-text'] = ''\n        values['poll_answers-1-DELETE'] = 'on'\n        values['poll_answers-TOTAL_FORMS'] = 2\n        response = self.create_post_via_http(self.client, forum_id=self.forum.id, **values)\n        self.assertEqual(response.status_code, 200)\n        self.assertFalse(Topic.objects.filter(name='test poll name').exists())\n\n    def test_regression_poll_deletion_after_second_post(self):\n        self.login_client()\n        values = {}\n        values['body'] = 'test poll body'\n        values['name'] = 'test poll name'\n        values['poll_type'] = 1 # poll type = single choice, create answers\n        values['poll_question'] = 'q1'\n        values['poll_answers-0-text'] = 'answer1' # two answers - what do we need to create poll\n        values['poll_answers-1-text'] = 'answer2'\n        values['poll_answers-TOTAL_FORMS'] = 2\n        response = self.create_post_via_http(self.client, forum_id=self.forum.id, **values)\n        self.assertEqual(response.status_code, 200)\n        new_topic = Topic.objects.get(name='test poll name')\n        self.assertEqual(new_topic.poll_question, 'q1')\n        self.assertEqual(PollAnswer.objects.filter(topic=new_topic).count(), 2)\n\n        response = self.create_post_via_http(self.client, topic_id=new_topic.id,\n                                             body='test answer body')\n        self.assertEqual(PollAnswer.objects.filter(topic=new_topic).count(), 2)\n\n    def test_poll_edit(self):\n        edit_topic_url = reverse('pybb:edit_post', kwargs={'pk': self.post.id})\n        self.login_client()\n        response = self.client.get(edit_topic_url)\n        values = self.get_form_values(response)\n        values['poll_type'] = 1 # add_poll\n        values['poll_question'] = 'q1'\n        values['poll_answers-0-text'] = 'answer1'\n        values['poll_answers-1-text'] = 'answer2'\n        values['poll_answers-TOTAL_FORMS'] = 2\n        response = self.client.post(edit_topic_url, values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(Topic.objects.get(id=self.topic.id).poll_type, 1)\n        self.assertEqual(Topic.objects.get(id=self.topic.id).poll_question, 'q1')\n        self.assertEqual(PollAnswer.objects.filter(topic=self.topic).count(), 2)\n\n        values = self.get_form_values(self.client.get(edit_topic_url))\n        values['poll_type'] = 2 # change_poll type\n        values['poll_question'] = 'q100' # change poll question\n        values['poll_answers-0-text'] = 'answer100' # change poll answers\n        values['poll_answers-1-text'] = 'answer200'\n        values['poll_answers-TOTAL_FORMS'] = 2\n        response = self.client.post(edit_topic_url, values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(Topic.objects.get(id=self.topic.id).poll_type, 2)\n        self.assertEqual(Topic.objects.get(id=self.topic.id).poll_question, 'q100')\n        self.assertEqual(PollAnswer.objects.filter(topic=self.topic).count(), 2)\n        self.assertTrue(PollAnswer.objects.filter(text='answer100').exists())\n        self.assertTrue(PollAnswer.objects.filter(text='answer200').exists())\n        self.assertFalse(PollAnswer.objects.filter(text='answer1').exists())\n        self.assertFalse(PollAnswer.objects.filter(text='answer2').exists())\n\n        values['poll_type'] = 0 # remove poll\n        values['poll_answers-0-text'] = 'answer100' # no matter how many answers we provide\n        values['poll_answers-TOTAL_FORMS'] = 1\n        response = self.client.post(edit_topic_url, values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(Topic.objects.get(id=self.topic.id).poll_type, 0)\n        self.assertIsNone(Topic.objects.get(id=self.topic.id).poll_question)\n        self.assertEqual(PollAnswer.objects.filter(topic=self.topic).count(), 0)\n\n    def test_poll_voting(self):\n        def recreate_poll(poll_type):\n            self.topic.poll_type = poll_type\n            self.topic.save()\n            PollAnswer.objects.filter(topic=self.topic).delete()\n            PollAnswer.objects.create(topic=self.topic, text='answer1')\n            PollAnswer.objects.create(topic=self.topic, text='answer2')\n\n        self.login_client()\n        recreate_poll(poll_type=Topic.POLL_TYPE_SINGLE)\n        vote_url = reverse('pybb:topic_poll_vote', kwargs={'pk': self.topic.id})\n        my_answer = PollAnswer.objects.all()[0]\n        values = {'answers': my_answer.id}\n        response = self.client.post(vote_url, data=values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(Topic.objects.get(id=self.topic.id).poll_votes(), 1)\n        self.assertEqual(PollAnswer.objects.get(id=my_answer.id).votes(), 1)\n        self.assertEqual(PollAnswer.objects.get(id=my_answer.id).votes_percent(), 100.0)\n\n        # already voted\n        response = self.client.post(vote_url, data=values, follow=True)\n        self.assertEqual(response.status_code, 403) # bad request status\n\n        recreate_poll(poll_type=Topic.POLL_TYPE_MULTIPLE)\n        values = {'answers': [a.id for a in PollAnswer.objects.all()]}\n        response = self.client.post(vote_url, data=values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertListEqual([a.votes() for a in PollAnswer.objects.all()], [1, 1])\n        self.assertListEqual([a.votes_percent() for a in PollAnswer.objects.all()], [50.0, 50.0])\n\n        response = self.client.post(vote_url, data=values, follow=True)\n        self.assertEqual(response.status_code, 403)  # already voted\n\n        cancel_vote_url = reverse('pybb:topic_cancel_poll_vote', kwargs={'pk': self.topic.id})\n        response = self.client.post(cancel_vote_url, data=values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertListEqual([a.votes() for a in PollAnswer.objects.all()], [0, 0])\n        self.assertListEqual([a.votes_percent() for a in PollAnswer.objects.all()], [0, 0])\n\n        response = self.client.post(vote_url, data=values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertListEqual([a.votes() for a in PollAnswer.objects.all()], [1, 1])\n        self.assertListEqual([a.votes_percent() for a in PollAnswer.objects.all()], [50.0, 50.0])\n\n    def test_poll_voting_on_closed_topic(self):\n        self.login_client()\n        self.topic.poll_type = Topic.POLL_TYPE_SINGLE\n        self.topic.save()\n        PollAnswer.objects.create(topic=self.topic, text='answer1')\n        PollAnswer.objects.create(topic=self.topic, text='answer2')\n        self.topic.closed = True\n        self.topic.save()\n\n        vote_url = reverse('pybb:topic_poll_vote', kwargs={'pk': self.topic.id})\n        my_answer = PollAnswer.objects.all()[0]\n        values = {'answers': my_answer.id}\n        response = self.client.post(vote_url, data=values, follow=True)\n        self.assertEqual(response.status_code, 403)\n\n    def tearDown(self):\n        defaults.PYBB_POLL_MAX_ANSWERS = self.PYBB_POLL_MAX_ANSWERS\n\n\nclass FiltersTest(TestCase, SharedTestModule):\n    def setUp(self):\n        self.create_user()\n        self.create_initial(post=False)\n\n    def test_filters(self):\n        add_post_url = reverse('pybb:add_post', kwargs={'topic_id': self.topic.id})\n        self.login_client()\n        response = self.client.get(add_post_url)\n        values = self.get_form_values(response)\n        values['body'] = 'test\\n \\n \\n\\nmultiple empty lines\\n'\n        response = self.client.post(add_post_url, values, follow=True)\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(Post.objects.all()[0].body, 'test\\nmultiple empty lines')\n\n\nclass CustomPermissionHandler(permissions.DefaultPermissionHandler):\n    \"\"\"\n    a custom permission handler which changes the meaning of \"hidden\" forum:\n    \"hidden\" forum or category is visible for all logged on users, not only staff\n    \"\"\"\n\n    def filter_categories(self, user, qs):\n        return qs.filter(hidden=False) if user.is_anonymous else qs\n\n    def may_view_category(self, user, category):\n        return user.is_authenticated if category.hidden else True\n\n    def filter_forums(self, user, qs):\n        if user.is_anonymous:\n            qs = qs.filter(Q(hidden=False) & Q(category__hidden=False))\n        return qs\n\n    def may_view_forum(self, user, forum):\n        return user.is_authenticated if forum.hidden or forum.category.hidden else True\n\n    def filter_topics(self, user, qs):\n        if user.is_anonymous:\n            qs = qs.filter(Q(forum__hidden=False) & Q(forum__category__hidden=False))\n        qs = qs.filter(closed=False)  # filter out closed topics for test\n        return qs\n\n    def may_view_topic(self, user, topic):\n        return self.may_view_forum(user, topic.forum)\n\n    def filter_posts(self, user, qs):\n        if user.is_anonymous:\n            qs = qs.filter(Q(topic__forum__hidden=False) & Q(topic__forum__category__hidden=False))\n        return qs\n\n    def may_view_post(self, user, post):\n        return self.may_view_forum(user, post.topic.forum)\n\n    def may_create_poll(self, user):\n        return False\n\n    def may_edit_topic_slug(self, user):\n        return True\n\n    def may_change_forum(self, user, forum):\n        return not forum.pk % 3 == 0\n\nclass MarkupParserTest(TestCase, SharedTestModule):\n\n    def setUp(self):\n        # Reinit Engines because they are stored in memory and the current bbcode engine stored\n        # may be the old one, depending the test order exec.\n        self.ORIG_PYBB_MARKUP_ENGINES = util.PYBB_MARKUP_ENGINES\n        self.ORIG_PYBB_QUOTE_ENGINES = util.PYBB_QUOTE_ENGINES\n        util.PYBB_MARKUP_ENGINES = {\n            'bbcode': 'pybb.markup.bbcode.BBCodeParser',  # default parser\n            'bbcode_custom': 'test_project.markup_parsers.CustomBBCodeParser',  # overridden default parser\n            'liberator': 'test_project.markup_parsers.LiberatorParser',  # completely new parser\n            'fake': 'pybb.markup.base.BaseParser',  # base parser\n            'markdown': defaults.markdown  # old-style callable parser,\n        }\n        util.PYBB_QUOTE_ENGINES = {\n            'bbcode': 'pybb.markup.bbcode.BBCodeParser',  # default parser\n            'bbcode_custom': 'test_project.markup_parsers.CustomBBCodeParser',  # overridden default parser\n            'liberator': 'test_project.markup_parsers.LiberatorParser',  # completely new parser\n            'fake': 'pybb.markup.base.BaseParser',  # base parser\n            'markdown': lambda text, username=\"\": '>' + text.replace('\\n', '\\n>').replace('\\r', '\\n>') + '\\n'  # old-style callable parser\n        }\n\n    def tearDown(self):\n        util._MARKUP_ENGINES = {}\n        util._QUOTE_ENGINES = {}\n        util.PYBB_MARKUP_ENGINES = self.ORIG_PYBB_MARKUP_ENGINES\n        util.PYBB_QUOTE_ENGINES = self.ORIG_PYBB_QUOTE_ENGINES\n\n    def test_markup_engines(self):\n\n        def _test_engine(parser_name, text_to_html_map):\n            for item in text_to_html_map:\n                self.assertIn(util._get_markup_formatter(parser_name)(item[0]), item[1:])\n\n        text_to_html_map = [\n            ['[b]bold[/b]', '<strong>bold</strong>'],\n            ['[i]italic[/i]', '<em>italic</em>'],\n            ['[u]underline[/u]', '<u>underline</u>'],\n            ['[s]striked[/s]', '<strike>striked</strike>'],\n            [\n                '[img]http://domain.com/image.png[/img]',\n                '<img src=\"http://domain.com/image.png\"></img>',\n                '<img src=\"http://domain.com/image.png\">'\n            ],\n            ['[url=google.com]search in google[/url]', '<a rel=\"nofollow\" href=\"http://google.com\">search in google</a>'],\n            ['http://google.com', '<a rel=\"nofollow\" href=\"http://google.com\">http://google.com</a>'],\n            ['[list][*]1[*]2[/list]', '<ul><li>1</li><li>2</li></ul>'],\n            [\n                '[list=1][*]1[*]2[/list]',\n                '<ol><li>1</li><li>2</li></ol>',\n                '<ol style=\"list-style-type:decimal;\"><li>1</li><li>2</li></ol>'\n            ],\n            ['[quote=\"post author\"]quote[/quote]', '<blockquote><em>post author</em><br>quote</blockquote>'],\n            [\n                '[code]code[/code]',\n                '<div class=\"code\"><pre>code</pre></div>',\n                '<pre><code>code</code></pre>']\n            ,\n        ]\n        _test_engine('bbcode', text_to_html_map)\n\n        text_to_html_map = text_to_html_map + [\n            ['[ul][li]1[/li][li]2[/li][/ul]', '<ul><li>1</li><li>2</li></ul>'],\n            [\n                '[youtube]video_id[/youtube]',\n                (\n                    '<iframe src=\"http://www.youtube.com/embed/video_id?wmode=opaque\" '\n                    'data-youtube-id=\"video_id\" allowfullscreen=\"\" frameborder=\"0\" '\n                    'height=\"315\" width=\"560\"></iframe>'\n                )\n            ],\n        ]\n        _test_engine('bbcode_custom', text_to_html_map)\n\n        text_to_html_map = [\n            ['Windows and Mac OS are wonderfull OS !', 'GNU Linux and FreeBSD are wonderfull OS !'],\n            ['I love PHP', 'I love Python'],\n        ]\n        _test_engine('liberator', text_to_html_map)\n\n        text_to_html_map = [\n            ['[b]bold[/b]', '[b]bold[/b]'],\n            ['*italic*', '*italic*'],\n        ]\n        _test_engine('fake', text_to_html_map)\n        _test_engine('not_existent', text_to_html_map)\n\n        text_to_html_map = [\n            ['**bold**', '<p><strong>bold</strong></p>'],\n            ['*italic*', '<p><em>italic</em></p>'],\n            [\n                '![alt text](http://domain.com/image.png \"title\")',\n                '<p><img alt=\"alt text\" src=\"http://domain.com/image.png\" title=\"title\" /></p>'\n            ],\n            [\n                '[search in google](https://www.google.com)',\n                '<p><a href=\"https://www.google.com\">search in google</a></p>'\n            ],\n            [\n                '[google] some text\\n[google]: https://www.google.com',\n                '<p><a href=\"https://www.google.com\">google</a> some text</p>'\n            ],\n            ['* 1\\n* 2', '<ul>\\n<li>1</li>\\n<li>2</li>\\n</ul>'],\n            ['1. 1\\n2. 2', '<ol>\\n<li>1</li>\\n<li>2</li>\\n</ol>'],\n            ['> quote', '<blockquote>\\n<p>quote</p>\\n</blockquote>'],\n            ['```\\ncode\\n```', '<p><code>code</code></p>'],\n        ]\n        _test_engine('markdown', text_to_html_map)\n\n    def test_quote_engines(self):\n\n        def _test_engine(parser_name, text_to_quote_map):\n            for item in text_to_quote_map:\n                self.assertEqual(util._get_markup_quoter(parser_name)(item[0]), item[1])\n                self.assertEqual(util._get_markup_quoter(parser_name)(item[0], 'username'), item[2])\n\n        text_to_quote_map = [\n            ['quote text', '[quote=\"\"]quote text[/quote]\\n', '[quote=\"username\"]quote text[/quote]\\n']\n        ]\n        _test_engine('bbcode', text_to_quote_map)\n        _test_engine('bbcode_custom', text_to_quote_map)\n\n        text_to_quote_map = [\n            ['quote text', 'quote text', 'posted by: username\\nquote text']\n        ]\n        _test_engine('liberator', text_to_quote_map)\n\n        text_to_quote_map = [\n            ['quote text', 'quote text', 'quote text']\n        ]\n        _test_engine('fake', text_to_quote_map)\n        _test_engine('not_existent', text_to_quote_map)\n\n        text_to_quote_map = [\n            ['quote\\r\\ntext', '>quote\\n>\\n>text\\n', '>quote\\n>\\n>text\\n']\n        ]\n        _test_engine('markdown', text_to_quote_map)\n\n    def test_body_cleaners(self):\n        user = User.objects.create_user('zeus', 'zeus@localhost', 'zeus')\n        staff = User.objects.create_user('staff', 'staff@localhost', 'staff')\n        staff.is_staff = True\n        staff.save()\n\n        from pybb.markup.base import rstrip_str\n        cleaners_map = [\n            ['pybb.markup.base.filter_blanks', 'some\\n\\n\\n\\ntext\\n\\nwith\\nnew\\nlines', 'some\\ntext\\n\\nwith\\nnew\\nlines'],\n            [rstrip_str, 'text    \\n    \\nwith whitespaces     ', 'text\\n\\nwith whitespaces'],\n        ]\n        for cleaner, source, dest in cleaners_map:\n            self.assertEqual(util.get_body_cleaner(cleaner)(user, source), dest)\n            self.assertEqual(util.get_body_cleaner(cleaner)(staff, source), dest)\n\n\ndef _attach_perms_class(class_name):\n    \"\"\"\n    override the permission handler. this cannot be done with @override_settings as\n    permissions.perms is already imported at import point, instead we got to monkeypatch\n    the modules (not really nice, but only an issue in tests)\n    \"\"\"\n    pybb_views.perms = permissions.perms = util.resolve_class(class_name)\n\n\ndef _detach_perms_class():\n    \"\"\"\n    reset permission handler (otherwise other tests may fail)\n    \"\"\"\n    pybb_views.perms = permissions.perms = util.resolve_class('pybb.permissions.DefaultPermissionHandler')\n\n\nclass ControlsAndPermissionsTest(TestCase, SharedTestModule):\n\n    def create_initial(self, on_moderation=False, closed=False, sticky=False, hidden=False):\n        \"\"\"\n        * forum1: normal\n            * topic1_1: normal\n                * post1_1_1: alice\n                * post1_1_2: bob\n                * post1_1_3: alice + on_moderation\n            * topic1_2: on_moderation\n                * post1_2_1: alice + on_moderation\n            * topic1_3: on_moderation (topic has been marked as waiting for a global moderation)\n                * post1_3_1: alice\n                * post1_3_2: bob + on_moderation\n            * topic1_4: closed\n                * post1_4_1: alice\n                * post1_4_2: bob\n            * topic1_5: sticky\n                * post1_5_1: alice\n                * post1_5_2: bob\n        * forum2: hidden\n            * topic2_1: normal\n                * post2_1_1: alice\n                * post2_1_2: bob\n        \"\"\"\n        topics = []\n        alice = User.objects.create_user('alice', 'alice@localhost', 'alice')\n        bob = User.objects.create_user('bob', 'bob@localhost', 'bob')\n        category = Category.objects.create(name='test')\n        forum1 = Forum.objects.create(name='forum 1', description='bar 1', category=category)\n        topic1_1 = Topic.objects.create(name='topic 1_1', forum=forum1, user=alice)\n        topics.append(topic1_1)\n        self.create_post(topic=topic1_1, user=alice, body='post 1_1 1')\n        self.create_post(topic=topic1_1, user=bob, body='post 1_1_2')\n\n        if on_moderation:\n            self.create_post(topic=topic1_1, user=alice, body='post 1_1_3', on_moderation=True)\n            topic1_2 = Topic.objects.create(name='topic 1_2', forum=forum1, user=alice,\n                                            on_moderation=True)\n            topics.append(topic1_2)\n            self.create_post(topic=topic1_2, user=alice, body='post 1_2_1', on_moderation=True)\n            topic1_3 = Topic.objects.create(name='topic 1_3', forum=forum1, user=alice, )\n            topics.append(topic1_3)\n            self.create_post(topic=topic1_3, user=alice, body='post 1_3_1')\n            self.create_post(topic=topic1_3, user=bob, body='post 1_3_2', on_moderation=True)\n            topic1_3.on_moderation = True\n            topic1_3.save()\n\n        if closed:\n            topic1_4 = Topic.objects.create(name='topic 1_4', forum=forum1, user=alice, closed=True)\n            topics.append(topic1_4)\n            self.create_post(topic=topic1_4, user=alice, body='post 1_4_1')\n            self.create_post(topic=topic1_4, user=bob, body='post 1_4_2')\n\n        if sticky:\n            topic1_5 = Topic.objects.create(name='topic 1_5', forum=forum1, user=alice, sticky=True)\n            topics.append(topic1_5)\n            self.create_post(topic=topic1_5, user=alice, body='post 1_5_1')\n            self.create_post(topic=topic1_5, user=bob, body='post 1_5_2')\n\n        if hidden:\n            forum2 = Forum.objects.create(name='forum 2', description='bar 2', category=category,\n                                          hidden=True)\n            topic2_1 = Topic.objects.create(name='topic 2_1', forum=forum2, user=alice)\n            topics.append(topic2_1)\n            self.create_post(topic=topic2_1, user=alice, body='post 2_1_1')\n            self.create_post(topic=topic2_1, user=bob, body='post 2_1_2')\n        return topics\n\n    @skip(\"Run this test manually\")\n    def test_permission_documentation(self):\n        topics = self.create_initial(on_moderation=True, closed=True, sticky=True, hidden=True)\n        forum = topics[0].forum\n        hidden_forum = topics[-1].forum\n        closed_topic = Topic.objects.get(name='topic 1_4')\n        author_topic = topics[0]\n        author_post = topics[0].head\n        other_post = topics[0].posts.exclude(user=author_post.user).first()\n        author = author_post.user\n        other = other_post.user\n        author_on_moderation_post = topics[0].last_post\n        author_on_moderation_topic = topics[1]\n        other_on_moderation_post = Post.objects.get(body='post 1_3_2')\n        other_on_moderation_topic = Topic.objects.create(name='topic 1_6', forum=forum, user=other,\n                                                         on_moderation=True)\n        self.create_post(topic=other_on_moderation_topic, user=other, body='post 1_6_1',\n                         on_moderation=True)\n        other_topic = Topic.objects.create(name='topic 1_7', forum=forum, user=other, )\n        self.create_post(topic=other_topic, user=other, body='post 1_7_1')\n\n        def _view_normal_forum(user):\n            return permissions.perms.may_view_forum(user, forum)\n\n        def _view_hidden_forum(user):\n            return permissions.perms.may_view_forum(user, hidden_forum)\n\n        def _view_other_topic(user):\n            return permissions.perms.may_view_topic(user, other_topic)\n\n        def _view_other_post(user):\n            return permissions.perms.may_view_post(user, other_post)\n\n        def _view_own_on_moderation_topic(user):\n            if not user.is_anonymous and author_on_moderation_topic.user.pk == user.pk:\n                return permissions.perms.may_view_topic(user, author_on_moderation_topic)\n\n        def _view_own_on_moderation_post(user):\n            if not user.is_anonymous and author_on_moderation_post.user.pk == user.pk:\n                return permissions.perms.may_view_post(user, author_on_moderation_post)\n\n        def _view_other_on_moderation_topic(user):\n            return permissions.perms.may_view_topic(user, other_on_moderation_topic)\n\n        def _view_other_on_moderation_post(user):\n            return permissions.perms.may_view_post(user, other_on_moderation_post)\n\n        def _add_post_in_normal_topic(user):\n            return permissions.perms.may_create_post(user, other_topic)\n\n        def _add_post_in_on_moderation_topic(user):\n            return permissions.perms.may_create_post(user, author_on_moderation_topic)\n\n        def _add_post_in_closed_topic(user):\n            return permissions.perms.may_create_post(user, closed_topic)\n\n        def _edit_own_normal_post(user):\n            if not user.is_anonymous and author_on_moderation_post.user.pk == user.pk:\n                return permissions.perms.may_edit_post(user, author_post)\n\n        def _edit_own_on_moderation_post(user):\n            if not user.is_anonymous and author_on_moderation_post.user.pk == user.pk:\n                return permissions.perms.may_edit_post(user, author_on_moderation_post)\n\n        def _edit_other_post(user):\n            return permissions.perms.may_edit_post(user, other_post)\n\n        def _delete_own_normal_post(user):\n            if not user.is_anonymous and author_on_moderation_post.user.pk == user.pk:\n                return permissions.perms.may_delete_post(user, author_post)\n\n        def _delete_own_on_moderation_post(user):\n            if not user.is_anonymous and author_on_moderation_post.user.pk == user.pk:\n                return permissions.perms.may_delete_post(user, author_on_moderation_post)\n\n        def _delete_other_post(user):\n            return permissions.perms.may_delete_post(user, other_post)\n\n        def _moderate_topic(user):\n            return permissions.perms.may_moderate_topic(user, author_topic)\n\n        def _close_and_unclose_topic(user):\n            return permissions.perms.may_close_topic(user, author_topic)\n\n        def _stick_and_unstick_topic(user):\n            return permissions.perms.may_stick_topic(user, author_topic)\n\n        def _manage_moderators(user):\n            return permissions.perms.may_manage_moderators(user)\n\n        tests = [\n            _view_normal_forum,\n            _view_hidden_forum,\n            _view_other_topic,\n            _view_other_post,\n            _view_own_on_moderation_topic,\n            _view_own_on_moderation_post,\n            _view_other_on_moderation_topic,\n            _view_other_on_moderation_post,\n            _add_post_in_normal_topic,\n            _add_post_in_on_moderation_topic,\n            _add_post_in_closed_topic,\n            _edit_own_normal_post,\n            _edit_own_on_moderation_post,\n            _edit_other_post,\n            _delete_own_normal_post,\n            _delete_own_on_moderation_post,\n            _delete_other_post,\n            _close_and_unclose_topic,\n            _stick_and_unstick_topic,\n            _manage_moderators,\n        ]\n\n        # get permissions\n        change_topic_perm = Permission.objects.get_by_natural_key('change_topic', 'pybb', 'topic')\n        delete_topic_perm = Permission.objects.get_by_natural_key('delete_topic', 'pybb', 'topic')\n        change_post_perm = Permission.objects.get_by_natural_key('change_post', 'pybb', 'post')\n        delete_post_perm = Permission.objects.get_by_natural_key('delete_post', 'pybb', 'post')\n\n        # init all users\n        anonymous = AnonymousUser()\n        redactor = User.objects.create_user('redactor', 'redactor', 'redactor@localhost')\n        redactor.is_staff = True\n        redactor.save()\n        moderator = User.objects.create_user('moderator', 'moderator', 'moderator@localhost')\n        moderator.save()\n        forum.moderators.add(moderator)\n        hidden_forum.moderators.add(moderator)\n        manager = User.objects.create_user('manager', 'manager', 'manager@localhost')\n        manager.is_staff = True\n        manager.save()\n        manager.user_permissions.add(change_topic_perm, change_post_perm,\n                                     delete_topic_perm, delete_post_perm)\n        superuser = User.objects.create_user('superuser', 'superuser', 'superuser@localhost')\n        superuser.is_superuser = True\n        superuser.save()\n\n        users = [\n            (anonymous, 'Permissions for anonymous'),\n            (author, 'Permissions for an logged-in user'),\n            (moderator, 'Permissions for a moderator of the current forum'),\n            (redactor, 'Permissions for a \"is_staff\" user without pybb permissions'),\n            (manager, 'Permissions for a \"is_staff\" user with pybb permissions'),\n            (superuser, 'Permissions for superuser'),\n        ]\n\n        # get the current documentation for permissions\n        path = os.path.join(os.path.dirname(__file__), '..', 'docs', 'permissions.rst')\n        permission_doc = open(path, 'r').read()\n        wrong_parts = []\n        sep = '+----------------------------------+---------------------+---------------------+'\n        intro = [\n            '%(title)s:', '',\n            sep,\n            '|              action              |     can do with     |     can do with     |',\n            '|                                  | PREMODERATION False | PREMODERATION True  |',\n            '+==================================+=====================+=====================+',]\n\n        ORIG = defaults.PYBB_PREMODERATION\n        def fake_premoderation(user, body):\n            return True\n\n        for user, title in users:\n            lines = ['\\n'.join(intro) % {'title': title}]\n            for test in tests:\n                name = test.__name__.replace('_', ' ').strip()\n                name += ' ' * (32 - len(name))\n                results = []\n                for value in (None, fake_premoderation):\n                    defaults.PYBB_PREMODERATION = value\n                    result = test(user)\n                    if result is None:\n                        result = 'see logged-in user'\n                    else:\n                        result = 'yes' if result else 'no'\n                    result += ' ' * (19 - len(result))\n                    results.append(result)\n                lines.append('| %s | %s | %s |' % (name, results[0], results[1]))\n                lines.append(sep)\n\n            permission_doc_part = '\\n'.join(lines)\n            # Check that documentation is correct with reality\n            # (maybe reality is not good, but it's not the purpose of this test)\n            if permission_doc_part not in permission_doc:\n                wrong_parts.append(permission_doc_part)\n\n        if wrong_parts:\n            self.fail('Permission document does not reflect what default Permission handler do. '\n                      'If other permission tests success, please update the documentation with '\n                      'those parts:\\n\\n%s' % '\\n\\n\\n'.join(wrong_parts))\n\n        defaults.PYBB_PREMODERATION = ORIG\n\n\n    def test_may_create_post(self):\n        topics = self.create_initial(on_moderation=True, closed=True, sticky=True, hidden=True)\n        anonymous = AnonymousUser()\n        alice = topics[0].user\n        other = User.objects.create_user('other', 'other@localhost', 'other',)\n        redactor = User.objects.create_user('redactor', 'redactor', 'redactor@localhost')\n        redactor.is_staff = True\n        redactor.save()\n        moderator = User.objects.create_user('moderator', 'moderator', 'moderator@localhost')\n        moderator.save()\n        topics[0].forum.moderators.add(moderator)\n        manager = User.objects.create_user('manager', 'manager', 'manager@localhost')\n        manager.is_staff = True\n        manager.save()\n        change_topic_perm = Permission.objects.get_by_natural_key('change_topic', 'pybb', 'topic')\n        change_post_perm = Permission.objects.get_by_natural_key('change_post', 'pybb', 'post')\n        manager.user_permissions.add(change_topic_perm, change_post_perm)\n        superuser = User.objects.create_user('superuser', 'superuser', 'superuser@localhost')\n        superuser.is_superuser = True\n        superuser.save()\n\n        forum1, forum2 = topics[0].forum,  topics[-1].forum\n        normal_topics = Topic.objects.filter(forum__hidden=False, forum__category__hidden=False,\n                                             on_moderation=False, closed=False)\n        on_moderation_topics = Topic.objects.filter(on_moderation=True)\n        closed_topics = Topic.objects.filter(closed=True)\n        hidden_topics = Topic.objects.filter(forum__hidden=True, forum__category__hidden=True)\n\n        for topic in topics:\n            if not permissions.perms.may_create_post(superuser, topic):\n                self.fail('%s may create post in topic %s' % (superuser, topic))\n            if not permissions.perms.may_create_post(manager, topic):\n                self.fail('%s may create post in topic %s' % (manager, topic))\n            if permissions.perms.may_create_post(anonymous, topic):\n                self.fail('%s may NOT create post in topic %s' % (anonymous, topic))\n            if topic.forum.pk != forum1.pk:\n                if permissions.perms.may_create_post(moderator, topic):\n                    self.fail('%s may NOT create post in topic %s' % (moderator, topic))\n            else:\n                if not permissions.perms.may_create_post(moderator, topic):\n                    self.fail('%s may create post in topic %s' % (moderator, topic))\n\n        for topic in normal_topics:\n            if not permissions.perms.may_create_post(redactor, topic):\n                self.fail('%s may create post in topic %s' % (redactor, topic))\n            if not permissions.perms.may_create_post(other, topic):\n                self.fail('%s may create post in topic %s' % (other, topic))\n\n        for topic in on_moderation_topics:\n            if permissions.perms.may_create_post(other, topic):\n                self.fail('%s may NOT create post in topic %s' % (other, topic))\n            if permissions.perms.may_create_post(alice, topic):\n                self.fail('%s may NOT create post in topic %s' % (alice, topic))\n            if permissions.perms.may_create_post(redactor, topic):\n                self.fail('%s may NOT create post in topic %s' % (redactor, topic))\n\n        for topic in closed_topics:\n            if permissions.perms.may_create_post(anonymous, topic):\n                self.fail('%s may NOT create post in topic %s' % (anonymous, topic))\n            if permissions.perms.may_create_post(alice, topic):\n                self.fail('%s may NOT create post in topic %s' % (alice, topic))\n            if permissions.perms.may_create_post(redactor, topic):\n                self.fail('%s may NOT create post in topic %s' % (redactor, topic))\n\n        for topic in hidden_topics:\n            if topic.on_moderation or topic.closed:\n                if permissions.perms.may_create_post(redactor, topic):\n                    self.fail('%s may NOT create post in topic %s' % (redactor, topic))\n            else:\n                if not permissions.perms.may_create_post(redactor, topic):\n                    self.fail('%s may create post in topic %s' % (redactor, topic))\n            if permissions.perms.may_create_post(alice, topic):\n                self.fail('%s may NOT create post in topic %s' % (alice, topic))\n\n\n    def test_filter_topics_anonymous_and_other(self):\n        self.create_initial(on_moderation=True, closed=True, sticky=True, hidden=True)\n        topics = Topic.objects.values_list('name', flat=True)\n        anonymous = AnonymousUser()\n        other = User.objects.create_user('other', 'other@localhost', 'other',)\n\n        # even without premoderation, on_moderation mark must be significative on topics\n        ORIG = defaults.PYBB_PREMODERATION\n        defaults.PYBB_PREMODERATION = None\n\n        excluded_topics = ['topic 1_2', 'topic 1_3', 'topic 2_1']\n        expected_topics = topics.exclude(name__in=excluded_topics)\n\n        anonymous_filtered_topics = permissions.perms.filter_topics(anonymous, topics)\n        self.assertEqual(set(expected_topics), set(anonymous_filtered_topics))\n\n        other_filtered_topics = permissions.perms.filter_topics(other, topics)\n        self.assertEqual(set(expected_topics), set(other_filtered_topics))\n\n        for topic in Topic.objects.filter(name__in=expected_topics):\n            if not permissions.perms.may_view_topic(anonymous, topic):\n                self.fail('%s may view topic %s' % (anonymous, topic))\n            if not permissions.perms.may_view_topic(other, topic):\n                self.fail('%s may view topic %s' % (other, topic))\n\n        for topic in Topic.objects.exclude(name__in=expected_topics):\n            if permissions.perms.may_view_topic(anonymous, topic):\n                self.fail('%s may NOT view topic %s' % (anonymous, topic))\n            if permissions.perms.may_view_topic(other, topic):\n                self.fail('%s may NOT view topic %s' % (other, topic))\n        defaults.PYBB_PREMODERATION = ORIG\n\n    def test_filter_posts_anonymous_and_other(self):\n        self.create_initial(on_moderation=True, closed=True, sticky=True, hidden=True)\n        posts = Post.objects.values_list('body', flat=True)\n        anonymous = AnonymousUser()\n        other = User.objects.create_user('other', 'other@localhost', 'other',)\n\n        ORIG = defaults.PYBB_PREMODERATION\n        defaults.PYBB_PREMODERATION = None\n        # \"post 1_1_3\" is not excluded because PYBB_PREMODERATION is not set, so on_moderation on\n        # posts are ignored\n        # same reason for \"post 1_2_1\", 1_3_1 and 1_3_2\n        excluded_posts = ['post 2_1_1', 'post 2_1_2']  # exclude hidden forum posts\n        expected_posts = posts.exclude(body__in=excluded_posts)\n\n        anonymous_filtered_posts = permissions.perms.filter_posts(anonymous, posts)\n        self.assertEqual(set(expected_posts), set(anonymous_filtered_posts))\n\n        other_filtered_posts = permissions.perms.filter_posts(other, posts)\n        self.assertEqual(set(expected_posts), set(other_filtered_posts))\n\n        for post in Post.objects.filter(body__in=expected_posts):\n            if not permissions.perms.may_view_post(anonymous, post):\n                self.fail('%s may view post %s' % (anonymous, post))\n            if not permissions.perms.may_view_post(other, post):\n                self.fail('%s may view post %s' % (other, post))\n\n        for post in Post.objects.exclude(body__in=expected_posts):\n            if permissions.perms.may_view_post(anonymous, post):\n                self.fail('%s may NOT view post %s' % (anonymous, post))\n            if permissions.perms.may_view_post(other, post):\n                self.fail('%s may NOT view post %s' % (other, post))\n\n        # now, test with PREMODERATION\n        def fake_premoderation(user, body):\n            return True\n        defaults.PYBB_PREMODERATION = fake_premoderation\n\n        # also exclude on_moderation posts or on_moderation topic\n        excluded_posts += ['post 1_1_3', 'post 1_2_1', 'post 1_3_1', 'post 1_3_2']\n        expected_posts = posts.exclude(body__in=excluded_posts)\n\n        anonymous_filtered_posts = permissions.perms.filter_posts(anonymous, posts)\n        self.assertEqual(set(expected_posts), set(anonymous_filtered_posts))\n\n        other_filtered_posts = permissions.perms.filter_posts(other, posts)\n        self.assertEqual(set(expected_posts), set(other_filtered_posts))\n\n        for post in Post.objects.filter(body__in=expected_posts):\n            if not permissions.perms.may_view_post(anonymous, post):\n                self.fail('%s may view post %s' % (anonymous, post))\n            if not permissions.perms.may_view_post(other, post):\n                self.fail('%s may view post %s' % (other, post))\n\n        for post in Post.objects.exclude(body__in=expected_posts):\n            if permissions.perms.may_view_post(anonymous, post):\n                self.fail('%s may NOT view post %s' % (anonymous, post))\n            if permissions.perms.may_view_post(other, post):\n                self.fail('%s may NOT view post %s' % (other, post))\n\n        defaults.PYBB_PREMODERATION = ORIG\n\n    def test_filter_topics_author(self):\n        topics = self.create_initial(on_moderation=True, closed=True, sticky=True, hidden=True)\n        alice = topics[0].user\n        topics = Topic.objects.values_list('name', flat=True)\n        # even without premoderation, on_moderation mark must be significative on topics\n        ORIG = defaults.PYBB_PREMODERATION\n        defaults.PYBB_PREMODERATION = None\n\n        # \"topic 1_2\"is not excluded even if on_moderation because it's my own topic\n        # topic 1_3 is excluded because it's a \"general\" moderation (ùy post is not on_moderation,\n        # but the whole topic is)\n        excluded_topics = ['topic 2_1', 'topic 1_3']\n        expected_topics = topics.exclude(name__in=excluded_topics)\n\n        filtered_topics = permissions.perms.filter_topics(alice, topics)\n        self.assertEqual(set(expected_topics), set(filtered_topics))\n\n        for topic in Topic.objects.filter(name__in=expected_topics):\n            if not permissions.perms.may_view_topic(alice, topic):\n                self.fail('%s may view topic %s' % (alice, topic))\n\n        for topic in Topic.objects.exclude(name__in=expected_topics):\n            if permissions.perms.may_view_topic(alice, topic):\n                self.fail('%s may NOT view topic %s' % (alice, topic))\n\n        defaults.PYBB_PREMODERATION = ORIG\n\n\n    def test_filter_posts_author(self):\n        topics = self.create_initial(on_moderation=True, closed=True, sticky=True, hidden=True)\n        alice = topics[0].user\n        posts = Post.objects.values_list('body', flat=True)\n\n        ORIG = defaults.PYBB_PREMODERATION\n        defaults.PYBB_PREMODERATION = None\n        # \"post 1_1_3\" is not excluded because PYBB_PREMODERATION is not set, so on_moderation on\n        # posts is ignored\n        # same reason for \"post 1_2_1\", 1_3_1 and 1_3_2\n        excluded_posts = ['post 2_1_2', ]  # exclude hidden forum posts I didn't create\n        expected_posts = posts.exclude(body__in=excluded_posts)\n        filtered_posts = permissions.perms.filter_posts(alice, posts)\n        self.assertEqual(set(expected_posts), set(filtered_posts))\n\n        # now, test with PREMODERATION\n        def fake_premoderation(user, body):\n            return True\n        defaults.PYBB_PREMODERATION = fake_premoderation\n\n        # on_moderation posts I created are not excluded ('1_1_3' and '1_2_1')\n        # My posts must not be excluded even if those are in a topic which need moderation (1_3_1)\n        # 1_3_2 is excluded because topic (I created) is now on_moderation. So I can't see others\n        # post in this topic even if those posts are not on_moderation.\n        excluded_posts += ['post 1_3_2', ]\n        expected_posts = posts.exclude(body__in=excluded_posts)\n        filtered_posts = permissions.perms.filter_posts(alice, posts)\n        self.assertEqual(set(expected_posts), set(filtered_posts))\n\n        for post in Post.objects.filter(body__in=expected_posts):\n            if not permissions.perms.may_view_post(alice, post):\n                self.fail('%s may view post %s' % (alice, post))\n\n        for post in Post.objects.exclude(body__in=expected_posts):\n            if permissions.perms.may_view_post(alice, post):\n                self.fail('%s may NOT view post %s' % (alice, post))\n\n        defaults.PYBB_PREMODERATION = ORIG\n\n\n    def test_filter_topics_staff_without_perms(self):\n        # redactor is a staff member (he can access to admin for SOME models, eg: News app models)\n        # but he has NO rights on pybb models\n        topics = self.create_initial(on_moderation=True, closed=True, sticky=True, hidden=True)\n        redactor = User.objects.create_user('redactor', 'redactor', 'redactor@localhost')\n        redactor.is_staff = True\n        redactor.save()\n        topics = Topic.objects.values_list('name', flat=True)\n        # even without premoderation, on_moderation mark must be significative on topics\n        ORIG = defaults.PYBB_PREMODERATION\n        defaults.PYBB_PREMODERATION = None\n\n        # same exclusions as if redactor was a \"other\" user except that  staff user may see\n        # hidden forum/cats\n        excluded_topics = ['topic 1_2', 'topic 1_3']\n        expected_topics = topics.exclude(name__in=excluded_topics)\n\n        filtered_topics = permissions.perms.filter_topics(redactor, topics)\n        self.assertEqual(set(expected_topics), set(filtered_topics))\n\n        for topic in Topic.objects.filter(name__in=expected_topics):\n            if not permissions.perms.may_view_topic(redactor, topic):\n                self.fail('%s may view topic %s' % (redactor, topic))\n\n        for topic in Topic.objects.exclude(name__in=expected_topics):\n            if permissions.perms.may_view_topic(redactor, topic):\n                self.fail('%s may NOT view topic %s' % (redactor, topic))\n        defaults.PYBB_PREMODERATION = ORIG\n\n\n    def test_filter_posts_staff_without_perms(self):\n        topics = self.create_initial(on_moderation=True, closed=True, sticky=True, hidden=True)\n        redactor = User.objects.create_user('redactor', 'redactor', 'redactor@localhost')\n        redactor.is_staff = True\n        redactor.save()\n        posts = Post.objects.values_list('body', flat=True)\n\n        ORIG = defaults.PYBB_PREMODERATION\n        defaults.PYBB_PREMODERATION = None\n        # staff user may see hidden forum/cats\n        excluded_posts = []\n        expected_posts = posts.exclude(body__in=excluded_posts)\n        filtered_posts = permissions.perms.filter_posts(redactor, posts)\n        self.assertEqual(set(expected_posts), set(filtered_posts))\n\n        for post in Post.objects.filter(body__in=expected_posts):\n            if not permissions.perms.may_view_post(redactor, post):\n                self.fail('%s may view post %s' % (redactor, post))\n\n        for post in Post.objects.exclude(body__in=expected_posts):\n            if permissions.perms.may_view_post(redactor, post):\n                self.fail('%s may NOT view post %s' % (redactor, post))\n\n        # now, test with PREMODERATION\n        def fake_premoderation(user, body):\n            return True\n        defaults.PYBB_PREMODERATION = fake_premoderation\n\n        # same exclusions as if redactor was a \"other\" user\n        excluded_posts += ['post 1_1_3', 'post 1_2_1', 'post 1_3_1', 'post 1_3_2',]\n        expected_posts = posts.exclude(body__in=excluded_posts)\n        filtered_posts = permissions.perms.filter_posts(redactor, posts)\n        self.assertEqual(set(expected_posts), set(filtered_posts))\n\n        for post in Post.objects.filter(body__in=expected_posts):\n            if not permissions.perms.may_view_post(redactor, post):\n                self.fail('%s may view post %s' % (redactor, post))\n\n        for post in Post.objects.exclude(body__in=expected_posts):\n            if permissions.perms.may_view_post(redactor, post):\n                self.fail('%s may NOT view post %s' % (redactor, post))\n\n        defaults.PYBB_PREMODERATION = ORIG\n\n\n    def test_filter_topics_staff_with_perms(self):\n        # manager see everything\n        topics = self.create_initial(on_moderation=True, closed=True, sticky=True, hidden=True)\n        change_topic_perm = Permission.objects.get_by_natural_key('change_topic', 'pybb', 'topic')\n        change_post_perm = Permission.objects.get_by_natural_key('change_post', 'pybb', 'post')\n        manager = User.objects.create_user('manager', 'manager', 'manager@localhost')\n        manager.is_staff = True\n        manager.save()\n        manager.user_permissions.add(change_topic_perm, change_post_perm)\n        topics = Topic.objects.values_list('name', flat=True)\n\n        expected_topics = topics\n        filtered_topics = permissions.perms.filter_topics(manager, topics)\n        self.assertEqual(set(expected_topics), set(filtered_topics))\n\n        for topic in Topic.objects.filter(name__in=expected_topics):\n            if not permissions.perms.may_view_topic(manager, topic):\n                self.fail('%s may view topic %s' % (manager, topic))\n        self.assertEqual(Topic.objects.exclude(name__in=expected_topics).count(), 0)\n\n\n    def test_filter_posts_staff_with_perms(self):\n        topics = self.create_initial(on_moderation=True, closed=True, sticky=True, hidden=True)\n        change_topic_perm = Permission.objects.get_by_natural_key('change_topic', 'pybb', 'topic')\n        change_post_perm = Permission.objects.get_by_natural_key('change_post', 'pybb', 'post')\n        manager = User.objects.create_user('manager', 'manager', 'manager@localhost')\n        manager.is_manager = True\n        manager.save()\n        manager.user_permissions.add(change_topic_perm, change_post_perm)\n        posts = Post.objects.values_list('body', flat=True)\n\n        ORIG = defaults.PYBB_PREMODERATION\n        defaults.PYBB_PREMODERATION = None\n        expected_posts = posts\n        filtered_posts = permissions.perms.filter_posts(manager, posts)\n        self.assertEqual(set(expected_posts), set(filtered_posts))\n\n        # now, test with PREMODERATION\n        def fake_premoderation(user, body):\n            return True\n        defaults.PYBB_PREMODERATION = fake_premoderation\n\n        filtered_posts = permissions.perms.filter_posts(manager, posts)\n        self.assertEqual(set(expected_posts), set(filtered_posts))\n\n        for post in Post.objects.filter(body__in=expected_posts):\n            if not permissions.perms.may_view_post(manager, post):\n                self.fail('%s may view post %s' % (manager, post))\n        self.assertEqual(Post.objects.exclude(body__in=expected_posts).count(), 0)\n\n        defaults.PYBB_PREMODERATION = ORIG\n\n\n    def test_filter_topics_superuser(self):\n        # superuser see everything\n        topics = self.create_initial(on_moderation=True, closed=True, sticky=True, hidden=True)\n        superuser = User.objects.create_user('superuser', 'superuser', 'superuser@localhost')\n        superuser.is_superuser = True\n        superuser.save()\n        topics = Topic.objects.values_list('name', flat=True)\n\n        expected_topics = topics\n        filtered_topics = permissions.perms.filter_topics(superuser, topics)\n        self.assertEqual(set(expected_topics), set(filtered_topics))\n\n        for topic in Topic.objects.filter(name__in=expected_topics):\n            if not permissions.perms.may_view_topic(superuser, topic):\n                self.fail('%s may view topic %s' % (superuser, topic))\n        self.assertEqual(Topic.objects.exclude(name__in=expected_topics).count(), 0)\n\n\n    def test_filter_posts_superuser(self):\n        topics = self.create_initial(on_moderation=True, closed=True, sticky=True, hidden=True)\n        superuser = User.objects.create_user('superuser', 'superuser', 'superuser@localhost')\n        superuser.is_superuser = True\n        superuser.save()\n        posts = Post.objects.values_list('body', flat=True)\n\n        ORIG = defaults.PYBB_PREMODERATION\n        defaults.PYBB_PREMODERATION = None\n        expected_posts = posts\n        filtered_posts = permissions.perms.filter_posts(superuser, posts)\n        self.assertEqual(set(expected_posts), set(filtered_posts))\n\n        # now, test with PREMODERATION\n        def fake_premoderation(user, body):\n            return True\n        defaults.PYBB_PREMODERATION = fake_premoderation\n\n        filtered_posts = permissions.perms.filter_posts(superuser, posts)\n        self.assertEqual(set(expected_posts), set(filtered_posts))\n\n        for post in Post.objects.filter(body__in=expected_posts):\n            if not permissions.perms.may_view_post(superuser, post):\n                self.fail('%s may view post %s' % (superuser, post))\n        self.assertEqual(Post.objects.exclude(body__in=expected_posts).count(), 0)\n\n        defaults.PYBB_PREMODERATION = ORIG\n\n\n    def test_post_actions_anonymous(self):\n        topic1 = self.create_initial()[0]\n        post1 = topic1.head\n        response = self.client.get(topic1.get_absolute_url())\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content)\n        hrefs = tree.xpath(('//table[@id=\"post-%d\"]'\n                            '/descendant::div[@class=\"post-controls\"]'\n                            '/descendant::a/@href') % post1.pk)\n        self.assertEqual(len(hrefs), 0)\n\n    def test_post_actions_own_post(self):\n        topic1, topic2 = self.create_initial(on_moderation=True)[0:2]\n        post1_1 = topic1.head  # alice's post\n        response = self.get_with_user(topic1.get_absolute_url(), 'alice', 'alice')\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content)\n        hrefs = tree.xpath(('//table[@id=\"post-%d\"]'\n                            '/descendant::div[@class=\"post-controls\"]'\n                            '/descendant::a/@href') % post1_1.pk)\n        edit_url = reverse('pybb:edit_post', kwargs={'pk': post1_1.pk})\n        self.assertIn(edit_url, hrefs)\n        if defaults.PYBB_ALLOW_DELETE_OWN_POST:\n            delete_url = reverse('pybb:delete_post', kwargs={'pk': post1_1.pk})\n            self.assertIn(delete_url, hrefs)\n        self.assertTrue(len(hrefs), 1 + defaults.PYBB_ALLOW_DELETE_OWN_POST)\n\n        # post on moderation should stay editable / deletable for it's author\n        post2_1 = topic2.head  # alice's post\n        response =self.get_with_user(topic2.get_absolute_url(), 'alice', 'alice')\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content)\n        hrefs = tree.xpath(('//table[@id=\"post-%d\"]'\n                            '/descendant::div[@class=\"post-controls\"]'\n                            '/descendant::a/@href') % post2_1.pk)\n        edit_url = reverse('pybb:edit_post', kwargs={'pk': post2_1.pk})\n        self.assertIn(edit_url, hrefs)\n        if defaults.PYBB_ALLOW_DELETE_OWN_POST:\n            delete_url = reverse('pybb:delete_post', kwargs={'pk': post2_1.pk})\n            self.assertIn(delete_url, hrefs)\n        self.assertEqual(len(hrefs), 1 + defaults.PYBB_ALLOW_DELETE_OWN_POST)\n\n    def test_post_actions_other_post(self):\n        topic1 = self.create_initial()[0]\n        post2 = topic1.last_post  # bob's post\n        url = topic1.get_absolute_url()\n        response = self.get_with_user(url, 'alice', 'alice')\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content)\n        hrefs = tree.xpath(('//table[@id=\"post-%d\"]'\n                            '/descendant::div[@class=\"post-controls\"]'\n                            '/descendant::a/@href') % post2.pk)\n        self.assertEqual(len(hrefs), 0)\n\n    def test_post_actions_staff_no_perms(self):\n        staff = User.objects.create_user('staff', 'staff@localhost', 'staff')\n        staff.is_staff = True\n        staff.save()\n        topic1 = self.create_initial()[0]\n        post1 = topic1.head\n        response = self.get_with_user(topic1.get_absolute_url(), 'staff', 'staff')\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content)\n        hrefs = tree.xpath(('//table[@id=\"post-%d\"]'\n                            '/descendant::div[@class=\"post-controls\"]'\n                            '/descendant::a/@href') % post1.pk)\n        self.assertEqual(len(hrefs), 0)\n\n    def test_post_actions_staff_with_perms(self):\n        staff = User.objects.create_user('staff', 'staff@localhost', 'staff')\n        staff.is_staff = True\n        staff.save()\n        change_topic_perm = Permission.objects.get_by_natural_key('change_topic', 'pybb', 'topic')\n        delete_topic_perm = Permission.objects.get_by_natural_key('delete_topic', 'pybb', 'topic')\n        change_post_perm = Permission.objects.get_by_natural_key('change_post', 'pybb', 'post')\n        delete_post_perm = Permission.objects.get_by_natural_key('delete_post', 'pybb', 'post')\n\n        staff.user_permissions.add(change_topic_perm)\n        staff.user_permissions.add(change_post_perm)\n        topic1, topic2 = self.create_initial(on_moderation=True)[0:2]\n        post = topic2.head  # alice's post which need moderation\n\n        topic_url = topic2.get_absolute_url()\n        edit_url = reverse('pybb:edit_post', kwargs={'pk': post.pk})\n        move_url = reverse('pybb:move_post', kwargs={'pk': post.pk})\n        delete_url = reverse('pybb:delete_post', kwargs={'pk': post.pk})\n        moderate_url = reverse('pybb:moderate_post', kwargs={'pk': post.pk})\n        admin_url = reverse('admin:pybb_post_change', args=[post.pk, ])\n\n        response = self.get_with_user(topic_url, 'staff', 'staff')\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content)\n        hrefs = tree.xpath(('//table[@id=\"post-%d\"]'\n                            '/descendant::div[@class=\"post-controls\"]'\n                            '/descendant::a/@href') % post.pk)\n        self.assertIn(edit_url, hrefs)\n        self.assertIn(moderate_url, hrefs)\n        self.assertIn(move_url, hrefs)\n        self.assertIn(admin_url, hrefs)\n        self.assertEqual(len(hrefs), 4)\n\n        staff.user_permissions.add(delete_topic_perm)\n        staff.user_permissions.add(delete_post_perm)\n        response = self.get_with_user(topic_url, 'staff', 'staff')\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content)\n        hrefs = tree.xpath(('//table[@id=\"post-%d\"]'\n                            '/descendant::div[@class=\"post-controls\"]'\n                            '/descendant::a/@href') % post.pk)\n        self.assertIn(edit_url, hrefs)\n        self.assertIn(moderate_url, hrefs)\n        self.assertIn(admin_url, hrefs)\n        self.assertIn(delete_url, hrefs)\n        self.assertIn(move_url, hrefs)\n        self.assertEqual(len(hrefs), 5)\n\n    def test_post_actions_superuser(self):\n        superuser = User.objects.create_user('superuser', 'superuser@localhost', 'superuser')\n        superuser.is_superuser = True\n        superuser.save()\n        topic1, topic2 = self.create_initial(on_moderation=True)[0:2]\n        post = topic2.head\n\n        topic_url = topic2.get_absolute_url()\n        edit_url = reverse('pybb:edit_post', kwargs={'pk': post.pk})\n        delete_url = reverse('pybb:delete_post', kwargs={'pk': post.pk})\n        move_url = reverse('pybb:move_post', kwargs={'pk': post.pk})\n        moderate_url = reverse('pybb:moderate_post', kwargs={'pk': post.pk})\n        admin_url = reverse('admin:pybb_post_change', args=[post.pk, ])\n\n        response = self.get_with_user(topic2.get_absolute_url(), 'superuser', 'superuser')\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content)\n        hrefs = tree.xpath(('//table[@id=\"post-%d\"]'\n                            '/descendant::div[@class=\"post-controls\"]'\n                            '/descendant::a/@href') % post.pk)\n        self.assertIn(edit_url, hrefs)\n        self.assertIn(moderate_url, hrefs)\n        self.assertIn(admin_url, hrefs)\n        self.assertIn(move_url, hrefs)\n        self.assertIn(delete_url, hrefs)\n        self.assertEqual(len(hrefs), 5)\n\n\n    def test_post_actions_moderator(self):\n        topic1, topic2 = self.create_initial(on_moderation=True)[0:2]\n        forum1, post1_1_1, post1_2_1 = topic1.forum, topic1.head, topic2.head\n        forum2 = Forum.objects.create(name='test 2', description='bar 2', category=forum1.category)\n\n        moderator1 = User.objects.create_user('moderator1', 'moderator1@localhost', 'moderator1')\n        moderator2 = User.objects.create_user('moderator2', 'moderator2@localhost', 'moderator2')\n        forum1.moderators.add(moderator1)\n        forum2.moderators.add(moderator2)\n\n        # Alice's topic/post which does not need moderation\n        topic_url = topic1.get_absolute_url()\n        edit_url = reverse('pybb:edit_post', kwargs={'pk': post1_1_1.pk})\n        delete_url = reverse('pybb:delete_post', kwargs={'pk': post1_1_1.pk})\n        move_url = reverse('pybb:move_post', kwargs={'pk': post1_1_1.pk})\n        moderate_url = reverse('pybb:moderate_post', kwargs={'pk': post1_1_1.pk})\n        admin_url = reverse('admin:pybb_post_change', args=[post1_1_1.pk, ])\n\n        # moderator1 can edit or delete alice's post which does not need moderation\n        response = self.get_with_user(topic_url, 'moderator1', 'moderator1')\n        tree = html.fromstring(response.content)\n        self.assertEqual(response.status_code, 200)\n        hrefs = tree.xpath(('//table[@id=\"post-%d\"]'\n                            '/descendant::div[@class=\"post-controls\"]'\n                            '/descendant::a/@href') % post1_1_1.pk)\n        self.assertIn(edit_url, hrefs)\n        self.assertIn(delete_url, hrefs)\n        self.assertIn(move_url, hrefs)\n        self.assertEqual(len(hrefs), 3)\n\n        # moderator2 has not perms on alice's post because he is not moderator of this forum\n        response = self.get_with_user(topic_url, 'moderator2', 'moderator2')\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content)\n        hrefs = tree.xpath(('//table[@id=\"post-%d\"]'\n                            '/descendant::div[@class=\"post-controls\"]'\n                            '/descendant::a/@href') % post1_1_1.pk)\n        self.assertEqual(len(hrefs), 0)\n\n\n        # Alice's topic/post which need moderation\n        topic_url = topic2.get_absolute_url()\n        edit_url = reverse('pybb:edit_post', kwargs={'pk': post1_2_1.pk})\n        delete_url = reverse('pybb:delete_post', kwargs={'pk': post1_2_1.pk})\n        move_url = reverse('pybb:move_post', kwargs={'pk': post1_2_1.pk})\n        moderate_url = reverse('pybb:moderate_post', kwargs={'pk': post1_2_1.pk})\n        admin_url = reverse('admin:pybb_post_change', args=[post1_2_1.pk, ])\n\n        # moderator1 can edit, approve or delete alice's post which need moderation\n        response = self.get_with_user(topic_url, 'moderator1', 'moderator1')\n        self.assertEqual(response.status_code, 200)\n        tree = html.fromstring(response.content)\n        hrefs = tree.xpath(('//table[@id=\"post-%d\"]'\n                            '/descendant::div[@class=\"post-controls\"]'\n                            '/descendant::a/@href') % post1_2_1.pk)\n        self.assertIn(edit_url, hrefs)\n        self.assertIn(delete_url, hrefs)\n        self.assertIn(move_url, hrefs)\n        self.assertIn(moderate_url, hrefs)\n        self.assertEqual(len(hrefs), 4)\n\n        # moderator2 can not view this post because it require moderation and moderator2 is\n        # not moderator of this forum\n        response = self.get_with_user(topic_url, 'moderator2', 'moderator2')\n        self.assertEqual(response.status_code, 403)\n\n\nclass CustomPermissionHandlerTest(TestCase, SharedTestModule):\n    \"\"\" test custom permission handler \"\"\"\n\n    def setUp(self):\n        self.create_user()\n        # create public and hidden categories, forums, posts\n        c_pub = Category(name='public')\n        c_pub.save()\n        c_hid = Category(name='private', hidden=True)\n        c_hid.save()\n        self.forum = Forum.objects.create(name='pub1', category=c_pub)\n        Forum.objects.create(name='priv1', category=c_hid)\n        Forum.objects.create(name='private_in_public_cat', hidden=True, category=c_pub)\n        for f in Forum.objects.all():\n            t = Topic.objects.create(name='a topic', forum=f, user=self.user)\n            self.create_post(topic=t, user=self.user, body='test')\n        # make some topics closed => hidden\n        for t in Topic.objects.all()[0:2]:\n            t.closed = True\n            t.save()\n\n        _attach_perms_class('pybb.tests.CustomPermissionHandler')\n\n    def tearDown(self):\n        _detach_perms_class()\n\n    def test_category_permission(self):\n        for c in Category.objects.all():\n            # anon user may not see category\n            r = self.get_with_user(c.get_absolute_url())\n            if c.hidden:\n                self.assertEqual(r.status_code, 302)\n            else:\n                self.assertEqual(r.status_code, 200)\n                # logged on user may see all categories\n            r = self.get_with_user(c.get_absolute_url(), 'zeus', 'zeus')\n            self.assertEqual(r.status_code, 200)\n\n    def test_forum_permission(self):\n        for f in Forum.objects.all():\n            r = self.get_with_user(f.get_absolute_url())\n            self.assertEqual(r.status_code, 302 if f.hidden or f.category.hidden else 200)\n            r = self.get_with_user(f.get_absolute_url(), 'zeus', 'zeus')\n            self.assertEqual(r.status_code, 200)\n            self.assertEqual(r.context['object_list'].count(), f.topics.filter(closed=False).count())\n\n    def test_topic_permission(self):\n        for t in Topic.objects.all():\n            r = self.get_with_user(t.get_absolute_url())\n            self.assertEqual(r.status_code, 302 if t.forum.hidden or t.forum.category.hidden else 200)\n            r = self.get_with_user(t.get_absolute_url(), 'zeus', 'zeus')\n            self.assertEqual(r.status_code, 200)\n\n    def test_post_permission(self):\n        for p in Post.objects.all():\n            r = self.get_with_user(p.get_absolute_url())\n            self.assertEqual(r.status_code, 302)\n            r = self.get_with_user(p.get_absolute_url(), 'zeus', 'zeus')\n            self.assertEqual(r.status_code, 302)\n\n    def test_poll_add(self):\n        self.login_client()\n        values = {'body': 'test poll body',\n                  'name': 'test poll name',\n                  'poll_type': 1,  # poll_type: 1, create topic with poll\n                  'poll_question': 'q1',\n                  'poll_answers-0-text': 'answer1',\n                  'poll_answers-1-text': 'answer2',\n                  'poll_answers-TOTAL_FORMS': 2,}\n        response = self.create_post_via_http(self.client, forum_id=self.forum.id, **values)\n        self.assertEqual(response.status_code, 200)\n        new_topic = Topic.objects.get(name='test poll name')\n        self.assertIsNone(new_topic.poll_question)\n        self.assertFalse(PollAnswer.objects.filter(topic=new_topic).exists()) # no answers here\n\n\nclass RestrictEditingHandler(permissions.DefaultPermissionHandler):\n    def may_create_topic(self, user, forum):\n        return False\n\n    def may_create_post(self, user, topic):\n        return False\n\n    def may_edit_post(self, user, post):\n        return False\n\n\nclass LogonRedirectTest(TestCase, SharedTestModule):\n    \"\"\" test whether anonymous user gets redirected, whereas unauthorized user gets PermissionDenied \"\"\"\n\n    def setUp(self):\n        # create users\n        staff = User.objects.create_user('staff', 'staff@localhost', 'staff')\n        staff.is_staff = True\n        staff.save()\n        nostaff = User.objects.create_user('nostaff', 'nostaff@localhost', 'nostaff')\n        nostaff.is_staff = False\n        nostaff.save()\n\n        # create topic, post in hidden category\n        self.category = Category(name='private', hidden=True)\n        self.category.save()\n        self.forum = Forum(name='priv1', category=self.category)\n        self.forum.save()\n        self.topic = Topic(name='a topic', forum=self.forum, user=staff)\n        self.topic.save()\n        self.post = self.create_post(body='body post', topic=self.topic, user=staff, on_moderation=True)\n\n    def test_redirect_category(self):\n        # access without user should be redirected\n        r = self.get_with_user(self.category.get_absolute_url())\n        self.assertRedirects(r, settings.LOGIN_URL + '?next=%s' % self.category.get_absolute_url())\n        # access with (unauthorized) user should get 403 (forbidden)\n        r = self.get_with_user(self.category.get_absolute_url(), 'nostaff', 'nostaff')\n        self.assertEquals(r.status_code, 403)\n        # allowed user is allowed\n        r = self.get_with_user(self.category.get_absolute_url(), 'staff', 'staff')\n        self.assertEquals(r.status_code, 200)\n\n    def test_redirect_forum(self):\n        # access without user should be redirected\n        r = self.get_with_user(self.forum.get_absolute_url())\n        self.assertRedirects(r, settings.LOGIN_URL + '?next=%s' % self.forum.get_absolute_url())\n        # access with (unauthorized) user should get 403 (forbidden)\n        r = self.get_with_user(self.forum.get_absolute_url(), 'nostaff', 'nostaff')\n        self.assertEquals(r.status_code, 403)\n        # allowed user is allowed\n        r = self.get_with_user(self.forum.get_absolute_url(), 'staff', 'staff')\n        self.assertEquals(r.status_code, 200)\n\n    def test_redirect_topic(self):\n        # access without user should be redirected\n        r = self.get_with_user(self.topic.get_absolute_url())\n        self.assertRedirects(r, settings.LOGIN_URL + '?next=%s' % self.topic.get_absolute_url())\n        # access with (unauthorized) user should get 403 (forbidden)\n        r = self.get_with_user(self.topic.get_absolute_url(), 'nostaff', 'nostaff')\n        self.assertEquals(r.status_code, 403)\n        # allowed user is allowed\n        r = self.get_with_user(self.topic.get_absolute_url(), 'staff', 'staff')\n        self.assertEquals(r.status_code, 200)\n\n    def test_redirect_post(self):\n        # access without user should be redirected\n        r = self.get_with_user(self.post.get_absolute_url())\n        self.assertRedirects(r, settings.LOGIN_URL + '?next=%s' % self.post.get_absolute_url())\n        # access with (unauthorized) user should get 403 (forbidden)\n        r = self.get_with_user(self.post.get_absolute_url(), 'nostaff', 'nostaff')\n        self.assertEquals(r.status_code, 403)\n        # allowed user is allowed\n        r = self.get_with_user(self.post.get_absolute_url(), 'staff', 'staff')\n        self.assertEquals(r.status_code, 302)\n\n    @override_settings(PYBB_ENABLE_ANONYMOUS_POST=False)\n    def test_redirect_topic_add(self):\n        _attach_perms_class('pybb.tests.RestrictEditingHandler')\n\n        # access without user should be redirected\n        add_topic_url = reverse('pybb:add_topic', kwargs={'forum_id': self.forum.id})\n        r = self.get_with_user(add_topic_url)\n        self.assertRedirects(r, settings.LOGIN_URL + '?next=%s' % add_topic_url)\n\n        # access with (unauthorized) user should get 403 (forbidden)\n        r = self.get_with_user(add_topic_url, 'staff', 'staff')\n        self.assertEquals(r.status_code, 403)\n\n        _detach_perms_class()\n\n        # allowed user is allowed\n        r = self.get_with_user(add_topic_url, 'staff', 'staff')\n        self.assertEquals(r.status_code, 200)\n\n    def test_redirect_post_edit(self):\n        _attach_perms_class('pybb.tests.RestrictEditingHandler')\n\n        # access without user should be redirected\n        edit_post_url = reverse('pybb:edit_post', kwargs={'pk': self.post.id})\n        r = self.get_with_user(edit_post_url)\n        self.assertRedirects(r, settings.LOGIN_URL + '?next=%s' % edit_post_url)\n\n        # access with (unauthorized) user should get 403 (forbidden)\n        r = self.get_with_user(edit_post_url, 'staff', 'staff')\n        self.assertEquals(r.status_code, 403)\n\n        _detach_perms_class()\n\n        # allowed user is allowed\n        r = self.get_with_user(edit_post_url, 'staff', 'staff')\n        self.assertEquals(r.status_code, 200)\n\n    def test_profile_autocreation_signal_on(self):\n        user = User.objects.create_user('cronos', 'cronos@localhost', 'cronos')\n        profile = getattr(user, defaults.PYBB_PROFILE_RELATED_NAME, None)\n        self.assertIsNotNone(profile)\n        self.assertEqual(type(profile), util.get_pybb_profile_model())\n        user.delete()\n\n    def test_profile_autocreation_middleware(self):\n        user = User.objects.create_user('cronos', 'cronos@localhost', 'cronos')\n        getattr(user, defaults.PYBB_PROFILE_RELATED_NAME).delete()\n        #just display a page : the middleware should create the profile\n        self.get_with_user('/', 'cronos', 'cronos')\n        user = User.objects.get(username='cronos')\n        profile = getattr(user, defaults.PYBB_PROFILE_RELATED_NAME, None)\n        self.assertIsNotNone(profile)\n        self.assertEqual(type(profile), util.get_pybb_profile_model())\n        user.delete()\n\n    def test_user_delete_cascade(self):\n        user = User.objects.create_user('cronos', 'cronos@localhost', 'cronos')\n        profile = getattr(user, defaults.PYBB_PROFILE_RELATED_NAME, None)\n        self.assertIsNotNone(profile)\n        post = self.create_post(topic=self.topic, user=user, body='I \\'ll be back')\n        user_pk = user.pk\n        profile_pk = profile.pk\n        post_pk = post.pk\n\n        user.delete()\n        self.assertFalse(User.objects.filter(pk=user_pk).exists())\n        self.assertFalse(Profile.objects.filter(pk=profile_pk).exists())\n        self.assertFalse(Post.objects.filter(pk=post_pk).exists())\n\n\nclass NiceUrlsTest(TestCase, SharedTestModule):\n    def __init__(self, *args, **kwargs):\n        super(NiceUrlsTest, self).__init__(*args, **kwargs)\n        self.ORIGINAL_PYBB_NICE_URL = defaults.PYBB_NICE_URL\n        defaults.PYBB_NICE_URL = True\n        self.urls = settings.ROOT_URLCONF\n\n    def setUp(self):\n        self.create_user()\n        self.login_client()\n        self.create_initial()\n        self.ORIGINAL_PYBB_NICE_URL = defaults.PYBB_NICE_URL\n        defaults.PYBB_NICE_URL = True\n\n    def test_unicode_slugify(self):\n        self.assertEqual(slugify('北京 (China), Москва (Russia), é_è (a sad smiley !)'),\n                         'bei-jing-china-moskva-russia-e_e-a-sad-smiley')\n\n    def test_automatique_slug(self):\n        self.assertEqual(slugify(self.category.name), self.category.slug)\n        self.assertEqual(slugify(self.forum.name), self.forum.slug)\n        self.assertEqual(slugify(self.topic.name), self.topic.slug)\n\n    def test_no_duplicate_slug(self):\n        category_name = self.category.name\n        forum_name = self.forum.name\n        topic_name = self.topic.name\n\n        # objects created without slug but the same name\n        category = Category.objects.create(name=category_name)\n        forum = Forum.objects.create(name=forum_name, description='bar', category=self.category)\n        topic = Topic.objects.create(name=topic_name, forum=self.forum, user=self.user)\n\n        slug_nb = len(Category.objects.filter(slug__startswith=category_name)) - 1\n        self.assertEqual('%s-%d' % (slugify(category_name), slug_nb), category.slug)\n        slug_nb = len(Forum.objects.filter(slug__startswith=forum_name)) - 1\n        self.assertEqual('%s-%d' % (slugify(forum_name), slug_nb), forum.slug)\n        slug_nb = len(Topic.objects.filter(slug__startswith=topic_name)) - 1\n        self.assertEqual('%s-%d' % (slugify(topic_name), slug_nb), topic.slug)\n\n        # objects created with a duplicate slug but a different name\n        category = Category.objects.create(name='test_slug_category', slug=slugify(category_name))\n        forum = Forum.objects.create(name='test_slug_forum', description='bar',\n                                     category=self.category, slug=slugify(forum_name))\n        topic = Topic.objects.create(name='test_topic_slug', forum=self.forum,\n                                     user=self.user, slug=slugify(topic_name))\n        slug_nb = len(Category.objects.filter(slug__startswith=category_name)) - 1\n        self.assertEqual('%s-%d' % (slugify(category_name), slug_nb), category.slug)\n        slug_nb = len(Forum.objects.filter(slug__startswith=forum_name)) - 1\n        self.assertEqual('%s-%d' % (slugify(forum_name), slug_nb), forum.slug)\n        slug_nb = len(Topic.objects.filter(slug__startswith=self.topic.name)) - 1\n        self.assertEqual('%s-%d' % (slugify(topic_name), slug_nb), topic.slug)\n\n    def test_fail_on_too_many_duplicate_slug(self):\n\n        original_duplicate_limit = defaults.PYBB_NICE_URL_SLUG_DUPLICATE_LIMIT\n\n        defaults.PYBB_NICE_URL_SLUG_DUPLICATE_LIMIT = 200\n\n        try:\n            for _ in iter(range(200)):\n                Topic.objects.create(name='dolly', forum=self.forum, user=self.user)\n        except ValidationError as e:\n            self.fail('Should be able to create \"dolly\", \"dolly-1\", ..., \"dolly-199\".\\n')\n        with self.assertRaises(ValidationError):\n            Topic.objects.create(name='dolly', forum=self.forum, user=self.user)\n\n        defaults.PYBB_NICE_URL_SLUG_DUPLICATE_LIMIT = original_duplicate_limit\n\n    def test_long_duplicate_slug(self):\n        long_name = 'abcde' * 51  # 255 symbols\n        topic1 = Topic.objects.create(name=long_name, forum=self.forum, user=self.user)\n        self.assertEqual(topic1.slug, long_name)\n        topic2 = Topic.objects.create(name=long_name, forum=self.forum, user=self.user)\n        self.assertEqual(topic2.slug, '%s-1' % long_name[:253])\n        topic3 = Topic.objects.create(name=long_name, forum=self.forum, user=self.user)\n        self.assertEqual(topic3.slug, '%s-2' % long_name[:253])\n\n    def test_absolute_url(self):\n        response = self.client.get(self.category.get_absolute_url())\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.context['category'], self.category)\n        self.assertEqual('/c/%s/' % (self.category.slug), self.category.get_absolute_url())\n        response = self.client.get(self.forum.get_absolute_url())\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.context['forum'], self.forum)\n        self.assertEqual(\n            '/c/%s/%s/' % (self.category.slug, self.forum.slug),\n            self.forum.get_absolute_url()\n            )\n        response = self.client.get(self.topic.get_absolute_url())\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.context['topic'], self.topic)\n        self.assertEqual(\n            '/c/%s/%s/%s/' % (self.category.slug, self.forum.slug, self.topic.slug),\n            self.topic.get_absolute_url()\n            )\n\n    def test_add_topic(self):\n        add_topic_url = reverse('pybb:add_topic', kwargs={'forum_id': self.forum.pk})\n        response = self.client.get(add_topic_url)\n        inputs = dict(html.fromstring(response.content).xpath('//form[@class=\"%s\"]' % \"post-form\")[0].inputs)\n        self.assertNotIn('slug', inputs)\n        values = self.get_form_values(response)\n        values.update({'name': self.topic.name, 'body': '[b]Test slug body[/b]', 'poll_type': 0})\n        response = self.client.post(add_topic_url, data=values, follow=True)\n        slug_nb = len(Topic.objects.filter(slug__startswith=slugify(self.topic.name))) - 1\n        self.assertIsNotNone = Topic.objects.get(slug='%s-%d' % (self.topic.name, slug_nb))\n\n        _attach_perms_class('pybb.tests.CustomPermissionHandler')\n        response = self.client.get(add_topic_url)\n        inputs = dict(html.fromstring(response.content).xpath('//form[@class=\"%s\"]' % \"post-form\")[0].inputs)\n        self.assertIn('slug', inputs)\n        values = self.get_form_values(response)\n        values.update({'name': self.topic.name, 'body': '[b]Test slug body[/b]',\n                       'poll_type': 0, 'slug': 'test_slug'})\n        response = self.client.post(add_topic_url, data=values, follow=True)\n        self.assertIsNotNone = Topic.objects.get(slug='test_slug')\n        _detach_perms_class()\n\n    def test_old_url_redirection(self):\n\n        original_perm_redirect = defaults.PYBB_NICE_URL_PERMANENT_REDIRECT\n\n        for redirect_status in [301, 302]:\n            defaults.PYBB_NICE_URL_PERMANENT_REDIRECT = redirect_status == 301\n\n            response = self.client.get(reverse(\"pybb:category\", kwargs={\"pk\": self.category.pk}))\n            self.assertRedirects(response, self.category.get_absolute_url(), status_code=redirect_status)\n\n            response = self.client.get(reverse(\"pybb:forum\", kwargs={\"pk\": self.forum.pk}))\n            self.assertRedirects(response, self.forum.get_absolute_url(), status_code=redirect_status)\n\n            response = self.client.get(reverse(\"pybb:topic\", kwargs={\"pk\": self.topic.pk}))\n            self.assertRedirects(response, self.topic.get_absolute_url(), status_code=redirect_status)\n\n        defaults.PYBB_NICE_URL_PERMANENT_REDIRECT = original_perm_redirect\n\n    def tearDown(self):\n        defaults.PYBB_NICE_URL = self.ORIGINAL_PYBB_NICE_URL\n\n\nclass TestTemplateTags(TestCase, SharedTestModule):\n    \"\"\"Tests all templatetags and filter defined by pybb\"\"\"\n\n    # def setUp(self):\n        # self.create_user()\n        # self.create_initial()\n\n    def test_pybb_time_anonymous(self):\n        template = Template('{% load pybb_tags %}{% pybb_time a_time %}')\n        context = Context({'user': AnonymousUser()})\n\n        context['a_time'] = timezone.now() - timezone.timedelta(days=2)\n        output = template.render(context)\n        self.assertEqual(output, dateformat.format(context['a_time'], 'd M, Y H:i'))\n\n        context['a_time'] = timezone.now() - timezone.timedelta(days=1)\n        output = template.render(context)\n        self.assertEqual(output, 'yesterday, %s' % context['a_time'].strftime('%H:%M'))\n\n        context['a_time'] = timezone.now() - timezone.timedelta(hours=1)\n        output = template.render(context)\n        self.assertEqual(output, 'today, %s' % context['a_time'].strftime('%H:%M'))\n\n        context['a_time'] = timezone.now() - timezone.timedelta(minutes=30)\n        output = template.render(context)\n        self.assertEqual(output, '30 minutes ago')\n\n        context['a_time'] = timezone.now() - timezone.timedelta(seconds=30)\n        output = template.render(context)\n        self.assertEqual(output, '30 seconds ago')\n\n    def test_pybb_time_authenticated(self):\n        self.create_user()\n        template = Template('{% load pybb_tags %}{% pybb_time a_time %}')\n        context = Context({'user': self.user})\n        context['a_time'] = timezone.now() - timezone.timedelta(days=4)\n        output = template.render(context)\n        tz = util.get_pybb_profile(self.user).time_zone * 60 * 60\n        tz += time.altzone if time.daylight else time.timezone\n        user_datetime = context['a_time'] + timezone.timedelta(seconds=tz)\n        self.assertEqual(output, dateformat.format(user_datetime, 'd M, Y H:i'))\n\n        context['a_time'] = timezone.now() - timezone.timedelta(seconds=30)\n        output = template.render(context)\n        self.assertEqual(output, '30 seconds ago')\n\n    def test_pybb_get_time(self):\n        template = Template(('{% load pybb_tags %}{% pybb_get_time a_time as time_output %}'\n                             '{{ time_output|upper }}'))\n        context = Context({'user': AnonymousUser(),\n                           'a_time': timezone.now() - timezone.timedelta(seconds=30)})\n        output = template.render(context)\n        self.assertEqual(output, '30 SECONDS AGO')\n\n    def test_pybb_link(self):\n        self.create_user()\n        self.create_initial()\n        template = Template(('{% load pybb_tags %}'\n                             '{% pybb_link topic %}, '\n                             '{% pybb_link forum %}, '\n                             '{% pybb_link post \"Hello <World>\" %}'))\n        context = Context({'user': AnonymousUser(),\n                           'post': self.post,\n                           'topic': self.topic,\n                           'forum': self.forum})\n        expected = ('<a href=\"%s\">%s</a>' % (self.topic.get_absolute_url(), self.topic),\n                    '<a href=\"%s\">%s</a>' % (self.forum.get_absolute_url(), self.forum),\n                    '<a href=\"%s\">%s</a>' % (self.post.get_absolute_url(), 'Hello &lt;World&gt;'))\n        expected = ', '.join(expected)\n        output = template.render(context)\n        self.assertEqual(output, expected)\n\n    def test_pybb_posted_by(self):\n        self.create_user()\n        self.create_initial()\n        template = Template(('{% load pybb_tags %}'\n                             '{% if post|pybb_posted_by:user %}YES{% else %}NO{% endif %}:'\n                             '{% if post|pybb_posted_by:anonymous %}YES{% else %}NO{% endif %}'))\n        context = Context({'user': self.user,\n                           'anonymous': AnonymousUser(),\n                           'post': self.post})\n        output = template.render(context)\n        self.assertEqual(output, 'YES:NO')\n\n\n    def test_pybb_is_topic_unread(self):\n        self.create_user()\n        self.create_initial()\n        self.login_client()\n        self.client.get(self.topic.get_absolute_url())\n        template = Template(('{% load pybb_tags %}'\n                             '{% if topic|pybb_is_topic_unread:user %}YES{% else %}NO{% endif %}:'\n                             '{% if topic|pybb_is_topic_unread:anonymous %}YES{% else %}NO{% endif %}:'\n                             '{% if topic|pybb_is_topic_unread:bob %}YES{% else %}NO{% endif %}'))\n        context = Context({'user': self.user,\n                           'anonymous': AnonymousUser(),\n                           'bob': User.objects.create_user('bob', 'bob@localhost', 'bob'),\n                           'topic': self.topic})\n        output = template.render(context)\n        self.assertEqual(output, 'NO:NO:YES')\n\n\n    def test_pybb_topic_unread(self):\n        self.create_user()\n        self.login_client()\n        bob = User.objects.create_user('bob', 'bob@localhost', 'bob')\n\n        \"\"\"\n        creates a total of 6 topics in 3 forums.\n            * Forum A\n                * Topic A1\n            * Forum B\n                * Topic B1\n                * Topic B2\n            * Forum C\n                * Topic C1\n                * Topic C2\n                * Topic C3\n        \"\"\"\n        forums = []\n        topics = []\n        category = Category.objects.create(name='foo')\n        for letter in 'ABC':\n            forum = Forum.objects.create(name=letter, description=letter, category=category)\n            forums.append(forum)\n            topic = Topic.objects.create(name='%s1' % letter, forum=forum, user=bob)\n            self.create_post(topic=topic, user=bob, body='test')\n            topics.append(topic)\n        topic = Topic.objects.create(name='B2', forum=forums[1], user=bob)\n        self.create_post(topic=topic, user=bob, body='test')\n        topics.append(topic)\n        topic = Topic.objects.create(name='C2', forum=forums[2], user=bob)\n        self.create_post(topic=topic, user=bob, body='test')\n        topics.append(topic)\n        topic = Topic.objects.create(name='C3', forum=forums[2], user=bob)\n        self.create_post(topic=topic, user=bob, body='test')\n        topics.append(topic)\n\n        template = Template(('{% load pybb_tags %}'\n                             '{% for topic in topics|pybb_topic_unread:user %}'\n                             '{{ topic.name }}: {{ topic.unread }}\\n'\n                             '{% endfor %}'))\n\n        # test with anonymous: unread should be empty (neither True, neither False)\n        context = Context({'user': AnonymousUser(), 'topics': topics})\n        output = template.render(context)\n        expected = '\\n'.join(('A1: ', 'B1: ', 'C1: ',\n                              'B2: ', 'C2: ',\n                              'C3: ', ''))\n        self.assertEqual(output, expected)\n\n        # User should have everything marked as unread\n        context['user'] = self.user\n        output = template.render(context)\n        expected = '\\n'.join(('A1: True', 'B1: True', 'C1: True',\n                              'B2: True', 'C2: True',\n                              'C3: True', ''))\n        self.assertEqual(output, expected)\n\n        # mark A1, B1 and C1 as read for user\n        self.client.get(topics[0].get_absolute_url())\n        self.client.get(topics[1].get_absolute_url())\n        self.client.get(topics[2].get_absolute_url())\n        output = template.render(context)\n        expected = '\\n'.join(('A1: False', 'B1: False', 'C1: False',\n                              'B2: True', 'C2: True',\n                              'C3: True', ''))\n        self.assertEqual(output, expected)\n\n        # mark all as read for user\n        self.client.get(reverse('pybb:mark_all_as_read'))\n        output = template.render(context)\n        expected = '\\n'.join(('A1: False', 'B1: False', 'C1: False',\n                              'B2: False', 'C2: False',\n                              'C3: False', ''))\n        self.assertEqual(output, expected)\n\n\n    def test_pybb_forum_unread(self):\n        self.create_user()\n        self.login_client()\n        bob = User.objects.create_user('bob', 'bob@localhost', 'bob')\n\n        \"\"\"\n        creates a total of 6 topics in 3 forums.\n            * Forum A\n                * Topic A1\n            * Forum B\n                * Topic B1\n                * Topic B2\n            * Forum C\n                * Topic C1\n                * Topic C2\n                * Topic C3\n        \"\"\"\n        forums = []\n        topics = []\n        category = Category.objects.create(name='foo')\n        for letter in 'ABC':\n            forum = Forum.objects.create(name=letter, description=letter, category=category)\n            forums.append(forum)\n            topic = Topic.objects.create(name='%s1' % letter, forum=forum, user=bob)\n            self.create_post(topic=topic, user=bob, body='test')\n            topics.append(topic)\n        topic = Topic.objects.create(name='B2', forum=forums[1], user=bob)\n        self.create_post(topic=topic, user=bob, body='test')\n        topics.append(topic)\n        topic = Topic.objects.create(name='C2', forum=forums[2], user=bob)\n        self.create_post(topic=topic, user=bob, body='test')\n        topics.append(topic)\n        topic = Topic.objects.create(name='C3', forum=forums[2], user=bob)\n        self.create_post(topic=topic, user=bob, body='test')\n        topics.append(topic)\n\n        template = Template(('{% load pybb_tags %}'\n                             '{% for forum in forums|pybb_forum_unread:user %}'\n                             '{{ forum.name }}: {{ forum.unread }}\\n'\n                             '{% endfor %}'))\n\n        context = Context({'forums': forums})\n        # test for anonymous user: unread is empty (neither True, neither False)\n        context['user'] = AnonymousUser()\n        output = template.render(context)\n        expected = '\\n'.join(('A: ', 'B: ', 'C: ', ''))\n        self.assertEqual(output, expected)\n\n        # User should have everything marked as unread\n        context['user'] = self.user\n        output = template.render(context)\n        expected = '\\n'.join(('A: True', 'B: True', 'C: True', ''))\n        self.assertEqual(output, expected)\n\n        # mark A1, B1 and C1 as read for user (so forum A is not unread now)\n        self.client.get(topics[0].get_absolute_url())\n        self.client.get(topics[1].get_absolute_url())\n        self.client.get(topics[2].get_absolute_url())\n        output = template.render(context)\n        expected = '\\n'.join(('A: False', 'B: True', 'C: True', ''))\n        self.assertEqual(output, expected)\n\n        # mark all as read for user\n        self.client.get(reverse('pybb:mark_all_as_read'))\n        output = template.render(context)\n        expected = '\\n'.join(('A: False', 'B: False', 'C: False', ''))\n        self.assertEqual(output, expected)\n\n\n    def test_pybb_topic_inline_pagination(self):\n        self.create_user()\n        self.create_initial()\n        self.topic.post_count = defaults.PYBB_TOPIC_PAGE_SIZE * 13\n        nb_pages = int(math.ceil(float(self.topic.post_count) / defaults.PYBB_TOPIC_PAGE_SIZE))\n\n        template = Template(('{% load pybb_tags %}'\n                             '{% for page in topic|pybb_topic_inline_pagination %}'\n                             '{{ page }} '\n                             '{% endfor %}'))\n        context = Context({'user': AnonymousUser(), 'topic': self.topic})\n        output = template.render(context)\n        expected = '1 2 3 4 ... %d ' % nb_pages\n        self.assertEqual(output, expected)\n\n        self.topic.post_count = defaults.PYBB_TOPIC_PAGE_SIZE * 3\n        output = template.render(context)\n        expected = '1 2 3 '\n        self.assertEqual(output, expected)\n\n\n    def test_pybb_topic_poll_not_voted(self):\n        self.create_user()\n        self.create_initial()\n        self.topic.poll_type = Topic.POLL_TYPE_SINGLE\n        self.topic.poll_question = 'Where is Brian?'\n        self.topic.save()\n        kitchen = PollAnswer.objects.create(topic=self.topic, text='in the kitchen')\n        bathroom = PollAnswer.objects.create(topic=self.topic, text='in the bathroom')\n\n        template = Template((\n            '{% load pybb_tags %}'\n            '{% if topic|pybb_topic_poll_not_voted:user %}NOTVOTED{% else %}VOTED{% endif %}:'\n            '{% if topic|pybb_topic_poll_not_voted:anonymous %}NOTVOTED{% else %}VOTED{% endif %}:'\n            '{% if topic|pybb_topic_poll_not_voted:bob %}NOTVOTED{% else %}VOTED{% endif %}'))\n        context = Context({'user': self.user,\n                           'anonymous': AnonymousUser(),\n                           'bob': User.objects.create_user('bob', 'bob@localhost', 'bob'),\n                           'topic': self.topic})\n        self.assertEqual(template.render(context), 'NOTVOTED:NOTVOTED:NOTVOTED')\n\n        # bob answers\n        PollAnswerUser.objects.create(poll_answer=kitchen, user=context['bob'])\n        self.assertEqual(template.render(context), 'NOTVOTED:NOTVOTED:VOTED')\n\n    def test_endswith(self):\n        template = Template(('{% load pybb_tags %}'\n                             '{{ test|endswith:\"the end...\" }}:'\n                             '{{ test|endswith:\"big bang\" }}'))\n        context = Context({'test': 'This is the end...'})\n        self.assertEqual(template.render(context), 'True:False')\n\n\n    def test_pybb_get_profile(self):\n        template = Template(('{% load pybb_tags %}'\n                             '{% pybb_get_profile bob as user_profile_via_args %}'\n                             '{% pybb_get_profile user=bob as user_profile_via_kwargs %}'\n                             '{% pybb_get_profile anonymous as no_profile %}'\n                             '{{ user_profile_via_args.pk }}:'\n                             '{{ user_profile_via_kwargs.pk }}:'\n                             '{{ no_profile }}'))\n        context = Context({'anonymous': AnonymousUser(),\n                           'bob': User.objects.create_user('bob', 'bob@localhost', 'bob')})\n\n        bob_profile_pk = util.get_pybb_profile(context['bob']).pk\n        self.assertEqual(template.render(context), '%(pk)d:%(pk)d:None' % {'pk': bob_profile_pk})\n\n\n    def test_pybb_get_latest_topics(self):\n        self.create_user()\n        self.create_initial()\n        self.topic.name = '0'\n        self.topic.save()\n        for i in range(1, 10):\n            topic = Topic.objects.create(name='%d' % i,\n                                         user=self.user, forum=self.forum,\n                                         on_moderation = bool(i % 2))\n            self.create_post(topic=topic, user=self.user, body='foo', on_moderation=bool(i % 2))\n\n        context = Context({'anonymous': AnonymousUser(), 'user': self.user})\n\n\n        # user can view all it's 5 last topic (default slice is 5)\n        template = Template(('{% load pybb_tags %}'\n                             '{% pybb_get_latest_topics as topics %}'\n                             '{% for topic in topics %}{{ topic.name }},{% endfor %}'))\n        self.assertEqual(template.render(context), '9,8,7,6,5,')\n\n        # user can view all it's topics\n        template = Template(('{% load pybb_tags %}'\n                             '{% pybb_get_latest_topics 20 as topics %}'\n                             '{% for topic in topics %}{{ topic.name }},{% endfor %}'))\n        self.assertEqual(template.render(context), '9,8,7,6,5,4,3,2,1,0,')\n\n        # anonymous can view topics which do not require moderation (the odd ones)\n        template = Template(('{% load pybb_tags %}'\n                             '{% pybb_get_latest_topics 20 anonymous as topics %}'\n                             '{% for topic in topics %}{{ topic.name }},{% endfor %}'))\n        self.assertEqual(template.render(context), '8,6,4,2,0,')\n\n\n    def test_pybb_get_latest_posts(self):\n        self.create_user()\n        self.create_initial()\n        self.topic.name = '0'\n        self.topic.save()\n        self.post.body = 'A0'\n        self.post.save()\n        self.create_post(topic=self.topic, body='B0', user=self.user, on_moderation = True)\n        for i in range(1, 10):\n            topic = Topic.objects.create(name='%d' % i, user=self.user, forum=self.forum, )\n            self.create_post(topic=topic, body='A%d' % i, user=self.user)\n            self.create_post(topic=topic, body='B%d' % i, user=self.user, on_moderation = True)\n\n        context = Context({'anonymous': AnonymousUser(), 'user': self.user})\n\n        ORIG = defaults.PYBB_PREMODERATION\n        # test without PREMODERATION\n        defaults.PYBB_PREMODERATION = False\n        # user can view all it's 5 last post (default slice is 5)\n        template = Template(('{% load pybb_tags %}'\n                             '{% pybb_get_latest_posts as posts %}'\n                             '{% for post in posts %}{{ post.body }},{% endfor %}'))\n        self.assertEqual(template.render(context), 'B9,A9,B8,A8,B7,')\n\n        # user can view all it's posts\n        template = Template(('{% load pybb_tags %}'\n                             '{% pybb_get_latest_posts 20 as posts %}'\n                             '{% for post in posts %}{{ post.body }},{% endfor %}'))\n        self.assertEqual(template.render(context),\n                         'B9,A9,B8,A8,B7,A7,B6,A6,B5,A5,B4,A4,B3,A3,B2,A2,B1,A1,B0,A0,')\n\n        # anonymous can view all posts when PYBB_PREMODERATION is disabled\n        template = Template(('{% load pybb_tags %}'\n                             '{% pybb_get_latest_posts 20 anonymous as posts %}'\n                             '{% for post in posts %}{{ post.body }},{% endfor %}'))\n        self.assertEqual(template.render(context),\n                         'B9,A9,B8,A8,B7,A7,B6,A6,B5,A5,B4,A4,B3,A3,B2,A2,B1,A1,B0,A0,')\n\n        # now, test with PREMODERATION\n        def fake_premoderation(user, body):\n            return True\n        defaults.PYBB_PREMODERATION = fake_premoderation\n        # user can always view all it's posts even if those need moderation\n        template = Template(('{% load pybb_tags %}'\n                             '{% pybb_get_latest_posts 20 as posts %}'\n                             '{% for post in posts %}{{ post.body }},{% endfor %}'))\n        self.assertEqual(template.render(context),\n                         'B9,A9,B8,A8,B7,A7,B6,A6,B5,A5,B4,A4,B3,A3,B2,A2,B1,A1,B0,A0,')\n\n        # anonymous can view posts which do not require moderation (all \"A\" posts)\n        template = Template(('{% load pybb_tags %}'\n                             '{% pybb_get_latest_posts 20 anonymous as posts %}'\n                             '{% for post in posts %}{{ post.body }},{% endfor %}'))\n        self.assertEqual(template.render(context), 'A9,A8,A7,A6,A5,A4,A3,A2,A1,A0,')\n        defaults.PYBB_PREMODERATION = ORIG\n\n\n    def test_perms_check_app_installed(self):\n        template = Template(('{% load pybb_tags %}'\n                             '{{ \"fairy\"|check_app_installed }}:{{ \"pybb\"|check_app_installed }}'))\n        self.assertEqual(template.render(Context()), 'False:True')\n\n\n    def test_pybbm_calc_topic_views(self):\n        self.create_user()\n        self.create_initial()\n        cache.delete(util.build_cache_key('anonymous_topic_views', topic_id=self.topic.id))\n        context = Context({'topic': self.topic})\n        template = Template(('{% load pybb_tags %}{{ topic|pybbm_calc_topic_views }}'))\n        self.assertEqual(template.render(context), '0')\n\n        self.client.get(self.topic.get_absolute_url())\n        self.assertEqual(template.render(context), '1')\n\n        bob = User.objects.create_user('bob', 'bob@localhost', 'bob')\n        self.get_with_user(self.topic.get_absolute_url(), username='bob', password='bob')\n        context['topic'] = Topic.objects.get(pk=self.topic.pk)\n        self.assertEqual(template.render(context), '2')\n\n        self.client.get(self.topic.get_absolute_url())\n        self.assertEqual(template.render(context), '3')\n\n\ndef build_dynamic_test_for_templatetags_perms():\n    \"\"\"\n    Dynamically creates test method for templatetags which are dynamically created via\n    methods from PermissionHandler (pybb.permissions)\n    \"\"\"\n    arg_mapping = {\n        'categories': Category.objects.all(),\n        'forums': Forum.objects.all(),\n        'topics': Topic.objects.all(),\n        'posts': Post.objects.all(),\n        'category': Category.objects.first,\n        'forum': Forum.objects.first,\n        'topic': Topic.objects.first,\n        'post': Post.objects.first,\n        'user': User.objects.first,\n    }\n\n    def build_test_method(method_name, method, required_arg, templatetag_name):\n        if method_name.startswith('filter') and len(method_args) == 3:\n            # Method should have 2 args: user and queryset. else we can not test it\n            def test(self):\n                self.create_user()\n                self.create_initial()\n                context = Context({'user': self.user, 'qs': arg_mapping[required_arg]})\n                template = Template(('{%% load pybb_tags %%}'\n                                     '{%% for o in user|%s:qs %%}'\n                                     '{{ o }}'\n                                     '{%% endfor %%}') % templatetag_name)\n                expected = ''.join(['%s' % obj for obj in method(self.user, context['qs'])])\n                self.assertEqual(template.render(context), expected)\n        elif method_name.startswith('may'):\n            def test(self):\n                self.create_user()\n                self.create_initial()\n                context = Context({'user': self.user})\n                if required_arg:\n                    context['obj'] = arg_mapping[required_arg]\n                    if callable(context['obj']):\n                        # because .first() is run when called, we need to call it now, not before\n                        context['obj'] = context['obj']()\n                    expected = '%s' % method(self.user, context['obj'])\n                    tpl = '{%% load pybb_tags %%}{{ user|%s:obj }}' % templatetag_name\n                else:\n                    expected = '%s' % method(self.user)\n                    tpl = '{%% load pybb_tags %%}{{ user|%s }}' % templatetag_name\n                template = Template(tpl)\n                self.assertEqual(template.render(context), expected)\n        else:\n            test = None\n        return test\n\n    for method_name, method in inspect.getmembers(permissions.perms):\n        if not inspect.ismethod(method):\n            continue  # only methods are used to dynamically build templatetags\n        if not method_name.startswith('may') and not method_name.startswith('filter'):\n            continue  # only (may|filter)* methods are used to dynamically build templatetags\n        method_args = inspect.getargspec(method).args\n        args_count = len(method_args)\n        if args_count not in (2, 3):\n            continue  # only methods with 2 or 3 params\n        if method_args[0] != 'self' or method_args[1] != 'user':\n            continue  # only methods with self and user as first args\n\n        templatetag_name = 'pybb_%s' % method_name\n\n        required_arg = None\n        if len(method_args) == 3:\n            # this is a filter which require a queryset or an obj\n            required_arg = method_args[2]\n            if required_arg not in arg_mapping:\n                required_arg = method_name.split('_')[-1]\n            if required_arg not in arg_mapping:\n                # Method or its args are not well named. We can not dynamically test it\n                continue\n        test_method = build_test_method(method_name, method, required_arg, templatetag_name)\n        if test_method:\n            test_method.__name__ = str('test_%s' % templatetag_name)\n            setattr(TestTemplateTags, test_method.__name__, test_method)\nbuild_dynamic_test_for_templatetags_perms()\n\n\nclass MiscTest(TestCase, SharedTestModule):\n\n    def test_profile_avatar_url_property(self):\n        self.create_user()\n        profile = util.get_pybb_profile(self.user)\n        # test the default avatar\n        self.assertEqual(profile.avatar_url, defaults.PYBB_DEFAULT_AVATAR_URL)\n\n        # test if user has a valid avatar\n        path = os.path.join(os.path.dirname(__file__), 'static', 'pybb', 'img', 'image.png')\n        profile.avatar = SimpleUploadedFile(name='image.png',\n                                            content=open(path, 'rb').read(),\n                                            content_type='image/png')\n        profile.save()\n        self.assertNotEqual(profile.avatar_url, defaults.PYBB_DEFAULT_AVATAR_URL)\n        self.assertTrue(profile.avatar_url.startswith(settings.MEDIA_URL + 'pybb/avatar/'))\n        self.assertTrue(profile.avatar_url.endswith('.png'))\n\n\n    def test_profile_get_display_name(self):\n        self.create_user()\n        profile = util.get_pybb_profile(self.user)\n        self.assertEqual(profile.get_display_name(), self.user.get_username())\n"
  },
  {
    "path": "pybb/urls.py",
    "content": "\n\nfrom django.urls import re_path\n\nfrom pybb.defaults import PYBB_NICE_URL\nfrom pybb.feeds import LastPosts, LastTopics\nfrom pybb.views import IndexView, CategoryView, ForumView, TopicView, \\\n    AddPostView, EditPostView, MovePostView, UserView, PostView, ProfileEditView, \\\n    DeletePostView, StickTopicView, UnstickTopicView, CloseTopicView, \\\n    OpenTopicView, ModeratePost, TopicPollVoteView, LatestTopicsView, \\\n    UserTopics, UserPosts, topic_cancel_poll_vote, block_user, unblock_user, \\\n    delete_subscription, add_subscription, post_ajax_preview, \\\n    mark_all_as_read, ForumSubscriptionView, UserEditPrivilegesView\n\napp_name = 'pybbm'\n\nurlpatterns = [\n    # Syndication feeds\n    re_path('^feeds/posts/$', LastPosts(), name='feed_posts'),\n    re_path('^feeds/topics/$', LastTopics(), name='feed_topics'),\n]\n\nurlpatterns += [\n    # Index, Category, Forum\n    re_path('^$', IndexView.as_view(), name='index'),\n    re_path('^category/(?P<pk>\\d+)/$', CategoryView.as_view(), name='category'),\n    re_path('^forum/(?P<pk>\\d+)/$', ForumView.as_view(), name='forum'),\n\n    # User\n    re_path('^users/(?P<username>[^/]+)/$', UserView.as_view(), name='user'),\n    re_path('^block_user/([^/]+)/$', block_user, name='block_user'),\n    re_path('^unblock_user/([^/]+)/$', unblock_user, name='unblock_user'),\n    re_path(r'^users/(?P<username>[^/]+)/topics/$', UserTopics.as_view(),\n        name='user_topics'),\n    re_path(r'^users/(?P<username>[^/]+)/posts/$', UserPosts.as_view(),\n        name='user_posts'),\n    re_path(r'^users/(?P<username>[^/]+)/edit-privileges/$',\n        UserEditPrivilegesView.as_view(), name='edit_privileges'),\n\n    # Profile\n    re_path('^profile/edit/$', ProfileEditView.as_view(), name='edit_profile'),\n\n    # Topic\n    re_path('^topic/(?P<pk>\\d+)/$', TopicView.as_view(), name='topic'),\n    re_path('^topic/(?P<pk>\\d+)/stick/$', StickTopicView.as_view(),\n        name='stick_topic'),\n    re_path('^topic/(?P<pk>\\d+)/unstick/$', UnstickTopicView.as_view(),\n        name='unstick_topic'),\n    re_path('^topic/(?P<pk>\\d+)/close/$', CloseTopicView.as_view(),\n        name='close_topic'),\n    re_path('^topic/(?P<pk>\\d+)/open/$', OpenTopicView.as_view(),\n        name='open_topic'),\n    re_path('^topic/(?P<pk>\\d+)/poll_vote/$', TopicPollVoteView.as_view(),\n        name='topic_poll_vote'),\n    re_path('^topic/(?P<pk>\\d+)/cancel_poll_vote/$', topic_cancel_poll_vote,\n        name='topic_cancel_poll_vote'),\n    re_path('^topic/latest/$', LatestTopicsView.as_view(), name='topic_latest'),\n\n    # Add topic/post\n    re_path('^forum/(?P<forum_id>\\d+)/topic/add/$', AddPostView.as_view(),\n        name='add_topic'),\n    re_path('^topic/(?P<topic_id>\\d+)/post/add/$', AddPostView.as_view(),\n        name='add_post'),\n\n    # Post\n    re_path('^post/(?P<pk>\\d+)/$', PostView.as_view(), name='post'),\n    re_path('^post/(?P<pk>\\d+)/edit/$', EditPostView.as_view(), name='edit_post'),\n    re_path('^post/(?P<pk>\\d+)/move/$', MovePostView.as_view(), name='move_post'),\n    re_path('^post/(?P<pk>\\d+)/delete/$', DeletePostView.as_view(),\n        name='delete_post'),\n    re_path('^post/(?P<pk>\\d+)/moderate/$', ModeratePost.as_view(),\n        name='moderate_post'),\n\n    # Attachment\n    # url('^attachment/(\\w+)/$', 'show_attachment', name='pybb_attachment'),\n\n    # Subscription\n    re_path('^subscription/topic/(\\d+)/delete/$',\n        delete_subscription, name='delete_subscription'),\n    re_path('^subscription/topic/(\\d+)/add/$',\n        add_subscription, name='add_subscription'),\n    re_path('^subscription/forum/(?P<pk>\\d+)/$',\n        ForumSubscriptionView.as_view(), name='forum_subscription'),\n\n    # API\n    re_path('^api/post_ajax_preview/$', post_ajax_preview,\n        name='post_ajax_preview'),\n\n    # Commands\n    re_path('^mark_all_as_read/$', mark_all_as_read, name='mark_all_as_read')\n]\n\nif PYBB_NICE_URL:\n    urlpatterns += [\n        re_path(r'^c/(?P<slug>[\\w-]+)/$', CategoryView.as_view(), name='category'),\n        re_path(r'^c/(?P<category_slug>[\\w-]+)/(?P<slug>[\\w-]+)/$',\n            ForumView.as_view(),\n            name='forum'),\n        re_path(\n            r'^c/(?P<category_slug>[\\w-]+)/(?P<forum_slug>[\\w-]+)/(?P<slug>[\\w-]+)/$',\n            TopicView.as_view(), name='topic'),\n    ]\n"
  },
  {
    "path": "pybb/util.py",
    "content": "\nimport os\nimport warnings\nimport uuid\n\nfrom importlib import import_module\nfrom django.utils.translation import gettext as _\nfrom pybb import compat\n\nfrom pybb.compat import get_username_field, get_user_model\nfrom pybb.defaults import (\n    PYBB_MARKUP, PYBB_MARKUP_ENGINES_PATHS,\n    PYBB_MARKUP_ENGINES, PYBB_QUOTE_ENGINES\n)\nfrom pybb.markup.base import BaseParser\n\n# TODO in the next major release : delete _MARKUP_ENGINES_FORMATTERS and _MARKUP_ENGINES_QUOTERS\n_MARKUP_ENGINES = {}\n_MARKUP_ENGINES_FORMATTERS = {}\n_MARKUP_ENGINES_QUOTERS = {}\n\ndeprecated_func_warning = ('Deprecated function. Please configure correctly the PYBB_MARKUP_ENGINES_PATHS and'\n                           'use get_markup_engine().%(replace)s() instead of %(old)s()(content).'\n                           'In the next major release, this function will be deleted.')\n\n\ndef resolve_class(name):\n    \"\"\" resolves a class function given as string, returning the function \"\"\"\n    if not name:\n        return None\n    modname, funcname = name.rsplit('.', 1)\n    return getattr(import_module(modname), funcname)()\n\n\ndef resolve_function(path):\n    if path:\n        path = path.split('.')\n        to_import = path.pop()\n        module = import_module('.'.join(path))\n        if module:\n            return getattr(module, to_import)\n    return None\n\n\ndef get_markup_engine(name=None):\n    \"\"\"\n    Returns the named markup engine instance, or the default one if name is not given.\n    This function will replace _get_markup_formatter and _get_markup_quoter in the\n    next major release.\n    \"\"\"\n    name = name or PYBB_MARKUP\n    engine = _MARKUP_ENGINES.get(name)\n    if engine:\n        return engine\n    if name not in PYBB_MARKUP_ENGINES_PATHS:\n        engine = BaseParser()\n    else:\n        engine = PYBB_MARKUP_ENGINES[name]\n        # TODO In a near future, we should stop to support callable\n        if isinstance(engine, str):\n            # This is a path, import it\n            engine = resolve_class(engine)\n    _MARKUP_ENGINES[name] = engine\n    return engine\n\n\n# TODO In the next major release, delete this function\ndef _get_markup_formatter(name=None):\n    \"\"\"\n    Returns the named parse engine, or the default parser if name is not given.\n    \"\"\"\n    warnings.warn(deprecated_func_warning % {'replace': 'format', 'old': '_get_markup_formatter'},\n                  DeprecationWarning)\n    name = name or PYBB_MARKUP\n\n    engine = _MARKUP_ENGINES_FORMATTERS.get(name)\n    if engine:\n        return engine\n    if name not in PYBB_MARKUP_ENGINES:\n        engine = BaseParser().format\n    else:\n        engine = PYBB_MARKUP_ENGINES[name]\n        if isinstance(engine, str):\n            # This is a path, import it\n            engine = resolve_class(engine).format\n\n    _MARKUP_ENGINES_FORMATTERS[name] = engine\n    return engine\n\n\n# TODO In the next major release, delete this function\ndef _get_markup_quoter(name=None):\n    \"\"\"\n    Returns the named quote engine, or the default quoter if name is not given.\n    \"\"\"\n    warnings.warn(deprecated_func_warning % {'replace': 'quote', 'old': '_get_markup_quoter'},\n                  DeprecationWarning)\n    name = name or PYBB_MARKUP\n\n    engine = _MARKUP_ENGINES_QUOTERS.get(name)\n    if engine:\n        return engine\n\n    if name not in PYBB_QUOTE_ENGINES:\n        engine = BaseParser().quote\n    else:\n        engine = PYBB_QUOTE_ENGINES[name]\n        if isinstance(engine, str):\n            # This is a path, import it\n            engine = resolve_class(engine).quote\n\n    _MARKUP_ENGINES_QUOTERS[name] = engine\n    return engine\n\n\ndef get_body_cleaner(name):\n    return resolve_function(name) if isinstance(name, str) else name\n\n\ndef unescape(text):\n    \"\"\"\n    Do reverse escaping.\n    \"\"\"\n    escape_map = [('&amp;', '&'), ('&lt;', '<'), ('&gt;', '>'), ('&quot;', '\"'), ('&#39;', '\\'')]\n    for escape_values in escape_map:\n        text = text.replace(*escape_values)\n    return text\n\n\ndef get_pybb_profile(user):\n    from pybb import defaults\n\n    if not user.is_authenticated:\n        if defaults.PYBB_ENABLE_ANONYMOUS_POST:\n            user = get_user_model().objects.get(**{get_username_field(): defaults.PYBB_ANONYMOUS_USERNAME})\n        else:\n            raise ValueError(_('Can\\'t get profile for anonymous user'))\n\n    if defaults.PYBB_PROFILE_RELATED_NAME:\n        return getattr(user, defaults.PYBB_PROFILE_RELATED_NAME)\n    else:\n        return user\n\n\ndef get_pybb_profile_model():\n    from pybb import defaults\n\n    if defaults.PYBB_PROFILE_RELATED_NAME:\n        return compat.get_related_model_class(get_user_model(), defaults.PYBB_PROFILE_RELATED_NAME)\n    else:\n        return get_user_model()\n\n\ndef build_cache_key(key_name, **kwargs):\n    if key_name == 'anonymous_topic_views':\n        return 'pybbm_anonymous_topic_%s_views' % kwargs['topic_id']\n    else:\n        raise ValueError('Wrong key_name parameter passed: %s' % key_name)\n\n\nclass FilePathGenerator(object):\n    \"\"\"\n    Special class for generating random filenames\n    Can be deconstructed for correct migration\n    \"\"\"\n\n    def __init__(self, to, *args, **kwargs):\n        self.to = to\n\n    def deconstruct(self, *args, **kwargs):\n        return 'pybb.util.FilePathGenerator', [], {'to': self.to}\n\n    def __call__(self, instance, filename):\n        \"\"\"\n        This function generate filename with uuid4\n        it's useful if:\n        - you don't want to allow others to see original uploaded filenames\n        - users can upload images with unicode in filenames wich can confuse browsers and filesystem\n        \"\"\"\n        ext = filename.split('.')[-1]\n        filename = \"%s.%s\" % (uuid.uuid4(), ext)\n        return os.path.join(self.to, filename)\n"
  },
  {
    "path": "pybb/views.py",
    "content": "\nimport math\n\nfrom django.contrib.auth.decorators import login_required\nfrom django.core.cache import cache\nfrom django.core.exceptions import PermissionDenied, ValidationError\nfrom django.urls import reverse\nfrom django.contrib import messages\nfrom django.db.models import F\nfrom django.forms.utils import ErrorList\nfrom django.http import HttpResponseRedirect, HttpResponse, Http404, HttpResponseBadRequest,\\\n    HttpResponseForbidden\nfrom django.shortcuts import get_object_or_404, redirect, render\nfrom django.utils.translation import gettext as _\nfrom django.utils.decorators import method_decorator\nfrom django.views.decorators.http import require_POST\nfrom django.views.generic.edit import ModelFormMixin\nfrom django.views.decorators.csrf import csrf_protect\nfrom django.views import generic\nfrom pybb import compat, defaults, util\nfrom pybb.compat import get_atomic_func\nfrom pybb.forms import PostForm, MovePostForm, AdminPostForm, AttachmentFormSet, \\\n    PollAnswerFormSet, PollForm, ForumSubscriptionForm, ModeratorForm\nfrom pybb.models import Category, Forum, ForumSubscription, Topic, Post, TopicReadTracker, \\\n    ForumReadTracker, PollAnswerUser\nfrom pybb.permissions import perms\nfrom pybb.templatetags.pybb_tags import pybb_topic_poll_not_voted\n\n\nUser = compat.get_user_model()\nusername_field = compat.get_username_field()\nPaginator, pure_pagination = compat.get_paginator_class()\n\n\nclass PaginatorMixin(object):\n    def get_paginator(self, queryset, per_page, orphans=0, allow_empty_first_page=True, **kwargs):\n        kwargs = {}\n        if pure_pagination:\n            kwargs['request'] = self.request\n        return Paginator(queryset, per_page, orphans=0, allow_empty_first_page=True, **kwargs)\n\n\nclass RedirectToLoginMixin(object):\n    \"\"\" mixin which redirects to settings.LOGIN_URL if the view encounters an PermissionDenied exception\n        and the user is not authenticated. Views inheriting from this need to implement\n        get_login_redirect_url(), which returns the URL to redirect to after login (parameter \"next\")\n    \"\"\"\n    def dispatch(self, request, *args, **kwargs):\n        try:\n            return super(RedirectToLoginMixin, self).dispatch(request, *args, **kwargs)\n        except PermissionDenied:\n            if not request.user.is_authenticated:\n                from django.contrib.auth.views import redirect_to_login\n                return redirect_to_login(self.get_login_redirect_url())\n            else:\n                return HttpResponseForbidden()\n\n    def get_login_redirect_url(self):\n        \"\"\" get the url to which we redirect after the user logs in. subclasses should override this \"\"\"\n        return '/'\n\n\nclass IndexView(generic.ListView):\n\n    template_name = 'pybb/index.html'\n    context_object_name = 'categories'\n\n    def get_context_data(self, **kwargs):\n        ctx = super(IndexView, self).get_context_data(**kwargs)\n        categories = ctx['categories']\n        for category in categories:\n            category.forums_accessed = perms.filter_forums(self.request.user, category.forums.filter(parent=None))\n        ctx['categories'] = categories\n        return ctx\n\n    def get_queryset(self):\n        return perms.filter_categories(self.request.user, Category.objects.all())\n\n\nclass CategoryView(RedirectToLoginMixin, generic.DetailView):\n\n    template_name = 'pybb/index.html'\n    context_object_name = 'category'\n\n    def get_login_redirect_url(self):\n        # returns super.get_object as there is a conflict with the perms in CategoryView.get_object\n        # Would raise a PermissionDenied and never redirect\n        return super(CategoryView, self).get_object().get_absolute_url()\n\n    def get_queryset(self):\n        return Category.objects.all()\n\n    def get_object(self, queryset=None):\n        obj = super(CategoryView, self).get_object(queryset)\n        if not perms.may_view_category(self.request.user, obj):\n            raise PermissionDenied\n        return obj\n\n    def get_context_data(self, **kwargs):\n        ctx = super(CategoryView, self).get_context_data(**kwargs)\n        ctx['category'].forums_accessed = perms.filter_forums(self.request.user, ctx['category'].forums.filter(parent=None))\n        ctx['categories'] = [ctx['category']]\n        return ctx\n\n    def get(self, *args, **kwargs):\n        if defaults.PYBB_NICE_URL and (('id' in kwargs) or ('pk' in kwargs)):\n            return redirect(super(CategoryView, self).get_object(), permanent=defaults.PYBB_NICE_URL_PERMANENT_REDIRECT)\n        return super(CategoryView, self).get(*args, **kwargs)\n\n\nclass ForumView(RedirectToLoginMixin, PaginatorMixin, generic.ListView):\n\n    paginate_by = defaults.PYBB_FORUM_PAGE_SIZE\n    context_object_name = 'topic_list'\n    template_name = 'pybb/forum.html'\n\n    def dispatch(self, request, *args, **kwargs):\n        self.forum = self.get_forum(**kwargs)\n        return super(ForumView, self).dispatch(request, *args, **kwargs)\n\n    def get_login_redirect_url(self):\n        return self.forum.get_absolute_url()\n\n    def get_context_data(self, **kwargs):\n        ctx = super(ForumView, self).get_context_data(**kwargs)\n        ctx['forum'] = self.forum\n        if self.request.user.is_authenticated:\n            try:\n                ctx['subscription'] = ForumSubscription.objects.get(\n                    user=self.request.user,\n                    forum=self.forum\n                )\n            except ForumSubscription.DoesNotExist:\n                ctx['subscription'] = None\n        else:\n            ctx['subscription'] = None\n        ctx['forum'].forums_accessed = perms.filter_forums(self.request.user, self.forum.child_forums.all())\n        return ctx\n\n    def get_queryset(self):\n        if not perms.may_view_forum(self.request.user, self.forum):\n            raise PermissionDenied\n\n        qs = self.forum.topics.order_by('-sticky', '-updated', '-id').select_related()\n        qs = perms.filter_topics(self.request.user, qs)\n        return qs\n\n    def get_forum(self, **kwargs):\n        if 'pk' in kwargs:\n            forum = get_object_or_404(Forum.objects.all(), pk=kwargs['pk'])\n        elif ('slug' and 'category_slug') in kwargs:\n            forum = get_object_or_404(Forum, slug=kwargs['slug'], category__slug=kwargs['category_slug'])\n        else:\n            raise Http404(_('Forum does not exist'))\n        return forum\n\n    def get(self, *args, **kwargs):\n        if defaults.PYBB_NICE_URL and 'pk' in kwargs:\n            return redirect(self.forum, permanent=defaults.PYBB_NICE_URL_PERMANENT_REDIRECT)\n        return super(ForumView, self).get(*args, **kwargs)\n\n\nclass ForumSubscriptionView(RedirectToLoginMixin, generic.FormView):\n    template_name = 'pybb/forum_subscription.html'\n    form_class = ForumSubscriptionForm\n\n    def get_login_redirect_url(self):\n        return reverse('pybb:forum_subscription', args=(self.kwargs['pk'],))\n\n    def get_success_url(self):\n        return self.forum.get_absolute_url()\n\n    def get_form_kwargs(self):\n        kw = super(ForumSubscriptionView, self).get_form_kwargs()\n        self.get_objects()\n        kw['instance'] = self.forum_subscription\n        kw['user'] = self.request.user\n        kw['forum'] = self.forum\n        return kw\n\n    def get_context_data(self, **kwargs):\n        ctx = super(ForumSubscriptionView, self).get_context_data(**kwargs)\n        ctx['forum'] = self.forum\n        ctx['forum_subscription'] = self.forum_subscription\n        return ctx\n\n    def form_valid(self, form):\n        result = form.process()\n        if result == 'subscribe-all':\n            msg = _((\n                'You subscribed to all existant topics on this forum '\n                'and you will auto-subscribed to all its new topics.'\n            ))\n        elif result == 'delete':\n            msg = _((\n                'You won\\'t be notified anymore each time a new topic '\n                'is posted on this forum.'\n            ))\n        elif result == 'delete-all':\n            msg = _((\n                'You have been subscribed to all current topics in this forum and you won\\'t'\n                'be auto-subscribed anymore for each new topic posted on this forum.'\n            ))\n        else:\n            msg = _((\n                'You will be notified each time a new topic is posted on this forum.'\n            ))\n        messages.success(self.request, msg, fail_silently=True)\n        return super(ForumSubscriptionView, self).form_valid(form)\n\n    def get_objects(self):\n        if not self.request.user.is_authenticated:\n            raise PermissionDenied\n        self.forum = get_object_or_404(Forum.objects.all(), pk=self.kwargs['pk'])\n        try:\n            self.forum_subscription = ForumSubscription.objects.get(\n                user=self.request.user,\n                forum=self.forum\n            )\n        except ForumSubscription.DoesNotExist:\n            self.forum_subscription = None\n\nclass LatestTopicsView(PaginatorMixin, generic.ListView):\n\n    paginate_by = defaults.PYBB_FORUM_PAGE_SIZE\n    context_object_name = 'topic_list'\n    template_name = 'pybb/latest_topics.html'\n\n    def get_queryset(self):\n        qs = Topic.objects.all().select_related()\n        qs = perms.filter_topics(self.request.user, qs)\n        return qs.order_by('-updated', '-id')\n\n\nclass PybbFormsMixin(object):\n\n    post_form_class = PostForm\n    admin_post_form_class = AdminPostForm\n    attachment_formset_class = AttachmentFormSet\n    poll_form_class = PollForm\n    poll_answer_formset_class = PollAnswerFormSet\n\n    def get_post_form_class(self):\n        return self.post_form_class\n\n    def get_admin_post_form_class(self):\n        return self.admin_post_form_class\n\n    def get_attachment_formset_class(self):\n        return self.attachment_formset_class\n\n    def get_poll_form_class(self):\n        return self.poll_form_class\n\n    def get_poll_answer_formset_class(self):\n        return self.poll_answer_formset_class\n\n\nclass TopicView(RedirectToLoginMixin, PaginatorMixin, PybbFormsMixin, generic.ListView):\n    paginate_by = defaults.PYBB_TOPIC_PAGE_SIZE\n    template_object_name = 'post_list'\n    template_name = 'pybb/topic.html'\n\n    def get(self, request, *args, **kwargs):\n        if defaults.PYBB_NICE_URL and 'pk' in kwargs:\n            return redirect(self.topic, permanent=defaults.PYBB_NICE_URL_PERMANENT_REDIRECT)\n        response = super(TopicView, self).get(request, *args, **kwargs)\n        self.mark_read()\n        return response\n\n    def get_login_redirect_url(self):\n        return self.topic.get_absolute_url()\n\n    @method_decorator(csrf_protect)\n    def dispatch(self, request, *args, **kwargs):\n        self.topic = self.get_topic(**kwargs)\n\n        if request.GET.get('first-unread'):\n            if request.user.is_authenticated:\n                read_dates = []\n                try:\n                    read_dates.append(TopicReadTracker.objects.get(user=request.user, topic=self.topic).time_stamp)\n                except TopicReadTracker.DoesNotExist:\n                    pass\n                try:\n                    read_dates.append(ForumReadTracker.objects.get(user=request.user, forum=self.topic.forum).time_stamp)\n                except ForumReadTracker.DoesNotExist:\n                    pass\n\n                read_date = read_dates and max(read_dates)\n                if read_date:\n                    try:\n                        first_unread_topic = self.topic.posts.filter(created__gt=read_date).order_by('created', 'id')[0]\n                    except IndexError:\n                        first_unread_topic = self.topic.last_post\n                else:\n                    first_unread_topic = self.topic.head\n                return HttpResponseRedirect(reverse('pybb:post', kwargs={'pk': first_unread_topic.id}))\n\n        return super(TopicView, self).dispatch(request, *args, **kwargs)\n\n    def get_queryset(self):\n        if not perms.may_view_topic(self.request.user, self.topic):\n            raise PermissionDenied\n        if self.request.user.is_authenticated or not defaults.PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER:\n            Topic.objects.filter(id=self.topic.id).update(views=F('views') + 1)\n        else:\n            cache_key = util.build_cache_key('anonymous_topic_views', topic_id=self.topic.id)\n            cache.add(cache_key, 0)\n            if cache.incr(cache_key) % defaults.PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER == 0:\n                Topic.objects.filter(id=self.topic.id).update(views=F('views') +\n                                                                defaults.PYBB_ANONYMOUS_VIEWS_CACHE_BUFFER)\n                cache.set(cache_key, 0)\n        qs = self.topic.posts.all().select_related('user')\n        if defaults.PYBB_PROFILE_RELATED_NAME:\n            qs = qs.select_related('user__%s' % defaults.PYBB_PROFILE_RELATED_NAME)\n        if not perms.may_moderate_topic(self.request.user, self.topic):\n            qs = perms.filter_posts(self.request.user, qs)\n        return qs\n\n    def get_context_data(self, **kwargs):\n        ctx = super(TopicView, self).get_context_data(**kwargs)\n\n        if self.request.user.is_authenticated:\n            self.request.user.is_moderator = perms.may_moderate_topic(self.request.user, self.topic)\n            self.request.user.is_subscribed = self.request.user in self.topic.subscribers.all()\n            if defaults.PYBB_ENABLE_ADMIN_POST_FORM and \\\n                    perms.may_post_as_admin(self.request.user):\n                ctx['form'] = self.get_admin_post_form_class()(\n                    initial={'login': getattr(self.request.user, username_field)},\n                    topic=self.topic)\n            else:\n                ctx['form'] = self.get_post_form_class()(topic=self.topic)\n        elif defaults.PYBB_ENABLE_ANONYMOUS_POST:\n            ctx['form'] = self.get_post_form_class()(topic=self.topic)\n        else:\n            ctx['form'] = None\n            ctx['next'] = self.get_login_redirect_url()\n        if perms.may_attach_files(self.request.user):\n            aformset = self.get_attachment_formset_class()()\n            ctx['aformset'] = aformset\n            ctx['attachment_max_size'] = defaults.PYBB_ATTACHMENT_SIZE_LIMIT\n        if defaults.PYBB_FREEZE_FIRST_POST:\n            ctx['first_post'] = self.topic.head\n        else:\n            ctx['first_post'] = None\n        ctx['topic'] = self.topic\n\n        if perms.may_vote_in_topic(self.request.user, self.topic) and \\\n                pybb_topic_poll_not_voted(self.topic, self.request.user):\n            ctx['poll_form'] = self.get_poll_form_class()(self.topic)\n\n        return ctx\n\n    @method_decorator(get_atomic_func())\n    def mark_read(self):\n        if not self.request.user.is_authenticated:\n            return\n        try:\n            forum_mark = ForumReadTracker.objects.get(forum=self.topic.forum, user=self.request.user)\n        except ForumReadTracker.DoesNotExist:\n            forum_mark = None\n        if (forum_mark is None) or (forum_mark.time_stamp <= self.topic.updated):\n            topic_mark, topic_mark_new = TopicReadTracker.objects.get_or_create_tracker(topic=self.topic, user=self.request.user)\n            if not topic_mark_new:\n                # Bail early if we already read this thread.\n                if topic_mark.time_stamp >= self.topic.updated:\n                    return\n                topic_mark.save()  # update read time\n\n            # Check, if there are any unread topics in forum\n            readed_trackers = TopicReadTracker.objects.filter(\n                user=self.request.user, topic__forum=self.topic.forum, time_stamp__gte=F('topic__updated'))\n            unread = self.topic.forum.topics.exclude(topicreadtracker__in=readed_trackers)\n            if forum_mark is not None:\n                unread = unread.filter(updated__gte=forum_mark.time_stamp)\n\n            if not unread.exists():\n                # Clear all topic marks for this forum, mark forum as read\n                TopicReadTracker.objects.filter(user=self.request.user, topic__forum=self.topic.forum).delete()\n                forum_mark, forum_mark_new = ForumReadTracker.objects.get_or_create_tracker(\n                    forum=self.topic.forum, user=self.request.user)\n                if not forum_mark_new:\n                    forum_mark.save()  # update read time\n\n    def get_topic(self, **kwargs):\n        if 'pk' in kwargs:\n            topic = get_object_or_404(Topic, pk=kwargs['pk'], post_count__gt=0)\n        elif ('slug'and 'forum_slug'and 'category_slug') in kwargs:\n            topic = get_object_or_404(\n                Topic,\n                slug=kwargs['slug'],\n                forum__slug=kwargs['forum_slug'],\n                forum__category__slug=kwargs['category_slug'],\n                post_count__gt=0\n                )\n        else:\n            raise Http404(_('This topic does not exists'))\n        return topic\n\n\nclass PostEditMixin(PybbFormsMixin):\n\n    @method_decorator(get_atomic_func())\n    def post(self, request, *args, **kwargs):\n        return super(PostEditMixin, self).post(request, *args, **kwargs)\n\n    def get_form_class(self):\n        if defaults.PYBB_ENABLE_ADMIN_POST_FORM and \\\n                perms.may_post_as_admin(self.request.user):\n            return self.get_admin_post_form_class()\n        else:\n            return self.get_post_form_class()\n\n    def get_context_data(self, **kwargs):\n\n        ctx = super(PostEditMixin, self).get_context_data(**kwargs)\n\n        if perms.may_attach_files(self.request.user) and 'aformset' not in kwargs:\n            ctx['aformset'] = self.get_attachment_formset_class()(\n                instance=getattr(self, 'object', None)\n            )\n\n        if perms.may_create_poll(self.request.user) and 'pollformset' not in kwargs:\n            ctx['pollformset'] = self.get_poll_answer_formset_class()(\n                instance=self.object.topic if getattr(self, 'object', None) else None\n            )\n\n        return ctx\n\n    def form_valid(self, form):\n        success = True\n        save_attachments = False\n        save_poll_answers = False\n        self.object, topic = form.save(commit=False)\n\n        if perms.may_attach_files(self.request.user):\n            aformset = self.get_attachment_formset_class()(\n                self.request.POST, self.request.FILES, instance=self.object\n            )\n            if aformset.is_valid():\n                save_attachments = True\n            else:\n                success = False\n        else:\n            aformset = None\n\n        if perms.may_create_poll(self.request.user):\n            pollformset = self.get_poll_answer_formset_class()()\n            if getattr(self, 'forum', None) or topic.head == self.object:\n                if topic.poll_type != Topic.POLL_TYPE_NONE:\n                    pollformset = self.get_poll_answer_formset_class()(\n                        self.request.POST, instance=topic\n                    )\n                    if pollformset.is_valid():\n                        save_poll_answers = True\n                    else:\n                        success = False\n                else:\n                    topic.poll_question = None\n                    if topic.pk:\n                        topic.poll_answers.all().delete()\n        else:\n            pollformset = None\n\n        if success:\n            try:\n                topic.save()\n            except ValidationError as e:\n                success = False\n                errors = form._errors.setdefault('name', ErrorList())\n                errors += e.error_list\n            else:\n                self.object.topic = topic\n                self.object.save()\n                if save_attachments:\n                    aformset.save()\n                    if self.object.attachments.count():\n                        # re-parse the body to replace attachment's references by URLs\n                        self.object.save()\n                if save_poll_answers:\n                    pollformset.save()\n                return HttpResponseRedirect(self.get_success_url())\n        return self.render_to_response(self.get_context_data(form=form,\n                                                             aformset=aformset,\n                                                             pollformset=pollformset))\n\n\nclass AddPostView(PostEditMixin, generic.CreateView):\n\n    template_name = 'pybb/add_post.html'\n\n    @method_decorator(csrf_protect)\n    def dispatch(self, request, *args, **kwargs):\n        if request.user.is_authenticated:\n            self.user = request.user\n        else:\n            if defaults.PYBB_ENABLE_ANONYMOUS_POST:\n                self.user, new = User.objects.get_or_create(**{username_field: defaults.PYBB_ANONYMOUS_USERNAME})\n            else:\n                from django.contrib.auth.views import redirect_to_login\n                return redirect_to_login(request.get_full_path())\n\n        self.forum = None\n        self.topic = None\n        if 'forum_id' in kwargs:\n            self.forum = get_object_or_404(perms.filter_forums(request.user, Forum.objects.all()), pk=kwargs['forum_id'])\n            if not perms.may_create_topic(self.user, self.forum):\n                raise PermissionDenied\n        elif 'topic_id' in kwargs:\n            self.topic = get_object_or_404(perms.filter_topics(request.user, Topic.objects.all()), pk=kwargs['topic_id'])\n            if not perms.may_create_post(self.user, self.topic):\n                raise PermissionDenied\n\n            self.quote = ''\n            if 'quote_id' in request.GET:\n                try:\n                    quote_id = int(request.GET.get('quote_id'))\n                except TypeError:\n                    raise Http404\n                else:\n                    post = get_object_or_404(Post, pk=quote_id)\n                    if not perms.may_view_post(request.user, post):\n                        raise PermissionDenied\n                    profile = util.get_pybb_profile(post.user)\n                    self.quote = util._get_markup_quoter(defaults.PYBB_MARKUP)(post.body, profile.get_display_name())\n\n                if self.quote and request.headers.get('x-requested-with') == 'XMLHttpRequest':\n                    return HttpResponse(self.quote)\n        return super(AddPostView, self).dispatch(request, *args, **kwargs)\n\n    def get_form_kwargs(self):\n        ip = self.request.META.get('REMOTE_ADDR', '')\n        form_kwargs = super(AddPostView, self).get_form_kwargs()\n        form_kwargs.update(dict(topic=self.topic, forum=self.forum, user=self.user,\n                           ip=ip, initial={}))\n        if getattr(self, 'quote', None):\n            form_kwargs['initial']['body'] = self.quote\n        if defaults.PYBB_ENABLE_ADMIN_POST_FORM and \\\n                perms.may_post_as_admin(self.user):\n            form_kwargs['initial']['login'] = getattr(self.user, username_field)\n        form_kwargs['may_create_poll'] = perms.may_create_poll(self.user)\n        form_kwargs['may_edit_topic_slug'] = perms.may_edit_topic_slug(self.user)\n        return form_kwargs\n\n    def get_context_data(self, **kwargs):\n        ctx = super(AddPostView, self).get_context_data(**kwargs)\n        ctx['forum'] = self.forum\n        ctx['topic'] = self.topic\n        return ctx\n\n    def get_success_url(self):\n        if (not self.request.user.is_authenticated) and defaults.PYBB_PREMODERATION:\n            return reverse('pybb:index')\n        return self.object.get_absolute_url()\n\n\nclass EditPostView(PostEditMixin, generic.UpdateView):\n\n    model = Post\n\n    context_object_name = 'post'\n    template_name = 'pybb/edit_post.html'\n\n    @method_decorator(login_required)\n    @method_decorator(csrf_protect)\n    def dispatch(self, request, *args, **kwargs):\n        return super(EditPostView, self).dispatch(request, *args, **kwargs)\n\n    def get_form_kwargs(self):\n        form_kwargs = super(EditPostView, self).get_form_kwargs()\n        form_kwargs['may_create_poll'] = perms.may_create_poll(self.request.user)\n        return form_kwargs\n\n    def get_object(self, queryset=None):\n        post = super(EditPostView, self).get_object(queryset)\n        if not perms.may_edit_post(self.request.user, post):\n            raise PermissionDenied\n        return post\n\n\nclass MovePostView(RedirectToLoginMixin, generic.UpdateView):\n\n    model = Post\n    form_class = MovePostForm\n    context_object_name = 'post'\n    template_name = 'pybb/move_post.html'\n\n    @method_decorator(login_required)\n    @method_decorator(csrf_protect)\n    def dispatch(self, request, *args, **kwargs):\n        return super(MovePostView, self).dispatch(request, *args, **kwargs)\n\n    def get_form_kwargs(self):\n        form_kwargs = super(MovePostView, self).get_form_kwargs()\n        form_kwargs['user'] = self.request.user\n        return form_kwargs\n\n    def get_object(self, queryset=None):\n        post = super(MovePostView, self).get_object(queryset)\n        if not perms.may_moderate_topic(self.request.user, post.topic):\n            raise PermissionDenied\n        return post\n\n    def form_valid(self, *args, **kwargs):\n        from django.db.models.signals import post_save\n        from pybb.signals import topic_saved\n        # FIXME: we should have specific signals to send notifications to topic/forum subscribers\n        # but for now, we must connect / disconnect the callback\n        post_save.disconnect(topic_saved, sender=Topic)\n        response = super(MovePostView, self).form_valid(*args, **kwargs)\n        post_save.connect(topic_saved, sender=Topic)\n        return response\n\n    def get_success_url(self):\n        return self.object.topic.get_absolute_url()\n\n\nclass UserView(generic.DetailView):\n    model = User\n    template_name = 'pybb/user.html'\n    context_object_name = 'target_user'\n\n    def get_object(self, queryset=None):\n        if queryset is None:\n            queryset = self.get_queryset()\n        return get_object_or_404(queryset, **{username_field: self.kwargs['username']})\n\n    def get_context_data(self, **kwargs):\n        ctx = super(UserView, self).get_context_data(**kwargs)\n        ctx['topic_count'] = Topic.objects.filter(user=ctx['target_user']).count()\n        return ctx\n\n\nclass UserPosts(PaginatorMixin, generic.ListView):\n    model = Post\n    paginate_by = defaults.PYBB_TOPIC_PAGE_SIZE\n    template_name = 'pybb/user_posts.html'\n\n    def dispatch(self, request, *args, **kwargs):\n        username = kwargs.pop('username')\n        self.user = get_object_or_404(**{'klass': User, username_field: username})\n        return super(UserPosts, self).dispatch(request, *args, **kwargs)\n\n    def get_queryset(self):\n        qs = super(UserPosts, self).get_queryset()\n        qs = qs.filter(user=self.user)\n        qs = perms.filter_posts(self.request.user, qs).select_related('topic')\n        qs = qs.order_by('-created', '-updated', '-id')\n        return qs\n\n    def get_context_data(self, **kwargs):\n        context = super(UserPosts, self).get_context_data(**kwargs)\n        context['target_user'] = self.user\n        return context\n\n\nclass UserTopics(PaginatorMixin, generic.ListView):\n    model = Topic\n    paginate_by = defaults.PYBB_FORUM_PAGE_SIZE\n    template_name = 'pybb/user_topics.html'\n\n    def dispatch(self, request, *args, **kwargs):\n        username = kwargs.pop('username')\n        self.user = get_object_or_404(**{'klass': User, username_field: username})\n        return super(UserTopics, self).dispatch(request, *args, **kwargs)\n\n    def get_queryset(self):\n        qs = super(UserTopics, self).get_queryset()\n        qs = qs.filter(user=self.user)\n        qs = perms.filter_topics(self.request.user, qs)\n        qs = qs.order_by('-updated', '-created', '-id')\n        return qs\n\n    def get_context_data(self, **kwargs):\n        context = super(UserTopics, self).get_context_data(**kwargs)\n        context['target_user'] = self.user\n        return context\n\n\nclass PostView(RedirectToLoginMixin, generic.RedirectView):\n\n    permanent = False\n\n    def dispatch(self, request, *args, **kwargs):\n        self.post = self.get_post(**kwargs)\n        return super(PostView, self).dispatch(request, *args, **kwargs)\n\n    def get_login_redirect_url(self):\n        return self.post.get_absolute_url()\n\n    def get_redirect_url(self, **kwargs):\n        if not perms.may_view_post(self.request.user, self.post):\n            raise PermissionDenied\n        count = self.post.topic.posts.filter(created__lt=self.post.created).count() + 1\n        page = math.ceil(count / float(defaults.PYBB_TOPIC_PAGE_SIZE))\n        return '%s?page=%d#post-%d' % (self.post.topic.get_absolute_url(), page, self.post.id)\n\n    def get_post(self, **kwargs):\n        return get_object_or_404(Post, pk=kwargs['pk'])\n\n\nclass ModeratePost(generic.RedirectView):\n\n    permanent = False\n\n    def get_redirect_url(self, **kwargs):\n        post = get_object_or_404(Post, pk=self.kwargs['pk'])\n        if not perms.may_moderate_topic(self.request.user, post.topic):\n            raise PermissionDenied\n        post.on_moderation = False\n        post.save()\n        return post.get_absolute_url()\n\n\nclass ProfileEditView(generic.UpdateView):\n\n    template_name = 'pybb/edit_profile.html'\n\n    def get_object(self, queryset=None):\n        return util.get_pybb_profile(self.request.user)\n\n    def get_form_class(self):\n        if not self.form_class:\n            from pybb.forms import EditProfileForm\n            return EditProfileForm\n        else:\n            return super(ProfileEditView, self).get_form_class()\n\n    @method_decorator(login_required)\n    @method_decorator(csrf_protect)\n    def dispatch(self, request, *args, **kwargs):\n        return super(ProfileEditView, self).dispatch(request, *args, **kwargs)\n\n    def get_success_url(self):\n        return reverse('pybb:edit_profile')\n\n\nclass DeletePostView(generic.DeleteView):\n\n    template_name = 'pybb/delete_post.html'\n    context_object_name = 'post'\n\n    def get_object(self, queryset=None):\n        post = get_object_or_404(Post.objects.select_related('topic', 'topic__forum'), pk=self.kwargs['pk'])\n        if not perms.may_delete_post(self.request.user, post):\n            raise PermissionDenied\n        self.topic = post.topic\n        self.forum = post.topic.forum\n        return post\n\n    def form_valid(self, form):\n        \"\"\"\n        get_success_url must be called after deletion\n        \"\"\"\n        self.object.delete()\n        redirect_url = self.get_success_url()\n        if not self.request.headers.get('x-requested-with') == 'XMLHttpRequest':\n            return HttpResponseRedirect(redirect_url)\n        else:\n            return HttpResponse(redirect_url)\n\n    def get_success_url(self):\n        try:\n            Topic.objects.get(pk=self.topic.id)\n        except Topic.DoesNotExist:\n            return self.forum.get_absolute_url()\n        else:\n            if not self.request.headers.get('x-requested-with') == 'XMLHttpRequest':\n                return self.topic.get_absolute_url()\n            else:\n                return \"\"\n\n\nclass TopicActionBaseView(generic.View):\n\n    def get_topic(self):\n        return get_object_or_404(Topic, pk=self.kwargs['pk'])\n\n    @method_decorator(login_required)\n    def get(self, *args, **kwargs):\n        self.topic = self.get_topic()\n        self.action(self.topic)\n        return HttpResponseRedirect(self.topic.get_absolute_url())\n\n\nclass StickTopicView(TopicActionBaseView):\n\n    def action(self, topic):\n        if not perms.may_stick_topic(self.request.user, topic):\n            raise PermissionDenied\n        topic.sticky = True\n        topic.save()\n\n\nclass UnstickTopicView(TopicActionBaseView):\n\n    def action(self, topic):\n        if not perms.may_unstick_topic(self.request.user, topic):\n            raise PermissionDenied\n        topic.sticky = False\n        topic.save()\n\n\nclass CloseTopicView(TopicActionBaseView):\n\n    def action(self, topic):\n        if not perms.may_close_topic(self.request.user, topic):\n            raise PermissionDenied\n        topic.closed = True\n        topic.save()\n\n\nclass OpenTopicView(TopicActionBaseView):\n    def action(self, topic):\n        if not perms.may_open_topic(self.request.user, topic):\n            raise PermissionDenied\n        topic.closed = False\n        topic.save()\n\n\nclass TopicPollVoteView(PybbFormsMixin, generic.UpdateView):\n    model = Topic\n    http_method_names = ['post', ]\n\n    @method_decorator(login_required)\n    def dispatch(self, request, *args, **kwargs):\n        return super(TopicPollVoteView, self).dispatch(request, *args, **kwargs)\n\n    def get_form_class(self):\n        return self.get_poll_form_class()\n\n    def get_form_kwargs(self):\n        kwargs = super(ModelFormMixin, self).get_form_kwargs()\n        kwargs['topic'] = self.object\n        return kwargs\n\n    def form_valid(self, form):\n        # already voted\n        if not perms.may_vote_in_topic(self.request.user, self.object) or \\\n           not pybb_topic_poll_not_voted(self.object, self.request.user):\n            return HttpResponseForbidden()\n\n        answers = form.cleaned_data['answers']\n        for answer in answers:\n            # poll answer from another topic\n            if answer.topic != self.object:\n                return HttpResponseBadRequest()\n\n            PollAnswerUser.objects.create(poll_answer=answer, user=self.request.user)\n        return super(ModelFormMixin, self).form_valid(form)\n\n    def form_invalid(self, form):\n        return redirect(self.object)\n\n    def get_success_url(self):\n        return self.object.get_absolute_url()\n\n\n@login_required\ndef topic_cancel_poll_vote(request, pk):\n    topic = get_object_or_404(Topic, pk=pk)\n    PollAnswerUser.objects.filter(user=request.user, poll_answer__topic_id=topic.id).delete()\n    return HttpResponseRedirect(topic.get_absolute_url())\n\n\n@login_required\ndef delete_subscription(request, topic_id):\n    topic = get_object_or_404(perms.filter_topics(request.user, Topic.objects.all()), pk=topic_id)\n    topic.subscribers.remove(request.user)\n    msg = _('Subscription removed. You will not receive emails from this topic unless you subscribe or post again.')\n    messages.success(request, msg, fail_silently=True)\n    return HttpResponseRedirect(topic.get_absolute_url())\n\n\n@login_required\ndef add_subscription(request, topic_id):\n    topic = get_object_or_404(perms.filter_topics(request.user, Topic.objects.all()), pk=topic_id)\n    if not perms.may_subscribe_topic(request.user, topic):\n        raise PermissionDenied\n    topic.subscribers.add(request.user)\n    msg = _('Subscription added. You will receive email notifications for replies to this topic.')\n    messages.success(request, msg, fail_silently=True)\n    return HttpResponseRedirect(topic.get_absolute_url())\n\n\n@login_required\ndef post_ajax_preview(request):\n    content = request.POST.get('data')\n    html = util._get_markup_formatter()(content)\n    return render(request, 'pybb/_markitup_preview.html', {'html': html})\n\n\n@login_required\ndef mark_all_as_read(request):\n    for forum in perms.filter_forums(request.user, Forum.objects.all()):\n        forum_mark, new = ForumReadTracker.objects.get_or_create_tracker(forum=forum, user=request.user)\n        forum_mark.save()\n    TopicReadTracker.objects.filter(user=request.user).delete()\n    msg = _('All forums marked as read')\n    messages.success(request, msg, fail_silently=True)\n    return redirect(reverse('pybb:index'))\n\n\n@login_required\n@require_POST\ndef block_user(request, username):\n    user = get_object_or_404(User, **{username_field: username})\n    if not perms.may_block_user(request.user, user):\n        raise PermissionDenied\n    user.is_active = False\n    user.save()\n    if 'block_and_delete_messages' in request.POST:\n        # individually delete each post and empty topic to fire method\n        # with forum/topic counters recalculation\n        posts = Post.objects.filter(user=user)\n        topics = posts.values('topic_id').distinct()\n        forums = posts.values('topic__forum_id').distinct()\n        posts.delete()\n        Topic.objects.filter(user=user).delete()\n        for t in topics:\n            try:\n                Topic.objects.get(id=t['topic_id']).update_counters()\n            except Topic.DoesNotExist:\n                pass\n        for f in forums:\n            try:\n                Forum.objects.get(id=f['topic__forum_id']).update_counters()\n            except Forum.DoesNotExist:\n                pass\n    msg = _('User successfuly blocked')\n    messages.success(request, msg, fail_silently=True)\n    return redirect('pybb:index')\n\n\n@login_required\n@require_POST\ndef unblock_user(request, username):\n    user = get_object_or_404(User, **{username_field: username})\n    if not perms.may_block_user(request.user, user):\n        raise PermissionDenied\n    user.is_active = True\n    user.save()\n    msg = _('User successfuly unblocked')\n    messages.success(request, msg, fail_silently=True)\n    return redirect('pybb:index')\n\n\nclass UserEditPrivilegesView(generic.edit.FormMixin, generic.edit.ProcessFormView, generic.DetailView):\n\n    template_name = 'pybb/edit_privileges.html'\n    form_class = ModeratorForm\n    model = User\n    slug_field = 'username'\n    slug_url_kwarg = 'username'\n\n    def get_success_url(self):\n        return reverse('pybb:edit_privileges', kwargs={'username': self.object.username})\n\n    def get_initial(self):\n        initial = super(UserEditPrivilegesView, self).get_initial()\n        categories = Category.objects.all()\n        for category in categories:\n            initial['cat_%d' % category.pk] = category.forums.filter(moderators=self.object.pk)\n        return initial\n\n    def get_form_kwargs(self):\n        form_kwargs = super(UserEditPrivilegesView, self).get_form_kwargs()\n        form_kwargs['user'] = self.request.user\n        return form_kwargs\n\n    def get(self, request, *args, **kwargs):\n        self.object = self.get_object()\n        return super(UserEditPrivilegesView, self).get(request, *args, **kwargs)\n\n    def post(self, request, *args, **kwargs):\n        self.object = self.get_object()\n        return super(UserEditPrivilegesView, self).post(request, *args, **kwargs)\n\n    def form_valid(self, form):\n        form.process(self.object)\n        messages.success(self.request, _(\"Privileges updated\"))\n        return super(UserEditPrivilegesView, self).form_valid(form)\n"
  },
  {
    "path": "runtests.py",
    "content": "#!/usr/bin/env python\nimport django\nimport sys\nimport os\nfrom optparse import OptionParser\n\nproject_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test/test_project')\nsys.path.insert(0, project_dir)\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_project.settings')\n\nfrom django.test.runner import DiscoverRunner as Runner\n\n\ndef runtests(*test_args, **kwargs):\n    django.setup()\n\n    if not test_args:\n        test_args = ['pybb']\n\n    test_runner = Runner(verbosity=kwargs.get('verbosity', 1), interactive=kwargs.get('interactive', False),\n                         failfast=kwargs.get('failfast'))\n    failures = test_runner.run_tests(test_args)\n    sys.exit(failures)\n\nif __name__ == '__main__':\n    parser = OptionParser()\n    parser.add_option('--failfast', action='store_true', default=False, dest='failfast')\n\n    (options, args) = parser.parse_args()\n\n    runtests(failfast=options.failfast, *args)\n"
  },
  {
    "path": "setup.py",
    "content": "from setuptools import setup, find_packages\n\nsetup(\n    name='pybbm',\n    version='0.19.0',\n    description='PyBB Modified. Django forum application',\n    long_description=open('README.rst').read(),\n    author='Pavel Zhukov',\n    author_email='gelios@gmail.com',\n    url='http://www.pybbm.org/',\n    packages=find_packages(),\n    include_package_data=True,\n    package_data={'': ['pybb/templates', 'pybb/static']},\n    zip_safe=False,\n    install_requires=[\n        'django-annoying',\n        'unidecode',\n    ],\n    test_suite='runtests.runtests',\n    license=\"BSD\",\n    keywords=\"django application forum board\",\n    classifiers=[\n        'Development Status :: 4 - Beta',\n        'Environment :: Web Environment',\n        'Framework :: Django',\n        'Intended Audience :: Developers',\n        'License :: OSI Approved :: BSD License',\n        'Operating System :: OS Independent',\n        'Programming Language :: Python',\n        'Programming Language :: Python :: 2',\n        'Programming Language :: Python :: 2.7',\n        'Programming Language :: Python :: 3',\n        'Programming Language :: Python :: 3.4',\n        'Programming Language :: Python :: 3.5',\n        'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Message Boards',\n        'Topic :: Software Development :: Libraries :: Python Modules',\n    ],\n)\n"
  },
  {
    "path": "test/example_bootstrap/example_bootstrap/__init__.py",
    "content": ""
  },
  {
    "path": "test/example_bootstrap/example_bootstrap/settings.py",
    "content": "# Django settings for example_bootstrap project.\nimport os\n\nBASE_DIR = os.path.dirname(os.path.dirname(__file__))\n\nDEBUG = True\n\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.sqlite3',\n        'NAME': os.path.join(BASE_DIR, 'testdb.sqlite'),\n    }\n}\n\nLANGUAGE_CODE = 'en-us'\nSITE_ID = 1\n\nROOT_URLCONF = 'example_bootstrap.urls'\n\nMEDIA_ROOT = os.path.join(BASE_DIR, 'media')\nMEDIA_URL = '/media/'\n\nSTATIC_ROOT = os.path.join(BASE_DIR, 'static_collected')\nSTATIC_URL = '/static/'\n\nSTATICFILES_DIRS = (\n    os.path.join(BASE_DIR, 'static'),\n)\n\nLOGIN_REDIRECT_URL = '/profile/edit/'\n\nSTATICFILES_FINDERS = (\n    'django.contrib.staticfiles.finders.FileSystemFinder',\n    'django.contrib.staticfiles.finders.AppDirectoriesFinder',\n)\n\nSECRET_KEY = 'qd@j3*it@3j2cgc#7t@m)^r1bnc53uam7o6u_+x$f5w3$b@3ix'\n\nTEMPLATES = [\n    {\n        'BACKEND': 'django.template.backends.django.DjangoTemplates',\n        'APP_DIRS': True,\n        'DIRS': [\n            os.path.join(BASE_DIR, 'templates'),\n        ],\n        'OPTIONS': {\n            'context_processors': [\n                'django.template.context_processors.debug',\n                'django.template.context_processors.request',\n                'django.contrib.auth.context_processors.auth',\n                # 'django.contrib.messages.context_processors.messages',\n                'django.template.context_processors.i18n',\n                'django.template.context_processors.media',\n                'django.template.context_processors.static',\n                'django.template.context_processors.tz',\n                'pybb.context_processors.processor',\n            ],\n        },\n    },\n]\n\nMIDDLEWARE = (\n    'django.middleware.common.CommonMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'pybb.middleware.PybbMiddleware',\n)\n\nINSTALLED_APPS = (\n    'django.contrib.auth',\n    'django.contrib.contenttypes',\n    'django.contrib.sessions',\n    'django.contrib.sites',\n    'django.contrib.messages',\n    'django.contrib.staticfiles',\n    'django.contrib.admin',\n    'pybb',\n    'registration'\n)\n\nAUTH_PROFILE_MODULE = 'pybb.Profile'\n\n\nLOGGING = {\n    'version': 1,\n    'disable_existing_loggers': False,\n    'handlers': {\n        'mail_admins': {\n            'level': 'ERROR',\n            'class': 'django.utils.log.AdminEmailHandler'\n        }\n    },\n    'loggers': {\n        'django.request': {\n            'handlers': ['mail_admins'],\n            'level': 'ERROR',\n            'propagate': True,\n        },\n    }\n}\n\nPYBB_NICE_URL = True\nPYBB_ATTACHMENT_ENABLE = False\n"
  },
  {
    "path": "test/example_bootstrap/example_bootstrap/urls.py",
    "content": "\nimport django\nfrom django.urls import include, re_path\nfrom django.contrib import admin\n\nurlpatterns = [\n    re_path(r'^admin/', include(admin.site.urls) if django.VERSION < (1, 10) else admin.site.urls),\n    re_path(r'^accounts/', include('registration.urls')),\n    re_path(r'^', include('pybb.urls', namespace='pybb')),\n]\n"
  },
  {
    "path": "test/example_bootstrap/example_bootstrap/wsgi.py",
    "content": "import os\nos.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"example_bootstrap.settings\")\n\nfrom django.core.wsgi import get_wsgi_application\napplication = get_wsgi_application()\n\n"
  },
  {
    "path": "test/example_bootstrap/fixtures/demo_data.json",
    "content": "[\n{\n    \"pk\": 1, \n    \"model\": \"auth.user\", \n    \"fields\": {\n        \"username\": \"admin\", \n        \"first_name\": \"\", \n        \"last_name\": \"\", \n        \"is_active\": true, \n        \"is_superuser\": true, \n        \"is_staff\": true, \n        \"last_login\": \"2015-03-19T11:47:07.845\", \n        \"groups\": [], \n        \"user_permissions\": [], \n        \"password\": \"pbkdf2_sha256$12000$mAX71kipleh7$N55muCKCkHRizmeh0wyHM4W6SJfTy+q+fqS+EWaKVck=\", \n        \"email\": \"\", \n        \"date_joined\": \"2015-03-19T10:42:11.090\"\n    }\n},\n{\n    \"pk\": 2, \n    \"model\": \"auth.user\", \n    \"fields\": {\n        \"username\": \"moderator\", \n        \"first_name\": \"Moderator\", \n        \"last_name\": \"Demo\", \n        \"is_active\": true, \n        \"is_superuser\": false, \n        \"is_staff\": false, \n        \"last_login\": \"2015-03-19T11:33:07.293\", \n        \"groups\": [], \n        \"user_permissions\": [\n            34, \n            31\n        ], \n        \"password\": \"pbkdf2_sha256$12000$SMs6e6x1QtNU$FBvNDlWSuV4KyvcSmhYXcvJEsMofBmm9EtIJV0TL95o=\", \n        \"email\": \"\", \n        \"date_joined\": \"2015-03-19T11:05:16\"\n    }\n},\n{\n    \"pk\": 3, \n    \"model\": \"auth.user\", \n    \"fields\": {\n        \"username\": \"titi\", \n        \"first_name\": \"Titi\", \n        \"last_name\": \"Demo\", \n        \"is_active\": true, \n        \"is_superuser\": false, \n        \"is_staff\": false, \n        \"last_login\": \"2015-03-19T11:23:43.373\", \n        \"groups\": [], \n        \"user_permissions\": [\n            34, \n            31\n        ], \n        \"password\": \"pbkdf2_sha256$12000$uObfzI9Rlyo6$zbif5RfIHT3YX4M9lsAiQlCWVMnq/D38NHpeis7fbzI=\", \n        \"email\": \"\", \n        \"date_joined\": \"2015-03-19T11:05:52\"\n    }\n},\n{\n    \"pk\": 4, \n    \"model\": \"auth.user\", \n    \"fields\": {\n        \"username\": \"toto\", \n        \"first_name\": \"Toto\", \n        \"last_name\": \"Demo\", \n        \"is_active\": true, \n        \"is_superuser\": false, \n        \"is_staff\": false, \n        \"last_login\": \"2015-03-19T11:23:32.080\", \n        \"groups\": [], \n        \"user_permissions\": [\n            34, \n            31\n        ], \n        \"password\": \"pbkdf2_sha256$12000$QhuL74MNcJ8D$5H20mImE+a0kJjVRcrbXTjNZRl+VlF/0eVR7n0CMizA=\", \n        \"email\": \"\", \n        \"date_joined\": \"2015-03-19T11:06:08\"\n    }\n},\n{\n    \"pk\": 5, \n    \"model\": \"auth.user\", \n    \"fields\": {\n        \"username\": \"demo\", \n        \"first_name\": \"Demo\", \n        \"last_name\": \"Demo\", \n        \"is_active\": true, \n        \"is_superuser\": false, \n        \"is_staff\": false, \n        \"last_login\": \"2015-03-19T11:24:49.808\", \n        \"groups\": [], \n        \"user_permissions\": [\n            34, \n            31\n        ], \n        \"password\": \"pbkdf2_sha256$12000$9VfnVb267EJR$0et/kdM6Pf/wDXyOaLaE3hdedsKk44RibzAO5l9X/xQ=\", \n        \"email\": \"\", \n        \"date_joined\": \"2015-03-19T11:06:15\"\n    }\n},\n{\n    \"pk\": 1, \n    \"model\": \"pybb.category\", \n    \"fields\": {\n        \"position\": 0, \n        \"hidden\": false, \n        \"name\": \"Operating Systems\", \n        \"slug\": \"operating-systems\"\n    }\n},\n{\n    \"pk\": 2, \n    \"model\": \"pybb.category\", \n    \"fields\": {\n        \"position\": 0, \n        \"hidden\": false, \n        \"name\": \"Games\", \n        \"slug\": \"games\"\n    }\n},\n{\n    \"pk\": 1, \n    \"model\": \"pybb.profile\", \n    \"fields\": {\n        \"show_signatures\": true, \n        \"language\": \"en\", \n        \"signature_html\": \"La mort est un manque de savoir-vivre (Pierre Dac)\", \n        \"time_zone\": 2.0, \n        \"post_count\": 2, \n        \"avatar\": \"\", \n        \"signature\": \"La mort est un manque de savoir-vivre (Pierre Dac)\", \n        \"autosubscribe\": true, \n        \"user\": 1\n    }\n},\n{\n    \"pk\": 2, \n    \"model\": \"pybb.profile\", \n    \"fields\": {\n        \"show_signatures\": true, \n        \"language\": \"en\", \n        \"signature_html\": \"\", \n        \"time_zone\": 3.0, \n        \"post_count\": 10, \n        \"avatar\": \"\", \n        \"signature\": \"\", \n        \"autosubscribe\": true, \n        \"user\": 2\n    }\n},\n{\n    \"pk\": 3, \n    \"model\": \"pybb.profile\", \n    \"fields\": {\n        \"show_signatures\": true, \n        \"language\": \"en\", \n        \"signature_html\": \"\", \n        \"time_zone\": 3.0, \n        \"post_count\": 1, \n        \"avatar\": \"\", \n        \"signature\": \"\", \n        \"autosubscribe\": true, \n        \"user\": 3\n    }\n},\n{\n    \"pk\": 4, \n    \"model\": \"pybb.profile\", \n    \"fields\": {\n        \"show_signatures\": true, \n        \"language\": \"fr\", \n        \"signature_html\": \"0 + 0 = Toto&#39;s head\", \n        \"time_zone\": 3.0, \n        \"post_count\": 3, \n        \"avatar\": \"\", \n        \"signature\": \"0 + 0 = Toto's head\", \n        \"autosubscribe\": true, \n        \"user\": 4\n    }\n},\n{\n    \"pk\": 5, \n    \"model\": \"pybb.profile\", \n    \"fields\": {\n        \"show_signatures\": true, \n        \"language\": \"en\", \n        \"signature_html\": \"\", \n        \"time_zone\": 3.0, \n        \"post_count\": 1, \n        \"avatar\": \"\", \n        \"signature\": \"\", \n        \"autosubscribe\": true, \n        \"user\": 5\n    }\n},\n{\n    \"pk\": 2, \n    \"model\": \"pybb.forum\", \n    \"fields\": {\n        \"category\": 1, \n        \"updated\": null, \n        \"name\": \"BSD\", \n        \"slug\": \"bsd\", \n        \"parent\": null, \n        \"post_count\": 0, \n        \"topic_count\": 0, \n        \"headline\": \"\", \n        \"moderators\": [\n            2\n        ], \n        \"position\": 0, \n        \"hidden\": false, \n        \"description\": \"\"\n    }\n},\n{\n    \"pk\": 3, \n    \"model\": \"pybb.forum\", \n    \"fields\": {\n        \"category\": 1, \n        \"updated\": null, \n        \"name\": \"GNU Linux\", \n        \"slug\": \"gnu-linux\", \n        \"parent\": null, \n        \"post_count\": 0, \n        \"topic_count\": 0, \n        \"headline\": \"\", \n        \"moderators\": [\n            2\n        ], \n        \"position\": 0, \n        \"hidden\": false, \n        \"description\": \"\"\n    }\n},\n{\n    \"pk\": 4, \n    \"model\": \"pybb.forum\", \n    \"fields\": {\n        \"category\": 1, \n        \"updated\": null, \n        \"name\": \"Debian\", \n        \"slug\": \"debian\", \n        \"parent\": 3, \n        \"post_count\": 0, \n        \"topic_count\": 0, \n        \"headline\": \"\", \n        \"moderators\": [\n            2\n        ], \n        \"position\": 0, \n        \"hidden\": false, \n        \"description\": \"\"\n    }\n},\n{\n    \"pk\": 5, \n    \"model\": \"pybb.forum\", \n    \"fields\": {\n        \"category\": 1, \n        \"updated\": \"2015-03-19T11:22:31.383\", \n        \"name\": \"Ubuntu and cie\", \n        \"slug\": \"ubuntu-and-cie\", \n        \"parent\": 3, \n        \"post_count\": 1, \n        \"topic_count\": 1, \n        \"headline\": \"\", \n        \"moderators\": [\n            2\n        ], \n        \"position\": 0, \n        \"hidden\": false, \n        \"description\": \"\"\n    }\n},\n{\n    \"pk\": 6, \n    \"model\": \"pybb.forum\", \n    \"fields\": {\n        \"category\": 1, \n        \"updated\": null, \n        \"name\": \"Linux Mint\", \n        \"slug\": \"linux-mint\", \n        \"parent\": 3, \n        \"post_count\": 0, \n        \"topic_count\": 0, \n        \"headline\": \"\", \n        \"moderators\": [\n            2\n        ], \n        \"position\": 0, \n        \"hidden\": false, \n        \"description\": \"\"\n    }\n},\n{\n    \"pk\": 7, \n    \"model\": \"pybb.forum\", \n    \"fields\": {\n        \"category\": 1, \n        \"updated\": null, \n        \"name\": \"FreeBSD\", \n        \"slug\": \"freebsd\", \n        \"parent\": 2, \n        \"post_count\": 0, \n        \"topic_count\": 0, \n        \"headline\": \"\", \n        \"moderators\": [\n            2\n        ], \n        \"position\": 0, \n        \"hidden\": false, \n        \"description\": \"\"\n    }\n},\n{\n    \"pk\": 8, \n    \"model\": \"pybb.forum\", \n    \"fields\": {\n        \"category\": 1, \n        \"updated\": null, \n        \"name\": \"SunOS\", \n        \"slug\": \"sunos\", \n        \"parent\": 2, \n        \"post_count\": 0, \n        \"topic_count\": 0, \n        \"headline\": \"\", \n        \"moderators\": [\n            2\n        ], \n        \"position\": 0, \n        \"hidden\": false, \n        \"description\": \"\"\n    }\n},\n{\n    \"pk\": 9, \n    \"model\": \"pybb.forum\", \n    \"fields\": {\n        \"category\": 1, \n        \"updated\": null, \n        \"name\": \"NetBSD\", \n        \"slug\": \"netbsd\", \n        \"parent\": 2, \n        \"post_count\": 0, \n        \"topic_count\": 0, \n        \"headline\": \"\", \n        \"moderators\": [\n            2\n        ], \n        \"position\": 0, \n        \"hidden\": false, \n        \"description\": \"\"\n    }\n},\n{\n    \"pk\": 10, \n    \"model\": \"pybb.forum\", \n    \"fields\": {\n        \"category\": 1, \n        \"updated\": null, \n        \"name\": \"Windows\", \n        \"slug\": \"windows\", \n        \"parent\": null, \n        \"post_count\": 0, \n        \"topic_count\": 0, \n        \"headline\": \"\", \n        \"moderators\": [\n            2\n        ], \n        \"position\": 0, \n        \"hidden\": true, \n        \"description\": \"Hide the bad one :-)\"\n    }\n},\n{\n    \"pk\": 11, \n    \"model\": \"pybb.forum\", \n    \"fields\": {\n        \"category\": 2, \n        \"updated\": null, \n        \"name\": \"PC\", \n        \"slug\": \"pc\", \n        \"parent\": null, \n        \"post_count\": 0, \n        \"topic_count\": 0, \n        \"headline\": \"\", \n        \"moderators\": [], \n        \"position\": 0, \n        \"hidden\": false, \n        \"description\": \"\"\n    }\n},\n{\n    \"pk\": 12, \n    \"model\": \"pybb.forum\", \n    \"fields\": {\n        \"category\": 2, \n        \"updated\": \"2015-03-19T11:50:31.407\", \n        \"name\": \"PS[1-9]\\\\d*\", \n        \"slug\": \"ps1-9d\", \n        \"parent\": null, \n        \"post_count\": 16, \n        \"topic_count\": 3, \n        \"headline\": \"This is the headline of the forum\", \n        \"moderators\": [], \n        \"position\": 0, \n        \"hidden\": false, \n        \"description\": \"Geek joke for the forum name.\"\n    }\n},\n{\n    \"pk\": 1, \n    \"model\": \"pybb.topic\", \n    \"fields\": {\n        \"updated\": \"2015-03-19T11:36:10.547\", \n        \"on_moderation\": false, \n        \"name\": \"Why this forum has a weird name ?\", \n        \"slug\": \"why-this-forum-has-a-weird-name\", \n        \"forum\": 12, \n        \"views\": 30, \n        \"post_count\": 14, \n        \"created\": \"2015-03-19T11:14:59.476\", \n        \"subscribers\": [\n            1, \n            2, \n            3, \n            4, \n            5\n        ], \n        \"sticky\": false, \n        \"user\": 1, \n        \"closed\": false, \n        \"poll_type\": 1, \n        \"poll_question\": \"Who is the strongest ?\"\n    }\n},\n{\n    \"pk\": 2, \n    \"model\": \"pybb.topic\", \n    \"fields\": {\n        \"updated\": \"2015-03-19T11:21:16.067\", \n        \"on_moderation\": false, \n        \"name\": \"TESV : Skyrim\", \n        \"slug\": \"tesv-skyrim\", \n        \"forum\": 12, \n        \"views\": 1, \n        \"post_count\": 1, \n        \"created\": \"2015-03-19T11:21:16.064\", \n        \"subscribers\": [\n            4\n        ], \n        \"sticky\": false, \n        \"user\": 4, \n        \"closed\": false, \n        \"poll_type\": 0, \n        \"poll_question\": null\n    }\n},\n{\n    \"pk\": 3, \n    \"model\": \"pybb.topic\", \n    \"fields\": {\n        \"updated\": \"2015-03-19T11:22:31.383\", \n        \"on_moderation\": false, \n        \"name\": \"Troll powa !\", \n        \"slug\": \"troll-powa\", \n        \"forum\": 5, \n        \"views\": 1, \n        \"post_count\": 1, \n        \"created\": \"2015-03-19T11:22:31.381\", \n        \"subscribers\": [\n            4\n        ], \n        \"sticky\": false, \n        \"user\": 4, \n        \"closed\": false, \n        \"poll_type\": 0, \n        \"poll_question\": null\n    }\n},\n{\n    \"pk\": 4, \n    \"model\": \"pybb.topic\", \n    \"fields\": {\n        \"updated\": \"2015-03-19T11:50:31.407\", \n        \"on_moderation\": false, \n        \"name\": \"Test accounts\", \n        \"slug\": \"test-accounts\", \n        \"forum\": 12, \n        \"views\": 2, \n        \"post_count\": 1, \n        \"created\": \"2015-03-19T11:49:37.783\", \n        \"subscribers\": [\n            1\n        ], \n        \"sticky\": false, \n        \"user\": 1, \n        \"closed\": false, \n        \"poll_type\": 0, \n        \"poll_question\": null\n    }\n},\n{\n    \"pk\": 1, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"If you can not laught to this, you probably won't laught to \\\"[url=http://en.wikipedia.org/wiki/Regular_expression]RTFM[/url]\\\" :)\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": \"2015-03-19T11:15:38.750\", \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:14:59.477\", \n        \"body_text\": \"If you can not laught to this, you probably won't laught to \\\"RTFM\\\" \", \n        \"body_html\": \"If you can not laught to this, you probably won&#39;t laught to &quot;<a href=\\\"http://en.wikipedia.org/wiki/Regular_expression\\\">RTFM</a>&quot; <img src=\\\"/static/pybb/emoticons/smile.png\\\" alt=\\\"smile\\\" />\", \n        \"topic\": 1, \n        \"user\": 1\n    }\n},\n{\n    \"pk\": 2, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"[img]http://upload.wikimedia.org/wikipedia/fr/f/f0/TES_V_Skyrim_Logo.png[/img]\\n\\nI love The Elder Scrolls. Skyrim is good. Not enough than Morrowind, but better than Oblivion !\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:21:16.067\", \n        \"body_text\": \"I love The Elder Scrolls. Skyrim is good. Not enough than Morrowind, but better than Oblivion !\", \n        \"body_html\": \"<img src=\\\"http://upload.wikimedia.org/wikipedia/fr/f/f0/TES_V_Skyrim_Logo.png\\\"><br /><br />I love The Elder Scrolls. Skyrim is good. Not enough than Morrowind, but better than Oblivion !\", \n        \"topic\": 2, \n        \"user\": 4\n    }\n},\n{\n    \"pk\": 3, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"*buntu, a \\\"GNU Linux Windows\\\" ? 8)\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:22:31.383\", \n        \"body_text\": \"*buntu, a \\\"GNU Linux Windows\\\" ? \", \n        \"body_html\": \"*buntu, a &quot;GNU Linux Windows&quot; ? <img src=\\\"/static/pybb/emoticons/glasses.png\\\" alt=\\\"smile\\\" />\", \n        \"topic\": 3, \n        \"user\": 4\n    }\n},\n{\n    \"pk\": 4, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"ahah ! good one !\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:23:13.609\", \n        \"body_text\": \"ahah ! good one !\", \n        \"body_html\": \"ahah ! good one !\", \n        \"topic\": 1, \n        \"user\": 4\n    }\n},\n{\n    \"pk\": 5, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"O_o ?? I don't understand TT_TT\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:24:26.637\", \n        \"body_text\": \"O_o ?? I don't understand TT_TT\", \n        \"body_html\": \"O_o ?? I don&#39;t understand TT_TT\", \n        \"topic\": 1, \n        \"user\": 3\n    }\n},\n{\n    \"pk\": 6, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"[b]titi[/b], \\\"RTFM\\\" meens \\\"Read the Fucking manual\\\". The \\\"weird\\\" part of the forum's name is a \\\"regular expression\\\". The link on \\\"RTFM\\\" is the wikipedia page about Regular Expressions.\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:32:41.561\", \n        \"body_text\": \"titi, \\\"RTFM\\\" meens \\\"Read the Fucking manual\\\". The \\\"weird\\\" part of the forum's name is a \\\"regular expression\\\". The link on \\\"RTFM\\\" is the wikipedia page about Regular Expressions.\", \n        \"body_html\": \"<strong>titi</strong>, &quot;RTFM&quot; meens &quot;Read the Fucking manual&quot;. The &quot;weird&quot; part of the forum&#39;s name is a &quot;regular expression&quot;. The link on &quot;RTFM&quot; is the wikipedia page about Regular Expressions.\", \n        \"topic\": 1, \n        \"user\": 5\n    }\n},\n{\n    \"pk\": 7, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"I am the law !\\n\\n[img]http://upload.wikimedia.org/wikipedia/en/2/2c/Judge_Dredd_promo_poster.jpg[/img]\\n\\nAnd I'll Lorem Ipsum this test topic !\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:35:21.777\", \n        \"body_text\": \"I am the law !And I'll Lorem Ipsum this test topic !\", \n        \"body_html\": \"I am the law !<br /><br /><img src=\\\"http://upload.wikimedia.org/wikipedia/en/2/2c/Judge_Dredd_promo_poster.jpg\\\"><br /><br />And I&#39;ll Lorem Ipsum this test topic !\", \n        \"topic\": 1, \n        \"user\": 2\n    }\n},\n{\n    \"pk\": 8, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:35:42.737\", \n        \"body_text\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"body_html\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"topic\": 1, \n        \"user\": 2\n    }\n},\n{\n    \"pk\": 9, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:35:45.770\", \n        \"body_text\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"body_html\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"topic\": 1, \n        \"user\": 2\n    }\n},\n{\n    \"pk\": 10, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:35:49.021\", \n        \"body_text\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"body_html\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"topic\": 1, \n        \"user\": 2\n    }\n},\n{\n    \"pk\": 11, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:35:52.226\", \n        \"body_text\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"body_html\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"topic\": 1, \n        \"user\": 2\n    }\n},\n{\n    \"pk\": 12, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:35:56.199\", \n        \"body_text\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"body_html\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"topic\": 1, \n        \"user\": 2\n    }\n},\n{\n    \"pk\": 13, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:35:59.022\", \n        \"body_text\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"body_html\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"topic\": 1, \n        \"user\": 2\n    }\n},\n{\n    \"pk\": 14, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:36:02.234\", \n        \"body_text\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"body_html\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"topic\": 1, \n        \"user\": 2\n    }\n},\n{\n    \"pk\": 15, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:36:04.981\", \n        \"body_text\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"body_html\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"topic\": 1, \n        \"user\": 2\n    }\n},\n{\n    \"pk\": 16, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": null, \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:36:10.547\", \n        \"body_text\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"body_html\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce rutrum eros lorem. Morbi nec risus scelerisque, aliquet nibh ac, malesuada arcu. Cras volutpat fermentum lectus eget mollis. Duis sed congue mi. Sed lacinia mollis sagittis. Integer vestibulum ante diam, id maximus nibh pretium sed. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vehicula euismod diam, in hendrerit mi pretium a.\", \n        \"topic\": 1, \n        \"user\": 2\n    }\n},\n{\n    \"pk\": 17, \n    \"model\": \"pybb.post\", \n    \"fields\": {\n        \"body\": \"Available test accounts are :\\r\\n\\r\\n[list]\\r\\n[*] admin // admin\\r\\n[*] moderator // moderator\\r\\n[*] demo // demo\\r\\n[*] titi // titi\\r\\n[*] toto // toto\\r\\n[/list]\", \n        \"user_ip\": \"127.0.0.1\", \n        \"updated\": \"2015-03-19T11:50:31.407\", \n        \"on_moderation\": false, \n        \"created\": \"2015-03-19T11:49:37.786\", \n        \"body_text\": \"Available test accounts are :admin // adminmoderator // moderatordemo // demotiti // tititoto // toto\", \n        \"body_html\": \"Available test accounts are :<br /><br /><ul><li>admin // admin</li><li>moderator // moderator</li><li>demo // demo</li><li>titi // titi</li><li>toto // toto</li></ul>\", \n        \"topic\": 4, \n        \"user\": 1\n    }\n},\n{\n    \"pk\": 1, \n    \"model\": \"pybb.pollanswer\", \n    \"fields\": {\n        \"topic\": 1, \n        \"text\": \"Chuck Norris\"\n    }\n},\n{\n    \"pk\": 2, \n    \"model\": \"pybb.pollanswer\", \n    \"fields\": {\n        \"topic\": 1, \n        \"text\": \"Bruce Willis\"\n    }\n},\n{\n    \"pk\": 3, \n    \"model\": \"pybb.pollanswer\", \n    \"fields\": {\n        \"topic\": 1, \n        \"text\": \"Me (you ? no ! me ! not you ! so it's me ?)\"\n    }\n},\n{\n    \"pk\": 4, \n    \"model\": \"pybb.pollanswer\", \n    \"fields\": {\n        \"topic\": 1, \n        \"text\": \"a frozen tyranosorus pinguintus\"\n    }\n},\n{\n    \"pk\": 1, \n    \"model\": \"pybb.pollansweruser\", \n    \"fields\": {\n        \"timestamp\": \"2015-03-19T11:15:43.834\", \n        \"poll_answer\": 4, \n        \"user\": 1\n    }\n},\n{\n    \"pk\": 2, \n    \"model\": \"pybb.pollansweruser\", \n    \"fields\": {\n        \"timestamp\": \"2015-03-19T11:23:06.234\", \n        \"poll_answer\": 1, \n        \"user\": 4\n    }\n},\n{\n    \"pk\": 3, \n    \"model\": \"pybb.pollansweruser\", \n    \"fields\": {\n        \"timestamp\": \"2015-03-19T11:23:59.432\", \n        \"poll_answer\": 4, \n        \"user\": 3\n    }\n},\n{\n    \"pk\": 4, \n    \"model\": \"pybb.pollansweruser\", \n    \"fields\": {\n        \"timestamp\": \"2015-03-19T11:36:26.750\", \n        \"poll_answer\": 3, \n        \"user\": 2\n    }\n},\n{\n    \"pk\": 1, \n    \"model\": \"pybb.forumreadtracker\", \n    \"fields\": {\n        \"time_stamp\": \"2015-03-19T11:15:38.972\", \n        \"user\": 1, \n        \"forum\": 12\n    }\n},\n{\n    \"pk\": 2, \n    \"model\": \"pybb.forumreadtracker\", \n    \"fields\": {\n        \"time_stamp\": \"2015-03-19T11:22:31.645\", \n        \"user\": 4, \n        \"forum\": 5\n    }\n},\n{\n    \"pk\": 3, \n    \"model\": \"pybb.forumreadtracker\", \n    \"fields\": {\n        \"time_stamp\": \"2015-03-19T11:23:13.847\", \n        \"user\": 4, \n        \"forum\": 12\n    }\n},\n{\n    \"pk\": 1, \n    \"model\": \"pybb.topicreadtracker\", \n    \"fields\": {\n        \"topic\": 1, \n        \"time_stamp\": \"2015-03-19T11:24:26.820\", \n        \"user\": 3\n    }\n},\n{\n    \"pk\": 2, \n    \"model\": \"pybb.topicreadtracker\", \n    \"fields\": {\n        \"topic\": 1, \n        \"time_stamp\": \"2015-03-19T11:32:41.722\", \n        \"user\": 5\n    }\n},\n{\n    \"pk\": 3, \n    \"model\": \"pybb.topicreadtracker\", \n    \"fields\": {\n        \"topic\": 1, \n        \"time_stamp\": \"2015-03-19T11:38:40.497\", \n        \"user\": 2\n    }\n},\n{\n    \"pk\": 4, \n    \"model\": \"pybb.topicreadtracker\", \n    \"fields\": {\n        \"topic\": 4, \n        \"time_stamp\": \"2015-03-19T11:50:31.568\", \n        \"user\": 1\n    }\n}\n]\n"
  },
  {
    "path": "test/example_bootstrap/manage.py",
    "content": "#!/usr/bin/env python\nimport os\nimport sys\n\nif __name__ == \"__main__\":\n    os.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"example_bootstrap.settings\")\n\n    from django.core.management import execute_from_command_line\n\n    execute_from_command_line(sys.argv)\n"
  },
  {
    "path": "test/example_bootstrap/requirements.txt",
    "content": "django>=1.8,<1.11\n\n#example_bootstrap dependencies\ndjango-registration-redux\n\n#pybb strong dependencies\ndjango-annoying\nbbcode\nPillow\nunidecode\n\n#for test purpose only\n#lxml\n#markdown\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/alerts.less",
    "content": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @headings-color\n    color: inherit;\n  }\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: @alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissable alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable {\n padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/bootstrap.less",
    "content": "// Core variables and mixins\n@import \"variables.less\";\n@import \"mixins.less\";\n\n// Reset\n@import \"normalize.less\";\n@import \"print.less\";\n\n// Core CSS\n@import \"scaffolding.less\";\n@import \"type.less\";\n@import \"code.less\";\n@import \"grid.less\";\n@import \"tables.less\";\n@import \"forms.less\";\n@import \"buttons.less\";\n\n// Components\n@import \"component-animations.less\";\n@import \"glyphicons.less\";\n@import \"dropdowns.less\";\n@import \"button-groups.less\";\n@import \"input-groups.less\";\n@import \"navs.less\";\n@import \"navbar.less\";\n@import \"breadcrumbs.less\";\n@import \"pagination.less\";\n@import \"pager.less\";\n@import \"labels.less\";\n@import \"badges.less\";\n@import \"jumbotron.less\";\n@import \"thumbnails.less\";\n@import \"alerts.less\";\n@import \"progress-bars.less\";\n@import \"media.less\";\n@import \"list-group.less\";\n@import \"panels.less\";\n@import \"wells.less\";\n@import \"close.less\";\n\n// Components w/ JavaScript\n@import \"modals.less\";\n@import \"tooltip.less\";\n@import \"popovers.less\";\n@import \"carousel.less\";\n\n// Utility classes\n@import \"utilities.less\";\n@import \"responsive-utilities.less\";\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/breadcrumbs.less",
    "content": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: @breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/button-groups.less",
    "content": "//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n    &:focus {\n      // Remove focus outline when dropdown JS adds it after closing the menu\n      outline: none;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  &:extend(.clearfix all);\n\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    .box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: @caret-width-large @caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    &:extend(.clearfix all);\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    border-top-right-radius: @border-radius-base;\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    border-bottom-left-radius: @border-radius-base;\n    .border-top-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n}\n\n\n// Checkbox and radio options\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/buttons.less",
    "content": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: @btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n  .user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus {\n      .tab-focus();\n    }\n  }\n\n  &:hover,\n  &:focus {\n    color: @btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    pointer-events: none; // Future-proof disabling of clicks\n    .opacity(.65);\n    .box-shadow(none);\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  cursor: pointer;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/carousel.less",
    "content": "//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      &:extend(.img-responsive);\n      line-height: 1;\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev { display: block; }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: none;\n    color: @carousel-control-color;\n    text-decoration: none;\n    .opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    margin-top: -10px;\n    margin-left: -10px;\n    font-family: serif;\n  }\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: @carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: @carousel-caption-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: 30px;\n      height: 30px;\n      margin-top: -15px;\n      margin-left: -15px;\n      font-size: 30px;\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/close.less",
    "content": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: (@font-size-base * 1.5);\n  font-weight: @close-font-weight;\n  line-height: 1;\n  color: @close-color;\n  text-shadow: @close-text-shadow;\n  .opacity(.2);\n\n  &:hover,\n  &:focus {\n    color: @close-color;\n    text-decoration: none;\n    cursor: pointer;\n    .opacity(.5);\n  }\n\n  // Additional properties for button version\n  // iOS requires the button element instead of an anchor tag.\n  // If you want the anchor version, it requires `href=\"#\"`.\n  button& {\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    -webkit-appearance: none;\n  }\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/code.less",
    "content": "//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @code-color;\n  background-color: @code-bg;\n  white-space: nowrap;\n  border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @kbd-color;\n  background-color: @kbd-bg;\n  border-radius: @border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: @pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/component-animations.less",
    "content": "//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n  &.in {\n    display: block;\n  }\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition(height .35s ease);\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/dropdowns.less",
    "content": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base solid;\n  border-right: @caret-width-base solid transparent;\n  border-left:  @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: @font-size-base;\n  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    .reset-filter();\n    cursor: not-allowed;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: @caret-width-base solid;\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 1px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      .dropdown-menu-right();\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      .dropdown-menu-left();\n    }\n  }\n}\n\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/forms.less",
    "content": "//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: -webkit-min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; /* IE8-9 */\n  line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: (@padding-base-vertical + 1);\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  background-color: @input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Placeholder\n  .placeholder();\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    background-color: @input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS date input\n//\n// In Mobile Safari, date inputs require a pixel line-height that matches the\n// given height of the input.\n\ninput[type=\"date\"] {\n  line-height: @input-height-base;\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: @line-height-computed; // clear the floating input if there is no label text\n  margin-top: 10px;\n  margin-bottom: 10px;\n  padding-left: 20px;\n  label {\n    display: inline;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"],\n.radio,\n.radio-inline,\n.checkbox,\n.checkbox-inline {\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: (@input-height-base * 1.25);\n  }\n\n  // Feedback icon (requires .glyphicon classes)\n  .form-control-feedback {\n    position: absolute;\n    top: (@line-height-computed + 5); // Height of the `label` and its margin\n    right: 0;\n    display: block;\n    width: @input-height-base;\n    height: @input-height-base;\n    line-height: @input-height-base;\n    text-align: center;\n  }\n}\n\n// Feedback states\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  margin-bottom: 0; // Remove default margin from `p`\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match (which also avoids\n    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      padding-left: 0;\n      vertical-align: middle;\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      float: none;\n      margin-left: 0;\n    }\n\n    // Validation states\n    //\n    // Reposition the icon because it's now within a grid column and columns have\n    // `position: relative;` on them. Also accounts for the grid gutter padding.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of labels, radios, and checkboxes\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: (@line-height-computed + (@padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    .make-row();\n  }\n\n  .form-control-static {\n    padding-top: (@padding-base-vertical + 1);\n  }\n\n  // Only right align form labels here when the columns stop stacking\n  @media (min-width: @screen-sm-min) {\n    .control-label {\n      text-align: right;\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    top: 0;\n    right: (@grid-gutter-width / 2);\n  }\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/grid.less",
    "content": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm-min) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md-min) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n  .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n  .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n  .make-grid(lg);\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/mixins.less",
    "content": "//\n// Mixins\n// --------------------------------------------------\n\n\n// Utilities\n// -------------------------\n\n// Clearfix\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n.clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n\n// WebKit-style focus\n.tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n// Center-align a block level element\n.center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n// Sizing shortcuts\n.size(@width; @height) {\n  width: @width;\n  height: @height;\n}\n.square(@size) {\n  .size(@size; @size);\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  &::-moz-placeholder           { color: @color;   // Firefox\n                                  opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n  &:-ms-input-placeholder       { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Text overflow\n// Requires inline-block or block for proper styling\n.text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note\n// that we cannot chain the mixins together in Less, so they are repeated.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n  font: ~\"0/0\" a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n// New mixin to use as of v3.0.1\n.text-hide() {\n  .hide-text();\n}\n\n\n\n// CSS3 PROPERTIES\n// --------------------------------------------------\n\n// Single side border-radius\n.border-top-radius(@radius) {\n  border-top-right-radius: @radius;\n   border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n  border-bottom-right-radius: @radius;\n     border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n  border-bottom-right-radius: @radius;\n   border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n  border-bottom-left-radius: @radius;\n     border-top-left-radius: @radius;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n//   supported browsers that have box shadow capabilities now support the\n//   standard `box-shadow` property.\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Transitions\n.transition(@transition) {\n  -webkit-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n// Transformations\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n          transform: rotate(@degrees);\n}\n.scale(@ratio; @ratio-y...) {\n  -webkit-transform: scale(@ratio, @ratio-y);\n      -ms-transform: scale(@ratio, @ratio-y); // IE9 only\n          transform: scale(@ratio, @ratio-y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n          transform: translate(@x, @y);\n}\n.skew(@x; @y) {\n  -webkit-transform: skew(@x, @y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n          transform: skew(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// User select\n// For selecting text on the page\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n\n// Resize anything\n.resizable(@direction) {\n  resize: @direction; // Options: horizontal, vertical, both\n  overflow: auto; // Safari fix\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Opacity\n.opacity(@opacity) {\n  opacity: @opacity;\n  // IE8 filter\n  @opacity-ie: (@opacity * 100);\n  filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n\n\n\n// GRADIENTS\n// --------------------------------------------------\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1-6, Chrome 10+\n    background-image:  linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n\n// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n\n\n\n// Retina images\n//\n// Short retina mixin for setting background-image and -size\n\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n  background-image: url(\"@{file-1x}\");\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(\"@{file-2x}\");\n    background-size: @width-1x @height-1x;\n  }\n}\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n.img-responsive(@display: block) {\n  display: @display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// COMPONENT MIXINS\n// --------------------------------------------------\n\n// Horizontal dividers\n// -------------------------\n// Dividers (basically an hr) within dropdowns and nav lists\n.nav-divider(@color: #e5e5e5) {\n  height: 1px;\n  margin: ((@line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: @color;\n}\n\n// Panels\n// -------------------------\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n  border-color: @border;\n\n  & > .panel-heading {\n    color: @heading-text-color;\n    background-color: @heading-bg-color;\n    border-color: @heading-border;\n\n    + .panel-collapse .panel-body {\n      border-top-color: @border;\n    }\n  }\n  & > .panel-footer {\n    + .panel-collapse .panel-body {\n      border-bottom-color: @border;\n    }\n  }\n}\n\n// Alerts\n// -------------------------\n.alert-variant(@background; @border; @text-color) {\n  background-color: @background;\n  border-color: @border;\n  color: @text-color;\n\n  hr {\n    border-top-color: darken(@border, 5%);\n  }\n  .alert-link {\n    color: darken(@text-color, 10%);\n  }\n}\n\n// Tables\n// -------------------------\n.table-row-variant(@state; @background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.@{state},\n    > th.@{state},\n    &.@{state} > td,\n    &.@{state} > th {\n      background-color: @background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.@{state}:hover,\n    > th.@{state}:hover,\n    &.@{state}:hover > td,\n    &.@{state}:hover > th {\n      background-color: darken(@background, 5%);\n    }\n  }\n}\n\n// List Groups\n// -------------------------\n.list-group-item-variant(@state; @background; @color) {\n  .list-group-item-@{state} {\n    color: @color;\n    background-color: @background;\n\n    a& {\n      color: @color;\n\n      .list-group-item-heading { color: inherit; }\n\n      &:hover,\n      &:focus {\n        color: @color;\n        background-color: darken(@background, 5%);\n      }\n      &.active,\n      &.active:hover,\n      &.active:focus {\n        color: #fff;\n        background-color: @color;\n        border-color: @color;\n      }\n    }\n  }\n}\n\n// Button variants\n// -------------------------\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n.button-variant(@color; @background; @border) {\n  color: @color;\n  background-color: @background;\n  border-color: @border;\n\n  &:hover,\n  &:focus,\n  &:active,\n  &.active,\n  .open .dropdown-toggle& {\n    color: @color;\n    background-color: darken(@background, 8%);\n        border-color: darken(@border, 12%);\n  }\n  &:active,\n  &.active,\n  .open .dropdown-toggle& {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &,\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      background-color: @background;\n          border-color: @border;\n    }\n  }\n\n  .badge {\n    color: @background;\n    background-color: @color;\n  }\n}\n\n// Button sizes\n// -------------------------\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n}\n\n// Pagination\n// -------------------------\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: @padding-vertical @padding-horizontal;\n      font-size: @font-size;\n    }\n    &:first-child {\n      > a,\n      > span {\n        .border-left-radius(@border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius);\n      }\n    }\n  }\n}\n\n// Labels\n// -------------------------\n.label-variant(@color) {\n  background-color: @color;\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken(@color, 10%);\n    }\n  }\n}\n\n// Contextual backgrounds\n// -------------------------\n.bg-variant(@color) {\n  background-color: @color;\n  a&:hover {\n    background-color: darken(@color, 10%);\n  }\n}\n\n// Typography\n// -------------------------\n.text-emphasis-variant(@color) {\n  color: @color;\n  a&:hover {\n    color: darken(@color, 10%);\n  }\n}\n\n// Navbar vertical align\n// -------------------------\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n.navbar-vertical-align(@element-height) {\n  margin-top: ((@navbar-height - @element-height) / 2);\n  margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n\n// Progress bars\n// -------------------------\n.progress-bar-variant(@color) {\n  background-color: @color;\n  .progress-striped & {\n    #gradient > .striped();\n  }\n}\n\n// Responsive utilities\n// -------------------------\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n  display: block !important;\n  table&  { display: table; }\n  tr&     { display: table-row !important; }\n  th&,\n  td&     { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n  display: none !important;\n}\n\n\n// Grid System\n// -----------\n\n// Centered container element\n.container-fixed() {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  (@grid-gutter-width / 2);\n  padding-right: (@grid-gutter-width / 2);\n  &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n  margin-left:  (@gutter / -2);\n  margin-right: (@gutter / -2);\n  &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage((@columns / @grid-columns));\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n  @media (min-width: @screen-xs-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-xs-column-push(@columns) {\n  @media (min-width: @screen-xs-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-xs-column-pull(@columns) {\n  @media (min-width: @screen-xs-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-sm-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-offset(@columns) {\n  @media (min-width: @screen-sm-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-push(@columns) {\n  @media (min-width: @screen-sm-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-pull(@columns) {\n  @media (min-width: @screen-sm-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-md-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-offset(@columns) {\n  @media (min-width: @screen-md-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-push(@columns) {\n  @media (min-width: @screen-md-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-pull(@columns) {\n  @media (min-width: @screen-md-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-lg-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-offset(@columns) {\n  @media (min-width: @screen-lg-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-push(@columns) {\n  @media (min-width: @screen-lg-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-pull(@columns) {\n  @media (min-width: @screen-lg-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n  // Common styles for all sizes of grid columns, widths 1-12\n  .col(@index) when (@index = 1) { // initial\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      position: relative;\n      // Prevent columns from collapsing when empty\n      min-height: 1px;\n      // Inner gutter via padding\n      padding-left:  (@grid-gutter-width / 2);\n      padding-right: (@grid-gutter-width / 2);\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n  .col(@index) when (@index = 1) { // initial\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      float: left;\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n  .col-@{class}-@{index} {\n    width: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) {\n  .col-@{class}-push-@{index} {\n    left: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) {\n  .col-@{class}-pull-@{index} {\n    right: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n  .col-@{class}-offset-@{index} {\n    margin-left: percentage((@index / @grid-columns));\n  }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n  .calc-grid-column(@index, @class, @type);\n  // next iteration\n  .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n  .float-grid-columns(@class);\n  .loop-grid-columns(@grid-columns, @class, width);\n  .loop-grid-columns(@grid-columns, @class, pull);\n  .loop-grid-columns(@grid-columns, @class, push);\n  .loop-grid-columns(@grid-columns, @class, offset);\n}\n\n// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n  // Color the label and help text\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline  {\n    color: @text-color;\n  }\n  // Set the border and box shadow on specific inputs to match\n  .form-control {\n    border-color: @border-color;\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken(@border-color, 10%);\n      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n      .box-shadow(@shadow);\n    }\n  }\n  // Set validation states also for addons\n  .input-group-addon {\n    color: @text-color;\n    border-color: @border-color;\n    background-color: @background-color;\n  }\n  // Optional feedback icon\n  .form-control-feedback {\n    color: @text-color;\n  }\n}\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-focus-border` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n\n.form-control-focus(@color: @input-border-focus) {\n  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n  &:focus {\n    border-color: @color;\n    outline: 0;\n    .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n  }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  height: @input-height;\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n\n  select& {\n    height: @input-height;\n    line-height: @input-height;\n  }\n\n  textarea&,\n  select[multiple]& {\n    height: auto;\n  }\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/modals.less",
    "content": "//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n  overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal;\n  -webkit-overflow-scrolling: touch;\n\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\n  // https://github.com/twbs/bootstrap/pull/10951.\n  outline: 0;\n\n  // When fading in the modal, animate it to slide down\n  &.fade .modal-dialog {\n    .translate(0, -25%);\n    .transition-transform(~\"0.3s ease-out\");\n  }\n  &.in .modal-dialog { .translate(0, 0)}\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  background-color: @modal-content-bg;\n  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n  border: 1px solid @modal-content-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 3px 9px rgba(0,0,0,.5));\n  background-clip: padding-box;\n  // Remove focus outline from opened modal\n  outline: none;\n}\n\n// Modal background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal-background;\n  background-color: @modal-backdrop-bg;\n  // Fade for backdrop\n  &.fade { .opacity(0); }\n  &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  padding: @modal-title-padding;\n  border-bottom: 1px solid @modal-header-border-color;\n  min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n  margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n  margin: 0;\n  line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  margin-top: 15px;\n  padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;\n  text-align: right; // right align buttons\n  border-top: 1px solid @modal-footer-border-color;\n  &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n  // and override it for block buttons as well\n  .btn-block + .btn-block {\n    margin-left: 0;\n  }\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n  // Automatically set modal's width for larger viewports\n  .modal-dialog {\n    width: @modal-md;\n    margin: 30px auto;\n  }\n  .modal-content {\n    .box-shadow(0 5px 15px rgba(0,0,0,.5));\n  }\n\n  // Modal sizes\n  .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n  .modal-lg { width: @modal-lg; }\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/navbar.less",
    "content": "//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  max-height: @navbar-collapse-max-height;\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  &:extend(.clearfix all);\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -@navbar-padding-horizontal;\n    margin-left:  -@navbar-padding-horizontal;\n\n    @media (min-width: @grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: @zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n  font-size: @font-size-large;\n  line-height: @line-height-computed;\n  height: @navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: none;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: @line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    @navbar-padding-vertical;\n        padding-bottom: @navbar-padding-vertical;\n      }\n    }\n\n    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n\n    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n\n  &.btn-sm {\n    .navbar-vertical-align(@input-height-small);\n  }\n  &.btn-xs {\n    .navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  .navbar-vertical-align(@line-height-computed);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin-left: @navbar-padding-horizontal;\n    margin-right: @navbar-padding-horizontal;\n\n    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: 0;\n    }\n  }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n        background-color: @navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: @navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: @navbar-inverse-bg;\n  border-color: @navbar-inverse-border;\n\n  .navbar-brand {\n    color: @navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-brand-hover-color;\n      background-color: @navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-hover-color;\n        background-color: @navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-active-color;\n        background-color: @navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n        background-color: @navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: @navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-inverse-link-active-bg;\n        color: @navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: @navbar-inverse-border;\n        }\n        .divider {\n          background-color: @navbar-inverse-border;\n        }\n        > li > a {\n          color: @navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-hover-color;\n            background-color: @navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-active-color;\n            background-color: @navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-disabled-color;\n            background-color: @navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: @navbar-inverse-link-color;\n    &:hover {\n      color: @navbar-inverse-link-hover-color;\n    }\n  }\n\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/navs.less",
    "content": "//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  &:extend(.clearfix all);\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: @nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: not-allowed;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    .nav-divider();\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid @nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: @line-height-base;\n      border: 1px solid transparent;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n      &:hover {\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: @nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-pills-active-link-hover-color;\n        background-color: @nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n     > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: @border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid @nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: @nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  .border-top-radius(0);\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/pager.less",
    "content": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  &:extend(.clearfix all);\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pager-bg;\n      border: 1px solid @pager-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pager-bg;\n      cursor: not-allowed;\n    }\n  }\n\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/pagination.less",
    "content": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      color: @pagination-color;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      color: @pagination-hover-color;\n      background-color: @pagination-hover-bg;\n      border-color: @pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-disabled-bg;\n      border-color: @pagination-disabled-border;\n      cursor: not-allowed;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/popovers.less",
    "content": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: @zindex-popover;\n  display: none;\n  max-width: @popover-max-width;\n  padding: 1px;\n  text-align: left; // Reset given new insertion method\n  background-color: @popover-bg;\n  background-clip: padding-box;\n  border: 1px solid @popover-fallback-border-color;\n  border: 1px solid @popover-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Overrides for proper insertion\n  white-space: normal;\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-top: -@popover-arrow-width; }\n  &.right   { margin-left: @popover-arrow-width; }\n  &.bottom  { margin-top: @popover-arrow-width; }\n  &.left    { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: @popover-title-bg;\n  border-bottom: 1px solid darken(@popover-title-bg, 5%);\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n  &,\n  &:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n  }\n}\n.popover > .arrow {\n  border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n  border-width: @popover-arrow-width;\n  content: \"\";\n}\n\n.popover {\n  &.top > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-bottom-width: 0;\n    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-top-color: @popover-arrow-outer-color;\n    bottom: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      bottom: 1px;\n      margin-left: -@popover-arrow-width;\n      border-bottom-width: 0;\n      border-top-color: @popover-arrow-color;\n    }\n  }\n  &.right > .arrow {\n    top: 50%;\n    left: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-left-width: 0;\n    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-right-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      left: 1px;\n      bottom: -@popover-arrow-width;\n      border-left-width: 0;\n      border-right-color: @popover-arrow-color;\n    }\n  }\n  &.bottom > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-top-width: 0;\n    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-bottom-color: @popover-arrow-outer-color;\n    top: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      top: 1px;\n      margin-left: -@popover-arrow-width;\n      border-top-width: 0;\n      border-bottom-color: @popover-arrow-color;\n    }\n  }\n\n  &.left > .arrow {\n    top: 50%;\n    right: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-right-width: 0;\n    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-left-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      right: 1px;\n      border-right-width: 0;\n      border-left-color: @popover-arrow-color;\n      bottom: -@popover-arrow-width;\n    }\n  }\n\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/progress-bars.less",
    "content": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  line-height: @line-height-computed;\n  color: @progress-bar-color;\n  text-align: center;\n  background-color: @progress-bar-bg;\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .transition(width .6s ease);\n}\n\n// Striped bars\n.progress-striped .progress-bar {\n  #gradient > .striped();\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n.progress.active .progress-bar {\n  .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/responsive-utilities.less",
    "content": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#browsers\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n  width: device-width;\n}\n\n\n// Visibility utilities\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  .responsive-invisibility();\n}\n\n.visible-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-visibility();\n  }\n}\n.visible-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-visibility();\n  }\n}\n.visible-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-visibility();\n  }\n}\n.visible-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-visibility();\n  }\n}\n\n.hidden-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-invisibility();\n  }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n.visible-print {\n  .responsive-invisibility();\n\n  @media print {\n    .responsive-visibility();\n  }\n}\n\n.hidden-print {\n  @media print {\n    .responsive-invisibility();\n  }\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/scaffolding.less",
    "content": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n  .box-sizing(border-box);\n}\n*:before,\n*:after {\n  .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @text-color;\n  background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n\n// Links\n\na {\n  color: @link-color;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n  }\n\n  &:focus {\n    .tab-focus();\n  }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n  margin: 0;\n}\n\n\n// Images\n\nimg {\n  vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n  .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n  border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n  padding: @thumbnail-padding;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  // Keep them at most 100% wide\n  .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n  border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n  margin-top:    @line-height-computed;\n  margin-bottom: @line-height-computed;\n  border: 0;\n  border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/tables.less",
    "content": "//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  max-width: 100%;\n  background-color: @table-bg;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-child(odd) {\n    > td,\n    > th {\n      background-color: @table-bg-accent;\n    }\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    > td,\n    > th {\n      background-color: @table-bg-hover;\n    }\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n@media (max-width: @screen-xs-max) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    overflow-x: scroll;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n    -webkit-overflow-scrolling: touch;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/thumbnails.less",
    "content": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: @thumbnail-padding;\n  margin-bottom: @line-height-computed;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  > img,\n  a > img {\n    &:extend(.img-responsive);\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // Add a hover state for linked versions only\n  a&:hover,\n  a&:focus,\n  a&.active {\n    border-color: @link-color;\n  }\n\n  // Image captions\n  .caption {\n    padding: @thumbnail-caption-padding;\n    color: @thumbnail-caption-color;\n  }\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/tooltip.less",
    "content": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: @zindex-tooltip;\n  display: block;\n  visibility: visible;\n  font-size: @font-size-small;\n  line-height: 1.4;\n  .opacity(0);\n\n  &.in     { .opacity(@tooltip-opacity); }\n  &.top    { margin-top:  -3px; padding: @tooltip-arrow-width 0; }\n  &.right  { margin-left:  3px; padding: 0 @tooltip-arrow-width; }\n  &.bottom { margin-top:   3px; padding: @tooltip-arrow-width 0; }\n  &.left   { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: @tooltip-max-width;\n  padding: 3px 8px;\n  color: @tooltip-color;\n  text-align: center;\n  text-decoration: none;\n  background-color: @tooltip-bg;\n  border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip {\n  &.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-left .tooltip-arrow {\n    bottom: 0;\n    left: @tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-right .tooltip-arrow {\n    bottom: 0;\n    right: @tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-right-color: @tooltip-arrow-color;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-left-color: @tooltip-arrow-color;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-left .tooltip-arrow {\n    top: 0;\n    left: @tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-right .tooltip-arrow {\n    top: 0;\n    right: @tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/type.less",
    "content": "//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: @headings-font-family;\n  font-weight: @headings-font-weight;\n  line-height: @headings-line-height;\n  color: @headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: @headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: @line-height-computed;\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: (@line-height-computed / 2);\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: @line-height-computed;\n  font-size: floor((@font-size-base * 1.15));\n  font-weight: 200;\n  line-height: 1.4;\n\n  @media (min-width: @screen-sm-min) {\n    font-size: (@font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: 14px base font * 85% = about 12px\nsmall,\n.small  { font-size: 85%; }\n\n// Undo browser default styling\ncite    { font-style: normal; }\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n\n// Contextual colors\n.text-muted {\n  color: @text-muted;\n}\n.text-primary {\n  .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n  .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n  .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n  .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n  .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n  .bg-variant(@brand-primary);\n}\n.bg-success {\n  .bg-variant(@state-success-bg);\n}\n.bg-info {\n  .bg-variant(@state-info-bg);\n}\n.bg-warning {\n  .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n  .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: ((@line-height-computed / 2) - 1);\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\n  border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// --------------------------------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: (@line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  .list-unstyled();\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n  line-height: @line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n@media (min-width: @grid-float-breakpoint) {\n  .dl-horizontal {\n    dt {\n      float: left;\n      width: (@component-offset-horizontal - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @component-offset-horizontal;\n      &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n    }\n  }\n}\n\n// MISC\n// ----\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: (@line-height-computed / 2) @line-height-computed;\n  margin: 0 0 @line-height-computed;\n  font-size: @blockquote-font-size;\n  border-left: 5px solid @blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid @blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\n// Addresses\naddress {\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/utilities.less",
    "content": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  .clearfix();\n}\n.center-block {\n  .center-block();\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/variables.less",
    "content": "//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-darker:            lighten(#000, 13.5%); // #222\n@gray-dark:              lighten(#000, 20%);   // #333\n@gray:                   lighten(#000, 33.5%); // #555\n@gray-light:             lighten(#000, 60%);   // #999\n@gray-lighter:           lighten(#000, 93.5%); // #eee\n\n@brand-primary:         #428bca;\n@brand-success:         #5cb85c;\n@brand-info:            #5bc0de;\n@brand-warning:         #f0ad4e;\n@brand-danger:          #d9534f;\n\n\n//== Scaffolding\n//\n// ## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n@body-bg:               #fff;\n//** Global text color on `<body>`.\n@text-color:            @gray-dark;\n\n//** Global textual link color.\n@link-color:            @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color:      darken(@link-color, 15%);\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif:  \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif:       Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n@font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base:        @font-family-sans-serif;\n\n@font-size-base:          14px;\n@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5:            @font-size-base;\n@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base:        1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px\n\n//** By default, this inherits from the `<body>`.\n@headings-font-family:    inherit;\n@headings-font-weight:    500;\n@headings-line-height:    1.1;\n@headings-color:          inherit;\n\n\n//-- Iconography\n//\n//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n@icon-font-path:          \"../fonts/\";\n@icon-font-name:          \"glyphicons-halflings-regular\";\n@icon-font-svg-id:        \"glyphicons_halflingsregular\";\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical:     6px;\n@padding-base-horizontal:   12px;\n\n@padding-large-vertical:    10px;\n@padding-large-horizontal:  16px;\n\n@padding-small-vertical:    5px;\n@padding-small-horizontal:  10px;\n\n@padding-xs-vertical:       1px;\n@padding-xs-horizontal:     5px;\n\n@line-height-large:         1.33;\n@line-height-small:         1.5;\n\n@border-radius-base:        4px;\n@border-radius-large:       6px;\n@border-radius-small:       3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color:    #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg:       @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base:          4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large:         5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for `<th>`s and `<td>`s.\n@table-cell-padding:            8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding:  5px;\n\n//** Default background color used for all tables.\n@table-bg:                      transparent;\n//** Background color used for `.table-striped`.\n@table-bg-accent:               #f9f9f9;\n//** Background color used for `.table-hover`.\n@table-bg-hover:                #f5f5f5;\n@table-bg-active:               @table-bg-hover;\n\n//** Border color for table and cell borders.\n@table-border-color:            #ddd;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              #333;\n@btn-default-bg:                 #fff;\n@btn-default-border:             #ccc;\n\n@btn-primary-color:              #fff;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             darken(@btn-primary-bg, 5%);\n\n@btn-success-color:              #fff;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             darken(@btn-success-bg, 5%);\n\n@btn-info-color:                 #fff;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                darken(@btn-info-bg, 5%);\n\n@btn-warning-color:              #fff;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             darken(@btn-warning-bg, 5%);\n\n@btn-danger-color:               #fff;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              darken(@btn-danger-bg, 5%);\n\n@btn-link-disabled-color:        @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `<input>` background color\n@input-bg:                       #fff;\n//** `<input disabled>` background color\n@input-bg-disabled:              @gray-lighter;\n\n//** Text color for `<input>`s\n@input-color:                    @gray;\n//** `<input>` border color\n@input-border:                   #ccc;\n//** `<input>` border radius\n@input-border-radius:            @border-radius-base;\n//** Border color for inputs on focus\n@input-border-focus:             #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder:        @gray-light;\n\n//** Default `.form-control` height\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color:                   @gray-dark;\n@legend-border-color:            #e5e5e5;\n\n//** Background color for textual input addons\n@input-group-addon-bg:           @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg:                    #fff;\n//** Dropdown menu `border-color`.\n@dropdown-border:                rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border:       #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg:            #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color:            @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color:      darken(@gray-dark, 5%);\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg:         #f5f5f5;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color:     @component-active-color;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg:        @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color:   @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color:          @gray-light;\n\n// Note: Deprecated @dropdown-caret-color as of v3.1.0\n@dropdown-caret-color:           #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1010;\n@zindex-tooltip:           1030;\n@zindex-navbar-fixed:      1030;\n@zindex-modal-background:  1040;\n@zindex-modal:             1050;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n// Note: Deprecated @screen-xs and @screen-phone as of v3.0.1\n@screen-xs:                  480px;\n@screen-xs-min:              @screen-xs;\n@screen-phone:               @screen-xs-min;\n\n// Small screen / tablet\n// Note: Deprecated @screen-sm and @screen-tablet as of v3.0.1\n@screen-sm:                  768px;\n@screen-sm-min:              @screen-sm;\n@screen-tablet:              @screen-sm-min;\n\n// Medium screen / desktop\n// Note: Deprecated @screen-md and @screen-desktop as of v3.0.1\n@screen-md:                  992px;\n@screen-md-min:              @screen-md;\n@screen-desktop:             @screen-md-min;\n\n// Large screen / wide desktop\n// Note: Deprecated @screen-lg and @screen-lg-desktop as of v3.0.1\n@screen-lg:                  1200px;\n@screen-lg-min:              @screen-lg;\n@screen-lg-desktop:          @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max:              (@screen-sm-min - 1);\n@screen-sm-max:              (@screen-md-min - 1);\n@screen-md-max:              (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns:              12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width:         30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint:     @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet:             ((720px + @grid-gutter-width));\n//** For `@screen-sm-min` and up.\n@container-sm:                 @container-tablet;\n\n// Medium screen / desktop\n@container-desktop:            ((940px + @grid-gutter-width));\n//** For `@screen-md-min` and up.\n@container-md:                 @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop:      ((1140px + @grid-gutter-width));\n//** For `@screen-lg-min` and up.\n@container-lg:                 @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height:                    50px;\n@navbar-margin-bottom:             @line-height-computed;\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height:       340px;\n\n@navbar-default-color:             #777;\n@navbar-default-bg:                #f8f8f8;\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color:                #777;\n@navbar-default-link-hover-color:          #333;\n@navbar-default-link-hover-bg:             transparent;\n@navbar-default-link-active-color:         #555;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color:       #ccc;\n@navbar-default-link-disabled-bg:          transparent;\n\n// Navbar brand label\n@navbar-default-brand-color:               @navbar-default-link-color;\n@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg:            transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           #ddd;\n@navbar-default-toggle-icon-bar-bg:        #888;\n@navbar-default-toggle-border-color:       #ddd;\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color:                      @gray-light;\n@navbar-inverse-bg:                         #222;\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 @gray-light;\n@navbar-inverse-link-hover-color:           #fff;\n@navbar-inverse-link-hover-bg:              transparent;\n@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color:        #444;\n@navbar-inverse-link-disabled-bg:           transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color:                @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color:          #fff;\n@navbar-inverse-brand-hover-bg:             transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            #333;\n@navbar-inverse-toggle-icon-bar-bg:         #fff;\n@navbar-inverse-toggle-border-color:        #333;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         @gray-lighter;\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n@nav-open-link-hover-color:                 #fff;\n\n//== Tabs\n@nav-tabs-border-color:                     #ddd;\n\n@nav-tabs-link-hover-border-color:          @gray-lighter;\n\n@nav-tabs-active-link-hover-bg:             @body-bg;\n@nav-tabs-active-link-hover-color:          @gray;\n@nav-tabs-active-link-hover-border-color:   #ddd;\n\n@nav-tabs-justified-link-border-color:            #ddd;\n@nav-tabs-justified-active-link-border-color:     @body-bg;\n\n//== Pills\n@nav-pills-border-radius:                   @border-radius-base;\n@nav-pills-active-link-hover-bg:            @component-active-bg;\n@nav-pills-active-link-hover-color:         @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color:                     @link-color;\n@pagination-bg:                        #fff;\n@pagination-border:                    #ddd;\n\n@pagination-hover-color:               @link-hover-color;\n@pagination-hover-bg:                  @gray-lighter;\n@pagination-hover-border:              #ddd;\n\n@pagination-active-color:              #fff;\n@pagination-active-bg:                 @brand-primary;\n@pagination-active-border:             @brand-primary;\n\n@pagination-disabled-color:            @gray-light;\n@pagination-disabled-bg:               #fff;\n@pagination-disabled-border:           #ddd;\n\n\n//== Pager\n//\n//##\n\n@pager-bg:                             @pagination-bg;\n@pager-border:                         @pagination-border;\n@pager-border-radius:                  15px;\n\n@pager-hover-bg:                       @pagination-hover-bg;\n\n@pager-active-bg:                      @pagination-active-bg;\n@pager-active-color:                   @pagination-active-color;\n\n@pager-disabled-color:                 @pagination-disabled-color;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   @gray-lighter;\n@jumbotron-heading-color:        inherit;\n@jumbotron-font-size:            ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text:             #3c763d;\n@state-success-bg:               #dff0d8;\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text:                #31708f;\n@state-info-bg:                  #d9edf7;\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text:             #8a6d3b;\n@state-warning-bg:               #fcf8e3;\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text:              #a94442;\n@state-danger-bg:                #f2dede;\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width:           200px;\n//** Tooltip text color\n@tooltip-color:               #fff;\n//** Tooltip background color\n@tooltip-bg:                  #000;\n@tooltip-opacity:             .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width:         5px;\n//** Tooltip arrow color\n@tooltip-arrow-color:         @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg:                          #fff;\n//** Popover maximum width\n@popover-max-width:                   276px;\n//** Popover border color\n@popover-border-color:                rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color:       #ccc;\n\n//** Popover title background color\n@popover-title-bg:                    darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width:                 10px;\n//** Popover arrow color\n@popover-arrow-color:                 #fff;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg:            @gray-light;\n//** Primary label background color\n@label-primary-bg:            @brand-primary;\n//** Success label background color\n@label-success-bg:            @brand-success;\n//** Info label background color\n@label-info-bg:               @brand-info;\n//** Warning label background color\n@label-warning-bg:            @brand-warning;\n//** Danger label background color\n@label-danger-bg:             @brand-danger;\n\n//** Default label text color\n@label-color:                 #fff;\n//** Default text color of a linked label\n@label-link-hover-color:      #fff;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding:         20px;\n\n//** Padding applied to the modal title\n@modal-title-padding:         15px;\n//** Modal title line-height\n@modal-title-line-height:     @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg:                             #fff;\n//** Modal content border color\n@modal-content-border-color:                   rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color:          #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg:           #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity:      .5;\n//** Modal header border color\n@modal-header-border-color:   #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color:   @modal-header-border-color;\n\n@modal-lg:                    900px;\n@modal-md:                    600px;\n@modal-sm:                    300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg:                 #f5f5f5;\n//** Progress bar text color\n@progress-bar-color:          #fff;\n\n//** Default progress bar color\n@progress-bar-bg:             @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg:     @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg:     @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg:      @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg:        @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg:                 #fff;\n//** `.list-group-item` border color\n@list-group-border:             #ddd;\n//** List group border radius\n@list-group-border-radius:      @border-radius-base;\n\n//** Background color of single list elements on hover\n@list-group-hover-bg:           #f5f5f5;\n//** Text color of active list elements\n@list-group-active-color:       @component-active-color;\n//** Background color of active list elements\n@list-group-active-bg:          @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border:      @list-group-active-bg;\n@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);\n\n@list-group-link-color:         #555;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg:                    #fff;\n@panel-body-padding:          15px;\n@panel-border-radius:         @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border:          #ddd;\n@panel-footer-bg:             #f5f5f5;\n\n@panel-default-text:          @gray-dark;\n@panel-default-border:        #ddd;\n@panel-default-heading-bg:    #f5f5f5;\n\n@panel-primary-text:          #fff;\n@panel-primary-border:        @brand-primary;\n@panel-primary-heading-bg:    @brand-primary;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @state-success-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-info-text:             @state-info-text;\n@panel-info-border:           @state-info-border;\n@panel-info-heading-bg:       @state-info-bg;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @state-warning-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @state-danger-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding:           4px;\n//** Thumbnail background color\n@thumbnail-bg:                @body-bg;\n//** Thumbnail border color\n@thumbnail-border:            #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius:     @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color:     @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding:   9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg:                     #f5f5f5;\n@well-border:                 darken(@well-bg, 7%);\n\n\n//== Badges\n//\n//##\n\n@badge-color:                 #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color:      #fff;\n@badge-bg:                    @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color:          @link-color;\n//** Badge background color in active nav link\n@badge-active-bg:             #fff;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical:   8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg:                 #f5f5f5;\n//** Breadcrumb text color\n@breadcrumb-color:              #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color:       @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator:          \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      #fff;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                #fff;\n@carousel-indicator-border-color:             #fff;\n\n@carousel-caption-color:                      #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight:           bold;\n@close-color:                 #000;\n@close-text-shadow:           0 1px 0 #fff;\n\n\n//== Code\n//\n//##\n\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@kbd-color:                   #fff;\n@kbd-bg:                      #333;\n\n@pre-bg:                      #f5f5f5;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n\n//== Type\n//\n//##\n\n//** Text muted color\n@text-muted:                  @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color:           @gray-light;\n//** Headings small color\n@headings-small-color:        @gray-light;\n//** Blockquote small color\n@blockquote-small-color:      @gray-light;\n//** Blockquote font size\n@blockquote-font-size:        (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color:     @gray-lighter;\n//** Page header border color\n@page-header-border-color:    @gray-lighter;\n\n\n//== Miscellaneous\n//\n//##\n\n//** Horizontal line color.\n@hr-border:                   @gray-lighter;\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n"
  },
  {
    "path": "test/example_bootstrap/static/bootstrap/wells.less",
    "content": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: @well-bg;\n  border: 1px solid @well-border;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-lg {\n  padding: 24px;\n  border-radius: @border-radius-large;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: @border-radius-small;\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/csrf.js",
    "content": "$('html').ajaxSend(function(event, xhr, settings) {\n    function getCookie(name) {\n        var cookieValue = null;\n        if (document.cookie && document.cookie != '') {\n            var cookies = document.cookie.split(';');\n            for (var i = 0; i < cookies.length; i++) {\n                var cookie = jQuery.trim(cookies[i]);\n                // Does this cookie string begin with the name we want?\n                if (cookie.substring(0, name.length + 1) == (name + '=')) {\n                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));\n                    break;\n                }\n            }\n        }\n        return cookieValue;\n    }\n    if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {\n        // Only send the token to relative URLs i.e. locally.\n        xhr.setRequestHeader(\"X-CSRFToken\", getCookie('csrftoken'));\n    }\n});"
  },
  {
    "path": "test/example_bootstrap/static/example_bootstrap.css",
    "content": "/*! normalize.css v3.0.0 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\nmark {\n  background: #ff0;\n  color: #000;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n  border: 0;\n  padding: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\ntd,\nth {\n  padding: 0;\n}\n@media print {\n  * {\n    text-shadow: none !important;\n    color: #000 !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333333;\n  background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #428bca;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\ncite {\n  font-style: normal;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-muted {\n  color: #999999;\n}\n.text-primary {\n  color: #428bca;\n}\na.text-primary:hover {\n  color: #3071a9;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #428bca;\n}\na.bg-primary:hover {\n  background-color: #3071a9;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #999999;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  white-space: nowrap;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #ffffff;\n  background-color: #333333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.row {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: 0%;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: 0%;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0%;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: 0%;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: 0%;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: 0%;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: 0%;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: 0%;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: 0%;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0%;\n  }\n}\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n.table .table {\n  background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n@media (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    overflow-x: scroll;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #dddddd;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n  color: #999999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\ninput[type=\"date\"] {\n  line-height: 34px;\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  padding-left: 20px;\n}\n.radio label,\n.checkbox label {\n  display: inline;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n  height: auto;\n}\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n  height: auto;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.has-feedback .form-control-feedback {\n  position: absolute;\n  top: 25px;\n  right: 0;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  border-color: #3c763d;\n  background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.form-control-static {\n  margin-bottom: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-left: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n.form-horizontal .form-control-static {\n  padding-top: 7px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  top: 0;\n  right: 15px;\n}\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  outline: 0;\n  background-image: none;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  pointer-events: none;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n.btn-default .badge {\n  color: #ffffff;\n  background-color: #333333;\n}\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n.btn-primary .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #ffffff;\n}\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #ffffff;\n}\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #ffffff;\n}\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #ffffff;\n}\n.btn-link {\n  color: #428bca;\n  font-weight: normal;\n  cursor: pointer;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n  transition: height 0.35s ease;\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 14px;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  outline: 0;\n  background-color: #428bca;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  left: auto;\n  right: 0;\n}\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #999999;\n}\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    left: auto;\n    right: 0;\n  }\n  .navbar-right .dropdown-menu-left {\n    left: 0;\n    right: auto;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-bottom-left-radius: 4px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  float: none;\n  display: table-cell;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n  color: #999999;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #428bca;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  max-height: 340px;\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n  height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: none;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n  .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n.navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-left: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n  .navbar-form.navbar-right:last-child {\n    margin-right: -15px;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-left: 15px;\n    margin-right: 15px;\n  }\n  .navbar-text.navbar-right:last-child {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  background-color: #e7e7e7;\n  color: #555555;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  background-color: #080808;\n  color: #ffffff;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #999999;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  content: \"/\\00a0\";\n  padding: 0 5px;\n  color: #cccccc;\n}\n.breadcrumb > .active {\n  color: #999999;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  line-height: 1.42857143;\n  text-decoration: none;\n  color: #428bca;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-bottom-right-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #2a6496;\n  background-color: #eeeeee;\n  border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n  cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #999999;\n  background-color: #ffffff;\n  border-color: #dddddd;\n  cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 6px;\n  border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  background-color: #ffffff;\n  cursor: not-allowed;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #999999;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n.label-primary {\n  background-color: #428bca;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #ffffff;\n  line-height: 1;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #999999;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.container .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-left: auto;\n  margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #428bca;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable {\n  padding-right: 35px;\n}\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #3c763d;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress-striped .progress-bar {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-object {\n  display: block;\n}\n.media-heading {\n  margin: 0 0 5px;\n}\n.media > .pull-left {\n  margin-right: 10px;\n}\n.media > .pull-right {\n  margin-left: 10px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  margin-bottom: 20px;\n  padding-left: 0;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\na.list-group-item {\n  color: #555555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\na.list-group-item.active,\na.list-group-item.active:hover,\na.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\na.list-group-item.active .list-group-item-heading,\na.list-group-item.active:hover .list-group-item-heading,\na.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item.active .list-group-item-text,\na.list-group-item.active:hover .list-group-item-text,\na.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table {\n  margin-bottom: 0;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive {\n  border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n  overflow: hidden;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n  border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n.panel-primary {\n  border-color: #428bca;\n}\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n  outline: none;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n  min-height: 16.42857143px;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n.modal-footer {\n  margin-top: 15px;\n  padding: 19px 20px 20px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  visibility: visible;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.tooltip.top {\n  margin-top: -3px;\n  padding: 5px 0;\n}\n.tooltip.right {\n  margin-left: 3px;\n  padding: 0 5px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n  padding: 5px 0;\n}\n.tooltip.left {\n  margin-left: -3px;\n  padding: 0 5px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  background-color: #ffffff;\n  background-clip: padding-box;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  white-space: normal;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top > .arrow:after {\n  content: \" \";\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n  content: \" \";\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom > .arrow:after {\n  content: \" \";\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n  content: \" \";\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #ffffff;\n  bottom: -10px;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%));\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n  left: auto;\n  right: 0;\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%));\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  outline: none;\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n  margin: 0;\n  width: 12px;\n  height: 12px;\n  background-color: #ffffff;\n}\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  content: \" \";\n  display: table;\n}\n.clearfix:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/* --- Topic/Forum table --- */\n.forum-description {\n  margin: 5px;\n  font-size: 12px;\n}\n.forum-row,\n.topic-row {\n  width: 100%;\n}\n.forum-name,\n.topic-name {\n  width: 40%;\n}\n.forum-topic-count,\n.forum-post-count,\n.topic-post-count,\n.topic-view-count {\n  width: 16%;\n  text-align: center;\n}\n.forum-last-post,\n.topic-last-post {\n  width: 20%;\n}\n.first-unread-post-link,\n.first-unread-post-link:hover {\n  color: #333333;\n  text-decoration: none;\n}\n.forum-headline {\n  margin-top: 10px;\n}\n.attachments-form {\n  padding-bottom: 15px;\n}\n.attachment-link {\n  border-bottom: 1px dotted;\n}\n/* --- Unread --- */\n.state-indicator {\n  display: block;\n  float: left;\n  background-color: #eeeeee;\n  height: 10px;\n  width: 10px;\n  border-radius: 4px;\n  margin: 3px 5px;\n}\n.topic-unread a,\n.forum-unread a {\n  font-weight: bold;\n}\n.topic-unread .state-indicator,\n.forum-unread .state-indicator {\n  background-color: #5bc0de;\n}\n/* --- Moderation --- */\n.on-moderation {\n  background: #ffcccc;\n}\n/* --- Mini pagination --- */\n.mini-pagination {\n  padding: 3px 0 3px 10px;\n  font-size: 12px;\n}\n.post {\n  margin: 3px 0 5px 0;\n}\n.post-header {\n  padding: 3px 0 3px 20px;\n  font-size: 12px;\n  background-color: #f5f5f5;\n}\n.post tbody tr:hover td {\n  background-color: inherit;\n}\n.post-info {\n  width: 200px;\n  padding: 10px;\n}\n.post-info .post-author {\n  font-size: 15px;\n  padding: 5px 0;\n}\n.post-info .post-extra-info {\n  font-size: 12px;\n  color: #999999;\n}\n.post-info .post-controls {\n  font-size: 12px;\n}\n.post-content {\n  vertical-align: top;\n  padding: 10px;\n}\n.post-signature {\n  color: #CCC;\n  margin-top: 15px;\n  border-top: 1px dotted #CCC;\n  display: block;\n}\n.post-related {\n  margin-top: 20px;\n}\n"
  },
  {
    "path": "test/example_bootstrap/static/example_bootstrap.less",
    "content": "@import \"bootstrap/bootstrap.less\";\n@import \"../../../pybb/static/pybb/forum3.less\";\n@import \"../../../pybb/static/pybb/visual3.less\";\n@import \"../../../pybb/static/pybb/posts3.less\";\n\n\n\n\n\n"
  },
  {
    "path": "test/example_bootstrap/templates/404.html",
    "content": "{% extends \"base.html\" %}\n\n\n{% block content %}\n    Page does not exist\n{% endblock %}"
  },
  {
    "path": "test/example_bootstrap/templates/base.html",
    "content": "{% extends \"bootstrap_base.html\" %}"
  },
  {
    "path": "test/example_bootstrap/templates/bootstrap_base.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"content-type\" content=\"application/html; charset=utf-8\">\n    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->\n    <!--[if lt IE 9]>\n            <script src=\"http://html5shim.googlecode.com/svn/trunk/html5.js\"></script>\n    <![endif]-->\n    <link rel=\"stylesheet\" href=\"{{ STATIC_URL }}example_bootstrap.css\" type='text/css'>\n    <link rel=\"stylesheet\" href=\"http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/themes/smoothness/jquery-ui.css\" type=\"text/css\"/>\n\n    <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js\"></script>\n    <script src=\"https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js\"></script>\n    <script src=\"http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/i18n/jquery-ui-i18n.min.js\"></script>\n    <script src=\"http://yandex.st/json2/2011-01-18/json2.min.js\"></script>\n    <script src=\"{{ STATIC_URL }}csrf.js\"></script>\n    <script type=\"text/javascript\" src=\"{{ STATIC_URL }}pybb/js/pybbjs.js\"></script>\n    <style type=\"text/css\">\n        body {\n            padding-top: -60px;\n        }\n    </style>\n    {% block extra_style %}{% endblock %}\n\n    <title>{% block title %}{% endblock %}</title>\n\n    {% block extra_head %}{% endblock %}\n    {% block extra_script %}{% endblock %}\n</head>\n<body>\n\n<div class=\"navbar navbar-default\" role=\"navigation\">\n    <div class=\"container\">\n        <div class=\"navbar-header\">\n            <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\"#navbar-pybbm\">\n                <span class=\"sr-only\">Toggle navigation</span>\n                <span class=\"icon-bar\"></span>\n                <span class=\"icon-bar\"></span>\n                <span class=\"icon-bar\"></span>\n            </button>\n            <a class=\"navbar-brand\" href=\"/\">PYBB Modified. Django forum solution.</a>\n        </div>\n        <div class=\"collapse navbar-collapse\" id=\"navbar-pybbm\">\n            <ul class=\"nav navbar-nav\">\n                {% if request.user.is_authenticated %}\n                    <li>\n                        <a href=\"{% url 'pybb:edit_profile' %}\">Profile [logged as {{ request.user.username }}]</a>\n                    </li>\n                    <li>\n                        <a href=\"{% url 'auth_logout' %}\">Logout</a>\n                    </li>\n                    {% if request.user.is_superuser %}\n                        <li>\n                            <a href=\"{% url 'admin:index' %}\">Admin interface</a>\n                        </li>\n                    {% endif %}\n                {% else %}\n                    <li>\n                        <a href=\"{% url 'auth_login' %}\">Login</a>\n                    </li>\n                    <li>\n                        <a href=\"{% url 'registration_register' %}\">Register</a>\n                    </li>\n                {% endif %}\n                <li><a href=\"http://github.com/hovel/pybbm\">Code</a></li>\n                <li><a href=\"http://pypi.python.org/pypi/pybbm\">Download</a></li>\n                <li><a href=\"http://readthedocs.org/docs/pybbm/en/latest/\">Documentation</a></li>\n            </ul>\n        </div>\n    </div>\n</div>\n\n<div class=\"container\">\n    <div class=\"jumbotron\">\n        {% if messages %}\n            <ul class=\"messages\">\n                {% for message in messages %}\n                    <li{% if message.tags %} class=\"{{ message.tags }}\"{% endif %}>{{ message }}</li>\n                {% endfor %}\n            </ul>\n        {% endif %}\n        {% if request.path != '/' %}\n            <div id=\"breadcrumb\">\n                {% block breadcrumb %}\n                    <a href=\"/\">Main</a>\n                {% endblock breadcrumb %}\n            </div>\n        {% endif %}\n        {% if request.path == '/' %}\n            <div class='forum-headline alert alert-block'>\n                This is a default installation of PyBBModified with default theme from example.\n            </div>\n        {% endif %}\n        <div id=\"content\">\n            {% block content %}\n            {% endblock content %}\n        </div>\n    </div>\n    {% if request.path == '/' %}\n        <div class=\"row\">\n            <div class=\"col-md-4\">\n                <h2>Fully Documented</h2>\n\n                <p>Everything explained</p>\n\n                <p><a class=\"btn btn-default\" href=\"http://readthedocs.org/docs/pybbm/en/latest/\">Read docs now &raquo;</a></p>\n            </div>\n            <div class=\"col-md-4\">\n                <h2>Heavily tested</h2>\n\n                <p> 95% code coverage!</p>\n\n                <p><a class=\"btn btn-default\" href=\"https://github.com/hovel/pybbm/blob/master/pybb/tests.py\">View tests &raquo;</a>\n                </p>\n            </div>\n            <div class=\"col-md-4\">\n                <h2>Want a fast start?</h2>\n\n                <p>Start from ready to use example project</p>\n\n                <p><a class=\"btn btn-default\" href=\"http://readthedocs.org/docs/pybbm/en/latest/example.html\">Read more &raquo;</a>\n                </p>\n            </div>\n        </div>\n\n        <div class=\"row spaced\">\n            <div class=\"col-md-4\">\n                <h2>Django application</h2>\n\n                <p>Easy to embed to any django project</p>\n\n                <p>\n                    <a class=\"btn btn-success\" href=\"http://readthedocs.org/docs/pybbm/en/latest/install.html\">Learn how to install &raquo;</a>\n                </p>\n            </div>\n            <div class=\"col-md-4\">\n                <h2>Help welcomed</h2>\n\n                <p>Extended PyBBM? Push your changes.</p>\n\n                <p><a class=\"btn btn-default\" href=\"https://github.com/hovel/pybbm\">Fork repo &raquo;</a></p>\n            </div>\n        </div>\n    {% endif %}\n\n    <footer>\n        powered by:\n        <a href=\"http://www.djangoproject.com\">django</a>,&nbsp;\n        <a href=\"http://www.pybbm.org\">pybbm</a>\n    </footer>\n\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "test/example_bootstrap/templates/pybb/breadcrumb.html",
    "content": "{% load i18n pybb_tags %}\n<ul class='breadcrumb'>\n    {% include \"pybb/breadcrumb_top_extra_crumb.html\" %}\n    <li><a href=\"{% url 'pybb:index' %}\">{% trans \"Home\" %}</a></li>\n    {% if object %}\n        {% if object.get_parents %}\n            {% for obj in object.get_parents %}\n                <li>{% pybb_link obj %}</li>\n            {% endfor %}\n        {% endif %}\n        {% if extra_crumb %}\n            <li>{% pybb_link object %}</li>\n        {% else %}\n            <li>{{ object }}</li>\n        {% endif %}\n    {% endif %}\n    {% if extra_crumb %}\n        <li>{% trans extra_crumb %}</li>\n    {% endif %}\n</ul>\n"
  },
  {
    "path": "test/example_bootstrap/templates/pybb/form_field.html",
    "content": "{% load pybb_tags %}\n\n<div class=\"{% if field.is_required %}required{% endif %} {% if field.errors %}error{% endif %}\">\n    {% if not hide_labels or hide_labels == 0 %}\n        <label for=\"{{ field.auto_id }}\">\n            {{ field.field.label }}\n        </label>\n    {% endif %}\n    <div>\n        {{ field }}\n        {% for error in field.errors %}\n            <span class=\"field-errors\">{{ field.errors }}</span>\n        {% endfor %}\n    </div>\n</div>"
  },
  {
    "path": "test/example_bootstrap/templates/registration/activate.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}\n    {% if account %}\n        Activation complete\n    {% else %}\n        Activation failed\n    {% endif %}\n{% endblock %}\n\n\n{% block content %}\n\n    {% if account %}\n        <h2>Activation complete</h2>\n        Your account is ready to use!\n    {% else %}\n        <h2>Activation failed</h2>\n    {% endif %}\n\n{% endblock %}"
  },
  {
    "path": "test/example_bootstrap/templates/registration/activation_complete.html",
    "content": "{% extends \"activate.html\" %}"
  },
  {
    "path": "test/example_bootstrap/templates/registration/activation_email.txt",
    "content": "Someone (probaly you) register on {{site}} with this e-mail address. If it's not you ignore this e-mail.\n\nTo activate your account follow this link:\nhttp://{{site}}/accounts/activate/{{activation_key}}/\nwith next {{expiration_days}} days.\n"
  },
  {
    "path": "test/example_bootstrap/templates/registration/activation_email_subject.txt",
    "content": "Registration on {{site}}!"
  },
  {
    "path": "test/example_bootstrap/templates/registration/login.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}\n    Login\n{% endblock %}\n\n{% block content %}\n\n    <h2>Login on site</h2>\n\n    <form action='' method=POST class=\"form-stacked\">\n    <table>\n            {{form.as_p}}\n    </table>\n    {% csrf_token %}\n       <input type=\"submit\">\n    </form>\n\n    <p>\n        <b>Don't have an account?</b> <a href=\"{% url 'registration_register' %}\">Register</a>\n    </p>\n\n{% endblock %}\n"
  },
  {
    "path": "test/example_bootstrap/templates/registration/logout.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}\n    Logout successful\n{% endblock %}\n\n{% block content %}\n\n    <h2>Logout successful</h2>\n\n{% endblock %}"
  },
  {
    "path": "test/example_bootstrap/templates/registration/registration_complete.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}\n    Registration complete\n{% endblock %}\n\n{% block content %}\n\n    <h2>Registration complete</h2>\n\n    <p>You should activate your account now.</p>\n    <p>E-mail with instructions was sent to your e-mail address.</p>\n\n{% endblock %}"
  },
  {
    "path": "test/example_bootstrap/templates/registration/registration_form.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}\n    Register on site\n{% endblock %}\n\n\n{% block content %}\n\n    <h2>Register</h2>\n\n    <form action='' method=POST class=\"form-stacked\">\n    {{ form.as_p }}\n    {% csrf_token %}\n\t<input type=submit>\n    </form>\n\n{% endblock %}"
  },
  {
    "path": "test/example_thirdparty/example_thirdparty/__init__.py",
    "content": ""
  },
  {
    "path": "test/example_thirdparty/example_thirdparty/forms.py",
    "content": "from account.forms import SignupForm\nfrom captcha.fields import CaptchaField\n\n\nclass SignupFormWithCaptcha(SignupForm):\n    captcha = CaptchaField()"
  },
  {
    "path": "test/example_thirdparty/example_thirdparty/settings.py",
    "content": "# Django settings for example project.\nimport os\n\nBASE_DIR = os.path.dirname(os.path.dirname(__file__))\n\nDEBUG = True\n\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.sqlite3',\n        'NAME': os.path.join(BASE_DIR, 'testdb.sqlite'),\n    }\n}\n\nTIME_ZONE = 'UTC'\nLANGUAGE_CODE = 'en-us'\nSITE_ID = 1\n\nUSE_I18N = True\nUSE_L10N = True\n\nUSE_TZ = True\n\nMEDIA_ROOT = os.path.join(BASE_DIR, 'media')\nMEDIA_URL = '/media/'\n\nSTATIC_ROOT = os.path.join(BASE_DIR, 'static_collected')\nSTATIC_URL = '/static/'\n\nSTATICFILES_DIRS = (\n    os.path.join(BASE_DIR, 'static'),\n)\n\nSTATICFILES_FINDERS = (\n    'django.contrib.staticfiles.finders.FileSystemFinder',\n    'django.contrib.staticfiles.finders.AppDirectoriesFinder',\n)\n\nSECRET_KEY = '0t!z!jzl#o%4=#!it5!4pgge_!9_$2v*l-(jdn++!_sxn)+$wl'\n\nTEMPLATES = [\n    {\n        'BACKEND': 'django.template.backends.django.DjangoTemplates',\n        'APP_DIRS': True,\n        'DIRS': [\n            os.path.join(BASE_DIR, 'templates'),\n        ],\n        'OPTIONS': {\n            'context_processors': [\n                'django.template.context_processors.debug',\n                'django.template.context_processors.request',\n                'django.contrib.auth.context_processors.auth',\n                # 'django.contrib.messages.context_processors.messages',\n                'django.template.context_processors.i18n',\n                'django.template.context_processors.media',\n                'django.template.context_processors.static',\n                'django.template.context_processors.tz',\n                'pybb.context_processors.processor',\n            ],\n        },\n    },\n]\n\nMIDDLEWARE = (\n    'django.middleware.common.CommonMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n    'account.middleware.LocaleMiddleware',\n    'pybb.middleware.PybbMiddleware',\n)\n\nROOT_URLCONF = 'example_thirdparty.urls'\n\nWSGI_APPLICATION = 'example_thirdparty.wsgi.application'\n\nINSTALLED_APPS = (\n    'django.contrib.auth',\n    'django.contrib.contenttypes',\n    'django.contrib.sessions',\n    'django.contrib.sites',\n    'django.contrib.messages',\n    'django.contrib.staticfiles',\n    'django.contrib.admin',\n    'pybb.apps.PybbConfig',\n    'sorl.thumbnail',\n    'pure_pagination',\n    'account',\n    'pinax_theme_bootstrap',\n    'bootstrapform',\n    'captcha',\n)\n\nAUTH_PROFILE_MODULE = 'pybb.Profile'\n\nEMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'\n\n# Pybb\nPYBB_TEMPLATE = \"site_base.html\"\nPYBB_ATTACHMENT_ENABLE = True\n"
  },
  {
    "path": "test/example_thirdparty/example_thirdparty/urls.py",
    "content": "\nimport django\nfrom account.views import ChangePasswordView, SignupView, LoginView\nfrom django.urls import include, re_path\nfrom django.contrib import admin\nfrom example_thirdparty.forms import SignupFormWithCaptcha\n\nurlpatterns = [\n    re_path(r'^admin/', include(admin.site.urls) if django.VERSION < (1, 10) else admin.site.urls),\n\n    # aliases to match original django-registration urls\n    re_path(r\"^accounts/password/$\", ChangePasswordView.as_view(),\n        name=\"auth_password_change\"),\n    re_path(r\"^accounts/signup/$\",\n        SignupView.as_view(form_class=SignupFormWithCaptcha),\n        name=\"registration_register\"),\n    re_path(r\"^accounts/login/$\", LoginView.as_view(), name=\"auth_login\"),\n\n    re_path(r'^accounts/', include('account.urls')),\n    re_path(r'^captcha/', include('captcha.urls')),\n    re_path(r'^', include('pybb.urls', namespace='pybb')),\n]\n"
  },
  {
    "path": "test/example_thirdparty/example_thirdparty/wsgi.py",
    "content": "import os\nos.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"example_thirparty.settings\")\n\nfrom django.core.wsgi import get_wsgi_application\napplication = get_wsgi_application()\n\n"
  },
  {
    "path": "test/example_thirdparty/manage.py",
    "content": "#!/usr/bin/env python\nimport os\nimport sys\n\nif __name__ == \"__main__\":\n    os.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"example_thirdparty.settings\")\n\n    from django.core.management import execute_from_command_line\n\n    execute_from_command_line(sys.argv)\n"
  },
  {
    "path": "test/example_thirdparty/requirements.txt",
    "content": "django>=1.8,<1.11\npillow\n\nMarkdown\npostmarkup\n\n# TODO: remove dependencies\ndjango-annoying\ndjango-pure-pagination\nsorl-thumbnail\nunidecode\n\n# Theme, templates and authentication\ndjango-simple-captcha\npinax-theme-bootstrap<6.0\ndjango-bootstrap-form\ndjango-user-accounts\n"
  },
  {
    "path": "test/example_thirdparty/templates/pybb/breadcrumb.html",
    "content": "{% load i18n pybb_tags %}\n<ul class='breadcrumb'>\n    {% include \"pybb/breadcrumb_top_extra_crumb.html\" %}\n    <li><a href=\"{% url 'pybb:index' %}\">{% trans \"Home\" %}</a></li>\n    {% if object %}\n        {% if object.get_parents %}\n            {% for obj in object.get_parents %}\n                <li>{% pybb_link obj %}</li>\n            {% endfor %}\n        {% endif %}\n        {% if extra_crumb %}\n            <li>{% pybb_link object %}</li>\n        {% else %}\n            <li>{{ object }}</li>\n        {% endif %}\n    {% endif %}\n    {% if extra_crumb %}\n        <li>{% trans extra_crumb %}</li>\n    {% endif %}\n</ul>\n"
  },
  {
    "path": "test/example_thirdparty/templates/pybb/form.html",
    "content": "{% load bootstrap %}\n{% csrf_token %}\n\n{{ form|bootstrap }}\n\n<input type=\"hidden\" name=\"next\" value=\"{{ next }}\" />\n"
  },
  {
    "path": "test/example_thirdparty/templates/pybb/form_field.html",
    "content": "{% load bootstrap %}\n\n{{ field|bootstrap }}"
  },
  {
    "path": "test/example_thirdparty/templates/site_base.html",
    "content": "{% extends \"theme_bootstrap/base.html\" %}\n{% load static %}\n{% block head_title %}{% block title %}{% endblock %}{% endblock %}\n\n{% block script_base %}\n{{ block.super }}\n<script type=\"text/javascript\" src=\"{% static 'pybb/js/pybbjs.js' %}\"></script>\n{% endblock %}\n\n{% block site_brand %}\n<a class=\"navbar-brand\" href=\"/\">PYBB Modified. Django forum solution.</a>\n{% endblock %}\n\n{% block nav %}\n<ul class=\"nav navbar-nav\">\n    <li><a href=\"http://github.com/hovel/pybbm\">Code</a></li>\n    <li><a href=\"http://pypi.python.org/pypi/pybbm\">Download</a></li>\n    <li><a href=\"http://readthedocs.org/docs/pybbm/en/latest/\">Documentation</a></li>\n</ul>\n{% endblock %}\n\n{% block body %}\n    <!-- Main hero unit for a primary marketing message or call to action -->\n    <div class=\"main-block\">\n        {% if request.path != '/' %}\n            <div id=\"breadcrumb\">\n                {% block breadcrumb %}\n                    <a href=\"/\">Main</a>\n                {% endblock breadcrumb %}\n            </div>\n        {% endif %}\n        {% if request.path == '/' %}\n            <div class='forum-headline alert alert-block'>\n                This is a default installation of PyBBModified with default theme from example.\n            </div>\n        {% endif %}\n        <div id=\"content\">\n            {% block content %}{% endblock %}\n        </div>\n    </div>\n    {% if request.path == '/' %}\n        <div class=\"row\">\n            <div class=\"col-lg-4\">\n                <h2>Fully Documented</h2>\n                <p>Everything explained</p>\n                <p><a class=\"btn btn-default\" href=\"http://readthedocs.org/docs/pybbm/en/latest/\">Read docs now &raquo;</a></p>\n            </div>\n            <div class=\"col-lg-4\">\n                <h2>Heavily tested</h2>\n                <p> 95% code coverage!</p>\n                <p><a class=\"btn btn-default\" href=\"https://github.com/hovel/pybbm/blob/master/pybb/tests.py\">View tests &raquo;</a></p>\n            </div>\n            <div class=\"col-lg-4\">\n                <h2>Want a fast start?</h2>\n                <p>Start from ready to use example project</p>\n                <p><a class=\"btn btn-default\" href=\"http://readthedocs.org/docs/pybbm/en/latest/example.html\">Read more &raquo;</a></p>\n            </div>\n        </div>\n\n        <div class=\"row\">\n            <div class=\"col-lg-4\">\n                <h2>Django application</h2>\n                <p>Easy to embed to any django project</p>\n                <p><a class=\"btn btn-success\" href=\"http://readthedocs.org/docs/pybbm/en/latest/install.html\">Learn how to install &raquo;</a></p>\n            </div>\n            <div class=\"col-lg-4\">\n                <h2>Help welcomed</h2>\n                <p>Extended PyBBM? Push your changes.</p>\n                <p><a class=\"btn btn-default\" href=\"https://github.com/hovel/pybbm\">Fork repo &raquo;</a></p>\n            </div>\n        </div>\n    {% endif %}\n{% endblock %}\n\n{% block footer %}\n<footer>\n    powered by:\n    <a href=\"http://www.djangoproject.com\">django</a>,&nbsp;\n    <a href=\"http://www.pybbm.org\">pybbm</a>\n</footer>\n{% endblock %}\n"
  },
  {
    "path": "test/test_project/manage.py",
    "content": "#!/usr/bin/env python\nimport os\nimport sys\n\nif __name__ == \"__main__\":\n    os.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"test_project.settings\")\n\n    from django.core.management import execute_from_command_line\n\n    execute_from_command_line(sys.argv)\n"
  },
  {
    "path": "test/test_project/requirements_test.txt",
    "content": "bbcode\ndjango\ndjango-annoying\nlxml\nmarkdown\nPillow\nunidecode\n"
  },
  {
    "path": "test/test_project/templates/404.html",
    "content": "<html>\n<head><title>404</title></head>\n<body>404 template for Django 1.4</body>\n</html>\n"
  },
  {
    "path": "test/test_project/templates/base.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  {% block extra_style %}{% endblock %}\n  <title>{% block title %}{% endblock %}</title>\n  {% block extra_head %}{% endblock %}\n  {% block extra_script %}{% endblock %}\n</head>\n<body>\n{% block breadcrumb %}\n{% endblock breadcrumb %}\n{% block content %}\n{% endblock content %}\n</body>\n</html>\n"
  },
  {
    "path": "test/test_project/templates/pybb/_need_to_login_message.html",
    "content": "login, please"
  },
  {
    "path": "test/test_project/templates/pybb/edit_profile.html",
    "content": "<form method=\"post\" enctype=\"multipart/form-data\" class=\"profile-edit\">\n    {% csrf_token %}\n    {{ form }}\n</form>\n"
  },
  {
    "path": "test/test_project/test_app/__init__.py",
    "content": ""
  },
  {
    "path": "test/test_project/test_app/apps.py",
    "content": "from django.apps import AppConfig\nfrom django.utils.translation import gettext_lazy as _\n\n\nclass TestApp(AppConfig):\n    name = 'test_app'\n    verbose_name = _('Pybbm Test App')\n    default_auto_field = 'django.db.models.AutoField'\n"
  },
  {
    "path": "test/test_project/test_app/migrations/0001_initial.py",
    "content": "\nfrom django.db import models, migrations\nimport django.utils.timezone\nfrom django.conf import settings\nimport pybb.util\nfrom pybb.compat import get_image_field_class\n\n\nclass Migration(migrations.Migration):\n\n    dependencies = [\n        ('auth', '0001_initial'),\n    ]\n\n    operations = [\n        migrations.CreateModel(\n            name='CustomUser',\n            fields=[\n                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),\n                ('password', models.CharField(max_length=128, verbose_name='password')),\n                ('last_login', models.DateTimeField(null=True, verbose_name='last login', blank=True)),\n                ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),\n                ('username', models.CharField(unique=True, max_length=100, verbose_name='username')),\n                ('email', models.EmailField(max_length=254, verbose_name='email')),\n                ('is_staff', models.BooleanField(default=False, verbose_name='staff')),\n                ('is_active', models.BooleanField(default=True, verbose_name='active')),\n                ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),\n                ('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', verbose_name='groups')),\n                ('user_permissions', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Permission', blank=True, help_text='Specific permissions for this user.', verbose_name='user permissions')),\n            ],\n            options={\n                'abstract': False,\n            },\n        ),\n        migrations.CreateModel(\n            name='CustomProfile',\n            fields=[\n                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),\n                ('signature', models.TextField(max_length=1024, verbose_name='Signature', blank=True)),\n                ('signature_html', models.TextField(max_length=1054, verbose_name='Signature HTML Version', blank=True)),\n                ('time_zone', models.FloatField(default=3.0, verbose_name='Time zone', choices=[(-12.0, b'-12'), (-11.0, b'-11'), (-10.0, b'-10'), (-9.5, b'-09.5'), (-9.0, b'-09'), (-8.5, b'-08.5'), (-8.0, b'-08 PST'), (-7.0, b'-07 MST'), (-6.0, b'-06 CST'), (-5.0, b'-05 EST'), (-4.0, b'-04 AST'), (-3.5, b'-03.5'), (-3.0, b'-03 ADT'), (-2.0, b'-02'), (-1.0, b'-01'), (0.0, b'00 GMT'), (1.0, b'+01 CET'), (2.0, b'+02'), (3.0, b'+03'), (3.5, b'+03.5'), (4.0, b'+04'), (4.5, b'+04.5'), (5.0, b'+05'), (5.5, b'+05.5'), (6.0, b'+06'), (6.5, b'+06.5'), (7.0, b'+07'), (8.0, b'+08'), (9.0, b'+09'), (9.5, b'+09.5'), (10.0, b'+10'), (10.5, b'+10.5'), (11.0, b'+11'), (11.5, b'+11.5'), (12.0, b'+12'), (13.0, b'+13'), (14.0, b'+14')])),\n                ('language', models.CharField(default=b'en', max_length=10, verbose_name='Language', blank=True, choices=[(b'af', b'Afrikaans'), (b'ar', b'Arabic'), (b'ast', b'Asturian'), (b'az', b'Azerbaijani'), (b'bg', b'Bulgarian'), (b'be', b'Belarusian'), (b'bn', b'Bengali'), (b'br', b'Breton'), (b'bs', b'Bosnian'), (b'ca', b'Catalan'), (b'cs', b'Czech'), (b'cy', b'Welsh'), (b'da', b'Danish'), (b'de', b'German'), (b'el', b'Greek'), (b'en', b'English'), (b'en-au', b'Australian English'), (b'en-gb', b'British English'), (b'eo', b'Esperanto'), (b'es', b'Spanish'), (b'es-ar', b'Argentinian Spanish'), (b'es-mx', b'Mexican Spanish'), (b'es-ni', b'Nicaraguan Spanish'), (b'es-ve', b'Venezuelan Spanish'), (b'et', b'Estonian'), (b'eu', b'Basque'), (b'fa', b'Persian'), (b'fi', b'Finnish'), (b'fr', b'French'), (b'fy', b'Frisian'), (b'ga', b'Irish'), (b'gl', b'Galician'), (b'he', b'Hebrew'), (b'hi', b'Hindi'), (b'hr', b'Croatian'), (b'hu', b'Hungarian'), (b'ia', b'Interlingua'), (b'id', b'Indonesian'), (b'io', b'Ido'), (b'is', b'Icelandic'), (b'it', b'Italian'), (b'ja', b'Japanese'), (b'ka', b'Georgian'), (b'kk', b'Kazakh'), (b'km', b'Khmer'), (b'kn', b'Kannada'), (b'ko', b'Korean'), (b'lb', b'Luxembourgish'), (b'lt', b'Lithuanian'), (b'lv', b'Latvian'), (b'mk', b'Macedonian'), (b'ml', b'Malayalam'), (b'mn', b'Mongolian'), (b'mr', b'Marathi'), (b'my', b'Burmese'), (b'nb', b'Norwegian Bokmal'), (b'ne', b'Nepali'), (b'nl', b'Dutch'), (b'nn', b'Norwegian Nynorsk'), (b'os', b'Ossetic'), (b'pa', b'Punjabi'), (b'pl', b'Polish'), (b'pt', b'Portuguese'), (b'pt-br', b'Brazilian Portuguese'), (b'ro', b'Romanian'), (b'ru', b'Russian'), (b'sk', b'Slovak'), (b'sl', b'Slovenian'), (b'sq', b'Albanian'), (b'sr', b'Serbian'), (b'sr-latn', b'Serbian Latin'), (b'sv', b'Swedish'), (b'sw', b'Swahili'), (b'ta', b'Tamil'), (b'te', b'Telugu'), (b'th', b'Thai'), (b'tr', b'Turkish'), (b'tt', b'Tatar'), (b'udm', b'Udmurt'), (b'uk', b'Ukrainian'), (b'ur', b'Urdu'), (b'vi', b'Vietnamese'), (b'zh-cn', b'Simplified Chinese'), (b'zh-hans', b'Simplified Chinese'), (b'zh-hant', b'Traditional Chinese'), (b'zh-tw', b'Traditional Chinese')])),\n                ('show_signatures', models.BooleanField(default=True, verbose_name='Show signatures')),\n                ('post_count', models.IntegerField(default=0, verbose_name='Post count', blank=True)),\n                ('avatar', get_image_field_class()(upload_to=pybb.util.FilePathGenerator(to=b'pybb/avatar'), null=True, verbose_name='Avatar', blank=True)),\n                ('autosubscribe', models.BooleanField(default=True, help_text='Automatically subscribe to topics that you answer', verbose_name='Automatically subscribe')),\n                ('user', models.OneToOneField(related_name='pybb_customprofile', on_delete=models.CASCADE, verbose_name='linked account', to=settings.AUTH_USER_MODEL)),\n            ],\n            options={\n                'verbose_name': 'Profile',\n                'verbose_name_plural': 'Profiles',\n            },\n        ),\n    ]\n"
  },
  {
    "path": "test/test_project/test_app/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "test/test_project/test_app/models.py",
    "content": "\nfrom django.urls import reverse\nfrom django.db import models\n\nfrom pybb.compat import get_user_model_path, get_username_field\nfrom pybb.profiles import PybbProfile\n\nfrom django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager\nfrom django.utils import timezone\n\nclass CustomUserManager(BaseUserManager):\n    def create_user(self, username, email=None, password=None, **extra_fields):\n        \"\"\"\n        Creates and saves a User with the given username, email and password.\n        \"\"\"\n        email = BaseUserManager.normalize_email(email)\n        user = self.model(username=username, email=email, is_staff=False, is_active=True, is_superuser=False)\n\n        user.set_password(password)\n        user.save(using=self._db)\n        return user\n\nclass CustomUser(AbstractBaseUser, PermissionsMixin):\n    username = models.CharField('username', unique=True, max_length=100)\n    email = models.EmailField('email')\n    is_staff = models.BooleanField('staff', default=False)\n    is_active = models.BooleanField('active', default=True)\n    date_joined = models.DateTimeField('date joined', default=timezone.now)\n\n    USERNAME_FIELD = 'username'\n\n    objects = CustomUserManager()\n\n    class Meta:\n        abstract = False\n\n\nclass CustomProfile(PybbProfile):\n    user = models.OneToOneField(\n        get_user_model_path(),\n        on_delete=models.CASCADE,\n        verbose_name='linked account',\n        related_name='pybb_customprofile',\n        blank=False, null=False,\n    )\n\n    class Meta(object):\n        verbose_name = 'Profile'\n        verbose_name_plural = 'Profiles'\n\n    def get_absolute_url(self):\n        return reverse('pybb:user', kwargs={'username': getattr(self.user, get_username_field())})\n\n    def get_display_name(self):\n        return self.user.get_username()\n"
  },
  {
    "path": "test/test_project/test_project/__init__.py",
    "content": ""
  },
  {
    "path": "test/test_project/test_project/markup_parsers.py",
    "content": "\nfrom pybb.markup.base import BaseParser\nfrom pybb.markup.bbcode import BBCodeParser\n\n\nclass CustomBBCodeParser(BBCodeParser):\n    def __init__(self):\n        super(CustomBBCodeParser, self).__init__()\n        self._parser.add_simple_formatter('ul', '<ul>%(value)s</ul>', transform_newlines=False, strip=True)\n        self._parser.add_simple_formatter('li', '<li>%(value)s</li>', transform_newlines=False, strip=True)\n        self._parser.add_simple_formatter('youtube',\n                                          (\n                                              '<iframe src=\"http://www.youtube.com/embed/%(value)s?wmode=opaque\" '\n                                              'data-youtube-id=\"%(value)s\" allowfullscreen=\"\" frameborder=\"0\" '\n                                              'height=\"315\" width=\"560\"></iframe>'\n                                          ),\n                                          replace_links=False)\n\n\nclass LiberatorParser(BaseParser):\n\n    chains_to_freedom = (\n        ('Windows', 'GNU Linux'),\n        ('Mac OS', 'FreeBSD'),\n        ('PHP', 'Python'),\n    )\n\n    def format(self, text):\n        for r in self.chains_to_freedom:\n            text = text.replace(*r)\n        return text\n\n    def quote(self, text, username=''):\n        return 'posted by: %s\\n%s' % (username, text) if username else text\n"
  },
  {
    "path": "test/test_project/test_project/settings.py",
    "content": "import os\n\nBASE_DIR = os.path.dirname(os.path.dirname(__file__))\n\nDEBUG = False\n\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.sqlite3',\n        'NAME': ':memory:',\n        'TEST_CHARSET': 'utf8',\n    }\n}\ntest_db = os.environ.get('DB', 'sqlite')\nif test_db == 'mysql':\n    DATABASES['default'].update({\n        'ENGINE': 'django.db.backends.mysql',\n        'NAME': 'pybbm',\n        # 'USER': 'root',\n        'TEST_COLLATION': 'utf8_general_ci',\n    })\nelif test_db == 'postgres':\n    DATABASES['default'].update({\n        'ENGINE': 'django.db.backends.postgresql_psycopg2',\n        # 'USER': 'postgres',\n        'NAME': 'pybbm',\n        'OPTIONS': {}\n    })\n\nINSTALLED_APPS = [\n    'django.contrib.auth',\n    'django.contrib.admin',\n    'django.contrib.contenttypes',\n    'django.contrib.sessions',\n    'django.contrib.sites',\n    'django.contrib.staticfiles',\n    'django.contrib.messages',\n    'test_app',\n    'pybb.apps.PybbConfig',\n]\n\nSECRET_KEY = 'some secret'\n\nTEMPLATES = [\n    {\n        'BACKEND': 'django.template.backends.django.DjangoTemplates',\n        'APP_DIRS': True,\n        'DIRS': [\n            os.path.join(BASE_DIR, 'templates'),\n        ],\n        'OPTIONS': {\n            'context_processors': [\n                'django.template.context_processors.debug',\n                'django.template.context_processors.request',\n                'django.contrib.auth.context_processors.auth',\n                'django.contrib.messages.context_processors.messages',\n                'django.template.context_processors.i18n',\n                'django.template.context_processors.media',\n                'django.template.context_processors.static',\n                'django.template.context_processors.tz',\n                'pybb.context_processors.processor',\n            ],\n        },\n    },\n]\n\nMIDDLEWARE = (\n    'django.middleware.common.CommonMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n    'pybb.middleware.PybbMiddleware',\n)\n\nROOT_URLCONF = 'test_project.urls'\n\nSITE_ID = 1\n\nSTATIC_URL = '/static/'\nMEDIA_ROOT = os.path.join(BASE_DIR, '..', '..', 'pybb_upload')\nMEDIA_URL = '/media/'\n\nAUTH_USER_MODEL = 'test_app.CustomUser'\n\nLOGIN_URL = '/'\nUSE_TZ = True\nPYBB_ATTACHMENT_ENABLE = True\nPYBB_PROFILE_RELATED_NAME = 'pybb_customprofile'\nLOGGING = {}\nimport sys\nimport logging\n\nif len(sys.argv) > 1 and sys.argv[1] == 'test':\n    logging.disable(logging.CRITICAL)\n"
  },
  {
    "path": "test/test_project/test_project/urls.py",
    "content": "\nimport django\nfrom django.urls import include, re_path\nfrom django.contrib import admin\n\nurlpatterns = [\n    re_path(r'^admin/', include(admin.site.urls) if django.VERSION < (1, 10) else admin.site.urls),\n    re_path(r'^', include('pybb.urls', namespace='pybb')),\n]\n"
  },
  {
    "path": "tox.ini",
    "content": "[tox]\nenvlist = py{38,39,310,311}-django{42}-{sqlite,postgres,mysql},coverage\n\n[testenv:coverage]\ndeps =\n    Django>=4.2,<5\n    -r test/test_project/requirements_test.txt\n    coveralls\ncommands =\n    coverage erase\n    coverage run test/test_project/manage.py test\n    coverage report\n    coverage html\n\n[testenv]\nsetenv=\n    mysql: DB=mysql\n    postgres: DB=postgres\n    PYTHONPATH = {toxinidir}:{envdir}\n\ncommands = {envpython} test/test_project/manage.py test\ndeps =\n    mysql: mysqlclient\n    postgres: psycopg2\n    django42: Django>=4.2,<5\n    setuptools>=75\n    -r test/test_project/requirements_test.txt\n"
  }
]