From 841f0e9dbd4a667afaa34aedf01e8e92b69ba72f Mon Sep 17 00:00:00 2001 From: Federico Denkena Date: Mon, 6 Nov 2023 16:21:10 +0100 Subject: [PATCH] added captcha to all forms --- bin/activate | 0 impuls/__pycache__/settings.cpython-311.pyc | Bin 3118 -> 3127 bytes impuls/__pycache__/urls.cpython-311.pyc | Bin 1993 -> 2247 bytes impuls/urls.py | 3 +- .../site-packages/captcha/__init__.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 669 bytes .../__pycache__/fields.cpython-311.pyc | Bin 0 -> 14619 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 0 -> 6184 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 5463 bytes .../captcha/__pycache__/urls.cpython-311.pyc | Bin 0 -> 823 bytes .../captcha/__pycache__/views.cpython-311.pyc | Bin 0 -> 10666 bytes .../REQUESTED => captcha/conf/__init__.py} | 0 .../conf/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 178 bytes .../conf/__pycache__/settings.cpython-311.pyc | Bin 0 -> 4691 bytes .../site-packages/captcha/conf/settings.py | 99 +++ .../site-packages/captcha/fields.py | 276 ++++++++ .../site-packages/captcha/fonts/COPYRIGHT.TXT | 123 ++++ .../site-packages/captcha/fonts/README.TXT | 11 + .../site-packages/captcha/fonts/Vera.ttf | Bin 0 -> 65932 bytes .../site-packages/captcha/helpers.py | 105 ++++ .../jinja2/captcha/widgets/captcha.html | 2 + .../captcha/locale/bg/LC_MESSAGES/django.mo | Bin 0 -> 653 bytes .../captcha/locale/bg/LC_MESSAGES/django.po | 31 + .../captcha/locale/cs/LC_MESSAGES/django.mo | Bin 0 -> 597 bytes .../captcha/locale/cs/LC_MESSAGES/django.po | 30 + .../captcha/locale/de/LC_MESSAGES/django.mo | Bin 0 -> 634 bytes .../captcha/locale/de/LC_MESSAGES/django.po | 32 + .../captcha/locale/en/LC_MESSAGES/django.mo | Bin 0 -> 591 bytes .../captcha/locale/en/LC_MESSAGES/django.po | 30 + .../captcha/locale/es/LC_MESSAGES/django.mo | Bin 0 -> 600 bytes .../captcha/locale/es/LC_MESSAGES/django.po | 32 + .../captcha/locale/fa/LC_MESSAGES/django.mo | Bin 0 -> 688 bytes .../captcha/locale/fa/LC_MESSAGES/django.po | 31 + .../captcha/locale/fr/LC_MESSAGES/django.mo | Bin 0 -> 594 bytes .../captcha/locale/fr/LC_MESSAGES/django.po | 30 + .../captcha/locale/it/LC_MESSAGES/django.mo | Bin 0 -> 631 bytes .../captcha/locale/it/LC_MESSAGES/django.po | 30 + .../captcha/locale/ja/LC_MESSAGES/django.mo | Bin 0 -> 636 bytes .../captcha/locale/ja/LC_MESSAGES/django.po | 31 + .../captcha/locale/nl/LC_MESSAGES/django.mo | Bin 0 -> 630 bytes .../captcha/locale/nl/LC_MESSAGES/django.po | 31 + .../captcha/locale/pl/LC_MESSAGES/django.mo | Bin 0 -> 680 bytes .../captcha/locale/pl/LC_MESSAGES/django.po | 32 + .../locale/pt_BR/LC_MESSAGES/django.mo | Bin 0 -> 613 bytes .../locale/pt_BR/LC_MESSAGES/django.po | 31 + .../captcha/locale/ru/LC_MESSAGES/django.mo | Bin 0 -> 724 bytes .../captcha/locale/ru/LC_MESSAGES/django.po | 31 + .../captcha/locale/sk/LC_MESSAGES/django.mo | Bin 0 -> 606 bytes .../captcha/locale/sk/LC_MESSAGES/django.po | 32 + .../captcha/locale/sv/LC_MESSAGES/django.mo | Bin 0 -> 631 bytes .../captcha/locale/sv/LC_MESSAGES/django.po | 31 + .../captcha/locale/tr/LC_MESSAGES/django.mo | Bin 0 -> 605 bytes .../captcha/locale/tr/LC_MESSAGES/django.po | 31 + .../captcha/locale/uk/LC_MESSAGES/django.mo | Bin 0 -> 715 bytes .../captcha/locale/uk/LC_MESSAGES/django.po | 32 + .../locale/zh_CN/LC_MESSAGES/django.mo | Bin 0 -> 602 bytes .../locale/zh_CN/LC_MESSAGES/django.po | 31 + .../locale/zh_Hans/LC_MESSAGES/django.mo | Bin 0 -> 602 bytes .../locale/zh_Hans/LC_MESSAGES/django.po | 31 + .../captcha/management/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 184 bytes .../captcha/management/commands/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 193 bytes .../__pycache__/captcha_clean.cpython-311.pyc | Bin 0 -> 1908 bytes .../captcha_create_pool.cpython-311.pyc | Bin 0 -> 2251 bytes .../management/commands/captcha_clean.py | 29 + .../commands/captcha_create_pool.py | 34 + .../captcha/migrations/0001_initial.py | 31 + .../migrations/0002_alter_captchastore_id.py | 18 + .../captcha/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 1305 bytes ...0002_alter_captchastore_id.cpython-311.pyc | Bin 0 -> 833 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 184 bytes .../site-packages/captcha/models.py | 88 +++ .../captcha/templates/captcha/field.html | 1 + .../templates/captcha/hidden_field.html | 1 + .../captcha/templates/captcha/image.html | 4 + .../captcha/templates/captcha/text_field.html | 1 + .../templates/captcha/widgets/captcha.html | 9 + .../site-packages/captcha/tests/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 268 bytes .../tests/__pycache__/tests.cpython-311.pyc | Bin 0 -> 39815 bytes .../tests/__pycache__/urls.cpython-311.pyc | Bin 0 -> 1265 bytes .../tests/__pycache__/views.cpython-311.pyc | Bin 0 -> 7223 bytes .../site-packages/captcha/tests/tests.py | 594 ++++++++++++++++++ .../site-packages/captcha/tests/urls.py | 27 + .../site-packages/captcha/tests/views.py | 128 ++++ lib/python3.11/site-packages/captcha/urls.py | 21 + lib/python3.11/site-packages/captcha/views.py | 225 +++++++ .../INSTALLER | 0 .../METADATA | 10 + .../RECORD | 7 + .../WHEEL | 2 +- .../top_level.txt | 1 + .../INSTALLER} | 0 .../LICENSE | 20 + .../METADATA | 65 ++ .../RECORD | 92 +++ .../REQUESTED | 0 .../WHEEL | 6 + .../top_level.txt | 1 + .../AUTHORS.txt | 13 + .../pip-23.3.1.dist-info/INSTALLER | 1 + .../LICENSE.txt | 0 .../METADATA | 178 +++--- .../RECORD | 168 ++--- .../pip-23.3.1.dist-info/REQUESTED | 0 .../site-packages/pip-23.3.1.dist-info/WHEEL | 5 + .../entry_points.txt | 0 .../pip-23.3.1.dist-info/top_level.txt | 1 + lib/python3.11/site-packages/pip/__init__.py | 2 +- .../pip/__pycache__/__init__.cpython-311.pyc | Bin 758 -> 758 bytes .../pip/__pycache__/__main__.cpython-311.pyc | Bin 875 -> 875 bytes .../__pip-runner__.cpython-311.pyc | Bin 2495 -> 2495 bytes .../site-packages/pip/_internal/__init__.py | 1 - .../__pycache__/__init__.cpython-311.pyc | Bin 941 -> 872 bytes .../__pycache__/build_env.cpython-311.pyc | Bin 16061 -> 16061 bytes .../__pycache__/cache.cpython-311.pyc | Bin 14259 -> 14377 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 19508 -> 19508 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 37610 -> 37610 bytes .../__pycache__/main.cpython-311.pyc | Bin 741 -> 741 bytes .../__pycache__/pyproject.cpython-311.pyc | Bin 5603 -> 5603 bytes .../self_outdated_check.cpython-311.pyc | Bin 11311 -> 11756 bytes .../__pycache__/wheel_builder.cpython-311.pyc | Bin 15245 -> 15245 bytes .../site-packages/pip/_internal/cache.py | 6 +- .../cli/__pycache__/__init__.cpython-311.pyc | Bin 276 -> 276 bytes .../autocompletion.cpython-311.pyc | Bin 10066 -> 10231 bytes .../__pycache__/base_command.cpython-311.pyc | Bin 11838 -> 11850 bytes .../__pycache__/cmdoptions.cpython-311.pyc | Bin 33737 -> 33835 bytes .../command_context.cpython-311.pyc | Bin 2098 -> 2098 bytes .../cli/__pycache__/main.cpython-311.pyc | Bin 2568 -> 2568 bytes .../__pycache__/main_parser.cpython-311.pyc | Bin 5512 -> 5512 bytes .../cli/__pycache__/parser.cpython-311.pyc | Bin 17013 -> 17013 bytes .../__pycache__/progress_bars.cpython-311.pyc | Bin 3160 -> 3160 bytes .../__pycache__/req_command.cpython-311.pyc | Bin 20306 -> 20315 bytes .../cli/__pycache__/spinners.cpython-311.pyc | Bin 8825 -> 8825 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 364 -> 364 bytes .../pip/_internal/cli/autocompletion.py | 5 +- .../pip/_internal/cli/base_command.py | 2 +- .../pip/_internal/cli/cmdoptions.py | 15 +- .../site-packages/pip/_internal/cli/parser.py | 4 +- .../pip/_internal/cli/req_command.py | 17 +- .../__pycache__/__init__.cpython-311.pyc | Bin 4444 -> 4444 bytes .../__pycache__/cache.cpython-311.pyc | Bin 10543 -> 10902 bytes .../__pycache__/check.cpython-311.pyc | Bin 2399 -> 2399 bytes .../__pycache__/completion.cpython-311.pyc | Bin 5309 -> 5614 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 14885 -> 14885 bytes .../__pycache__/debug.cpython-311.pyc | Bin 11993 -> 12319 bytes .../__pycache__/download.cpython-311.pyc | Bin 7933 -> 7933 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 4649 -> 4649 bytes .../commands/__pycache__/hash.cpython-311.pyc | Bin 3346 -> 3346 bytes .../commands/__pycache__/help.cpython-311.pyc | Bin 1958 -> 1958 bytes .../__pycache__/index.cpython-311.pyc | Bin 7781 -> 7781 bytes .../__pycache__/inspect.cpython-311.pyc | Bin 4434 -> 4434 bytes .../__pycache__/install.cpython-311.pyc | Bin 31195 -> 31192 bytes .../commands/__pycache__/list.cpython-311.pyc | Bin 17204 -> 17238 bytes .../__pycache__/search.cpython-311.pyc | Bin 8940 -> 8940 bytes .../commands/__pycache__/show.cpython-311.pyc | Bin 11283 -> 11283 bytes .../__pycache__/uninstall.cpython-311.pyc | Bin 5134 -> 5134 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 9390 -> 9390 bytes .../pip/_internal/commands/cache.py | 33 +- .../pip/_internal/commands/completion.py | 15 +- .../pip/_internal/commands/debug.py | 22 +- .../pip/_internal/commands/install.py | 6 +- .../pip/_internal/commands/list.py | 2 +- .../__pycache__/__init__.cpython-311.pyc | Bin 1026 -> 1026 bytes .../__pycache__/base.cpython-311.pyc | Bin 2398 -> 3118 bytes .../__pycache__/installed.cpython-311.pyc | Bin 1535 -> 1835 bytes .../__pycache__/sdist.cpython-311.pyc | Bin 8937 -> 9359 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 2129 -> 2427 bytes .../pip/_internal/distributions/base.py | 12 + .../pip/_internal/distributions/installed.py | 6 + .../pip/_internal/distributions/sdist.py | 8 +- .../pip/_internal/distributions/wheel.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 230 -> 230 bytes .../__pycache__/collector.cpython-311.pyc | Bin 24536 -> 24536 bytes .../package_finder.cpython-311.pyc | Bin 44208 -> 44229 bytes .../index/__pycache__/sources.cpython-311.pyc | Bin 11012 -> 11012 bytes .../pip/_internal/index/package_finder.py | 4 +- .../__pycache__/__init__.cpython-311.pyc | Bin 18168 -> 18168 bytes .../__pycache__/_distutils.cpython-311.pyc | Bin 7577 -> 7542 bytes .../__pycache__/_sysconfig.cpython-311.pyc | Bin 8872 -> 8872 bytes .../__pycache__/base.cpython-311.pyc | Bin 3993 -> 3993 bytes .../pip/_internal/locations/_distutils.py | 2 +- .../pip/_internal/metadata/__init__.py | 3 +- .../__pycache__/__init__.cpython-311.pyc | Bin 6401 -> 6492 bytes .../__pycache__/_json.cpython-311.pyc | Bin 3555 -> 3555 bytes .../metadata/__pycache__/base.cpython-311.pyc | Bin 38000 -> 38669 bytes .../__pycache__/pkg_resources.cpython-311.pyc | Bin 16848 -> 17526 bytes .../pip/_internal/metadata/base.py | 32 +- .../_internal/metadata/importlib/__init__.py | 4 +- .../__pycache__/__init__.cpython-311.pyc | Bin 347 -> 381 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 3554 -> 3554 bytes .../__pycache__/_dists.cpython-311.pyc | Bin 14570 -> 14864 bytes .../__pycache__/_envs.cpython-311.pyc | Bin 12480 -> 12497 bytes .../_internal/metadata/importlib/_dists.py | 11 +- .../pip/_internal/metadata/importlib/_envs.py | 3 +- .../pip/_internal/metadata/pkg_resources.py | 10 +- .../__pycache__/__init__.cpython-311.pyc | Bin 264 -> 264 bytes .../__pycache__/candidate.cpython-311.pyc | Bin 2083 -> 2083 bytes .../__pycache__/direct_url.cpython-311.pyc | Bin 12791 -> 12791 bytes .../format_control.cpython-311.pyc | Bin 4647 -> 4647 bytes .../models/__pycache__/index.cpython-311.pyc | Bin 1889 -> 1889 bytes .../installation_report.cpython-311.pyc | Bin 2552 -> 2595 bytes .../models/__pycache__/link.cpython-311.pyc | Bin 28651 -> 28651 bytes .../models/__pycache__/scheme.cpython-311.pyc | Bin 1255 -> 1255 bytes .../__pycache__/search_scope.cpython-311.pyc | Bin 5818 -> 5818 bytes .../selection_prefs.cpython-311.pyc | Bin 1986 -> 1986 bytes .../__pycache__/target_python.cpython-311.pyc | Bin 4748 -> 5285 bytes .../models/__pycache__/wheel.cpython-311.pyc | Bin 6411 -> 6411 bytes .../_internal/models/installation_report.py | 5 +- .../pip/_internal/models/target_python.py | 18 +- .../__pycache__/__init__.cpython-311.pyc | Bin 252 -> 252 bytes .../network/__pycache__/auth.cpython-311.pyc | Bin 23979 -> 23979 bytes .../network/__pycache__/cache.cpython-311.pyc | Bin 5175 -> 7920 bytes .../__pycache__/download.cpython-311.pyc | Bin 9567 -> 9567 bytes .../__pycache__/lazy_wheel.cpython-311.pyc | Bin 13013 -> 13013 bytes .../__pycache__/session.cpython-311.pyc | Bin 21424 -> 21424 bytes .../network/__pycache__/utils.cpython-311.pyc | Bin 2401 -> 2401 bytes .../__pycache__/xmlrpc.cpython-311.pyc | Bin 3180 -> 3180 bytes .../pip/_internal/network/cache.py | 57 +- .../__pycache__/__init__.cpython-311.pyc | Bin 190 -> 190 bytes .../__pycache__/check.cpython-311.pyc | Bin 8453 -> 8453 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 11586 -> 11586 bytes .../__pycache__/prepare.cpython-311.pyc | Bin 27936 -> 27896 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 196 -> 196 bytes .../__pycache__/build_tracker.cpython-311.pyc | Bin 8119 -> 8917 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 2267 -> 2267 bytes .../metadata_editable.cpython-311.pyc | Bin 2303 -> 2303 bytes .../metadata_legacy.cpython-311.pyc | Bin 3703 -> 3703 bytes .../build/__pycache__/wheel.cpython-311.pyc | Bin 1933 -> 1933 bytes .../wheel_editable.cpython-311.pyc | Bin 2377 -> 2377 bytes .../__pycache__/wheel_legacy.cpython-311.pyc | Bin 4484 -> 4484 bytes .../operations/build/build_tracker.py | 51 +- .../pip/_internal/operations/check.py | 4 +- .../__pycache__/__init__.cpython-311.pyc | Bin 264 -> 264 bytes .../editable_legacy.cpython-311.pyc | Bin 2177 -> 2177 bytes .../install/__pycache__/wheel.cpython-311.pyc | Bin 40230 -> 40378 bytes .../pip/_internal/operations/install/wheel.py | 6 +- .../pip/_internal/operations/prepare.py | 63 +- .../req/__pycache__/__init__.cpython-311.pyc | Bin 4378 -> 4378 bytes .../__pycache__/constructors.cpython-311.pyc | Bin 20690 -> 23401 bytes .../req/__pycache__/req_file.cpython-311.pyc | Bin 22735 -> 22735 bytes .../__pycache__/req_install.cpython-311.pyc | Bin 38073 -> 40063 bytes .../req/__pycache__/req_set.cpython-311.pyc | Bin 7946 -> 7946 bytes .../__pycache__/req_uninstall.cpython-311.pyc | Bin 37472 -> 37454 bytes .../pip/_internal/req/constructors.py | 72 ++- .../pip/_internal/req/req_install.py | 78 ++- .../pip/_internal/req/req_set.py | 4 +- .../pip/_internal/req/req_uninstall.py | 2 +- .../__pycache__/__init__.cpython-311.pyc | Bin 190 -> 190 bytes .../__pycache__/base.cpython-311.pyc | Bin 1361 -> 1361 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 197 -> 197 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 23787 -> 23787 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 201 -> 201 bytes .../__pycache__/base.cpython-311.pyc | Bin 9614 -> 9289 bytes .../__pycache__/candidates.cpython-311.pyc | Bin 28788 -> 31635 bytes .../__pycache__/factory.cpython-311.pyc | Bin 31913 -> 35120 bytes .../found_candidates.cpython-311.pyc | Bin 6749 -> 6749 bytes .../__pycache__/provider.cpython-311.pyc | Bin 11440 -> 11440 bytes .../__pycache__/reporter.cpython-311.pyc | Bin 5431 -> 5431 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 11111 -> 12541 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 12412 -> 13442 bytes .../_internal/resolution/resolvelib/base.py | 8 +- .../resolution/resolvelib/candidates.py | 90 ++- .../resolution/resolvelib/factory.py | 161 +++-- .../resolution/resolvelib/requirements.py | 15 +- .../resolution/resolvelib/resolver.py | 20 +- .../pip/_internal/self_outdated_check.py | 26 +- .../__pycache__/__init__.cpython-311.pyc | Bin 185 -> 185 bytes .../__pycache__/_jaraco_text.cpython-311.pyc | Bin 4749 -> 4749 bytes .../utils/__pycache__/_log.cpython-311.pyc | Bin 2006 -> 2006 bytes .../utils/__pycache__/appdirs.cpython-311.pyc | Bin 2544 -> 2544 bytes .../utils/__pycache__/compat.cpython-311.pyc | Bin 2252 -> 2252 bytes .../compatibility_tags.cpython-311.pyc | Bin 6744 -> 6744 bytes .../__pycache__/datetime.cpython-311.pyc | Bin 702 -> 702 bytes .../__pycache__/deprecation.cpython-311.pyc | Bin 4671 -> 4671 bytes .../direct_url_helpers.cpython-311.pyc | Bin 3708 -> 3708 bytes .../__pycache__/egg_link.cpython-311.pyc | Bin 3223 -> 3223 bytes .../__pycache__/encoding.cpython-311.pyc | Bin 2308 -> 2308 bytes .../__pycache__/entrypoints.cpython-311.pyc | Bin 4230 -> 4230 bytes .../__pycache__/filesystem.cpython-311.pyc | Bin 8215 -> 8215 bytes .../__pycache__/filetypes.cpython-311.pyc | Bin 1301 -> 1301 bytes .../utils/__pycache__/glibc.cpython-311.pyc | Bin 2597 -> 2597 bytes .../utils/__pycache__/hashes.cpython-311.pyc | Bin 8756 -> 8756 bytes .../inject_securetransport.cpython-311.pyc | Bin 1319 -> 0 bytes .../utils/__pycache__/logging.cpython-311.pyc | Bin 15444 -> 15357 bytes .../utils/__pycache__/misc.cpython-311.pyc | Bin 37044 -> 38905 bytes .../utils/__pycache__/models.cpython-311.pyc | Bin 2925 -> 2925 bytes .../__pycache__/packaging.cpython-311.pyc | Bin 2792 -> 2792 bytes .../setuptools_build.cpython-311.pyc | Bin 4857 -> 4857 bytes .../__pycache__/subprocess.cpython-311.pyc | Bin 9879 -> 9886 bytes .../__pycache__/temp_dir.cpython-311.pyc | Bin 11406 -> 13369 bytes .../__pycache__/unpacking.cpython-311.pyc | Bin 12881 -> 12881 bytes .../utils/__pycache__/urls.cpython-311.pyc | Bin 2678 -> 2678 bytes .../__pycache__/virtualenv.cpython-311.pyc | Bin 4925 -> 4925 bytes .../utils/__pycache__/wheel.cpython-311.pyc | Bin 7095 -> 7095 bytes .../_internal/utils/inject_securetransport.py | 35 -- .../pip/_internal/utils/logging.py | 4 +- .../site-packages/pip/_internal/utils/misc.py | 86 ++- .../pip/_internal/utils/subprocess.py | 2 +- .../pip/_internal/utils/temp_dir.py | 54 +- .../vcs/__pycache__/__init__.cpython-311.pyc | Bin 620 -> 620 bytes .../vcs/__pycache__/bazaar.cpython-311.pyc | Bin 5845 -> 5845 bytes .../vcs/__pycache__/git.cpython-311.pyc | Bin 21509 -> 21360 bytes .../vcs/__pycache__/mercurial.cpython-311.pyc | Bin 8700 -> 8709 bytes .../__pycache__/subversion.cpython-311.pyc | Bin 14588 -> 14588 bytes .../versioncontrol.cpython-311.pyc | Bin 31857 -> 31857 bytes .../site-packages/pip/_internal/vcs/git.py | 2 +- .../pip/_internal/vcs/mercurial.py | 2 +- .../site-packages/pip/_vendor/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 5598 -> 5648 bytes .../_vendor/__pycache__/six.cpython-311.pyc | Bin 46400 -> 46400 bytes .../typing_extensions.cpython-311.pyc | Bin 131570 -> 131570 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 +- .../__pycache__/__init__.cpython-311.pyc | Bin 827 -> 964 bytes .../__pycache__/_cmd.cpython-311.pyc | Bin 2682 -> 3015 bytes .../__pycache__/adapter.cpython-311.pyc | Bin 5489 -> 6891 bytes .../__pycache__/cache.cpython-311.pyc | Bin 3763 -> 4488 bytes .../__pycache__/compat.cpython-311.pyc | Bin 1120 -> 0 bytes .../__pycache__/controller.cpython-311.pyc | Bin 16435 -> 18241 bytes .../__pycache__/filewrapper.cpython-311.pyc | Bin 4222 -> 4744 bytes .../__pycache__/heuristics.cpython-311.pyc | Bin 6667 -> 7547 bytes .../__pycache__/serialize.cpython-311.pyc | Bin 8382 -> 7023 bytes .../__pycache__/wrapper.cpython-311.pyc | Bin 948 -> 1856 bytes .../pip/_vendor/cachecontrol/_cmd.py | 25 +- .../pip/_vendor/cachecontrol/adapter.py | 80 ++- .../pip/_vendor/cachecontrol/cache.py | 35 +- .../_vendor/cachecontrol/caches/__init__.py | 5 +- .../__pycache__/__init__.cpython-311.pyc | Bin 402 -> 465 bytes .../__pycache__/file_cache.cpython-311.pyc | Bin 8385 -> 8971 bytes .../__pycache__/redis_cache.cpython-311.pyc | Bin 2482 -> 3072 bytes .../_vendor/cachecontrol/caches/file_cache.py | 83 ++- .../cachecontrol/caches/redis_cache.py | 31 +- .../pip/_vendor/cachecontrol/compat.py | 32 - .../pip/_vendor/cachecontrol/controller.py | 171 +++-- .../pip/_vendor/cachecontrol/filewrapper.py | 30 +- .../pip/_vendor/cachecontrol/heuristics.py | 57 +- .../pip/_vendor/cachecontrol/serialize.py | 184 +++--- .../pip/_vendor/cachecontrol/wrapper.py | 34 +- .../pip/_vendor/certifi/__init__.py | 2 +- .../__pycache__/__init__.cpython-311.pyc | Bin 327 -> 327 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 728 -> 728 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 3350 -> 3350 bytes .../pip/_vendor/certifi/cacert.pem | 324 ++++++---- .../__pycache__/__init__.cpython-311.pyc | Bin 5059 -> 5059 bytes .../__pycache__/big5freq.cpython-311.pyc | Bin 27189 -> 27189 bytes .../__pycache__/big5prober.cpython-311.pyc | Bin 1664 -> 1664 bytes .../chardistribution.cpython-311.pyc | Bin 11256 -> 11256 bytes .../charsetgroupprober.cpython-311.pyc | Bin 4286 -> 4286 bytes .../__pycache__/charsetprober.cpython-311.pyc | Bin 5532 -> 5532 bytes .../codingstatemachine.cpython-311.pyc | Bin 3983 -> 3983 bytes .../codingstatemachinedict.cpython-311.pyc | Bin 939 -> 939 bytes .../__pycache__/cp949prober.cpython-311.pyc | Bin 1673 -> 1673 bytes .../chardet/__pycache__/enums.cpython-311.pyc | Bin 3374 -> 3374 bytes .../__pycache__/escprober.cpython-311.pyc | Bin 4890 -> 4890 bytes .../chardet/__pycache__/escsm.cpython-311.pyc | Bin 12629 -> 12629 bytes .../__pycache__/eucjpprober.cpython-311.pyc | Bin 4716 -> 4716 bytes .../__pycache__/euckrfreq.cpython-311.pyc | Bin 12072 -> 12072 bytes .../__pycache__/euckrprober.cpython-311.pyc | Bin 1665 -> 1665 bytes .../__pycache__/euctwfreq.cpython-311.pyc | Bin 27194 -> 27194 bytes .../__pycache__/euctwprober.cpython-311.pyc | Bin 1665 -> 1665 bytes .../__pycache__/gb2312freq.cpython-311.pyc | Bin 19116 -> 19116 bytes .../__pycache__/gb2312prober.cpython-311.pyc | Bin 1680 -> 1680 bytes .../__pycache__/hebrewprober.cpython-311.pyc | Bin 5669 -> 5669 bytes .../__pycache__/jisfreq.cpython-311.pyc | Bin 22145 -> 22145 bytes .../__pycache__/johabfreq.cpython-311.pyc | Bin 84649 -> 84649 bytes .../__pycache__/johabprober.cpython-311.pyc | Bin 1671 -> 1671 bytes .../__pycache__/jpcntx.cpython-311.pyc | Bin 40153 -> 40153 bytes .../langbulgarianmodel.cpython-311.pyc | Bin 85823 -> 85823 bytes .../langgreekmodel.cpython-311.pyc | Bin 79245 -> 79245 bytes .../langhebrewmodel.cpython-311.pyc | Bin 80007 -> 80007 bytes .../langhungarianmodel.cpython-311.pyc | Bin 85777 -> 85777 bytes .../langrussianmodel.cpython-311.pyc | Bin 108724 -> 108724 bytes .../__pycache__/langthaimodel.cpython-311.pyc | Bin 80185 -> 80185 bytes .../langturkishmodel.cpython-311.pyc | Bin 80024 -> 80024 bytes .../__pycache__/latin1prober.cpython-311.pyc | Bin 7320 -> 7320 bytes .../macromanprober.cpython-311.pyc | Bin 7487 -> 7487 bytes .../mbcharsetprober.cpython-311.pyc | Bin 4108 -> 4108 bytes .../mbcsgroupprober.cpython-311.pyc | Bin 1978 -> 1978 bytes .../__pycache__/mbcssm.cpython-311.pyc | Bin 31718 -> 31718 bytes .../__pycache__/resultdict.cpython-311.pyc | Bin 757 -> 757 bytes .../sbcharsetprober.cpython-311.pyc | Bin 6383 -> 6383 bytes .../sbcsgroupprober.cpython-311.pyc | Bin 2928 -> 2928 bytes .../__pycache__/sjisprober.cpython-311.pyc | Bin 4821 -> 4821 bytes .../universaldetector.cpython-311.pyc | Bin 12449 -> 12449 bytes .../__pycache__/utf1632prober.cpython-311.pyc | Bin 10569 -> 10569 bytes .../__pycache__/utf8prober.cpython-311.pyc | Bin 3456 -> 3456 bytes .../__pycache__/version.cpython-311.pyc | Bin 492 -> 492 bytes .../cli/__pycache__/__init__.cpython-311.pyc | Bin 189 -> 189 bytes .../__pycache__/chardetect.cpython-311.pyc | Bin 4328 -> 4328 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 194 -> 194 bytes .../__pycache__/languages.cpython-311.pyc | Bin 10794 -> 10794 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 561 -> 561 bytes .../colorama/__pycache__/ansi.cpython-311.pyc | Bin 4559 -> 4559 bytes .../__pycache__/ansitowin32.cpython-311.pyc | Bin 16205 -> 16205 bytes .../__pycache__/initialise.cpython-311.pyc | Bin 3922 -> 3922 bytes .../__pycache__/win32.cpython-311.pyc | Bin 7910 -> 7910 bytes .../__pycache__/winterm.cpython-311.pyc | Bin 9136 -> 9136 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 192 -> 192 bytes .../__pycache__/ansi_test.cpython-311.pyc | Bin 5837 -> 5837 bytes .../ansitowin32_test.cpython-311.pyc | Bin 21504 -> 21504 bytes .../initialise_test.cpython-311.pyc | Bin 14131 -> 14131 bytes .../__pycache__/isatty_test.cpython-311.pyc | Bin 6696 -> 6696 bytes .../tests/__pycache__/utils.cpython-311.pyc | Bin 2871 -> 2871 bytes .../__pycache__/winterm_test.cpython-311.pyc | Bin 7224 -> 7224 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 1430 -> 1430 bytes .../__pycache__/compat.cpython-311.pyc | Bin 52296 -> 52296 bytes .../__pycache__/database.cpython-311.pyc | Bin 72084 -> 72084 bytes .../distlib/__pycache__/index.cpython-311.pyc | Bin 26673 -> 26673 bytes .../__pycache__/locators.cpython-311.pyc | Bin 65849 -> 65849 bytes .../__pycache__/manifest.cpython-311.pyc | Bin 17016 -> 17016 bytes .../__pycache__/markers.cpython-311.pyc | Bin 8152 -> 8152 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 47100 -> 47100 bytes .../__pycache__/resources.cpython-311.pyc | Bin 18979 -> 18979 bytes .../__pycache__/scripts.cpython-311.pyc | Bin 21255 -> 21255 bytes .../distlib/__pycache__/util.cpython-311.pyc | Bin 97434 -> 97434 bytes .../__pycache__/version.cpython-311.pyc | Bin 34561 -> 34561 bytes .../distlib/__pycache__/wheel.cpython-311.pyc | Bin 60365 -> 60365 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 1183 -> 1183 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 317 -> 317 bytes .../distro/__pycache__/distro.cpython-311.pyc | Bin 57716 -> 57716 bytes .../idna/__pycache__/__init__.cpython-311.pyc | Bin 1084 -> 1084 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 5375 -> 5375 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 1001 -> 1001 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 19436 -> 19436 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 38960 -> 38960 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 2969 -> 2969 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 204 -> 204 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 163184 -> 163184 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 2063 -> 2063 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 2364 -> 2364 bytes .../msgpack/__pycache__/ext.cpython-311.pyc | Bin 9149 -> 9149 bytes .../__pycache__/fallback.cpython-311.pyc | Bin 47137 -> 47137 bytes .../__pycache__/__about__.cpython-311.pyc | Bin 628 -> 628 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 549 -> 549 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 13215 -> 13215 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 7983 -> 7983 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3671 -> 3671 bytes .../__pycache__/markers.cpython-311.pyc | Bin 16511 -> 16511 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 7626 -> 7626 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 34349 -> 34349 bytes .../__pycache__/tags.cpython-311.pyc | Bin 21334 -> 21334 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6669 -> 6669 bytes .../__pycache__/version.cpython-311.pyc | Bin 21861 -> 21861 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 160129 -> 160129 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 17482 -> 17482 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 2262 -> 2262 bytes .../__pycache__/android.cpython-311.pyc | Bin 10448 -> 10448 bytes .../__pycache__/api.cpython-311.pyc | Bin 10541 -> 10541 bytes .../__pycache__/macos.cpython-311.pyc | Bin 6053 -> 6053 bytes .../__pycache__/unix.cpython-311.pyc | Bin 13759 -> 13759 bytes .../__pycache__/version.cpython-311.pyc | Bin 299 -> 299 bytes .../__pycache__/windows.cpython-311.pyc | Bin 13927 -> 13927 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 3818 -> 3818 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 767 -> 767 bytes .../__pycache__/cmdline.cpython-311.pyc | Bin 30278 -> 30278 bytes .../__pycache__/console.cpython-311.pyc | Bin 3030 -> 3030 bytes .../__pycache__/filter.cpython-311.pyc | Bin 3491 -> 3491 bytes .../__pycache__/formatter.cpython-311.pyc | Bin 4806 -> 4806 bytes .../__pycache__/lexer.cpython-311.pyc | Bin 42294 -> 42294 bytes .../__pycache__/modeline.cpython-311.pyc | Bin 1710 -> 1710 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 3723 -> 3723 bytes .../__pycache__/regexopt.cpython-311.pyc | Bin 5017 -> 5017 bytes .../__pycache__/scanner.cpython-311.pyc | Bin 4872 -> 4872 bytes .../__pycache__/sphinxext.cpython-311.pyc | Bin 12817 -> 12817 bytes .../__pycache__/style.cpython-311.pyc | Bin 7411 -> 7411 bytes .../__pycache__/token.cpython-311.pyc | Bin 7451 -> 7451 bytes .../__pycache__/unistring.cpython-311.pyc | Bin 33824 -> 33824 bytes .../pygments/__pycache__/util.cpython-311.pyc | Bin 15676 -> 15676 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 40091 -> 40091 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 7749 -> 7749 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 4209 -> 4209 bytes .../__pycache__/bbcode.cpython-311.pyc | Bin 4465 -> 4465 bytes .../__pycache__/groff.cpython-311.pyc | Bin 7838 -> 7838 bytes .../__pycache__/html.cpython-311.pyc | Bin 42627 -> 42627 bytes .../__pycache__/img.cpython-311.pyc | Bin 28555 -> 28555 bytes .../__pycache__/irc.cpython-311.pyc | Bin 6391 -> 6391 bytes .../__pycache__/latex.cpython-311.pyc | Bin 21791 -> 21791 bytes .../__pycache__/other.cpython-311.pyc | Bin 7619 -> 7619 bytes .../__pycache__/pangomarkup.cpython-311.pyc | Bin 3163 -> 3163 bytes .../__pycache__/rtf.cpython-311.pyc | Bin 6830 -> 6830 bytes .../__pycache__/svg.cpython-311.pyc | Bin 9650 -> 9650 bytes .../__pycache__/terminal.cpython-311.pyc | Bin 6029 -> 6029 bytes .../__pycache__/terminal256.cpython-311.pyc | Bin 16395 -> 16395 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 16335 -> 16335 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 64777 -> 64777 bytes .../lexers/__pycache__/python.cpython-311.pyc | Bin 43291 -> 43291 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 4666 -> 4666 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 8215 -> 8215 bytes .../__pycache__/actions.cpython-311.pyc | Bin 9106 -> 9106 bytes .../__pycache__/common.cpython-311.pyc | Bin 14853 -> 14853 bytes .../__pycache__/core.cpython-311.pyc | Bin 295426 -> 295426 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 13693 -> 13693 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 54112 -> 54112 bytes .../__pycache__/results.cpython-311.pyc | Bin 37833 -> 37833 bytes .../__pycache__/testing.cpython-311.pyc | Bin 19496 -> 19496 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 15184 -> 15184 bytes .../__pycache__/util.cpython-311.pyc | Bin 16767 -> 16767 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 28775 -> 28775 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 692 -> 692 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 390 -> 390 bytes .../__pycache__/_impl.cpython-311.pyc | Bin 16656 -> 16656 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 1152 -> 1152 bytes .../__pycache__/_in_process.cpython-311.pyc | Bin 16474 -> 16474 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 6423 -> 6423 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 573 -> 573 bytes .../_internal_utils.cpython-311.pyc | Bin 2137 -> 2137 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 23190 -> 23190 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 7490 -> 7490 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 14617 -> 14617 bytes .../__pycache__/certs.cpython-311.pyc | Bin 969 -> 969 bytes .../__pycache__/compat.cpython-311.pyc | Bin 1795 -> 1795 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 27097 -> 27097 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 8512 -> 8512 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 4507 -> 4507 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 1237 -> 1237 bytes .../__pycache__/models.cpython-311.pyc | Bin 38768 -> 38768 bytes .../__pycache__/packages.cpython-311.pyc | Bin 817 -> 817 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 29680 -> 29680 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 6224 -> 6224 bytes .../__pycache__/structures.cpython-311.pyc | Bin 6209 -> 6209 bytes .../__pycache__/utils.cpython-311.pyc | Bin 40243 -> 40243 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 740 -> 740 bytes .../__pycache__/providers.cpython-311.pyc | Bin 7058 -> 7058 bytes .../__pycache__/reporters.cpython-311.pyc | Bin 2822 -> 2822 bytes .../__pycache__/resolvers.cpython-311.pyc | Bin 29222 -> 29222 bytes .../__pycache__/structs.cpython-311.pyc | Bin 11459 -> 11459 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 195 -> 195 bytes .../collections_abc.cpython-311.pyc | Bin 470 -> 470 bytes .../rich/__pycache__/__init__.cpython-311.pyc | Bin 7483 -> 7483 bytes .../rich/__pycache__/__main__.cpython-311.pyc | Bin 11561 -> 11561 bytes .../__pycache__/_cell_widths.cpython-311.pyc | Bin 7822 -> 7822 bytes .../__pycache__/_emoji_codes.cpython-311.pyc | Bin 208509 -> 208509 bytes .../_emoji_replace.cpython-311.pyc | Bin 1921 -> 1921 bytes .../_export_format.cpython-311.pyc | Bin 2312 -> 2312 bytes .../__pycache__/_extension.cpython-311.pyc | Bin 622 -> 622 bytes .../rich/__pycache__/_fileno.cpython-311.pyc | Bin 964 -> 964 bytes .../rich/__pycache__/_inspect.cpython-311.pyc | Bin 14174 -> 14174 bytes .../__pycache__/_log_render.cpython-311.pyc | Bin 4756 -> 4756 bytes .../rich/__pycache__/_loop.cpython-311.pyc | Bin 2102 -> 2102 bytes .../__pycache__/_null_file.cpython-311.pyc | Bin 4161 -> 4161 bytes .../__pycache__/_palettes.cpython-311.pyc | Bin 5238 -> 5238 bytes .../rich/__pycache__/_pick.cpython-311.pyc | Bin 783 -> 783 bytes .../rich/__pycache__/_ratio.cpython-311.pyc | Bin 7921 -> 7921 bytes .../__pycache__/_spinners.cpython-311.pyc | Bin 13671 -> 13671 bytes .../rich/__pycache__/_stack.cpython-311.pyc | Bin 1117 -> 1117 bytes .../rich/__pycache__/_timer.cpython-311.pyc | Bin 970 -> 970 bytes .../_win32_console.cpython-311.pyc | Bin 30158 -> 30158 bytes .../rich/__pycache__/_windows.cpython-311.pyc | Bin 2817 -> 2817 bytes .../_windows_renderer.cpython-311.pyc | Bin 4008 -> 4008 bytes .../rich/__pycache__/_wrap.cpython-311.pyc | Bin 2773 -> 2773 bytes .../rich/__pycache__/abc.cpython-311.pyc | Bin 1914 -> 1914 bytes .../rich/__pycache__/align.cpython-311.pyc | Bin 13456 -> 13456 bytes .../rich/__pycache__/ansi.cpython-311.pyc | Bin 10487 -> 10487 bytes .../rich/__pycache__/bar.cpython-311.pyc | Bin 4536 -> 4536 bytes .../rich/__pycache__/box.cpython-311.pyc | Bin 12978 -> 12978 bytes .../rich/__pycache__/cells.cpython-311.pyc | Bin 6608 -> 6608 bytes .../rich/__pycache__/color.cpython-311.pyc | Bin 27792 -> 27792 bytes .../__pycache__/color_triplet.cpython-311.pyc | Bin 1862 -> 1862 bytes .../rich/__pycache__/columns.cpython-311.pyc | Bin 10633 -> 10633 bytes .../rich/__pycache__/console.cpython-311.pyc | Bin 123736 -> 123736 bytes .../__pycache__/constrain.cpython-311.pyc | Bin 2454 -> 2454 bytes .../__pycache__/containers.cpython-311.pyc | Bin 10795 -> 10795 bytes .../rich/__pycache__/control.cpython-311.pyc | Bin 11886 -> 11886 bytes .../default_styles.cpython-311.pyc | Bin 12589 -> 12589 bytes .../rich/__pycache__/diagnose.cpython-311.pyc | Bin 1809 -> 1809 bytes .../rich/__pycache__/emoji.cpython-311.pyc | Bin 4787 -> 4787 bytes .../rich/__pycache__/errors.cpython-311.pyc | Bin 2318 -> 2318 bytes .../__pycache__/file_proxy.cpython-311.pyc | Bin 4022 -> 4022 bytes .../rich/__pycache__/filesize.cpython-311.pyc | Bin 3290 -> 3290 bytes .../__pycache__/highlighter.cpython-311.pyc | Bin 10976 -> 10976 bytes .../rich/__pycache__/json.cpython-311.pyc | Bin 6533 -> 6533 bytes .../rich/__pycache__/jupyter.cpython-311.pyc | Bin 6393 -> 6393 bytes .../rich/__pycache__/layout.cpython-311.pyc | Bin 23300 -> 23300 bytes .../rich/__pycache__/live.cpython-311.pyc | Bin 21286 -> 21286 bytes .../__pycache__/live_render.cpython-311.pyc | Bin 5134 -> 5134 bytes .../rich/__pycache__/logging.cpython-311.pyc | Bin 14505 -> 14505 bytes .../rich/__pycache__/markup.cpython-311.pyc | Bin 10427 -> 10427 bytes .../rich/__pycache__/measure.cpython-311.pyc | Bin 7260 -> 7260 bytes .../rich/__pycache__/padding.cpython-311.pyc | Bin 7476 -> 7476 bytes .../rich/__pycache__/pager.cpython-311.pyc | Bin 2234 -> 2234 bytes .../rich/__pycache__/palette.cpython-311.pyc | Bin 5967 -> 5967 bytes .../rich/__pycache__/panel.cpython-311.pyc | Bin 12723 -> 12723 bytes .../rich/__pycache__/pretty.cpython-311.pyc | Bin 44337 -> 44337 bytes .../rich/__pycache__/progress.cpython-311.pyc | Bin 82603 -> 82603 bytes .../__pycache__/progress_bar.cpython-311.pyc | Bin 11001 -> 11001 bytes .../rich/__pycache__/prompt.cpython-311.pyc | Bin 16367 -> 16367 bytes .../rich/__pycache__/protocol.cpython-311.pyc | Bin 2085 -> 2085 bytes .../rich/__pycache__/region.cpython-311.pyc | Bin 648 -> 648 bytes .../rich/__pycache__/repr.cpython-311.pyc | Bin 7615 -> 7615 bytes .../rich/__pycache__/rule.cpython-311.pyc | Bin 7154 -> 7154 bytes .../rich/__pycache__/scope.cpython-311.pyc | Bin 4340 -> 4340 bytes .../rich/__pycache__/screen.cpython-311.pyc | Bin 2763 -> 2763 bytes .../rich/__pycache__/segment.cpython-311.pyc | Bin 31593 -> 31593 bytes .../rich/__pycache__/spinner.cpython-311.pyc | Bin 6869 -> 6869 bytes .../rich/__pycache__/status.cpython-311.pyc | Bin 6747 -> 6747 bytes .../rich/__pycache__/style.cpython-311.pyc | Bin 35187 -> 35187 bytes .../rich/__pycache__/styled.cpython-311.pyc | Bin 2428 -> 2428 bytes .../rich/__pycache__/syntax.cpython-311.pyc | Bin 42638 -> 42638 bytes .../rich/__pycache__/table.cpython-311.pyc | Bin 48789 -> 48789 bytes .../terminal_theme.cpython-311.pyc | Bin 3694 -> 3694 bytes .../rich/__pycache__/text.cpython-311.pyc | Bin 64947 -> 64947 bytes .../rich/__pycache__/theme.cpython-311.pyc | Bin 7293 -> 7293 bytes .../rich/__pycache__/themes.cpython-311.pyc | Bin 344 -> 344 bytes .../__pycache__/traceback.cpython-311.pyc | Bin 34556 -> 34556 bytes .../rich/__pycache__/tree.cpython-311.pyc | Bin 12515 -> 12515 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 29035 -> 29035 bytes .../__pycache__/_asyncio.cpython-311.pyc | Bin 5211 -> 5211 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 2551 -> 2551 bytes .../__pycache__/after.cpython-311.pyc | Bin 1746 -> 1746 bytes .../__pycache__/before.cpython-311.pyc | Bin 1580 -> 1580 bytes .../__pycache__/before_sleep.cpython-311.pyc | Bin 2363 -> 2363 bytes .../tenacity/__pycache__/nap.cpython-311.pyc | Bin 1554 -> 1554 bytes .../__pycache__/retry.cpython-311.pyc | Bin 15930 -> 15930 bytes .../tenacity/__pycache__/stop.cpython-311.pyc | Bin 6283 -> 6283 bytes .../__pycache__/tornadoweb.cpython-311.pyc | Bin 2900 -> 2900 bytes .../tenacity/__pycache__/wait.cpython-311.pyc | Bin 13289 -> 13289 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 399 -> 399 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 30838 -> 30838 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 4478 -> 4478 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 391 -> 391 bytes .../pip/_vendor/truststore/__init__.py | 13 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 652 bytes .../__pycache__/_api.cpython-311.pyc | Bin 0 -> 16714 bytes .../__pycache__/_macos.cpython-311.pyc | Bin 0 -> 17394 bytes .../__pycache__/_openssl.cpython-311.pyc | Bin 0 -> 2333 bytes .../_ssl_constants.cpython-311.pyc | Bin 0 -> 1108 bytes .../__pycache__/_windows.cpython-311.pyc | Bin 0 -> 17236 bytes .../pip/_vendor/truststore/_api.py | 302 +++++++++ .../pip/_vendor/truststore/_macos.py | 501 +++++++++++++++ .../pip/_vendor/truststore/_openssl.py | 66 ++ .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 554 ++++++++++++++++ .../__pycache__/__init__.cpython-311.pyc | Bin 3697 -> 3697 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 18285 -> 18285 bytes .../__pycache__/_version.cpython-311.pyc | Bin 207 -> 207 bytes .../__pycache__/connection.cpython-311.pyc | Bin 22053 -> 22053 bytes .../connectionpool.cpython-311.pyc | Bin 38265 -> 38265 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 16111 -> 16111 bytes .../__pycache__/fields.cpython-311.pyc | Bin 11404 -> 11404 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 4485 -> 4485 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 21603 -> 21603 bytes .../__pycache__/request.cpython-311.pyc | Bin 6648 -> 7656 bytes .../__pycache__/response.cpython-311.pyc | Bin 36531 -> 36531 bytes .../pip/_vendor/urllib3/_version.py | 2 +- .../__pycache__/__init__.cpython-311.pyc | Bin 193 -> 193 bytes .../_appengine_environ.cpython-311.pyc | Bin 1932 -> 1932 bytes .../__pycache__/appengine.cpython-311.pyc | Bin 12139 -> 12139 bytes .../__pycache__/ntlmpool.cpython-311.pyc | Bin 6216 -> 6216 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 25725 -> 25725 bytes .../securetransport.cpython-311.pyc | Bin 36832 -> 36832 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 8077 -> 8077 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 210 -> 210 bytes .../__pycache__/bindings.cpython-311.pyc | Bin 16957 -> 16957 bytes .../__pycache__/low_level.cpython-311.pyc | Bin 15594 -> 15594 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 194 -> 194 bytes .../packages/__pycache__/six.cpython-311.pyc | Bin 46436 -> 46436 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 204 -> 204 bytes .../__pycache__/makefile.cpython-311.pyc | Bin 1951 -> 1951 bytes .../weakref_finalize.cpython-311.pyc | Bin 7979 -> 7979 bytes .../pip/_vendor/urllib3/request.py | 21 + .../util/__pycache__/__init__.cpython-311.pyc | Bin 1396 -> 1396 bytes .../__pycache__/connection.cpython-311.pyc | Bin 5123 -> 5123 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 1705 -> 1705 bytes .../util/__pycache__/queue.cpython-311.pyc | Bin 1488 -> 1488 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 4608 -> 4608 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 3477 -> 3477 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 22745 -> 22757 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 16808 -> 16808 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 5787 -> 5787 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 11616 -> 11616 bytes .../util/__pycache__/timeout.cpython-311.pyc | Bin 11330 -> 11330 bytes .../util/__pycache__/url.cpython-311.pyc | Bin 17571 -> 17571 bytes .../util/__pycache__/wait.cpython-311.pyc | Bin 4990 -> 4990 bytes .../pip/_vendor/urllib3/util/retry.py | 2 +- .../site-packages/pip/_vendor/vendor.txt | 7 +- .../__pycache__/__init__.cpython-311.pyc | Bin 12870 -> 12870 bytes .../__pycache__/labels.cpython-311.pyc | Bin 7270 -> 7270 bytes .../__pycache__/mklabels.cpython-311.pyc | Bin 3198 -> 3198 bytes .../__pycache__/tests.cpython-311.pyc | Bin 11176 -> 11176 bytes .../x_user_defined.cpython-311.pyc | Bin 3550 -> 3550 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 160171 -> 160171 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 187 -> 187 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 194 -> 194 bytes .../__pycache__/context.cpython-311.pyc | Bin 11993 -> 11993 bytes .../__pycache__/functools.cpython-311.pyc | Bin 21983 -> 21983 bytes .../text/__pycache__/__init__.cpython-311.pyc | Bin 26597 -> 26597 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 366 -> 366 bytes .../__pycache__/more.cpython-311.pyc | Bin 171782 -> 171782 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 36784 -> 36784 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 561 -> 561 bytes .../__pycache__/_elffile.cpython-311.pyc | Bin 5477 -> 5477 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 10329 -> 10329 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 5133 -> 5133 bytes .../__pycache__/_parser.cpython-311.pyc | Bin 16035 -> 16035 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3681 -> 3681 bytes .../__pycache__/_tokenizer.cpython-311.pyc | Bin 8658 -> 8658 bytes .../__pycache__/markers.cpython-311.pyc | Bin 12016 -> 12016 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 5077 -> 5077 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 41145 -> 41145 bytes .../__pycache__/tags.cpython-311.pyc | Bin 23498 -> 23498 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6806 -> 6806 bytes .../__pycache__/version.cpython-311.pyc | Bin 21065 -> 21065 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 12819 -> 12819 bytes .../__pycache__/api.cpython-311.pyc | Bin 7180 -> 7180 bytes .../__pycache__/unix.cpython-311.pyc | Bin 11022 -> 11022 bytes .../__pycache__/version.cpython-311.pyc | Bin 309 -> 309 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 4299 -> 4299 bytes .../site-packages/ranged_response/__init__.py | 145 +++++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6445 bytes templates/anmeldung.html | 68 +- templates/contact.html | 5 + website/__pycache__/views.cpython-311.pyc | Bin 5333 -> 6964 bytes website/models.py | 7 +- website/views.py | 14 +- 716 files changed, 5935 insertions(+), 1008 deletions(-) mode change 100644 => 100755 bin/activate create mode 100644 lib/python3.11/site-packages/captcha/__init__.py create mode 100644 lib/python3.11/site-packages/captcha/__pycache__/__init__.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/__pycache__/fields.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/__pycache__/helpers.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/__pycache__/models.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/__pycache__/urls.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/__pycache__/views.cpython-311.pyc rename lib/python3.11/site-packages/{pip-23.2.1.dist-info/REQUESTED => captcha/conf/__init__.py} (100%) create mode 100644 lib/python3.11/site-packages/captcha/conf/__pycache__/__init__.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/conf/__pycache__/settings.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/conf/settings.py create mode 100644 lib/python3.11/site-packages/captcha/fields.py create mode 100644 lib/python3.11/site-packages/captcha/fonts/COPYRIGHT.TXT create mode 100644 lib/python3.11/site-packages/captcha/fonts/README.TXT create mode 100644 lib/python3.11/site-packages/captcha/fonts/Vera.ttf create mode 100644 lib/python3.11/site-packages/captcha/helpers.py create mode 100644 lib/python3.11/site-packages/captcha/jinja2/captcha/widgets/captcha.html create mode 100644 lib/python3.11/site-packages/captcha/locale/bg/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/bg/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/cs/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/cs/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/de/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/de/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/en/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/en/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/es/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/es/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/fa/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/fa/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/fr/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/fr/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/it/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/it/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/ja/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/ja/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/nl/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/nl/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/pl/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/pl/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/pt_BR/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/pt_BR/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/ru/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/ru/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/sk/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/sk/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/sv/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/sv/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/tr/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/tr/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/uk/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/uk/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/zh_CN/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/zh_CN/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/locale/zh_Hans/LC_MESSAGES/django.mo create mode 100644 lib/python3.11/site-packages/captcha/locale/zh_Hans/LC_MESSAGES/django.po create mode 100644 lib/python3.11/site-packages/captcha/management/__init__.py create mode 100644 lib/python3.11/site-packages/captcha/management/__pycache__/__init__.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/management/commands/__init__.py create mode 100644 lib/python3.11/site-packages/captcha/management/commands/__pycache__/__init__.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/management/commands/__pycache__/captcha_clean.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/management/commands/__pycache__/captcha_create_pool.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/management/commands/captcha_clean.py create mode 100644 lib/python3.11/site-packages/captcha/management/commands/captcha_create_pool.py create mode 100644 lib/python3.11/site-packages/captcha/migrations/0001_initial.py create mode 100644 lib/python3.11/site-packages/captcha/migrations/0002_alter_captchastore_id.py create mode 100644 lib/python3.11/site-packages/captcha/migrations/__init__.py create mode 100644 lib/python3.11/site-packages/captcha/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/migrations/__pycache__/0002_alter_captchastore_id.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/migrations/__pycache__/__init__.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/models.py create mode 100644 lib/python3.11/site-packages/captcha/templates/captcha/field.html create mode 100644 lib/python3.11/site-packages/captcha/templates/captcha/hidden_field.html create mode 100644 lib/python3.11/site-packages/captcha/templates/captcha/image.html create mode 100644 lib/python3.11/site-packages/captcha/templates/captcha/text_field.html create mode 100644 lib/python3.11/site-packages/captcha/templates/captcha/widgets/captcha.html create mode 100644 lib/python3.11/site-packages/captcha/tests/__init__.py create mode 100644 lib/python3.11/site-packages/captcha/tests/__pycache__/__init__.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/tests/__pycache__/tests.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/tests/__pycache__/urls.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/tests/__pycache__/views.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/captcha/tests/tests.py create mode 100644 lib/python3.11/site-packages/captcha/tests/urls.py create mode 100644 lib/python3.11/site-packages/captcha/tests/views.py create mode 100644 lib/python3.11/site-packages/captcha/urls.py create mode 100644 lib/python3.11/site-packages/captcha/views.py rename lib/python3.11/site-packages/{pip-23.2.1.dist-info => django_ranged_response-0.2.0.dist-info}/INSTALLER (100%) create mode 100644 lib/python3.11/site-packages/django_ranged_response-0.2.0.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/django_ranged_response-0.2.0.dist-info/RECORD rename lib/python3.11/site-packages/{pip-23.2.1.dist-info => django_ranged_response-0.2.0.dist-info}/WHEEL (65%) create mode 100644 lib/python3.11/site-packages/django_ranged_response-0.2.0.dist-info/top_level.txt rename lib/python3.11/site-packages/{pip-23.2.1.dist-info/top_level.txt => django_simple_captcha-0.5.20.dist-info/INSTALLER} (100%) create mode 100644 lib/python3.11/site-packages/django_simple_captcha-0.5.20.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/django_simple_captcha-0.5.20.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/django_simple_captcha-0.5.20.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/django_simple_captcha-0.5.20.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/django_simple_captcha-0.5.20.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/django_simple_captcha-0.5.20.dist-info/top_level.txt rename lib/python3.11/site-packages/{pip-23.2.1.dist-info => pip-23.3.1.dist-info}/AUTHORS.txt (98%) create mode 100644 lib/python3.11/site-packages/pip-23.3.1.dist-info/INSTALLER rename lib/python3.11/site-packages/{pip-23.2.1.dist-info => pip-23.3.1.dist-info}/LICENSE.txt (100%) rename lib/python3.11/site-packages/{pip-23.2.1.dist-info => pip-23.3.1.dist-info}/METADATA (79%) rename lib/python3.11/site-packages/{pip-23.2.1.dist-info => pip-23.3.1.dist-info}/RECORD (88%) create mode 100644 lib/python3.11/site-packages/pip-23.3.1.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/pip-23.3.1.dist-info/WHEEL rename lib/python3.11/site-packages/{pip-23.2.1.dist-info => pip-23.3.1.dist-info}/entry_points.txt (100%) create mode 100644 lib/python3.11/site-packages/pip-23.3.1.dist-info/top_level.txt delete mode 100644 lib/python3.11/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc delete mode 100644 lib/python3.11/site-packages/pip/_internal/utils/inject_securetransport.py delete mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc delete mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-311.pyc create mode 100644 lib/python3.11/site-packages/pip/_vendor/truststore/_api.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 lib/python3.11/site-packages/ranged_response/__init__.py create mode 100644 lib/python3.11/site-packages/ranged_response/__pycache__/__init__.cpython-311.pyc diff --git a/bin/activate b/bin/activate old mode 100644 new mode 100755 diff --git a/impuls/__pycache__/settings.cpython-311.pyc b/impuls/__pycache__/settings.cpython-311.pyc index 06384d095681621e14232c5c7fbe7afece7d09b2..900b30811996acdfc67ad01f6452d1ce793ef9cb 100644 GIT binary patch delta 92 zcmZ1{v0Z|9IWI340}y=v?~(dxBX2A-Bgf=y=J}kr*pm|rN|G}YH*>L+GqVW+l~j35 ozR0ezc|H4MCPvH2lezi?Ifd9hFu;fgz7JxPjktfXm;==U01t<8 delta 73 zcmdlku}*?_IWI340}w2FZIk+VBX2A-Bm3lR=J}h2S<0Ci1vhuI3otWUOrFElC&(eh V_JILLH1K^8nQYDdgT)M}7XaY`65#*< diff --git a/impuls/__pycache__/urls.cpython-311.pyc b/impuls/__pycache__/urls.cpython-311.pyc index d591439ef6ebe003f7cc17b612e17c9b52885568..5ba465896e265ebf49ef2c96121fb15be20b6e2f 100644 GIT binary patch delta 466 zcmX@fe_T*~IWI340}#wP>7L5M#=!6x#DM`pDC6^)iR#fJxk6Dwxx!Jxj0{W+sVpgM zsXQs{lNA_6`8iXWvP58dvP2hdVw`Ni$jT~{DwHA%QXnsvDx4y}hGQ8s1H)<{hJbY5 zD6tfUUrlsfqk%UZ=M4ydqxkpNJ4 z6$eyOzX;?+KTYw;MXb&2V7Vf}$)8yLxDwSN#Vj21ZY&4?wX2AvKA% uc=8>#yB0TCI2v3!q$Y$fh`hj}f00H13X48Au@BOG{A>-}AXp>^^eg~4#B0+4 delta 212 zcmX>uc#>azIWI340}y1fxu#BFWng#=;=lkul<|4OMD^&2U8>wdFqtgjg}WHJ(z&BV zQe=V|G-WscU|i0`$TfKZOZ;R()-}w2nxd2Mu{KZ6X7lEf18QOf;^Okj2iUwkZZMQx Zpaz<}iT$p?2XP*LwgzqxERq4*0RXhjJzD?( diff --git a/impuls/urls.py b/impuls/urls.py index 38f0d4fd..5f4b74d2 100644 --- a/impuls/urls.py +++ b/impuls/urls.py @@ -15,7 +15,7 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import path, include from django.conf import settings from website.views import newspage, post, about, search, home, contact, datenschutz, impressum, anmeldung, tagungsplan, success, failure @@ -34,4 +34,5 @@ urlpatterns = [ path('tagungsplan/', tagungsplan, name = 'tagungsplan'), path('success/', success, name = 'success'), path('failure/', failure, name = 'failure'), + path('captcha/', include('captcha.urls')), ] diff --git a/lib/python3.11/site-packages/captcha/__init__.py b/lib/python3.11/site-packages/captcha/__init__.py new file mode 100644 index 00000000..0b612318 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/__init__.py @@ -0,0 +1,6 @@ +VERSION = (0, 5, 20) + + +def get_version(): + "Return the version as a human-format string." + return ".".join([str(i) for i in VERSION]) diff --git a/lib/python3.11/site-packages/captcha/__pycache__/__init__.cpython-311.pyc b/lib/python3.11/site-packages/captcha/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9f034af04edac271a1934b197995d0172fe0c31 GIT binary patch literal 669 zcmZWn&r2IY6n?Xtsw7n!&ADCZX~E1?dhrl~hYGC+1p_GvWtr}7lWF%CGZTYiAqP)I zD1t?gUTP`+D?M27Q1(>l$y*?|T-rC$q_#eGzW0Ogeedngewm#u0@}CV&%*=szf3YV zauW<5U~mipY(YTwVT%M-16)`FIg9V|N!fL*0>yquZgg9ZDtA#No=}PP-HHr1~b6G1rdLQY0-pB-Ed@ zqpDeU0ncC&;TT%52d~QSiN3|zBmWLPv<~JQ@D*H=+o{yW|Z74vzf{WfQwClaAOk7hf=Vl5I%`)Qoj zcOSJv?cKZOqjx<>LEf8E-KaQ=ahVEoRklnN6krTfDFJ@3vW}AHd^OSRd}fNc#^;c$T^V literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/__pycache__/fields.cpython-311.pyc b/lib/python3.11/site-packages/captcha/__pycache__/fields.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c495e0a963999a8a21025a6f5264889b42e06b79 GIT binary patch literal 14619 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 DDa_wO literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/__pycache__/views.cpython-311.pyc b/lib/python3.11/site-packages/captcha/__pycache__/views.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65193868ea9899d13013b6cb4acdebd345bc5ac0 GIT binary patch literal 10666 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 G*Z&8z#^&e% literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/pip-23.2.1.dist-info/REQUESTED b/lib/python3.11/site-packages/captcha/conf/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip-23.2.1.dist-info/REQUESTED rename to lib/python3.11/site-packages/captcha/conf/__init__.py diff --git a/lib/python3.11/site-packages/captcha/conf/__pycache__/__init__.cpython-311.pyc b/lib/python3.11/site-packages/captcha/conf/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6021fc08ad6fcdd3dcb0550a1efb125e966bf69 GIT binary patch literal 178 zcmZ3^%ge<81ZVzxq=M+jAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnFIWAt#3KFj z@^bym+=9}aV*Q-VB>jTQl8pR3V?9Gd{o>4$RNaEa% w`1s7c%#!$cy@JYL95%W6DWy57c15f}Q$h9?^8<+w%#4hT9~fXn5i?K>0Dsym@Bjb+ literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/conf/__pycache__/settings.cpython-311.pyc b/lib/python3.11/site-packages/captcha/conf/__pycache__/settings.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c1a36bd00bf6a3c7f24487ef1490a7d5090995f GIT binary patch literal 4691 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/conf/settings.py b/lib/python3.11/site-packages/captcha/conf/settings.py new file mode 100644 index 00000000..f31cdd07 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/conf/settings.py @@ -0,0 +1,99 @@ +import os +import warnings + +from django.conf import settings + + +CAPTCHA_FONT_PATH = getattr( + settings, + "CAPTCHA_FONT_PATH", + os.path.normpath(os.path.join(os.path.dirname(__file__), "..", "fonts/Vera.ttf")), +) +CAPTCHA_FONT_SIZE = getattr(settings, "CAPTCHA_FONT_SIZE", 22) +CAPTCHA_LETTER_ROTATION = getattr(settings, "CAPTCHA_LETTER_ROTATION", (-35, 35)) +CAPTCHA_BACKGROUND_COLOR = getattr(settings, "CAPTCHA_BACKGROUND_COLOR", "#ffffff") +CAPTCHA_FOREGROUND_COLOR = getattr(settings, "CAPTCHA_FOREGROUND_COLOR", "#001100") +CAPTCHA_CHALLENGE_FUNCT = getattr( + settings, "CAPTCHA_CHALLENGE_FUNCT", "captcha.helpers.random_char_challenge" +) +CAPTCHA_NOISE_FUNCTIONS = getattr( + settings, + "CAPTCHA_NOISE_FUNCTIONS", + ("captcha.helpers.noise_arcs", "captcha.helpers.noise_dots"), +) +CAPTCHA_FILTER_FUNCTIONS = getattr( + settings, "CAPTCHA_FILTER_FUNCTIONS", ("captcha.helpers.post_smooth",) +) +CAPTCHA_WORDS_DICTIONARY = getattr( + settings, "CAPTCHA_WORDS_DICTIONARY", "/usr/share/dict/words" +) +CAPTCHA_PUNCTUATION = getattr(settings, "CAPTCHA_PUNCTUATION", """_"',.;:-""") +CAPTCHA_FLITE_PATH = getattr(settings, "CAPTCHA_FLITE_PATH", None) +CAPTCHA_SOX_PATH = getattr(settings, "CAPTCHA_SOX_PATH", None) +CAPTCHA_TIMEOUT = getattr(settings, "CAPTCHA_TIMEOUT", 5) # Minutes +CAPTCHA_LENGTH = int(getattr(settings, "CAPTCHA_LENGTH", 4)) # Chars +# CAPTCHA_IMAGE_BEFORE_FIELD = getattr(settings, 'CAPTCHA_IMAGE_BEFORE_FIELD', True) +CAPTCHA_DICTIONARY_MIN_LENGTH = getattr(settings, "CAPTCHA_DICTIONARY_MIN_LENGTH", 0) +CAPTCHA_DICTIONARY_MAX_LENGTH = getattr(settings, "CAPTCHA_DICTIONARY_MAX_LENGTH", 99) +CAPTCHA_IMAGE_SIZE = getattr(settings, "CAPTCHA_IMAGE_SIZE", None) +CAPTCHA_IMAGE_TEMPLATE = getattr( + settings, "CAPTCHA_IMAGE_TEMPLATE", "captcha/image.html" +) +CAPTCHA_HIDDEN_FIELD_TEMPLATE = getattr( + settings, "CAPTCHA_HIDDEN_FIELD_TEMPLATE", "captcha/hidden_field.html" +) +CAPTCHA_TEXT_FIELD_TEMPLATE = getattr( + settings, "CAPTCHA_TEXT_FIELD_TEMPLATE", "captcha/text_field.html" +) + +if getattr(settings, "CAPTCHA_FIELD_TEMPLATE", None): + msg = "CAPTCHA_FIELD_TEMPLATE setting is deprecated in favor of widget's template_name." + warnings.warn(msg, DeprecationWarning) +CAPTCHA_FIELD_TEMPLATE = getattr(settings, "CAPTCHA_FIELD_TEMPLATE", None) +if getattr(settings, "CAPTCHA_OUTPUT_FORMAT", None): + msg = "CAPTCHA_OUTPUT_FORMAT setting is deprecated in favor of widget's template_name." + warnings.warn(msg, DeprecationWarning) +CAPTCHA_OUTPUT_FORMAT = getattr(settings, "CAPTCHA_OUTPUT_FORMAT", None) + +CAPTCHA_MATH_CHALLENGE_OPERATOR = getattr( + settings, "CAPTCHA_MATH_CHALLENGE_OPERATOR", "*" +) +CAPTCHA_GET_FROM_POOL = getattr(settings, "CAPTCHA_GET_FROM_POOL", False) +CAPTCHA_GET_FROM_POOL_TIMEOUT = getattr(settings, "CAPTCHA_GET_FROM_POOL_TIMEOUT", 5) + +CAPTCHA_TEST_MODE = getattr(settings, "CAPTCHA_TEST_MODE", False) + +CAPTCHA_2X_IMAGE = getattr(settings, "CAPTCHA_2X_IMAGE", True) + +# Failsafe +if CAPTCHA_DICTIONARY_MIN_LENGTH > CAPTCHA_DICTIONARY_MAX_LENGTH: + CAPTCHA_DICTIONARY_MIN_LENGTH, CAPTCHA_DICTIONARY_MAX_LENGTH = ( + CAPTCHA_DICTIONARY_MAX_LENGTH, + CAPTCHA_DICTIONARY_MIN_LENGTH, + ) + + +def _callable_from_string(string_or_callable): + if callable(string_or_callable): + return string_or_callable + else: + return getattr( + __import__(".".join(string_or_callable.split(".")[:-1]), {}, {}, [""]), + string_or_callable.split(".")[-1], + ) + + +def get_challenge(generator=None): + return _callable_from_string(generator or CAPTCHA_CHALLENGE_FUNCT) + + +def noise_functions(): + if CAPTCHA_NOISE_FUNCTIONS: + return map(_callable_from_string, CAPTCHA_NOISE_FUNCTIONS) + return [] + + +def filter_functions(): + if CAPTCHA_FILTER_FUNCTIONS: + return map(_callable_from_string, CAPTCHA_FILTER_FUNCTIONS) + return [] diff --git a/lib/python3.11/site-packages/captcha/fields.py b/lib/python3.11/site-packages/captcha/fields.py new file mode 100644 index 00000000..6aa4e59d --- /dev/null +++ b/lib/python3.11/site-packages/captcha/fields.py @@ -0,0 +1,276 @@ +import warnings + +import django +from django.core.exceptions import ImproperlyConfigured +from django.forms import ValidationError +from django.forms.fields import CharField, MultiValueField +from django.forms.widgets import HiddenInput, MultiWidget, TextInput +from django.template.loader import render_to_string +from django.urls import NoReverseMatch, reverse +from django.utils import timezone +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy + +from captcha.conf import settings +from captcha.models import CaptchaStore + + +class CaptchaHiddenInput(HiddenInput): + """Hidden input for the captcha key.""" + + # Use *args and **kwargs because signature changed in Django 1.11 + def build_attrs(self, *args, **kwargs): + """Disable autocomplete to prevent problems on page reload.""" + + attrs = super().build_attrs(*args, **kwargs) + attrs["autocomplete"] = "off" + return attrs + + +class CaptchaAnswerInput(TextInput): + """Text input for captcha answer.""" + + # Use *args and **kwargs because signature changed in Django 1.11 + def build_attrs(self, *args, **kwargs): + """Disable automatic corrections and completions.""" + attrs = super().build_attrs(*args, **kwargs) + attrs["autocapitalize"] = "off" + attrs["autocomplete"] = "off" + attrs["autocorrect"] = "off" + attrs["spellcheck"] = "false" + return attrs + + +class BaseCaptchaTextInput(MultiWidget): + """ + Base class for Captcha widgets + """ + + def __init__(self, attrs=None): + widgets = (CaptchaHiddenInput(attrs), CaptchaAnswerInput(attrs)) + super(BaseCaptchaTextInput, self).__init__(widgets, attrs) + + def decompress(self, value): + if value: + return value.split(",") + return [None, None] + + def fetch_captcha_store(self, name, value, attrs=None, generator=None): + """ + Fetches a new CaptchaStore + This has to be called inside render + """ + try: + reverse("captcha-image", args=("dummy",)) + except NoReverseMatch: + raise ImproperlyConfigured( + "Make sure you've included captcha.urls as explained in the INSTALLATION section on http://readthedocs.org/docs/django-simple-captcha/en/latest/usage.html#installation" + ) + + if settings.CAPTCHA_GET_FROM_POOL: + key = CaptchaStore.pick() + else: + key = CaptchaStore.generate_key(generator) + + # these can be used by format_output and render + self._value = [key, ""] + self._key = key + self.id_ = self.build_attrs(attrs).get("id", None) + + def id_for_label(self, id_): + if id_: + return id_ + "_1" + return id_ + + def image_url(self): + return reverse("captcha-image", kwargs={"key": self._key}) + + def audio_url(self): + return ( + reverse("captcha-audio", kwargs={"key": self._key}) + if settings.CAPTCHA_FLITE_PATH + else None + ) + + def refresh_url(self): + return reverse("captcha-refresh") + + +class CaptchaTextInput(BaseCaptchaTextInput): + + template_name = "captcha/widgets/captcha.html" + + def __init__( + self, + attrs=None, + field_template=None, + id_prefix=None, + generator=None, + output_format=None, + ): + self.id_prefix = id_prefix + self.generator = generator + if field_template is not None: + msg = "CaptchaTextInput's field_template argument is deprecated in favor of widget's template_name." + warnings.warn(msg, DeprecationWarning) + self.field_template = field_template or settings.CAPTCHA_FIELD_TEMPLATE + if output_format is not None: + msg = "CaptchaTextInput's output_format argument is deprecated in favor of widget's template_name." + warnings.warn(msg, DeprecationWarning) + self.output_format = output_format or settings.CAPTCHA_OUTPUT_FORMAT + # Fallback to custom rendering in Django < 1.11 + if ( + not hasattr(self, "_render") + and self.field_template is None + and self.output_format is None + ): + self.field_template = "captcha/field.html" + + if self.output_format: + for key in ("image", "hidden_field", "text_field"): + if "%%(%s)s" % key not in self.output_format: + raise ImproperlyConfigured( + "All of %s must be present in your CAPTCHA_OUTPUT_FORMAT setting. Could not find %s" + % ( + ", ".join( + [ + "%%(%s)s" % k + for k in ("image", "hidden_field", "text_field") + ] + ), + "%%(%s)s" % key, + ) + ) + + super(CaptchaTextInput, self).__init__(attrs) + + def build_attrs(self, *args, **kwargs): + ret = super(CaptchaTextInput, self).build_attrs(*args, **kwargs) + if self.id_prefix and "id" in ret: + ret["id"] = "%s_%s" % (self.id_prefix, ret["id"]) + return ret + + def id_for_label(self, id_): + ret = super(CaptchaTextInput, self).id_for_label(id_) + if self.id_prefix and "id" in ret: + ret = "%s_%s" % (self.id_prefix, ret) + return ret + + def get_context(self, name, value, attrs): + """Add captcha specific variables to context.""" + context = super(CaptchaTextInput, self).get_context(name, value, attrs) + context["image"] = self.image_url() + context["audio"] = self.audio_url() + return context + + def format_output(self, rendered_widgets): + # hidden_field, text_field = rendered_widgets + if self.output_format: + ret = self.output_format % { + "image": self.image_and_audio, + "hidden_field": self.hidden_field, + "text_field": self.text_field, + } + return ret + + elif self.field_template: + context = { + "image": mark_safe(self.image_and_audio), + "hidden_field": mark_safe(self.hidden_field), + "text_field": mark_safe(self.text_field), + } + return render_to_string(self.field_template, context) + + def _direct_render(self, name, attrs): + """Render the widget the old way - using field_template or output_format.""" + context = { + "image": self.image_url(), + "name": name, + "key": self._key, + "id": "%s_%s" % (self.id_prefix, attrs.get("id")) + if self.id_prefix + else attrs.get("id"), + "audio": self.audio_url(), + } + self.image_and_audio = render_to_string( + settings.CAPTCHA_IMAGE_TEMPLATE, context + ) + self.hidden_field = render_to_string( + settings.CAPTCHA_HIDDEN_FIELD_TEMPLATE, context + ) + self.text_field = render_to_string( + settings.CAPTCHA_TEXT_FIELD_TEMPLATE, context + ) + return self.format_output(None) + + def render(self, name, value, attrs=None, renderer=None): + self.fetch_captcha_store(name, value, attrs, self.generator) + + if self.field_template or self.output_format: + return self._direct_render(name, attrs) + + extra_kwargs = {} + if django.VERSION >= (1, 11): + # https://docs.djangoproject.com/en/1.11/ref/forms/widgets/#django.forms.Widget.render + extra_kwargs["renderer"] = renderer + + return super(CaptchaTextInput, self).render( + name, self._value, attrs=attrs, **extra_kwargs + ) + + +class CaptchaField(MultiValueField): + def __init__(self, *args, **kwargs): + fields = (CharField(show_hidden_initial=True), CharField()) + if "error_messages" not in kwargs or "invalid" not in kwargs.get( + "error_messages" + ): + if "error_messages" not in kwargs: + kwargs["error_messages"] = {} + kwargs["error_messages"].update( + {"invalid": gettext_lazy("Invalid CAPTCHA")} + ) + + kwargs["widget"] = kwargs.pop( + "widget", + CaptchaTextInput( + output_format=kwargs.pop("output_format", None), + id_prefix=kwargs.pop("id_prefix", None), + generator=kwargs.pop("generator", None), + ), + ) + + super(CaptchaField, self).__init__(fields, *args, **kwargs) + + def compress(self, data_list): + if data_list: + return ",".join(data_list) + return None + + def clean(self, value): + super(CaptchaField, self).clean(value) + response, value[1] = (value[1] or "").strip().lower(), "" + if not settings.CAPTCHA_GET_FROM_POOL: + CaptchaStore.remove_expired() + if settings.CAPTCHA_TEST_MODE and response.lower() == "passed": + # automatically pass the test + try: + # try to delete the captcha based on its hash + CaptchaStore.objects.get(hashkey=value[0]).delete() + except CaptchaStore.DoesNotExist: + # ignore errors + pass + elif not self.required and not response: + pass + else: + try: + CaptchaStore.objects.get( + response=response, hashkey=value[0], expiration__gt=timezone.now() + ).delete() + except CaptchaStore.DoesNotExist: + raise ValidationError( + getattr(self, "error_messages", {}).get( + "invalid", gettext_lazy("Invalid CAPTCHA") + ) + ) + return value diff --git a/lib/python3.11/site-packages/captcha/fonts/COPYRIGHT.TXT b/lib/python3.11/site-packages/captcha/fonts/COPYRIGHT.TXT new file mode 100644 index 00000000..bb7523a0 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/fonts/COPYRIGHT.TXT @@ -0,0 +1,123 @@ +Bitstream Vera Fonts Copyright + +The fonts have a generous copyright, allowing derivative works (as +long as "Bitstream" or "Vera" are not in the names), and full +redistribution (so long as they are not *sold* by themselves). They +can be be bundled, redistributed and sold with any software. + +The fonts are distributed under the following copyright: + +Copyright +========= + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream +Vera is a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute +the Font Software, including without limitation the rights to use, +copy, merge, publish, distribute, and/or sell copies of the Font +Software, and to permit persons to whom the Font Software is furnished +to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Bitstream" or the word "Vera". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Bitstream Vera" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, +OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT +SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font +Software without prior written authorization from the Gnome Foundation +or Bitstream Inc., respectively. For further information, contact: +fonts at gnome dot org. + +Copyright FAQ +============= + + 1. I don't understand the resale restriction... What gives? + + Bitstream is giving away these fonts, but wishes to ensure its + competitors can't just drop the fonts as is into a font sale system + and sell them as is. It seems fair that if Bitstream can't make money + from the Bitstream Vera fonts, their competitors should not be able to + do so either. You can sell the fonts as part of any software package, + however. + + 2. I want to package these fonts separately for distribution and + sale as part of a larger software package or system. Can I do so? + + Yes. A RPM or Debian package is a "larger software package" to begin + with, and you aren't selling them independently by themselves. + See 1. above. + + 3. Are derivative works allowed? + Yes! + + 4. Can I change or add to the font(s)? + Yes, but you must change the name(s) of the font(s). + + 5. Under what terms are derivative works allowed? + + You must change the name(s) of the fonts. This is to ensure the + quality of the fonts, both to protect Bitstream and Gnome. We want to + ensure that if an application has opened a font specifically of these + names, it gets what it expects (though of course, using fontconfig, + substitutions could still could have occurred during font + opening). You must include the Bitstream copyright. Additional + copyrights can be added, as per copyright law. Happy Font Hacking! + + 6. If I have improvements for Bitstream Vera, is it possible they might get + adopted in future versions? + + Yes. The contract between the Gnome Foundation and Bitstream has + provisions for working with Bitstream to ensure quality additions to + the Bitstream Vera font family. Please contact us if you have such + additions. Note, that in general, we will want such additions for the + entire family, not just a single font, and that you'll have to keep + both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add + glyphs to the font, they must be stylistically in keeping with Vera's + design. Vera cannot become a "ransom note" font. Jim Lyles will be + providing a document describing the design elements used in Vera, as a + guide and aid for people interested in contributing to Vera. + + 7. I want to sell a software package that uses these fonts: Can I do so? + + Sure. Bundle the fonts with your software and sell your software + with the fonts. That is the intent of the copyright. + + 8. If applications have built the names "Bitstream Vera" into them, + can I override this somehow to use fonts of my choosing? + + This depends on exact details of the software. Most open source + systems and software (e.g., Gnome, KDE, etc.) are now converting to + use fontconfig (see www.fontconfig.org) to handle font configuration, + selection and substitution; it has provisions for overriding font + names and substituting alternatives. An example is provided by the + supplied local.conf file, which chooses the family Bitstream Vera for + "sans", "serif" and "monospace". Other software (e.g., the XFree86 + core server) has other mechanisms for font substitution. diff --git a/lib/python3.11/site-packages/captcha/fonts/README.TXT b/lib/python3.11/site-packages/captcha/fonts/README.TXT new file mode 100644 index 00000000..1cf37bdb --- /dev/null +++ b/lib/python3.11/site-packages/captcha/fonts/README.TXT @@ -0,0 +1,11 @@ +Contained herin is the Bitstream Vera font family. + +The Copyright information is found in the COPYRIGHT.TXT file (along +with being incorporated into the fonts themselves). + +The releases notes are found in the file "RELEASENOTES.TXT". + +We hope you enjoy Vera! + + Bitstream, Inc. + The Gnome Project diff --git a/lib/python3.11/site-packages/captcha/fonts/Vera.ttf b/lib/python3.11/site-packages/captcha/fonts/Vera.ttf new file mode 100644 index 0000000000000000000000000000000000000000..58cd6b5e61eff273e920942e28041f8ddcf1e1b5 GIT binary patch literal 65932 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

B-* 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 settings.CAPTCHA_DICTIONARY_MIN_LENGTH + and len(word) <= settings.CAPTCHA_DICTIONARY_MAX_LENGTH + ): + break + return word.upper(), word.lower() + + +def huge_words_and_punctuation_challenge(): + "Yay, undocumneted. Mostly used to test Issue 39 - http://code.google.com/p/django-simple-captcha/issues/detail?id=39" + fd = open(settings.CAPTCHA_WORDS_DICTIONARY, "rb") + lines = fd.readlines() + fd.close() + word = "" + while True: + word1 = random.choice(lines).strip() + word2 = random.choice(lines).strip() + punct = random.choice(settings.CAPTCHA_PUNCTUATION) + word = "%s%s%s" % (word1, punct, word2) + if ( + len(word) >= settings.CAPTCHA_DICTIONARY_MIN_LENGTH + and len(word) <= settings.CAPTCHA_DICTIONARY_MAX_LENGTH + ): + break + return word.upper(), word.lower() + + +def noise_arcs(draw, image): + size = image.size + draw.arc([-20, -20, size[0], 20], 0, 295, fill=settings.CAPTCHA_FOREGROUND_COLOR) + draw.line( + [-20, 20, size[0] + 20, size[1] - 20], fill=settings.CAPTCHA_FOREGROUND_COLOR + ) + draw.line([-20, 0, size[0] + 20, size[1]], fill=settings.CAPTCHA_FOREGROUND_COLOR) + return draw + + +def noise_dots(draw, image): + size = image.size + for p in range(int(size[0] * size[1] * 0.1)): + draw.point( + (random.randint(0, size[0]), random.randint(0, size[1])), + fill=settings.CAPTCHA_FOREGROUND_COLOR, + ) + return draw + + +def noise_null(draw, image): + return draw + + +def post_smooth(image): + from PIL import ImageFilter + + return image.filter(ImageFilter.SMOOTH) + + +def captcha_image_url(key): + """Return url to image. Need for ajax refresh and, etc""" + return reverse("captcha-image", args=[key]) + + +def captcha_audio_url(key): + """Return url to image. Need for ajax refresh and, etc""" + return reverse("captcha-audio", args=[key]) diff --git a/lib/python3.11/site-packages/captcha/jinja2/captcha/widgets/captcha.html b/lib/python3.11/site-packages/captcha/jinja2/captcha/widgets/captcha.html new file mode 100644 index 00000000..5531a1e8 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/jinja2/captcha/widgets/captcha.html @@ -0,0 +1,2 @@ +{% if audio %}{% endif %}captcha{% if audio %}{% endif %} +{% include "django/forms/widgets/multiwidget.html" %} diff --git a/lib/python3.11/site-packages/captcha/locale/bg/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/bg/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..79f3bffe3bf4682bfbb0b8ff14062393aedbc5e8 GIT binary patch literal 653 zcmaivL2DC16vs!cm%S835XHmurpTA!!$8S9Bb0rgT#jRvH~cy32KDsFmGZ3EJVg z>+En~;X)V%8zMJ_qb-}sl&^`e8 z7ChtD(WKzoD(*}X!=}(eNewTY8SI%pEcf^9xqX~mpa;{t;mH+15Sdyp$G^%CF*3oBgxWwK5eFZ!xQw?#qMbjPGp zXE7{pNf)$Lui%QVo1$xD(D^L2_1Y4g+xlG%cj^$`3yA;hzn5?QxP0%&{tU`Pl+*H{ zJS6^WdE`(2x$#5rr+$bnQ$RWLBY%vxeCLP$#7~I-;-~&w)%6R_#E+pmKe0M0KVbgD NAJ3kj_%lBxe*laH, 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.4.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-02-10 14:43+0200\n" +"PO-Revision-Date: 2014-02-10 15:00+0200\n" +"Last-Translator: Venelin Stoykov \n" +"Language-Team: bg \n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: fields.py:91 +msgid "Play CAPTCHA as audio file" +msgstr "Чуй текста като аудио файл" + +#: fields.py:106 fields.py:135 tests/tests.py:99 tests/tests.py:239 +#: tests/tests.py:246 +msgid "Invalid CAPTCHA" +msgstr "Сгрешен текст" + +#: tests/tests.py:125 +msgid "This field is required." +msgstr "Това поле е задължително" diff --git a/lib/python3.11/site-packages/captcha/locale/cs/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/cs/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..2b08625205622866636458c7e2af2a9c29254e64 GIT binary patch literal 597 zcmYL`!EVz)5QY~h67mJX0i=q;(cZgfp8GA^&NqUcTL`ui2cW;n(K^9{Zy^yskV7!-RyVu0n&kN z3uWL~)yT3+Im)mufD(&mt+H5zEVX8ix#yFDe?se&(J_c{CwvwhVPmZ4Q&*~j@3*Dn znTa7t-}56}sIHU0k{)B|iKxdT!No3!=dtKN7Cj+?x6*l@S*cwuy|FRuVZm0ezX$Yta6 gs)e~cG5`O^nRaF@%ZxYBm>OY@qzk3>@@L5Y0)S?uasU7T literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/locale/cs/LC_MESSAGES/django.po b/lib/python3.11/site-packages/captcha/locale/cs/LC_MESSAGES/django.po new file mode 100644 index 00000000..21ef0297 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/locale/cs/LC_MESSAGES/django.po @@ -0,0 +1,30 @@ +# Czech translation of django-simple-captcha. +# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Beda Kosata , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.3.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-10-09 07:05+0200\n" +"PO-Revision-Date: 2012-10-09 07:08+0200\n" +"Last-Translator: Beda Kosata \n" +"Language-Team: Czech <>\n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: fields.py:50 +msgid "Play CAPTCHA as audio file" +msgstr "Přehrát captchu jako audio soubor" + +#: fields.py:67 fields.py:99 tests/__init__.py:62 +msgid "Invalid CAPTCHA" +msgstr "Neplatná CAPTCHA" + +#: tests/__init__.py:88 +msgid "This field is required." +msgstr "Toto pole je povinné." diff --git a/lib/python3.11/site-packages/captcha/locale/de/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..3d7fbfbe7d8e762b5a1fe84c943798ebf3c7a71b GIT binary patch literal 634 zcmYL`&u-H|5XKiM7hjOzfCL<-x1wr|9R#hM1U2LjL~4XpxrhTo+IXkVwwqmdcb$?W z55bMcK%BVsJ$M$zX{(I%(>G)9tY`fFd%W|LQS1;eh#v8f_)4@<6OV{X;u-OScuM>t z{5{5glRhE#?lZPa+9Q2V`i+!cZ|;3S+6FyhY-(0QD+$9vUJO4DSgytTt^nadG*VeO zQyN*ZP@Xc>5-4$a*(irHX1TNHSOz|o{4+YQtjR#03sYI{)w0&eOHqe%A)*tktqXkS zD<%2+rt-Y78ASOfeu692cJh%3m_a8=U-RUEr*9$cWNEUWq)8GT3moUki zaH_n3W6{jfL9f24W4)=5q*^H(my37QX{tt4$O{z93`S$_2tKwI%=n literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/locale/de/LC_MESSAGES/django.po b/lib/python3.11/site-packages/captcha/locale/de/LC_MESSAGES/django.po new file mode 100644 index 00000000..0c446eba --- /dev/null +++ b/lib/python3.11/site-packages/captcha/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,32 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-07-16 12:06+0200\n" +"PO-Revision-Date: 2013-07-16 12:10+0100\n" +"Last-Translator: Patrick Lauber \n" +"Language-Team: DE \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.5.7\n" + +#: fields.py:90 +msgid "Play CAPTCHA as audio file" +msgstr "CAPTCHA als Audiodatei abspielen." + +#: fields.py:105 fields.py:134 tests/tests.py:99 tests/tests.py:239 +#: tests/tests.py:246 +msgid "Invalid CAPTCHA" +msgstr "Ungültiges CAPTCHA" + +#: tests/tests.py:125 +msgid "This field is required." +msgstr "Dieses Feld wird benötigt." diff --git a/lib/python3.11/site-packages/captcha/locale/en/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..851e9562c034022bb081e19106c0945319545d53 GIT binary patch literal 591 zcmb`E%}T^D5XbA+r3iu-K|IV|vbH_=(RD>#cX7eRB2_P5#&)ccG^t4{dh{W@`4~Qr z&*IcYym@lq$NVQVlgyCM)y21fZIRhv_L(K-hUu(fR+vX-oq1)}n0MxSE(ku@clqV{ zS$>0km)~K}>F;|N*muT9K`_xzsALJlqbwhu9tD}gm!AO80k)+ya3>W7`Mq?kNR`0C z(qk(vmAxRd=79!i^sln|9*XlkED%33^H)iQ-5^dm`S3I7#E}%_xbY@C=<7xkc?1dSg?VqAd&@8%^Fz z*spJA>aeO&s$OC01MbmPixr8Suug&W-(_7zIGs#KzYE1Y_|Rxinje2@csftdeydR^ zbsu;+>&Oo-^Rd|dt?P!oBP&L_Fs0O03cI(`hnZ?EDls;;b}8uQJ9LAj4>LK?2XR0A HkFWUxNQR`~ literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/locale/en/LC_MESSAGES/django.po b/lib/python3.11/site-packages/captcha/locale/en/LC_MESSAGES/django.po new file mode 100644 index 00000000..870d08e8 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,30 @@ +# django-simple-captcha French translation. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Patrick Samson , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.2.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-25 11:44+0300\n" +"PO-Revision-Date: 2010-09-16 12:16+0200\n" +"Last-Translator: Marco Bonetti \n" +"Language-Team: en \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n>1;\n" + +#: fields.py:49 +msgid "Play CAPTCHA as audio file" +msgstr "Play CAPTCHA as audio file" + +#: fields.py:66 fields.py:89 tests/__init__.py:62 +msgid "Invalid CAPTCHA" +msgstr "Invalid CAPTCHA" + +#: tests/__init__.py:88 +msgid "This field is required." +msgstr "This field is required." diff --git a/lib/python3.11/site-packages/captcha/locale/es/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..af8f4816886ce13fa74047288a5f5a24a577cfac GIT binary patch literal 600 zcmYL`&2H2%5XTLaOAa9Qf&?6|cGNbj(L*|ls%zR@WF+Z3u zcZB%Gy3ahgE5sAl1J?0e!OGj)y!Ti~<0T;$cB5LOVRl?rvvz>dSq!8p{hC>>p39ppmGPw2cMn}fbkwjt?F*S9EZ)rWemqBHEt1-bN% z(elmEcv(>nQTaih;l_+N<%tTILzbj3WpXI91hO>GvKL93B++~2gRGpgzEy!-4(kwl zpHC)@3F~1M*VIk4Qw@1dD@Q@`4ciQ=L0O^dazKBxvJIAt<@~nhG)|%!*?^W`x$e1) zfLCGCx60TlaQ)6>C_YxF^62*5Sj{;)Ikz=wW1Ad~RwhJcJ2=(KQ*xcp!S>tG7ughc zZt={*K>_LWY4lmXMT>6NQAwyxfHZy;A4cNeP{0ywe*fe#k>D?Mq=(wLn<;7BO-ams TK&VyM6L$), YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-07-16 12:06+0200\n" +"PO-Revision-Date: 2014-05-20 21:22+0100\n" +"Last-Translator: https://github.com/dragosdobrota\n" +"Language-Team: es\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.6.5\n" + +#: fields.py:90 +msgid "Play CAPTCHA as audio file" +msgstr "Reproducir CAPTCHA de audio" + +#: fields.py:105 fields.py:134 tests/tests.py:99 tests/tests.py:239 +#: tests/tests.py:246 +msgid "Invalid CAPTCHA" +msgstr "CAPTCHA no válido" + +#: tests/tests.py:125 +msgid "This field is required." +msgstr "Este campo es obligatorio." diff --git a/lib/python3.11/site-packages/captcha/locale/fa/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/fa/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..195c7ad1c14500f1f7a294f7e3a94eb5e39b19d8 GIT binary patch literal 688 zcmaKnF>ljA6vq!Jix(soB*gF}*w7g#VF*rBwS=}rB4AYpF|Zu*#kpeNx#x4#j+IKN zL{>KTv=ybQXa^QP$GMUCEIg+|T@X+D>HqHD|K7Xz`}V>Yg0Xh&Gvw70pGOC7kwI zX8J=0o?CZ4XM<--8`{fb5z(hboYPSG-~_Me1|Ny)J$=Ru_o439JzDdq_ZVtVe6RV? zYcxFP1wI>>s)euxniJrBn;HuhC?n6?Frav z`LP_&CiZAH0efzbF+GO)%@2D-%3t=oJ%fK(56Vwqf0pBNA6txJHn}(ibf1>{<=CE7 h#d9oSS7N8L2|CJMl)d>#`^_HMsXeVmPA$%H$sg$`^LqdQ literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/locale/fa/LC_MESSAGES/django.po b/lib/python3.11/site-packages/captcha/locale/fa/LC_MESSAGES/django.po new file mode 100644 index 00000000..ccd8a3f1 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/locale/fa/LC_MESSAGES/django.po @@ -0,0 +1,31 @@ +# django-simple-captcha French translation. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Patrick Samson , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.2.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-25 11:44+0300\n" +"PO-Revision-Date: 2020-10-04 19:08+0330\n" +"Last-Translator: Mehdi Namaki \n" +"Language-Team: fa \n" +"Language: fa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n>1;\n" +"X-Generator: Poedit 2.3\n" + +#: fields.py:49 +msgid "Play CAPTCHA as audio file" +msgstr "پخش کد امنیتی به عنوان یک پرونده صوتی" + +#: fields.py:66 fields.py:89 tests/__init__.py:62 +msgid "Invalid CAPTCHA" +msgstr "کد امنیتی صحیح نیست" + +#: tests/__init__.py:88 +msgid "This field is required." +msgstr "این فیلد اجباری است." diff --git a/lib/python3.11/site-packages/captcha/locale/fr/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..1b539cf4748a9d7a2e1b55c5516a24c65dd1586d GIT binary patch literal 594 zcmaKp&2H2%5XTKImq-M+9f(Tf)xQN`032FnVWl*Q z`b-7(NVmX_r;9;(YEw~pdrnQ1i&lOnACxsEwC89#D}(BtCfT5i%^5)M(azc zFnZN|gOAt;YhbU(%f|L^G&&n1rH0}@Uozc*9m$%oFJa~XA2voL%f<5OuA-bXpIZ~j z@b6cS(~EQ&UpbA+Oo6NOf#U2_eJm$;abuP%^76JZOaVrq!DPi8+la^bROQu%}ve+#4QGD*gid C9H?jj literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/locale/fr/LC_MESSAGES/django.po b/lib/python3.11/site-packages/captcha/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 00000000..6bf14f12 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,30 @@ +# django-simple-captcha French translation. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Patrick Samson , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.2.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-25 11:44+0300\n" +"PO-Revision-Date: 2010-09-16 12:16+0200\n" +"Last-Translator: Patrick Samson \n" +"Language-Team: fr \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n>1;\n" + +#: fields.py:49 +msgid "Play CAPTCHA as audio file" +msgstr "Écouter la version audio" + +#: fields.py:66 fields.py:89 tests/__init__.py:62 +msgid "Invalid CAPTCHA" +msgstr "CAPTCHA invalide" + +#: tests/__init__.py:88 +msgid "This field is required." +msgstr "Ce champ est obligatoire." diff --git a/lib/python3.11/site-packages/captcha/locale/it/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..ad235d1d485cf2614a56139fe4d0f89aa014c661 GIT binary patch literal 631 zcma)&!EV$r5QYscmt2r~K|+A$jvO{yKvlL|v20th5-UO#I3O;wv77bE@wm2AwZ}dL zHy(fo=o|Dscorr_RS#Sk>C->9XMT_UduRKH;MiuKG5gFT<~uWlXC5>JP>2_-6V}1!8!I2*`fjlf!COKs+&NmKU_Ptr`G=XPEMDF%03%?p48f_f zTGVS3In!1FCqbX}CTNw5D$qtZNiLN9szWs7N>CegEy-v)Z?$aDr)G^X%6Id(*@^ZP zl3d2tDEYo`qpYcftokHR^tl=Oq8k;xN9c0VJ^5}lPA|H%g+heO`t+D%Go4ckGOv>iu zl6E}JrRQ;zzDTdUMdK#GuMJVB>6iLg?%mf7Q=jS}k6c5_xVD7775h}S4`}5vg)Wxh z{OvMM#}oLQPTfH<$wY;LEP^u7@Wq^4g1Exg8cZl=u_2ofxWfNiC_eW(CV~b#PjK@K NXtlDY9e&V|_yfmbw-f*X literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/locale/it/LC_MESSAGES/django.po b/lib/python3.11/site-packages/captcha/locale/it/LC_MESSAGES/django.po new file mode 100644 index 00000000..03a5851f --- /dev/null +++ b/lib/python3.11/site-packages/captcha/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,30 @@ +# django-simple-captcha Italian translation. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Arjuna Del Toso , 2012 +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.3.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-11-14 02:53+0000\n" +"PO-Revision-Date: 2012-11-14 02:53+0000\n" +"Last-Translator: Arjuna Del Toso \n" +"MIME-Version: 1.0\n" +"Language-Team: Arjuna Del Toso \n" +"Language: it\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n>1;\n" + +#: .\fields.py:56 +msgid "Play CAPTCHA as audio file" +msgstr "Ascolta la parola di controllo" + +#: .\fields.py:71 .\fields.py:96 .\tests\__init__.py:70 +msgid "Invalid CAPTCHA" +msgstr "Parola di controllo sbagliata" + +#: .\tests\__init__.py:97 +msgid "This field is required." +msgstr "Questo campo è obbligatorio" diff --git a/lib/python3.11/site-packages/captcha/locale/ja/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/ja/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..12f291ee7354af40388909b8246c0b3d11dd8990 GIT binary patch literal 636 zcmb7>ziSjh6vs!6%{HQqpcaE|m~%G%J}rEs!4+03~&vzeJa5-aCo zP}E9EAzB0?3IStdVIk%}u^EHjf8pEsBef4ceBYb*gZG$kXU4V=*cfmDmuW$_>%To-FVyh)rEUlqP$sS7#X{Y2aQ<_T=;K)1y=b0v*??D_WQH0R;t4;PB>n^mE@S^n7zE?~ zRp0mSP;E%8sL(kzQib?7W4KXiW*Q6e9GN<*t2SO{ip+{c zrd(tpo?7C@i}F&@oXknp*C7_gVW=BH9shP4e%(WV{>9n7gNJXOeLk{V&h9w-&e=!K zes%WMzmnk#H{5j_U);uHH{7Xw`~K(d2WR)ce}3vLWS=2tU&5%-_U4b*d(M75*xwv& JKY_Yx&M(f|(_R1o literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/locale/ja/LC_MESSAGES/django.po b/lib/python3.11/site-packages/captcha/locale/ja/LC_MESSAGES/django.po new file mode 100644 index 00000000..f2aafbb5 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/locale/ja/LC_MESSAGES/django.po @@ -0,0 +1,31 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Keisuke URAGO , 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-02-13 07:11+0900\n" +"PO-Revision-Date: 2014-02-13 07:11+0900\n" +"Last-Translator: Keisuke URAGO \n" +"Language-Team: Keisuke URAGO \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: fields.py:90 +msgid "Play CAPTCHA as audio file" +msgstr "CAPTCHAをオーディオで読み上げる" + +#: fields.py:105 fields.py:134 tests/tests.py:99 tests/tests.py:239 +#: tests/tests.py:246 +msgid "Invalid CAPTCHA" +msgstr "CAPTCHAの値が違っています" + +#: tests/tests.py:125 +msgid "This field is required." +msgstr "この項目は必須です" diff --git a/lib/python3.11/site-packages/captcha/locale/nl/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/nl/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..7428e78be5a93e8007965d3ecf1bac4ebc3d97a6 GIT binary patch literal 630 zcma)(!EO^V5QYtu%U+N;fP^?q4@gwtWj7I3we6yov=xyWu?h<(B;>3o8>f!#+TN5N zc?fPi2G7H@Fk4dP%1EF7neliu_WXIg^OKS75YLGt;vw;s=*6u{32%e z82e57qR-uDY?rhoeM0(;l#XxvJ|OLlQjCqwT4*I2Xc)aSAN13w9+a)%Uk0t+tJ}7GnkV|1&%Y#}ujl2;qHVXk+I!yPIDLU&T zpM+LP{=RDiuWbQI^^s3;t@``?R75ObkmW<34S4<*@?kO9f0gA~mRyJsdF_P>T14v$ zxIk+_B23lt65&Wwc-*YQwe^=FHTqpL8Bfl(qvdJe!?c}fk=H0z|Iy*Dz5t_>ku?zw z&2Zyr$cW$L8>fXbhd^)i0b}{OKIaG9x_;IaNf=kJuEPSbw*)#%|1Cqy, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.3.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-02-15 13:26+0100\n" +"PO-Revision-Date: 2013-02-15 13:26+0100\n" +"Last-Translator: Leon de Rijke \n" +"MIME-Version: 1.0\n" +"Language-Team: Leon de Rijke \n" +"Language: nl\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: fields.py:50 +msgid "Play CAPTCHA as audio file" +msgstr "Speel CAPTCHA als audiobestand af" + +#: fields.py:67 fields.py:94 tests/__init__.py:64 tests/__init__.py:186 +#: tests/__init__.py:193 +msgid "Invalid CAPTCHA" +msgstr "CAPTCHA ongeldig, probeer het opnieuw" + +#: tests/__init__.py:90 +msgid "This field is required." +msgstr "Dit veld is verplicht." diff --git a/lib/python3.11/site-packages/captcha/locale/pl/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..39c7ef90bdbaf2f1842f13ad15097408072a624d GIT binary patch literal 680 zcmYL`&u-K(5XKFZOD;$pKtdemLjMRkIJ84PYR;<*eQ3)In7dLUU-gWHM_BL$Q z3%mgb1W3FEoVe1y2G7D|#nO>}`o`aQJa+Qu=E`S+v4Y%1`p9+U9nwaP+(3?zJIDv* zHu4?$a)pqesBPcgRYKNKCF(8IPpDX4oO=zm4YUXu>JzSH0fX%{8@$*isp9kH0=NS{ zE2M!VsRYT!(qSf40hm~EJd;)wAxW*7h}_d*LEi}Lq|q@H6Rt}`ovdmlXwGY&k2$cg z8$J#WL~X36BUj3TKAV+}W+sLp-KPiQM7I6(Irk!l4vV^!^=QC$^THooFgg}JG=@DyFncqwQmcojox zlyv#{za2xZg3)labNQqwWWm5_FEoyy*LXiK-unl&;!Pglh@fU?OpC`uX!Xa z-O;%zq%LFV9ZDahYG%2jyT(>723;?fF6nOK*tU|a>m-Tb2{6F&y@+ik9avpmr2XV! zo36Ju>qiXE&K7>Vhiza_ggu>&fV`CWp=-+, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.3.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-08-18 18:49+0200\n" +"PO-Revision-Date: 2013-08-18 18:52+0200\n" +"Last-Translator: Sławomir Zborowski \n" +"Language-Team: Polisch\n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2)\n" + +#: fields.py:90 +msgid "Play CAPTCHA as audio file" +msgstr "Odtwórz CAPTCHĘ jako plik dźwiękowy" + +#: fields.py:105 fields.py:134 tests/tests.py:99 tests/tests.py:239 +#: tests/tests.py:246 +msgid "Invalid CAPTCHA" +msgstr "Niepoprawnie wpisana CAPTCHA" + +#: tests/tests.py:125 +msgid "This field is required." +msgstr "To pole jest wymagane." diff --git a/lib/python3.11/site-packages/captcha/locale/pt_BR/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..8b5473b1a89c1a383dc8545684c4ea98b7620e2b GIT binary patch literal 613 zcmb7>y>1gh5XTn?%{54A5RhU@DE4w^3t^q(D8@L#5>`&uL4}0IcazIT>)p-no<&L? zf{rE?qJ}r{d+;pG1)04a}xxHG4Z1rN--j0bl^^8fD>J zX%f|i3ha??fE`a)o$}PAqV)EX>L?eD{6Ib^YYJ#C(X>_uwQ-tcjV{&~2w6HzUnMJY z)~8vtiFt?wHEx`R R-4C#9uUd?|pI+Hi`~ltmvLyfj literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/locale/pt_BR/LC_MESSAGES/django.po b/lib/python3.11/site-packages/captcha/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 00000000..47e84f12 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,31 @@ +# django-simple-captcha Portuguese (Brazilian) translation. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Alisson Patricio , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.3.7\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-05-18 10:58-0300\n" +"PO-Revision-Date: 2013-05-18 13:12-0300\n" +"Last-Translator: Alisson Patricio \n" +"Language-Team: Alisson Patricio \n" +"Language: pt_br\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: fields.py:49 +msgid "Play CAPTCHA as audio file" +msgstr "Ouça o arquivo de áudio" + +#: fields.py:66 fields.py:93 tests/__init__.py:69 +#: tests/__init__.py:198 tests/__init__.py:205 +msgid "Invalid CAPTCHA" +msgstr "Resposta inválida" + +#: tests/__init__.py:95 +msgid "This field is required." +msgstr "Este campo é obrigatório." diff --git a/lib/python3.11/site-packages/captcha/locale/ru/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..2e49257686a6371be0941ed2f80cbd84eb2b32c1 GIT binary patch literal 724 zcmYLGL2DCH5PoXC>_zY*sE6@jvB*o`CQ8dTTdiq}!30Bzp1eG>ujwnB-R;}mVx z_6WBLUBWHG55oH^j14H?AuL{HY@PB8$`#6ADU&?gdyR4))MBg}>`PyJP+4m+h z!gf=+wXaxnN5{mJ?*S2`_EK$>S6~ej?y6S8s~&%?OsvDe0dH3Z?U2X1 z6Zwj_WR$daB#1((uw-qiC^QML$8GKLXK6d;&Cmg>@se+;eVzOHx=fS}Dot#4eu z(k=+A5(bG1XyZXdClmE9S&V$CgB73`n^-08tL7$OzMRW1Z!5z$f>!A1pzXl&Tb)=9 zKQ+?lo1y8%4g}GxjNQ@-oKg2daNicLYs36JLNUvQG^1EM|1 P`~OELq)u>@^$P4CT*>{5 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/locale/ru/LC_MESSAGES/django.po b/lib/python3.11/site-packages/captcha/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 00000000..5c6a9f38 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,31 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.3.7\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-25 11:17+0300\n" +"PO-Revision-Date: 2012-07-25 11:17+0300\n" +"Last-Translator: \n" +"Language-Team: ru \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: fields.py:49 +msgid "Play CAPTCHA as audio file" +msgstr "Воспроизвести CAPTCHA в виде аудио файла" + +#: fields.py:66 fields.py:89 tests/__init__.py:62 +msgid "Invalid CAPTCHA" +msgstr "Неверный ответ" + +#: tests/__init__.py:88 +msgid "This field is required." +msgstr "Это поле обязательно для заполнения." diff --git a/lib/python3.11/site-packages/captcha/locale/sk/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/sk/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..70e542314f2c04217affd24213d7c8cbe0421ceb GIT binary patch literal 606 zcmYL`&u-K(5XKFZOD+hIKtddb162`nNOqyEyqiK<;N&(i^1DNoo4z+)JcgP>Qj!nMwLCr>fb<~S zN?ABi8d)(>o*e25$T&P|mBT7#xwBI&10PrX9XhY95l~H~sV(jq^tLnUXnzwqz}As z(s(U{bpmoZw;FasurO>oA6xQIj4I>u(*~_Kbt`M+1fXS}m@UUwQN z(a4&BhVD3SsEB|c!-GakWd=ZRa2`YUw%F$D=j*y!4$$!}Q`$l*0I7;Ga9QArbs$h#w>os>@Ss_sHXq` literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/locale/sk/LC_MESSAGES/django.po b/lib/python3.11/site-packages/captcha/locale/sk/LC_MESSAGES/django.po new file mode 100644 index 00000000..f3ce9b33 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/locale/sk/LC_MESSAGES/django.po @@ -0,0 +1,32 @@ +# Slovak translation of django-simple-captcha. +# Copyright (C) 2013 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Pavol Otto , 2013. +# + +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.3.7\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-10-15 17:16+0200\n" +"PO-Revision-Date: 2013-10-15 17:16+0200\n" +"Last-Translator: Pavol Otto \n" +"Language-Team: SK\n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: fields.py:90 +msgid "Play CAPTCHA as audio file" +msgstr "Prehrať captchu ako audio súbor" + +#: fields.py:105 fields.py:134 tests/tests.py:99 tests/tests.py:239 +#: tests/tests.py:246 +msgid "Invalid CAPTCHA" +msgstr "Neplatná CAPTCHA" + +#: tests/tests.py:125 +msgid "This field is required." +msgstr "Toto pole je povinné." diff --git a/lib/python3.11/site-packages/captcha/locale/sv/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/sv/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..71c1558b5e568de5ed8e737581b02c8806243506 GIT binary patch literal 631 zcmYL`&u-K(5XKFZOD;%U5D1~+20{)=Kxmcyqn2$8E3q_c1L}c`H=a$sICg3~EB44k zaO2oV;0^j7JPVVpmX7q(H=idNkL|w?_kJ;oJ>n@bBJLC4h(2240dYw@A$}5%h~LEK z4r6~v`+9trvB#tn(r2XSq*UJay+_&yEipDTYoV2d=|NFWKOV3`i_Ok}@E|&=EG(5q zR$eGi8EOfXIK1qXLm9Ke*%elS&m{kf&MRwjkSk$o%e`t^jl2?Vs4fH~aTX`hDYn)H zKKHef{C!t@UfLX@;)I{#TJ`_)LlH2CEJ+7E&3N(#l6U#r^i`53N%V<2ccMmKqG)nJ z1EXeP4Thlh>qaOYSGJi%^V$69cAk{>omvyn1YT}hY98=Mc-?BD%n)cc=P``Gl*fE< z`<)ZUFVXQMQ(37@ox@G9YhU5|j}^_32AedWL|w5t29mH!@M_74+rv(5kj literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/locale/sv/LC_MESSAGES/django.po b/lib/python3.11/site-packages/captcha/locale/sv/LC_MESSAGES/django.po new file mode 100644 index 00000000..58f60d8e --- /dev/null +++ b/lib/python3.11/site-packages/captcha/locale/sv/LC_MESSAGES/django.po @@ -0,0 +1,31 @@ +# django-simple-captcha Swedish translation. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Stefan Norman , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.2.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-25 11:44+0300\n" +"PO-Revision-Date: 2018-12-03 06:41+0100\n" +"Language-Team: en \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.2\n" +"Last-Translator: Stefan Norman \n" +"Language: sv\n" + +#: fields.py:49 +msgid "Play CAPTCHA as audio file" +msgstr "Spela CAPTCHA som ljudfil" + +#: fields.py:66 fields.py:89 tests/__init__.py:62 +msgid "Invalid CAPTCHA" +msgstr "Ogiltig CAPTCHA" + +#: tests/__init__.py:88 +msgid "This field is required." +msgstr "Detta fält är obligatoriskt." diff --git a/lib/python3.11/site-packages/captcha/locale/tr/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/tr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..74c73e301a65976414600f381d439617dfdb60e8 GIT binary patch literal 605 zcmb7=&2H2%5P%JoOD-TdAR!KOL_!Y9R-lr0E86W3E3qP41x{S1@icYUu~XZry1n%w zxFK=u8HqP&pMz&%vIzCeNT0qL+hdLW`^nlj!Li1?V78ct%vWZJj(NnKG0&MR<{9&y zIl3prFZSbM?Y00UsJw1Z=9 zNK_{}a7IP}C!WrF?MbDg^zM}ED5pw(As@7}1*lWBjgvvQogrCc7wZ#*EL~6ECUfeX zk8&0ot>kXs1X;NPlJb+B)43k{VV3g(SGRtNDj??1J=v6k#vg9L%C@YUP7>v#r zaOf5-S(a~DTg|F`j|Ll}MOwRdn|o~2b1f^vwt#B>KTQQhpUkGS{k!MoX_ic!jbwS0 zWyiBdx`?kkgW7HaKh+0{5V7pZr z#`z}vO~+Xx4(aB4_}WWQbo+z6*jq_Mpa9B+C5GFd;0$_Pz|A!pvD*XxfQ3uvduw{t H`&9e^(p#@& literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/locale/tr/LC_MESSAGES/django.po b/lib/python3.11/site-packages/captcha/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 00000000..ed35e2bd --- /dev/null +++ b/lib/python3.11/site-packages/captcha/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,31 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.3.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-01-19 16:33-0200\n" +"PO-Revision-Date: 2013-01-19 20:52+0200\n" +"Last-Translator: Gokmen Gorgen \n" +"Language-Team: TR Gokmen Gorgen \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: fields.py:50 +msgid "Play CAPTCHA as audio file" +msgstr "Değeri ses dosyası olarak çal" + +#: fields.py:67 fields.py:94 tests/__init__.py:64 tests/__init__.py:186 +#: tests/__init__.py:193 +msgid "Invalid CAPTCHA" +msgstr "Geçersiz değer" + +#: tests/__init__.py:90 +msgid "This field is required." +msgstr "Bu alan zorunludur." diff --git a/lib/python3.11/site-packages/captcha/locale/uk/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/uk/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..bc2839c4dccf542c615182adc5f0a87bc0c71865 GIT binary patch literal 715 zcmZ{h&u-H|5XKiM7hjOLAR!LJfkHrQ)^4dPC#ICph)6_4mEpu?iMQ#dj_vN+6_tA6 z-w9PhLeLW&xNr_tD?$V5E399DXJMSE^u$U(%{M#q&5q?i7iT^ZJTu4@q=uYFo+0H) zkqgKsav6DrTtYr0@6Hf%fbk}>be50>j6IAMj9)Qgc{2AL#`545A2%^ayzI$ zTqf;^Z=WQ&R3fxVTO~cw$!IgAPleJli9HB=Jnkk` z%YGUO+Tm%|S?9p)IeWoc6=|X}+R|Ma())Q=(;)G{YCoo{VoR2O`haJ`1D84Tl)2P( zz;!)#=N5ArvmSAs(LnK7M?6cE2lpDel1Z-XNhlPS<8IEof(C;3J;*oyQ!h(atJzvP zUD~mkRZrqf#Q4B=iW_9&MRq%lxQwfSAE30z{3k(!E}r(4i>wJnSK>|*%DC&n;&Yi< z?I>3~qK!oLwFhxJNwq&$g{ky!#Md0=`wq;`LMho*-*I3G7+^c*cYXJyRP*OcIdQO> z!(eA;YQY{>L63tTw^Fr;`C<;uaq-d&%)S|#QL$@&n*o^pV$U3yV>6zrV%H|-LwQ%c z#>O!khNy=BethxX9Dx}WZ?I#}jG=go6Mvc!+P;}Xm`oa>C_Vzt{9ewzj-DUpsFe8f HFPr=Y#NhE# literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/locale/uk/LC_MESSAGES/django.po b/lib/python3.11/site-packages/captcha/locale/uk/LC_MESSAGES/django.po new file mode 100644 index 00000000..50c505e9 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/locale/uk/LC_MESSAGES/django.po @@ -0,0 +1,32 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.3.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-02-21 22:05+0200\n" +"PO-Revision-Date: 2014-02-21 22:05+0200\n" +"Last-Translator: @FuriousCoder\n" +"Language-Team: uk @FuriousCoder\n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: fields.py:91 +msgid "Play CAPTCHA as audio file" +msgstr "Відтворити CAPTCHA як аудіо файл." + +#: fields.py:106 fields.py:135 tests/tests.py:99 tests/tests.py:239 +#: tests/tests.py:246 +msgid "Invalid CAPTCHA" +msgstr "Неправильна відповідь." + +#: tests/tests.py:125 +msgid "This field is required." +msgstr "Це поле є обов'язковим." diff --git a/lib/python3.11/site-packages/captcha/locale/zh_CN/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/zh_CN/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..ee43e5fcc75ebb28c0d77d1a00b297fc42c064ff GIT binary patch literal 602 zcma)%&ubGw6vs!cm%S9cC?YtXW!8;V3EM_YV~YWUOIbaLAmi?IGi7#WJ2M+vZvj0E z5`R<#6+DQL?m-2`ANfx_HJizk3997I1}7TlT2nF>W=3uyw78 z0ztR`7ML1L^O!5V&ILnZmmA2Kh%qFZZRT9F*hPU>8!WP<9g|y38?K~};|(ekMGQ|f z!AL|i8+9r6+y(cNv&J%|E$Ntq$7DHA3<;Hwo!|ypV?92bCs(OuK0fc&7KjI@hP{iv zcj2s8_dMr1HI{^$N+YOM+Q%I(6Wr=DiI*Zbh2o0fJ?2I#y$oiV-QW*axdRZ>6j%~oA!nyko3 z#ju`_>-V^I0+DMf$g0w*@v+SIOVg+=;@@e*b5OPWwkrCQ*Zt{Wrz#4x_kA=OysL`g u^wo#*>6h`hN9E&TIr#C, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.3.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-03-01 05:04+0800\n" +"PO-Revision-Date: 2013-03-01 05:04+0800\n" +"Last-Translator: Ming Chen \n" +"Language-Team: zh_cn Ming Chen \n" +"Language: zh_cn\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: fields.py:49 +msgid "Play CAPTCHA as audio file" +msgstr "使用语音方式播放认证码" + +#: fields.py:66 fields.py:93 tests/__init__.py:69 tests/__init__.py:198 +#: tests/__init__.py:205 +msgid "Invalid CAPTCHA" +msgstr "认证码错误" + +#: tests/__init__.py:95 +msgid "This field is required." +msgstr "这个字段是必须的" diff --git a/lib/python3.11/site-packages/captcha/locale/zh_Hans/LC_MESSAGES/django.mo b/lib/python3.11/site-packages/captcha/locale/zh_Hans/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..ee43e5fcc75ebb28c0d77d1a00b297fc42c064ff GIT binary patch literal 602 zcma)%&ubGw6vs!cm%S9cC?YtXW!8;V3EM_YV~YWUOIbaLAmi?IGi7#WJ2M+vZvj0E z5`R<#6+DQL?m-2`ANfx_HJizk3997I1}7TlT2nF>W=3uyw78 z0ztR`7ML1L^O!5V&ILnZmmA2Kh%qFZZRT9F*hPU>8!WP<9g|y38?K~};|(ekMGQ|f z!AL|i8+9r6+y(cNv&J%|E$Ntq$7DHA3<;Hwo!|ypV?92bCs(OuK0fc&7KjI@hP{iv zcj2s8_dMr1HI{^$N+YOM+Q%I(6Wr=DiI*Zbh2o0fJ?2I#y$oiV-QW*axdRZ>6j%~oA!nyko3 z#ju`_>-V^I0+DMf$g0w*@v+SIOVg+=;@@e*b5OPWwkrCQ*Zt{Wrz#4x_kA=OysL`g u^wo#*>6h`hN9E&TIr#C, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: django-simple-captcha 0.3.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-03-01 05:04+0800\n" +"PO-Revision-Date: 2013-03-01 05:04+0800\n" +"Last-Translator: Ming Chen \n" +"Language-Team: zh_cn Ming Chen \n" +"Language: zh_cn\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: fields.py:49 +msgid "Play CAPTCHA as audio file" +msgstr "使用语音方式播放认证码" + +#: fields.py:66 fields.py:93 tests/__init__.py:69 tests/__init__.py:198 +#: tests/__init__.py:205 +msgid "Invalid CAPTCHA" +msgstr "认证码错误" + +#: tests/__init__.py:95 +msgid "This field is required." +msgstr "这个字段是必须的" diff --git a/lib/python3.11/site-packages/captcha/management/__init__.py b/lib/python3.11/site-packages/captcha/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/python3.11/site-packages/captcha/management/__pycache__/__init__.cpython-311.pyc b/lib/python3.11/site-packages/captcha/management/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54ffc9677dce7bef7366ae6a8c50535565a2194f GIT binary patch literal 184 zcmZ3^%ge<81ZVzxq=M+jAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnFK_*_#3KFj z@^bym+=9}aV*Q-VB>jTQl8pR3V?9Gd{o>4$RNaEajTQl8pR3V?9Gd{o>4$RNaEal JC}IYR0RY&6G4}uf literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/management/commands/__pycache__/captcha_clean.cpython-311.pyc b/lib/python3.11/site-packages/captcha/management/commands/__pycache__/captcha_clean.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f69eed18ce4d394039d5c267eae6f4685b1b6e8e GIT binary patch literal 1908 zcmZuy%}*Ow5TE_Fs?!r2a*z(bXSC4T2NImRU;*`RG}X5Wwm%8*m%9`?yfPm zOvNDw2XR2XkV-jlqN?a2e?xlh!Hz7&S_!FA6;-)yL=GsI_PzDm#=zURvokw0zj^a^ z-t2F~!$H8~um2vQpBaFEh|nD#mpNO)%pu4iQwpTXlUAq#ou(zB?oBk*O6(c;68*m7uJlCCNZZtx%9u8H;{1S3p%wMH$z@c~Gu!7Q@UT zAV^a(q-mK-Gcx@Y(yYv2P}cIfK-I~lf+RIwD#p=vF{dLro{@@XCM(6Wl9A1$ios{P zpah%bH-zsqns)M|a9&WLc5q&1H+QVAQAfQ@u-F?ibBxhWdWeJ44pXBy*{<=?1-$M% z0CTv{Z~D6YF=kG>0{p=a;vV^Xste4Z&kkE-WKZ6SsYlGwzM<@`u~jd?ASML?sL@AG zCG>4O+#oUq>Q_@>M*CKGL4QEOg?OQXc)rV#%uoBio4x#H&tNjJ@ZD&xCQIs-yX#*L8 zn~{K91C|STPlZgUQS@|ThMaT0Sh2iW+&~mm9dTO#-;qfn8~5>t*@d=WXbjG`k+Fk~ z!~8G#qnT!uZ$XyvaLRqsh|Iox(u{oDX-^>5=3;NS>DSzJ zlS{O?M8lcqr=ge)OyB}(hoaB#?A7YE)9_d$`gJor-wMw+!tR&Kdw8M z?ZbZO=jXP+7rY(1`CNJ(y4?ufcD%oQS!+g<&G2$7yxi!{w*>d|W_YF*o@sQa9RMy? zUoawg$6mpWr7?IlHkTY?{tQx>rtl~Ci=rwOkSJO~QN(3dQV7q9;!h<>aW!lfDMkGj z#`qo1Fa>>r5Zq@vgtRu}J|?@pt34#_F5B#==Yb7Zi9XeJO?Y+EY^!q&-`lYf&)JOk9Cy8(L&#*`iud$Aa%}^B8hTyJq g{S9-C!P$m8jlpSqqZD5JRZ`EtCvQJoqjJ{qKV%fpUjP6A literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/management/commands/__pycache__/captcha_create_pool.cpython-311.pyc b/lib/python3.11/site-packages/captcha/management/commands/__pycache__/captcha_create_pool.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e274c205d5269c7f9f886870c653ca4e106273dd GIT binary patch literal 2251 zcma)7&2Jk;6rbJo+Ut*e)@d6O(aj-AO|YG+hjJ)LC2cXS6b|8J4$Ed|k~rBfX4eTZ zLCPVAhznJPlpb>mpcIJ%e*k{~2RpJhd7U?evf$4JJ!XhykwZNC z2;tZc!Xn`g1cVOZ4MsVR;|nO4_?xjg&P#u&I%Li=4AsPpb*XAPs^(TK6WGk0YP;Hs zy5L%rXyFq6hYy*P5={0GL1hl3GLN~kfcYI%j`4_ytMQJ@0Za}%48p<=ib~1}90ORQ zmk6=cCgvznT_UTpZCSc(Ey;ikTZXI!keq_n!NAsKJFy^7Tp)XBi`$3q`GGmN#|!gV zcpf`|13!c}7~JK)B97w(mYyfidSC?DQ}eZSKF`4Bol1>V{sK6)!hF?OB$UB7$wn8u z>{_zs$M>#`$&y;t-S=i0OJl z#dJX!bBMm=#ch>3ggWf_WciI!TvusvV`HOOG3=`D6!pqt(cW}dEc15Z)~%vbaY^1* zwKa8_IK}YJijZZ%v&D;AkaJy~5}b#^4zOTvdVRf6oZ3j37lnwJ!FE0evW;3&{|jmC zNE&NpMqdtPTiNTap?mElN{$~RF`0VJNZThFlpN@o-e_I9;hWA~Xxeo;fjyAMF&Yk5 zm2CTyXCU1}ZjTOUa&lgBbAx*2Es~H!dj}0KL|?hw5WUw zg5|26$|dLkgy0Fw#HH+Xy>w3^dvV9bR@L>y4GIO}^;2S4>!h=EE=C8LOTw~Q!*#qw zfR%WnW>rnsVHYREpu@~8z5*RkC$;`gEd=~1=$zkyY@2_H^be@NO@EWFXD1udR8yL&OQoOgHfJ6-W=hSO(m8b-@yXN= zcl^)K?k``xxKld1Q)*>qjs^ZbC`KTlJ40B3g4;!eW+A@$oa9N0VyXsF6fdPHhJ~v- zn`ac|i>j&z8o!y*E8sxc`9Y&|Eu*5*31EIi{!0FN(gZVMguTuuK(@QTSLwp`{dO!P z0-P=xNAc_1pEbp64RN$7j<$J;sev2|DE?MN;){d5*y{7Sgg1s)Rdd-YXwbI{r=75{ z2>-y86|t8LE%0K1yg%%l1qhVrj-Ouv>M1ZkjpU7VH#mw9=sTcbMdnyQ+5*RMEp)pc heOhRu9(`V+>3Z~O$HzE`?L66CJ7&_?7pQzd{{doA7E%BJ literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/management/commands/captcha_clean.py b/lib/python3.11/site-packages/captcha/management/commands/captcha_clean.py new file mode 100644 index 00000000..78c86883 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/management/commands/captcha_clean.py @@ -0,0 +1,29 @@ +import sys + +from django.core.management.base import BaseCommand +from django.utils import timezone + + +class Command(BaseCommand): + help = "Clean up expired captcha hashkeys." + + def handle(self, **options): + from captcha.models import CaptchaStore + + verbose = int(options.get("verbosity")) + expired_keys = CaptchaStore.objects.filter( + expiration__lte=timezone.now() + ).count() + if verbose >= 1: + print("Currently %d expired hashkeys" % expired_keys) + try: + CaptchaStore.remove_expired() + except Exception: + if verbose >= 1: + print("Unable to delete expired hashkeys.") + sys.exit(1) + if verbose >= 1: + if expired_keys > 0: + print("%d expired hashkeys removed." % expired_keys) + else: + print("No keys to remove.") diff --git a/lib/python3.11/site-packages/captcha/management/commands/captcha_create_pool.py b/lib/python3.11/site-packages/captcha/management/commands/captcha_create_pool.py new file mode 100644 index 00000000..ef089059 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/management/commands/captcha_create_pool.py @@ -0,0 +1,34 @@ +from django.core.management.base import BaseCommand +from django.db import transaction + +from captcha.models import CaptchaStore + + +class Command(BaseCommand): + + help = "Create a pool of random captchas." + + def add_arguments(self, parser): + parser.add_argument( + "--pool-size", + type=int, + default=1000, + help="Number of new captchas to create, default=1000", + ) + parser.add_argument( + "--cleanup-expired", + action="store_true", + default=True, + help="Cleanup expired captchas after creating new ones", + ) + + @transaction.atomic() + def handle(self, **options): + verbose = int(options.get("verbosity")) + count = options.get("pool_size") + CaptchaStore.create_pool(count) + verbose and self.stdout.write("Created %d new captchas\n" % count) + options.get("cleanup_expired") and CaptchaStore.remove_expired() + options.get("cleanup_expired") and verbose and self.stdout.write( + "Expired captchas cleaned up\n" + ) diff --git a/lib/python3.11/site-packages/captcha/migrations/0001_initial.py b/lib/python3.11/site-packages/captcha/migrations/0001_initial.py new file mode 100644 index 00000000..e12b7ef2 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/migrations/0001_initial.py @@ -0,0 +1,31 @@ +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="CaptchaStore", + fields=[ + ( + "id", + models.AutoField( + verbose_name="ID", + serialize=False, + auto_created=True, + primary_key=True, + ), + ), + ("challenge", models.CharField(max_length=32)), + ("response", models.CharField(max_length=32)), + ("hashkey", models.CharField(unique=True, max_length=40)), + ("expiration", models.DateTimeField()), + ], + options={}, + bases=(models.Model,), + ) + ] diff --git a/lib/python3.11/site-packages/captcha/migrations/0002_alter_captchastore_id.py b/lib/python3.11/site-packages/captcha/migrations/0002_alter_captchastore_id.py new file mode 100644 index 00000000..472352d9 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/migrations/0002_alter_captchastore_id.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-03-06 11:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("captcha", "0001_initial"), + ] + + operations = [ + migrations.AlterField( + model_name="captchastore", + name="id", + field=models.AutoField(primary_key=True, serialize=False), + ), + ] diff --git a/lib/python3.11/site-packages/captcha/migrations/__init__.py b/lib/python3.11/site-packages/captcha/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/python3.11/site-packages/captcha/migrations/__pycache__/0001_initial.cpython-311.pyc b/lib/python3.11/site-packages/captcha/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8e32f2e71211f2554c5cf4a993e4a15b77a0823 GIT binary patch literal 1305 zcma)6y>Ht_6hBfTEmE>8$yN(D`X~aswu)G^VWg8Bps?X8MUwzc&_N49>rN6Ke&tBn zae)FJI%M<^p#BR~6!y?DWB-5-G(e!jO#wQ2qhU{3l6RElHf@F;d5`ZszIXS#_j}|o z)6*(~@yFX1`7wpiU)-1s=~}sLf$}rL2n!ang|;AYU9?0y)lS*zc3MCp`WoTXPY9<; zdUukChOpuZ%<*VTSbB`=@;Nu_0?Q8^v*Ti-TV_D0Vfl5D$u>AFpQ*Olqefu5j^DXX zPafH8;}QuR5g{bTDZF_oPP8^ z;-1jX;yjeHz?27*IUgC6Kl$pKSfCCegCkDPx7Ab>8_HlFL;6ZBbz65j)E2%G8~ zejgIfmw6Nr2&6t65Ly6}spPq5j%frK>12DkYZ43lY|8Z#dYQCi_{4u$&#{c2Ak=lH z>N+&Sz#^dMbp6@Duy``JF!6|kiPJHOPkE=Y>}GO+2fTAAre zuPdI>d1~~CuXV;{*Z%HUZFO~ZO*b7gfI2t41Il|a5i%(LpCArzuGh1r!*635DYX}B zl&OviH84u^qq&8n?PzXcv{)bAUgC0LIaZ|7#}^316&JCTDHP)(Dpta3Vqz)+vK^J}u7U<;Wj`ULh;_MKGDFXu& z>em0Dfao8QM!0hK%Z^Y`ApyZ60!{i-IYa|~*LBr`J~S6V<=z30VgZ`;cn?RL9Ec*s-k`B|fMCut;Drf~Xn1A@=R zf(M=$lN~nB%!COD`sxQzka#DMFJDbA6abg`HVZ%*u9tMsr#5$xG*rC!En}+N`bmN;d3&Yx>>p#D3=lR3%X#S>0j@mT1PqX0>g zX8@Dand``0%~j>1K6#W|$h`jEni|(;%Qt2hF3s$f-J4T;pgK5O!%Ks m@*E&nF~*<{HxJRRvrn!!u%4r{uxm}vuO7*TjTQl8pR3V?9Gd{o>4$RNaEa 0 + while count > 0: + cls.generate_key() + count -= 1 diff --git a/lib/python3.11/site-packages/captcha/templates/captcha/field.html b/lib/python3.11/site-packages/captcha/templates/captcha/field.html new file mode 100644 index 00000000..8c5d5d61 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/templates/captcha/field.html @@ -0,0 +1 @@ +{{image}}{{hidden_field}}{{text_field}} diff --git a/lib/python3.11/site-packages/captcha/templates/captcha/hidden_field.html b/lib/python3.11/site-packages/captcha/templates/captcha/hidden_field.html new file mode 100644 index 00000000..36d7490a --- /dev/null +++ b/lib/python3.11/site-packages/captcha/templates/captcha/hidden_field.html @@ -0,0 +1 @@ + diff --git a/lib/python3.11/site-packages/captcha/templates/captcha/image.html b/lib/python3.11/site-packages/captcha/templates/captcha/image.html new file mode 100644 index 00000000..a73e956e --- /dev/null +++ b/lib/python3.11/site-packages/captcha/templates/captcha/image.html @@ -0,0 +1,4 @@ +{% load i18n %} +{% spaceless %} + {% if audio %}{% endif %}captcha{% if audio %}{% endif %} +{% endspaceless %} diff --git a/lib/python3.11/site-packages/captcha/templates/captcha/text_field.html b/lib/python3.11/site-packages/captcha/templates/captcha/text_field.html new file mode 100644 index 00000000..fee60f44 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/templates/captcha/text_field.html @@ -0,0 +1 @@ + diff --git a/lib/python3.11/site-packages/captcha/templates/captcha/widgets/captcha.html b/lib/python3.11/site-packages/captcha/templates/captcha/widgets/captcha.html new file mode 100644 index 00000000..49faaf25 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/templates/captcha/widgets/captcha.html @@ -0,0 +1,9 @@ +{% load i18n %} +{% spaceless %} + {% if audio %} + + {% endif %} + captcha + {% if audio %}{% endif %} +{% endspaceless %} +{% include "django/forms/widgets/multiwidget.html" %} diff --git a/lib/python3.11/site-packages/captcha/tests/__init__.py b/lib/python3.11/site-packages/captcha/tests/__init__.py new file mode 100644 index 00000000..8ce44e15 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/tests/__init__.py @@ -0,0 +1 @@ +from .tests import CaptchaCase, trivial_challenge # NOQA diff --git a/lib/python3.11/site-packages/captcha/tests/__pycache__/__init__.cpython-311.pyc b/lib/python3.11/site-packages/captcha/tests/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42a88c3ed292f33ea4cd976cb06003fa5653eaa3 GIT binary patch literal 268 zcmZ3^%ge<81ZVzxq*?*##~=<2FhLog#ej_I3@HpLj5!Rsj8TlaOi@gX3@J>(44TX@ z8G(|TOt-k56AMa`GZLK>i&Jk2mK0@{WhUmt0|jz&QuESN{WO_xv6iG3mlPK<12q(} z0Ev|hpMfO9FE{jTQl8pR3V?9Gd{o>4$RNaEaOU`y*2WMCH#zEW6M z=XAf>`R*)0N|dZrJQ(!8nR)Z(&70T#y8Cta`$2AQHU-+D3)Sv5o$vIwN2Q_v3HLX&lFo`0OczcRP8UrSkz+biJY6yYRe^gvk<#h1 zi87MTj+9SVOjM9`PNZ_WYNCpynaGA|?}T@HK@QFba+#O7Vke+}O1 zb@-PzJ2gbH1z)4s!cgIB4!8pU^7b11ysjKj6F#=+Yt%$7YdcQ)i$B2gqkfx|)q5cx zij9mx(ls(2JQadO_Mw?meZkrI97m3(gHbp?9g4=`TFJ=tEH^V7;vyINW};K!Q;>=E z+a-ED6pQx-Vc!NG7S!b%0HqjAVR5}lpHx+po0$7i@uqG(di-wN*&kG0Nm5qvOn zY;0^iaN^jZzOm84NwqZ~p|s$K{{s$QqCyn*4Coa$Xe9@02k2xS09~vTpqq68%wpXD zX*LU>hou2#vmSssY&JlK%>kIpG63_~T!8s(9>4-NA7CMVrHLZ85MVL+7A0&kq)XWn zfMskcz;d<>U}{*hcv7o1~mnJL0FBRGI*rg@%9ZIv;*y$L0uA^Hc!OlPwPCl3>BgSo|0b5S5o@ldB?o-y8AV_^L6$6U^(;D88zFyeM#4{>S>D2Vrk=@ ztfx}Fyi}+rbqO|`%`x7y53Vk_F3y|Yxk$Om_>RV-PwS0YMy{2<6<9`lH|TxEO8r<0 z5F~fh@3>d3P?FQ32vE9M>vS-FIsl|75(!05g%XYC>s&C(&P-ztPM59LoNX=|o}2-? zsFhUOHW%aCVsKxmjSWx6+s@5!Y%Jm2+p@JakyZ`7sJnT)x%|^}r$PZzLI5fhn4ODG z#^-|Z@Jv*@>zZBisLz*ZE)<)ciN-?rY^@(4HTdAyuu0ike#sq(A$gT@+0ayQE)tgy z{Uwr{oR4w2aGO-x*K=gNZ@4Egc4GXhZpG=gI+ynxXa~uc5h&nI? zX6E8R$^%m~95k_1p%n7i*s=cOf&P)c@sY97o?}l){&mX1wu9FUau=jxrH~^hM*GH3 z^k5NE^E&tIno6?I#3bh|d~wMgIv<9iL~;jbXG2j|Dh*6R7YIHb2?eG&_};NN2g4hO zI3;DxJbflK37Kact~<{vDrvCjsxIqBsdA}h}YFGz*WP|ez)X|g(6c@ z9u8e0HjwIfl3Px2<&cT1z{l7EF(h0*vfb-zI~(NM&Ye5g7M`A+i^SR@;iubXFT_vJ zM7OnebhO37@leZbaPk=#zhiBw?$SoaM;W%xUXWZc=AM{M6zaZID>;SKC-xQS70*$3 z$|@F}7jtg6?-JWb7o8&Aa=WEVY$3_!+pRmq)<^N|mQ|;-Dtnbuz+&F7vMDC-;?8e% zKi|z)bqG0~Vov8O<@V$y+lT&OSY%p~TRQM}bCRiAVQQC|TE4DVVERO+k7xSSlgWa? zyAFG9-Y+Qts|2{I^2Svv%L9i176+4c!>?`@>kiy16Y7S=x?!R2QL*k(fvH&>xpe+l zG*!4!ENECM=v*%7OjgxjJ-zCn3b);*?1flpVcy*=M{ZuSpyb7z%Y)xN{PN+e^;e%2 zyd9#q<3^q6?OO5fU-s_58F_zL@SYI8Cxn8N$%4X5wpE&{+4;(8v3k2uy+f?tAyn@Y zt9J?XhDFb%UALQeh|S$A&4-qo4<*ZLu5N~BZaHj&hi=J+hi=Ih=q7B|OJf4vuoPT% zQ`L1>zHqfh+_)QCvx+DChwvFF!%&R`o($CyNW5eq@rEHz9SDH@sl$*VhdMYy4$FZ$ zfW3`uggn|t{aIWs922bPe3+_7P=}xqK?8tmHm)6hVn|VZ+;)J#^@W05|IE2)qD0@( zl(Ty=yC1-FRMOuf`bYnO7U@mNt?lAglJqB=wunuS;@JkC?A#8>J*mDH9N-J!*!bZR zfS0H^KxI3FH6a^odxpFyx5bVPr!|pHYoaB!S(Ll**F0vQvdufbXFGhJB~yvKNyRJxcDFt#{rI; z;iRm|nJ9A0k^^Xn-$mM3CJP>p4SKBqp(_!j#`#U zb^!AJ{th)MC+?_sUfs#((nHm67Yf5j|%LOnr3Zr z@_``>Z1cL$YGl%k%nNJRn1Tg+9GT(Nrs2hsiVMm${GGR7cNj}PqcXG$j(Pa_Q+8l1 zoTK-O&jurNq5XB6ztG;YJJ>Sy$Dja2DtdSfr z#-zS`G)_huZVTMO9YBC1!Zj!929k}FTv$ecoQ+|}!tXAB_6>mmbQ>->84r*=$Q>vn zf1=6I12ShEgd$@@0H8Az6up?uZ|Hby+l^=6yzoZ%o83Y|uUOD~t3xapSajVkt`Uoy zR*JVQ7jL;Sz!z^3iuZ`P_bt-N{E|zj7r)BW)$;dMzZ(>ctUmd^IOu@f4w4uk6P%Q{ zC4FAyB=s7kG%2?~?fA*d3pPDUF6l{zT1s3MGbqpk#B~C}yv_W5uRD!>$N2RZ?DJHn zo}%>()@3XMgbQj(*Xz`ZLH}CP)lECkx{c2@9+C1g^jFrc^>sGOT#t+2A(WmTH4Hh} zXvisl=mqc+bqcEcqz4+-rhT4o+b?Dxr>;>P_7Pw+?XB&=TOjWk!%m*+i}$kkMS!WA zoSB~OPBiPg9`Q;XG%FT4IOxPE*Oz=V)0;nE*3z>UdooQjB|64222A+F35(sYYv%Ie*wyn z(G#0f#m;Q)%@bwTEpia@$Nmfe43FgPug0%`d8MsqxvfWN>l54hpb>=PezCY8m@iMi zO@@no$?^>^e)*-ZzVOvo&t3iMPviWN3`?+p@RqMxNk(MD#u)Fb6~ii2VWGjZ0B+ zW7mx@tK1tfaH}4zHf!MfR_Gv^2J9H<>5dx)Rcj1pZAJ_@gCvk_>tp|#_o}0bR^pTc z#QQ%ZbVbE6>srNi!aC3uohbdW=!zvJn75z7-bpq~x}u|INhcq0yU#8kpVuD6{Fp7rO;a%+(yEe;+U86OB7=@}m;L_kLR zVJrhBG%kn$TbX+r!6X6}K?s190}6msAh%70Bfx;g!if+!g%?i&h*{t|sfGovlk>;$ zCL6RKjI;UWVt(@~W%Cp#nWDwPJ50gFg9IH935;LFy#o-?>YT__i_E6gEN2PGV;({h z5H9wuW>Xd3heZ@bZ#xJ_H=WDgeFC#zWcKsS{!d6TinYqFK{4#msz%Ajnmf?*f@Ul? z_DRHMYaE6_j^G4*7vK%d<0agsQV7hUZ1X01L{waM;0W~`jY>U~yYP3dI_v2P@|LWF zbzXP92K9Sgt)sDqpWwYL`H{G)FeBWxN_mW}nL(v$;#t_NOw{I#+91}v)aRy+RF$q; zVf=!hK^vvGG~i}Z{0?#vgy2bz^XJdsD+tDdG4=rb!`=$~)-@++{^Y!Yb}iWOal+V>&b*rrGZkDQM;B=)Bv^G4AhZOP^6n2 zvNarXc9IhX9)+_S1l}*i9ftEJIi`ScN<`L$I!}k=M)B2r^-EX+ODL&IC0`j@8Wp_T zL@%&7+eK#kqAf`?D|E#&U2(ba%Eqe>f!-?8TX}kGvZ{KeYR_`jo|_#))qb&R|2Og% zU5n=l4VHPO+f4DLQGux!nflvIL9(hQSyh*;*qAK$uXZMmXHpnFBSm#2F_ z)q2SFd!_jD(JN1Ur}|3uO6At&%B_6Mexb5ktn9v3xLnyQ(0wA^$1D49i8TnUMk4rI zVhsog+i!`rLafX6#JXh~WX4Dfk~2cLxo4rRI1WJ!!FdEII&&8gSkOZjwg5%MPMK*T->_fsc8lI_fq6t^9{GgCkS}Qwm{yT#{Y_KDhh33}LJpBrLRsL$ zBk&bay9F}j_lOJ$C*^H@9@flN8VL^3J>fIbHjwsI{?Lkt)$v=F+^imj&2@;Y(j)N4 zz>l&n)_px|O`a5WWU7`_U)gy(OS2xmoXln$-_ckuNQ8exkSk~Onw^`4qPXV}px`Gt zf=^H0%R9%-L{Iq?b*Bl*fbjst0S&9n7~RVsi4wlYmy!#wc`~v++?Vk|gqi8b6mo(o zO^=iX)+eZq=SJbAQ35O^TnedFAjQONOha4!<(ILDKLr4~pYq;Sit#)F`W=LeLuA70 zrTiE2U(LFjCHUG!U%OBMO4yFY9!)WG^vaW0`vj(4WZHSAo!qig;9D;6-7YAtLu~1tx0cfazhL7FNHXvGkPF{WD9flt` zDeQVo-1V5iJT5Yi^JHJG)GE3LZ*T+%TqafiYw*&q!@s=gyP!5#!`iN!Y$+0eXdq;% z-CeUl(Vw*zD~wM>HHB7=ro1Ics|rWf>e+ayQg1{GV;7F&d~Rx+N9D9yS4|~@Xax2g za3!N)he)JDJ*7mV+EJA<=?Y%BOQ)35?qcb9t#$+iLseE8Yk!t99@{`~A8*j^JfjLf zOC{P_Ed`1%kGTY>ldiqAyyowLs9sOSw`w^WD9&l4o*;8?=cx0JC#Z8afA;7HNX5YX zD{DF&odb-MNrP#CMIs@OvZ%85mvgA%k{r>Qa}te`4;rdT9)vJX$Ad%@BxQ%r&xSc- zRROA=AXv2#Em085A`}7Xyi68wenzJ%!Xa1_c}$ZzK!}3jh~ybKKN*@uTLynhX*`B^ zrIV2oLPnroAv72ubqcWwUm7Jb<+ui=#WoN&;P&SB>&&&h>v``~h`SH+<0tstCxzW7 zMSz=6lKE$mZUo^7CZbp9nq|61ple0CmZxihgop)oVnOqwi^x?OrJ-uEYO7e)wZ2SL zvW83~559b*|A)tK6uwz`?WyZe@s)c8dY?$|ff}_!4M3j7{>A=P2b}%rqmN=}vhi`+5bs(h=Rom1 z-2!&5GhEAbC>DcRE18G?8oVX;ymjksR06+^u6O7-uOmDm#Tq?U-$!`ZEm?I*6gr|?JRp8ZL zo@o=9Hj!z|P+pSBT|9f~!mC^PHZTGj5$i_4bjX7SHy%)h8$dc=0=-to>%WFXrYWf< zZ2h#2wGm##fHh=n)aBI76dt6E)Trmy3W8A&498*A#QLUf=26o$Iyy#WCb$f41S^sP z_#s9GFyTpT*0_I(XZ{6(T>$h}JmsXTfhil>w&`sV>(e?~dZz!3g`s2%6B~4iNPAc4 z`enNQYUpN&r|Si}U!?nax_{N~@Kh)Sy=j?gy3u&6k!P9&2JFO!d1Y7VI3eaTNTc%AWcVR=8tN7+|;}7>YmMxcbjYg4I~}MZ9>u$K-e;U`UUvN{nRDLlYh8ihxt6X zMcD!{5Xc)025JXcvXsX3)&^#?BGX`i^92vDG$(W!%b{W3aYpT4z^%g@>%+gqwHpjT&ik86pS!br-T8=ze$F{dBYe7<#lSNo_#d$_Z(^uP^ch6?H0X zKYT??!Dc?|4AMBV&C^=?8G@U}_aRTtREjDPK`Cnb8G@bnU5aboo$0wcJXek8m3rgv zT2v$6q~)A3X(u$J|44dd9yF9~S(vA@Hk!?rNnt$t^!qOKvyj1f-&8y{C%Z1twFcTIE zJH^7z#opu^msBIPV^^NKdR$;Sz`lhiCN3%CG~@Z(`Gpq~d{z5f^*5e=^UND9IE5|OmFS+j&l)U75!Sn5$ z7jrJ<{NmviwQ6_5)2lX#Rjn&koy%37H+S$=okCTwSk-$eE8~SrSs&dl_JUF(R|i1T zqSf&d)D!sGTrcpm;46?@NGySdt~`3R>3Z|Bce}uJiA)#IbRi#%HhV*&ck7KTvHifZ z_kh6kh)fU9pkA0<99)`O_HGrJ7I4DgnHKWJRtjsE3v114;f7>&qnKGUT!fn8qP)f4 zlxCP%5gI>K>Y1ipC z)PN7%PDN!eZuoq>7`$O}%Mki7Z05-xYXqeFX;%+5xWoPzJF17uU4L0-1NgH--@#7% z&pN9Q6}x_3WCLiBR6stFC6#}IL~17K0!StgM;ZL2ip3vm+)SL0Q%6LBli0Av{a_)C3U|(jAc)`q0+bwedR`n3bR)*| zaA=$YDkAjR;QN-SP9w*L>*&cI`&}q0H3{VQ9EM3Cgo{IW3dVospmIw^rWwcrkk_0C zoDq^K0`J}Z&hcA??^XWjskfivy$1#6kjNb3$-bJaJuqEqg5L~z=?_1GTBiErKV7t9m{-#ZjSaYd*)unlE(pa92(o1k=$s2f0!pq0(k5a#j)_|(a z3h$x^oo1;dVi5XUCNtOGjVcdzt(}cFfE-?0qM8tK-(O_qyKOFFbNoeB>zKa8xKcCYBuI zOO9c#krzh3eelJDmkxs2eW8y$jexuO++QNl&RM09udvAV(MP{xsFKadn&7Ky5V;eW zd**#R-`RHa*&pqAdk639kv)OuB#agq)_QIEYp|tlA`wx1l-fgZQ zH!+a@@iu4gPS1~bIxxM*hUvW|{YZA-PS;O74Sk)ipLDt)Z5SF+iA6}!Qz=qpEoeNL zQq3G=z(`ccT!@aKK@CzHL>$n~&w?4TIs_U^NJq5?te=T&8cScJey)#OKZ5Y?(Zm52 z*L{dtePmi>5G*Q!@#Dlf+Giee;e=t#orSiN%B*jeHke)MLrk!xB4|=a6ed| zsN4s!6haXnp!NQ`Fw7>UjMF>nI5c|m~;orPJrjCI@IirwsZd-oe(dGjlL#ehH$iu53_>}z~f*~||pIXqF` zmY@RZo1Pgq&wI1zTnq$Cn}=Vp0sE|uBjEU~VwKTpRVR$0gNUIFBZd-@PFJEsWlfnx(lPr!8hK!4z|k?~>46^u=W!*HDrMZsSaSWZdy{tSS* zo+LYmVG_hVBW01CXJRu^$rYIivN4@#Ml=-|~|yy6PMGusvAkm)pBf&BqzTyYNL^`5d` z2lZn|b#J5N#|<`s25wCi9RC#F5((f#arpjs$noe@@;C;jZTiWSPtV~y1E!ebMH%st zOhMt$khXzwtZw4cTBv&s?s{Fl^L|S7)vl7fx!9iQ=FjTvtol6!~eR@;@ok_ zMf}CNaY*U?#JR`dL}FVST~GOL2QU&-{Ir#)_z3hR?r|)52ZARMOdvpy&_tf%{4E!d z^7-bzgc*!Tuk%xyf~!(iIL3xgK`0+b7@WdS!6_qZ7t7oVhUkD0M{@Crnsr_P1kNs zDKH~7p%DaNaYLkyti;RN%6tg1r^4^zo5ZMuF<;P^3S;GyqphTjtso$V?_8LLuqwW% zL#Kmh!HHNcV@B@c1-^l z0D5$hYBk=dqf_CH!cmA$5RHe4wQ8aztuGQLDMR)#?3ugaG0#!pGTeN^Mi{2sg|%19 zZ#46p_w$9_LSeU9*uCfmYo5!%5`hU%y-3$XLf+H6f=cfnhfcAUiOpxg2&471rPL0V z&noq`GKJBNEV}Lp4VBuABa4w@>XqHHqXe6EonCWt9_wkzDZyyqVY3Z(<~hcv8OsIq zV1C=K%2y&>??Y(blp=TC0aND5S>{-%PG_Hu0&lL zl~2p_IFj~%1OQX{n_9(92Y_BD8=H~9*Xa~d780?w-!cl(8GQhn*SG$cJ)$*R;I|I( zJ;#LY$Hnc(1$tbh$9a1EPNSdHkJttyPh+WL`wiA_O-;hbsMmdZl0SgQc(U;TX+oZ^ zgFSt8Mnx!L)R1pRMvbK+6v$FGYrTb0(vYLyK~y_pj00>6VwRMH!7h>ULWhw*^y ztc&c`ughuS)vvqyb?m+MPzbQhblGAa{@tPTSLhAP^ag?6DAF5wWlw)el?C||c-7BN zDXOVy($$?A84=S=yrxRksgzV!1sX)%47{|d6#WcnDtd@fIb=8@lLy!-(zbP@qFBzJ z8U#&SrukCqxlwb(v-^r30-Ys&TdRGH1JEaUe{1H_^fey-H&vs;tj$(_{Af47vF}P$ z4W7|N<)o}AmR)h8Gf~h4%5s#+jUFh@S@`(eIRxhsAc-T+^?oMv7*3`Uw1J!``A}^v z&l%zHZ85(f$wnR1Fbsoq7$70!EQ~q~*Plm9_5(5w>xNyv;Ss$6p4smv!yH6v9!edM z`4aG#LFZp|$SLKUAnxWKf!QN6dn_Ditm2?NP*@VfEZ8S~6|*Cd_9CBguoZ~60(<&s zf;diwOk^P+_GrS|iI9?k`hxg}_A+o)Tk#<^2!l=3EYv6Q&3$29DZz(v4)@pLv}>IY zz0&vBr7$SaQRfTJ#b+=YBRZ1qubY{gs`JHW!G3D;bZGLK{dH3qi$}=?(Yq((sZ8X) z;A}V!VS*CMonh8AlcV~u`P#bC9K?A#J{z3i5R?`MO}Y}? zEkItzsB@EN2=%WJfH$z1<}+uxil~>G3(Cy7tvYSFJvPv^$` z#x9ZG#VdPy_rSrKbdNlE+{5l3FaWDvLm$4Db!Y;Z#&&37Y&Gr18Z$pmYwfbxWa|Eg zbK~rjv6JdtBZG$SDqHHAJ8XL$#-+k2x?f(X^O?FET-1N(R7X_?2k3!*2-Jst?f?Sp zc-$iZBo{FNBsw+88Gvx15+nD=k?8RF;X{&JHayTKe)Rp5`vMeU?3H9-3J`&;v%Mpr zuM>990L0^$-;VU?#O^eS?S5~)fxY-Sc)o6OC|xcBlAK>~F?`uA=G82D#JpxPuU*XB zDdz24big%?Mpd~?S0#wY@Rxyeoma%^y(0&k1c62^15Zl>gTC>hnYDQZ- z@UK&qO~A(*cx*D^gS|0rn|Ea3gx8O*Y00I5vBlcaHNUf_Vg;gZ=0FtbXlxeNtBA%w zr8%FyY3QJPX5eX9&EOO_GZ$s8=6>FV&X#fRN9GPO5GaQ$+W-rQx+!hdiQb;RgG0y0 zPK@>k`o<289g_orehKrNsK(QHZV~}e`VbCr3Jz1jxH$XTb{qkQkbkBOwuPlVt*TZuuupQmwOgO2dhuJ`eD5g63mC0d^4?ShmmF??a@tWs0;=4EOj$ZXc)~*K9$($=`qRwE0O&^ zZcOrZr`H$<&OAmKpa5gX6!0xcy_8&J||wG6NQoN{r!89M>E|o3G|56;CHSD(8NMkR3o0XbO3=)`mU| zl@i#Ys7wM0uB)n$j7lj>n=DJz1$O3Pm*{-xCAvOti7DHYMA@WXArxj?X2F6gd_K{s zH!wsVz9XQS8Fqm1+nvIQjy?O@h%I7wq5@?KtGwx@b?Qp%)Roq0QJOig-)-h8Olqby z<3~BxBh)|ja_O-i)oTLc?winC4PpV`uut&r7rhXTrCVgWRlDLObKs|a@7sRvd3W@^ zQCOwL94!SU1lba@^R3C7wQu|1h`t%+EBXa`K%@tFdH{@G@%kq&2a19{9T!zmq954i zwX6mnipcP{YXh0!~q&rm;r^Em*31G!H{0(5LCa=JPP=5vO@IerO$!^UoyA;Z@i@JQl z$YF>e6*xXJF>v3^g(|gh*r_EaEb1ENa1@dC+|!s^1z@zJm-2~JqPvD5k7u=jQf|6W_*hSgj!0ybV37ntr1TnSgR$W>#J~ab@C%SvP2KsTMZ( zh?{$ajlCl7L+@7#%yE%9&XfJlrXG~U*0+QD5;T1#ie?=lO0O=_6e&xVqrZL`D8Z7HnPt`j8FJG z<;l(ouq;n0uEbjkD@@tlxuwYsHCOh2_mP($xm~j1^4MGbH;>;q{Knxo z5A!9xLP@V!(hFjy7ov*;xJ1J&RAH$;&<%vbX+lqPC{h97Y<|g!4&F&uHF0#L0ls#PIdcWER(14RT#3G~gAsRqtV!MD1f-K6W=|({;G+fco zRq5{tK);kX7FUUbVFhBGD5u~zpt5Q(*dXUkHfvLKy*N2V+rX>rHg?~LKF-)x<}~V7>65h3s;u8Am*vCHZ`v4h!g*bqLikljm)@`b0mBV zw*=)SN;N$W*dsuMQ8JO53c4bdDQ38`tTR4v_{gE2@d54p;K;zC{(y3x``1vUnPeH2 zEXoqPI9($(SO@4L6@~YZD?}no$i}!PLMBH>Rq_SU+k^|Vp;#h4GHQAzC-j-vx1km( zF$we_^|$M{i1lD~;!8I7Az5fjHg}WXJGcmd!!raj5<)HL7GTI4p>ra1F6UKl3$)~f<0XugErp;iT-3wB+85|3wFD4>0T9K%+>`)K8TpgITj4a zq)9;Yjasvx^7WoBeI%~ zpanG#VUScZ5h_Ga*XTXlSGZDm0m;_PZGc}`(wj_#)+h*e7*;_HXi@UUjtm^@8Hf4M zX2>j0d!prx^ zDf}2kHNv(X*iYM&g&m9TWOY9-!oKh3Nuj!5tnL@82gT~a)H3Y9$SV``cH9i}c|)+T zy-vJ?f+ZKV%qjB-w2DhICAXP;TqmPs<4Q^6a!KQ>r^QX9u%xO`GA@>kCo48wF1qaa zrNdrYcGuy=l`{a`b+~a2FaUR59<-eRfa@`4ua;2T$H)lQ&eOQ3V;T+)1k>J!*MIQg z%Fxf$z6--qrrwc>s5|r}X~UOZyP#PYS@(G(CR=;O8uNgakP~oSmBzr+T{UT#M~`-( zKAP7IkuFZ-ps|_t5DSKx4sERu zEfC!(`YKFuGt;D8 z#e+xMb>Da3f+G<8O}(>ujXTYGJ=i!z4~&Z~&cOQAV6VesUEnoh$RHBoOIbQVHd;1R z*urSpaD5Zf;%aCopv7%F#kRu`+T<5ZiO6)Kon#l-i#2zOeo*voO8Q%nLT^fTbmDJo zvc3_2eM<0m-!knJ=sIvZTA}^Rv|pgNi1Zeo-jXaSTlA1zzNHI1-67B&BHaNAHN46z zUa_)erE=SHeC3b31>7m|wq=-?p6JcEfYa$>&2@&;c=j0K~wu zI2=ex5|A!_tG;<+XZ^F9F*~nvKZuAPe}R?lNY`DdyX@!BJp_h zYYfZ%5OIjcXJSnV2>|=#3PiNx6u%$P<00GtUe1ySdoP(ckvzalKRpu*$1nJ44UakO zg9MK`thEH|phh4%@XYiyba)M$6|bXBklWyOBnOkRsDVW=8H-%qhz2-E0%(w0%wWC# zTqM#pyszt4C4cfUo_<`Q9~bGzA#q>58ag)Y>Aecyo%E_dh8N7#t1{bJ#*xWLZJIgp zlJ2Z>)jT{}ORVNzsFz@k*D$uD-e^KofE)9nx$uL;K%BQ*PeYi4xUDgC>fT=0CilTI zn3?!>SaIj*xZeR0DN=E+$y$vu$wgL$0c)L^xdmtwX-12XH@!}Uj5#;e*K2FSoHVRCQ$kgym4KD8i zK@Amf7gN7f548)X6l#zxa^0bGzU6t|lVl#VvVo9&IMc_4X9aqVYpofLT`|Dt~2Oq40GM5X2uBad{%hiC-Oo5^;F7REUbZ`RN zxEddj0@+?tCmr19c0rU<6%;V|-YW2V$cyS=ncD@Xe<~>OxCY^oI#`zN>V-2pSW!i) zrGvY4jUqQtRk3Rf?$W{LGE$BXwmZog9b~dyqvTmukc^z9GfqOUR5$3g^6-h{DEd5u zhQvM!{6|)5y#a2w+OdtjTPjRnkzfzxJ&ME*1w}Bv%BkUVYRHrQbsXyVxc3okLNJ2h z-vW^A5N!sBaLI9G3X>S+jd7L)z2m{ciq@i3f16`xe0Kh;Xi)j=x51qv9vtSmbZRf$f? zlA1b@5uIs_#H-aD$%7N24%lKQvT={zCzHf(ZV0ZzPQ|_j5NN&4 zmZb8ZBY#OM=Q;A1q&&}&KV3r2Q^r$<{SH;i8}}qt&l~qURPJ-+FGmuTx+ mwa?Ku#D>g2mp0#(ul`d0x$B_pJ9M|s7TRn$!lnVzt^Y5s-+R6Q literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/tests/__pycache__/urls.cpython-311.pyc b/lib/python3.11/site-packages/captcha/tests/__pycache__/urls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e983e6f4a55e708e48311c8455b665c26ad313d GIT binary patch literal 1265 zcmcIjy-(Xf96dW1+xY^*H&O*fWgt==E2U}~s#a&JApY5IVX8n7k~hg96%&fBC;t<0LduhWC%1N$(mWBmd^+lL149TG9Mb{<+_=>x`fdM)m4S` z30ExMQzWVMIF&w3m1tLtC0gXi&>bIYZsT!66U0RP?>vNl6N1~%-Lt<-4yUz|o}3C7 zPu~;YG7-4VTWwP(*s2tx0{URNEibOAcpfR_5M>W++zF^68ma&>8O;e0uLvy&5HX?x zcjEUp#MBMGgDc(w*RPEOiyECy$FPatb^^n(-y8m6xbL|u)mqI6>=5g|)%?isbzlsK zHAL*d5QA0y!)xsYKmWFaU(zXVDIT0)o#P-QNzw&aW@+C6)FgQT{s+v0Z1HIAc;h5I ztuk2a!CD{IE@0tkjTIM87ufT+4DR&cP9N^X-3x7;P3r7veUOo}%5T8okAQ)a7;UoI z$82ST!Ob4r?8D8W)gpVe%3i%=u-=39KCBPD=Gns!^&W;G%6nz#D`As6a5Fnf?_`a literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/tests/__pycache__/views.cpython-311.pyc b/lib/python3.11/site-packages/captcha/tests/__pycache__/views.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2abcd66bbe2314a0e1237c56b31f30265cd0822e GIT binary patch literal 7223 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 LIkD$nLecYYw+TKj literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/captcha/tests/tests.py b/lib/python3.11/site-packages/captcha/tests/tests.py new file mode 100644 index 00000000..9d0f7158 --- /dev/null +++ b/lib/python3.11/site-packages/captcha/tests/tests.py @@ -0,0 +1,594 @@ +import datetime +import json +import os +import re +import warnings +from io import BytesIO + +from PIL import Image +from testfixtures import LogCapture + +import django +from django.core import management +from django.core.exceptions import ImproperlyConfigured +from django.test import TestCase, override_settings +from django.urls import reverse +from django.utils import timezone +from django.utils.translation import gettext_lazy + +from captcha.conf import settings +from captcha.fields import CaptchaField, CaptchaTextInput +from captcha.models import CaptchaStore + + +@override_settings(ROOT_URLCONF="captcha.tests.urls") +class CaptchaCase(TestCase): + def setUp(self): + + self.stores = {} + self.__current_settings_output_format = settings.CAPTCHA_OUTPUT_FORMAT + self.__current_settings_dictionary = settings.CAPTCHA_WORDS_DICTIONARY + self.__current_settings_punctuation = settings.CAPTCHA_PUNCTUATION + + tested_helpers = [ + "captcha.helpers.math_challenge", + "captcha.helpers.random_char_challenge", + "captcha.helpers.unicode_challenge", + ] + if os.path.exists("/usr/share/dict/words"): + settings.CAPTCHA_WORDS_DICTIONARY = "/usr/share/dict/words" + settings.CAPTCHA_PUNCTUATION = ";-,." + tested_helpers.append("captcha.helpers.word_challenge") + tested_helpers.append( + "captcha.helpers.huge_words_and_punctuation_challenge" + ) + for helper in tested_helpers: + challenge, response = settings._callable_from_string(helper)() + ( + self.stores[helper.rsplit(".", 1)[-1].replace("_challenge", "_store")], + _, + ) = CaptchaStore.objects.get_or_create( + challenge=challenge, response=response + ) + challenge, response = settings.get_challenge()() + self.stores["default_store"], _ = CaptchaStore.objects.get_or_create( + challenge=challenge, response=response + ) + self.default_store = self.stores["default_store"] + + def tearDown(self): + settings.CAPTCHA_OUTPUT_FORMAT = self.__current_settings_output_format + settings.CAPTCHA_WORDS_DICTIONARY = self.__current_settings_dictionary + settings.CAPTCHA_PUNCTUATION = self.__current_settings_punctuation + + def _assertFormError(self, response, form_name, *args, **kwargs): + if django.VERSION >= (4, 1): + self.assertFormError(response.context.get(form_name), *args, **kwargs) + else: + self.assertFormError(response, form_name, *args, **kwargs) + + def __extract_hash_and_response(self, r): + hash_ = re.findall(r'value="([0-9a-f]+)"', str(r.content))[0] + response = CaptchaStore.objects.get(hashkey=hash_).response + return hash_, response + + def test_image(self): + for key in [store.hashkey for store in self.stores.values()]: + response = self.client.get(reverse("captcha-image", kwargs=dict(key=key))) + self.assertEqual(response.status_code, 200) + self.assertTrue(response.has_header("content-type")) + self.assertEqual(response["content-type"], "image/png") + + def test_audio(self): + if not settings.CAPTCHA_FLITE_PATH: + return + for key in ( + self.stores.get("math_store").hashkey, + self.stores.get("math_store").hashkey, + self.default_store.hashkey, + ): + response = self.client.get(reverse("captcha-audio", kwargs=dict(key=key))) + self.assertEqual(response.status_code, 200) + self.assertTrue(response.ranged_file.size > 1024) + self.assertTrue(response.has_header("content-type")) + self.assertEqual(response["content-type"], "audio/wav") + + def test_form_submit(self): + r = self.client.get(reverse("captcha-test")) + self.assertEqual(r.status_code, 200) + hash_, response = self.__extract_hash_and_response(r) + + r = self.client.post( + reverse("captcha-test"), + dict( + captcha_0=hash_, + captcha_1=response, + subject="xxx", + sender="asasd@asdasd.com", + ), + ) + self.assertEqual(r.status_code, 200) + self.assertTrue(str(r.content).find("Form validated") > 0) + + r = self.client.post( + reverse("captcha-test"), + dict( + captcha_0=hash_, + captcha_1=response, + subject="xxx", + sender="asasd@asdasd.com", + ), + ) + self.assertEqual(r.status_code, 200) + self.assertFalse(str(r.content).find("Form validated") > 0) + + def test_modelform(self): + r = self.client.get(reverse("captcha-test-model-form")) + self.assertEqual(r.status_code, 200) + hash_, response = self.__extract_hash_and_response(r) + + r = self.client.post( + reverse("captcha-test-model-form"), + dict( + captcha_0=hash_, + captcha_1=response, + subject="xxx", + sender="asasd@asdasd.com", + ), + ) + self.assertEqual(r.status_code, 200) + self.assertTrue(str(r.content).find("Form validated") > 0) + + r = self.client.post( + reverse("captcha-test-model-form"), + dict( + captcha_0=hash_, + captcha_1=response, + subject="xxx", + sender="asasd@asdasd.com", + ), + ) + self.assertEqual(r.status_code, 200) + self.assertFalse(str(r.content).find("Form validated") > 0) + + def test_wrong_submit(self): + for urlname in ("captcha-test", "captcha-test-model-form"): + r = self.client.get(reverse(urlname)) + self.assertEqual(r.status_code, 200) + r = self.client.post( + reverse(urlname), + dict( + captcha_0="abc", + captcha_1="wrong response", + subject="xxx", + sender="asasd@asdasd.com", + ), + ) + self._assertFormError(r, "form", "captcha", gettext_lazy("Invalid CAPTCHA")) + + def test_deleted_expired(self): + self.default_store.expiration = timezone.now() - datetime.timedelta(minutes=5) + self.default_store.save() + hash_ = self.default_store.hashkey + r = self.client.post( + reverse("captcha-test"), + dict( + captcha_0=hash_, + captcha_1=self.default_store.response, + subject="xxx", + sender="asasd@asdasd.com", + ), + ) + + self.assertEqual(r.status_code, 200) + self.assertFalse("Form validated" in str(r.content)) + + # expired -> deleted + try: + CaptchaStore.objects.get(hashkey=hash_) + self.fail() + except Exception: + pass + + def test_custom_error_message(self): + r = self.client.get(reverse("captcha-test-custom-error-message")) + self.assertEqual(r.status_code, 200) + # Wrong answer + r = self.client.post( + reverse("captcha-test-custom-error-message"), + dict(captcha_0="abc", captcha_1="wrong response"), + ) + self._assertFormError(r, "form", "captcha", "TEST CUSTOM ERROR MESSAGE") + # empty answer + r = self.client.post( + reverse("captcha-test-custom-error-message"), + dict(captcha_0="abc", captcha_1=""), + ) + self._assertFormError( + r, "form", "captcha", gettext_lazy("This field is required.") + ) + + def test_repeated_challenge(self): + CaptchaStore.objects.create(challenge="xxx", response="xxx") + try: + CaptchaStore.objects.create(challenge="xxx", response="xxx") + except Exception: + self.fail() + + def test_repeated_challenge_form_submit(self): + __current_challange_function = settings.CAPTCHA_CHALLENGE_FUNCT + for urlname in ("captcha-test", "captcha-test-model-form"): + settings.CAPTCHA_CHALLENGE_FUNCT = "captcha.tests.trivial_challenge" + + r1 = self.client.get(reverse(urlname)) + r2 = self.client.get(reverse(urlname)) + self.assertEqual(r1.status_code, 200) + self.assertEqual(r2.status_code, 200) + if re.findall(r'value="([0-9a-f]+)"', str(r1.content)): + hash_1 = re.findall(r'value="([0-9a-f]+)"', str(r1.content))[0] + else: + self.fail() + + if re.findall(r'value="([0-9a-f]+)"', str(r2.content)): + hash_2 = re.findall(r'value="([0-9a-f]+)"', str(r2.content))[0] + else: + self.fail() + try: + store_1 = CaptchaStore.objects.get(hashkey=hash_1) + store_2 = CaptchaStore.objects.get(hashkey=hash_2) + except Exception: + self.fail() + + self.assertTrue(store_1.pk != store_2.pk) + self.assertTrue(store_1.response == store_2.response) + self.assertTrue(hash_1 != hash_2) + + r1 = self.client.post( + reverse(urlname), + dict( + captcha_0=hash_1, + captcha_1=store_1.response, + subject="xxx", + sender="asasd@asdasd.com", + ), + ) + self.assertEqual(r1.status_code, 200) + self.assertTrue(str(r1.content).find("Form validated") > 0) + + try: + store_2 = CaptchaStore.objects.get(hashkey=hash_2) + except Exception: + self.fail() + + r2 = self.client.post( + reverse(urlname), + dict( + captcha_0=hash_2, + captcha_1=store_2.response, + subject="xxx", + sender="asasd@asdasd.com", + ), + ) + self.assertEqual(r2.status_code, 200) + self.assertTrue(str(r2.content).find("Form validated") > 0) + settings.CAPTCHA_CHALLENGE_FUNCT = __current_challange_function + + def test_output_format(self): + for urlname in ("captcha-test", "captcha-test-model-form"): + settings.CAPTCHA_OUTPUT_FORMAT = ( + "%(image)s

Hello, captcha world

%(hidden_field)s%(text_field)s" + ) + r = self.client.get(reverse(urlname)) + self.assertEqual(r.status_code, 200) + self.assertTrue("

Hello, captcha world

" in str(r.content)) + + def test_invalid_output_format(self): + for urlname in ("captcha-test", "captcha-test-model-form"): + settings.CAPTCHA_OUTPUT_FORMAT = "%(image)s" + try: + with warnings.catch_warnings(record=True) as w: + self.client.get(reverse(urlname)) + assert len(w) == 1 + self.assertTrue("CAPTCHA_OUTPUT_FORMAT" in str(w[-1].message)) + self.fail() + + except ImproperlyConfigured as e: + self.assertTrue("CAPTCHA_OUTPUT_FORMAT" in str(e)) + + def test_per_form_format(self): + settings.CAPTCHA_OUTPUT_FORMAT = ( + "%(image)s testCustomFormatString %(hidden_field)s %(text_field)s" + ) + r = self.client.get(reverse("captcha-test")) + self.assertTrue("testCustomFormatString" in str(r.content)) + r = self.client.get(reverse("test_per_form_format")) + self.assertTrue("testPerFieldCustomFormatString" in str(r.content)) + + def test_custom_generator(self): + r = self.client.get(reverse("test_custom_generator")) + hash_, response = self.__extract_hash_and_response(r) + self.assertEqual(response, "111111") + + def test_issue31_proper_abel(self): + settings.CAPTCHA_OUTPUT_FORMAT = "%(image)s %(hidden_field)s %(text_field)s" + r = self.client.get(reverse("captcha-test")) + self.assertTrue('